JuniorPerformance Marketer > Google Ads > Сквозная аналитика и отчётность
Короткий ответ Данные выгружают (вручную или через экспорт) в единый лист с одинаковыми столбцами по каждому каналу и датам, затем сводят сводной таблицей по неделям и каналам. Как это работает подробнее Каждый кабинет экспортирует CSV с одинаковым набором метрик (дата, кампания, расход, клики, конверсии); эти файлы объединяют в один лист и строят сводную таблицу (pivot table) для агрегации по периоду. Для более сложных отчётов можно использовать функции IMPORTRANGE или Apps Script в Google Sheets, чтобы подтягивать данные из нескольких файлов автоматически, а не копировать их руками каждую неделю. Что использовать на практике Практика. Важно заранее согласовать единый формат дат и названий кампаний между каналами, иначе сводная таблица будет группировать данные неправильно. Полезно сразу выделить отдельный лист-«источник правды» с чистыми исходными данными и отдельный лист с расчётами и сводными таблицами, чтобы не путать исходные цифры с производными. Пример. Объедините данные Google и Meta в таблицу единог
excelgoogle-sheets
MiddleJava Developer > Java Core > Сборка мусора
Короткий ответ Сборка мусора — автоматический процесс управления памятью: JVM сама находит объекты в куче, до которых нельзя добраться по цепочке ссылок от корневых точек (корней), и освобождает их память. Программисту не нужно вручную удалять объекты, как через free или delete в C/C++. Как это работает подробнее Базовый алгоритм — mark-and-sweep: на первом шаге GC обходит граф объектов от корней и помечает достижимые, на втором удаляет непомеченные. В современных HotSpot JVM куча разделена на поколения: молодые объекты «умирают» быстро, для них применяется копирующая сборка с частыми небольшими паузами, а выжившие со временем переходят в старое поколение, где работают другие алгоритмы. Корни (GC roots) — локальные переменные активных потоков, статические поля и другие точки входа в граф объектов. Достижимость — объект жив, пока до него можно добраться от корней; недостижимые объекты удаляются. Поколения — young и old generation: для молодых объектов частая копирующая сборка, для старых — отдельные стратегии.
gcheap
JuniorPython Developer > Основы Python > Валидация и сериализация
Короткий ответ Модуль json сериализует только базовые типы (dict, list, str, int, float, bool, None); для datetime, Decimal, UUID и подобных нужно либо привести их к строке/числу вручную, либо передать кастомный default-обработчик в json.dumps, либо использовать библиотеку с готовой поддержкой (например, Pydantic в FastAPI). Как это работает подробнее json.dumps рекурсивно обходит структуру и для каждого значения ищет соответствие в таблице типов; при встрече неизвестного типа вызывается функция default, если она передана, иначе выбрасывается TypeError. Пример кода Что использовать на практике Рекомендация. в большинстве backend-фреймворков эта проблема решена за вас (FastAPI/Pydantic сами знают, как сериализовать datetime в ISO 8601), но при ручной работе с json или при сериализации нестандартных объектов нужно явно описывать преобразование. Подводные камни Риски. пытаться сериализовать datetime напрямую без обработчика и получать необработанное исключение в проде; сериализовывать datetime без таймзоны, из-з
datetimejson
JuniorSMM Manager > Общее > Контент-стратегия
Короткий ответ Удобно вести единый набор статусов для всех постов (например: идея → в работе → на согласовании → готово к публикации → опубликовано) и обновлять его сразу при изменении состояния задачи, а не постфактум; без единых статусов команда теряет понимание реального состояния плана. Как это работает подробнее статус показывает текущую стадию поста в производственном процессе и помогает быстро увидеть, какие публикации под угрозой срыва дедлайна. Что использовать на практике На практике. статусы стоит обновлять сразу после смены состояния задачи (например, сразу после отправки на согласование), а не раз в несколько дней, иначе план теряет актуальность. Пример. Фильтр таблицы по статусу «на согласовании» показывает 3 зависших задачи старше 3 дней. Проверка: еженедельный просмотр фильтра по статусам позволяет вовремя заметить и разобрать затянувшиеся согласования. Подводные камни Частые ошибки. использовать разные формулировки статуса у разных исполнителей («готово», «done», «ок»), из-за чего невозможно
content-planningcontent-strategy
SeniorPython Developer > Основы Python > API и контракты
Короткий ответ При множестве независимых потребителей эволюцию контракта ведут через строго аддитивные изменения, явное версионирование при неизбежных breaking changes и длительные периоды параллельной поддержки версий; решение о выводе старой версии зависит от реальной телеметрии использования, а не от предположений. Как это работает подробнее Аддитивные изменения (новые необязательные поля) безопасны для потребителей, игнорирующих неизвестные поля; при breaking change вводят новую версию контракта, оставляя старую работающей, и мигрируют потребителей поэтапно. Долгая параллельная поддержка нескольких версий даёт потребителям время на миграцию и снижает риск инцидентов, но увеличивает нагрузку на команду и усложняет кодовую базу. Быстрый вывод старой версии снижает эту нагрузку, но повышает риск сломать потребителей, которые не успели мигрировать. Критерий выбора — реальная доля трафика на старой версии, контрактные обязательства перед партнёрами и внутренняя стоимость поддержки нескольких версий одновременн
apiapi-design
MiddlePython Developer > Основы Python > Flask
Короткий ответ Данные кладут в объект flask.g, который привязан к текущему request context и автоматически пересоздаётся для каждого нового запроса — это потокобезопасно, так как каждый поток/greenlet обрабатывает свой собственный контекст. Как это работает подробнее Flask использует механизм контекстных локальных переменных (context locals, основанных на werkzeug.local/contextvars), который хранит отдельный g для каждого активного request context. Даже если сервер обрабатывает несколько запросов параллельно в разных потоках, каждый поток видит «свой» g, а не общий для всех. Пример кода Что использовать на практике Практика. before_request обычно используют для подготовки данных, нужных нескольким view (например, текущий пользователь из токена), и сохраняют результат в g.current_user; после обработки запроса g автоматически уничтожается, так что данные не «утекают» в следующий запрос. Подводные камни Риск. Пытаются хранить в g данные, которые должны жить дольше одного запроса (например, кэш между запросами) —
environment-variablesflask
JuniorPython Developer > Основы Python > Flask
Короткий ответ Функция jsonify() формирует тело ответа в формате JSON, а статус-код задаётся как второй элемент кортежа, возвращаемого из view-функции, либо через make_response. Как это работает подробнее Flask позволяет view-функции возвращать не только строку/словарь, но и кортеж (тело, статус) или (тело, статус, заголовки). jsonify() сериализует Python-объект в JSON и устанавливает правильный Content-Type. Пример кода Что использовать на практике Практика. Для кодов ошибок (400, 404, 409 и т. п.) удобно возвращать jsonify({...}), код. Если нужно также выставить заголовки, используют make_response(jsonify(...), код) и дальше .headers[...] = .... Подводные камни Риск. Возвращают только jsonify(data) без статуса для ошибок, из-за чего клиент получает 200 даже при логической ошибке; путают abort(404) (сразу прерывает обработку и генерирует HTML/JSON ошибку через error handler) с обычным возвратом кортежа.
flaskhttp
JuniorPython Developer > Основы Python > Flask
Короткий ответ Нужно явно проверить обязательные поля перед использованием данных и вернуть 400 Bad Request с понятным сообщением, либо использовать библиотеку валидации (например, marshmallow/pydantic) и перехватывать её ошибку. Как это работает подробнее Flask сам не валидирует входные данные — это задача разработчика или сторонней библиотеки. Без проверки обращение к отсутствующему ключу словаря (data['field']) вызывает KeyError, который без обработки превращается в 500 Internal Server Error, хотя по сути это ошибка клиента. Пример кода Что использовать на практике Практика. Базовый вариант — ручная проверка if 'field' not in data: return {'error': ...}, 400. Для более сложных схем применяют marshmallow/pydantic с перехватом исключения валидации и преобразованием его в 400 с деталями по полям. Подводные камни Риск. Оставляют необработанные KeyError/ValueError долетать до стандартного обработчика ошибок Flask, который в production отдаёт общий 500 без подсказки клиенту, что он прислал; не пишут отдельный те
flaskpydantic
MiddlePython Developer > Основы Python > Flask
Короткий ответ WSGI-middleware оборачивает сам вызываемый объект app.wsgi_app, получая доступ к «сырому» WSGI-окружению до того, как Flask начнёт маршрутизацию и построит объект request; before_request/after_request работают уже внутри контекста запроса Flask и имеют доступ к высокоуровневым объектам фреймворка. Как это работает подробнее WSGI-приложение — это просто вызываемый объект (environ, start_response) -> iterable. Оборачивая app.wsgi_app в свою функцию/класс, можно модифицировать environ до того, как Flask его обработает, или обернуть ответ на самом низком уровне — это универсально и работает с любым WSGI-совместимым фреймворком, не только Flask. Пример кода Что использовать на практике Практика. WSGI middleware обычно используют для инфраструктурных задач независимо от фреймворка (например, проксирование заголовков от балансировщика, сжатие gzip через стороннюю библиотеку, базовая авторизация на уровне инфраструктуры). before_request/after_request удобнее для логики, завязанной на Flask-специфичные
flaskmiddleware
JuniorPython Developer > Основы Python > Flask
Короткий ответ В декораторе @app.route указывается список допустимых методов через параметр methods, а внутри функции-обработчика ветвление делается по request.method. Как это работает подробнее Flask по умолчанию регистрирует маршрут только на GET (и HEAD/OPTIONS автоматически). Чтобы разрешить другие методы, их явно перечисляют в methods=[...]. Внутри обработчика доступен текущий метод через request.method. Пример кода Что использовать на практике Практика. Для простых случаев один обработчик с условием на request.method читается нормально; если логика веток сильно различается и растёт, лучше разделить на отдельные функции или использовать MethodView. Подводные камни Риск. Забывают добавить POST в methods, из-за чего Flask возвращает 405 Method Not Allowed; путают request.form (данные формы) и request.get_json() (JSON-тело).
flaskpython