Вторичные индексы в YDB

Вторичные индексы в YDB живут в скрытых таблицах. Они так же чувствительны к возможности деления на партиции по ключам, как и обычные строковые таблицы. Способность делиться на партиции вторичные индесы наследуют от первичного ключа исходной таблицы. Согласно документации во вторичном индексе хранится: индексные колонки колонки первичного ключа таблицы копии дополнительных колонок для покрывающих индексов NB! первичный ключ таблицы вторичного ключа - это индексные колонки + колонки первичного ключа исходной таблицы. ...

23 марта 2026 г.

Посмотреть процессы прибитые OOM

PID убитого по out‑of‑memory‑процессу можно найти с помощью одной команды. Если есть логи с PID процесса, то найти пострадавшего можно, запустив ещё одну команду grep. OOM‑киллер безжалостен. Кажется, что он выбирает процесс случайным образом — тот, который нужно «пристрелить» на машине. На самом деле под капотом он работает совсем по‑другому, и случайности в его действиях нет. Взглянув на таблицу процессов и пару файлов, можно предсказать, какой процесс будет убит, если сейчас случится OOM. ...

8 сентября 2024 г.

Практический пример использования Protocol

Представьте себе ситуацию: у вас есть микросервисы, в каждом — своя конфигурация со своим набором параметров; есть библиотечный код, который получает и использует объекты конфигураций. Представили? А теперь в этот код надо завести подсказки типов. И тут представили? Давайте проведём мысленный эксперимент и попробуем это сделать. Вариантов в целом несколько. Варианты решения: Базовый класс конфигурации с ещё одним ветвлением:* затаскивать все возможные параметры; затаскивать только общие для микросервисов параметры. Использовать протоколы для нотации типов. Затаскивать все возможные варианты параметров в один базовый класс — гарантированный путь к «помойке». Затаскивать только общие параметры для микросервисов — получать кучу красного цвета от Pyright в общем коде. ...

26 февраля 2024 г.

Использование typing.Generic в Python

Я работаю над проектом с довольно большой кодовой базой. Проект с историей. Некоторые части наша команда написала задолго до аннотаций типов. Мы до сих пор добавляем их в наш легаси‑код и улучшаем существующие подсказки. Стоит ли эта игра свеч? Определённо — да. Наши пользователи — разработчики. Они открывают наш код в PyCharm ежедневно и надеются, что он поможет им решить их задачи максимально быстро и просто. Могу уверенно сказать, что существует корреляция между точностью автодополнения кода и тем, как быстро работают разработчики. Наша цель — не только добавить более точный статический анализ или автодополнение, но и не сломать их боевой код. ...

18 февраля 2022 г.

Для чего Python лучше не использовать?

На Quora относительно недавно задали вопрос «What is Python not good for?». Я бы хотел сказать, что Python хорош для всего. Но это неправда. Python во многих областях — второй. Не так много областей, где Python — номер один. К примеру, Go сейчас гораздо больше подходит для веб‑разработки, чем Python. Его довольно легко выучить, его гораздо легче деплоить. В Go есть достаточное количество «батареек» для любого веб‑приложения. Тем не менее Python остаётся второй опцией. ...

22 ноября 2019 г.

Подсказки типов в Python

Мой небольшой список источников по type hints в Python, которые я использую в повседневной практике. Относительно недавно я сменил проект. Теперь я работаю над DWH и ETL‑процессами. Проект большой: в нём сравнимое количество кода с предыдущим, но разработчиков гораздо больше. Я убеждён, что для этого проекта подсказки типов даже нужнее. Дело не только в количестве разработчиков. Особенность DWH/ETL‑проектов — наличие разнообразных источников, мест хранения и потребителей данных. Отсюда довольно сильная фрагментированность проекта. И если не добавить «клея», он развалится на отдельные скрипты. ...

24 мая 2019 г.

Clash of Code

В начале года я писал, что хочу сделать большой и интересный проект с Codingame: создать и обучить бота для Legends of Code & Magic. В очередной раз, когда я прокрастинировал начало этого проекта, я наткнулся на Clash of Code! — быстрые мини‑соревнования по кодированию на этом же сайте. Попробовав поиграть, я могу сказать, что это отличный способ отвлечься от рабочей рутины, попутно потренировав свои навыки. Формат Clash of Code Эти мини‑соревнования строятся по такому принципу: ...

26 апреля 2019 г.

Переименование при импорте

В Python есть замечательная возможность присваивать свои имена при импорте (import foo.bar.baz as fbb). Так можно легко избежать конфликтов имён при импорте и повысить читаемость кода, если требуется. Но этой же возможностью можно легко превратить хороший код в абсолютно нечитаемый. В последнее время я несколько раз встречался с этим: попадались мне в основном странные сокращения и непонятные имена для алиасов. Продемонстрирую проблему на примере сокращений. Хороший пример придумать с ними проще: ...

18 марта 2019 г.

Пожалуйста, не используйте else

Я не люблю else, когда обе ветки содержат return. Всегда можно написать код без этого придатка для if. Такой код будет компактнее, проще читаться и лучше выглядеть. Так зачем же многие пишут этот никчёмный else? Делая ревью кода одного из коллег, я указал на то, что его код можно упростить, убрав else. Ответом была ссылка на PEP8, где такое поведение определяется допустимым. Код был примерно таким: def get_magic_number(use_magic): if use_magic: return calculate_with_magic() else: return calculate_with_science() С точки зрения работоспособности этому коду нечего предъявить. Меня, как читателя, такой код заставляет остановиться и задуматься: ...

29 января 2019 г.

Мобильное приложение на Kivy и Python? Мм… Не сейчас

Есть несколько GUI‑фреймворков на Python. Большинство из них предназначены только для десктопных приложений. Kivy — редкое исключение: с использованием этого фреймворка можно, в теории, строить мобильные приложения. К сожалению, он не готов к продакшену. Вы вынуждены жонглировать версиями библиотек, чтобы заставить это работать. Так что, даже сидя в футболке с надписью print("Python is my favorite language"), я должен признать, что Kivy не подходит для мобильной разработки. Хорошо. Жонглировать версиями приходится и в случае веб‑приложения. Но всё‑таки тогда в 99 % случаев речь идёт о библиотеках Python либо есть контроль над окружением. В целом вы можете построить Docker‑образ с любыми версиями, какие необходимы. Kivy же вносит кучу бинарных зависимостей, которые должны быть установлены с помощью специфичных для платформ инструментов. И в целом вы не сможете контролировать окружение — а это меняет всё. ...

25 октября 2018 г.