JuniorDevOps Engineer > Контейнеры и доставка > Ресурсы Linux
Короткий ответ Load average — среднее число процессов, готовых к выполнению или ожидающих ввода-вывода, за последние 1/5/15 минут; %CPU — доля процессорного времени, потребляемая процессом; %MEM — доля физической памяти, занятой процессом (RSS относительно общего объёма RAM). Как это работает подробнее Load average растёт при увеличении очереди к планировщику ядра — как из-за нехватки CPU, так и из-за процессов, ожидающих диск или сеть в состоянии uninterruptible sleep (D); сравнение load average с числом ядер CPU даёт грубую оценку, насколько система перегружена. Пример кода Что использовать на практике Практика. load average около числа ядер или ниже считается нормальным, значение заметно выше числа ядер — сигнал к дальнейшей диагностике (через vmstat/iostat — упирается CPU или диск); %MEM полезно смотреть вместе с available memory, а не только с занятой. Подводные камни Риск. Частая ошибка — делать вывод «сервер перегружен по CPU» только по высокому load average, не проверив iowait: часто высокий load связ
cpulinux
JuniorSMM Manager > Общее > SMM-аналитика и метрики
Короткий ответ Конверсия — это целевое действие пользователя после контакта с контентом или рекламой в соцсетях (переход на сайт, оставленная заявка, покупка, подписка на рассылку), выраженное как абсолютное число или как процент от перешедших/увидевших. Как это работает подробнее конверсия фиксируется системой аналитики сайта или CRM при выполнении заданного события (например, «заявка отправлена»), а затем привязывается к источнику через UTM-метки или пиксель. Кампания привела 1 000 кликов на сайт, из них 40 оставили заявку. Конверсия в заявку = 40/1000×100% = 4%. Проверка: сверка числа заявок по UTM-метке кампании с данными CRM за тот же период. Что использовать на практике Практический подход. перед запуском кампании нужно договориться с заказчиком, что именно считается конверсией (заявка, добавление в корзину, оплата), иначе разные стороны могут считать «успех» по-разному. Подводные камни Частые ошибки. называть конверсией просто клик по ссылке, хотя клик — это лишь переход, а не целевое действие; не согл
conversion-trackingmetrics
JuniorPython Developer > Основы Python > Django и DRF
Короткий ответ Django app — это отдельный Python-пакет с собственными моделями, view, шаблонами и миграциями, решающий конкретную подзадачу (например, «блог», «пользователи»); проект объединяет несколько таких приложений в INSTALLED_APPS. Как это работает подробнее Приложение создаётся командой startapp и содержит стандартный набор файлов (models.py, views.py, apps.py, migrations/). Чтобы Django «увидел» приложение (его модели, шаблонные теги, сигналы), его нужно указать в списке INSTALLED_APPS в settings.py. Пример кода Что использовать на практике Практика. Разделение на приложения по смысловым доменам (users, orders, billing) облегчает повторное использование кода между проектами и упрощает ориентацию в большом проекте. Для совсем маленьких проектов избыточное дробление на множество приложений может только усложнить навигацию. Подводные камни Риск. Путают термины «Django project» (весь сайт/конфигурация) и «Django app» (один из модулей внутри проекта); создают одно гигантское приложение core со всеми модел
backenddjango
JuniorJava Developer > Java Core > Основы Java
Короткий ответ Компилятор автоматически добавит так называемый конструктор по умолчанию — конструктор без параметров, тело которого состоит из вызова конструктора родителя super(). Благодаря этому объект класса по-прежнему можно создать оператором new, а цепочка конструкторов корректно строится от базового класса к производному. Как это работает подробнее Конструктор по умолчанию добавляется только в одном случае: если в классе нет вообще ни одного конструктора. Если программист объявил хотя бы один конструктор, например Book(String title), автоматический конструктор не создаётся, и для new Book() понадобится явный конструктор без параметров. Видимость сгенерированного конструктора совпадает с видимостью класса. Условие генерации — в классе не объявлено ни одного конструктора; иначе компилятор не добавляет ничего. Вызов super() — у родителя должен быть доступный конструктор без параметров; иначе наследник обязан явно вызвать подходящий super(...). Роль — корректно проинициализировать объект и построить цепочк
constructorsdefault-constructor
JuniorPython Developer > Основы Python > Архитектура систем
Короткий ответ Без защиты от дублирования повторный POST с одинаковыми данными создаст второй заказ в БД, так как POST по умолчанию не идемпотентен — сервер просто выполнит вставку ещё раз. Как это работает подробнее Каждый POST-запрос интерпретируется сервером как новая команда «создать», независимо от того, что предыдущий запрос уже создал такой же заказ. Пример кода Что использовать на практике Практика. Повтор может произойти из-за сетевого сбоя, ретраев на уровне клиента/балансировщика или двойного клика пользователя; без защиты появляются дублирующиеся заказы и двойное списание денег. Подводные камни Риск. Считать эту проблему редкой и игнорировать её при проектировании; решать проблему только на фронтенде (блокировка кнопки), что не защищает от сетевых ретраев.
architecturedistributed-systems
JuniorPython Developer > Основы Python > Django и DRF
Короткий ответ Django возвращает ответ 404 Not Found, используя представление page_not_found, и показывает подробную debug-страницу, если DEBUG=True, либо шаблон 404.html, если DEBUG=False. Как это работает подробнее Диспетчер URL проходит по всем urlpatterns (включая вложенные через include()); если ни один шаблон не совпал, возникает исключение Resolver404, которое Django перехватывает на уровне обработки запроса и формирует HTTP-ответ со статусом 404. Пример кода Что использовать на практике Практика. В режиме разработки (DEBUG=True) Django показывает список всех проверенных URL-паттернов, что удобно для отладки опечаток в маршрутах. В production нужен собственный шаблон templates/404.html, иначе пользователь увидит стандартную минималистичную страницу. Подводные камни Риск. Путают поведение 404 с DEBUG=True (подробная диагностика) и DEBUG=False (production-страница) и тестируют «как в проде» с включённым DEBUG; забывают зарегистрировать кастомный обработчик handler404 в корневом urls.py.
djangohttp
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ При удалении Pod Kubernetes параллельно отправляет контейнеру сигнал SIGTERM и начинает исключать под из endpoints Service; у приложения есть время до истечения terminationGracePeriodSeconds (по умолчанию 30 секунд), чтобы корректно завершить текущие запросы и закрыть соединения, после чего, если процесс ещё жив, отправляется SIGKILL. Как это работает подробнее удаление из списка endpoints Service и отправка SIGTERM контейнеру происходят практически одновременно, но не атомарно — из-за распределённой природы системы (kube-proxy на разных узлах, разная задержка синхронизации) часть входящих соединений может прийти на под уже после получения им SIGTERM, но до того, как все узлы обновили свои правила маршрутизации. Поэтому приложению недостаточно просто мгновенно завершиться по SIGTERM — ему нужно продолжать обрабатывать уже начатые запросы (и желательно ещё немного новых) в течение короткого окна. Пример кода Что использовать на практике Практика. типичная правильная стратегия — по получении SIGT
graceful-shutdownkubernetes
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ pd.concat по умолчанию выравнивает таблицы по названиям столбцов, заполняя NaN там, где столбец присутствует только в одной из таблиц, а индексы объединяемых таблиц сохраняются как есть, если не передать ignore_index=True. Как это работает подробнее concat(axis=0) объединяет строки по объединению (union) множества столбцов обеих таблиц; столбцы, отсутствующие в одной из таблиц, получают NaN в соответствующих строках; исходные индексы каждой таблицы сохраняются без изменений, из-за чего при одинаковых исходных индексах в результате появляются повторяющиеся метки. Пример кода Что использовать на практике На практике. если таблицы должны иметь одинаковую структуру (например, данные за разные месяцы с одинаковой схемой), стоит заранее проверить набор столбцов (set(df1.columns) == set(df2.columns)), чтобы не получить неожиданные NaN из-за опечатки в названии столбца; ignore_index=True нужен почти всегда, если дальше планируется позиционный доступ или просто чистый диапазон индекса. Проверка. итогова
concatdataframe
SeniorJava Developer > Java Core > Дженерики
Короткий ответ При компиляции дженерик-информация стирается (type erasure): компилятор проверяет типы, а затем убирает их из байт-кода. Поэтому List и List после компиляции — один и тот же класс List: узнать параметр типа в рантайме нельзя. Raw type — параметризованный тип без параметра (List вместо List): он оставлен для совместимости со старым кодом, но типобезопасность теряется. Как это работает подробнее Переменная типа T заменяется своей левой границей: без указанной границы — Object, для — Animal. Параметризованный тип превращается в сырой List, а не в List. Стирание введено ради обратной совместимости: код, написанный до Java 5, должен был продолжать работать и корректно взаимодействовать с новым. Из стирания вытекают следствия: нельзя создать массив параметризованного типа (new List[1] запрещено), нельзя проверить параметр типа в рантайме; чтобы передать тип в метод, используется дополнительный аргумент Class. Raw types: компилятор выдаёт
genericsjava
MiddleDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ cordon помечает узел как непланируемый (Unschedulable), не трогая уже работающие на нём поды, тогда как drain дополнительно корректно выселяет (evict) существующие поды через Eviction API, уважая PodDisruptionBudget, graceful shutdown и terminationGracePeriod, в отличие от аварийного удаления узла, при котором поды просто теряются и пересоздаются только после истечения таймаута обнаружения недоступности узла. Как это работает подробнее cordon — это декларативное изменение spec.unschedulable: true у объекта Node, после которого планировщик просто не рассматривает этот узел для новых Pod, но ничего не делает с текущими. drain сначала выполняет cordon, а затем вызывает Eviction API для каждого пода на узле (кроме управляемых DaemonSet и ряда системных), ожидая, что каждый под корректно завершится и будет пересоздан контроллером (Deployment/StatefulSet) на другом узле, при этом соблюдая ограничения PodDisruptionBudget. Пример кода Что использовать на практике Практика. перед плановым обслуживанием
kubernetesmaintenance