Статьи для разработчиков
Объяснение форматов кодирования, работы с 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 нужно читать снизу вверх, чтобы проследить путь письма.
SEO
Meta-теги: какие из них реально влияют на поиск и соцсети
Почему поисковик иногда игнорирует ваш meta description и сам генерирует сниппет из текста страницы.
robots.txt: как поисковые боты решают, что можно сканировать
Почему запрет в robots.txt не скрывает страницу из поисковой выдачи, если на неё есть ссылка.
Sitemap.xml: зачем поисковикам нужна карта сайта
Почему наличие страницы в sitemap.xml не гарантирует, что поисковик её проиндексирует.
Favicon: почему для одной иконки нужно столько размеров и форматов
Почему одного favicon.ico уже недостаточно для корректного отображения на всех устройствах.
Генерация sitemap.xml: как автоматически собрать карту сайта
Почему поисковики в основном игнорируют поле priority в sitemap.xml, несмотря на то что оно есть в спецификации.
Веб-разработка
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-изображения: зачем нужны картинки-заглушки в разработке
Почему верстальщики намеренно вставляют серые прямоугольники вместо реальных фотографий на этапе разработки.