Статьи для разработчиков

Объяснение форматов кодирования, работы с JSON и других тем, полезных разработчикам, со ссылками на соответствующие онлайн-инструменты tulzy.

Кодирование

Base64: зачем нужно кодирование и как оно работает

Как Base64 превращает бинарные данные в текст ASCII и где это реально нужно.

Base32: чем отличается от Base64 и когда удобнее

Регистронезависимый алфавит Base32 и сценарии, где он удобнее Base64.

URL Encode/Decode: percent-encoding в ссылках

Как спецсимволы в адресной строке и query-параметрах превращаются в %XX-последовательности.

HTML Entities: как безопасно выводить спецсимволы на странице

Почему символы < > & нужно экранировать и как это предотвращает поломку разметки.

JWT: структура токена и что значит «декодировать» JWT

Header, payload и signature JWT-токена и почему декодирование — не то же самое, что проверка подписи.

Unicode Escape: что означают последовательности \uXXXX

Откуда в JSON и JS-строках берутся последовательности вида \u0041 и что они означают.

ROT13 и шифр Цезаря: простая замена символов

Почему сдвиг на 13 букв делает ROT13 симметричным и зачем его вообще используют сегодня.

Punycode: как домены с кириллицей работают в DNS

Как домен вроде «пример.рф» превращается в ASCII-запись с префиксом xn--.

Азбука Морзе: как текст превращается в точки и тире

Принцип кодирования букв точками и тире и где азбука Морзе применяется сейчас.

Data URI: когда встраивать изображения прямо в код

Как data:-URI встраивает содержимое файла прямо в HTML или CSS и когда это оправдано.

Gzip + Base64: сжатие данных для передачи текстом

Зачем сжатые бинарные данные ещё и кодируют в Base64 перед тем, как поместить в текстовое поле.

XML Entities: экранирование символов в XML-документах

Пять обязательных XML-entity, без которых документ ломается при парсинге.

JSON

JSON Formatter: форматирование, минимизация и валидация

Форматирование для читаемости, минимизация для размера, валидация для корректности — три разные задачи с JSON.

JSONPath: как искать данные в JSON без ручного парсинга

Как JSONPath позволяет достать нужные значения из большого JSON одним выражением вместо ручного обхода.

JSON Diff: чем структурное сравнение отличается от текстового

Почему порядок ключей не должен влиять на сравнение двух JSON-документов.

JSON Schema: как описать и проверить структуру JSON

Как JSON Schema позволяет автоматически проверить, соответствуют ли данные ожидаемому контракту.

JSON Flatten: превращение вложенной структуры в плоский список

Как глубоко вложенный JSON превращается в плоский список ключей вида user.address.city.

JSON Sort Keys: зачем сортировать ключи объекта

Почему порядок ключей в JSON не регламентирован, но сортировка всё равно бывает полезна.

JSON Repair: почему JSON ломается и как это исправить

Типичные причины «сломанного» JSON и что автоматический ремонт может, а что не может исправить.

Mock JSON Generator: зачем нужны фейковые данные

Как мок-данные позволяют начать разработку интерфейса ещё до того, как готов бекенд.

JSON ↔ YAML/CSV/XML/TOML: когда и зачем конвертировать

Какие данные теряются при конвертации JSON в CSV и почему YAML и TOML популярны для конфигов.

Текст

Case Converter: зачем нужны разные стили написания

Почему в одном проекте переменные пишут camelCase, а файлы — kebab-case, и откуда взялись эти правила.

Text Diff: как алгоритмы находят разницу между текстами

Как diff-алгоритм находит минимальный набор изменений между двумя версиями текста.

Регулярные выражения: основной синтаксис и типичные паттерны

Как читать регулярное выражение и чем жадный поиск отличается от ленивого.

Сортировка и удаление дубликатов строк: зачем это нужно

Почему числовая сортировка «10» перед «9» — это ошибка, и как этого избежать.

String Escape: почему один и тот же текст нужно экранировать по-разному

Почему один и тот же символ кавычки экранируется по-разному в JS-строке, JSON и shell-команде.

CRLF против LF: почему символы конца строки до сих пор важны

Почему файл, написанный в Windows, может показывать «изменён весь файл» в git на Linux.

Подсчёт символов и слов: почему это не всегда тривиально

Почему эмодзи или символы с диакритикой могут считаться как несколько символов сразу.

Lorem Ipsum: откуда взялся текст-заполнитель и зачем он нужен

Почему дизайнеры намеренно используют «бессмысленный» текст вместо реального контента в макетах.

Slugify: как превратить произвольный текст в URL-адрес

Как заголовок «Привет, Мир!» превращается в URL-совместимую строку вида privet-mir.

Markdown: почему простой текстовый синтаксис победил сложные редакторы

Почему разработчики выбирают писать документацию в Markdown, а не в форматированном текстовом редакторе.

Пробелы и невидимые символы: скрытая причина странных багов

Почему две на вид одинаковые строки могут не совпадать при сравнении из-за невидимого символа.

Text Reverse: почему «перевернуть текст» сложнее, чем кажется

Почему наивный реверс строки может превратить эмодзи в непригодные для показа байты.

Частотный анализ текста: зачем считать повторения слов

Как частота букв в зашифрованном тексте помогает взломать простейшие шифры подстановки.

Хеши/крипто

Hash Generator: чем MD5, SHA-1 и SHA-256 отличаются друг от друга

Почему MD5 до сих пор используют для проверки целостности файлов, но не для паролей.

Checksum Verifier: как проверить, что файл не повреждён

Почему совпадение контрольной суммы подтверждает целостность файла, но не то, кто его создал.

HMAC: чем хеш с ключом отличается от обычного хеша

Почему обычный SHA-256 не защищает от подделки сообщения, а HMAC — защищает.

Bcrypt: почему пароли хешируют медленно, а не быстро

Почему быстрый SHA-256 — плохая идея для паролей, а медленный bcrypt — правильная.

UUID: как генерируют идентификаторы, которые почти никогда не повторяются

Почему UUID v4 можно генерировать независимо на миллионах машин без риска коллизий.

Генератор паролей: что на самом деле делает пароль устойчивым

Почему длинный пароль из словаря надёжнее короткого с символами и цифрами.

AES: как работает симметричное шифрование

Почему один и тот же ключ шифрует и расшифровывает данные в AES, и чем это отличается от асимметричного шифрования.

Argon2: почему этот алгоритм победил в конкурсе на хеширование паролей

Чем Argon2 лучше защищает от атак на видеокартах, чем более старые алгоритмы хеширования паролей.

Scrypt: зачем алгоритму нужно много памяти

Почему scrypt намеренно требует много памяти, чтобы усложнить перебор на ASIC-устройствах.

TOTP: как работают одноразовые коды в приложениях-аутентификаторах

Почему код в Google Authenticator работает без интернета и синхронизируется с сервером только по времени.

PBKDF2: самый старый стандарт растяжения ключей

Почему рекомендуемое количество итераций PBKDF2 растёт с каждым годом.

X.509: что внутри SSL-сертификата

Что именно браузер проверяет в сертификате сайта, прежде чем показать зелёный замочек.

PGP: как работает шифрование с открытым и приватным ключом

Почему можно свободно делиться публичным ключом PGP, но не приватным.

Время/числа

Unix-время: почему компьютеры считают время с 1970 года

Почему именно 1 января 1970 года стало точкой отсчёта времени для большинства компьютерных систем.

Cron-выражения: как расшифровать расписание запуска задач

Как расшифровать выражение вроде */15 * * * * и понять, когда именно запустится задача.

Системы счисления: зачем нужны двоичная, восьмеричная и шестнадцатеричная

Почему цвет #FF5733 в CSS записан шестнадцатеричными цифрами, а не десятичными.

Побитовые операции: как AND, OR и XOR работают на уровне битов

Чем побитовый AND отличается от логического, и зачем вообще оперировать отдельными битами числа.

Разница между датами: почему подсчёт дней сложнее, чем кажется

Почему наивное вычитание дат может дать неправильный результат из-за високосных годов.

Расчёт возраста: почему это не простое вычитание годов

Почему простое вычитание годов рождения может дать возраст на единицу больше реального.

Часовые пояса: почему UTC — это не то же самое, что GMT

Почему UTC не меняется дважды в год, а время в Лондоне (GMT/BST) — меняется.

Расчёт длительности: как правильно суммировать часы, минуты и секунды

Почему при сложении минут и секунд нужно «переносить» остаток в следующий разряд, как при десятичном сложении.

ISO 8601 Duration: как записать длительность в стандартном формате

Почему запись PT1H30M означает «1 час 30 минут», а не «1 минута 30 часов».

Номер недели: почему в разных странах недели считают по-разному

Почему 1 января иногда относится к 52-й или 53-й неделе предыдущего года по стандарту ISO 8601.

Римские цифры: как устроена система без нуля и разрядов

Почему IV означает 4, а не 6, и как правило вычитания работает в римских цифрах.

IEEE 754: почему 0.1 + 0.2 не равно 0.3 в коде

Почему почти в каждом языке программирования 0.1 + 0.2 выводит 0.30000000000000004.

Число прописью: зачем превращать цифры в слова

Почему в банковских документах сумму пишут и цифрами, и словами одновременно.

Сеть/HTTP

Разбор URL: из каких частей состоит веб-адрес

Почему в URL есть часть после символа #, которую сервер даже не получает.

Query String против JSON: почему GET-параметры такие ограниченные

Почему передать массив или вложенный объект через query string URL не так просто, как через JSON.

User-Agent: почему эта строка такая запутанная

Почему Chrome, Safari и Edge все содержат в User-Agent слова "Mozilla" и "Safari" одновременно.

Basic Authentication: как простейший способ аутентификации работает в HTTP

Почему Basic Auth обязательно требует HTTPS, ведь Base64 — это не шифрование, а лишь кодирование.

HTTP-заголовки: что скрыто в каждом запросе и ответе

Почему заголовок Content-Type определяет, как браузер интерпретирует тело ответа сервера.

Cookies: как небольшой кусок текста хранит состояние сессии

Почему атрибут HttpOnly защищает cookie от кражи через вредоносный JavaScript-код.

CORS: почему браузер блокирует "обычные" запросы к другому домену

Почему ошибка CORS возникает в браузере, а не на стороне сервера, и кто на самом деле блокирует запрос.

Заголовки email: как проследить путь письма от отправителя до вас

Почему заголовки Received нужно читать снизу вверх, чтобы проследить путь письма.

Веб-разработка

HEX, RGB, HSL: почему для цвета существует столько записей

Почему дизайнеры часто выбирают HSL вместо HEX, когда нужно подобрать оттенок цвета вручную.

Минификация CSS: что именно удаляется из файла и зачем

Почему минифицированный CSS работает точно так же в браузере, хотя и становится нечитаемым для человека.

Минификация JavaScript: разница между минификацией и обфускацией

Почему минифицированный код всё ещё можно прочитать при желании, а обфусцированный — нет.

Минификация HTML: почему пробелы в разметке вообще имеют значение

Почему удаление пробелов в <pre> или textarea может сломать вид страницы, в отличие от других мест.

CSS-градиенты: чем linear отличается от radial и conic

Почему conic-gradient подходит для круговых диаграмм, а radial — для эффекта светового пятна.

Алгоритм Луна: как номер карты проверяют на корректность

Почему валидный по алгоритму Луна номер карты не означает, что такая карта реально существует.

IBAN: как устроен международный номер банковского счёта

Почему первые две буквы в IBAN — это код страны, а не часть номера счёта.

QR-коды: как в квадрате из пикселей помещается ссылка

Почему QR-код с логотипом по центру всё ещё сканируется, хотя часть рисунка перекрыта.

Штрихкоды: чем Code 128 отличается от EAN-13

Почему на товарах в магазинах почти всегда EAN-13, а не Code 128.

Placeholder-изображения: зачем нужны картинки-заглушки в разработке

Почему верстальщики намеренно вставляют серые прямоугольники вместо реальных фотографий на этапе разработки.