JuniorDevOps Engineer > Контейнеры и доставка > Ресурсы Linux
Короткий ответ OOM killer (Out Of Memory killer) — механизм ядра Linux, который принудительно завершает один или несколько процессов, когда в системе заканчивается физическая память и swap, чтобы не допустить полного зависания ядра. Как это работает подробнее Когда доступной памяти (включая swap) становится недостаточно для выполнения запроса на выделение, ядро вызывает алгоритм выбора жертвы, который оценивает каждый процесс по значению oom_score (учитывает объём занятой памяти, время работы, настройки oom_score_adj) и завершает процесс с наивысшим счётом сигналом SIGKILL. Пример кода Что использовать на практике Практика. факт срабатывания OOM killer всегда виден в системном журнале (dmesg/journalctl) строкой вида Out of memory: Killed process, и это повод смотреть, какой процесс реально потребляет память и не является ли лимит контейнера/cgroup слишком низким для нормальной работы приложения. Подводные камни Риск. Частая ошибка — считать, что падение процесса с кодом 137 всегда означает баг в самом приложе
linuxmemory
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ ORM в Django позволяет работать с реляционной базой данных через Python-классы и методы вместо ручного SQL. Класс модели наследуется от django.db.models.Model и отображается на таблицу, а операции выполняются через менеджер объектов. Как это работает подробнее Каждый атрибут класса модели соответствует колонке таблицы, а за кулисами ORM переводит операции в оптимизированные SQL-запросы. Соответствие. Класс Student с полями name и age превращается в таблицу со столбцами name и age. Менеджер объектов. Записи создают, читают, обновляют и удаляют через Student.objects.create(...), Student.objects.all() и student.save(). Переносимость. Один и тот же код работает с PostgreSQL, MySQL, SQLite и Oracle без переписывания запросов. Миграции. Модели — единый источник истины: на их основе Django генерирует миграции для изменения схемы базы данных. Пример кода Что использовать на практике Данные через модели. Описывай структуру данных классами моделей, а не SQL-скриптами. Типовые операции. Для обычных выборо
databasedjango
JuniorJava Developer > Java Core > JPA и Hibernate
Короткий ответ ORM (Object-Relational Mapping) — техника отображения объектной модели на реляционную базу: класс отображается на таблицу, объект — на строку, поля — на колонки, поэтому разработчик работает с объектами, а не пишет вручную SQL и код преобразования. Hibernate — самый популярный open-source ORM-фреймворк для Java, автоматизирующий CRUD и управляющий персистентностью объектов. Как это работает подробнее Hibernate — это надстройка над JDBC: под капотом он использует JDBC-драйвер базы данных, но берёт на себя низкоуровневую работу — соединения, подготовку и выполнение SQL, генерацию запросов и отслеживание изменений объектов. Основной выигрыш — меньше ручного кода, выше переносимость и поддерживаемость приложения. Маппинг и генерация SQL: объекты автоматически отображаются на таблицы, не нужно вручную писать большое количество SQL. HQL — собственный объектно-ориентированный язык запросов, похожий на SQL, но работающий с классами и их свойствами. Производительность: встроенное кэширование (кэш первог
hibernatejava
MiddleDevOps Engineer > Контейнеры и доставка > Процессы Linux
Короткий ответ Orphan-процесс — процесс, родитель которого завершился раньше него; операционная система автоматически переназначает такому процессу нового родителя — как правило, процесс инициализации (systemd с PID 1 или специально выделенный subreaper), который затем обязан вызывать wait() для освобождения завершившихся осиротевших процессов. Как это работает подробнее Когда родительский процесс завершается, пока у него ещё есть живые дочерние процессы, ядро репарентит (reparent) их на init (PID 1) или на ближайший процесс-предок, помеченный флагом PR_SET_CHILD_SUBREAPER (это умеют делать системы управления процессами вроде systemd, tini, s6); именно поэтому init обязательно должен уметь обрабатывать wait() для чужих детей, иначе они превратятся в зомби без возможности когда-либо быть «собранными». Пример кода Что использовать на практике Практика. проблема особенно актуальна в контейнерах: если в контейнере PID 1 — это само приложение, а не init-подобный процесс, оно может не вызывать wait() для осиротевши
linuxorphan-processes
MiddlePython Developer > Основы Python > Индексы и производительность
Короткий ответ Partial index — это индекс, построенный только для строк, удовлетворяющих условию WHERE, указанному при его создании; его применяют, когда запросы почти всегда фильтруют по одному и тому же подмножеству строк (например, только активные записи), чтобы индекс был меньше и быстрее полного. Как это работает подробнее При создании CREATE INDEX ... WHERE condition PostgreSQL включает в индекс только строки, удовлетворяющие condition, и поддерживает это условие при последующих INSERT/UPDATE; планировщик использует такой индекс только для запросов, чьё условие WHERE логически покрывается условием индекса. Пример кода Что использовать на практике Практика. Типичный кейс — таблица задач с большинством завершённых записей: CREATE INDEX ... WHERE status != 'done' резко уменьшает размер индекса по сравнению с полным индексом на всю таблицу. Подводные камни Ошибка. Пишут запрос с условием, которое СУБД не может сопоставить с условием partial-индекса буквально (например, индекс WHERE status = 'active', а запр
indexespostgresql
SeniorJava Developer > Java Core > Дженерики
Короткий ответ PECS (Producer Extends, Consumer Super) — мнемоническое правило выбора wildcard в параметрах методов: если метод только читает коллекцию («производитель»), объявляйте ? extends T; если только добавляет элементы («потребитель») — ? super T. Правило нужно из-за инвариантности дженериков: List не является подтипом List. Как это работает подробнее «Producer Extends»: метод только читает элементы — коллекция производит данные. Параметр ? extends T задаёт верхнюю границу: Collection примет и коллекцию Animal, и коллекцию любого наследника (Cat, Dog). Читать можно как Animal, а добавлять нельзя (кроме null): компилятор не знает фактический тип элементов. «Consumer Super»: метод только добавляет элементы — коллекция потребляет данные. Параметр ? super T задаёт нижнюю границу: Collection принимает Collection, Collection или Collection. Добавлять можно Cat и его наследников, а при чтении гарантирован только Object. Эталон из JDK: Collections.c
collectionsgenerics
JuniorPython Developer > Основы Python > Инструменты разработки
Короткий ответ PEP 8 — документ с официальными рекомендациями по стилю написания кода на Python: именование переменных и функций, отступы, длина строк, пробелы и оформление импортов. Это общепринятый стандарт, который делает код единообразным и читаемым для всей команды. Как это работает подробнее PEP 8 — одно из предложений по улучшению Python, и именно в нём закреплены договорённости об оформлении кода. Читаемость. Единый стиль позволяет быстро понимать и чужой, и свой код, что особенно важно в командной разработке. Открытые проекты. В open-source следование PEP 8 практически обязательно: это требование проверяют мейнтейнеры и инструменты анализа. Автоматический контроль. Отклонения от стандарта подсвечивают линтеры вроде pylint и специальные проверки стиля. Основные правила. Отступ в 4 пробела, имена функций и переменных в snake_case, классов — в CamelCase, длина строки до 79 символов и пустая строка в конце файла. Что использовать на практике Автоматизация. Подключи линтер или проверку стиля, чтобы отклон
code-stylepep8
MiddlePython Developer > Основы Python > Инструменты разработки
Короткий ответ PEP 8 — это соглашение о кодировании, официальные рекомендации о том, как писать код на Python читаемо: отступы в четыре пробела, длина строк, именование, пробелы вокруг операторов. Соблюдать стиль помогают линтеры вроде Flake8, которые проверяют код, и форматтеры вроде Black, которые сами приводят код к единому виду. Как это работает подробнее PEP расшифровывается как Python Enhancement Proposal — официальный документ-предложение по развитию Python; PEP 8 документирует рекомендации по стилю, и в open-source проектах их соблюдение обязательно. Содержание PEP 8. Правила описывают отступы (4 пробела), длину строк, именование переменных и функций, пробелы вокруг операторов и другое. Линтеры. Flake8 запускается как flake8 path/to/code/, поддерживает выбор проверок через --select E123,W503 и игнорирование через --extend-ignore. Форматтеры. Black автоматически переформатирует код, давая скорость, детерминированность и минимальные диффы при код-ревью. Статический анализ. PyChecker и Pylint ищут баги и
blackcode-style
JuniorDevOps Engineer > Контейнеры и доставка > Kubernetes и оркестрация
Короткий ответ PersistentVolume (PV) — это объект, описывающий конкретный ресурс хранения в кластере (диск, NFS-шару и т.п.), а PersistentVolumeClaim (PVC) — это запрос приложения на хранилище с нужным объёмом и режимом доступа; Kubernetes связывает (bind) PVC с подходящим PV, а Pod монтирует именно PVC. Как это работает подробнее администратор кластера (или StorageClass с динамическим provisioning) создаёт PV, а разработчик описывает PVC с требованиями (размер, accessMode, класс хранилища); контроллер находит подходящий PV и связывает его с PVC один к одному. При динамическом provisioning (через StorageClass) PV создаётся автоматически в момент создания PVC, без ручного шага. Пример кода Что использовать на практике Практика. приложения в манифестах ссылаются только на PVC, оставаясь независимыми от конкретной реализации хранилища (облачный диск, NFS, Ceph) — это абстракция, позволяющая переносить манифесты между средами. Режим доступа ReadWriteOnce означает, что том можно монтировать на чтение-запись только
kubernetespersistent-storage
JuniorDevOps Engineer > Контейнеры и доставка > Процессы Linux
Короткий ответ PID (Process ID) — уникальный идентификатор процесса, PPID (Parent PID) — идентификатор процесса, который его породил; узнать родителя можно командой ps -o pid,ppid,cmd -p PID или построив дерево через pstree. Как это работает подробнее При создании нового процесса системный вызов fork() копирует вызывающий процесс, а exec() заменяет его образ новой программой; PPID сохраняется и указывает, кто инициировал запуск, формируя иерархическое дерево процессов вплоть до init/systemd с PID 1. Пример кода Что использовать на практике Практика. дерево процессов помогает понять, кто перезапускает «зависающий» сервис (например, systemd или супервизор), а также безопасно останавливать именно нужную ветку процессов, а не убивать всё по имени. Подводные камни Риск. Частая ошибка — считать, что PID сохраняется при перезапуске сервиса: systemd и большинство супервизоров выдают процессу новый PID при каждом старте, поэтому скрипты не должны жёстко хардкодить PID.
linuxpid