<?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>Thu, 03 Sep 2026 17:42:08 +0200</lastBuildDate><atom:link href="https://maarten.mulders.it/post/index.xml" rel="self" type="application/rss+xml"/><item><title>The Road to Reproducible Builds on the JVM</title><link>https://maarten.mulders.it/2026/09/the-road-to-reproducible-builds-on-the-jvm/</link><pubDate>Fri, 04 Sep 2026 08:45:00 +0200</pubDate><guid>https://maarten.mulders.it/2026/09/the-road-to-reproducible-builds-on-the-jvm/</guid><description>&lt;p&gt;A reproducible build means anyone can recreate your exact binary output from source code—bit-for-bit identical, every time.&#10;Beyond good engineering practice, this capability is increasingly mandatory under certain EU regulations that demand traceable, auditable software lifecycles.&lt;/p&gt;&#10;&lt;p&gt;Using Apache Maven and the Reproducible Central registry, you can achieve and demonstrate build reproducibility in three practical steps.&#10;This post describes how to do that for one of my personal projects.&lt;/p&gt;</description></item><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.&#10;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;&#10;&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.&#10;This time, I had the opportunity to give two talks instead of just one.&#10;Apart from speaking, visiting a conference is a great way to also join other speaker&amp;rsquo;s sessions.&#10;In this blog, I will share some of the most inspiring talks I attended.&#10;Topics include mutation testing, monads, tips for smooth-running applications in production, effectively working with AI and hexagonal architecture.&#10;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.&#10;Easy, you would say, as Jakarta EE 10 includes Jakarta Security 3.0, which has support for OpenID Connect authentication.&#10;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.&#10;I recently had this situation with a plugin that generated source code from specifications.&#10;This plugin alone wrote over 22000 lines of output just to inform the user that it did what it had to do.&#10;No errors or such, only confirming that it did its job.&#10;Such superfluous output makes it hard for developers to focus on actual problems in their build.&#10;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.&#10;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.&#10;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;&#10;&lt;p&gt;There, I&amp;rsquo;ve said it.&#10;And you know it&amp;rsquo;s true, don&amp;rsquo;t you?&#10;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;&#10;&lt;p&gt;But it doesn&amp;rsquo;t have to be this way!&#10;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?&#10;If we know the bottlenecks, we can address them.&#10;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).&#10;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).&#10;And that would have been only the basics.&#10;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.&#10;But we usually take the pain, because the alternative is just&amp;hellip; &amp;ldquo;boring&amp;rdquo;.&lt;/p&gt;&#10;&lt;p&gt;But it is time to reflect on this approach.&#10;It drags in a lot of complexity, but what does it give us?&#10;More complexity!&#10;At the end of the day, everyone will probably agree that simplicity is important.&#10;And what we want to achieve is a simple thing: displaying some information to a user.&#10;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.&#10;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.&#10;In this post, I will share my first impressions.&#10;It includes some interesting talks that I joined.&#10;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!&#10;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.&#10;This year marks my fourth attendance as a speaker, and I&amp;rsquo;ll be doing two talks myself.&lt;/p&gt;&#10;&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.&#10;I have attended JavaZone in the past (2018) so I knew what to expect - and the bar was high!&#10;Because of that, I was looking forward a lot to join JavaZone again.&#10;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.&#10;Recently, I wanted to do some hacking around on Jakarta EE and MicroProfile.&#10;I chose to work with the OpenLiberty runtime, as I previously had good experiences with it.&#10;My pet project also needs a database, so for starters, I chose HyperSQL Database (HSQL DB).&#10;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.&#10;The setup for that was pretty complicated, with some shell scripting that extracted the JSON payload for the report from a JavaScript file.&#10;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.&#10;We all know it&amp;rsquo;s coming someday, but when?&#10;What will it look like?&#10;And how will it change the way we write concurrent code?&#10;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!&#10;In those first installments, we looked at the basics of Dapr, from a very conceptual point of view.&#10;We also looked at the bare minimum HTTP API that Dapr exposes to the applications that use it.&#10;But writing enterprise applications that way would be slow, and it would inevitably lead to mistakes.&#10;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.&#10;That was a mostly conceptual introduction, showing you how Dapr works and what it can do for you.&#10;But how do you integrate it into an existing application?&#10;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.&#10;All those application components, or microservices, need to communicate with each other.&#10;How will we do that: using messaging, or would direct HTTP calls be a better choice?&#10;Often, we must make such decisions early in a project.&#10;Since it&amp;rsquo;s hard to change it later, we call it an &amp;ldquo;architectural decision&amp;rdquo;.&#10;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.&#10;But how could I find out? There are no early access builds of Java 17 yet with the latest changes for this JEP.&#10;Maybe&amp;hellip; I should set out and try to build it myself?&#10;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.&#10;But not all of the projects we work on keep up with that pace.&#10;I have projects on Java 8, 11 and 15 - and sometimes I want to play with early access builds of newer versions as well.&#10;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.&#10;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.&#10;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;.&#10;The first question after this announcement is of course: what can we expect Maven 4 to bring us?&#10;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.&#10;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.&#10;This is especially true if your server is hosted in a public cloud, since these typically reserve ranges or blocks of IP addresses.&#10;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.&#10;For me, this means I put more and more stuff into version control.&#10;Whether it is infrastructure descriptions, documentation, software or this blog, I always store it in a Git repository.&#10;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.&#10;Badges can give a quick overview of the code quality, test coverage or build health of an open-source product.&#10;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;.&#10;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.&#10;It doesn&amp;rsquo;t matter whether it is on-premise or in the cloud.&#10;Many organisations have a long process of filling forms, obtaining budget clearance, asking for priority and verifying everything is set up correctly.&#10;The cloud promises us to make things better, and at least it got a lot faster.&#10;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.&#10;For me, it&amp;rsquo;s the second time I&amp;rsquo;m here, as I spoke here in 2018, too.&#10;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.&#10;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.&#10;For me, it&amp;rsquo;s the second time I&amp;rsquo;m here, as I spoke here in 2018, too.&#10;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.&#10;Depending on the type of software, this may be something you rarely do.&#10;Thus, it often involves manual steps.&#10;This is not necessary!&#10;Maven has had its &amp;ldquo;Release Plugin&amp;rdquo; since approximately April 2007; yes, that&amp;rsquo;s over 12 years!&#10;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.&#10;I&amp;rsquo;m planning to write some notes on interesting sessions or other content.&#10;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.&#10;But today was a day of catching up with old friends and attending a talk or two.&lt;/p&gt;&#10;&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;.&#10;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.&#10;This is indeed exciting: your program starts faster, and consumes less memory.&#10;Other popular topics include building Java applications that run code in other languages.&#10;You can run JavaScript, Python, Ruby or R code in the JVM.&#10;But there&amp;rsquo;s more: in fact you can run &lt;em&gt;any&lt;/em&gt; language inside the JVM!&#10;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!&#10;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.&#10;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.&#10;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.&#10;It lets you declare the &lt;em&gt;artifacts&lt;/em&gt; you need to build your application.&#10;Those artifacts also depend on other artifacts.&#10;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).&#10;It&amp;rsquo;s the second largest conference in the Devoxx family with around 2700 people attending.&#10;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;&#10;&#10;&#10;&#10;&#10;&#10;&#10; &#10; &#10; &#10; &#10;&#10; &#10; &#10; &lt;div class="flex justify-center items-center"&gt;&#10; &lt;figure class="rounded-lg "&gt;&#10; &#10; &lt;picture class="rounded-lg "&gt;&#10; &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;&#10; &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;&#10; &lt;/picture&gt;&#10; &#10; &lt;figcaption class="text-center"&gt;Entrance of the ICE&lt;/figcaption&gt;&#10; &lt;/figure&gt;&#10; &lt;/div&gt;&#10; &#10; &#10;&#10;&#10;&#10;&lt;p&gt;The main reason I&amp;rsquo;m here is to give a talk about GraalVM on Wednesday morning.&#10;Apart from that, it&amp;rsquo;s a nice opportunity to network, meet old friends and make new ones.&#10;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.&#10;I wanted to protect access to that website to a specific set of people inside my company.&#10;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 web services, 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;.&#10;The latter is much more efficient, but also harder to troubleshoot if it doesn&amp;rsquo;t work at once.&lt;/p&gt;&#10;&lt;p&gt;Both options have their own typical scenario&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Serialise the file content using Base64 and include the result right into the XML structure.&#10;This is relatively easy to implement and troubleshoot.&#10;It usually works well for small binary files, but as files grow larger, you may run into performance issues.&#10;The Base64-encoded binary file may be so big that the XML parser will blow up.&lt;/li&gt;&#10;&lt;li&gt;Use MTOM to transfer the request and attachments.&#10;In this approach, the SOAP request (XML) and any attachments are sent as a multipart request.&#10;This is a bit harder to implement, and if it doesn&amp;rsquo;t work at once, it is even harder to troubleshoot.&#10;But on the other hand, it allows for much more efficient transportation of the attached files.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h2 id="soap-over-http"&gt;SOAP over HTTP&lt;/h2&gt;&#10;&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.&#10;Imagine we have a file upload web service which accepts files in any format, along with a file name.&#10;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.&#10;During the talk, the audience asked a few questions through the app.&#10;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.&#10;Since it&amp;rsquo;s an interesting question, I&amp;rsquo;ll answer it here.&#10;Unfortunately, understanding BEAST is a bit harder than the talk itself&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;BEAST stands for &lt;em&gt;Browser Exploit Against SSL/TLS&lt;/em&gt;.&#10;In itself, it isn&amp;rsquo;t a vulnerability.&#10;Thai Duong and Juliano Rizzo made a demonstration of a longer-known vulnerability.&#10;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.&#10;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.&#10;It pulled my attention: I had never heard of either projects, and I wondered what they would be about.&#10;Ozark (or Krazo) will be the Reference Implementation of the new Model-View-Controller Specification.&#10;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.&#10;Apparently, this didn&amp;rsquo;t kill the effort.&#10;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.&#10;Maybe you are writing a test dummy, or maybe you got the interface from some kind of architect.&#10;&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;&#10;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;&#10;&lt;p&gt;Recently I was doing that, and I found the following inside the interface definition (WSDL):&lt;/p&gt;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&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;&#10;&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;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;span style="display:flex;"&gt;&lt;span&gt;&#10;&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;&#10;&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;&#10;&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;&#10;&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;&#10;&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;&#10;&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;&#10;&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;&#10;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That was a rather challenging thing!&#10;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.&#10;Although I have a strong background in Java and the Java platform, I started reading it, and soon I felt like trying it out.&#10;But building software without having automated builds and tests is not the real thing, so that was the first thing I wanted to do.&#10;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.&#10;Oftentimes, I feel a similar urge to make a digital version of it.&#10;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;&#10;&lt;p&gt;Recently, I found a tool that fits my idea of &amp;ldquo;good tooling&amp;rdquo; rather well.&#10;So, without further ado, let me introduce you to &lt;a href="http://plantuml.com/"&gt;PlantUML&lt;/a&gt;!&#10;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;.&#10;This conference has a special programme committee: its audience.&#10;When the Call for Papers closed, everyone who had a ticket could see the submitted papers.&#10;Only, they could not see &lt;em&gt;who&lt;/em&gt; submitted the paper - which let them focus on the papers themselves.&#10;Out of almost 180 papers, they had to select 13&amp;hellip;&lt;/p&gt;&#10;&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;!&#10;I presented my talk for the &lt;em&gt;early birds&lt;/em&gt;, and there were quite a lot of them!&#10;The room was pretty much packed, and there was a lot of questions and remarks afterwards.&#10;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.&#10;When I finished, two things remained to be investigated:&lt;/p&gt;&#10;&lt;ol&gt;&#10;&lt;li&gt;Code coverage for unit tests.&lt;/li&gt;&#10;&lt;li&gt;A bunch of warnings when running the application in Tomcat.&lt;/li&gt;&#10;&lt;/ol&gt;&#10;&lt;h3 id="code-coverage-for-unit-tests"&gt;Code coverage for unit tests&lt;/h3&gt;&#10;&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.&#10;In fact, I thought I had done that, but somehow I kept on getting the same error every single time.&#10;But when I tried (again) last week, it somehow disappeared.&#10;No error to be seen, all tests green, and a nice coverage report from JaCoCo.&#10;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.&#10;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.&#10;Of course the question came up, why don&amp;rsquo;t you upgrade?&#10;Good question!&#10;Since I hadn&amp;rsquo;t even tried, I decided to see how far I could come&amp;hellip;&lt;/p&gt;&#10;&lt;p&gt;The component I took for my experiment is a pretty simple Spring application.&#10;It doesn&amp;rsquo;t use Spring Boot.&#10;It exposes a few REST endpoints, and calls couple of webservices over SOAP.&#10;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.&#10;It&amp;rsquo;s about time to write some notes on the stuff I learnt there!&lt;/p&gt;&#10;&lt;h4 id="event-storming--ddd-workshop"&gt;Event Storming &amp;amp; DDD workshop&lt;/h4&gt;&#10;&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;.&#10;The workshop consisted of small pieces of theory, alternated with exercises using post-it&amp;rsquo;s and markers.&lt;/p&gt;&#10;&lt;p&gt;A few of the theoretic pieces:&lt;/p&gt;&#10;&lt;ul&gt;&#10;&lt;li&gt;An &lt;strong&gt;event&lt;/strong&gt; is something that has happened in the past.&#10;It is usually phrased in past tense.&#10;It should be understandable for business users.&lt;/li&gt;&#10;&lt;li&gt;A &lt;strong&gt;command&lt;/strong&gt; is an user-initiated action.&#10;It explains the origin and sometimes the reason for the action.&lt;/li&gt;&#10;&lt;li&gt;An &lt;strong&gt;entity&lt;/strong&gt; is an individual thing.&#10;It has a unique identity.&#10;Often, entities are mutable.&lt;/li&gt;&#10;&lt;li&gt;A &lt;strong&gt;value object&lt;/strong&gt; is an non-unique value.&#10;It is often immutable.&#10;Its equality is based on it&amp;rsquo;s attributes.&#10;It should be able to validate itself.&#10;They can be combined.&lt;/li&gt;&#10;&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;.&#10;They are structured in a hierarchy.&#10;Its root is always an &lt;em&gt;entity&lt;/em&gt;.&#10;Aggregates contain business rules.&#10;Note that a bigger aggregate is not always better!&#10;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;&#10;&lt;li&gt;The &lt;strong&gt;bounded context&lt;/strong&gt; describes the context from which you look at it.&#10;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.&#10;To stress the fact that it has boundaries, it is called a &lt;em&gt;bounded&lt;/em&gt; context.&#10;Bounded contexts support the idea of having &amp;ldquo;one team, one (business) language&amp;rdquo;.&#10;The bigger the bounded context is, the bigger the language, whether artificial or natural.&#10;Finally, multiple domains can have different words for the same concept.&#10;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;&#10;&lt;/ul&gt;&#10;&lt;h4 id="kotlin-for-java-programmers"&gt;Kotlin for Java programmers&lt;/h4&gt;&#10;&lt;p&gt;This year had a lot of talks about Kotlin scheduled.&#10;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;.&#10;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!&#10;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;.&#10;There&amp;rsquo;s a lot of commercial offerings in this field.&#10;Many of them promise you (to some extend) ultimate flexibility and endless possibilities.&#10;My preference is for &amp;ldquo;lean and mean&amp;rdquo; approaches where I can pick the building blocks that I need.&#10;In the long run, that offers more flexibility.&#10;After all, you could replace building blocks.&#10;Having small building blocks makes it less tempting to put any kind of business logic in such a gateway.&#10;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.&#10;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.&#10;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.&#10;I found two topics particularly interesting and decided to attend multiple sessions on each of them.&lt;/p&gt;&#10;&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;&#10;&lt;p&gt;Both sessions where more or less covering the same ground, although from a different perspective.&#10;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.&#10;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.&#10;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.&#10;Often, they prefer just Word or PDF.&#10;So I looked for a way to convert a Markdown file to a PDF file.&lt;/p&gt;&#10;&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.&#10;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.&#10;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.&#10;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;&#10;&lt;h3 id="whats-it-about"&gt;What&amp;rsquo;s it about?&lt;/h3&gt;&#10;&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;&#10;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.&#10;When you first notice the rule, you might wonder &amp;ldquo;why is that an issue?&amp;rdquo;.&#10;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.&#10;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.&#10;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.&#10;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.&#10;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.&#10;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!&#10;In one week, I&amp;rsquo;ve visited two conferences in two different countries to give talks on two different subjects.&#10;But the most inspiring part came from attending other sessions.&#10;I&amp;rsquo;ll highlight one session from both conferences.&lt;/p&gt;&#10;&lt;h3 id="jbcnconf-2017"&gt;JBCNConf 2017&lt;/h3&gt;&#10;&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;.&#10;This was a session full of energy, as Burr is really capable of making your enthusiastic of whatever he is talking on.&#10;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.&#10;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.&#10;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.&#10;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;.&#10;Recently, I was asked by another team in my company to assist them in setting it up for their team.&#10;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.&#10;In that case, you might want to verify that in a unit test, so you can rest assured that this requirement is actually met.&#10;How to do that?&lt;/p&gt;&#10;&lt;h3 id="mock-it-away"&gt;Mock it away&lt;/h3&gt;&#10;&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.&#10;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;.&#10;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.&#10;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.&#10;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;&#10;&lt;p&gt;As a first observation, he stated that no-one really likes microservices.&#10;They are kind of a necessary evil - because &amp;ldquo;doing&amp;rdquo; microservices comes at a cost.&#10;In fact, microservices are just a specialisation of an older concept called distributed systems.&#10;But what we often build are microliths - an application that might be called a microservice except for the fact that it lives alone.&#10;No failover, no resilience, nothing.&#10;But just like actors, microservices should come in systems.&#10;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;.&#10;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;.&#10;Both of them scheduled today, so a little less time for attending other sessions and blogging about them.&#10;I did attend some other sessions after lunch time, on which I&amp;rsquo;ll report below.&lt;/p&gt;&#10;&lt;h3 id="introduction-to-machine-learning"&gt;Introduction to Machine Learning&lt;/h3&gt;&#10;&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.&#10;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.&#10;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.&#10;That went pretty quick and without much trouble.&#10;But when I issued &lt;code&gt;java -version&lt;/code&gt; on my terminal, I was greeted with&lt;/p&gt;&#10;&lt;pre tabindex="0"&gt;&lt;code&gt;Java(TM) SE Runtime Environment (build 9-ea+155)&#10;Java HotSpot(TM) 64-Bit Server VM (build 9-ea+155, mixed mode)&#10;&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.&#10;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;.&#10;Yesterday night was a great opportunity to get to know a few other speakers during dinner.&#10;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;&#10;&lt;p&gt;But today, the serious stuff started.&#10;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.&#10;That question reminded me of the blog I used to have&amp;hellip; long time ago.&lt;/p&gt;&#10;&lt;p&gt;I stopped blogging due to changes in my personal situation, which led to a priority shift.&#10;Being a father to two beautiful daughters sure takes a lot of time!&#10;But I missed the possibility to share some notes, thoughts, ideas and the like.&#10;So I decided to resurrect my blog, although in fact it&amp;rsquo;s more of a notebook.&#10;In the coming period, I&amp;rsquo;ll be adding some historical notes which I earlier stored privately.&#10;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.&#10;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;.&#10;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;.&#10;This tool is primarily intended code bases in Java, .NET, Ruby, Node.js, and Python.&#10;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.&#10;It is easy, relatively light-weight, and it seemed to suit our needs quite well.&#10;The project had a lot of static content - HTML, JavaScript, CSS and image files.&#10;Of course, we wanted to achieve a high performance with as many concurrent requests being served as possible.&#10;This is what we did.&lt;/p&gt;&#10;&lt;h3 id="setup"&gt;Setup&lt;/h3&gt;&#10;&lt;p&gt;First of all, it is worth to mention the setup.&#10;Our staging environment had just one virtual machine with nginx running.&#10;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.&#10;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.&#10;But the goal of this experiment was mainly to experiment with the many options nginx provides for tweaking.&#10;The virtual was located in the same region as where the project will be deployed.&#10;Also, we used a similarly sized machine for putting load on our web server.&#10;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).&#10;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.&#10;Of course, comments and the like are not considered to be code, so how to determine this metric?&#10;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.&#10;Various open source frameworks releasing versions, sometimes even multiple versions at the same time.&#10;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;&#10;But how to deal with it?&lt;/p&gt;&#10;&lt;p&gt;Basically, you have two options.&#10;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;.&#10;See &lt;a href="#gradle"&gt;the end of this post&lt;/a&gt; if you prefer Gradle over Maven.&lt;/p&gt;&#10;&lt;h3 id="automatic-upgrades"&gt;Automatic upgrades&lt;/h3&gt;&#10;&lt;p&gt;Maybe the simplest way is automatic upgrading.&#10;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;.&#10;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.&#10;Chances also are you&amp;rsquo;re building it with Maven.&#10;Now how do you combine the two?&#10;Of course, you could plumb together some scripts for the platform of your choice, but there&amp;rsquo;s a few disadvantages to that.&#10;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.&#10;Secondly, it&amp;rsquo;s not very elegant, since it does not easily facilitate re-use.&#10;And in these days of microservices, we don&amp;rsquo;t want to be copying the same scripts over and over again.&#10;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;&#10;&lt;blockquote&gt;&#10;&lt;p&gt;Error while waiting for Protractor to sync with the page: {}.&lt;/p&gt;&#10;&lt;/blockquote&gt;&#10;&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;&#10;&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;&#10;&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?&#10;You don&amp;rsquo;t always have your mobile device at hand, or might not even own one.&#10;Yet, you want to see how your new gem looks on such devices. Worry no more!&lt;/p&gt;&#10;&lt;p&gt;Google Chrome to the rescue.&#10;We all know the &amp;lsquo;Developer Tools&amp;rsquo;, accessible using &lt;kbd&gt;F12&lt;/kbd&gt;.&#10;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.&#10;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.&#10;A difference?&#10;Or is it just a matter of thorough reading?&lt;/p&gt;&#10;&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;.&#10;Sounds good!&#10;And don&amp;rsquo;t we all ove it when we get a free performance boost?&lt;/p&gt;&#10;&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.&#10;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;&#10;&lt;p&gt;As for me, the solution is simple.&#10;I installed the &lt;a href="http://logcheck.org/"&gt;logcheck&lt;/a&gt; tool.&#10;This nice little tool will send you a daily email with all logging information on your system.&#10;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.&#10;That&amp;rsquo;s quite a pity in 2013, where IPv4 addresses will be running out shortly.&lt;/p&gt;&#10;&lt;p&gt;Have no fear, it&amp;rsquo;s not too hard to enable it.&#10;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.&#10;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>