MiddlePython Developer > Основы Python > Потоки и синхронизация
Короткий ответ Daemon-поток автоматически прерывается при завершении основной программы, не дожидаясь своего окончания, тогда как обычный поток удерживает процесс от завершения, пока сам не закончит работу — это удобно для фоновых задач, но рискует прервать работу без корректной очистки. Как это работает подробнее Атрибут daemon=True устанавливается до вызова start(); интерпретатор не ждёт завершения daemon-потоков при выходе из программы, в отличие от обычных потоков, которые нужно явно join() или программа будет ждать их завершения перед выходом. Пример кода Что использовать на практике Практика. Daemon-потоки удобны для фоновых служебных задач (периодическая очистка кэша, heartbeat), которые не критичны для корректности данных; для задач, критичных для целостности данных (запись в файл, коммит транзакции), daemon-поток рискован, так как может быть прерван посередине операции. Подводные камни Риски. Делают daemon-потоком задачу, которая должна гарантированно завершить запись данных перед выходом процесса, и
concurrencypython
MiddleData Analyst > SQL и данные > Визуализация и BI
Короткий ответ Drill-down раскрывает детализацию внутри одного визуала по заранее заданной иерархии (например, год → квартал → месяц); drill-through переходит на отдельную страницу/отчёт, отфильтрованную по выбранному значению — drill-down быстрее для беглого исследования, drill-through лучше для показа принципиально более детального представления без перегрузки основного дашборда. Как это работает подробнее Drill-down использует заранее заданную иерархию внутри одного визуала и обычно переагрегирует тот же запрос на более мелкой гранулярности; drill-through передаёт контекст клика (фильтры) на отдельную страницу/отчёт, который может показывать построчную детализацию или совершенно другой макет. Что использовать на практике Применение. Используйте drill-down для быстрого исследования по естественной иерархии (регион → страна → город), где влияние на производительность небольшое; используйте drill-through, когда детальное представление требует другой гранулярности данных (например, отдельные транзакции), котор
dashboard-designdrill-down
MiddleJava Developer > Java Core > Исключения
Короткий ответ Exception и Error — наследники Throwable, но это разные классы проблем. Exception — событие, нарушающее нормальный ход программы, которое в большинстве случаев можно перехватить через try-catch и восстановить работу. Error — серьёзная проблема уровня JVM или окружения: приложение обычно не в силах с ней справиться, поэтому ловить Error не принято. Как это работает подробнее Exception описывает события, нарушающие нормальный ход программы, но в большинстве случаев восстановимые: IOException, SQLException (checked), а также RuntimeException и её наследники. Перехватив такое исключение через try-catch, программа обычно может продолжить работу. Error — это критические проблемы уровня JVM или окружения: OutOfMemoryError, StackOverflowError, NoClassDefFoundError, AssertionError. Дальнейшая стабильная работа часто невозможна, поэтому «чинить» их в коде не принято — нужны другие настройки JVM, исправление кода или инфраструктуры. Технически перехватить Error можно (он наследник Throwable), но делать эт
errorexceptions
MiddlePython Developer > Основы Python > Веб-фреймворки: Django, Flask, FastAPI
Короткий ответ get() возвращает ровно один объект и выбрасывает исключения DoesNotExist или MultipleObjectsReturned, если число записей не совпадает. filter() возвращает QuerySet со всеми подходящими объектами, и пустой результат для него нормален. Как это работает подробнее Методы различаются ожидаемым числом записей и типом результата. get(). Уместен, когда условие гарантированно выделяет единственную запись, например первичный ключ: Student.objects.get(id=1). filter(). Возвращает QuerySet с одной, несколькими или ни одной записью, который можно дальше уточнять и сортировать. Исключения. DoesNotExist и MultipleObjectsReturned обрабатываются через try/except с классами исключений Django. Тип результата. get() сразу даёт экземпляр модели, а filter() — ленивый QuerySet, который выполняется при обращении к данным. Пример кода Что использовать на практике Уникальные поля. Используй get() для поиска по id или другому уникальному полю. Произвольный набор. Используй filter(), когда результат может быть пустым или м
djangofilter
MiddleData Analyst > SQL и данные > Python для анализа данных
Короткий ответ transform возвращает результат той же формы, что и исходные данные (по одному значению на каждую исходную строку, "размноженному" внутри группы), а apply может возвращать результат произвольной формы, включая свёрнутый до одной строки на группу. Как это работает подробнее transform применяет функцию к каждой группе и "растягивает" результат обратно на все строки этой группы, что удобно для добавления группового значения (например, среднего по группе) как нового столбца исходной таблицы без явного merge; apply более гибок, но менее предсказуем по форме результата и часто медленнее. Пример кода Что использовать на практике Практика. typичный кейс для transform — "вычесть из каждой строки среднее значение её группы" (df['dev'] = df['x'] - df.groupby('g')['x'].transform('mean')); apply уместен, когда логика агрегации сложнее, чем единая функция, применимая колоночно, например, если внутри группы нужно вернуть несколько связанных статистик сразу. Проверка. для группы A group_mean должен быть 15 в об
aggregationapply
MiddleJava Developer > Java Core > Collections
Короткий ответ HashMap хранит пары в хэш-таблице: порядок обхода не определён и зависит от хэш-кодов и размера таблицы, операции put, get, remove в среднем O(1); допускается один null-ключ и null-значения. TreeMap хранит записи в красно-чёрном дереве: ключи всегда отсортированы — по естественному порядку (Comparable) или заданному Comparator, а все операции занимают O(log n). Как это работает подробнее TreeMap — это самобалансирующееся бинарное дерево поиска: в каждой вершине хранятся ключ, значение, ссылки на потомков и цвет (красный или чёрный); инварианты балансировки гарантируют высоту O(log n). null-ключ TreeMap не допускает, так как при вставке ключ нужно с чем-то сравнивать. Главный козырь — работа с упорядоченными данными: firstKey(), lastKey(), headMap(), tailMap(), subMap(). HashMap: порядок ключей не важен и нужна максимальная скорость. TreeMap: нужен отсортированный обход, поиск ближайших ключей или диапазонные выборки. Пример кода Что использовать на практике Используйте HashMap, когда порядок кл
big-ocollections
MiddleJava Developer > Java Core > Collections
Короткий ответ HashSet основан на HashMap (элементы — ключи карты) и не гарантирует порядка: элементы распределяются по корзинам по хэш-коду, операции добавления и поиска в среднем O(1), допускается один null. LinkedHashSet наследует HashSet и дополнительно прошивает элементы связным списком в порядке вставки. TreeSet хранит элементы отсортированными в красно-чёрном дереве за O(log n), а null не допускает. Как это работает подробнее Порядок в LinkedHashSet задаётся порядком добавления: при итерации элементы приходят именно в нём, цена — чуть больший расход памяти и немного более медленные операции. TreeSet сортирует по естественному порядку (Comparable) либо по переданному Comparator; при вставке элемент сразу сравнивается с другими, поэтому null даёт NullPointerException. Дерево позволяет отдавать диапазоны: subSet, headSet, tailSet. HashSet: максимальная скорость, порядок не важен. LinkedHashSet: нужен порядок вставки. TreeSet: нужен отсортированный обход и диапазонные операции. Пример кода Что использовать
collectionshashset
JuniorJava Developer > Java Core > Collections
HashTable синхронизирован целиком и не допускает null, HashMap быстрее и допускает один null-ключ.
Collections
JuniorDevOps Engineer > Контейнеры и доставка > Infrastructure as Code и управление конфигурацией
Короткий ответ helm install создаёт новый релиз в кластере, а helm upgrade применяет изменения (новую версию chart или values) к уже существующему релизу, сохраняя историю ревизий; повторный helm install с тем же именем релиза завершится ошибкой "cannot re-use a name that is still in use". Как это работает подробнее Helm хранит метаданные каждого релиза (включая отрендеренные манифесты каждой ревизии) как Kubernetes Secret в namespace релиза; upgrade сравнивает текущую (последнюю) ревизию с новой и применяет diff через серверный apply, увеличивая номер ревизии, что и даёт возможность helm rollback. Пример кода Что использовать на практике Практика. для идемпотентного деплоя из CI/CD часто используют helm upgrade --install, которая создаёт релиз, если его нет, или обновляет, если есть — это избавляет от необходимости различать первый и последующие деплои в пайплайне. Подводные камни Ошибка. использовать helm install в CI/CD без флага --install на upgrade, из-за чего второй и последующие запуски пайплайна падаю
configuration-managementhelm
JuniorData Analyst > SQL и данные > Python для анализа данных
Короткий ответ loc выбирает данные по меткам индекса и названиям столбцов, а iloc — по целочисленным позициям, независимо от того, какие метки реально стоят в индексе. Как это работает подробнее loc[a:b] включает обе границы диапазона, потому что это метки, а не позиции; iloc[a:b] ведёт себя как обычный Python-срез и не включает правую границу. Пример кода Что использовать на практике На практике: loc удобен, когда индекс содержательный (ID, даты), а iloc — когда важна именно позиция строки, например "взять первые N строк" независимо от значений индекса; после фильтрации или сортировки полезно вызывать reset_index(), если дальше планируется позиционный доступ. Проверка: df.loc[1] на этом DataFrame вызовет KeyError, так как метки 1 в индексе нет — это наглядно показывает отличие от iloc[1]. Подводные камни Частые ошибки: обращаются к loc[1], думая, что это вторая строка по счёту, хотя после фильтрации метки индекса могут быть произвольными и такой метки может не быть вовсе; путают включительные границы loc и п
ilocindexing