JuniorPerformance Marketer > Google Ads > Аудитории и ретаргетинг
Короткий ответ Последовательный ретаргетинг — это показ пользователю не одного объявления, а серии объявлений в определённом порядке, где каждое следующее сообщение логически продолжает предыдущее в зависимости от этапа воронки или времени с момента визита. Как это работает подробнее Аудитория делится на сегменты по времени или действию (например, «день 1–3», «день 4–7», «день 8–14» с момента визита), и для каждого сегмента показывается своё объявление с соответствующим сообщением — напоминание, затем оффер, затем ограниченная по времени скидка. Что использовать на практике На практике. Такой подход позволяет вести пользователя по воронке более персонализированно, чем один статичный баннер, который показывается одинаково всем вне зависимости от давности и глубины интереса. Пример. Сегмент A (день 1-3 после визита): объявление-напоминание о товаре. Сегмент B (день 4-7): объявление со скидкой 10%. Проверка: аудитории сегментов A и B не пересекаются (A исключает тех, кто уже в B, и наоборот). Подводные камни Час
ad-platformsads-scripts
JuniorPerformance Marketer > Google Ads > Данные, комплаенс и безопасность рекламных аккаунтов
Короткий ответ Принцип минимальных привилегий означает, что пользователь получает только ту роль и те действия, которые нужны для выполнения его работы, а не административный доступ по умолчанию. Как это работает подробнее В рекламных системах роли могут различать просмотр отчётов, управление кампаниями, работу с пользователями и доступ к биллингу. Разделение ограничивает ущерб при компрометации учётной записи. Назначайте по задачам. Сначала определите, какие действия человеку нужны, и только затем выберите подходящую роль. Что использовать на практике Пример для дизайнера. Если ему нужно только просматривать объявления, выдайте доступ только на просмотр кампаний без прав администратора и биллинга. Подводные камни Не выдавайте администратора на всякий случай. Широкие права превращают компрометацию одного логина в риск потери контроля над всем аккаунтом.
access-controlaccount-security
MiddlePython Developer > Основы Python > Транзакции и конкурентность
Короткий ответ Lost update возникает, когда две параллельные транзакции читают одно и то же значение, затем каждая вычисляет новое значение на основе прочитанного и записывает его обратно — одно из обновлений «теряется»; решение — атомарное обновление на уровне SQL (UPDATE ... SET x = x + 1) или явная блокировка строки (SELECT ... FOR UPDATE). Как это работает подробнее Проблема возникает из-за паттерна «прочитать в приложении → изменить в памяти → записать обратно» между двумя отдельными SQL-командами, в промежутке между которыми другая транзакция успевает сделать то же самое с тем же исходным значением. Пример кода Что использовать на практике Практика. Если логика обновления простая арифметика, надёжнее выразить её прямо в одном SQL-запросе (balance = balance - 100), который СУБД выполнит атомарно; если нужна сложная проверка перед записью, используют SELECT ... FOR UPDATE или optimistic locking. Подводные камни Ошибка. Читают значение через ORM (obj = Model.objects.get(...)), изменяют атрибут в Python и с
concurrencylost-update
SeniorJava Developer > Java Core > JPA и Hibernate
Короткий ответ Проблема N+1 — это 1 + N запросов вместо одного оптимального запроса с join: сначала выполняется один SELECT для получения N родительских записей, а затем для каждой из них — ещё по одному запросу за связанными данными. Чаще всего проявляется при ленивой загрузке ассоциаций, когда мы обходим список и у каждой сущности обращаемся к ленивой коллекции. Как это работает подробнее На небольших объёмах проблема незаметна, но с ростом данных производительность резко падает из-за множества обращений к базе. Все техники решения направлены на сокращение числа запросов, а выбор конкретного способа зависит от структуры запроса и сценария чтения. Fetch join: в HQL/JPQL связанные данные подгружаются в том же запросе через JOIN FETCH. @EntityGraph: в Spring Data JPA декларативно описывается граф загрузки — метод репозитория подтягивает указанные атрибуты одним запросом. Batch fetching: @BatchSize(size = 10) на сущности или коллекции грузит связи пачками, сокращая число запросов с N до N/size. EAGER: для связе
entitygraphfetch-join
MiddleData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Peeking — это многократная проверка p-value в ходе теста с остановкой эксперимента сразу, как только результат становится «значимым»; это резко завышает фактическую вероятность ложноположительного вывода по сравнению с заявленным уровнем альфа. Как это работает подробнее классический t-test или z-test рассчитан на одну проверку в конце фиксированного периода; при многократных промежуточных проверках накапливается вероятность хотя бы раз случайно увидеть p < 0.05 просто из-за флуктуаций, даже если реального эффекта нет. Пример кода Что использовать на практике На практике. избежать peeking можно несколькими способами: зафиксировать длительность и размер выборки заранее и смотреть на результат только один раз в конце; использовать методы, разработанные для последовательного анализа (sequential testing, группы с alpha spending, байесовские методы с учётом раннего прекращения), которые явно контролируют ошибку первого рода при множественных проверках. Важно заранее выбрать и задокументировать подхо
ab-testingpeeking
MiddleJava Developer > Java Core > Spring
Короткий ответ Профили (Profiles) — механизм Spring, позволяющий поддерживать разные конфигурации приложения для разных окружений: разработки (dev), тестирования (test) и продакшена (prod). Бин или класс конфигурации, помеченный @Profile, загружается только тогда, когда соответствующий профиль активирован. Как это работает подробнее Профили разделяют окружение-специфичные настройки: URL базы данных, уровень логирования, параметры интеграций. Это избавляет от ручного изменения конфигурации при переходе между окружениями и помогает защитить продакшен-настройки. Для отдельных профилей создаются файлы вида application-{profile}.properties или application-{profile}.yml, которые переопределяют общие настройки. Способы активации профиля: свойство spring.profiles.active=prod в application.properties, аргумент командной строки --spring.profiles.active=prod или переменная окружения SPRING_PROFILES_ACTIVE. Основной файл конфигурации Spring Boot — application.properties: порт сервера (server.port), подключение к базе дан
configurationenvironment
JuniorPython Developer > Основы Python > Профилирование и оптимизация
Короткий ответ Профилирование — это автоматизированный сбор статистики по всей программе (сколько раз вызвана каждая функция и сколько времени она заняла), а ручные замеры time.time() показывают время только в тех местах, где их явно расставили. Как это работает подробнее Профилировщик (например, cProfile) инструментирует вызовы функций на лету и строит таблицу: число вызовов, суммарное время внутри функции (tottime), время с учётом вложенных вызовов (cumtime). Это даёт полную картину без ручной разметки кода. Пример кода Что использовать на практике Практика. Профилирование запускают перед оптимизацией, чтобы не тратить время на ускорение кода, который и так быстрый. Для коротких скриптов достаточно cProfile, для долгоживущих сервисов — сэмплирующие профилировщики с меньшим overhead. Подводные камни Риск. Начинают оптимизировать код по интуиции, не измерив, где реально тратится время; забывают, что профилирование само по себе замедляет выполнение и искажает абсолютные цифры (относительные пропорции обычно по
cprofileperformance
JuniorData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Процентиль P показывает значение, ниже которого находится P% наблюдений; квартили — это 25-й, 50-й (медиана) и 75-й процентили, делящие упорядоченные данные на четыре равные по количеству части. Как это работает подробнее данные сортируются по возрастанию, затем для процентиля P берётся значение в соответствующей позиции ряда; при нецелой позиции используется интерполяция между соседними значениями (разные методы интерполяции могут давать чуть разные числа). В отчётах стоит явно указывать, какой процентиль используется (p90, p95, p99), так как разница в интерпретации между ними существенна. Пример кода Что использовать на практике На практике: процентили часто используют для метрик производительности — например, p95 времени ответа сервера показывает «почти худший» опыт, а не типичный, в отличие от среднего. Для бизнес-метрик (время обработки заявки) p90/p95 часто важнее среднего, так как отражают качество для «хвостовых» пользователей. Полезно дополнительно смотреть на разницу между соседними п
descriptive-statisticspercentiles
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Пул потоков — это набор заранее созданных рабочих потоков, которые переиспользуются для выполнения множества задач. Вместо создания нового потока на каждую задачу вы отправляете задачу в пул, её выполняет свободный поток, после чего поток не умирает, а возвращается в пул и ждёт следующую задачу. Пул убирает накладные расходы на создание и уничтожение потоков и ограничивает максимальное число одновременно работающих потоков. Как это работает подробнее В Java пулы реализованы через интерфейс ExecutorService и его основную реализацию ThreadPoolExecutor. Фабричные методы класса Executors: newFixedThreadPool(n) — фиксированное число потоков; newCachedThreadPool() — потоки по мере необходимости с переиспользованием простаивающих; newSingleThreadExecutor() — один рабочий поток с неограниченной очередью; newScheduledThreadPool() — для отложенных и периодических задач. Под капотом ThreadPoolExecutor настраивается параметрами: corePoolSize — основные потоки, maximumPoolSize — максимум, keepAliveTime — вр
executorexecutorservice
JuniorPerformance Marketer > Google Ads > Бюджет и пейсинг
Короткий ответ Standard-пейсинг равномерно распределяет расход бюджета в течение дня/периода, а accelerated-пейсинг старается потратить бюджет как можно быстрее, показывая объявление на максимально возможном числе подходящих аукционов без сдерживания темпа. Как это работает подробнее При standard-пейсинге система прогнозирует ожидаемый трафик на весь период и регулирует участие в аукционах, чтобы не израсходовать бюджет слишком рано. При accelerated-пейсинге такого сдерживания нет — бюджет может закончиться задолго до конца дня. Что использовать на практике На практике. Accelerated-пейсинг иногда используют для срочных акций с ограниченным временным окном, где важно максимально быстро захватить аукционы, но он повышает риск раннего исчерпания бюджета и пропуска части дня/аудитории. Пример. Дневной бюджet 10 000 руб. с accelerated-пейсингом полностью расходуется к 11:00, и кампания не показывается оставшуюся часть дня. Проверка: в отчёте по часам виден нулевой расход после утра. Подводные камни Частая ошибка.
ad-platformsads-scripts