RSSAmplifier

Blog

A Java Developer's Weblog

blog.ehrnhoefer.comRSS feed ↗20 posts

Latest posts

What's New in Java 12-25?

Previous posts: Java 8-12 Java 13-15 Java 16-17 Java 18-21 Java 22 (2024) Java 23 (2024) Java 24 (2025) Java 25 (2025 - LTS) Key features for developers (excluding previews and incubators): Flexible Constructor Bodies aka “Statements before super()” Scoped Values are a lightweight, immutable, thread-safe alternative to ThreadLocal Stream Gatherers Compact Source Files and Instance Main Methods…

SPF/DKIM/DMARC Configuration for mailbox.org

When sending emails with my mailbox.org account, I occasionally receive errors like the following: The mail system <xxxxxx@gmail.com>: host gmail-smtp-in.l.google.com[142.250.147.27] said: 550-5.7.26 This mail has been blocked because the sender is unauthenticated. 550-5.7.26 Gmail requires all senders to authenticate with either SPF or DKIM. 550-5.7.26 550-5.7.26 Authentication results:…

What's New in Java 18-21?

Previous posts: Java 8-12 Java 13-15 Java 16-17 Java 18 (2022) Java 19 (2022) Java 20 (2023) Java 21 (2023 - LTS) Structured concurrency Virtual threads Scoped values as replacement of ThreadLocals SequencedCollection interface (“ getFirst() ”, “ getLast() ” etc) String templates See also https://www.happycoders.eu/java/java-21-features/ What's New in Java 18-21? was originally published by Martin…

Devoxx 2022 Videos List

Devoxx 2022 Playlist If you have only time for a single clip, see The Art of Code by Dylan Beattie ;-) Most interesting Devoxx videos Maven 4 improvements by Maarten Mulders Maven Build Speedup by Peter Palaga Aging developers by Tobias Modig Java evolution by Venkat Subramaniam (nothing really new, but hilariously entertaining) Videos I have watched that are not of great interest to me…

What's New in Java 16/17?

Previous posts: Java 8-12 Java 13-15 Java 16 (2021) The “ instanceof pattern matching ” feature (from Java 14) is now final Records (also a Java 14 preview) are now final a new incubating Vector API Exhaustive feature list . See also Java 16: New Features Java 17 (2021 - LTS) Java 17 itself brings only changes related to specialized use cases (like floating-point semantics or pseudo-random…

Picasa, XnView, and Jpeg Metadata

Picasa has been my favorite image organizer and viewer for more than a decade. It is a small and lightweight program - and it is really fast, especially when managing huge image collections over a network share. Now, more than 5 years after Picasa has been abandoned by Google, I have finally found a replacements: XnView . While all the commercial programs that I evaluated had thousand of features…

What's New in Java 13/14/15?

A year has passed since the last post Java 8-12 , three new Java versions have been released, but no big news from a developer’s perspective… Java 13 (2019) Switch expressions: yield statement (preview) Text blocks (multi-line strings like in Groovy - preview) Exhaustive feature list . See also Java 13: New Features Java 14 (2020) Pattern matching of instanceof Object obj = /* ...*/ if ( obj…

Moving from Windows to Ubuntu

Some months ago, I installed Ubuntu 18.04 (the most recent LTS version) in addition to Windows 10 on my notebook and started a dual-booting life (Linux for work, Windows for private stuff). Now this soon became annoying, so I tried to get rid of Windows alltogether in the last few days. This is a kind of checklist for what changes I applied to a standard Ubuntu system so that it serves my needs as…

What's New in Java 8/9/10/11/12?

Since Java switch from a (kind of) 3-years feature release cycle to 6 months, it is hard for me to track the most important changes. This cheat-sheet shall help me to quickly pick the right Java version. For an extensive list see e.g. Wikipedia . This lists just the most important changes (from my point of view): Java 12 (2019) Switch expressions (preview) String result = switch ( new Random ().…

Using Grape with a custom repository server

Grape is a great thing if you want to write a Groovy script that depends on a third party library: Just add @Grab('groupid:artifactid:version') on top of your script, and the specified Maven artifact will be downloaded and is available at runtime. However, if you are forced to use a different repository server (like a private Artifactory or Nexus service), the documentation is not very exhaustive.…

ELK: Delete old logging data using the Index Lifecycle Management

Since Version 6.6, Elasticsearch includes a feature called Index Lifecycle Management to implement detailed index retention policies. In this post, I show how to use this feature for a very basic (and common) usecase: How to delete old logging data from an ELK stack In the following, I assume that the Elasticsearch cluster contains data created by Logstash and Filebeat , and that the Elasticsearch…

Moving From Gmail & Co

Until recently, I have been using Google services for most of my daily business: For email communication , contacts and addresses , appointments and reminders , notes , navigation , and of course for searching the internet . Choosing Google was nothing but a pragmatic decision: their applications are simple, lean, easy-to-use, rock-solid - and they are free. But over the years, I became more and…

Dodging Security Issues of the Jenkins Groovy Plugin

The recent Jenkins security advisory discloses a (quite obvious, in retrospect) security issue regarding the “Execute system Groovy script” build step ( SECURITY-292 ). The recommended solution is to update the Groovy plugin to version 2.0+, which integrates the script security plugin . Sounds easy, but can be very hard (almost impossible) in practice… Approval for Inline Scripts After updating…

Request Tracing with JBoss 7

To log HTTP requests and responses with JBoss 7, activate the RequestDumperValve and enable the org.apache.catalina.core.ContainerBase logging category. Here are the relevant excerpts from standalone.xml : [...] <subsystem xmlns= "urn:jboss:domain:logging:1.3" > [...] <logger category= "org.apache.catalina.core.ContainerBase" > <level name= "INFO" /> </logger> [...] </subsystem> [...] <subsystem…

Cleaning up Jenkins Workspaces

When running a Jenkins server with many jobs and many agents, you can quickly run out of disk space because of orphan workspaces: Jobs may roam on different agents, leaving a workspace on each Each concurrent job execution needs its own workspace When renaming or deleting a job, the workspaces may still survive on the disk (with the original job name) With the Workspace Cleanup Plugin , the…

Accessing Stored Procedures with JPA 2.0 and Hibernate

JPA 2.0 has no explicit support for stored procedures (JPA 2.1 has). One workaround is to use native queries (like {call my_package.my_stored_proc(?, ?)} ), but that doesn’t work when the procedure has out-parameters. Here is a sample implementation that uses Hibernate’s Work interface: import java.sql.CallableStatement ; import java.sql.Connection ; import java.sql.SQLException ; import…

My first Docker steps

The Jenkins 2.0 alpha version is a good opportunity for me to finally spend some time with Docker (some two years late, shame on me). So, this is a short documentation of my steps to a dockerized Jenkins 2.0 instance on my Windows 10 box: Lesson #1: Run Jenkins in a Docker container (without prior Docker knowledge) Install Docker as described at https://docs.docker.com/windows/ (I’m using Docker…

Gradle: Importing an Ant Build

Some quick code snippets for using an Ant build script from within a Gradle build : Plain and simple Make all Ant targets available as Gradle tasks: ant . importBuild ( "build.xml" ) Conflicting target names If the Ant script contains a target that conflicts with a Gradle task, a simple import will fail. With an optional configuration closure, it is possible to rename the Ant target on import: ant…

Confess 2015 - Day 2

My session notes from second day of the Confess 2015 conference… Getting to Know the Emerging Enterprise Mobile Platform by Michael Keith of Oracle …about Mobile Backend as a Service (MBaaS) Microservices and Conversion Hunting - How to build software architectures for changeableness by Bernd Zuther of Codecentric A case study on how an e-commerce company switched from a monolithic application to…

Confess 2015 - Day 1

My session notes from first day of the Confess 2015 conference… Keynote: One VM to Rule Them All by Thomas Wuerthinger of Oracle Thomas talks about an ongoing research project at Oracle: It aims that dynamic languages at the VM should be as fast as static typed languages (in orders of magnitude). Links: Graal, Truffle Slideshare Introducing Spring Cloud by Agim Emruli of Mimacom Spring Cloud is a…