Page 167 - Maxim Mironjuk
-
Maxim Mironjuk
-
September 21, 2025
Updating dynamic content with JavaScript without informing screen reader users creates invisible errors and silent success messages. ARIA live regions with aria-live, aria-atomic and aria-relevant announce changes reliably without shifting focus, making cart updates, form validation and search results understandable for every user.
-
Maxim Mironjuk
-
September 21, 2025
Anyone running custom PHP applications without Symfony or Laravel has to build CSRF protection themselves. With random_bytes for token generation, hash_equals for constant time comparison and a clean session binding, robust CSRF protection can be built in a few lines of PHP, without any third party dependency.
-
Maxim Mironjuk
-
September 20, 2025
An unencrypted database backup sitting in external storage or with a cloud provider is a full export of every customer record the moment an attacker gains access to that storage. This article shows how Percona XtraBackup produces encrypted backups using the --encrypt options, how keys are managed securely, how the restore workflow with decryption plays out, and how to build a retention strategy for several backup generations under different keys.
-
Maxim Mironjuk
-
September 20, 2025
Since iOS 14.5, every app that wants to track a user across devices for advertising purposes must first explicitly ask for consent. Getting the prompt wrong, or showing it at the wrong time, costs analytics and advertising SDKs valuable signal. This article covers how it technically works, practical integration, and the concrete consequences of a denial.
-
Maxim Mironjuk
-
September 20, 2025
Anyone building forms in React 19 with React Hook Form will eventually need a schema validation library. Zod and Yup solve the same problem with different priorities: TypeScript-first versus an established JavaScript API. This article compares both across type inference, syntax, nested structures, and migration effort.
-
Maxim Mironjuk
-
September 20, 2025
Global Transaction Identifiers solve a problem every operator has run into: manually hunting down the right binlog position for CHANGE MASTER TO after a crash. Migrating an existing, position-based replication setup to GTIDs without losing data buys you automatic failover handling and eliminates an entire class of operational mistakes at once.
-
Maxim Mironjuk
-
September 20, 2025
A misconfigured robots.txt file can hide important product pages or knock an entire store out of Google Search after a relaunch. This article explains robots.txt syntax and wildcards, the most common Magento mistakes with CSS, JavaScript, and parameter URLs, the difference from noindex, and how to control crawling precisely without risking your rankings.
-
Maxim Mironjuk
-
September 19, 2025
Turbo replaces full page changes with fast partial updates, yet client-side UI state can easily get lost on every Turbo Frame render. Alpine.js and Turbo/Hotwire together deliver exactly what each approach lacks on its own: server-side navigation without a reload, plus reliably re-initialized, local reactivity in every component.
-
Maxim Mironjuk
-
September 19, 2025
A single, fixed AVIF quality level applied to your whole audience is always a compromise between two extremes that rarely get served well at the same time. Visitors on a fast fiber connection receive images that are more compressed than necessary, while visitors on mobile networks with data saver enabled still pay for quality they explicitly asked to avoid. Client Hints, the Save-Data header, and a connection to an image CDN let you resolve the quality level per request instead of baking one number into the build once and for all.
-
Maxim Mironjuk
-
September 19, 2025
A clean toast system shows success, error and warning consistently, disappears on its own after the right amount of time, and stays understandable for screen reader users too. With Tailwind CSS for the variants and Alpine.js for stacking and timers, this becomes a single component reusable across the whole project.
-