Java Concurrency Revisited: Synchronized vs. ReentrantLock

Java Concurrency in Practice is the bible of Java multi-threading. It’s dense, thorough, and frankly, a bit intimidating. For years, I relied heavily on Java’s java.util.concurrent package (ConcurrentHashMap, my beloved), ignoring the low-level mechanics underneath. Why reinvent the wheel when the standard library is so good? But to truly master scalability, you have to understand what happens under the hood. Recently, I decided to peel back the layers and revisit the building blocks of Java concurrency: synchronized and ReentrantLock. ...

November 22, 2025 · 5 min · 1018 words · Me

Vibe Driven Development

How I Built a Zotero Plugin with an AI Pair Programmer I had an itch. My Zotero library, a collection of academic papers I’ve gathered over the years, was full of dead links. It felt messy, and I desperately wanted to clean it up. But the thought of checking each attachment manually was daunting. “How hard could it be,” I thought, “to just build a plugin to do it for me?” ...

June 8, 2025 · 6 min · 1241 words · Me

Life Wiki Selfhosted on Your NAS

Introduction I used Notion for a couple of years and found it to be one of the best tools for note-taking and building a personal wiki. Why did I stop using it? It wasn’t about the cost—Notion’s freemium plan is perfectly sufficient for personal use. Instead, there were two main issues that drove me away. First, typing math equations in Notion is cumbersome because you have to use a dedicated “Block” for them. Second, it’s difficult to export or migrate your data to other platforms, which, while not entirely Notion’s fault, still concerns me. Most importantly, I realized I should make better use of my Synology NAS. That’s why I decided to explore open-source, self-hosted alternatives. ...

January 10, 2025 · 7 min · 1361 words · Me

Building a Single Page Application (SPA) with Quarkus and Quinoa

Quarkus is an exciting framework for building modern Java applications, and Quinoa takes it up a notch by streamlining Single Page Application (SPA) development. Together, they enable a seamless workflow for both frontend and backend developers. This guide walks through setting up a Quarkus-based SPA using React as an example, although the process works just as well for other frameworks. Why Quinoa Matters Quinoa elegantly integrates frontend development into Quarkus projects. Here’s why you should care: ...

December 21, 2024 · 3 min · 479 words · Me

How to Build an Amazing and Productive Terminal

Everyone wants a cool terminal and WezTerm is the coolest one in my opinion. It is easy to manage and we can setup a new environment with minutes in association with GNS stow - a symlink manager. WezTerm is easy to configure since it is using lua and very friendly to read and learn. I am dumb at iTerm2 and Tmux, but it only took me 30 mins to start tweaking the config. Everyone wants a cool terminal, and WezTerm is the coolest one in my opinion. It’s easy to manage and we can set up a new environment within minutes using GNU Stow - a symlink manager. ...

July 9, 2024 · 5 min · 900 words · Me

Building a WebApp using React and Quarkus

My first website was an adventure straight out of 2014, built with Dreamweaver and some basic HTML and CSS. Picture a static site, lovingly crafted to display the research and papers from our lab. The end product was, well, let’s just say not exactly internet-breaking. But hey, it was my first foray into the wild world of web development! Fast forward 10 years, after diving deep into data science, machine learning, and platform engineering, I realized something horrifying: I was still a web development noob. Cue the dramatic music. This simply would not do! So, armed with determination and copious amounts of coffee, I embarked on a quest to master web app development and fill in the gaping holes in my skill set. ...

July 5, 2024 · 4 min · 652 words · Me

Coding Pattern: Kadane's Algo

Imagine you’re walking along a path that has treasure chests and traps. Some chests have gold coins, and some traps take away coins. You want to find the part of the path where you can get the most coins. The key idea: It is a dynamic programming algorithm for finding the maximum contiguous sum subarray in a given array. It is a simple and efficient algorithm that works by maintaining two variables: ...

November 30, 2023 · 3 min · 476 words · Me

Coding Pattern: Dynamic Programming

Preface Facing the Dynamic Programming Challenge Like many others, I initially found Dynamic Programming (DP) on LeetCode daunting and perplexing. However, this challenging journey led to profound insights. My initial misconception was that DP was all about complexity, but I learned it’s fundamentally about simplifying complex problems into manageable segments. Here’s my journey into understanding DP and why it’s a crucial tool in a programmer’s toolkit. Unraveling Dynamic Programming The Essence of DP ...

November 30, 2023 · 9 min · 1764 words · Me

Coding Pattern: Recursion

Overview Recursion is a way of solving a problem by breaking it down into smaller problems of the same type. The smaller problems are then solved recursively, until a base case is reached. The base case is a simple problem that can be solved without recursion. Imagine you have a big box of toy blocks, and each block represents a problem you need to solve. Some blocks are big (complex problems), and some are tiny (simple problems). To solve a big problem, you take apart the big block to find smaller blocks inside, and then, if needed, you take apart those smaller blocks to find even tinier blocks inside them, and so on, until you reach the tiniest blocks that you can easily understand and solve. ...

November 5, 2023 · 4 min · 724 words · Me

Coding Pattern: Trie

Overview The union-find algorithm is a data structure and algorithm that maintains a collection of disjoint sets. A disjoint set is a set of elements that are not connected to each other. The union-find algorithm can be used to perform the following operations: Find: Find the set that an element belongs to. Union: Merge two sets together. The union-find algorithm is often used to solve problems that involve graph connectivity. For example, the union-find algorithm can be used to determine whether two nodes in a graph are connected, or to find all of the connected components in a graph. ...

October 22, 2023 · 7 min · 1381 words · Me