Blog Postings
- 2023-12-12 - Monorepos and Polyrepos
- 2023-12-01 - HTTP APIs, REST APIs, and Others
- 2023-09-29 - Biden on Democracy
- 2023-09-03 - Maintaining Technical Depth
- 2023-08-30 - The Uselessness of Consumer VPNs
- 2023-06-20 - Some Aspects of Implementing Microservices..
- 2023-06-19 - DDD, Architecture patterns, and More..
- 2023-05-23 - Should Unit Tests Verify Requirements Only?
- 2023-03-22 - sdkman: the Software Development Kit Manager
- 2023-03-21 - Cluster Locks and Outbox Patterns
- 2023-03-18 - Book Review: Fundamentals of Software Architecture
- 2023-03-16 - Various New Articles on Software Architecture
- 2023-03-08 - Artificial Intelligence According to John Oliver
- 2023-02-16 - jdbc-audit-proxy
- 2023-02-15 - Some Thoughts on Software Architecture
- 2021-03-31 - Disabling the Tracker Service in the GNOME Desktop
- 2021-03-30 - In Defence of Java Checked Exceptions
- 2021-02-13 - A JDBC Query Monitor
- 2020-12-29 - Checking Git Merge Status
- 2020-12-28 - Sybase ASE Stored Procedure sp_jdbc_getprocedurecolumns and Performance
- 2020-12-27 - Learning Prometheus
- 2020-10-14 - For fun: browser as scratchpad
- 2020-06-20 - Maven Multi-Module Builds with Centralized Version Management
- 2020-06-14 - Book Review: Accelerate (Capabilities, Culture and Metrics)
- 2020-05-10 - OAuth2 and OIDC
- 2019-12-08 - Learning Kotlin
- 2019-11-08 - A bunch of stuff - Docker Repos, VPNs, Feature Toggles and Thunderbird
- 2019-10-31 - Creating a Demo Database with Postgresql and Docker
- 2019-10-30 - Spring Transactions and Exceptions
- 2019-10-29 - Email Validation - SPF, DKIM and DMARC
- 2019-09-18 - Online Banking and Mobile Security
- 2019-03-18 - Talend Software Suite
- 2019-01-06 - Hyperconvergence
- 2019-01-05 - OSNews Various
- 2018-12-29 - Learning Python
- 2018-12-10 - Thoughts on the Equifax Data Breach
- 2018-12-09 - Data Warehousing
- 2018-11-24 - The Bitwarden Password Manager
- 2018-10-03 - Yubikey, FIDO2 and Backups
- 2018-09-09 - More databases - MemSQL and RocksDB
- 2018-08-24 - Yubikey Concepts, Configuration and Use
- 2018-07-21 - The Snowflake Data Warehouse
- 2018-07-19 - Storage Space Efficiency in Avro and HBase
- 2018-07-18 - Threat Modelling with STRIDE
- 2018-07-08 - A Lambda Architecure with Spark Streaming from Walmart Labs
- 2018-05-06 - The Graal Virtual Machine
- 2018-04-22 - The New Oracle Java Release Cycle
- 2018-04-21 - Google Cloud Functions, BigQuery, and Related Matters
- 2018-04-14 - Apache Beam and Google Dataflow Overview
- 2018-04-12 - Apache Beam and CSV Headers
- 2018-04-11 - Google Cloud Platform and AppEngine
- 2018-01-05 - Accessing HDFS from Spark in Zeppelin
- 2018-01-02 - More Spring Quirks
- 2017-12-07 - Jetty Amusing Stacktrace
- 2017-12-06 - Remapping DNS Lookups in a JRE
- 2017-12-06 - Spring Forward
- 2017-12-05 - Cloud Basics
- 2017-11-26 - LEDE on a TPLink-WDR4300 Router
- 2017-09-23 - Typesafe Config
- 2017-09-20 - Accessing Hive via JDBC
- 2017-09-03 - Hive container is running beyond physical memory limits
- 2017-08-27 - Spark Overview
- 2017-08-19 - Scala Overview
- 2017-08-09 - Kafka Connect JDBC Source Where Clauses
- 2017-08-05 - A Git Repo Mirroring Multiple Remotes
- 2017-07-01 - Java 9's Jigsaw Module Framework (JPMS)
- 2017-05-24 - Java's Fork/Join Framework
- 2017-05-18 - Kafka Manager
- 2017-05-16 - RabbitMQ Threading Model
- 2017-05-07 - Vagrant, Kafka, Kerberos
- 2017-04-23 - Apache NiFi
- 2017-04-01 - Threadsafe Variable Access in Java
- 2017-03-27 - Kafka Connect
- 2017-03-19 - The Java8 Optional Class
- 2017-03-18 - The Lambda and Kappa Design Patterns for Persistent State
- 2017-03-12 - A Simple Wrapper for Starting Processes from Java
- 2017-03-11 - Elasticsearch5 TransportClient Mode
- 2017-02-26 - Gradle Internals
- 2017-01-25 - Some JUnit Rules
- 2017-01-24 - Maven Random Tips
- 2017-01-23 - Downloading Jenkins
- 2017-01-19 - Microsoft, Azure and Linux
- 2017-01-18 - Climate Change
- 2017-01-15 - Letsencrypt on Ubuntu
- 2017-01-09 - Configuring Fail2Ban
- 2017-01-05 - Configuring a Personal Email Server
- 2016-11-28 - Maven Version Specifiers
- 2016-10-19 - Intellij Fail with Maven Provided Dependencies
- 2016-10-18 - SSL Failures
- 2016-10-17 - Elasticsearch Overview
- 2016-10-08 - Java Path Streams Trap
- 2016-06-26 - Apache HBase Overview
- 2016-06-14 - Apache Hive v2.0 Released
- 2016-06-12 - Dropwizard and Hystrix
- 2016-06-06 - The Kafka Message Broker
- 2016-05-16 - OrangeFS
- 2016-05-07 - Apache Tez - an Overview
- 2016-04-17 - NoSQL - an Overview
- 2016-01-21 - SQL Nulls and Tristate Logic - Fooled Again
- 2015-12-29 - Object Layout
- 2015-12-28 - Devops
- 2015-12-27 - Dell's Self-inflicted Windows Security Hole
- 2015-12-19 - Eclipse RCP and Java UIs in General
- 2015-11-13 - Java 1.7 enhanced reflection API: MethodHandle
- 2015-11-11 - Dual-booting with EFI
- 2015-11-08 - A Java Serialization Vulnerability
- 2015-11-04 - Big Data Overview
- 2015-11-03 - Processes and TTYs
- 2015-10-25 - IT Failures
- 2015-10-25 - Languages and Orchestration
- 2015-10-01 - Systemd-init Overview
- 2015-09-10 - Trying Beyond Linux From Scratch
- 2015-09-04 - Linux Wireless Stack
- 2015-08-31 - Udev Overview
- 2015-08-30 - Trying Linux From Scratch
- 2015-08-25 - Unified Usr
- 2015-08-10 - Virtualization and Containers with Linux
- 2015-08-06 - The Linux Sound Stack
- 2015-07-22 - The Linux Graphics Stack
- 2015-06-29 - ACPI
- 2015-06-26 - Linux on a Lenovo T550 Updated
- 2015-06-22 - D-Bus and OSGi
- 2015-06-19 - OSGi Service Selection
- 2015-06-18 - Anaemic Domain Models
- 2015-06-09 - Some osgi-related news
- 2015-05-19 - Zookeeper Overview
- 2015-05-15 - High-performance remote OSGi service calls
- 2015-05-15 - Gnome-terminal hang in Ubuntu due to invalid Locale
- 2015-05-13 - Linux on a Lenovo T550
- 2015-03-16 - Learning Haskell
- 2015-01-15 - systemd is not bloated
- 2014-11-12 - Finalize on Fail
- 2014-11-07 - JDBC and setAutoCommit Performance
- 2014-11-07 - Unagile Sprints
- 2014-11-04 - Java Covariant Return Types produce Duplicate Methods
- 2014-10-05 - Wayland Versus X
- 2014-03-20 - Java Generic Parameter Locator
- 2014-03-16 - Precedence-Aware Evaluation
- 2014-03-07 - Java Serialization and the Eclipse-JDT compiler
- 2013-10-25 - Good Vibrations - Music from Floppy Disk Drives
- 2013-10-24 - Ad-hoc Logging using the Eclipse Debugger
- 2013-10-22 - Java Serialization and the serialVersionUID Property
- 2013-10-21 - TP-Link WDR4300 and OpenWRT
- 2013-07-08 - MyBatis Performance with OSGi
- 2013-03-26 - OSGi Foundations
- 2013-02-26 - Encryption in Theory and Practice
- 2013-02-25 - What is EMF?
- 2013-02-21 - New Advice - a wishlist for Java
- 2013-02-18 - JAAS Foundations
- 2013-02-01 - Git Foundations
- 2013-02-01 - Spring property-placeholder and generated properties
- 2013-01-05 - The TimeUnit Class
- 2012-12-11 - Exporting a Git repo with 'git daemon'
- 2012-11-15 - Praise for PowerMock
- 2012-11-13 - Rounding Up Exceptions
- 2012-10-13 - Google Islands
- 2012-10-11 - JUnit and Classloaders
- 2012-09-30 - Fun with graphics drivers
- 2012-09-29 - Bisecting a linux kernel
- 2012-09-29 - Guice Concepts
- 2012-09-27 - The Grub bootloader
- 2012-09-27 - Restart
Articles
- 2024-05-02 - Korean Extras
- 2024-05-01 - Korean Language Basics
- 2023-12-12 - Monorepos and Polyrepos
- 2023-12-01 - HTTP APIs, REST APIs, and Others - Pros and Cons
- 2023-09-20 - The Danger of Development Metrics
- 2023-06-24 - Distributed Read Models (Part 2: Implementation)
- 2023-06-23 - Distributed Read Models (Part 1: Motivation)
- 2023-06-22 - STOSA Architecture at willhaben
- 2023-06-20 - Right-sizing Microservices
- 2023-06-10 - Monads for Object Oriented Developers
- 2023-06-10 - Spring Security Session Management
- 2023-06-09 - Thoughts on Scrum
- 2023-06-08 - Evolutionary Architecture
- 2023-06-07 - Notes on Domain-Driven Design
- 2023-04-17 - Testing Distributed Systems
- 2023-03-25 - Component Maturity Model Checklist
- 2023-03-21 - Generating Change Events with the Outbox Pattern
- 2023-03-20 - A Simple Implementation of Cluster-lock/Leader-election
- 2023-03-18 - Book Review: Fundamentals of Software Architecture
- 2023-03-17 - Breaking the Monolith - A Successful Refactoring Into Microservices
- 2023-03-16 - Lessons from a Failed Software Project
- 2023-03-14 - Domain Models - Rich vs Anaemic
- 2023-03-13 - Hexagonal Architecture
- 2023-02-15 - Thoughts on the Role of Software Architect
- 2021-05-15 - Tunneling Checked Java Exceptions Through Lambdas
- 2021-03-30 - In Defence of Java Checked Exceptions
- 2021-02-19 - Spring Bean Aliases with Programmatic Configuration
- 2021-02-15 - Spring Qualifiers
- 2021-02-13 - A JDBC Query Monitor
- 2020-12-28 - Sybase ASE Stored Procedure sp_jdbc_getprocedurecolumns and performance
- 2020-12-27 - Learning Prometheus and PromQL
- 2020-06-19 - Maven Multi-module Builds with Centralized Version Management
- 2020-06-14 - Book Review: Accelerate (capabilities, culture and metrics)
- 2020-05-13 - Drawing Diagrams with Dot
- 2020-05-10 - An Architectural Introduction to OAuth2 and OpenId Connect (OIDC)
- 2019-12-08 - Notes on Kotlin for Java Programmers
- 2019-11-08 - Thunderbird and Outlook Integration
- 2019-11-08 - How does a VPN work on Linux?
- 2019-11-05 - Unleash Feature Toggles
- 2019-11-02 - Container Registries, Minikube and Authorization
- 2019-10-31 - Managing Database Schemas with Flyway
- 2019-10-29 - Email Sender Validation - SPF, DKIM, DMARC
- 2019-10-25 - Contributions
- 2019-10-20 - Viewing the Filesystem of a Docker Container
- 2019-10-10 - Mapping Transactional Exceptions in Spring
- 2019-09-18 - Online Banking and Mobile Security
- 2019-04-26 - Solokey Concepts, Configuration and Use
- 2019-03-21 - Postgres Stored Procedures
- 2019-03-18 - Gitblit - a simple Git Repository Manager
- 2019-03-18 - Talend Basic Install on Linux - Wizard
- 2019-03-18 - Talend Basic Install on Linux - Manual
- 2019-03-18 - Talend Basic Install on Linux
- 2019-03-18 - Talend Suite Overview
- 2019-01-04 - What is Hyperconvergence?
- 2018-12-28 - Python - Distributing and Installing Code
- 2018-12-27 - Python - Asynchronous Programming with Coroutines
- 2018-12-26 - Python Notes
- 2018-12-10 - Thoughts on the Equifax Data Breach
- 2018-12-06 - Relational Normal Forms
- 2018-11-28 - Introduction to Data Vault for Data Warehousing
- 2018-11-27 - Introduction to Dimensional Modelling for Data Warehousing
- 2018-11-26 - Introduction to Data Warehousing
- 2018-11-25 - The Bitwarden/VaultWarden Password Manager - Host Your Own Server
- 2018-09-02 - RocksDB key/value store Overview
- 2018-09-02 - MemSQL Database Overview
- 2018-08-29 - Book Review - Information Security Handbook
- 2018-08-29 - Book Review - Applied Cryptography
- 2018-08-28 - Simple TOTP commandline tools on Linux
- 2018-08-28 - A simple commandline password manager on Linux
- 2018-08-25 - Apache Kudu Overview
- 2018-08-24 - Yubikey Concepts, Configuration and Use
- 2018-07-21 - The Snowflake Data Warehouse
- 2018-07-19 - Storage Space Efficiency in Avro and HBase
- 2018-07-18 - Book Reviews - STRIDE vs PASTA
- 2018-07-18 - Threat Modelling with STRIDE
- 2018-07-12 - Reference Monitors
- 2018-07-11 - IT Security Book Reviews
- 2018-06-30 - CRSF and CORS - Cross-Site Request Forgery and Cross-Origin Resource Sharing
- 2018-05-13 - Google Cloud Dataprep Overview
- 2018-05-06 - The Graal Virtual Machine
- 2018-05-06 - Google Databases Overview
- 2018-04-23 - Google Cloud Storage Overview
- 2018-04-21 - Dealing with Mutable Records in a BigQuery Data Warehouse
- 2018-04-19 - Analytic Functions, Partitioning and Windowing in SQL and BigQuery
- 2018-04-18 - Google BigQuery Overview
- 2018-04-17 - Google Cloud Functions Overview
- 2018-04-15 - Beam Code for sending a Pubsub Message after Write
- 2018-04-13 - Apache Beam and Google Dataflow Overview
- 2018-04-12 - Apache Beam - Reading the First Line of a File
- 2018-04-11 - Google AppEngine
- 2018-04-10 - Google Cloud Platform - Identities and Resource Management
- 2018-04-10 - Google Cloud Platform - Overview
- 2018-01-01 - Security-related Links
- 2017-12-06 - Remapping DNS lookups in a JRE
- 2017-12-06 - Fixing Spring CORS behind bad proxies
- 2017-12-05 - Terraform Overview
- 2017-12-04 - What is a Cloud (IaaS and Paas)?
- 2017-12-01 - Cloud-related Links
- 2017-09-24 - Tail-recursive List Reverse in Scala
- 2017-09-20 - Hive, JDBC and Array-typed Columns
- 2017-09-19 - JAAS and Kerberos: Failed to find any Kerberos tgt
- 2017-09-15 - Hive/Tez tasks with OutOfMemoryError
- 2017-09-03 - Hive container is running beyond physical memory limits
- 2017-09-01 - Spark RDD Random Notes
- 2017-08-27 - Spark Overview
- 2017-08-19 - Scala's match operator and unapply methods
- 2017-08-19 - Basic Scala Syntax for Java Programmers
- 2017-08-05 - A Shared Git Repo Mirroring Multiple Remotes
- 2017-05-24 - The Java Fork/Join Framework
- 2017-05-08 - The RabbitMQ Threading Model
- 2017-05-08 - RabbitMQ Exchanges and Queues
- 2017-05-07 - Vagrant, Kafka and Kerberos
- 2017-04-18 - Kafka Serialization and the Schema Registry
- 2017-04-17 - Apache Nifi Architecture
- 2017-03-27 - Kafka Connect
- 2017-03-18 - Lamba and Kappa Architectures
- 2017-03-12 - Executing External Processes from Java
- 2017-03-11 - An Elasticsearch5 Transport Client
- 2017-02-26 - Gradle Build Tool
- 2017-02-01 - Testing Exceptions with JUnit
- 2017-01-30 - Elasticsearch Aliases
- 2017-01-30 - Handling Spam with Postfix, SpamAssassin, Dovecot and Sieve.
- 2017-01-28 - Blocking Network Connections By Country
- 2017-01-27 - A JUnit Rule for Elasticsearch Integration Testing
- 2017-01-25 - Some JUnit Test Rules
- 2017-01-15 - Creating SSL Certificates with Letsencrypt
- 2017-01-12 - Email with Roundcube
- 2017-01-09 - Fail2Ban on Ubuntu - Keeping the Bad Guys Out
- 2017-01-05 - Email Postfix in Practice
- 2017-01-05 - Email Postfix Theory
- 2017-01-05 - Email Theory
- 2017-01-05 - Setting Up a Personal Mailserver
- 2017-01-01 - Off-topic Links
- 2016-11-28 - Version Specifiers in Maven 3.x
- 2016-10-27 - GSSAPI Overview
- 2016-10-23 - Apache Cassandra Overview
- 2016-10-22 - Kerberos Authentication Overview
- 2016-10-17 - Elasticsearch Overview
- 2016-10-10 - WTF - Java XOR
- 2016-10-01 - Big-Data-related Links
- 2016-06-28 - Apache Hive Overview
- 2016-06-20 - Apache HBase Overview
- 2016-06-06 - Apache Kafka 0.10.0 Overview
- 2016-05-05 - Apache Tez Overview
- 2016-04-16 - NoSQL Overview
- 2016-01-28 - Apache HDFS Overview
- 2016-01-28 - Apache Yarn Overview
- 2016-01-28 - Apache Hadoop Overview
- 2016-01-28 - Apache Hadoop MapReduce
- 2016-01-12 - Storage Area Networks and Associated Filesystems
- 2015-12-29 - In-memory Representation of Objects
- 2015-12-27 - Public Key Certificates
- 2015-12-19 - The Eclipse P2 Artifact Repository
- 2015-12-19 - UI Libraries in Java
- 2015-12-19 - Overview of the Eclipse4 Architecture
- 2015-11-11 - Dual-booting with EFI
- 2015-11-04 - Terminals, Gettys and Display Managers
- 2015-11-03 - Process Groups
- 2015-10-28 - Big Data Processing
- 2015-10-28 - Column Store Databases
- 2015-10-28 - Big Data Storage
- 2015-10-25 - systemd-init review of criticism part 2
- 2015-10-01 - systemd-init Overview
- 2015-09-10 - Beyond Linux From Scratch (BLFS)
- 2015-09-02 - Linux Wireless Stack Overview
- 2015-08-31 - Udev Overview
- 2015-08-30 - Trying Linux From Scratch (LFS)
- 2015-08-28 - Beginner's Guide to Installing from Source
- 2015-08-28 - Beginner's Guide to Installing from Source
- 2015-08-25 - The Unified Usr Approach
- 2015-08-10 - Notes on Containers with Linux
- 2015-08-06 - The Linux Sound Stack
- 2015-08-04 - Notes on Virtualization with Linux
- 2015-07-22 - Linux Graphics Stack Overview
- 2015-06-18 - Anemic Domain Models
- 2015-06-11 - OSGi-aware Serialization
- 2015-06-09 - OSGi Artifact Resolution and Build Tools
- 2015-05-23 - OSGi and Dependency Injection
- 2015-05-19 - Zookeeper Overview
- 2015-05-15 - High-performance remote OSGi service calls
- 2015-03-15 - Haskell for Object Oriented Programmers
- 2015-03-15 - Home Networking Foundations
- 2014-10-05 - Wayland versus X - a quick summary
- 2014-03-16 - Precedence Aware Evaluation
- 2014-03-07 - Java Serialization and Synthetic Methods
- 2013-10-22 - Java Serialization and the serialVersionUID Property
- 2013-10-21 - TP-Link WDR4300 and OpenWRT/LEDE
- 2013-07-08 - MyBatis Caching
- 2013-03-04 - OSGi Services
- 2013-03-04 - OSGi Classloading
- 2013-03-04 - OSGi Security
- 2013-03-04 - 10 Min Intro to OSGi
- 2013-03-04 - OSGi Configuration
- 2013-02-20 - Using the SecureRandom Class
- 2013-02-17 - JAAS Foundations
- 2013-01-30 - Symmetric Encryption in Java
- 2013-01-28 - Symmetric Encryption
- 2012-12-17 - Git Foundations
- 2012-10-16 - Graphics Card Interfaces
- 2012-10-16 - DRM and KMS kernel module implementations
- 2012-10-12 - Architecture-related Links
- 2012-10-12 - Programming-related Links
- 2012-10-11 - Guice Listeners
- 2012-10-01 - Closures
- 2012-09-30 - Linux Framebuffer Drivers
- 2012-09-29 - The PCI Bus
- 2012-09-29 - Bisecting a Linux Kernel
- 2012-09-28 - Guice Concepts
- 2012-09-27 - Welcome
- 2012-09-27 - Java-related Links
- 2012-09-27 - Linux-related Links
- 2012-09-27 - Infrastructure-related Links
- 2010-04-01 - Grub2
- 2003-01-01 - Junit Tests using Custom Classloaders



