MiddlePython Developer > Основы Python > SQLAlchemy
Короткий ответ 'select' (по умолчанию) делает отдельный запрос на каждый доступ к связи; 'joined' добавляет LEFT OUTER JOIN в основной запрос; 'subquery' выполняет отдельный подзапрос для всех связанных объектов сразу; 'selectin' выполняет отдельный SELECT ... WHERE id IN (...) для всех родительских id сразу — обычно это предпочтительный вариант для коллекций. Как это работает подробнее 'joined' увеличивает размер результата основного запроса (дублирование строк родителя при JOIN к коллекции); 'subquery' и 'selectin' выполняют единственный дополнительный запрос для всех объектов партии, но 'selectin' эффективнее за счёт простого IN-списка и лучше работает с LIMIT/OFFSET. Пример кода Что использовать на практике Практика. 'joined' хорошо подходит для связей «один-к-одному»/«многие-к-одному» с небольшим числом строк; 'selectin' — предпочтительный выбор для коллекций в современных версиях SQLAlchemy, переопределяется через options(selectinload(...)). Подводные камни Ошибка. Используют 'joined' для коллекций с бо
joinsorm
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ RollingUpdate (стратегия по умолчанию) постепенно заменяет старые Pod новыми без полного простоя, регулируя скорость через maxSurge (на сколько реплик сверх нормы можно временно превысить) и maxUnavailable (сколько реплик может быть временно недоступно); Recreate сначала полностью останавливает все старые Pod и только потом запускает новые, что гарантированно создаёт простой. Как это работает подробнее при RollingUpdate с maxSurge: 1, maxUnavailable: 0 Deployment сначала поднимает один дополнительный под новой версии, дожидается его readiness, и только потом гасит один под старой версии, повторяя цикл — это минимизирует риск простоя ценой временного превышения числа реплик. При maxUnavailable: 1, maxSurge: 0 вместо этого сначала гасится один старый под, и лишь после его удаления поднимается новый — это экономит ресурсы, но временно снижает мощность обслуживания. Пример кода Что использовать на практике Практика. Recreate оправдан, когда одновременная работа старой и новой версии недопустима — н
deploymentkubernetes
JuniorPython Developer > Основы Python > Реляционная модель данных
Короткий ответ В PostgreSQL VARCHAR(n) и TEXT хранятся одинаково и не имеют разницы в производительности — VARCHAR(n) лишь добавляет ограничение максимальной длины, TEXT не ограничивает длину вовсе, а CHAR(n) дополняет строку пробелами до фиксированной длины n и почти никогда не нужен в современных приложениях. Как это работает подробнее Внутри PostgreSQL все три типа используют один и тот же механизм хранения переменной длины (varlena); VARCHAR(n) добавляет проверку длины при вставке/обновлении, CHAR(n) всегда дополняет строку до n символов пробелами справа. Пример кода Что использовать на практике Практика. Для большинства полей (имена, описания, email) рекомендуется TEXT без ограничения длины на уровне БД, валидацию делать на уровне приложения/ORM; VARCHAR(n) оправдан, когда ограничение длины — реальное бизнес-правило. Подводные камни Ошибка. Выбирают CHAR(n) по привычке из других СУБД, не замечая паддинг пробелами, что ломает сравнение строк; жёстко ограничивают VARCHAR(255) «по умолчанию» без анализа тре
constraintsdata-modeling
MiddlePython Developer > Основы Python > WSGI, ASGI и серверы приложений
Короткий ответ sync — один запрос на воркер, блокируется на любом I/O; gthread — несколько потоков на воркер; gevent — кооперативная многозадачность через monkey-patching блокирующих вызовов, позволяющая держать тысячи ожидающих соединений, но требующая совместимости всех используемых библиотек. Как это работает подробнее sync блокируется до завершения запроса; gthread позволяет другому потоку работать, пока один ждёт I/O (отпуская GIL); gevent патчит стандартную библиотеку так, что блокирующие вызовы становятся неблокирующими greenlet-переключениями. Пример кода Что использовать на практике Рекомендация. переход на gevent/gthread выгоден, когда узкое место — ожидание сети; выигрыша не будет, если узкое место — CPU-bound вычисления (GIL всё равно не даёт параллельно исполнять Python-код), и возможны баги, если используются C-расширения, не совместимые с monkey-patching. Подводные камни Риск. включить gevent без проверки совместимости зависимостей — получают труднодиагностируемые «подвисания»; считать, что gev
application-servergevent
JuniorDevOps Engineer > Контейнеры и доставка > Права доступа Linux
Короткий ответ У каждого файла есть владелец (пользователь) и группа-владелец; chown меняет владельца (и опционально группу через owner:group), а chgrp меняет только группу-владельца файла. Как это работает подробнее Ядро хранит UID владельца и GID группы в метаданных (inode) файла; при проверке доступа сначала сверяется UID процесса с владельцем, затем GID (и дополнительные группы процесса) с группой файла, и только если ни то, ни другое не совпало — применяются права «для остальных». Пример кода Что использовать на практике Практика. смену владельца и группы часто делают одной командой chown user:group file, а рекурсивно для целого дерева каталогов — с флагом -R, что типично при разворачивании приложения под отдельным сервисным пользователем. Подводные камни Риск. Частая ошибка — менять владельца файлов на root для «упрощения» вместо создания выделенного сервисного пользователя: это нарушает принцип минимальных привилегий и увеличивает ущерб при компрометации приложения.
access-controlchgrp
JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ del lst[i] удаляет элемент по индексу и ничего не возвращает (а del lst целиком удаляет саму переменную), remove(value) удаляет первое вхождение конкретного значения (ищет по содержимому, не по индексу), а pop(i) удаляет элемент по индексу и возвращает его значение. Как это работает подробнее del — это оператор языка, а не метод списка: del lst[2] убирает элемент с индексом 2, del lst[1:3] убирает срез, del lst удаляет саму переменную lst из текущей области видимости. remove(value) линейно ищет первое совпадение по значению и удаляет его, бросая ValueError, если значение не найдено. pop() без аргумента удаляет и возвращает последний элемент (эффективно, O(1)), pop(i) — элемент по индексу (может требовать сдвига остальных, если i не последний). Пример кода Что использовать на практике Практика. pop() без аргументов — стандартный способ реализовать стек (LIFO). remove() удобен, когда известно значение, но не известен его индекс, но на больших списках он медленный из-за линейного поиска. del по ср
collectionslist
JuniorPython Developer > Основы Python > Реляционная модель данных
Короткий ответ DELETE удаляет строки по условию и может быть отменён в транзакции, TRUNCATE мгновенно очищает всю таблицу без построчной обработки (и в PostgreSQL тоже транзакционен), а DROP полностью удаляет объект таблицы вместе со схемой. Как это работает подробнее DELETE построчно проверяет условие WHERE и может вызывать триггеры ON DELETE. TRUNCATE не сканирует строки, быстро освобождает страницы таблицы и по умолчанию сбрасывает SERIAL/IDENTITY, если не указано CONTINUE IDENTITY. DROP удаляет саму структуру таблицы, включая индексы и ограничения. Пример кода Что использовать на практике Практика. DELETE используют, когда нужно удалить часть данных по условию или нужны триггеры; TRUNCATE — для быстрой очистки всей таблицы в тестах/ETL; DROP — при удалении таблицы из схемы, например при откате миграции. Подводные камни Ошибка. Используют DELETE FROM table; без WHERE для очистки большой таблицы — это медленнее TRUNCATE и сильнее нагружает WAL и автовакуум; забывают, что TRUNCATE требует ACCESS EXCLUSIVE lo
constraintsdata-modeling
JuniorPerformance Marketer > Google Ads > Данные, комплаенс и безопасность рекламных аккаунтов
Короткий ответ First-party cookies устанавливаются в контексте домена посещаемого сайта, а third-party cookies — сторонним доменом, например рекламной платформой. Второй тип часто используется для ретаргетинга между сайтами и активнее ограничивается браузерами. Как это работает подробнее Собственная аналитика сайта может опираться на first-party cookie, тогда как рекламная сеть использует сторонний идентификатор для связывания действий пользователя на разных ресурсах. Согласие связано с целью. Замена third-party cookie на first-party через поддомен не отменяет требований к маркетинговому использованию данных. Что использовать на практике Настройте категории CMP. Разделите необходимые и маркетинговые технологии и не загружайте маркетинговые скрипты до нужного согласия пользователя. Подводные камни Не путайте тип cookie с правовым основанием. Собственный домен не делает рекламный сбор автоматически допустимым без согласия.
consentcookies
MiddlePerformance Marketer > Google Ads > Атрибуция и измерение
Короткий ответ Все три модели применяют заранее заданное распределение к пути пользователя. Ни одна сама по себе не измеряет, произошла бы конверсия без канала. Как это работает подробнее Все три модели — это фиксированные эвристики, в отличие от data-driven, которая считает веса статистически, поэтому они не «угадывают» реальный вклад канала, а применяют заранее заданное правило распределения. Кроме перечисленных моделей, некоторые платформы предлагают собственные гибридные модели с настраиваемыми весами по этапам, что фактически является ручной калибровкой эвристики под ожидания конкретного бизнеса. Что использовать на практике Используйте linear как нейтральную отправную точку, position-based для ценности начала и завершения пути, time-decay — если поздние касания ожидаемо важнее; фиксируйте модель и период. Подводные камни Смена модели меняет видимые доли каналов без изменения продаж. Не принимайте распределение заслуг за инкрементальность.
linear-attributionmulti-touch-attribution
JuniorPython Developer > Основы Python > Очереди и события
Короткий ответ Producer — часть системы, которая создаёт и отправляет сообщения в очередь; consumer — часть, которая читает сообщения из очереди и обрабатывает их; это разные роли, часто в разных сервисах. Как это работает подробнее Producer не знает, кто и когда обработает сообщение; consumer подписывается на очередь/топик и обрабатывает сообщения в своём темпе. Пример кода Что использовать на практике Практика. Один producer может иметь несколько consumer'ов для масштабирования обработки; в Kafka несколько consumer'ов в одной consumer group делят партиции между собой. Подводные камни Риск. Путать широковещательную доставку (каждый consumer получает копию, fanout) с разделением нагрузки (конкурирующие consumer'ы делят сообщения).
consumerevent-driven