Building a REST API with Spring Boot: Complete Beginner's Guide

Spring Boot strips away the configuration ceremony that used to make Spring applications time-consuming to set up. You add a dependency, annotate a class, and a production-grade REST endpoint is running in seconds. This guide builds a complete, working REST API from a blank project to a tested, structured service – explaining every decision along the way.

By the end you will have a runnable Spring Boot application with GET, POST, PUT, and DELETE endpoints, proper HTTP status codes, global exception handling, validation, and a structure that scales to a real project.

Continue reading Building a REST API with Spring Boot: Complete Beginner's Guide

Java Collections Framework: Choosing the Right Data Structure

Java ships with a rich library of data structures under the java.util package. The problem is not finding a collection u2014 it is picking the right one. Using an ArrayList when you need fast membership checks, or a HashMap when you need sorted keys, is the kind of mismatch that shows up in code reviews and performance profiles.

This guide maps every important class to the use case it is designed for, explains the time complexity of its key operations, and provides working code you can copy directly into a project. By the end you will have an intuition for which collection to reach for in any situation.

Continue reading Java Collections Framework: Choosing the Right Data Structure

Java Streams API: The Complete Reference Guide

The Streams API, introduced in Java 8, fundamentally changed how Java developers process collections. Instead of writing loops that describe how to iterate, you write pipelines that describe what to compute. The result is code that is shorter, easier to parallelise, and far more composable than the equivalent imperative loop.

This guide is designed as a reference you will return to. Every method in the API is covered with a working example and annotated output. The final sections address collectors in depth, parallel streams, and the mistakes that trip up developers who are new to the functional style.

Continue reading Java Streams API: The Complete Reference Guide

8086 Assembly: Handling the External Timer Interrupt (INT 08h)

The 8086 processor does not poll a hardware timer on each clock tick — it reacts to one. The system timer fires INT 08h approximately 18.2 times per second, and the CPU responds by suspending whatever it is currently executing, saving its state, and running the interrupt service routine (ISR) stored at the corresponding vector. Understanding how to intercept this interrupt, execute custom logic, and then chain back to the original BIOS handler is a foundational skill in low-level 8086 programming.

This post builds a working INT 08h handler step by step. The ISR increments a counter in memory on every timer tick, displays a visible marker, and correctly chains to the original BIOS routine before returning — the safe and production-correct pattern for timer-interrupt programming.

Continue reading 8086 Assembly: Handling the External Timer Interrupt (INT 08h)

8086 Assembly: PUSH, POP, CALL, and RET – Stack Operations Explained

The stack is the workhorse of 8086 assembly. Every subroutine call, every register save-and-restore, and every return address depends on it. Understanding PUSH, POP, CALL, and RET at the instruction level — not just the high-level idea — is what separates someone who can read assembly from someone who can actually write and debug it.

In this post we build a working program that calls two subroutines, preserves registers across them, and stores results back in memory. Every line is annotated, the stack state is traced step-by-step, and the TASM/MASM debug output is shown so you can verify the execution yourself.

Continue reading 8086 Assembly: PUSH, POP, CALL, and RET – Stack Operations Explained

TypeScript Function Parameters: Rest, Optional, and Default – Complete Guide

TypeScript’s function parameter system goes well beyond what plain JavaScript offers. Three features — rest parameters, optional parameters, and default parameters — let you write functions that are flexible to call, self-documenting to read, and safe to maintain. Mastering all three is one of the fastest ways to level up your TypeScript code quality.

This guide walks through each feature in depth with fully annotated code, explains the type-system rules that govern them, highlights the mistakes beginners make, and closes with a single real-world function that combines all three.

Continue reading TypeScript Function Parameters: Rest, Optional, and Default – Complete Guide

Jackson Custom Serialisers, Deserialisers, and Mix-in Annotations: The Advanced Toolkit

There are two scenarios where Jackson’s built-in annotations are not enough: when you need to control exactly how a complex type is serialised, and when the class you need to annotate belongs to a third-party library whose source you cannot modify. For the first case, Jackson provides custom serialisers and deserialisers. For the second, it provides Mix-in Annotations — a mechanism that lets you attach annotations to any class without touching its source.

Writing a Custom Serialiser

Extend StdSerializer<T> and override serialize(). The method receives the value to write and a JsonGenerator you use to emit JSON tokens.

Suppose you have a Money type that should serialise as a structured JSON object containing the amount and the currency code:

public class Money {
    private final BigDecimal amount;
    private final String     currencyCode;
    // Constructor and getters
}
Continue reading Jackson Custom Serialisers, Deserialisers, and Mix-in Annotations: The Advanced Toolkit