Page 18 - Monthly Archives: January 2026
-
Maxim Mironjuk
-
January 09, 2026
A WebSocket connection differs fundamentally from a classic HTTP request, because it isn't a single request with exactly one response but a persistent, bidirectional connection over which multiple messages flow in both directions at unpredictable times. This fundamental property makes classic request-response test patterns unsuited and calls for dedicated test approaches for connection setup, ongoing message exchange, and behavior on an unexpected connection drop.
-
Maxim Mironjuk
-
January 09, 2026
Scroll snap is CSS, not JavaScript. With Tailwind CSS and a handful of utility classes you get a touch-capable slider that works natively on every device. Alpine.js adds navigation arrows, dot indicators and keyboard support without loading a single external library.
-
Maxim Mironjuk
-
January 09, 2026
As soon as a project spans multiple environments or multiple related services, a single monolithic compose.yaml quickly turns unwieldy. extends and the newer include offer two different ways to factor out shared definitions instead of copying everything over and over.
-
Maxim Mironjuk
-
January 08, 2026
Files created inside a container as root that cannot be edited on the host, volume mounts that refuse read or write access, processes running with UID 0 even though there is no real need for it: Docker file permission issues are among the most common problems in daily development and production operations. UID/GID mapping, fixuid, and rootless Docker solve these conflicts systematically.
-
Maxim Mironjuk
-
January 08, 2026
Before hooks existed, render props and children-as-function were the answer to sharing logic between components. An honest look at where they still offer real value in the age of hooks and where custom hooks are clearly superior.
-
Maxim Mironjuk
-
January 08, 2026
A failed disk, a destroyed bootloader, or a complete hardware failure usually hits teams without warning. Bare metal recovery is the discipline of rebuilding a server from nothing, including partition table, bootloader, and operating system, with no working base install left to rely on. Teams that plan and rehearse this case in advance need hours instead of days.
-
Maxim Mironjuk
-
January 08, 2026
Once a project grows past a handful of message handlers, it quickly becomes clear that concerns like logging, execution time measurement, or wrapping work inside a database transaction shouldn't be duplicated inside every single handler. The Symfony Messenger bus solves exactly this problem with a middleware chain that every message passes through before and after reaching its handler, similar in spirit to an HTTP kernel event, but specific to the messaging layer. This article walks through implementing custom middleware, registering it at the right spot in the chain, and where the line to classic event listeners sits.
-
Maxim Mironjuk
-
January 08, 2026
A rolling upgrade updates an Elasticsearch or OpenSearch cluster node by node, while the cluster keeps serving requests the entire time. Anyone who correctly disables shard allocation before every node restart and respects the version compatibility rules between major versions can move production clusters to a new version without any planned downtime.
-
Maxim Mironjuk
-
January 08, 2026
A race condition arises when two or more requests read and modify the same data nearly simultaneously without the application coordinating this shared access, letting an attacker bypass a check that works correctly under single execution by deliberately firing multiple requests at once. Such vulnerabilities are especially tricky because the affected code appears completely bug-free under normal, sequential testing, and the problem only surfaces under deliberately induced, high concurrency.
-
Maxim Mironjuk
-
January 08, 2026
The infer keyword is the key to many TypeScript utility types and lets you extract partial types such as the resolved value of a Promise or the parameters of a function directly from an existing type without duplicating them by hand. Understanding how infer works inside conditional types lets you build your own utility types, avoid duplication, and keep derived types automatically in sync with their source.
-