MiddleDevOps Engineer > Контейнеры и доставка > Сети Docker
Короткий ответ По умолчанию docker-compose автоматически создаёт для проекта одну пользовательскую bridge-сеть и подключает к ней все сервисы, давая им DNS-резолв по имени сервиса "из коробки"; для изоляции отдельных сервисов друг от друга (например, чтобы фронтенд не мог напрямую обращаться к БД) нужно явно объявить несколько сетей в секции networks и назначить сервисам только нужные. Как это работает подробнее без явной секции networks compose создаёт сеть с именем вида PROJECT_default и добавляет туда все описанные сервисы — поведение по сути эквивалентно ручному docker network create плюс подключение каждого контейнера. Если же в compose-файле заданы несколько сетей и у каждого сервиса явно указано, к каким из них он подключён, сервисы, не состоящие в общей сети, не смогут резолвить и достигать друг друга. Пример кода Что использовать на практике Практика. типичная схема — сеть frontend для веб-сервера и API, и отдельная сеть backend для API и БД, где веб-сервер в backend не присутствует и физически не мо
containersdocker
JuniorDevOps Engineer > Контейнеры и доставка > CI/CD и управление релизами
Короткий ответ Стадия `build` превращает исходный код в исполняемый артефакт (образ, бинарник, пакет), а стадия `deploy` доставляет уже готовый артефакт в целевое окружение и запускает его там; без собранного артефакта стадии деплоя либо нечего разворачивать, либо она ошибочно соберёт код «на лету», теряя воспроизводимость. Как это работает подробнее `build` отвечает за компиляцию, установку зависимостей и упаковку; `deploy` отвечает за обновление инфраструктуры — например, применение Kubernetes-манифеста, обновление образа в Deployment или копирование файлов на сервер. Это разделение ответственности позволяет повторно использовать один артефакт для разных окружений. Пример кода Что использовать на практике На практике. если смешать сборку и деплой в одной команде/скрипте, сложнее тестировать стадии по отдельности и труднее гарантировать, что в staging и в production попал один и тот же код. Разделение также ускоряет повторные деплои — не нужно пересобирать, если нужно просто откатиться на предыдущую версию.
artifactscicd-and-release-management
MiddlePerformance Marketer > Google Ads > Тестирование гипотез и запуск изменений
Короткий ответ Тест на уровне кампании сравнивает целиком разные структуры/стратегии (например, разный биддинг или структуру таргетинга) с раздельными бюджетами и аукционами, тогда как тест на уровне ad set/группы объявлений сравнивает варианты внутри одной и той же структуры кампании и общего бюджета. Как это работает подробнее При тестировании на уровне кампании алгоритмы обучения и аукцион работают независимо для каждой кампании, что может само по себе создавать разницу в результатах, не связанную с тестируемым изменением; на уровне ad set варианты чаще конкурируют и обучаются в более сопоставимых условиях. В некоторых платформах есть специальные инструменты именно для тестирования на уровне кампании (Campaign Experiments в Google Ads), которые частично решают проблему независимого обучения алгоритма. Пример. Тест A: новая структура кампании с автобиддингом (отдельная кампания, старт в понедельник) Тест B: старая структура (отдельная кампания, запущена месяц назад) Результаты будут отражать не только разни
ab-testingad-creatives
JuniorSMM Manager > Общее > Брендбук и Tone of Voice
Короткий ответ Голос (voice) — это постоянный характер бренда, который не меняется (например, «дружелюбный эксперт»), а тон (tone) — это то, как этот характер звучит в конкретной ситуации (празднично, сочувственно, нейтрально), и оба понятия вместе формируют полный ToV. Как это работает подробнее голос остаётся стабильным независимо от повода, а тон адаптируется к контексту публикации — поздравление с праздником звучит иначе, чем ответ на жалобу, хотя характер бренда («дружелюбный эксперт») не меняется. Что использовать на практике Подход. в гайдлайне описывают голос один раз, а для тона приводят примеры адаптации к разным ситуациям (радостная новость, извинение, нейтральный анонс). Пример. Голос бренда — «заботливый помощник». В тоне это проявляется по-разному: пост о скидке — «Ура, у нас хорошие новости! », пост об отзыве производства из-за дефекта — «Нам важно, что вы в безопасности. Рассказываем, что случилось и что мы делаем». Характер (забота) общий, тон адаптирован к серьёзности повода. Проверка — соот
brand-guidelinesbrand-management
JuniorJava Developer > Java Core > Collections
Короткий ответ Исторический класс Vector (Java 1.0) делает все свои методы synchronized, то есть каждый вызов защищён монитором на уровне объекта; ArrayList появился позже (Java 2) и не синхронизирован, поэтому в однопоточном коде работает заметно быстрее. Vector при переполнении удваивает размер массива (или растёт на capacityIncrement), а ArrayList увеличивает ёмкость примерно в полтора раза: oldCapacity + (oldCapacity >> 1). Как это работает подробнее Оба класса реализуют интерфейс List и внутри используют обычный массив, поэтому логика работы похожа. Разница в производительности — следствие синхронизации: у Vector она глобальная и приходится на каждый вызов, у ArrayList её нет вовсе. Из-за этого Vector считается устаревшим (legacy), хотя и не удалён из стандартной библиотеки. Потокобезопасность: Vector синхронизирован, но такая «безопасность» покупается блокировкой на каждой операции. Современная замена: при необходимости синхронизации берут ArrayList с Collections.synchronizedList(...) либо потокобезопас
arraylistcollections
JuniorDevOps Engineer > Контейнеры и доставка > Хранение данных
Короткий ответ Bind mount монтирует конкретный, заранее известный путь файловой системы хоста внутрь контейнера; named volume — это область хранения, полностью управляемая самим Docker, физическое расположение которой не нужно знать пользователю. Как это работает подробнее при bind mount (-v /host/path:/container/path) пользователь сам указывает и контролирует путь на хосте — файлы там видны и редактируемы обычными средствами ОС вне Docker. При named volume (-v myvolume:/container/path) Docker сам создаёт и обслуживает хранилище, абстрагируя пользователя от реального расположения на диске; доступ к содержимому идёт только через Docker-команды или сам контейнер. Пример кода Что использовать на практике Практика. bind mount удобен для разработки (например, монтирование исходного кода проекта для live-перезагрузки) и для доступа к специфическим файлам хоста (сертификаты, сокеты). Named volume предпочтителен для production-данных приложений (БД, очереди), так как не зависит от конкретной структуры файловой систем
bind-mountscontainers
MiddlePython Developer > Основы Python > Кеширование
Короткий ответ Cache-aside — приложение само читает из кеша, при промахе идёт в БД и кладёт результат в кеш; write-through — запись сразу идёт и в БД, и в кеш синхронно в рамках одной операции обновления. Как это работает подробнее При cache-aside кеш заполняется лениво по факту чтения, инвалидация — отдельный шаг при записи; при write-through обновление кеша встроено в транзакцию записи, и кеш никогда не «пустой» для изменённых данных. Пример кода Что использовать на практике Практика. Cache-aside выбирают, когда читаемые данные — лишь часть всех данных; write-through — когда критична согласованность кеша сразу после записи и профиль чтения предсказуем. Подводные камни Риск. При cache-aside забывать инвалидировать кеш при записи; при write-through не обрабатывать сбой записи в кеш как некритичную ошибку — запись в БД должна проходить, даже если кеш временно недоступен.
cache-invalidationcaching
JuniorPython Developer > Основы Python > Зависимости Python
Короткий ответ pip install flask ставит последнюю доступную версию без гарантии, что завтра или на другой машине будет установлена та же версия, а flask==2.3.3 фиксирует точную версию — это нужно для воспроизводимости сборок и предсказуемого поведения приложения в разных средах. Как это работает подробнее pip по умолчанию разрешает диапазон версий, совместимый с окружением, и может подтянуть новый релиз с изменённым поведением. Точная фиксация убирает эту неопределённость. Пример кода Что использовать на практике Рекомендация. в requirements.txt для приложений фиксируют точные версии всех зависимостей (через pip freeze или pip-compile), чтобы установка давала одинаковый набор пакетов в dev, CI и production. Для библиотек задают более широкие диапазоны. Подводные камни Риск. фиксировать только верхнеуровневые пакеты, не учитывая транзитивные зависимости; не обновлять версии годами, накапливая неисправленные уязвимости; путать назначение зависимостей приложения и переиспользуемой библиотеки.
dependenciespip
JuniorData Analyst > SQL и данные > SQL
Короткий ответ UNION объединяет совместимые результаты и затем устраняет одинаковые строки. UNION ALL просто добавляет строки второго результата к первому и сохраняет повторы. Как это работает подробнее Оба запроса должны возвращать одинаковое число столбцов с совместимыми типами в одинаковом порядке. Имена столбцов итогового набора обычно берутся из первого SELECT. Удаление дублей требует дополнительной сортировки или хеширования. Главное различие, однако, семантическое: две одинаково выглядящие строки могут представлять два реальных события. Пример кода Что использовать на практике События и факты. Используйте UNION ALL, если каждая исходная строка должна участвовать в подсчёте. Уникальный справочник. Используйте UNION, только когда действительно требуется множество уникальных строк. Подводные камни Скрытая потеря. Если не выбрать уникальный идентификатор события, UNION может удалить реальную запись. Несовпадающие столбцы. Разный порядок полей может привести к ошибке типов или неверной интерпретации данных.
deduplicationmetrics
JuniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ value_counts() — это быстрый способ посчитать частоты значений одного Series с сортировкой по убыванию по умолчанию, а groupby(...).size() — более общий инструмент, который можно использовать при группировке по нескольким столбцам сразу. Как это работает подробнее df['col'].value_counts() считает, сколько раз встречается каждое уникальное значение в столбце, и по умолчанию исключает NaN (есть параметр dropna=False, чтобы включить); groupby(['col1','col2']).size() считает количество строк в каждой комбинации значений нескольких столбцов. Пример кода Что использовать на практике На практике: value_counts() удобен для быстрого взгляда на распределение одной категориальной переменной, а groupby+size — когда нужно посчитать количество по пересечению нескольких признаков (например, количество заказов по стране и статусу одновременно). Проверка: сумма value_counts() равна 3, хотя всего в таблице 4 строки — разница в 1 указывает на пропуск, который не попал в подсчёт. Подводные камни Частые ошибки: исп
aggregationgroupby