MiddlePython Developer > Основы Python > Внешние интеграции
Короткий ответ Нужно замокать HTTP-слой (через unittest.mock, библиотеки responses/respx/requests-mock или тестовый HTTP-сервер), чтобы тест проверял логику обработки ответа и ошибок, не выполняя реальных сетевых запросов, и отдельно — через contract-тесты или интеграционные тесты против тестового окружения внешнего сервиса — проверять, что реальный контракт не разошёлся с ожиданиями. Как это работает подробнее unit-тесты с моками подменяют HTTP-клиент или сам транспортный слой, задавая заранее подготовленные ответы (успех, разные коды ошибок, таймаут) для проверки, что код правильно обрабатывает каждый случай. Такие тесты быстрые и детерминированные, но не гарантируют, что реальный внешний API ведёт себя так, как в моке. Пример кода Что использовать на практике Рекомендация. стоит разделять уровни тестирования: быстрые unit-тесты с моками для покрытия всех веток обработки ошибок (таймаут, 4xx, 5xx, неожиданный формат ответа), и отдельные (реже запускаемые, например в CI по расписанию или вручную) контрактные
http-clientmocking
JuniorPython Developer > Основы Python > Тестирование кода
Короткий ответ Тестовый клиент позволяет отправить HTTP-запрос к приложению прямо в процессе теста, без поднятия реального сервера и сети, и проверить код ответа и тело в формате JSON. Как это работает подробнее TestClient (на базе httpx/requests) оборачивает ASGI/WSGI-приложение и вызывает его напрямую через интерфейс приложения, эмулируя полный цикл обработки запроса: маршрутизацию, middleware, валидацию входных данных, сериализацию ответа — но без реального сетевого сокета и реального порта, что делает такие тесты быстрыми и стабильными. Пример кода Что использовать на практике Практика. Такие тесты относят к так называемым component/API-тестам: они ближе к интеграционным, так как проходят через весь стек приложения — от роутинга до сериализации ответа, — но обычно всё ещё используют тестовую или замоканную БД вместо настоящей production-инфраструктуры и внешних сервисов. Подводные камни Риск. Проверять только код статуса ответа (например, 200), игнорируя содержимое тела ответа, из-за чего тест не заметит,
api-testingfastapi
MiddleJava Developer > Java Core > Core Java
Сборщик мусора находит недостижимые объекты и освобождает занимаемую ими память, работая по поколениям.
JavaVirtual Machine
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ HPA периодически опрашивает метрики (по умолчанию — средний процент использования CPU/памяти относительно requests, либо кастомные метрики через Metrics API) и изменяет число реплик Deployment/StatefulSet, чтобы приблизить фактическое значение метрики к целевому; ограничение в том, что HPA требует корректно заданных requests и не реагирует мгновенно — есть задержка на сбор метрик и период стабилизации. Как это работает подробнее формула масштабирования примерно такая — желаемые реплики = текущие реплики × (текущее значение метрики / целевое значение), с округлением и ограничениями minReplicas/maxReplicas. Для метрики CPU используется не абсолютное потребление, а процент от requests.cpu, поэтому без заданных requests автоскейлинг по CPU вообще не будет работать корректно. Пример кода Что использовать на практике Практика. для плавного масштабирования без "дребезга" (постоянных колебаний числа реплик) настраивают behavior.scaleDown.stabilizationWindowSeconds, чтобы не схлопывать реплики сразу пос
autoscalinghpa
JuniorPython Developer > Основы Python > Типы данных
Короткий ответ Срез seq[start:stop:step] возвращает новую последовательность того же типа с элементами от индекса start (включительно) до stop (не включая), с заданным шагом; отрицательные индексы отсчитываются с конца, а отрицательный шаг разворачивает порядок. Как это работает подробнее Python вычисляет границы среза, нормализуя отрицательные индексы (прибавляя длину последовательности) и подставляя значения по умолчанию: start=0, stop=len(seq) для положительного шага (и наоборот для отрицательного), step=1. Результат — всегда новый объект-копия выбранных элементов, исходная последовательность не меняется. Пример кода Что использовать на практике Практика. Частые идиомы: seq[::-1] — разворот последовательности, seq[:n] — первые n элементов, seq[-n:] — последние n элементов, seq[::2] — каждый второй элемент. Для списков срез можно использовать и в левой части присваивания: lst[1:3] = [10, 20, 30] заменит два элемента тремя. Подводные камни Риски. Путают, что stop не включается в результат (off-by-one ошибки)
data-typespython
JuniorPython Developer > Основы Python > SQL-запросы
Короткий ответ GROUP BY группирует строки по значениям указанных колонок, а агрегатные функции считают значение по каждой группе; в SELECT можно использовать только колонки из GROUP BY или результаты агрегатных функций, иначе непонятно, какое значение негруппированной колонки показывать для группы из нескольких строк. Как это работает подробнее СУБД сначала логически разбивает результат на группы по значениям указанных колонок, затем применяет агрегатную функцию к каждой группе отдельно, возвращая одну строку на группу. Пример кода Что использовать на практике Практика. Типичная ошибка — попытка вывести негруппированную колонку «для примера»; PostgreSQL в этом случае выдаст ошибку компиляции запроса, в отличие от некоторых других СУБД, которые могут вернуть произвольное значение. Подводные камни Ошибка. Путают HAVING и WHERE, забывают, что WHERE фильтрует строки до группировки и не может ссылаться на результат агрегатной функции.
aggregationpostgresql
JuniorPython Developer > Основы Python > Алгоритмы и типовые задачи
Короткий ответ Самый простой и идиоматичный способ развернуть строку — срез с отрицательным шагом: s[::-1]. Альтернативы — ''.join(reversed(s)) или цикл, добавляющий каждый символ в начало. Число разворачивают через строку — int(str(n)[::-1]) — либо арифметически, без преобразования в строку. Как это работает подробнее У разворота строки несколько способов, и они различаются краткостью и тем, как именно читаются символы. Срез s[::-1]. Синтаксис означает «вся строка с шагом -1», то есть чтение справа налево; это самый короткий вариант. reversed и join. reversed(s) возвращает итератор по символам в обратном порядке, а join собирает их в новую строку. Цикл. Каждый следующий символ добавляется в начало строки: rev = ch + rev. Другие варианты. Можно идти индексами от конца к началу через range() или использовать стек, где pop() снимает последний элемент первым. Разворот числа. Арифметический способ: % 10 берёт последнюю цифру, rev * 10 + d накапливает результат, а //= 10 отбрасывает обработанную цифру. Пример кода
algorithmspython
MiddleSMM Manager > Общее > Контент-стратегия
Короткий ответ Разработку начинают с перевода бизнес-целей (продажи, узнаваемость, удержание клиентов) в измеримые коммуникационные задачи, затем определяют аудиторию, площадки, пиллары и воронку контента под эти задачи, и только потом выбирают актуальные форматы и тренды как инструмент достижения целей, а не как отправную точку. Как это работает подробнее стратегия строится по цепочке «бизнес-цель → коммуникационная задача → аудитория и площадки → пиллары → воронка контента → KPI», при этом каждый следующий элемент логически вытекает из предыдущего. Что использовать на практике На практике. для одной бизнес-цели (например, рост продаж в низкий сезон) коммуникационной задачей может быть «показать применимость продукта в новом контексте», что определяет и пиллары, и нужный упор на этап conversion. Пример. Бизнес-цель клиента (сеть фитнес-клубов): рост продаж абонементов в январе. Коммуникационная задача: показать реальные результаты клиентов и снизить барьер «начать сложно». Пиллары: «Истории клиентов», «Прост
business-goalscontent-strategy
MiddleData Analyst > SQL и данные > Статистика и теория вероятностей
Короткий ответ Размер выборки рассчитывается через power analysis на основе базовой конверсии, минимального детектируемого эффекта (MDE), выбранного уровня значимости и желаемой мощности теста (обычно 80%); чем меньше MDE, тем больше нужна выборка. Как это работает подробнее для сравнения двух пропорций размер выборки на группу зависит от базовой конверсии p, от размера эффекта (p2−p1), альфа и мощности — формула связывает эти параметры через стандартные нормальные квантили; на практике расчёт обычно делают через готовые функции (statsmodels), а не вручную по формуле. Пример кода Что использовать на практике На практике. важно договориться о MDE заранее, исходя из того, какой минимальный эффект вообще имеет смысл для бизнеса — слишком маленький MDE может потребовать нереалистично большой выборки и месяцев теста. Также стоит заложить запас на ожидаемую долю пользователей, которые не завершат весь сценарий (fallout), и на возможное снижение мощности при неравном сплите групп. Дополнительно стоит заложить запас
ab-testingmde
JuniorSMM Manager > Общее > Площадки и основы SMM
Короткий ответ ER по охвату обычно считают как сумму всех реакций (лайки, комментарии, репосты, иногда сохранения) делённую на охват публикации и умноженную на 100%; он показывает, какая доля увидевших пост людей как-то на него отреагировала, что помогает сравнивать посты между собой независимо от их охвата. Как это работает подробнее формула ER = (лайки + комментарии + репосты) / охват × 100%; существуют разные варианты формулы (ER по подписчикам, ER по показам), и важно не путать их между собой при сравнении. Что использовать на практике Рекомендация. ER удобен для сравнения разных постов одного сообщества между собой или с отраслевыми ориентирами, но его нужно рассматривать вместе с абсолютными цифрами, а не изолированно — высокий ER на очень маленьком охвате может быть статистической случайностью. Подводные камни Риск. считать ER от числа подписчиков там, где нужен ER от охвата (или наоборот), и из-за этого делать неверные выводы при сравнении; сравнивать ER постов с кардинально разным типом контента (нап
community-managementengagement-rate