Посты канала Сохранёнки программиста

сначала новые

#3116Фото
Просмотры112−58%к среднему
Пересылки2
Реакции1
Комментарии0
#3115Фото
Просмотры165−38%к среднему
Пересылки1
Реакции—
Комментарии0
#3114Фото

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

Открыть в Telegram
Просмотры202−24%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч115
17 ч147
29 ч202
  1. Через 6 часов115
  2. Через 24 часа202
  3. Всего сейчас202
#3113Текст

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

Открыть в Telegram
Просмотры224−15%к среднему
Пересылки0
Реакции1
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч168
33 ч224
  1. Всего сейчас224
#3112Фото

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

Открыть в Telegram
Просмотры237−10%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч139
17 ч181
29 ч237
  1. Через 6 часов139
  2. Через 24 часа237
  3. Всего сейчас237
#3111Фото

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

Открыть в Telegram
Просмотры242−9%к среднему
Пересылки2
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч176
33 ч242
  1. Всего сейчас242
#3110Фото
Просмотры283+7%к среднему
Пересылки2
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч117
17 ч168
29 ч234
77 ч283
  1. Через 6 часов117
  2. Через 24 часа234
  3. Всего сейчас283
#3109Фото
Просмотры260−2%к среднему
Пересылки2
Реакции0
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч155
33 ч232
69 ч260
  1. Всего сейчас260
#3108Текст
Просмотры275+4%к среднему
Пересылки0
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
4 ч109
29 ч220
77 ч275
  1. Через 6 часов109
  2. Через 24 часа220
  3. Всего сейчас275
#3107Текст
Просмотры269+2%к среднему
Пересылки2
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч149
69 ч269
  1. Всего сейчас269
#3106Текст
Просмотры278+5%к среднему
Пересылки0
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
4 ч119
16 ч160
28 ч206
77 ч278
  1. Через 6 часов119
  2. Через 24 часа206
  3. Всего сейчас278
#3105Текст
Просмотры277+5%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
8 ч174
33 ч244
69 ч277
  1. Всего сейчас277
#3104Текст
Просмотры241−9%к среднему
Пересылки0
Реакции—
Комментарии1
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч126
15 ч167
28 ч241
  1. Через 6 часов126
  2. Через 24 часа241
  3. Всего сейчас241
#3103Текст
Просмотры282+7%к среднему
Пересылки3
Реакции—
Комментарии1
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч180
32 ч257
69 ч282
  1. Через 24 часа257
  2. Всего сейчас282
#3102Текст
Просмотры311+18%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
6 ч139
29 ч252
76 ч311
  1. Через 6 часов139
  2. Через 24 часа252
  3. Всего сейчас311
#3101Текст
Просмотры304+15%к среднему
Пересылки0
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
1 ч70
10 ч203
33 ч274
68 ч304
  1. Через 1 час70
  2. Всего сейчас304
#3100Фото

В первых тестах 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

Открыть в Telegram
Просмотры306+16%к среднему
Пересылки4
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
10 ч181
18 ч191
30 ч255
76 ч306
  1. Через 24 часа191
  2. Всего сейчас306
#3099Фото

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

Открыть в Telegram
Просмотры281+6%к среднему
Пересылки3
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
4 ч128
14 ч210
22 ч217
25 ч232
67 ч281
  1. Через 24 часа232
  2. Всего сейчас281
#3098Фото

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

Открыть в Telegram
Просмотры306+16%к среднему
Пересылки6
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
2 ч126
12 ч210
34 ч280
42 ч283
66 ч306
  1. Через 1 час126
  2. Всего сейчас306
#3097Фото

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

Открыть в Telegram
Просмотры305+15%к среднему
Пересылки1
Реакции0
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
6 ч209
16 ч254
28 ч276
46 ч291
70 ч305
  1. Через 6 часов209
  2. Через 24 часа276
  3. Всего сейчас305
#3096Фото

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

Открыть в Telegram
Просмотры281+6%к среднему
Пересылки2
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч111
14 ч143
26 ч242
66 ч281
  1. Через 6 часов111
  2. Через 24 часа242
  3. Всего сейчас281
#3095Фото

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

Открыть в Telegram
Просмотры2640%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч149
30 ч233
70 ч264
  1. Через 24 часа233
  2. Всего сейчас264
#3094Фото
Просмотры263−1%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
6 ч113
9 ч135
29 ч205
72 ч263
  1. Через 6 часов113
  2. Через 24 часа205
  3. Всего сейчас263
#3093Фото

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

Открыть в Telegram
Просмотры267+1%к среднему
Пересылки2
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
11 ч150
13 ч162
33 ч210
76 ч267
  1. Всего сейчас267
#3092Фото

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.

Открыть в Telegram
Просмотры279+5%к среднему
Пересылки4
Реакции—
Комментарии1
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
10 ч155
30 ч223
33 ч228
74 ч279
  1. Через 24 часа223
  2. Всего сейчас279
#3091Фото

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

Открыть в Telegram
Просмотры248−6%к среднему
Пересылки1
Реакции0
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
2 ч88
14 ч179
35 ч230
37 ч231
66 ч248
  1. Всего сейчас248
#3090Фото

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

Открыть в Telegram
Просмотры263−1%к среднему
Пересылки2
Реакции1
Комментарии2
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
5 ч129
14 ч163
34 ч221
57 ч248
77 ч263
  1. Через 6 часов129
  2. Всего сейчас263
#3089Фото

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

Открыть в Telegram
Просмотры260−2%к среднему
Пересылки3
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
9 ч193
26 ч228
61 ч257
69 ч260
  1. Через 24 часа228
  2. Всего сейчас260
#3088Фото

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

Открыть в Telegram
Просмотры240−9%к среднему
Пересылки4
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
11 ч150
29 ч224
66 ч240
  1. Через 24 часа224
  2. Всего сейчас240
#3087Фото

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

Открыть в Telegram
Просмотры256−3%к среднему
Пересылки1
Реакции—
Комментарии0
Динамика просмотровСкрыть динамику

Рост просмотров

Часов после публикации

Показать таблицей
Часов после публикацииПросмотры
0 ч0
15 ч206
33 ч244
71 ч256
  1. Всего сейчас256