JuniorPython Developer > Основы Python > Flask
Короткий ответ Режим debug=True включает интерактивный веб-дебаггер Werkzeug, который при необработанном исключении позволяет выполнять произвольный Python-код в браузере через консоль отладчика — это критическая угроза безопасности при доступности приложения извне. Как это работает подробнее В debug-режиме Flask (через Werkzeug) перехватывает необработанные исключения и показывает подробную трассировку с интерактивной консолью на каждом кадре стека; эта консоль по умолчанию защищена только PIN-кодом, который при определённых условиях можно подобрать или который виден в логах запуска. Пример кода Что использовать на практике Практика. Debug-режим полезен только на локальной машине разработчика, недоступной из интернета. В production используют debug=False (или вообще не запускают через встроенный app.run, а используют production WSGI-сервер — gunicorn/uWSGI) и отдельный централизованный логгер ошибок (например, Sentry). Подводные камни Риск. Включают debug=True «для удобства отладки» на staging/production сер
backendflask
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ Переменные окружения, переданные из ConfigMap, читаются процессом только один раз при старте контейнера и не обновляются без перезапуска; файлы, смонтированные как volume из ConfigMap, обновляются на диске автоматически (с задержкой синхронизации kubelet), но приложение должно само отслеживать изменение файла, чтобы подхватить новую конфигурацию без перезапуска. Как это работает подробнее при использовании envFrom/env.valueFrom.configMapKeyRef значения подставляются в переменные окружения процесса на старте контейнера операционной системой — после этого никакая синхронизация с Kubernetes API не происходит. При монтировании ConfigMap как volume kubelet периодически (обычно за время, близкое к TTL кэша kubelet, порядка минуты) обновляет содержимое файлов в уже запущенном контейнере, но само приложение должно реализовать механизм отслеживания изменений файла (например, через inotify или периодический опрос). Пример кода Что использовать на практике Практика. для конфигурации, которая должна менять
configmapconfiguration
JuniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Тег `latest` мутабелен — он может указывать на разные образы в разное время, поэтому невозможно однозначно определить, какая именно версия кода запущена, и трудно гарантированно откатиться; вместо него нужно использовать неизменяемый тег, привязанный к конкретной версии или коммиту, например семантическую версию (`1.5.0`) или хэш коммита (`sha-abc1234`). Как это работает подробнее `latest` — это просто ещё один тег, который по соглашению Docker присваивается образу, если тег не указан явно; ничто не мешает каждому новому `docker build`/`push` перезаписывать его на другой образ. Kubernetes при этом может закэшировать старый образ на ноде и не подтянуть новый, если `imagePullPolicy` не настроена явно на `Always`, что приводит к непредсказуемому поведению подов. Пример кода Что использовать на практике На практике. с конкретным неизменяемым тегом или digest'ом (`image@sha256:...`) можно точно воспроизвести, какой код работал в момент инцидента, откатиться на конкретную прошлую версию и избежать си
cicd-and-release-managementcontainer-images
JuniorDevOps Engineer > Контейнеры и доставка > Реестры и распространение образов
Короткий ответ latest — обычный текстовый тег, который может в разное время указывать на совершенно разные версии образа, поэтому он не даёт воспроизводимости развёртывания и затрудняет точный откат на известную рабочую версию. Как это работает подробнее тег в Docker — просто указатель (как ветка в Git) на конкретный digest образа; при каждой публикации новой сборки с тем же тегом latest указатель переставляется на новый digest, а старый остаётся доступен только по digest, если его явно не сохранили. Что использовать на практике Практика. для воспроизводимых развёртываний используют конкретные версии (myapp:1.4.2) или ещё надёжнее — digest (myapp@sha256:...), которые однозначно фиксируют содержимое образа. Это позволяет точно знать, какая версия кода работает в каждом окружении, и безопасно откатываться. Подводные камни Риск. деплоят myapp:latest в проде и через время не могут понять, какая именно версия кода сейчас запущена, потому что каждый docker pull myapp:latest после новой сборки меняет фактическое сод
container-imagescontainer-registry
JuniorPerformance Marketer > Google Ads > Устойчивость результатов и управление рисками
Короткий ответ Единственная узкая look-alike аудитория ограничена по размеру и быстрее насыщается при увеличении бюджета, что повышает частоту и CPA. Подготовьте несколько аудиторий разных размеров и типов, чтобы распределять расходы и иметь альтернативу для масштабирования. Как это работает подробнее При бюджете $500 в день аудитория look-alike 1% размером около 50 тысяч быстро достигла Frequency 6+, а CPA удвоился. Добавление look-alike 3% около 250 тысяч и теста интересов распределило показы и удержало частоту около 2–3. Что использовать на практике Тестируйте look-alike разных процентов, интересы и ретаргетинг; оценивайте, какие сегменты выдерживают рост бюджета. Подводные камни Не масштабируйте весь бюджет только на аудитории, которые были лучшими раньше: узкий сегмент может быстро исчерпаться.
audience-diversificationaudience-saturation
MiddlePython Developer > Основы Python > Безопасность приложения
Короткий ответ pickle и небезопасный yaml.load могут при десериализации выполнять произвольный код, встроенный в сериализованные данные, поэтому для данных из недоверенного источника нужно использовать безопасные форматы: json.loads для универсальных данных и yaml.safe_load вместо yaml.load для YAML. Как это работает подробнее Формат pickle может описывать вызов практически любого объекта Python, включая классы с произвольным кодом в __reduce__, который выполнится в процессе десериализации; аналогично небезопасный YAML-загрузчик по умолчанию в PyYAML поддерживает теги для создания произвольных Python-объектов. Пример кода Что использовать на практике Практика. pickle допустимо использовать только для данных, которые приложение само сериализовало и хранит в доверенном месте (внутренний кэш одного и того же сервиса), но не для данных, пришедших по сети от клиента или из очереди, доступной внешним системам; для межсервисного обмена предпочтительны json, protobuf или msgpack. Подводные камни Риск. Используют pick
deserializationpickle
JuniorPerformance Marketer > Google Ads > Аудитории и ретаргетинг
Короткий ответ Чем меньше исходная аудитория, тем меньше сигналов о характеристиках и поведении есть у алгоритма, из-за чего построенная по ней look-alike аудитория получается менее точной и может включать много нерелевантных пользователей. Как это работает подробнее Алгоритм ищет статистические закономерности в seed-аудитории (демография, интересы, поведение), и при малом числе людей такие закономерности менее надёжны — модель может ошибочно обобщать случайные совпадения. Что использовать на практике На практике. Платформы обычно рекомендуют минимальный размер seed от нескольких сотен до пары тысяч человек; для более надёжного результата желательно использовать аудиторию с чётким общим признаком (например, именно покупатели, а не все посетители). Пример. Seed-аудитория всего 80 человек (покупатели за неделю) — платформа может предупредить о недостаточном размере аудитории или дать нестабильный результат. Проверка: сравнить рекомендованный минимальный размер seed в документации платформы с фактическим размеро
ad-platformsads-scripts
JuniorJava Developer > Java Core > JVM и память
Короткий ответ Потому что в момент запуска приложения у JVM ещё нет ни одного объекта класса, а метод main() нужно вызвать до создания каких-либо экземпляров. Объявление static позволяет JVM обратиться к методу через сам класс, без объекта, — это и есть вход в программу. Как это работает подробнее Каноническая сигнатура: public static void main(String[] args). Здесь public — доступность метода для JVM извне, void — метод ничего не возвращает, а String[] args — массив аргументов командной строки. Если убрать static, компиляция пройдёт, но при запуске JVM не найдёт подходящий метод и завершится ошибкой вида Main method is not static. Точка входа — JVM находит метод с канонической сигнатурой и вызывает его, не создавая экземпляр класса. Перегрузка — другие перегруженные варианты main() допустимы, но запускается только вариант с массивом String. Инициализация — первые объекты приложения создаются уже внутри main(), что решает проблему «курицы и яйца». Пример кода Что использовать на практике Всегда объявляй точку
entry-pointjava
MiddleJava Developer > Java Core > Multithreading
Короткий ответ Потому что эти методы работают с монитором объекта, а не с потоком: поток ожидает на конкретном объекте-«замке», и уведомление тоже отправляется через объект. Встроенный монитор есть у любого наследника Object, поэтому естественно разместить методы ожидания и уведомления в самом Object, чтобы их можно было вызывать для любого объекта-монитора. Как это работает подробнее Механика такая: поток вызывает someObject.wait() из синхронизированного блока по someObject, освобождает его монитор и засыпает, а другой поток вызывает notify()/notifyAll() на том же объекте, чтобы разбудить ожидающих. Именно привязка к объекту позволяет независимо синхронизироваться на разных «замках»: ожидание на одном объекте не мешает потокам работать с другим. notify() будит один произвольный поток из очереди ожидания на мониторе, notifyAll() — все ожидающие, после чего они конкурируют за монитор. notifyAll() безопаснее в большинстве сценариев: он снижает риск «потерянного уведомления». Пример кода Что использовать на прак
javamonitor
MiddleData Analyst > SQL и данные > SQL
Короткий ответ Простое среднее арифметическое долей по группам (AVG долей) игнорирует разный размер этих групп, поэтому правильный способ — считать взвешенную конверсию как SUM(converted) / SUM(total) по всем строкам сразу, а не усреднять уже готовые проценты. Как это работает подробнее если в регионе A было 10 визитов и 5 конверсий (50%), а в регионе B — 1000 визитов и 300 конверсий (30%), простое среднее долей даст (50%+30%)/2 = 40%, что никак не отражает реальную общую конверсию (5+300)/(10+1000) ≈ 29.4% — потому что простое среднее не учитывает, что регион B весит в данных гораздо больше. Пример кода Что использовать на практике Практика. эта разница становится особенно важной (и может приводить к парадоксу Симпсона), когда сравнивают агрегированные группы с сильно разным объёмом — например, конверсия по дням недели, по странам с разным трафиком или по когортам разного размера. Перед усреднением процентных метрик всегда стоит спросить: «веса групп одинаковы или сильно различаются?» Проверка. Проверка: сра
aggregationconversion-rate