JuniorPerformance Marketer > Google Ads > Метрики рекламных кампаний
Короткий ответ CPL рассчитывается по числу лидов, тогда как CPA может относиться к любому действию. Платформе часто проще обучаться на лидах, чем на редких закрытых продажах. Как это работает подробнее CPL = Расход / Число лидов; в отличие от общего CPA, CPL не включает покупки, подписки и другие действия — только факт получения контакта потенциального клиента. На практике платформы часто позволяют оптимизировать кампанию именно на цель «лид» как промежуточное событие, даже если итоговая бизнес-цель — закрытая сделка, потому что по лидам алгоритму проще набрать статистику. Пример кода Что использовать на практике Сравнивайте CPL вместе с долей квалифицированных лидов и переходом из лида в оплату; проверьте качество контактов из разных типов форм. Подводные камни Самый дешёвый лид может оказаться нецелевым или недоступным. Без контроля CRM низкий CPL создаёт ложное впечатление эффективности.
cpllead-generation
JuniorData Analyst > SQL и данные > SQL
Короткий ответ CROSS JOIN соединяет каждую строку одной таблицы с каждой строкой другой без какого-либо условия, образуя декартово произведение; он полезен, когда нужно специально построить все комбинации, например, все пары «дата × товар» для последующего заполнения пропусков. Как это работает подробнее если в первой таблице M строк, а во второй N, результат CROSS JOIN содержит M×N строк — каждая строка первой таблицы сочетается с каждой строкой второй. Обычный JOIN с условием в ON — это, по сути, CROSS JOIN с последующей фильтрацией только совпадающих пар. Пример кода Что использовать на практике На практике: осознанный CROSS JOIN часто используют вместе с календарной таблицей дат, чтобы получить «все дни × все товары» и затем через LEFT JOIN подставить реальные продажи, явно показывая дни без продаж как 0, а не как отсутствие строки. Результат: Для 30 дней и 10 товаров результат — ровно 300 строк. Проверка: SELECT COUNT(*) результата должен равняться произведению количества строк в calendar и products. Под
cartesian-productcross-join
MiddlePerformance Marketer > Google Ads > Атрибуция и оценка
Короткий ответ Data-driven атрибуция распределяет ценность конверсии между несколькими каналами/кликами на основе статистической модели, которая сравнивает пути пользователей, завершившихся конверсией, с путями, которые не завершились конверсией, а не присваивает 100% ценности последнему клику. Как это работает подробнее Алгоритм анализирует большой объём путей конверсии (и неконверсионных путей) конкретного рекламодателя и оценивает, какой вклад вносит каждое касание в вероятность конверсии, используя методы на основе данных (например, сравнение контрфактических путей), а не фиксированное правило вроде «весь вклад последнему клику». Статистическая модель оценивает не абсолютную «правду» о вкладе канала, а относительную значимость различий между путями с конверсией и без неё — поэтому её выводы стоит воспринимать как вероятностную оценку, а не точное измерение причинного эффекта каждого канала. Что использовать на практике Практика. Для работы data-driven атрибуции нужен минимальный объём данных (определённое
analyticsattribution
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Deployment поддерживает заданное число реплик, размещаемых планировщиком по любым подходящим узлам, а DaemonSet гарантирует ровно один экземпляр Pod на каждом (или на выбранном подмножестве) узле кластера — число реплик определяется числом узлов, а не задаётся вручную. Как это работает подробнее DaemonSet автоматически добавляет Pod при появлении нового узла и удаляет при выводе узла из кластера, минуя обычный процесс планирования по ресурсам в привычном смысле — по умолчанию он игнорирует часть ограничений, чтобы гарантированно разместиться на каждом узле (с учётом taints/tolerations). Пример кода Что использовать на практике Практика. DaemonSet используют для инфраструктурных агентов, которые должны работать на каждом узле: сборщики логов (Fluentd/Fluent Bit), экспортеры метрик (node-exporter), сетевые плагины (CNI), агенты безопасности. Обычное приложение с бизнес-логикой почти никогда не разворачивают через DaemonSet. Подводные камни Риски. использовать DaemonSet для масштабирования обычног
daemonsetdeployment
MiddleDevOps Engineer > Контейнеры и доставка > Безопасность контейнеров
Короткий ответ Переменные окружения контейнера видны через docker inspect, попадают в логи ошибок и иногда в системы мониторинга процессов, а Docker secrets монтируются как файлы в tmpfs только тем сервисам, которым явно разрешён доступ, не отображаясь в обычном docker inspect сервиса. Как это работает подробнее любая переменная, заданная через -e/environment, хранится в метаданных контейнера в открытом виде и доступна любому, кто может выполнить docker inspect по этому контейнеру, а также наследуется всеми дочерними процессами внутри контейнера. Docker secrets (в режиме Swarm) передаются зашифрованными через Raft log менеджерам кластера и монтируются только в tmpfs конкретных сервисов, которым явно назначен секрет — после остановки сервиса файл секрета исчезает вместе с tmpfs. Пример кода Что использовать на практике Практика. для production-данных (пароли БД, API-ключи) предпочтительнее механизмы, монтирующие секрет как файл, доступный только внутри контейнера и не отображаемый в общих метаданных — это могу
container-securitydocker
JuniorData Analyst > SQL и данные > Качество данных
Короткий ответ В ELT порядок этапов — Extract, Load, Transform: исходные данные сохраняются в raw-слое, а витрины строятся уже внутри DWH. Как это работает подробнее Облачные колоночные хранилища позволяют независимо масштабировать вычисления и хранение. Поэтому трансформации удобно описывать SQL-моделями, а при изменении логики пересчитывать их из неизменяемого raw-слоя. Повторная обработка. Не нужно заново обращаться к источнику при изменении модели. Аудит. Сырые данные помогают воспроизвести результат и расследовать ошибки. Пример кода Что использовать на практике Разделяйте raw, staging и mart-слои и задавайте сроки хранения для каждого. Добавляйте тесты типов, обязательности и уникальности сразу после загрузки. Подводные камни Raw без контроля. ELT не отменяет входные проверки и мониторинг схемы. Неконтролируемая стоимость. Частые полные пересчёты и бесконечное хранение staging увеличивают расходы.
cloud-data-warehousedbt
MiddleDevOps Engineer > Контейнеры и доставка > Файловые системы Linux
Короткий ответ ext4 — зрелая, универсальная файловая система с хорошей поддержкой малых и средних нагрузок и простым уменьшением размера раздела; XFS лучше масштабируется на больших и очень больших файлах/томах и при высокой параллельной записи благодаря выделенным журналам по аллокационным группам, но не поддерживает уменьшение размера раздела после создания. Как это работает подробнее XFS использует allocation groups, что позволяет параллельно обрабатывать запросы записи в разные группы почти без конкуренции за блокировки, тогда как классическая архитектура ext4 в сценариях с множеством параллельных потоков записи может упираться в более выраженную внутреннюю сериализацию; обе файловые системы являются журналируемыми и обеспечивают схожий уровень защиты метаданных при сбое питания. Пример кода Что использовать на практике Практика. для баз данных и хранилищ с большими файлами и высокой параллельной нагрузкой записи (видео, бэкапы, объектные хранилища) чаще выбирают XFS, а для небольших корневых разделов и с
ext4filesystems
JuniorPython Developer > Основы Python > Основы Python
Короткий ответ F-строки (f-strings) — форматированные строковые литералы, появившиеся в Python 3.6: перед строкой ставится буква f, а переменные и выражения подставляются прямо внутри фигурных скобок. Они лаконичнее метода .format(), читаются лучше и обычно работают быстрее. Как это работает подробнее Преимущества f-строк связаны с синтаксисом, читаемостью и производительностью. Встраивание выражений. F-строка подставляет переменные и выражения прямо в литерал, тогда как в .format() имена приходится дублировать в аргументах. Любые выражения. Внутри фигурных скобок допустимо любое валидное выражение Python, например f'{price * (1 + tax_rate):.2f}' — цена вычисляется прямо в строке и сразу форматируется с двумя знаками после запятой. Скорость. Значения вычисляются при разборе строкового литерала, а не через вызов отдельного метода, поэтому f-строки, как правило, быстрее .format(). Наследие. Метод .format() и оператор % всё ещё встречаются в старых проектах, поэтому их нужно уметь читать. Пример кода Что использ
formatf-strings
JuniorData Analyst > SQL и данные > SQL
Короткий ответ FULL JOIN сохраняет все строки из обеих таблиц независимо от того, нашлось ли совпадение, заполняя NULL там, где пары нет с любой стороны, — это полезно, например, при сверке двух источников данных, когда нужно увидеть записи, которые есть только в одном из них. Как это работает подробнее FULL JOIN можно представить как объединение результатов LEFT JOIN и RIGHT JOIN — ни одна строка ни из левой, ни из правой таблицы не теряется, даже если для неё нет пары на другой стороне. Пример кода Что использовать на практике типичный сценарий — сверка данных из двух систем учёта (например, «заказы в CRM» и «заказы в биллинге»): FULL JOIN по идентификатору заказа с последующей проверкой WHERE a.order_id IS NULL OR b.order_id IS NULL сразу покажет записи, которые есть только в одной из систем — это именно те случаи, которые нужно расследовать. Результат — заказы, расходящиеся между системами. Проверка: вручную найти один заказ из этого списка в обеих исходных таблицах и убедиться, что он действительно отсут
data-reconciliationfull-join
JuniorPython Developer > Основы Python > SQL-запросы
Короткий ответ WHERE фильтрует отдельные строки до группировки, а HAVING фильтрует уже готовые группы после агрегации — то есть HAVING может ссылаться на результат агрегатной функции, а WHERE нет. Как это работает подробнее Порядок логического выполнения запроса: FROM/JOIN → WHERE → GROUP BY → HAVING → SELECT → ORDER BY. WHERE отбрасывает строки до группировки, снижая объём данных для агрегации; HAVING применяется уже к результатам COUNT/SUM/AVG по каждой группе. Пример кода Что использовать на практике Практика. Если условие можно сформулировать на уровне отдельной строки (например, status = 'active'), его стоит вынести в WHERE — это эффективнее. HAVING используют только для условий на агрегат, например HAVING COUNT(*) > 5. Подводные камни Ошибка. Пытаются написать WHERE COUNT(*) > 5 — это синтаксическая ошибка, так как на момент WHERE агрегат ещё не вычислен; либо необоснованно переносят в HAVING условия, которые можно и нужно проверить в WHERE.
aggregationpostgresql