While there are many examples of Jackson serialization to JSON, there are comparatively few resources of Jackson serialization to CSV. Following is an example of working with a TSV-formatted dataset from the ground up, starting with creating the model object, building code samples for parsing CSV to Java objects using Jackson, writing Java objects to CSV using Jackson, and ending with code to a full round-trip test for serialization.
Continue reading “Jackson CSV Serialization and Deserialization from the Ground Up”Regex for ISO 3166-1 Country Codes
Need a regular expression to recognize the 249 officially-assigned codes from the ISO 3166-1 alpha-2 and alpha-3 standards? Here they are!
ISO 3166-1 is a living standard and changes over time. This page is current as of November 11, 2024.
Continue reading “Regex for ISO 3166-1 Country Codes”AWS API Gateway Gotchas & Lessons Learned
As convenient and powerful as AWS API Gateway is, it’s not without its quirks. Here are a few lessons I’ve learned the hard way that can help you avoid some common pitfalls when working with AWS API Gateway.
Continue reading “AWS API Gateway Gotchas & Lessons Learned”Generating Java record classes with Jackson Annotations to map JSON using ChatGPT
There’s a lot of discussion about how to use ChatGPT to generate tests for code. Another interesting use case I’ve seen fairly little coverage of is generating DTOs from JSON. Here is an example with the prompt I’ve put together applied to JSON from the manifest of a Distributed Map Run.
Continue reading “Generating Java record classes with Jackson Annotations to map JSON using ChatGPT”AWS SageMaker Object Detection Training Gotchas
As part of updates to arachn.io, I’ve started tinkering with object detection machine learning models. During my experiments on AWS SageMaker, I found that AutoPilot does not support object detection models, so I had train using notebooks. As a result, I hit some “gotchas” fine-tuning TensorFlow Object Detection models. While this notebook works a treat on its own training data (at least when run through SageMaker studio), this discussion will focus on things I learned while trying to run it on my own data on August 31, 2024.
Continue reading “AWS SageMaker Object Detection Training Gotchas”Efficient Image Metadata Extraction with Java
Java has a rich set of tools for processing images built in to the standard library. However, it’s not always clear how to use that library to perform even simple tasks. There are already lots of great guides out there for working with images once they’re loaded… but what can Java do without ever loading the image into memory at all?
When working with images from untrusted sources — for example, images discovered during a web crawl — it’s best to treat data defensively. This article will show how to perform some useful tasks on images without ever loading their pixel data into memory.
Continue reading “Efficient Image Metadata Extraction with Java”Yes, Java ThreadLocalRandom is Safe to Use with Virtual Threads
Because Java 21 virtual threads are very cheap — per JEP Cafe, they are about 1,000 times faster to launch than a platform thread, and use about 1,000 times less memory than a platform thread — they should never be pooled. As a result, ThreadLocal
variables are unlikely to be useful in applications that use virtual threads for concurrent processing. If each task lives in its own dedicated thread, then each call to ThreadLocal
ends up returning a new value, and it ends up being a factory instead of a pool! So using ThreadLocal
in virtual threads is an anti-pattern. Developers should use another technique for pooling objects, such as structured concurrency, instead.
But what about ThreadLocalRandom
? Is this dedicated class for providing sources of randomness to threads safe to use with virtual threads?
The short answer is: Yes, ThreadLocalRandom
is safe to use with virtual threads. ThreadLocalRandom
is tightly integrated with the Thread
class to ensure that it remains efficient, even for virtual threads. For more information, keep reading.
Example JWT with Private JWK
When writing code or testing, it’s useful to have valid examples of whatever you’re working with for sanity checks. I need some example JWTs with accompanying private JWK and couldn’t find any, so I minted a few. I’m posting them here in the hopes they’re useful to others, too.
These keys were created using a fresh RS256 key. No other keys have been created using this key. Because the private part of this key pair is public — it’s literally right below, in plain text — remember that these keys should only ever be used for sanity checking and testing. In particular, never use these keys for production use cases!
Continue reading “Example JWT with Private JWK”Reverse Engineering with ChatGPT: An Example
I’m porting Jonas Wagner‘s excellent smartcrop.js, which analyzes an image to recommend a good crop, from JavaScript to Java.
When porting code, I always try to understand it along the way so that if (when) there are bugs, I’ll have an idea of where the bug might be. I used ChatGPT 4 to untangle a particularly terse bit of code, and was — frankly — shocked at how well it did.
Continue reading “Reverse Engineering with ChatGPT: An Example”In Java, Strings Much Faster than Regexes, Even for Same Operations
Based on the results of this JMH benchmark, string operations are faster than regex operations in Java, even if the two operations are logically the same, like String.equals
and Pattern.matcher
/Matcher.matches
.
In some cases, much faster.
Continue reading “In Java, Strings Much Faster than Regexes, Even for Same Operations”