MiddleJava Developer > Java Core > Multithreading
Короткий ответ CompletableFuture — класс из пакета java.util.concurrent, появившийся в Java 8 и реализующий интерфейсы Future и CompletionStage. Он представляет результат асинхронной операции и позволяет писать асинхронный, событийно-ориентированный код: строить цепочки зависимых шагов, обрабатывать ошибки и комбинировать несколько операций без блокировки потока. Как это работает подробнее Классический Future ограничен: результат получается только блокирующим вызовом get(), future нельзя завершить вручную, несколько future нельзя соединить в цепочку или скомбинировать, а исключения обрабатывать неудобно. CompletableFuture можно завершить явно методом complete(value) или завершить с ошибкой через completeExceptionally(). Задачи запускаются статическими фабриками runAsync() (без результата) и supplyAsync() (с результатом). Конвейер шагов: thenApply() преобразует результат, thenAccept() потребляет его, thenCompose() соединяет future-операции, а exceptionally()/handle() обрабатывают ошибки. Несколько независимых
asynccompletablefuture
JuniorDevOps Engineer > Контейнеры и доставка > Безопасность и DevSecOps
Короткий ответ Compliance — это соблюдение внешних (законодательных, отраслевых) или внутренних требований к обработке данных и обеспечению безопасности; конкретные технические практики (шифрование данных, журналирование доступа, ограничение прав) часто являются прямыми требованиями таких стандартов, как PCI DSS (платёжные данные) или GDPR (персональные данные). Как это работает подробнее стандарты описывают не инструменты, а требуемые результаты и контроли — например, PCI DSS требует шифрование данных карт при хранении и передаче, ограничение доступа по принципу необходимости знать, журналирование всех обращений к данным карт; GDPR требует защиты персональных данных и возможности их удаления по запросу. Что использовать на практике Практика. DevOps-инженер реализует эти требования конкретными средствами: TLS для передачи данных, шифрование дисков/БД для хранения, RBAC и аудит-логи для контроля доступа, retention-политики для логов и бэкапов. Соответствие подтверждается через аудит и сбор доказательств (evide
access-controlcompliance
JuniorPython Developer > Основы Python > Доступ к базе из Python
Короткий ответ DSN (connection string) — это строка, описывающая все параметры подключения к БД: драйвер, пользователя, пароль, хост, порт, имя базы и дополнительные опции (например, SSL-режим), которую используют драйверы и ORM для установления соединения. Как это работает подробнее Формат URL обычно выглядит как postgresql://user:password@host:port/dbname?param=value; ORM и драйверы парсят эту строку, чтобы получить все данные для TCP-соединения и аутентификации. Пример кода Что использовать на практике Практика. Секреты (пароль) нельзя хранить в коде или в системе контроля версий — их передают через переменные окружения или секрет-хранилище (Vault, AWS Secrets Manager), а в коде собирают DSN динамически. Подводные камни Ошибка. Хардкодят пароль прямо в строке подключения в репозитории; не указывают sslmode=require в production, что может оставить трафик к БД незашифрованным при подключении через внешнюю сеть.
database-accesspostgresql
MiddlePython Developer > Основы Python > Контекстные менеджеры
Короткий ответ ExitStack — контекстный менеджер, который динамически накапливает произвольное число других контекстных менеджеров через enter_context и гарантированно закрывает их все в обратном порядке при выходе, что удобно, когда состав ресурсов определяется во время выполнения. Как это работает подробнее Вместо вложенных with a, with b, with c... ExitStack позволяет в цикле или по условию вызывать stack.enter_context(cm) для произвольного количества менеджеров, и все они будут закрыты корректно при выходе из блока with ExitStack(), в том числе при исключении. Пример кода Что использовать на практике Практика. Полезен, когда список файлов/соединений для открытия определяется динамически (по конфигурации или входным данным); pop_all() позволяет передать владение ресурсами другому объекту без их закрытия в текущем месте. Подводные камни Риски. Пытаются эмулировать динамическое число ресурсов через вложенные with с дублированием кода; забывают, что закрытие происходит в обратном порядке добавления, и выстраив
contextlibcontext-managers
JuniorData Analyst > SQL и данные > Продуктовые и бизнес-метрики
Короткий ответ Conversion rate — доля пользователей, прошедших от одного шага воронки к следующему (или от первого шага к целевому действию), выраженная в процентах. Как это работает подробнее берём число уникальных пользователей, дошедших до целевого шага, и делим на число уникальных пользователей, вошедших в воронку (или на предыдущем шаге). Пример кода Что использовать на практике Применение. важно явно зафиксировать, считаем ли конверсию "step-to-step" (между соседними шагами) или "step-to-end" (от входа до конечной цели) — это разные числа и разные выводы; также нужно решить окно времени (конверсия в течение сессии, суток, N дней). Проверка или пример. conversion = purchased / viewed. Проверка: purchased не должно превышать viewed, если purchase логически возможен только после view. Подводные камни Частая ошибка. считают конверсию по числу событий, а не по уникальным пользователям (один пользователь может несколько раз "просмотреть товар"); не ограничивают окно времени, из-за чего в конверсию попадают по
conversion-ratefunnel
JuniorPerformance Marketer > Google Ads > Метрики рекламных кампаний
Короткий ответ Показатель зависит от того, какое действие задано конверсией: CPA лида и CPA покупки отвечают на разные вопросы. Платформенная оптимизация также зависит от набора и ценности переданных событий. Как это работает подробнее CPA = Расход / Число конверсий конкретного типа, например отдельно CPA по лидам и отдельно CPA по покупкам в рамках одной кампании. Если в кампании настроена оптимизация ставок под «любую конверсию» без разделения типов, алгоритм может непропорционально сильно оптимизировать под более частое, но менее ценное действие, например лид, а не покупку. Пример кода Что использовать на практике Разведите события в аналитике и кабинете, задайте им понятные названия и ценности. Для решений о продажах сверяйте покупки и новых клиентов с CRM. Подводные камни Нельзя напрямую сравнивать CPA кампаний с разными целями; повторные покупки могут искусственно занижать стоимость привлечения нового клиента.
campaign-optimizationconversion-events
MiddlePython Developer > Основы Python > Архитектура систем
Короткий ответ CQRS — разделение модели записи (команды) и модели чтения (запросы), часто с отдельным денормализованным хранилищем для чтения; оправдан, когда профиль чтения сильно отличается от профиля записи по нагрузке или структуре данных. Как это работает подробнее Команды изменяют «источник правды» (write model) по доменным правилам; события об изменениях асинхронно проецируются в read-модель, заранее денормализованную под конкретные запросы интерфейса. Пример кода Что использовать на практике Практика. Применяют там, где чтение требует агрегации из многих источников с высокой частотой и низкой допустимой задержкой, тогда как запись — относительно редкая и сложная операция; read-модель обычно eventually consistent относительно write-модели. Подводные камни Риск. Вводить CQRS «по умолчанию» для простых CRUD-сценариев; не учитывать задержку синхронизации read-модели в UX.
architecturecqrs
MiddlePython Developer > Основы Python > SQL-запросы
Короткий ответ CTE (конструкция WITH name AS (...)) — это временный именованный результат подзапроса, который можно использовать в основном запросе как обычную таблицу, что улучшает читаемость сложных запросов; рекурсивный CTE (WITH RECURSIVE) ссылается сам на себя, что позволяет обходить иерархические структуры произвольной глубины. Как это работает подробнее Обычный CTE — способ разбить сложный запрос на именованные шаги (в PostgreSQL 12+ может инлайниться или материализоваться, в зависимости от оптимизатора). Рекурсивный CTE состоит из «базовой» части и «рекурсивной» части, присоединяемой к результату предыдущей итерации, пока не перестанут появляться новые строки. Пример кода Что использовать на практике Практика. Рекурсивные CTE используют для обхода деревьев категорий, графов зависимостей, иерархии сотрудников; важно предусмотреть условие остановки и ограничивать глубину явным счётчиком для защиты от циклов. Подводные камни Ошибка. Забывают про возможность циклов в данных — без ограничения глубины рекур
ctepostgresql
MiddleJava Developer > Java Core > Multithreading
Короткий ответ CountDownLatch позволяет одному или нескольким потокам ждать, пока набор других потоков не выполнит операции: он работает на счётчике, который уменьшается вызовами countDown(), а ожидающие блокируются в await(), пока счётчик не станет нулевым. CyclicBarrier заставляет фиксированную группу потоков встретиться в одной точке и после отпускания сбрасывается, поэтому пригоден для повторного использования. Semaphore хранит счётчик разрешений и через acquire()/release() ограничивает число потоков, одновременно работающих с ресурсом. Как это работает подробнее CountDownLatch создаётся с начальным значением счётчика и используется один раз: когда счётчик достигает нуля, все ожидающие потоки освобождаются, но восстановить latch нельзя. Классический сценарий — главный поток ждёт, пока несколько фоновых задач загрузят данные. CyclicBarrier создаётся на фиксированное число участников (parties); опционально в конструктор передаётся Runnable — барьерное действие, которое выполняется, когда все потоки достигли
countdownlatchcyclicbarrier
MiddlePython Developer > Основы Python > Объектно-ориентированное программирование
Короткий ответ Data class — класс, помеченный декоратором @dataclass из одноимённого модуля, для хранения данных. Достаточно описать поля с аннотациями типов, и декоратор автоматически сгенерирует конструктор, строковое представление и сравнение по содержимому полей. Как это работает подробнее Автогенерация. @dataclass сам создаёт __init__(), модифицированный __repr__() и __eq__(), которые для обычного класса пишут вручную. Сравнение по данным. Два экземпляра с одинаковым содержимым равны, тогда как обычный класс без __eq__ сравнивает по идентичности объектов в памяти и вернёт False. Настройка. Полям можно задавать значения по умолчанию, а поведение генерации методов регулируется параметрами декоратора. Выгода. Такой класс делает код короче, читаемее и уменьшает число ошибок, связанных с ручным написанием служебных методов. Пример кода Что использовать на практике Модели данных. Используй dataclass для структур, хранящих набор полей, вместо классов с рукописным __init__. Неизменяемость. Если объект не должен
attributesdata-classes