Posts of Сохранёнки программиста

newest first

#3116Photo
Views112−58%vs avg
Forwards2
Reactions1
Comments0
#3115Photo
Views165−38%vs avg
Forwards1
Reactions—
Comments0
#3114Photo

WAF может проверить ответ сервера перед отправкой клиенту Запрос пытается открыть служебную страницу без авторизации. Приложение возвращает HTML административной панели. Проверка ответа помогает увидеть, что сервер действительно отдал закрытое содержимое. В Cloudflare WAF добавили сопоставление запроса с ответом. Правило может учитывать путь, состояние авторизации, код ответа и другие доступные признаки. При совпадении WAF подменяет ответ страницей блокировки до отправки клиенту. Начать можно с узкого сценария: проверить обращения к административным адресам и посмотреть, какие ответы получает неавторизованный посетитель. Сначала соберите события в журнал, затем настройте блокировку. Пользовательские правила по содержимому тела ответа пока недоступны. Блокировка ответа также не отменяет действия, которые приложение уже успело выполнить на сервере.

Open in Telegram
Views202−24%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h115
17 h147
29 h202
  1. After 6 hours115
  2. After 24 hours202
  3. Total to date202
#3113Text

Два распаковщика могут увидеть разные файлы в одном tar-архиве Сервис проверяет архив и видит безопасный файл. Установщик открывает тот же архив — и находит дополнительный файл с другим содержимым. Такое возможно, когда программы по-разному трактуют записи tar. В разборе tar-codec есть примеры расхождений, из-за которых проверка и последующая распаковка получают разные наборы файлов. Команда Astral столкнулась с этим при работе над uv и написала более строгий парсер. Начиная с uv 0.13 он используется для обработки исходных пакетов Python. Если ваш сервис принимает архивы, проверьте всю цепочку: чем проверяете содержимое, чем распаковываете и какие варианты формата разрешаете. Добавьте в тесты архивы с повторяющимися именами и неоднозначными заголовками. Проверяющая и использующая файл части системы должны одинаково понимать его содержимое.

Open in Telegram
Views224−15%vs avg
Forwards0
Reactions1
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h168
33 h224
  1. Total to date224
#3112Photo

GitHub автоматизировал пересмотр доступов внешних участников Подрядчик закончил работу, тестовый проект закрыли, а права на репозиторий остались. Когда таких проектов десятки, ручную проверку легко отложить. В GitHub для общей организации создали приложение Evergreen. Раз в квартал оно открывает задачу со списком внешних участников. Владелец подтверждает тех, кому доступ ещё нужен. По истечении срока неподтверждённые права отзываются. Отдельный процесс ищет репозитории без недавней активности людей: сначала предупреждает владельца, затем архивирует проект. Решения и изменения сохраняются в задачах и JSON-файлах управляющего репозитория. Для своей команды можно начать с одного действия: назначить владельца каждому репозиторию и дату следующего пересмотра доступов. Затем автоматизировать напоминания и журнал решений.

Open in Telegram
Views237−10%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h139
17 h181
29 h237
  1. After 6 hours139
  2. After 24 hours237
  3. Total to date237
#3111Photo

Общий ключ шардирования помогает оставить JOIN внутри одной базы Таблицы клиентов и заказов распределили по разным серверам: клиентов — по id, заказы — по собственному id. Теперь запросу «клиент и его заказы» приходится собирать данные с нескольких шардов. В разборе групп шардирования показан другой подход: размещать заказы по customer_id, используя то же правило распределения, что и для клиентов. Связанные строки окажутся на одном шарде, где можно выполнить JOIN и транзакцию локально. Перед выбором ключа выпишите основные запросы приложения. Какие таблицы они соединяют? Какие строки меняются вместе? Какой идентификатор известен в начале запроса? Эти ответы помогут выбрать размещение данных. Особенно полезно проверить запросы, в которых будущего ключа шардирования вообще нет: для них может потребоваться обращение к нескольким шардам.

Open in Telegram
Views242−9%vs avg
Forwards2
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h176
33 h242
  1. Total to date242
#3110Photo
Views283+7%vs avg
Forwards2
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h117
17 h168
29 h234
77 h283
  1. After 6 hours117
  2. After 24 hours234
  3. Total to date283
#3109Photo
Views260−2%vs avg
Forwards2
Reactions0
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h155
33 h232
69 h260
  1. Total to date260
#3108Text
Views275+4%vs avg
Forwards0
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
4 h109
29 h220
77 h275
  1. After 6 hours109
  2. After 24 hours220
  3. Total to date275
#3107Text
Views269+2%vs avg
Forwards2
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h149
69 h269
  1. Total to date269
#3106Text
Views278+5%vs avg
Forwards0
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
4 h119
16 h160
28 h206
77 h278
  1. After 6 hours119
  2. After 24 hours206
  3. Total to date278
#3105Text
Views277+5%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
8 h174
33 h244
69 h277
  1. Total to date277
#3104Text
Views241−9%vs avg
Forwards0
Reactions—
Comments1
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h126
15 h167
28 h241
  1. After 6 hours126
  2. After 24 hours241
  3. Total to date241
#3103Text
Views282+7%vs avg
Forwards3
Reactions—
Comments1
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h180
32 h257
69 h282
  1. After 24 hours257
  2. Total to date282
#3102Text
Views311+18%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
6 h139
29 h252
76 h311
  1. After 6 hours139
  2. After 24 hours252
  3. Total to date311
#3101Text
Views304+15%vs avg
Forwards0
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
1 h70
10 h203
33 h274
68 h304
  1. After 1 hour70
  2. Total to date304
#3100Photo

В первых тестах Rust-порт TypeScript оказался до восьми раз быстрее TypeScript 7.0 Cloudflare и VoidZero работают над tsrs — переносом компилятора TypeScript на Rust. В ранних замерах команды он работал до восьми раз быстрее TypeScript 7.0 и использовал примерно на 70% меньше памяти при одинаковом числе рабочих потоков проверки типов. Сравнение важно читать вместе с условиями. TypeScript 7.1 beta уже сама показывает ускорение до 2,5 раза относительно 7.0, поэтому «в восемь раз быстрее TypeScript» без указания версии было бы неточно. Авторы намерены сохранять поведение языка в соответствии с оригинальной реализацией и работают совместно с командой TypeScript. За проектом стоит следить тем, у кого проверка типов заметно задерживает сборку. Пока это ранние результаты на выбранных нагрузках, а не обещание такого же ускорения для любого репозитория. #typescript #компиляторы #rust

Open in Telegram
Views306+16%vs avg
Forwards4
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
10 h181
18 h191
30 h255
76 h306
  1. After 24 hours191
  2. Total to date306
#3099Photo

MicroVM может начать работу, не загружая весь снимок памяти DigitalOcean восстанавливает подготовленные виртуальные машины из снимков. Страницы памяти и блоки диска загружаются по мере обращения, поэтому запуск не ждёт полного скачивания состояния. Сеть тоже готовят заранее: на хосте поддерживают запас настроенных сетевых окружений. При запуске машине выделяют одно из них, а запас пополняют в фоне. Во внутренних тестах путь от запроса на выполнение до обслуживания трафика занимал менее 200 мс по медиане. Условия: готовый шаблон, свободные ресурсы хоста и прогретые кеши. Первичная загрузка образа в это время не входит. Подход переносит часть подготовки за пределы запуска, а часть откладывает. Цена остаётся: обращение к ещё не загруженной странице может приостановить выполнение. #виртуализация #производительность

Open in Telegram
Views281+6%vs avg
Forwards3
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
4 h128
14 h210
22 h217
25 h232
67 h281
  1. After 24 hours232
  2. Total to date281
#3098Photo

Cloudflare сократила стоимость ИИ-ревью с $2,43 до $0,77 Команда проверила, на что ревьюер расходует токены, и обнаружила, что общий системный контекст плохо переиспользуется между репозиториями: рядом с ним в одном блоке находились меняющиеся дата и рабочая директория. Общую часть отделили для кеширования. Затем убрали недоступные инструменты, лишние повторные проверки и заключительный вызов модели после публикации результата. Меняли также модели и глубину рассуждений. Средняя стоимость упала на 68%, медианное время — с 4 минут 9 секунд до 1 минуты 32 секунд. Но экономия требовала проверки качества: некоторые конфигурации стали пропускать реальные замечания. Поэтому измерять стоит и расходы, и находки ревьюера. В статье эти проверки разобраны отдельно; общее сравнение затрат до и после изменений не было полностью контролируемым экспериментом. #ии #кодревью #оптимизация

Open in Telegram
Views306+16%vs avg
Forwards6
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
2 h126
12 h210
34 h280
42 h283
66 h306
  1. After 1 hour126
  2. Total to date306
#3097Photo

GitHub снижает давление на общие базы и ограничивает распространение сбоев В сентябре GitHub зафиксировал два инцидента, ухудшивших работу сервисов. В отчёте доступности инженеры описали изменения: снижение нагрузки на общие базы, защиту от перегрузки и более строгую изоляцию сбоев при работе с pull request. Параллельно продолжался перенос инфраструктуры в Azure. К 7 октября в Central US работали 120 из 160 производственных сервисов, но туда перенесли только 13 из 51 основной базы MySQL. Миграция ещё не завершена. Разбор стоит читать как список конкретных ограничений: где нагрузка нескольких сервисов сходится на общей базе, как система отсекает лишнюю работу и какие операции могут повлиять на соседние. Для своей архитектуры можно начать с общего ресурса, от которого зависит больше всего пользовательских сценариев, и проверить его поведение при перегрузке. #надёжность #базыданных

Open in Telegram
Views305+15%vs avg
Forwards1
Reactions0
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
6 h209
16 h254
28 h276
46 h291
70 h305
  1. After 6 hours209
  2. After 24 hours276
  3. Total to date305
#3096Photo

Байесовский A/B-тест тоже требует правил остановки «Будем смотреть результаты каждый день и остановимся, когда вероятность победы достигнет 95%». Байесовский подход сам по себе не гарантирует, что такая процедура удержит долю ложных срабатываний на нужном уровне. Spotify разбирает, от чего зависят эти гарантии. Значение имеют исходные предположения о возможном эффекте, модель данных и правило остановки. Разные настройки дают разные свойства, хотя все называются байесовскими. Компания сохраняет частотный подход: поддержка второго режима усложнила бы планирование и чтение результатов, а достаточной пользы команда пока не видит. Перед выбором инструмента определите, какие ошибки вы хотите контролировать и когда будете завершать эксперимент. Потом проверьте, обеспечивает ли выбранная настройка именно эти гарантии. #статистика #abтесты

Open in Telegram
Views281+6%vs avg
Forwards2
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h111
14 h143
26 h242
66 h281
  1. After 6 hours111
  2. After 24 hours242
  3. Total to date281
#3095Photo

Два Kubernetes-контроллера могут рассогласовать состояние одного приложения Uber вынес управление масштабированием в отдельный контроллер. Основной продолжил заниматься развёртыванием, а новый стал учитывать, сколько экземпляров требуется при переключении после отказа. Но оба обновляли один Kubernetes-ресурс. В сочетании с задержками кеша это приводило к расхождению метаданных и конфигурации ReplicaSet. Иногда приложение застревало до ручного вмешательства. Команда добавила обнаружение таких расхождений и автоматическое исправление. Для передачи статуса между контроллерами использовала номер поколения: прежде чем сообщить об успехе, контроллер проверяет, что видит достаточно свежую версию данных. Весь переход занял год. В статье есть разбор гонок и интеграционных тестов через kind — пригодится, если несколько контроллеров меняют связанные ресурсы. #kubernetes #распределённыесистемы

Open in Telegram
Views2640%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h149
30 h233
70 h264
  1. After 24 hours233
  2. Total to date264
#3094Photo
Views263−1%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
6 h113
9 h135
29 h205
72 h263
  1. After 6 hours113
  2. After 24 hours205
  3. Total to date263
#3093Photo

Отказ соседнего сервиса не всегда должен ломать весь запрос Сервис оформления заказа обращается к нескольким системам. Без одной заказ не создать, а без другой можно обойтись. На схеме обе зависимости выглядят одинаково, но последствия отказа у них разные. Uber разбирает такие зависимости по деревьям вызовов. Если ошибка нижестоящего сервиса регулярно приводит к ошибке вызывающего, зависимость считают жёсткой. Если запрос продолжает выполняться — мягкой. Когда наблюдений недостаточно, вывод оставляют открытым. Так можно найти цепочки, по которым сбой доходит до пользователя, и точнее настроить оповещения. Для своего сервиса начните с одного важного сценария. Какие внешние вызовы обязательны для его завершения? Где предусмотрен запасной вариант? Затем проверьте по трассировкам, действительно ли приложение ведёт себя так, как задумано. #микросервисы #надёжность

Open in Telegram
Views267+1%vs avg
Forwards2
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
11 h150
13 h162
33 h210
76 h267
  1. Total to date267
#3092Photo

Quick Tunnels ограничивает доступ к локальному приложению по адресам почты Показать приложение коллеге можно через временный адрес Cloudflare. Чтобы ссылка открывалась только нужному человеку, добавьте --allowed-mail: cloudflared tunnel --url http://localhost:8080 \ --allowed-mail [email protected] Посетитель вводит адрес и одноразовый код из письма. Cloudflare подтверждает владение почтой, а запущенный на вашей машине cloudflared сверяет адрес со списком разрешённых. В руководстве по защищённым Quick Tunnels показаны несколько адресов и маска домена. Возможность появилась в cloudflared 2026.9.3; аккаунт Cloudflare для этого сценария не нужен. Без --allowed-mail туннель остаётся публичным: приложение доступно любому, у кого есть ссылка. Чтобы изменить список, нужно остановить процесс и запустить новый туннель. Для постоянного имени и более сложных правил доступа авторы предлагают обычный Cloudflare Tunnel вместе с Cloudflare Access.

Open in Telegram
Views279+5%vs avg
Forwards4
Reactions—
Comments1
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
10 h155
30 h223
33 h228
74 h279
  1. After 24 hours223
  2. Total to date279
#3091Photo

Удаление дублей из потока требует ограничить срок хранения уже встреченных ключей Чтобы распознать повторный заказ, обработчик должен помнить, что уже видел его идентификатор. Если помнить все ключи бесконечно, состояние будет расти вместе с потоком. В разборе Flink SQL David Anderson сравнивает DISTINCT, варианты ROW_NUMBER и собственную функцию обработки таблицы. Критерии шире, чем «дубли исчезли»: важны задержка, поздние события и наличие обновлений в выходном потоке. TTL ограничивает срок хранения состояния. После его истечения повторный ключ может снова пройти как новый. Значит, срок должен опираться на допустимый интервал повторной доставки. Есть и ловушка настройки: SQL-подсказка STATE_TTL не применяется к операторам Rank и Deduplicate. Для них автор указывает настройку TTL на уровне сессии. Перед выбором короткого SQL-запроса полезно проверить план выполнения и формат результата: поток только новых строк и поток изменений подходят разным потребителям.

Open in Telegram
Views248−6%vs avg
Forwards1
Reactions0
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
2 h88
14 h179
35 h230
37 h231
66 h248
  1. Total to date248
#3090Photo

Tachyon помогает найти дорогие вызовы в работающем Python-процессе В Python 3.15 появился статистический профилировщик Tachyon в модуле profiling.sampling. Он периодически снимает стек вызовов и умеет подключаться к уже запущенному приложению без изменения его кода. В примере Astral заметную долю времени занимало объединение вложенных списков перед подсчётом элементов: Counter(sum(symbols, [])) Сложение списков создаёт новые списки и повторно копирует уже накопленные элементы. По мере роста входа такая конструкция может стать дорогой. Авторы нашли её на диаграмме вызовов и заменили объединением через новый синтаксис включения списков Python 3.15. В локальном замере время снизилось примерно с 0,45 до 0,22 секунды. Это результат конкретного примера. Ценность профилировщика — в возможности сначала увидеть горячий участок своей программы, затем изменить его и повторить измерение. Доступность подключения к процессу нужно проверить для своей ОС и прав.

Open in Telegram
Views263−1%vs avg
Forwards2
Reactions1
Comments2
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
5 h129
14 h163
34 h221
57 h248
77 h263
  1. After 6 hours129
  2. Total to date263
#3089Photo

GitHub ускорил страницы, убрав генерацию стилей во время выполнения CSS-in-JS создавал работу и в браузере, и при серверном рендеринге. По мере роста числа компонентов дороже становились подготовка стилей и их обновление. Команда Primer перевела компоненты на CSS Modules: стили лежат рядом с кодом, имена классов локальны, а результат сборки отправляется обычными CSS-файлами. Выполнять JavaScript ради генерации этих стилей больше не нужно. Главной сложностью оказался переход. Старые и новые компоненты должны были работать одновременно. Пришлось разбирать динамические свойства, заменять стилизационные обёртки и отдельно переносить поддержку тем. Изменения выкатывали постепенно, под флагами. Миграция завершилась в июне 2026 года; сентябрьская статья описывает накопленный опыт. Полезный ориентир для профилирования интерфейса: учитывать не только объём загруженного кода, но и работу, которую он выполняет при каждом рендере.

Open in Telegram
Views260−2%vs avg
Forwards3
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
9 h193
26 h228
61 h257
69 h260
  1. After 24 hours228
  2. Total to date260
#3088Photo

Инвертированный индекс ищет документы по словам, а не просматривает каждую строку Запрос с несколькими LIKE '%слово%' может заставить базу проверять длинные тексты строка за строкой. Для поиска по словам используется другая структура. Инвертированный индекс хранит словарь терминов и списки документов, в которых они встречаются. Для условия AND списки пересекаются, для OR — объединяются. Позиции слов позволяют искать фразы, частоты помогают оценивать релевантность. В разборе устройства поискового движка есть интерактивные примеры этих операций, а также объяснение BM25 и выбора лучших результатов. При этом найти совпадения и вернуть наиболее подходящие документы — разные этапы. Быстрый отбор кандидатов ещё не решает задачу ранжирования. И заменять LIKE на полнотекстовый поиск механически нельзя: поиск произвольной подстроки и поиск нормализованных слов имеют разную семантику.

Open in Telegram
Views240−9%vs avg
Forwards4
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
11 h150
29 h224
66 h240
  1. After 24 hours224
  2. Total to date240
#3087Photo

Uber сократил память кеша переводов с 800 до 80–120 МБ Большинство переводов в сервисе редко запрашивали, но все они постоянно занимали память. При обновлении рядом со старым кешем появлялась новая копия — в приведённом примере ещё 800 МБ. В разборе Uber описана гибридная схема: востребованные значения остаются в памяти, остальные лежат на локальном диске. В памяти хранятся компактные метаданные, позволяющие быстро найти запись. Хранилище разделили на 256 частей с отдельными блокировками. Политику вытеснения тоже пришлось адаптировать: обновлять общую структуру при каждом чтении оказалось слишком дорого. При очередной загрузке кеш заранее наполняют переводами, которые использовали за последние 15 минут. Это уменьшает волну обращений к диску после обновления. В примере расход памяти составил 80–120 МБ, а для обновления понадобилось около 40 МБ дополнительных метаданных. При оптимизации кеша стоит измерять и обычное потребление, и пик во время его замены.

Open in Telegram
Views256−3%vs avg
Forwards1
Reactions—
Comments0
Views growthHide views growth

Views growth

Hours after publication

Show as table
Hours after publicationViews
0 h0
15 h206
33 h244
71 h256
  1. Total to date256