Page 256 - Mironsoft Blog
-
Maxim Mironjuk
-
May 17, 2025
A type change that turns consumer code into a compile error is a breaking change, even without any change to runtime behavior at all. Backwards compatibility for type changes means deliberately using overloads, deprecation comments, API reports and Semantic Versioning so a TypeScript library can grow without surprising existing consumers on every release.
-
Maxim Mironjuk
-
May 17, 2025
A TypeScript type that compiles without errors is not automatically correct. Complex generic and conditional types can silently widen to any, accept an invalid shape they should reject, or narrow incorrectly inside a conditional branch. Tools like tsd, expect-type, and Vitest's expectTypeOf make exactly this behavior testable, purely at compile time, without a single runtime test.
-
Maxim Mironjuk
-
May 16, 2025
Negative grid line numbers count backwards from the end of the grid, so grid-column: 1 / -1 always spans the full width, whether the grid has three, six, or twelve columns. Hardcode positive line numbers instead, and every change to the column count forces you to chase down and fix every placement by hand. Negative lines make the layout robust against exactly that change.
-
Maxim Mironjuk
-
May 16, 2025
The Digital Services Act (DSA) is a new EU regulation that has applied since 17 February 2024 to nearly all online shops with customer reviews, comment sections or marketplace offerings. Among other things, it requires an easily reachable point of contact, a simple way to report illegal content, and a ban on manipulative interface designs. This article explains in plain language who is affected and what you should do now.
-
Maxim Mironjuk
-
May 16, 2025
Shell scripts without tests are a black box in your automation. The Bash Automated Testing System (BATS) brings structured unit tests, fixtures, and mocking to the shell world, and it integrates seamlessly into GitHub Actions, GitLab CI, and Jenkins without any external runtime dependencies.
-
Maxim Mironjuk
-
May 16, 2025
Once more than one php-fpm process is running, the default file-based session storage quickly becomes a problem, at the latest once you scale horizontally across multiple servers. SessionHandlerInterface offers exactly six methods to store session data in Redis, a database, or any other backend instead, without any framework at all. This article walks through the implementation in detail, including the locking strategy that protects parallel requests for the same session from data loss.
-
Maxim Mironjuk
-
May 16, 2025
Scroll, resize, and input events fire hundreds of times per second and can bring the main thread to a crawl if every call triggers an expensive function unchecked. Debouncing and throttling tame this flood deliberately, with clear timer mechanics, rAF-based patterns for visual updates, and ready-made Alpine.js modifiers for Hyva themes.
-
Maxim Mironjuk
-
May 16, 2025
Symfony UX Autocomplete connects Doctrine entities, custom search logic and external APIs through a single form field type, delivering server side rendering, Stimulus wiring and Tom Select on the frontend without writing a single custom JavaScript module.
-
Maxim Mironjuk
-
May 16, 2025
Claude and other AI assistants produce code that looks convincing, but for security-critical logic, payment processing, data migrations, and scripts touching production data, looking convincing is not enough. This article walks through concrete high-risk areas, explains why confident-sounding explanations are a warning sign rather than reassurance, and describes when manual implementation remains the more reliable choice.
-
Maxim Mironjuk
-
May 16, 2025
A named pipe (FIFO) behaves like a file on the filesystem but works like a classic pipe: data flows directly from a writer to a reader and never lands on disk. Used correctly, FIFOs decouple independent processes, build logging multiplexers, and avoid the race conditions that intermediate files almost always introduce.
-