<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom"><channel><title>Posts on Maarten on IT</title><link>https://maarten.mulders.it/post/</link><description>Recent content in Posts on Maarten on IT</description><generator>Hugo</generator><language>en-us</language><copyright>&amp;copy; 2013 - 2026 Maarten Mulders</copyright><lastBuildDate>Tue, 10 Feb 2026 08:46:38 +0100</lastBuildDate><atom:link href="https://maarten.mulders.it/post/index.xml" rel="self" type="application/rss+xml"/><item><title>Building a CLI with Quarkus, Kotlin and GraalVM</title><link>https://maarten.mulders.it/2025/07/building-a-cli-with-quarkus-kotlin-and-graalvm/</link><pubDate>Mon, 28 Jul 2025 08:17:00 +0200</pubDate><guid>https://maarten.mulders.it/2025/07/building-a-cli-with-quarkus-kotlin-and-graalvm/</guid><description>&lt;p&gt;Command-line tools are great for automation, but choosing the right technology stack to build them can be tricky.
I recently set out to build a new command-line application to streamline some tasks, drawing from previous experiences where the tooling left me wanting more.&lt;/p&gt;
&lt;p&gt;This time, I chose a different combination of technologies that better suits my needs: Kotlin, Quarkus, and GraalVM. In this blog, I’ll walk you through the setup and decisions behind this stack—so you can get up and running even faster when building your own CLI tools.&lt;/p&gt;</description></item><item><title>Coding, Thinking and Adapting: My Take-Aways from Devoxx Poland 2025</title><link>https://maarten.mulders.it/2025/06/coding-thinking-and-adapting-my-take-aways-from-devoxx-poland-2025/</link><pubDate>Mon, 16 Jun 2025 21:53:00 +0200</pubDate><guid>https://maarten.mulders.it/2025/06/coding-thinking-and-adapting-my-take-aways-from-devoxx-poland-2025/</guid><description>&lt;p&gt;Six years after my first Devoxx Poland visit, I was invited there again to present.
This time, I had the opportunity to give two talks instead of just one.
Apart from speaking, visiting a conference is a great way to also join other speaker&amp;rsquo;s sessions.
In this blog, I will share some of the most inspiring talks I attended.
Topics include mutation testing, monads, tips for smooth-running applications in production, effectively working with AI and hexagonal architecture.
Continue reading for my recommendations from this year&amp;rsquo;s edition!&lt;/p&gt;</description></item><item><title>Authenticate Jakarta EE apps with Google using OpenID Connect</title><link>https://maarten.mulders.it/2024/08/authenticate-jakarta-ee-apps-with-google-using-openid-connect/</link><pubDate>Tue, 20 Aug 2024 10:02:00 +0200</pubDate><guid>https://maarten.mulders.it/2024/08/authenticate-jakarta-ee-apps-with-google-using-openid-connect/</guid><description>&lt;p&gt;In one of my pet projects, I&amp;rsquo;m writing a Jakarta EE web application where I want users to authenticate using Google.
Easy, you would say, as Jakarta EE 10 includes Jakarta Security 3.0, which has support for OpenID Connect authentication.
Took me a bit more time to figure out how to get it working, and to save you from having to do that, here&amp;rsquo;s what I found.&lt;/p&gt;</description></item><item><title>Reduce Maven Plugin logging</title><link>https://maarten.mulders.it/2024/07/reduce-maven-plugin-logging/</link><pubDate>Tue, 16 Jul 2024 08:16:00 +0200</pubDate><guid>https://maarten.mulders.it/2024/07/reduce-maven-plugin-logging/</guid><description>&lt;p&gt;Sometimes, a Maven plugin logs more then you want it to.
I recently had this situation with a plugin that generated source code from specifications.
This plugin alone wrote over 22000 lines of output just to inform the user that it did what it had to do.
No errors or such, only confirming that it did its job.
Such superfluous output makes it hard for developers to focus on actual problems in their build.
It&amp;rsquo;s too easy to think &amp;ldquo;too long, didn&amp;rsquo;t read&amp;rdquo; (TL;DR) and hence miss the important bits.
So, it&amp;rsquo;s time to tame the plugin logging!&lt;/p&gt;</description></item><item><title>Devnexus 2024</title><link>https://maarten.mulders.it/2024/04/devnexus-2024/</link><pubDate>Wed, 10 Apr 2024 18:50:00 -0400</pubDate><guid>https://maarten.mulders.it/2024/04/devnexus-2024/</guid><description>&lt;p&gt;This year, I again have the pleasure to join Devnexus and speak there.
In this blog, I&amp;rsquo;ll highlight some of the sessions that I&amp;rsquo;ve joined.&lt;/p&gt;</description></item><item><title>Measure Your Maven Build</title><link>https://maarten.mulders.it/2024/03/measure-your-maven-build/</link><pubDate>Fri, 15 Mar 2024 09:46:00 +0200</pubDate><guid>https://maarten.mulders.it/2024/03/measure-your-maven-build/</guid><description>&lt;p&gt;Slow builds are annoying!&lt;/p&gt;
&lt;p&gt;There, I&amp;rsquo;ve said it.
And you know it&amp;rsquo;s true, don&amp;rsquo;t you?
They take valuable time, they are a source of frustration, they extend the feedback cycle, and often they provide the perfect excuse for &lt;a href="https://xkcd.com/303/"&gt;slacking off&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;But it doesn&amp;rsquo;t have to be this way!
Rather than getting another cup of coffee or playing that medieval game of gladiator, what if we would investigate &lt;em&gt;why&lt;/em&gt; the build is so slow?
If we know the bottlenecks, we can address them.
That would shorten the feedback loop, increasing our productivity and our job happiness in one go.&lt;/p&gt;</description></item><item><title>Why Write Boring Apps?</title><link>https://maarten.mulders.it/2024/03/why-write-boring-apps/</link><pubDate>Fri, 01 Mar 2024 15:00:00 +0200</pubDate><guid>https://maarten.mulders.it/2024/03/why-write-boring-apps/</guid><description>&lt;p&gt;If you&amp;rsquo;ve built any kind of web-based application in the last decade, chances are you were building a &lt;em&gt;single-page application&lt;/em&gt; (SPA).
This means you&amp;rsquo;ve been writing JavaScript or Typescript, had to work with the Node Package Manager or Yarn, needed to understand a framework like Angular, React or Vue &lt;em&gt;and&lt;/em&gt; had to learn a new testing framework (or two).
And that would have been only the basics.
You would probably use other libraries, frameworks and toolkits: for styling the user interface, for doing API calls using REST and/or GraphQL, and for writing reusable components.
But we usually take the pain, because the alternative is just&amp;hellip; &amp;ldquo;boring&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;But it is time to reflect on this approach.
It drags in a lot of complexity, but what does it give us?
More complexity!
At the end of the day, everyone will probably agree that simplicity is important.
And what we want to achieve is a simple thing: displaying some information to a user.
So why all that complexity?&lt;/p&gt;</description></item><item><title>Devoxx 2023: First Impressions</title><link>https://maarten.mulders.it/2023/10/devoxx-2023-first-impressions/</link><pubDate>Mon, 09 Oct 2023 12:04:15 +0200</pubDate><guid>https://maarten.mulders.it/2023/10/devoxx-2023-first-impressions/</guid><description>&lt;p&gt;This week, I&amp;rsquo;ve been attending Devoxx Belgium.
It wasn&amp;rsquo;t my first time around, so I more or less knew what to expect in terms of atmosphere, content and people.
In this post, I will share my first impressions.
It includes some interesting talks that I joined.
Of course, there were more - but those require a larger post, so those may end up in a seperate post later.&lt;/p&gt;</description></item><item><title>Devnexus 2023 live blog</title><link>https://maarten.mulders.it/2023/04/devnexus-2023-live-blog/</link><pubDate>Wed, 05 Apr 2023 17:49:15 +0200</pubDate><guid>https://maarten.mulders.it/2023/04/devnexus-2023-live-blog/</guid><description>&lt;p&gt;This week, I&amp;rsquo;m attending the 19th edition of the Devnexus conference in Atlanta!
In those 19 years, Devnexus has truly grown to being one of the biggest Java and JVM-related conference in Nothern America, and it&amp;rsquo;s always been a pleasure to be there.
This year marks my fourth attendance as a speaker, and I&amp;rsquo;ll be doing two talks myself.&lt;/p&gt;
&lt;p&gt;In this post, I&amp;rsquo;ll be live blogging about some of the sessions that I&amp;rsquo;ve joined. Enjoy!&lt;/p&gt;</description></item><item><title>Notes from JavaZone</title><link>https://maarten.mulders.it/2022/09/notes-from-javazone/</link><pubDate>Mon, 12 Sep 2022 21:56:13 +0200</pubDate><guid>https://maarten.mulders.it/2022/09/notes-from-javazone/</guid><description>&lt;p&gt;Last week, I attended JavaZone, the annual conference ran by javaBin, the Norwegian Java User Group.
I have attended JavaZone in the past (2018) so I knew what to expect - and the bar was high!
Because of that, I was looking forward a lot to join JavaZone again.
Also, this would be my first conference as a Java Champion, which made it even more special.&lt;/p&gt;</description></item><item><title>Using HSQL in OpenLiberty</title><link>https://maarten.mulders.it/2022/08/using-hsql-in-openliberty/</link><pubDate>Tue, 23 Aug 2022 08:46:13 +0200</pubDate><guid>https://maarten.mulders.it/2022/08/using-hsql-in-openliberty/</guid><description>&lt;p&gt;A quick note, this time.
Recently, I wanted to do some hacking around on Jakarta EE and MicroProfile.
I chose to work with the OpenLiberty runtime, as I previously had good experiences with it.
My pet project also needs a database, so for starters, I chose HyperSQL Database (HSQL DB).
Here&amp;rsquo;s how I set it up.&lt;/p&gt;</description></item><item><title>Mutation Testing badge with PIT and Stryker Dashboard</title><link>https://maarten.mulders.it/2022/07/mutation-testing-badge-with-pit-and-stryker-dashboard/</link><pubDate>Sat, 30 Jul 2022 10:41:13 +0200</pubDate><guid>https://maarten.mulders.it/2022/07/mutation-testing-badge-with-pit-and-stryker-dashboard/</guid><description>&lt;p&gt;Earlier, I wrote about integrating PIT with the Stryker Mutator Dashboard.
The setup for that was pretty complicated, with some shell scripting that extracted the JSON payload for the report from a JavaScript file.
Today, I&amp;rsquo;m introducing a much simpler approach to that: the &lt;strong&gt;Stryker Mutator Dashboard reporter for PIT&lt;/strong&gt;.&lt;/p&gt;</description></item><item><title>Playing with Loom</title><link>https://maarten.mulders.it/2022/03/playing-with-loom/</link><pubDate>Fri, 04 Mar 2022 08:39:13 +0200</pubDate><guid>https://maarten.mulders.it/2022/03/playing-with-loom/</guid><description>&lt;p&gt;If there&amp;rsquo;s one topic that has kept the Java community excited over the last years, it&amp;rsquo;s Project Loom.
We all know it&amp;rsquo;s coming someday, but when?
What will it look like?
And how will it change the way we write concurrent code?
In this blog, I&amp;rsquo;ll try to play a bit with what Loom &lt;em&gt;currently&lt;/em&gt; looks like.&lt;/p&gt;</description></item><item><title>The Dapr SDK for Java: Pub/Sub &amp; Distributed Tracing</title><link>https://maarten.mulders.it/2022/01/the-dapr-sdk-for-java-pubsub-distributed-tracing/</link><pubDate>Tue, 11 Jan 2022 09:36:13 +0200</pubDate><guid>https://maarten.mulders.it/2022/01/the-dapr-sdk-for-java-pubsub-distributed-tracing/</guid><description>&lt;p&gt;It&amp;rsquo;s been a while since the first two posts about Dapr!
In those first installments, we looked at the basics of Dapr, from a very conceptual point of view.
We also looked at the bare minimum HTTP API that Dapr exposes to the applications that use it.
But writing enterprise applications that way would be slow, and it would inevitably lead to mistakes.
In this article, I will introduce you to a higher abstraction level of working with Dapr.&lt;/p&gt;</description></item><item><title>Jakarta EE meets Dapr</title><link>https://maarten.mulders.it/2021/09/jakarta-ee-meets-dapr/</link><pubDate>Tue, 28 Sep 2021 09:46:13 +0200</pubDate><guid>https://maarten.mulders.it/2021/09/jakarta-ee-meets-dapr/</guid><description>&lt;p&gt;Earlier this month, I introduced you to Dapr, the Distributed Application Runtime.
That was a mostly conceptual introduction, showing you how Dapr works and what it can do for you.
But how do you integrate it into an existing application?
That&amp;rsquo;s the topic for today.&lt;/p&gt;</description></item><item><title>Getting to know Dapr</title><link>https://maarten.mulders.it/2021/09/getting-to-know-dapr/</link><pubDate>Fri, 10 Sep 2021 10:46:13 +0200</pubDate><guid>https://maarten.mulders.it/2021/09/getting-to-know-dapr/</guid><description>&lt;p&gt;Building distributed applications or microservice applications brings a whole new range of problems.
All those application components, or microservices, need to communicate with each other.
How will we do that: using messaging, or would direct HTTP calls be a better choice?
Often, we must make such decisions early in a project.
Since it&amp;rsquo;s hard to change it later, we call it an &amp;ldquo;architectural decision&amp;rdquo;.
But this is often an excuse so we can blame the architect if the choice turned out to be wrong.&lt;/p&gt;</description></item><item><title>Build your own OpenJDK on macOS</title><link>https://maarten.mulders.it/2021/05/build-your-own-openjdk-on-macos/</link><pubDate>Mon, 31 May 2021 08:31:13 +0200</pubDate><guid>https://maarten.mulders.it/2021/05/build-your-own-openjdk-on-macos/</guid><description>&lt;p&gt;Following the recent kerfuffle around the security manager deprecation, I was curious to see if a codebase I&amp;rsquo;m working on would also suffer.
But how could I find out? There are no early access builds of Java 17 yet with the latest changes for this JEP.
Maybe&amp;hellip; I should set out and try to build it myself?
But that&amp;rsquo;s sure going to be a lot of work&amp;hellip; Or is it?&lt;/p&gt;</description></item><item><title>Introduction to Maven Toolchains</title><link>https://maarten.mulders.it/2021/03/introduction-to-maven-toolchains/</link><pubDate>Tue, 16 Mar 2021 08:31:12 +0100</pubDate><guid>https://maarten.mulders.it/2021/03/introduction-to-maven-toolchains/</guid><description>&lt;p&gt;Java evolves at a much faster pace than it used to do.
But not all of the projects we work on keep up with that pace.
I have projects on Java 8, 11 and 15 - and sometimes I want to play with early access builds of newer versions as well.
How to make sure I can build them without having to constantly switch Java runtimes?&lt;/p&gt;</description></item><item><title>Use git bisect to pinpoint a bug</title><link>https://maarten.mulders.it/2021/01/use-git-bisect-to-pinpoint-a-bug/</link><pubDate>Thu, 28 Jan 2021 14:15:09 +0100</pubDate><guid>https://maarten.mulders.it/2021/01/use-git-bisect-to-pinpoint-a-bug/</guid><description>&lt;p&gt;During my work on Maven today, I found a very specific bug.
The error message wasn&amp;rsquo;t that clear, and I couldn&amp;rsquo;t make a guess what might&amp;rsquo;ve caused it.
I read about &lt;code&gt;git bisect&lt;/code&gt; a few times and figured that today, I would use that tool to find the bug.&lt;/p&gt;</description></item><item><title>What's New in Maven 4</title><link>https://maarten.mulders.it/2020/11/whats-new-in-maven-4/</link><pubDate>Mon, 30 Nov 2020 08:02:09 +0100</pubDate><guid>https://maarten.mulders.it/2020/11/whats-new-in-maven-4/</guid><description>&lt;p&gt;Recently, the Maven community decided to push forward and &lt;a href="https://github.com/apache/maven/commit/3736be9c15122d65e6ef675557eb0f882f82b012"&gt;start working&lt;/a&gt; &lt;a href="https://twitter.com/ASFMavenProject/status/1332288204351934466"&gt;towards a 4.0.0 release&lt;/a&gt;.
The first question after this announcement is of course: what can we expect Maven 4 to bring us?
A lot - and in this post, we want to highlight some of the features that we are particularly excited about.&lt;/p&gt;</description></item><item><title>Block misbehaving IP addresses using Fail2Ban and AbuseIPDB</title><link>https://maarten.mulders.it/2020/10/block-misbehaving-ip-addresses-using-fail2ban-and-abuseipdb/</link><pubDate>Mon, 19 Oct 2020 11:46:13 +0200</pubDate><guid>https://maarten.mulders.it/2020/10/block-misbehaving-ip-addresses-using-fail2ban-and-abuseipdb/</guid><description>&lt;p&gt;When you operate servers, whether physical or virtual, at some point in time you may find yourself victim to bots or botnets trying to access your server over SSH.
Even if you configure your server to not expose SSH on port 22 (the default), chances are you will be a target at some point.
This is especially true if your server is hosted in a public cloud, since these typically reserve ranges or blocks of IP addresses.
Apart from making it as hard as possible to scan your server, you can also serve the community and report those attacks.&lt;/p&gt;</description></item><item><title>Multiple Git identities</title><link>https://maarten.mulders.it/2020/07/multiple-git-identities/</link><pubDate>Mon, 13 Jul 2020 08:10:05 +0200</pubDate><guid>https://maarten.mulders.it/2020/07/multiple-git-identities/</guid><description>&lt;p&gt;Everything is code, and code is everywhere.
For me, this means I put more and more stuff into version control.
Whether it is infrastructure descriptions, documentation, software or this blog, I always store it in a Git repository.
But sometimes this gets dirty, because you accidentally forget to change your Git user details.&lt;/p&gt;</description></item><item><title>Mutation Testing badge with Pitest and Stryker Dashboard</title><link>https://maarten.mulders.it/2020/06/mutation-testing-badge-with-pitest-and-stryker-dashboard/</link><pubDate>Tue, 30 Jun 2020 13:18:13 +0200</pubDate><guid>https://maarten.mulders.it/2020/06/mutation-testing-badge-with-pitest-and-stryker-dashboard/</guid><description>&lt;p&gt;Over the years, badges have become a way for open source maintainers to show the state of their product.
Badges can give a quick overview of the code quality, test coverage or build health of an open-source product.
The problem with code coverage is, however, that a high coverage doesn&amp;rsquo;t mean the tests are any &lt;em&gt;good&lt;/em&gt;.
If only there was a way to show the quality of the test suite&amp;hellip;&lt;/p&gt;</description></item><item><title>Infrastructure as Code with Terraform</title><link>https://maarten.mulders.it/2020/06/infrastructure-as-code-with-terraform/</link><pubDate>Mon, 22 Jun 2020 08:37:13 +0200</pubDate><guid>https://maarten.mulders.it/2020/06/infrastructure-as-code-with-terraform/</guid><description>&lt;p&gt;Setting up new infrastructure can be a tedious process.
It doesn&amp;rsquo;t matter whether it is on-premise or in the cloud.
Many organisations have a long process of filling forms, obtaining budget clearance, asking for priority and verifying everything is set up correctly.
The cloud promises us to make things better, and at least it got a lot faster.
But still, we can make many mistakes in this manual process, and if we want to duplicate a deliberately crafted setup things become even harder&amp;hellip;.&lt;/p&gt;</description></item><item><title>DevNexus Day 2: Metrics, Monolith Decomposition</title><link>https://maarten.mulders.it/2020/02/devnexus-day-2-metrics-monolith-decomposition/</link><pubDate>Fri, 21 Feb 2020 21:55:00 +0200</pubDate><guid>https://maarten.mulders.it/2020/02/devnexus-day-2-metrics-monolith-decomposition/</guid><description>&lt;p&gt;Together with four &amp;ldquo;AwesomeSauce&amp;rdquo; colleagues from &lt;a href="https://www.infosupport.com/"&gt;Info Support&lt;/a&gt;, I&amp;rsquo;m attending &lt;a href="https://devnexus.com/"&gt;DevNexus&lt;/a&gt; this year.
For me, it&amp;rsquo;s the second time I&amp;rsquo;m here, as I spoke here in 2018, too.
Next to delivering my own &amp;ldquo;React in 50 minutes&amp;rdquo; session I&amp;rsquo;m attending some sessions to update with new technology advancements.
After &lt;a href="https://maarten.mulders.it/2020/02/devnexus-day-1-webassembly-productivity/"&gt;a great first day&lt;/a&gt;, let&amp;rsquo;s move on to the second (and last) day.&lt;/p&gt;</description></item><item><title>DevNexus Day 1: WebAssembly, Productivity</title><link>https://maarten.mulders.it/2020/02/devnexus-day-1-webassembly-productivity/</link><pubDate>Fri, 21 Feb 2020 15:20:13 +0200</pubDate><guid>https://maarten.mulders.it/2020/02/devnexus-day-1-webassembly-productivity/</guid><description>&lt;p&gt;Together with four &amp;ldquo;AwesomeSauce&amp;rdquo; colleagues from &lt;a href="https://www.infosupport.com/"&gt;Info Support&lt;/a&gt;, I&amp;rsquo;m attending &lt;a href="https://devnexus.com/"&gt;DevNexus&lt;/a&gt; this year.
For me, it&amp;rsquo;s the second time I&amp;rsquo;m here, as I spoke here in 2018, too.
Next to delivering my own &amp;ldquo;React in 50 minutes&amp;rdquo; session I&amp;rsquo;m attending some sessions to update with new technology advancements.&lt;/p&gt;</description></item><item><title>Customise the Maven Release process</title><link>https://maarten.mulders.it/2020/01/customise-the-maven-release-process/</link><pubDate>Fri, 10 Jan 2020 09:30:13 +0200</pubDate><guid>https://maarten.mulders.it/2020/01/customise-the-maven-release-process/</guid><description>&lt;p&gt;Shipping a new release of software usually involves quite a few steps.
Depending on the type of software, this may be something you rarely do.
Thus, it often involves manual steps.
This is not necessary!
Maven has had its &amp;ldquo;Release Plugin&amp;rdquo; since approximately April 2007; yes, that&amp;rsquo;s over 12 years!
It has served both the Maven project and many other software projects.&lt;/p&gt;</description></item><item><title>Devoxx - Day One</title><link>https://maarten.mulders.it/2019/11/devoxx-day-one/</link><pubDate>Wed, 06 Nov 2019 17:22:13 +0200</pubDate><guid>https://maarten.mulders.it/2019/11/devoxx-day-one/</guid><description>&lt;p&gt;This year I&amp;rsquo;m returning to Devoxx.
I&amp;rsquo;m planning to write some notes on interesting sessions or other content.
Also, I&amp;rsquo;ll be delivering my talk on &lt;a href="https://maarten.mulders.it/talks/#ssl-tls-for-mortals"&gt;Transport Layer Security&lt;/a&gt; tomorrow.
But today was a day of catching up with old friends and attending a talk or two.&lt;/p&gt;
&lt;p&gt;One talk really caught my attention: &amp;ldquo;Implementing a simple JVM in Rust&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Building a programming language on GraalVM (Part 1)</title><link>https://maarten.mulders.it/2019/10/building-a-programming-language-on-graalvm-part-1/</link><pubDate>Sun, 13 Oct 2019 16:27:13 +0200</pubDate><guid>https://maarten.mulders.it/2019/10/building-a-programming-language-on-graalvm-part-1/</guid><description>&lt;p&gt;If you&amp;rsquo;ve followed recent developments in the Java ecosystem, you must know &lt;a href="https://www.graalvm.org/"&gt;GraalVM&lt;/a&gt;.
Many blog posts cover how you can &lt;a href="https://royvanrijn.com/blog/2018/09/part-2-native-microservice-in-graalvm/"&gt;build native executables&lt;/a&gt; from Java source code.
This is indeed exciting: your program starts faster, and consumes less memory.
Other popular topics include building Java applications that run code in other languages.
You can run JavaScript, Python, Ruby or R code in the JVM.
But there&amp;rsquo;s more: in fact you can run &lt;em&gt;any&lt;/em&gt; language inside the JVM!
Are you curious how? Continue reading&amp;hellip;&lt;/p&gt;</description></item><item><title>Code One - Day Three</title><link>https://maarten.mulders.it/2019/09/code-one-day-three/</link><pubDate>Wed, 18 Sep 2019 20:08:00 -0700</pubDate><guid>https://maarten.mulders.it/2019/09/code-one-day-three/</guid><description>&lt;p&gt;Third day on Code One already!
Highlights for today: the Community Keynote, a trip to GitHub and a session called &amp;ldquo;Sarcasm as a Service&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Code One - Day Two</title><link>https://maarten.mulders.it/2019/09/code-one-day-two/</link><pubDate>Tue, 17 Sep 2019 16:11:00 -0700</pubDate><guid>https://maarten.mulders.it/2019/09/code-one-day-two/</guid><description>&lt;p&gt;On this second day at Code One I have again visited interesting sessions.
One on security by &lt;a href="https://twitter.com/manicode"&gt;Jim Manicode&lt;/a&gt; and one on cash (or the lack thereof) in Sweden.&lt;/p&gt;</description></item><item><title>Code One - Day One</title><link>https://maarten.mulders.it/2019/09/code-one-day-one/</link><pubDate>Mon, 16 Sep 2019 18:42:32 -0700</pubDate><guid>https://maarten.mulders.it/2019/09/code-one-day-one/</guid><description>&lt;p&gt;This year I&amp;rsquo;m returning to Oracle Code One (formerly JavaOne) for the third time.
I&amp;rsquo;m planning to write some notes on interesting sessions or other content.&lt;/p&gt;</description></item><item><title>How did I get that library?!</title><link>https://maarten.mulders.it/2019/09/how-did-i-get-that-library/</link><pubDate>Wed, 11 Sep 2019 18:42:32 +0200</pubDate><guid>https://maarten.mulders.it/2019/09/how-did-i-get-that-library/</guid><description>&lt;p&gt;When you&amp;rsquo;re writing Java applications, chances are you&amp;rsquo;re using Maven for dependency management.
It lets you declare the &lt;em&gt;artifacts&lt;/em&gt; you need to build your application.
Those artifacts also depend on other artifacts.
This means you have &lt;em&gt;transitive dependencies&lt;/em&gt; - dependencies you didn&amp;rsquo;t declare yourself but you need them anyway.&lt;/p&gt;</description></item><item><title>Reports from Devoxx PL</title><link>https://maarten.mulders.it/2019/06/reports-from-devoxx-pl/</link><pubDate>Tue, 25 Jun 2019 14:00:13 +0200</pubDate><guid>https://maarten.mulders.it/2019/06/reports-from-devoxx-pl/</guid><description>&lt;p&gt;From yesterday until tomorrow I&amp;rsquo;m attending &lt;a href="https://www.devoxx.pl/"&gt;Devoxx Poland&lt;/a&gt; (or Devoxx PL for short).
It&amp;rsquo;s the second largest conference in the Devoxx family with around 2700 people attending.
The conference is held in the &lt;a href="https://www.icekrakow.pl/"&gt;ICE Kraków Congress Centre&lt;/a&gt;, a large venue with an amazing primary room.&lt;/p&gt;






 
 
 
 

 
 
 &lt;div class="flex justify-center items-center"&gt;
 &lt;figure class="rounded-lg "&gt;
 
 &lt;picture class="rounded-lg "&gt;
 &lt;source srcset="https://maarten.mulders.it/2019/06/reports-from-devoxx-pl/IMG_20190624_121320_hu_db4e3c5766a00d69.webp" alt="Entrance of the ICE" type="image/webp" width="4608" height="2112" class="justify-center shadow-lg"&gt;
 &lt;img src="https://maarten.mulders.it/2019/06/reports-from-devoxx-pl/IMG_20190624_121320_hu_a410d4a39c14c204.jpg" alt="Entrance of the ICE" type="image/jpeg" width="4608" height="2112" class="justify-center shadow-lg"&gt;
 &lt;/picture&gt;
 
 &lt;figcaption class="text-center"&gt;Entrance of the ICE&lt;/figcaption&gt;
 &lt;/figure&gt;
 &lt;/div&gt;
 
 



&lt;p&gt;The main reason I&amp;rsquo;m here is to give a talk about GraalVM on Wednesday morning.
Apart from that, it&amp;rsquo;s a nice opportunity to network, meet old friends and make new ones.
And of course to attend other talks to learn something new.&lt;/p&gt;</description></item><item><title>Securing Apache HTTPD with Microsoft Active Directory</title><link>https://maarten.mulders.it/2019/03/securing-apache-httpd-with-microsoft-active-directory/</link><pubDate>Tue, 26 Mar 2019 08:07:13 +0200</pubDate><guid>https://maarten.mulders.it/2019/03/securing-apache-httpd-with-microsoft-active-directory/</guid><description>&lt;p&gt;Recently, I was building a website with documentation for one of the projects I&amp;rsquo;m involved with.
I wanted to protect access to that website to a specific set of people inside my company.
Here&amp;rsquo;s how I did it.&lt;/p&gt;</description></item><item><title>Troubleshooting SOAP and MTOM using the command line</title><link>https://maarten.mulders.it/2018/12/troubleshooting-soap-and-mtom-using-the-command-line/</link><pubDate>Mon, 17 Dec 2018 09:24:13 +0200</pubDate><guid>https://maarten.mulders.it/2018/12/troubleshooting-soap-and-mtom-using-the-command-line/</guid><description>&lt;p&gt;When you want to transmit binary files over SOAP-based webservices, you have two choices: &lt;a href="https://en.wikipedia.org/wiki/Base64"&gt;Base64&lt;/a&gt; or &lt;a href="https://en.wikipedia.org/wiki/Message_Transmission_Optimization_Mechanism"&gt;Message Transmission Optimization Mechanism (MTOM)&lt;/a&gt;.
The latter is much more efficient, but also harder to troubleshoot if it doesn&amp;rsquo;t work at once.&lt;/p&gt;
&lt;p&gt;Both options have their own typical scenario&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Serialise the file content using Base64 and include the result right into the XML structure.
This is relatevely easy to implement and troubleshoot.
It usually works well for small binary files, but as files grow larger, you may run into performance issues.
The Base64-encoded binary file may be so big that the XML parser will blow up.&lt;/li&gt;
&lt;li&gt;Use MTOM to transfer the request and attachments.
In this approach, the SOAP request (XML) and any attachments are sent as a multipart request.
This is a bit harder to implement, and if it doesn&amp;rsquo;t work at once, it is even harder to troubleshoot.
But on the other hand, it allows for much more efficient transportation of the attached files.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id="soap-over-http"&gt;SOAP over HTTP&lt;/h2&gt;
&lt;p&gt;As a primer, let&amp;rsquo;s have a quick look at how &amp;ldquo;regular&amp;rdquo; SOAP requests look when transmitted over HTTP.
Imagine we have a file upload webservice which accepts files in any format, along with a file name.
If we were to upload a file, the request might look like this.&lt;/p&gt;</description></item><item><title>How does BEAST work?</title><link>https://maarten.mulders.it/2018/11/how-does-beast-work/</link><pubDate>Wed, 21 Nov 2018 08:23:44 +0200</pubDate><guid>https://maarten.mulders.it/2018/11/how-does-beast-work/</guid><description>&lt;p&gt;Last month, &lt;a href="https://gotober.com/2018/sessions/684"&gt;I did a talk at GOTO Berlin&lt;/a&gt; where I explained the basics of Transport Layer Security.
During the talk, the audience asked a few questions through the app.
One of them was: &amp;ldquo;How does Beast work?&amp;rdquo; and I wasn&amp;rsquo;t able to answer that one on stage, unfortunately.
Since it&amp;rsquo;s an interesting question, I&amp;rsquo;ll answer it here.
Unfortunately, understanding BEAST is a bit harder than the talk itself&amp;hellip;&lt;/p&gt;
&lt;p&gt;BEAST stands for &lt;em&gt;Browser Exploit Against SSL/TLS&lt;/em&gt;.
In itself, it isn&amp;rsquo;t a vulnerability.
Thai Duong and Juliano Rizzo made a demonstration of a longer-known vulnerability.
This vulnerability was published &lt;a href="https://www.openssl.org/~bodo/tls-cbc.txt"&gt;back in 2004&lt;/a&gt; and applied to SSL 3.0 and TLS 1.0.
BEAST showed that this old vulnerability was in fact useable for a real-world attack.&lt;/p&gt;</description></item><item><title>A first look at MVC 1.0</title><link>https://maarten.mulders.it/2018/09/a-first-look-at-mvc-1.0/</link><pubDate>Fri, 14 Sep 2018 21:20:19 +0200</pubDate><guid>https://maarten.mulders.it/2018/09/a-first-look-at-mvc-1.0/</guid><description>&lt;p&gt;Recently, Twitter brought the &lt;a href="https://www.agilejava.eu/2018/08/31/ozark-becomes-eclipse-krazo/"&gt;renaming of Ozark to Krazo&lt;/a&gt; to my attention.
It pulled my attention: I had never heard of either projects, and I wondered what they would be about.
Ozark (or Krazo) will be the Reference Implementation of the new Model-View-Controller Specification.
This &lt;a href="https://www.mvc-spec.org/"&gt;MVC specification&lt;/a&gt;, also known as &lt;a href="https://jcp.org/en/jsr/detail?id=371"&gt;JSR 371&lt;/a&gt;, was planned for inclusion in Java EE 8, but eventually dropped.
Apparently, this didn&amp;rsquo;t kill the effort.
I was curious to see where the specification (and it&amp;rsquo;s implementation) would be now.&lt;/p&gt;</description></item><item><title>Custom SOAP Faults using Spring WS</title><link>https://maarten.mulders.it/2018/07/custom-soap-faults-using-spring-ws/</link><pubDate>Tue, 24 Jul 2018 16:05:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/07/custom-soap-faults-using-spring-ws/</guid><description>&lt;p&gt;There are many situations when you need to write a SOAP-based webservice.
Maybe you are writing a test dummy, or maybe you got the interface from some kind of architect.
&lt;a href="https://docs.spring.io/spring-ws/sites/1.5/reference/html/why-contract-first.html"&gt;(Yes, there are other reasons, too.)&lt;/a&gt;
And chances are you&amp;rsquo;ll be using &lt;a href="https://docs.spring.io/spring-ws/docs/3.0.1.RELEASE/reference/#tutorial"&gt;Spring-WS&lt;/a&gt; to do this.&lt;/p&gt;
&lt;p&gt;Recently I was doing that, and I found the following inside the interface definition (WSDL):&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;-webkit-text-size-adjust:none;"&gt;&lt;code class="language-xml" data-lang="xml"&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;element&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;faultMessage&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;type=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;common:FaultMessage&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;message&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;faultMessage&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;part&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;faultMessage&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;element=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tns:faultMessage&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/message&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;portType&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;someName&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;operation&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;searchOrder&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;input&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tns:searchOrderRequest&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;output&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tns:searchOrderResponse&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;fault&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;name=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;faultMessage&amp;#34;&lt;/span&gt; &lt;span style="color:#a6e22e"&gt;message=&lt;/span&gt;&lt;span style="color:#e6db74"&gt;&amp;#34;tns:faultMessage&amp;#34;&lt;/span&gt;&lt;span style="color:#f92672"&gt;/&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt; &lt;span style="color:#f92672"&gt;&amp;lt;/operation&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&lt;span style="color:#f92672"&gt;&amp;lt;/portType&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That was a rather challenging thing!
In case the operation would fail, it should give a SOAP Fault with a custom element in it:&lt;/p&gt;</description></item><item><title>Building ASP.NET Core apps on CircleCI</title><link>https://maarten.mulders.it/2018/04/building-asp.net-core-apps-on-circleci/</link><pubDate>Mon, 02 Apr 2018 11:42:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/04/building-asp.net-core-apps-on-circleci/</guid><description>&lt;p&gt;Recently, my co-worker &lt;a href="https://twitter.com/willem_meints"&gt;Willem&lt;/a&gt; pulled my attention to the &lt;a href="https://docs.microsoft.com/en-us/dotnet/standard/microservices-architecture/index"&gt;.NET Microservices. Architecture for Containerized .NET Applications&lt;/a&gt; e-book.
Although I have a strong background in Java and the Java platform, I started reading it, and soon I felt like trying it out.
But building software without having automated builds and tests is not the real thing, so that was the first thing I wanted to do.
I usually use &lt;a href="https://circleci.com/"&gt;CircleCI&lt;/a&gt; for that, but unfortunately they don&amp;rsquo;t seem to have an official guide for that.&lt;/p&gt;</description></item><item><title>Simple UML drawing with PlantUML</title><link>https://maarten.mulders.it/2018/04/simple-uml-drawing-with-plantuml/</link><pubDate>Sun, 01 Apr 2018 20:27:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/04/simple-uml-drawing-with-plantuml/</guid><description>&lt;p&gt;Every now and then, there&amp;rsquo;s this moment where you feel a certain urge to draw a diagram.
Oftentimes, I feel a similar urge to make a digital version of it.
But I don&amp;rsquo;t always have professional tooling around - and no, PowerPoint or its friends are not what I&amp;rsquo;m looking for.&lt;/p&gt;
&lt;p&gt;Recently, I found a tool that fits my idea of &amp;ldquo;good tooling&amp;rdquo; rather well.
So, without further ado, let me introduce you to &lt;a href="http://plantuml.com/"&gt;PlantUML&lt;/a&gt;!
Why do I love this tool?&lt;/p&gt;</description></item><item><title>Impressions of the first JVMCON</title><link>https://maarten.mulders.it/2018/02/impressions-of-the-first-jvmcon/</link><pubDate>Thu, 01 Feb 2018 20:17:00 +0200</pubDate><guid>https://maarten.mulders.it/2018/02/impressions-of-the-first-jvmcon/</guid><description>&lt;p&gt;Last Tuesday was the first edition of &lt;a href="https://www.jvmcon.com/"&gt;JVMCON&lt;/a&gt;.
This conference has a special programme committee: its audience.
When the Call for Papers closed, everyone who had a ticket could see the submitted papers.
Only, they could not see &lt;em&gt;who&lt;/em&gt; submitted the paper - which let them focus on the papers themselves.
Out of almost 180 papers, they had to select 13&amp;hellip;&lt;/p&gt;
&lt;p&gt;And guess what: one of them was &lt;a href="https://maarten.mulders.it/talks.html#how-to-stay-responsive-with-400-backends"&gt;mine&lt;/a&gt;!
I presented my talk for the &lt;em&gt;early birds&lt;/em&gt;, and there were quite a lot of them!
The room was pretty much packed, and there was a lot of questions and remarks afterwards.
That surprised me a bit, since I usually do not experience a lot of interaction with the audience.&lt;/p&gt;</description></item><item><title>I upgraded to Java 9 - Part II</title><link>https://maarten.mulders.it/2018/01/i-upgraded-to-java-9-part-ii/</link><pubDate>Tue, 23 Jan 2018 16:14:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/01/i-upgraded-to-java-9-part-ii/</guid><description>&lt;p&gt;A few weeks ago, &lt;a href="https://maarten.mulders.it/blog/2018/01/migrating-to-java9.html"&gt;I wrote&lt;/a&gt; about migrating an existing Spring-application to Java 9.
When I finished, two things remained to be investigated:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Code coverage for unit tests.&lt;/li&gt;
&lt;li&gt;A bunch of warnings when running the application in Tomcat.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id="code-coverage-for-unit-tests"&gt;Code coverage for unit tests&lt;/h3&gt;
&lt;p&gt;As &lt;a href="https://maarten.mulders.it/blog/2018/01/migrating-to-java9.html#comment-3706293583"&gt;Alan Bateman pointed out&lt;/a&gt;, upgrading JaCoCo to its latest version &lt;em&gt;should&lt;/em&gt; resolve the issue about the &lt;code&gt;$jacocoData&lt;/code&gt; field.
In fact, I thought I had done that, but somehow I kept on getting the same error every single time.
But when I tried (again) last week, it somehow disappeared.
No error to be seen, all tests green, and a nice coverage report from JaCoCo.
I&amp;rsquo;m a happy developer, again!&lt;/p&gt;</description></item><item><title>I upgraded to Java 9 - here's what happened</title><link>https://maarten.mulders.it/2018/01/i-upgraded-to-java-9-heres-what-happened/</link><pubDate>Fri, 12 Jan 2018 20:28:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/01/i-upgraded-to-java-9-heres-what-happened/</guid><description>&lt;p&gt;I recently participated in a &lt;a href="https://twitter.com/royvanrijn/status/951087591272714241"&gt;Twitter conversation&lt;/a&gt; about upgrading to Java 9.
Like &lt;a href="https://twitter.com/royvanrijn/status/950718660641017856"&gt;most of the people&lt;/a&gt;, my current projects are all on Java 8.
Of course the question came up, why don&amp;rsquo;t you upgrade?
Good question!
Since I hadn&amp;rsquo;t even tried, I decided to see how far I could come&amp;hellip;&lt;/p&gt;
&lt;p&gt;The component I took for my experiment is a pretty simple Spring application.
It doesn&amp;rsquo;t use Spring Boot.
It exposes a few REST endpoints, and calls couple of webservices over SOAP.
For these webservices, it uses bindings generated by the &lt;a href="https://github.com/highsource/maven-jaxb2-plugin"&gt;JAXB plugin for Maven&lt;/a&gt;.&lt;/p&gt;</description></item><item><title>Devoxx 2017</title><link>https://maarten.mulders.it/2018/01/devoxx-2017/</link><pubDate>Sun, 07 Jan 2018 14:15:35 +0200</pubDate><guid>https://maarten.mulders.it/2018/01/devoxx-2017/</guid><description>&lt;p&gt;Almost two months ago I visited Devoxx 2017.
It&amp;rsquo;s about time to write some notes on the stuff I learnt there!&lt;/p&gt;
&lt;h4 id="event-storming--ddd-workshop"&gt;Event Storming &amp;amp; DDD workshop&lt;/h4&gt;
&lt;p&gt;The week started off with a full afternoon workshop led by &lt;a href="https://www.twitter.com/@stijnvp"&gt;Stijn Vanpoucke&lt;/a&gt;.
The workshop consisted of small pieces of theory, alternated with exercises using post-it&amp;rsquo;s and markers.&lt;/p&gt;
&lt;p&gt;A few of the theoretic pieces:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;An &lt;strong&gt;event&lt;/strong&gt; is something that has happened in the past.
It is usually phrased in past tense.
It should be understandable for business users.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;command&lt;/strong&gt; is an user-initiated action.
It explains the origin and sometimes the reason for the action.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;entity&lt;/strong&gt; is an individual thing.
It has a unique identity.
Often, entities are mutable.&lt;/li&gt;
&lt;li&gt;A &lt;strong&gt;value object&lt;/strong&gt; is an non-unique value.
It is often immutable.
Its equality is based on it&amp;rsquo;s attributes.
It should be able to validate itself.
They can be combined.&lt;/li&gt;
&lt;li&gt;An &lt;strong&gt;aggregate&lt;/strong&gt; is a combination of &lt;em&gt;entities&lt;/em&gt; and &lt;em&gt;value objects&lt;/em&gt;.
They are structured in a hierarchy.
Its root is always an &lt;em&gt;entity&lt;/em&gt;.
Aggregates contain business rules.
Note that a bigger aggregate is not always better!
To circumvent this, aggregates can use &lt;em&gt;soft links&lt;/em&gt; based on the unique identity of other entities.&lt;/li&gt;
&lt;li&gt;The &lt;strong&gt;bounded context&lt;/strong&gt; describes the context from which you look at it.
Take a &lt;em&gt;pen&lt;/em&gt; as example; what a &lt;em&gt;pen&lt;/em&gt; is depends on the context from which you look at it.
To stress the fact that it has boundaries, it is called a &lt;em&gt;bounded&lt;/em&gt; context.
Bounded contexts support the idea of having &amp;ldquo;one team, one (business) language&amp;rdquo;.
The bigger the bounded context is, the bigger the language, whether artificial or natural.
Finally, multiple domains can have different words for the same concept.
A sales department might speak of &lt;em&gt;products&lt;/em&gt; while inventory management might name the same concept &lt;em&gt;article&lt;/em&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h4 id="kotlin-for-java-programmers"&gt;Kotlin for Java programmers&lt;/h4&gt;
&lt;p&gt;This year had a lot of talks about Kotlin scheduled.
To visit them all would take too much time, so I decided to follow just one by &lt;a href="https://www.twitter.com/@venkat_s"&gt;Venkat Subramaniam&lt;/a&gt;.
I figured it would give me about the same amount of content&amp;hellip;&lt;/p&gt;</description></item><item><title>Getting Started with Zuul</title><link>https://maarten.mulders.it/2017/12/getting-started-with-zuul/</link><pubDate>Sat, 30 Dec 2017 14:15:35 +0200</pubDate><guid>https://maarten.mulders.it/2017/12/getting-started-with-zuul/</guid><description>&lt;p&gt;It&amp;rsquo;s been a while since my last post!
I recently have been reading a lot about the idea of &amp;ldquo;API management&amp;rdquo; or an &amp;ldquo;API gateway&amp;rdquo;.
There&amp;rsquo;s a lot of commercial offerings in this field.
Many of them promise you (to some extend) ultimate flexibility and endless possibilities.
My preference is for &amp;ldquo;lean and mean&amp;rdquo; approaches where I can pick the building blocks that I need.
In the long run, that offers more flexibility.
After all, you could replace building blocks.
Having small building blocks makes it less tempting to put any kind of business logic in such a gateway.
Doing that must sooner or later lead to some kind of vendor lock-in.&lt;/p&gt;</description></item><item><title>JavaOne 2017</title><link>https://maarten.mulders.it/2017/10/javaone-2017/</link><pubDate>Fri, 06 Oct 2017 15:05:45 +0200</pubDate><guid>https://maarten.mulders.it/2017/10/javaone-2017/</guid><description>&lt;p&gt;This year, I had the pleasure again to visit JavaOne.
Not only did I attend the conference, I was also accepted &lt;a href="https://maarten.mulders.tk/talks.html"&gt;to speak&lt;/a&gt;, which was quite a dream come true.
The &lt;a href="https://events.rainfocus.com/catalog/oracle/oow17/catalogjavaone17"&gt;session catalog&lt;/a&gt; contains almost 500 sessions, and I obviously visited only a subset of them.
I found two topics particularly interesting and decided to attend multiple sessions on each of them.&lt;/p&gt;
&lt;h2 id="prepare-for-jdk-9-and-migrating-to-java-9-modules"&gt;&amp;ldquo;Prepare for JDK 9&amp;rdquo; and &amp;ldquo;Migrating to Java 9 Modules&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Both sessions where more or less covering the same ground, although from a different perspective.
Alan Bateman from Oracle took the more theoretical view and explained what you can expect to happen when you want to move to Java 9.
He also busted some myths, like the one that &amp;ldquo;nothing will continue to work&amp;rdquo; or &amp;ldquo;everything first needs to be modularised&amp;rdquo;.&lt;/p&gt;</description></item><item><title>Markdown to PDF</title><link>https://maarten.mulders.it/2017/08/markdown-to-pdf/</link><pubDate>Wed, 09 Aug 2017 21:33:45 +0200</pubDate><guid>https://maarten.mulders.it/2017/08/markdown-to-pdf/</guid><description>&lt;p&gt;Todays note is nothing more than a quick tip.
I&amp;rsquo;m a big fan of the &lt;a href="https://en.wikipedia.org/wiki/Markdown"&gt;Markdown&lt;/a&gt; markup language, but sometimes I need to exchange documents with people who don&amp;rsquo;t know how to read them.
Often, they prefer just Word or PDF.
So I looked for a way to convert a Markdown file to a PDF file.&lt;/p&gt;
&lt;p&gt;My current solution is based on &lt;a href="https://nodejs.org/en/"&gt;Node.js&lt;/a&gt; so you need to &lt;a href="https://nodejs.org/en/download/"&gt;install&lt;/a&gt; that first.
Then use &lt;code&gt;npm&lt;/code&gt;, the package manager for javascript, to install the &lt;em&gt;markdown-pdf&lt;/em&gt; package using&lt;/p&gt;</description></item><item><title>No bind or arrow functions in in JSX Props - Why? How?</title><link>https://maarten.mulders.it/2017/07/no-bind-or-arrow-functions-in-in-jsx-props-why-how/</link><pubDate>Tue, 25 Jul 2017 07:30:45 +0200</pubDate><guid>https://maarten.mulders.it/2017/07/no-bind-or-arrow-functions-in-in-jsx-props-why-how/</guid><description>&lt;p&gt;Recently, I found myself running &lt;a href="https://palantir.github.io/tslint/"&gt;tslint&lt;/a&gt; on a small React application written in TypeScript.
The combination itself is worth writing another blog post about, but today we&amp;rsquo;re covering just one of the rules that tslint has; in fact, it is defined in the &amp;ldquo;tslint-react&amp;rdquo; rule set.
It is also included in the &lt;a href="https://github.com/yannickcr/eslint-plugin-react"&gt;eslint-plugin-react&lt;/a&gt;, because it is not related to TypeScript per se.&lt;/p&gt;
&lt;h3 id="whats-it-about"&gt;What&amp;rsquo;s it about?&lt;/h3&gt;
&lt;p&gt;In its ES6 version, the rule says: &amp;ldquo;No &lt;code&gt;.bind()&lt;/code&gt; or Arrow Functions in JSX Props (react/jsx-no-bind).&amp;rdquo;
The TypeScript version has two rules, one is called &amp;ldquo;jsx-no-bind&amp;rdquo; and the other one &amp;ldquo;jsx-no-lambda&amp;rdquo;; their intent is the same as the ES6 one.
When you first notice the rule, you might wonder &amp;ldquo;why is that an issue?&amp;rdquo;.
If you call &lt;code&gt;bind()&lt;/code&gt;, or if you define an arrow function, this will create a brand new function every time you run that code.
When you&amp;rsquo;re using that inside a &lt;code&gt;render()&lt;/code&gt; method or a so-called &lt;a href="https://hackernoon.com/react-stateless-functional-components-nine-wins-you-might-have-overlooked-997b0d933dbc"&gt;stateless functional component&lt;/a&gt;, it will create a new function &lt;em&gt;every time&lt;/em&gt; you render that component.
That violates the &lt;a href="https://facebook.github.io/react/docs/components-and-props.html#props-are-read-only"&gt;one strict rule&lt;/a&gt; from React that says&lt;/p&gt;</description></item><item><title>Installing the CUDA Toolkit on Ubuntu</title><link>https://maarten.mulders.it/2017/07/installing-the-cuda-toolkit-on-ubuntu/</link><pubDate>Wed, 12 Jul 2017 07:55:32 +0200</pubDate><guid>https://maarten.mulders.it/2017/07/installing-the-cuda-toolkit-on-ubuntu/</guid><description>&lt;p&gt;Lately, my interest for machine learning and artificial intelligence has revived.
When I was at university, I followed some courses and specialisations in this field, but then during my career I hardly ever used any of it.
Back in those years, complex neural nets and genetic algorithms took days to build, mainly because we didn&amp;rsquo;t have the computing power for that.
But nowadays, things have changed, and such models can relatively quickly be built using a commodity graphics card.&lt;/p&gt;</description></item><item><title>JBCNConf &amp; Voxxed Days LU</title><link>https://maarten.mulders.it/2017/06/jbcnconf-voxxed-days-lu/</link><pubDate>Thu, 22 Jun 2017 15:05:32 +0200</pubDate><guid>https://maarten.mulders.it/2017/06/jbcnconf-voxxed-days-lu/</guid><description>&lt;p&gt;Wow, that was a busy and inspiring week!
In one week, I&amp;rsquo;ve visited two conferences in two different countries to give talks on two different subjects.
But the most inspiring part came from attending other sessions.
I&amp;rsquo;ll highlight one session from both conferences.&lt;/p&gt;
&lt;h3 id="jbcnconf-2017"&gt;JBCNConf 2017&lt;/h3&gt;
&lt;p&gt;On JBCNConf, I&amp;rsquo;ve attented a session by &lt;a href="https://twitter.com/burrsutter"&gt;Burr Sutter&lt;/a&gt; about &lt;a href="http://vertx.io/"&gt;Vert.x&lt;/a&gt;.
This was a session full of energy, as Burr is really capable of making your enthusiastic of whatever he is talking on.
As he walked us through the various options you have to build and deploy Vert.x-based applications, he also showed a lot of demos.
One of the demos involved &amp;ldquo;simple&amp;rdquo; temperature sensors over MQTT on miniature computers (aside: the size of these computers was largely dominated by their batteries&amp;hellip; impressive!) to his MacBook showing you can run Vert.x in multiple languages that still communicate with each other.
It also illustrated how to handle events coming in at this pace, introducing the concepts of streaming events.&lt;/p&gt;</description></item><item><title>Elastic stack: a renewed introduction</title><link>https://maarten.mulders.it/2017/04/elastic-stack-a-renewed-introduction/</link><pubDate>Tue, 18 Apr 2017 08:05:32 +0200</pubDate><guid>https://maarten.mulders.it/2017/04/elastic-stack-a-renewed-introduction/</guid><description>&lt;p&gt;A few years ago, I had an assignment at my former client involving Elasticsearch, Logstash and Kibana to build an operational dashboard.
It was fun to do and very instructive; afterwards, I &lt;a href="http://www.nljug.org/nieuws/bigdata-devops/"&gt;wrote an article&lt;/a&gt; about my experiences and spoke at &lt;a href="https://www.youtube.com/watch?v=tYGn7DX3SUY"&gt;various&lt;/a&gt; &lt;a href="https://www.youtube.com/watch?v=mtI88EkWZgUa"&gt;conferences&lt;/a&gt;.
Recently, I was asked by another team in my company to assist them in setting it up for their team.
A good chance to catch up with some old friends, and see how they have changed over the years.&lt;/p&gt;</description></item><item><title>Verify logging with Logback</title><link>https://maarten.mulders.it/2017/03/verify-logging-with-logback/</link><pubDate>Thu, 02 Mar 2017 10:15:32 +0200</pubDate><guid>https://maarten.mulders.it/2017/03/verify-logging-with-logback/</guid><description>&lt;p&gt;Sometimes you have a piece of logging that is very important, maybe even part of a business requirement.
In that case, you might want to verify that in a unit test, so you can rest assured that this requirement is actually met.
How to do that?&lt;/p&gt;
&lt;h3 id="mock-it-away"&gt;Mock it away&lt;/h3&gt;
&lt;p&gt;A first approach might be to just mock your logging framework in a unit test and verify it was called as you expected.
It might sound tempting, and easy to do, but &lt;a href="https://github.com/mockito/mockito/wiki/How-to-write-good-tests#dont-mock-type-you-dont-own"&gt;not everybody likes it&lt;/a&gt;.
And in fact, you might run into some issues when walking this path, because some libraries tend to make classes and/or methods final so they can&amp;rsquo;t always be mocked away.
Also, a lot of people tend to create a logger by doing &lt;code&gt;private static final Logger LOG = ...&lt;/code&gt;, which makes it even harder to mock it away.
Making your logger an instance variable just so you can test it? Nah&amp;hellip;&lt;/p&gt;</description></item><item><title>Blah blah Microservices blah blah</title><link>https://maarten.mulders.it/2017/02/blah-blah-microservices-blah-blah/</link><pubDate>Sat, 25 Feb 2017 20:15:40 +0200</pubDate><guid>https://maarten.mulders.it/2017/02/blah-blah-microservices-blah-blah/</guid><description>&lt;p&gt;As a closing keynote on the &lt;a href="https://maarten.mulders.it/blog/2017/02/jfokus-day-2.html"&gt;second day of Jfokus&lt;/a&gt;, &lt;a href="https://twitter.com/jboner"&gt;Jonas Bonér&lt;/a&gt; took the stage under the very clarifying title &amp;ldquo;Blah blah Microservices blah blah&amp;rdquo;, which turned out to mean &amp;ldquo;From microliths to microsystems&amp;rdquo;.&lt;/p&gt;
&lt;p&gt;As a first observation, he stated that no-one really likes microservices.
They are kind of a necessary evil - because &amp;ldquo;doing&amp;rdquo; microservices comes at a cost.
In fact, microservices are just a specialisation of an older concept called distributed systems.
But what we often build are microliths - an application that might be called a microservice except for the fact that it lives alone.
No failover, no resilience, nothing.
But just like actors, microservices should come in systems.
And just as important, microservices should come &lt;em&gt;as&lt;/em&gt; systems, designed as a distributed system, which each microservice focussing on a single responsibility.&lt;/p&gt;</description></item><item><title>Jfokus, Day 2</title><link>https://maarten.mulders.it/2017/02/jfokus-day-2/</link><pubDate>Wed, 08 Feb 2017 16:30:40 +0200</pubDate><guid>https://maarten.mulders.it/2017/02/jfokus-day-2/</guid><description>&lt;p&gt;The second day of Jfokus is just as action-packed as &lt;a href="https://maarten.mulders.it/blog/2017/02/jfokus-day-1.html"&gt;the first one&lt;/a&gt;.
However, part of the action is me giving &lt;a href="https://www.jfokus.se/jfokus/talks.jsp#Buildingcross-platfo"&gt;two&lt;/a&gt; &lt;a href="https://www.jfokus.se/jfokus/talks.jsp#OutsmartingtheSmartM"&gt;talks&lt;/a&gt;.
Both of them scheduled today, so a little less time for attending other sessions and blogging about them.
I did attend some other sessions after lunch time, on which I&amp;rsquo;ll report below.&lt;/p&gt;
&lt;h3 id="introduction-to-machine-learning"&gt;Introduction to Machine Learning&lt;/h3&gt;
&lt;p&gt;Directly after the lunch, &lt;a href="https://twitter.com/_JamesWard"&gt;James Ward&lt;/a&gt; gave an introduction to machine learning.
He started with a very recognizable story about how humans (&lt;em&gt;in casu&lt;/em&gt; his daughter) learn new facts about the world around them.
Machine learning is in fact no different than human learning: building a model, trying something, seeing whether and how it changes reality and updating the model.&lt;/p&gt;</description></item><item><title>Quickly switch Java versions on macOS</title><link>https://maarten.mulders.it/2017/02/quickly-switch-java-versions-on-macos/</link><pubDate>Tue, 07 Feb 2017 18:06:40 +0200</pubDate><guid>https://maarten.mulders.it/2017/02/quickly-switch-java-versions-on-macos/</guid><description>&lt;p&gt;Inspired by &lt;a href="https://maarten.mulders.it/blog/2017/02/jfokus-day-1.html#java-9-make-way-for-modules"&gt;a Jfokus session I attended today&lt;/a&gt; I decided to download and install a preview of Java 9 on my MacBook.
That went pretty quick and without much trouble.
But when I issued &lt;code&gt;java -version&lt;/code&gt; on my terminal, I was greeted with&lt;/p&gt;
&lt;pre tabindex="0"&gt;&lt;code&gt;Java(TM) SE Runtime Environment (build 9-ea+155)
Java HotSpot(TM) 64-Bit Server VM (build 9-ea+155, mixed mode)
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Although that&amp;rsquo;s nice - you&amp;rsquo;d even expect it, maybe - I realised I often need Java 8 as well.
How to quickly switch between the two?&lt;/p&gt;</description></item><item><title>Jfokus, Day 1</title><link>https://maarten.mulders.it/2017/02/jfokus-day-1/</link><pubDate>Tue, 07 Feb 2017 08:10:40 +0200</pubDate><guid>https://maarten.mulders.it/2017/02/jfokus-day-1/</guid><description>&lt;p&gt;These days, I&amp;rsquo;m in Stockholm, attending and speaking at the &lt;a href="https://www.jfokus.se/"&gt;Jfokus conference&lt;/a&gt;.
Yesterday night was a great opportunity to get to know a few other speakers during dinner.
We were even surprised by an act of the &lt;a href="http://www.lemonsqueezy.se/"&gt;Lemon Squeezy&lt;/a&gt; barbershop quartet singing for us - very beautiful!&lt;/p&gt;
&lt;p&gt;But today, the serious stuff started.
In the following sections, I have written down my notes and observations of each of the sessions I attended.&lt;/p&gt;</description></item><item><title>Long time, no blog</title><link>https://maarten.mulders.it/2017/01/long-time-no-blog/</link><pubDate>Tue, 31 Jan 2017 08:10:40 +0200</pubDate><guid>https://maarten.mulders.it/2017/01/long-time-no-blog/</guid><description>&lt;p&gt;Recently, I was asked to write a blog about a side project I did.
That question reminded me of the blog I used to have&amp;hellip; long time ago.&lt;/p&gt;
&lt;p&gt;I stopped blogging due to changes in my personal situation, which led to a priority shift.
Being a father to two beautiful daughters sure takes a lot of time!
But I missed the possibility to share some notes, thoughts, ideas and the like.
So I decided to resurrect my blog, although in fact it&amp;rsquo;s more of a notebook.
In the coming period, I&amp;rsquo;ll be adding some historical notes which I earlier stored privately.
Stay tuned!&lt;/p&gt;</description></item><item><title>Automatic scan for known vulnerabilities in dependencies</title><link>https://maarten.mulders.it/2016/08/automatic-scan-for-known-vulnerabilities-in-dependencies/</link><pubDate>Tue, 30 Aug 2016 15:30:40 +0200</pubDate><guid>https://maarten.mulders.it/2016/08/automatic-scan-for-known-vulnerabilities-in-dependencies/</guid><description>&lt;p&gt;When using third-party components (be it open source or not), we all know it&amp;rsquo;s a good practice to keep your frameworks and libraries up to date.
This is also one of the spearhead in the &lt;a href="https://www.owasp.org/index.php/Top_10_2013-Top_10"&gt;OWASP Top 10 (2013 edition)&lt;/a&gt;: &lt;a href="https://www.owasp.org/index.php/Top_10_2013-A9-Using_Components_with_Known_Vulnerabilities"&gt;A9 - Using Components with Known Vulnerabilities&lt;/a&gt;.
To help you assess your projects status with regard to this, OWASP.org developed the tool &lt;a href="https://www.owasp.org/index.php/OWASP_Dependency_Check"&gt;Dependency Check&lt;/a&gt;.
This tool is primarily intended code bases in Java, .NET, Ruby, Node.js, and Python.
Integration with various build tools is also provided for.&lt;/p&gt;</description></item><item><title>Tweaking nginx for serving static content</title><link>https://maarten.mulders.it/2016/03/tweaking-nginx-for-serving-static-content/</link><pubDate>Tue, 01 Mar 2016 14:42:40 +0200</pubDate><guid>https://maarten.mulders.it/2016/03/tweaking-nginx-for-serving-static-content/</guid><description>&lt;p&gt;For a recent project, we decided to use the &lt;a href="http://nginx.org/"&gt;nginx webserver&lt;/a&gt; as our primary web server.
It is easy, relatively light-weight, and it seemed to suit our needs quite well.
The project had a lot of static content - HTML, JavaScript, CSS and image files.
Of course, we wanted to achieve a high performance with as many concurrent requests being served as possible.
This is what we did.&lt;/p&gt;
&lt;h3 id="setup"&gt;Setup&lt;/h3&gt;
&lt;p&gt;First of all, it is worth to mention the setup.
Our staging environment had just one virtual machine with nginx running.
This was an &lt;a href="https://azure.microsoft.com/en-us/services/virtual-machines/"&gt;Azure&lt;/a&gt; Standard A2 VM with 2 cores and 3,5 GB of RAM.
That&amp;rsquo;s not a lot, and in a real production environment you would definitely go for more web servers, with some kind of load balancing.
But the goal of this experiment was mainly to experiment with the many options nginx provides for tweaking.
The virtual was located in the same region as where the project will be deployed.
Also, we used a similarly sized machine for putting load on our web server.
This machine was located in that same region as well.&lt;/p&gt;</description></item><item><title>Quickly count your code base</title><link>https://maarten.mulders.it/2016/02/quickly-count-your-code-base/</link><pubDate>Wed, 03 Feb 2016 08:10:40 +0200</pubDate><guid>https://maarten.mulders.it/2016/02/quickly-count-your-code-base/</guid><description>&lt;p&gt;Often, the size of a code base is measured in terms of &amp;ldquo;source lines of code&amp;rdquo; (SLoC).
If you&amp;rsquo;re interested in the size of your code base - or your client is - this metric provides a way to express that size.
Of course, comments and the like are not considered to be code, so how to determine this metric?
Using &lt;code&gt;grep&lt;/code&gt; is tempting, but it quickly results in a very complex and hard-to-understand approach.&lt;/p&gt;</description></item><item><title>Easily upgrade Java dependencies</title><link>https://maarten.mulders.it/2016/01/easily-upgrade-java-dependencies/</link><pubDate>Wed, 20 Jan 2016 17:11:40 +0200</pubDate><guid>https://maarten.mulders.it/2016/01/easily-upgrade-java-dependencies/</guid><description>&lt;p&gt;To start with a cliche: the Java ecosystem continues to develop at a high pace.
Various open source frameworks releasing versions, sometimes even multiple versions at the same time.
This may quickly turn into &lt;a href="https://maarten.mulders.it/blog/2016/08/automatic-scan-for-known-vulnerabilities-in-dependencies.html"&gt;a risk&lt;/a&gt;
But how to deal with it?&lt;/p&gt;
&lt;p&gt;Basically, you have two options.
We&amp;rsquo;ll take a typical Maven-project as an example, which uses &lt;a href="https://commons.apache.org/proper/commons-lang/"&gt;Commons Lang 3&lt;/a&gt;.
See &lt;a href="#gradle"&gt;the end of this post&lt;/a&gt; if you prefer Gradle over Maven.&lt;/p&gt;
&lt;h3 id="automatic-upgrades"&gt;Automatic upgrades&lt;/h3&gt;
&lt;p&gt;Maybe the simplest way is automatic upgrading.
You can achieve this by not specifying an exact version of your dependency, but instead specify a &lt;em&gt;version range&lt;/em&gt;.
If you would normally have this snippet in your POM:&lt;/p&gt;</description></item><item><title>Combining Docker and Maven</title><link>https://maarten.mulders.it/2015/12/combining-docker-and-maven/</link><pubDate>Wed, 02 Dec 2015 08:34:40 +0200</pubDate><guid>https://maarten.mulders.it/2015/12/combining-docker-and-maven/</guid><description>&lt;p&gt;When you&amp;rsquo;re building Java or JVM-based software, chances are these days you&amp;rsquo;ll be deploying it inside Docker.
Chances also are you&amp;rsquo;re building it with Maven.
Now how do you combine the two?
Of course, you could plumb together some scripts for the platform of your choice, but there&amp;rsquo;s a few disadvantages to that.
First of all, it makes you platform-dependant: your build may not work - or behave differently - depending on the platform where you&amp;rsquo;re building.
Secondly, it&amp;rsquo;s not very elegant, since it does not easily facilitate re-use.
And in these days of microservices, we don&amp;rsquo;t want to be copying the same scripts over and over again.
Thirdly, it requires the Docker binaries to be present on the system where you perform your build.&lt;/p&gt;</description></item><item><title>Timing in Protractor tests</title><link>https://maarten.mulders.it/2014/06/timing-in-protractor-tests/</link><pubDate>Fri, 27 Jun 2014 08:05:40 +0200</pubDate><guid>https://maarten.mulders.it/2014/06/timing-in-protractor-tests/</guid><description>&lt;p&gt;Ever noticed that annoying error while running your Protractor tests:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Error while waiting for Protractor to sync with the page: {}.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Especially the two brackets are annoying, because they suggest more information &lt;em&gt;might&lt;/em&gt; be available but it is just hidden for you.&lt;/p&gt;
&lt;p&gt;The good news is, the fix is rather easy. It turns out that Protractor expects your application to have an &lt;code&gt;data-ng-app&lt;/code&gt; attribute on the HTML &lt;code&gt;body&lt;/code&gt; element.&lt;/p&gt;
&lt;p&gt;My application does not have that, since the Angular application is just a part of my page. So in my Protractor config, I have to add an option to tell Protractor where to find the Angular application:&lt;/p&gt;</description></item><item><title>Mobile emulation in Google Chrome</title><link>https://maarten.mulders.it/2014/06/mobile-emulation-in-google-chrome/</link><pubDate>Fri, 20 Jun 2014 09:03:19 +0200</pubDate><guid>https://maarten.mulders.it/2014/06/mobile-emulation-in-google-chrome/</guid><description>&lt;p&gt;Building a web site or web application that should also be useable on other devices than &amp;lsquo;regular&amp;rsquo; desktops or laptops?
You don&amp;rsquo;t always have your mobile device at hand, or might not even own one.
Yet, you want to see how your new gem looks on such devices. Worry no more!&lt;/p&gt;
&lt;p&gt;Google Chrome to the rescue.
We all know the &amp;lsquo;Developer Tools&amp;rsquo;, accessible using &lt;kbd&gt;F12&lt;/kbd&gt;.
If you press &lt;kbd&gt;ESC&lt;/kbd&gt; while inside the &amp;lsquo;Developer Tools&amp;rsquo;, the &amp;lsquo;DevTools console drawer&amp;rsquo; appears.
Next to a &amp;lsquo;Console&amp;rsquo; and &amp;lsquo;Search&amp;rsquo; tab, it has an &amp;lsquo;Emulation&amp;rsquo; tab.&lt;/p&gt;</description></item><item><title>This method is likely to yield significantly better performance</title><link>https://maarten.mulders.it/2013/04/this-method-is-likely-to-yield-significantly-better-performance/</link><pubDate>Sat, 06 Apr 2013 14:57:21 +0000</pubDate><guid>https://maarten.mulders.it/2013/04/this-method-is-likely-to-yield-significantly-better-performance/</guid><description>&lt;p&gt;This week, I came across an interesting difference between the Java API documentation and its current implementation.
A difference?
Or is it just a matter of thorough reading?&lt;/p&gt;
&lt;p&gt;If you look at the &lt;a href="http://docs.oracle.com/javase/7/docs/api/java/lang/Double.html#valueOf%28double%29"&gt;Javadoc for &lt;code&gt;Double.valueOf()&lt;/code&gt;&lt;/a&gt;, you&amp;rsquo;ll find that it is likely to outperform the use of &lt;code&gt;new Double()&lt;/code&gt;.
Sounds good!
And don&amp;rsquo;t we all ove it when we get a free performance boost?&lt;/p&gt;
&lt;p&gt;However, examining the source code to see what causes this &amp;ldquo;significantly better space and time performance&amp;rdquo;, we find&amp;hellip;.&lt;/p&gt;</description></item><item><title>Checking logfiles with logcheck</title><link>https://maarten.mulders.it/2013/03/checking-logfiles-with-logcheck/</link><pubDate>Sat, 23 Mar 2013 16:19:17 +0000</pubDate><guid>https://maarten.mulders.it/2013/03/checking-logfiles-with-logcheck/</guid><description>&lt;p&gt;If you own a private server, like me, you&amp;rsquo;ll probably know the feeling you need to check your logfiles every now and then.
It&amp;rsquo;s not a lot of work, it&amp;rsquo;s not difficult, but it needs to be done, and it needs to be done regularly.&lt;/p&gt;
&lt;p&gt;As for me, the solution is simple.
I installed the &lt;a href="http://logcheck.org/"&gt;logcheck&lt;/a&gt; tool.
This nice little tool will send you a daily email with all logging information on your system.
That sounds like an awful lot of spam on a daily basis, but thankfully that is not the case.&lt;/p&gt;</description></item><item><title>IPv6 on Raspbian</title><link>https://maarten.mulders.it/2013/03/ipv6-on-raspbian/</link><pubDate>Mon, 11 Mar 2013 18:24:15 +0000</pubDate><guid>https://maarten.mulders.it/2013/03/ipv6-on-raspbian/</guid><description>&lt;p&gt;A default Raspbian installation does not have IPv6 enabled.
That&amp;rsquo;s quite a pity in 2013, where IPv4 addresses will be running out shortly.&lt;/p&gt;
&lt;p&gt;Have no fear, it&amp;rsquo;s not too hard to enable it.
Just add &lt;code&gt;ipv6&lt;/code&gt; to the file &lt;code&gt;/etc/modules&lt;/code&gt; (it should be on a separate line) and reboot your Pi.
If you don&amp;rsquo;t want to reboot, enable it immediately by issuing &lt;code&gt;sudo insmod /lib/modules/`uname -r`/kernel/net/ipv6/ipv6.ko&lt;/code&gt;. Note that after a reboot, you&amp;rsquo;ll have to re-enable it again, so just change &lt;code&gt;/etc/modules&lt;/code&gt; either way&amp;hellip;&lt;/p&gt;</description></item></channel></rss>