JuniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ merge объединяет две таблицы по значению общего ключа (как JOIN в SQL), а concat просто складывает таблицы друг под другом или рядом по индексу, без логики сопоставления по ключу. Как это работает подробнее merge ищет соответствия между строками по значениям столбцов и может менять число строк в результате; concat(axis=0) соединяет таблицы по строкам (аналог UNION, но без удаления дублей по умолчанию), а concat(axis=1) — по столбцам, выравнивая по индексу. Пример кода Что использовать на практике На практике: concat уместен, когда нужно просто "склеить" данные за разные периоды с одинаковой структурой столбцов (например, продажи за январь и февраль); merge нужен, когда данные о разных сущностях (заказы и пользователи) нужно связать по ключу. Проверка: итоговый DataFrame должен содержать 4 строки с непрерывным индексом 0..3, а не повторяющийся индекс 0,1,0,1. Подводные камни Частые ошибки: используют concat там, где нужен merge, и получают механическое объединение строк без сопоставления по смыс
concatjoins
MiddleDevOps Engineer > Контейнеры и доставка > Облачные платформы
Короткий ответ Multi-AZ создаёт синхронную резервную копию primary в другой зоне доступности для автоматического отказоустойчивого переключения при сбое, а read-реплика — асинхронная копия для масштабирования нагрузки чтения; это разные механизмы с разными целями, и для решения обеих задач одновременно их комбинируют вместе. Как это работает подробнее в Multi-AZ приложение всегда обращается к одному и тому же конечному имени primary, и при сбое провайдер автоматически переключает это имя на резервный инстанс, данные синхронизируются синхронно или почти синхронно; read-реплика — отдельный эндпоинт только для чтения, с асинхронной репликацией и заметной задержкой. Пример кода Что использовать на практике Рекомендация. для системы, которой нужна и высокая доступность, и масштабирование чтения, включают Multi-AZ для primary и дополнительно создают одну или несколько read-реплик; важно разделять в коде приложения эндпоинт для записи и для чтения и мониторить replication lag отдельно от статуса failover. Проверка.
high-availabilitymanaged-databases
MiddleDevOps Engineer > Контейнеры и доставка > Хранение данных
Короткий ответ Named volume хранится на диске хоста и переживает перезапуск/удаление контейнера, а tmpfs mount существует только в оперативной памяти хоста, никогда не пишется на диск и полностью исчезает при остановке контейнера — подходит для временных чувствительных данных и ускорения операций ввода-вывода. Как это работает подробнее tmpfs — это файловая система, полностью размещённая в RAM (и, в зависимости от настроек, swap), поэтому операции чтения/записи в ней заметно быстрее дисковых, но весь объём ограничен доступной памятью и может быть явно лимитирован флагом size. Named volume, напротив, задействует постоянное хранилище хоста через выбранный volume-драйвер и гарантирует сохранность данных между перезапусками. Пример кода Что использовать на практике Практика. tmpfs применяют для временных файлов сессий, кэшей, расшифрованных секретов, которые не должны попасть на диск ни при каких обстоятельствах (например, по требованиям безопасности), а также для существенного ускорения I/O-интенсивных временных
containersdocker
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ groupby даёт более общий и гибкий инструмент агрегации с результатом в "длинном" формате, а pivot_table — это надстройка над groupby, сразу разворачивающая одну из группировочных переменных в столбцы, то есть удобна для получения "широкой" сводной таблицы. Как это работает подробнее pivot_table(values, index, columns, aggfunc) внутри фактически делает groupby по комбинации index и columns, а затем разворачивает значения columns в отдельные столбцы результата; groupby без columns оставляет результат в виде одного или нескольких уровней индекса без разворота. Пример кода Что использовать на практике Практика. pivot_table удобен для отчётов вида "строки — месяцы, столбцы — категории, значения — сумма продаж", которые удобно читать визуально; groupby лучше подходит, когда результат нужен для дальнейших программных вычислений или объединения с другими таблицами, так как длинный формат проще обрабатывать дальше. Проверка. итоговая таблица должна содержать строки Jan/Feb и столбцы A/B с суммами 100, 1
aggregationgroupby
JuniorPython Developer > Основы Python > HTTP-семантика
Короткий ответ PUT заменяет ресурс целиком и идемпотентен; PATCH применяет частичное изменение и не обязан быть идемпотентным. Если ресурс не найден, обычно возвращают 404, но PUT иногда допускает создание ресурса по заданному URL (тогда 201). Как это работает подробнее PUT ожидает полное представление ресурса — поля, которые не переданы, по спецификации REST должны считаться отсутствующими/сброшенными. PATCH передаёт только изменяемые поля или набор операций (например, JSON Merge Patch или JSON Patch по RFC 6902). Пример кода Что использовать на практике Рекомендация. для простых API часто используют PATCH с частичным JSON-объектом, который мержится с текущими данными в коде обработчика. PUT уместен, когда клиент владеет полным представлением ресурса (например, конфигурация). Решение зависит от соглашений конкретного API — это нужно явно документировать в контракте. Подводные камни Риски. реализовывать PATCH так, что непереданные поля интерпретируются как "сбросить в null" (это поведение PUT, а не PATCH); сч
httppatch
JuniorPython Developer > Основы Python > Django ORM
Короткий ответ get() ожидает ровно одну подходящую строку и возвращает сам объект, выбрасывая DoesNotExist, если строк нет, или MultipleObjectsReturned, если найдено больше одной; filter().first() возвращает первый объект из QuerySet или None, без исключений при отсутствии совпадений. Как это работает подробнее get() выполняет тот же SQL-запрос, что и filter(), но проверяет количество строк и возвращает объект либо поднимает исключение; filter() всегда возвращает QuerySet, а .first()/.last() материализуют один объект или None. Пример кода Что использовать на практике Практика. get() удобен, когда ожидается ровно одна запись (поиск по уникальному email); отсутствие/дублирование — ошибочная ситуация, которую стоит обработать явно. filter().first() уместен, когда отсутствие результата — нормальный случай. Подводные камни Ошибка. Используют get() без обработки исключений в коде, который должен штатно работать с «не найдено», получая необработанный 500 вместо 404; забывают, что MultipleObjectsReturned возможен, ес
django-ormorm
JuniorPython Developer > Основы Python > API и контракты
Короткий ответ REST моделирует взаимодействие как операции над ресурсами (GET/POST/PUT/DELETE на URL), а RPC моделирует взаимодействие как вызов удалённой функции/метода с произвольным именем и параметрами (например через gRPC). Как это работает подробнее REST опирается на единообразную семантику HTTP-методов и статус-кодов вокруг ресурсов; RPC описывает набор методов-процедур (CreateOrder, CancelOrder), часто через бинарный протокол (protobuf в gRPC). Что использовать на практике Практика. REST удобен для публичных/веб-API и браузерных клиентов, легко кешируется по URL; gRPC выгоден для внутреннего взаимодействия сервисов с высокими требованиями к производительности и строгой типизации. Подводные камни Риск. Пытаться «причесать» под REST операции, которые по сути — команды, вместо явного RPC-подобного эндпоинта-действия; выбирать gRPC только из-за «модности» без реальной потребности.
apiapi-design
JuniorPython Developer > Основы Python > Коллекции и структуры данных
Короткий ответ Метод sort() сортирует список на месте (in-place) и возвращает None, а функция sorted() принимает любой итерируемый объект и возвращает новый отсортированный список, оставляя исходный без изменений. Как это работает подробнее Выбор между ними зависит от задачи: нужен ли исходный порядок и какой именно объект сортируется. Сортировка на месте. list.sort() изменяет сам список и экономит память, потому что новая коллекция не создаётся. Новый список. sorted() работает с любым итерируемым объектом — строкой, кортежем, словарём, множеством — и всегда возвращает список. Общие параметры. Обе функции поддерживают reverse=True для сортировки по убыванию и параметр key — функцию, по результату которой сравниваются элементы, например sorted(words, key=len). Возврат None. Метод sort() не возвращает отсортированный список, поэтому присваивание его результата переменной теряет данные. Пример кода Что использовать на практике Исходный не нужен. Когда старый порядок не важен и хочется сэкономить память, использу
listspython
JuniorPython Developer > Основы Python > ООП и модель объектов
Короткий ответ Обычный метод получает первым аргументом экземпляр (self) и обращается к его состоянию; classmethod получает первым аргументом сам класс (cls) и обычно используется для альтернативных конструкторов; staticmethod не получает ни self, ни cls и ведёт себя как обычная функция, просто логически связанная с классом по смыслу. Как это работает подробнее Декоратор @classmethod превращает первый параметр в ссылку на класс, через который метод был вызван (это важно при наследовании — cls будет указывать на класс-наследник, если метод вызван через него). @staticmethod убирает автоматическую передачу чего-либо — метод просто помещён в namespace класса для группировки, без доступа к self/cls. Пример кода Что использовать на практике Практика. classmethod часто используют для фабричных методов, создающих объект по-другому (User.from_dict(data)), которые должны уметь работать и для подклассов. staticmethod применяют для вспомогательных функций, логически относящихся к классу (например, валидация формата email
classmethodobject-model
SeniorJava Developer > Java Core > Multithreading
Короткий ответ Оба механизма обеспечивают взаимное исключение и реентерабельны: поток, уже владеющий монитором или замком, может захватить его повторно. synchronized — встроенная конструкция языка: монитор захватывается при входе в метод или блок и автоматически освобождается при выходе, даже при исключении. ReentrantLock из java.util.concurrent.locks требует явного lock() и освобождения в finally, но даёт больше контроля. Как это работает подробнее Возможности synchronized ограничены: нельзя прервать поток, ожидающий блокировку, нельзя установить таймаут ожидания, нет честной (fair) очереди, а захват возможен только в пределах одного метода или блока. ReentrantLock предоставляет tryLock() (захват без блокировки или с таймаутом), lockInterruptibly() (прерываемое ожидание), честные замки и несколько объектов Condition для тонкого управления ожиданием. Именно tryLock с таймаутом позволяет писать код, устойчивый к deadlock: не получилось захватить блокировку — поток освобождает уже захваченные ресурсы и повторяе
javalock