💡 C++:
Если ключ уже приходит как
std::map<std::string, ...> не обязан создавать временный std::string при каждом поискеЕсли ключ уже приходит как
std::string_view, можно использовать transparent comparator:
std::map<std::string, int, std::less<>> status_codes{
{"not_found", 404},
{"timeout", 504}
};
std::string_view key = "timeout";
auto match = status_codes.find(key);
❤8👍5
🔥 Почему в Redis Cluster именно 16 384 hash slot и при чём тут `{}`
Redis Cluster распределяет ключи не напрямую по нодам, а сначала по 16 384 hash slots.
Формула по сути такая:
Но есть важный трюк — hash tags.
Если ключ содержит часть в фигурных скобках, Redis хеширует только содержимое внутри
Оба ключа будут вычислены по
Это нужно для multi-key операций в cluster mode.
Именно поэтому такие конструкции позволяют нормально использовать:
-
-
- транзакции
- Lua-скрипты с несколькими ключами
На уровне кода Redis сначала ищет
Небольшая деталь синтаксиса, которая на самом деле решает важную проблему распределённых операций в Redis Cluster.
Redis Cluster распределяет ключи не напрямую по нодам, а сначала по 16 384 hash slots.
Формула по сути такая:
CRC16(key) % 16384Но есть важный трюк — hash tags.
Если ключ содержит часть в фигурных скобках, Redis хеширует только содержимое внутри
{}:{user100}:cart {user100}:ordersОба ключа будут вычислены по
user100, поэтому попадут в один и тот же hash slot и, соответственно, на одну ноду.Это нужно для multi-key операций в cluster mode.
Именно поэтому такие конструкции позволяют нормально использовать:
-
MGET-
MSET- транзакции
- Lua-скрипты с несколькими ключами
На уровне кода Redis сначала ищет
{, затем }, и если внутри есть непустая строка — хеширует только её.Небольшая деталь синтаксиса, которая на самом деле решает важную проблему распределённых операций в Redis Cluster.
👍6❤2
Например:
SYSCALL_DEFINE3(write, unsigned int, fd, const char __user *, buf, size_t, count)После препроцессора это превращается сразу в несколько функций:
-
sys_write-
__se_sys_write-
__do_sys_writeОдна строка описывает системный вызов, а C-препроцессор через макросы и token pasting собирает остальную обвязку автоматически.
Именно поэтому код ядра Linux часто выглядит коротко, пока не начнёшь разворачивать макросы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤7👍3🔥2
🔥 Приглашаем на бесплатный открытый вебинар курса «Программист С»: «Указатели в Си — от адреса к управлению памятью»
🗓 Когда: 24 сентября, 20:00 (мск)
Указатели — это не просто синтаксис, а ключ к пониманию того, как Си общается с памятью. Без них невозможно осознанно работать с массивами, строками, структурами и динамическими данными. На вебинаре разберём указатели от самого основания — адресов и операторов — до передачи параметров по ссылке, чтобы вы перестали бояться звёздочек и начали управлять памятью уверенно.
Что будет на вебинаре:
• Разбор ключевых понятий: адрес переменной, операторы & и *, объявление и разыменовывание указателей — разберём, как Си работает с памятью напрямую;
• Пошаговый анализ связи указателей, массивов и функций — выясним, как передавать параметры по ссылке и заставлять функции изменять переменные вызывающего кода.
👉 Зарегистрируйтесь https://otus.pw/BLgM/?erid=2W5zFHuFYrV
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
🗓 Когда: 24 сентября, 20:00 (мск)
Указатели — это не просто синтаксис, а ключ к пониманию того, как Си общается с памятью. Без них невозможно осознанно работать с массивами, строками, структурами и динамическими данными. На вебинаре разберём указатели от самого основания — адресов и операторов — до передачи параметров по ссылке, чтобы вы перестали бояться звёздочек и начали управлять памятью уверенно.
Что будет на вебинаре:
• Разбор ключевых понятий: адрес переменной, операторы & и *, объявление и разыменовывание указателей — разберём, как Си работает с памятью напрямую;
• Пошаговый анализ связи указателей, массивов и функций — выясним, как передавать параметры по ссылке и заставлять функции изменять переменные вызывающего кода.
👉 Зарегистрируйтесь https://otus.pw/BLgM/?erid=2W5zFHuFYrV
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963.
👍2
💡 Алгоритм Флойда находит цикл в связном списке всего с двумя указателями и `O(1)` дополнительной памяти.
Идея простая:
Если цикл есть, они обязательно встретятся.
После встречи один указатель возвращаем в
Сложность:
Один из самых красивых примеров того, как простая математика по модулю превращается в очень практичный алгоритм.
Идея простая:
slow двигается на 1 узел fast — на 2Если цикл есть, они обязательно встретятся.
После встречи один указатель возвращаем в
head, а дальше оба двигаем по одному узлу. Следующая точка встречи — точное начало цикла.
Node *detect_cycle(Node *head) {
Node *slow = head, *fast = head;
while (fast && fast->next) {
slow = slow->next;
fast = fast->next->next;
if (slow == fast) {
slow = head;
while (slow != fast) {
slow = slow->next;
fast = fast->next;
}
return slow;
}
}
return NULL;
}
Сложность:
O(n) по времени
O(1) по памяти
Один из самых красивых примеров того, как простая математика по модулю превращается в очень практичный алгоритм.
❤10👍4
«Я про бэкенд»: как устроены AI-системы под капотом бигтеха
🗓 3 октября, Москва и онлайн
О чём: как разработчики высоконагруженных рекомендательных и генеративных систем справляются с нетривиальными вызовами. Доклады в 6 направлениях — от архитектуры систем с AI/ML до MLOps и работы на стыке бэкенда с железом.
Часть спикеров:
🎤 Михаил Цветков (Алиса AI и Умные устройства) — как устроен инференс генеративных ответов Алисы в Поиске
🎤 Алина Шестакова (Positive Technologies, Cloud SIEM) — вердикт за минуту: ML-фильтр и LLM на потоке более 40 тысяч событий в секунду
🎤 Андрей Аксёнов (Авито) — база векторных баз
🎤 Егор Хайруллин (Рекламные технологии Яндекса) — как распределённо обрабатывать более 100 ГБ/с в реальном времени без потерь и дублей с помощью YTsaurus Flow
🎤 Владислав Тюльбашев (Яндекс) — как надежно раздавать конфиги на 200к хостов при отказе [n-1] ДЦ
🎤 Алексей Логинов (Алиса AI и Умные устройства) — как сделать агентную платформу надёжной
Кроме того, зрителей ждет традиционный лайв, где бэкенд-инженеры Яндекса спроектируют архитектуру сложного сервиса в реальном времени. В этот раз задачу для эфира можете задать вы: участвуйте в проекте «2718», отправляйте свои кейсы, а организаторы выберут среди них самый сложный для открытого разбора.
Полная программа и регистрация
🗓 3 октября, Москва и онлайн
О чём: как разработчики высоконагруженных рекомендательных и генеративных систем справляются с нетривиальными вызовами. Доклады в 6 направлениях — от архитектуры систем с AI/ML до MLOps и работы на стыке бэкенда с железом.
Часть спикеров:
🎤 Михаил Цветков (Алиса AI и Умные устройства) — как устроен инференс генеративных ответов Алисы в Поиске
🎤 Алина Шестакова (Positive Technologies, Cloud SIEM) — вердикт за минуту: ML-фильтр и LLM на потоке более 40 тысяч событий в секунду
🎤 Андрей Аксёнов (Авито) — база векторных баз
🎤 Егор Хайруллин (Рекламные технологии Яндекса) — как распределённо обрабатывать более 100 ГБ/с в реальном времени без потерь и дублей с помощью YTsaurus Flow
🎤 Владислав Тюльбашев (Яндекс) — как надежно раздавать конфиги на 200к хостов при отказе [n-1] ДЦ
🎤 Алексей Логинов (Алиса AI и Умные устройства) — как сделать агентную платформу надёжной
Кроме того, зрителей ждет традиционный лайв, где бэкенд-инженеры Яндекса спроектируют архитектуру сложного сервиса в реальном времени. В этот раз задачу для эфира можете задать вы: участвуйте в проекте «2718», отправляйте свои кейсы, а организаторы выберут среди них самый сложный для открытого разбора.
Полная программа и регистрация
я про бэкенд
я про бэкенд — Конференция про вызовы бэкенд-разработки в эпоху роста нагрузки и развития AI
👍4🔥2
⚙️ useful_abstractions - вычисления на этапе компиляции в C++23
Библиотека упрощает работу с
Что можно делать при компиляции:
* Передавать строки в параметры шаблонов и собирать их из частей.
* Вычислять хеши.
* Получать имена типов без RTTI.
* Экранировать строки для JSON, URL и HTML.
* Проверять UTF-8 и преобразовывать его в UTF-16/UTF-32.
* Останавливать сборку с понятным сообщением при ошибке в данных.
Например, некорректный строковый литерал или недопустимое значение можно обнаружить ещё до запуска программы.
Требуется C++23: GCC 14+, Clang 19+ или свежий AppleClang.
Документация — https://constexprcore.github.io/useful_abstractions/
Библиотека упрощает работу с
constexpr и consteval. Один заголовочный файл, без зависимостей за пределами стандартной библиотеки.Что можно делать при компиляции:
* Передавать строки в параметры шаблонов и собирать их из частей.
* Вычислять хеши.
* Получать имена типов без RTTI.
* Экранировать строки для JSON, URL и HTML.
* Проверять UTF-8 и преобразовывать его в UTF-16/UTF-32.
* Останавливать сборку с понятным сообщением при ошибке в данных.
Например, некорректный строковый литерал или недопустимое значение можно обнаружить ещё до запуска программы.
Требуется C++23: GCC 14+, Clang 19+ или свежий AppleClang.
Документация — https://constexprcore.github.io/useful_abstractions/
constexprcore.github.io
useful_abstractions — Useful Abstractions
A header-only C++23 library of compile-time abstractions: strings you can pass as template parameters, hashing, type names, UTF conversion and escaping — all usable inside constexpr and consteval code, and all with no dependencies beyond the standard library.
🔥5👍1
Как посчитать миллиарды уникальных значений, используя всего несколько килобайт памяти
Для этого существует
Вместо хранения каждого значения он:
— хеширует элементы
— распределяет их по buckets
— отслеживает необычно длинные последовательности нулей в хэшах
— по этой статистике оценивает cardinality
Например, с
При этом ошибка может оставаться около 1%.
Именно поэтому HyperLogLog любят в аналитике и больших данных: посчитать
Магия тут не в точности до последнего элемента, а в очень хорошем компромиссе между памятью и результатом.
Для этого существует
HyperLogLog - вероятностный алгоритм оценки количества уникальных элементов.Вместо хранения каждого значения он:
— хеширует элементы
— распределяет их по buckets
— отслеживает необычно длинные последовательности нулей в хэшах
— по этой статистике оценивает cardinality
Например, с
16384 регистрами можно оценивать даже огромные множества, занимая порядка десятков килобайт памяти.При этом ошибка может оставаться около 1%.
Именно поэтому HyperLogLog любят в аналитике и больших данных: посчитать
COUNT(DISTINCT ...) для миллиардов объектов можно без хранения миллиардов ID.Магия тут не в точности до последнего элемента, а в очень хорошем компромиссе между памятью и результатом.
❤12👍3🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
Лицо C++-разработчика, когда он написал 6000 строк кода, чтобы обогнать твои 4 строки на Python на 0,000438 секунды.
🤣26🥱16😁4👍2❤🔥1
⚡️ Как спроектировать ИИ-агента над корпоративными данными
6 октября в 17:00 мск пройдёт новая встреча Архитектурного клуба Яндекс 360 — открытого сообщества для архитекторов и инженеров высоконагруженных систем.
Даниил Смирнов, руководитель службы бэкенд-разработки Антиспама Яндекс 360 , разберёт архитектуру корпоративного агента: оркестратор, инструменты, память, EVAL и наблюдаемость.
На эфире обсудят:
- как сочетать полнотекстовый и векторный поиск, метаданные, фильтры и переранжирование;
- как наследовать права исходных систем и изолировать данные разных пользователей и организаций;
- как не выдавать из индекса и кеша данные тем, у кого нет доступа;
- как ограничивать автономность агента;
- как отдельно оценивать качество поиска, выбора инструментов и итогового ответа.
📅 6 октября, 17:00 мск
💻 Онлайн, участие бесплатное
→ Зарегистрироваться на встречу
6 октября в 17:00 мск пройдёт новая встреча Архитектурного клуба Яндекс 360 — открытого сообщества для архитекторов и инженеров высоконагруженных систем.
Даниил Смирнов, руководитель службы бэкенд-разработки Антиспама Яндекс 360 , разберёт архитектуру корпоративного агента: оркестратор, инструменты, память, EVAL и наблюдаемость.
На эфире обсудят:
- как сочетать полнотекстовый и векторный поиск, метаданные, фильтры и переранжирование;
- как наследовать права исходных систем и изолировать данные разных пользователей и организаций;
- как не выдавать из индекса и кеша данные тем, у кого нет доступа;
- как ограничивать автономность агента;
- как отдельно оценивать качество поиска, выбора инструментов и итогового ответа.
📅 6 октября, 17:00 мск
💻 Онлайн, участие бесплатное
→ Зарегистрироваться на встречу
🥱4❤2👍2🔥2🥰1
Физически корректный ray tracer всего в 99 строках C++
smallpt от Kevin Beason - один из самых известных примеров того, насколько компактным может быть настоящий path tracer.
В этих 99 строках есть:
* отражения
* преломления
* мягкие тени
* color bleeding
* зеркальные и стеклянные поверхности
Основа при этом минимальная: векторы, лучи, сферы и одна рекурсивная функция
Если дать рендеру тысячи samples per pixel, он собирает полноценный Cornell Box с зеркальной и стеклянной сферами.
Проект появился ещё в 2008 году и до сих пор отлично показывает базовую механику path tracing.
smallpt от Kevin Beason - один из самых известных примеров того, насколько компактным может быть настоящий path tracer.
В этих 99 строках есть:
* отражения
* преломления
* мягкие тени
* color bleeding
* зеркальные и стеклянные поверхности
Основа при этом минимальная: векторы, лучи, сферы и одна рекурсивная функция
radiance().Если дать рендеру тысячи samples per pixel, он собирает полноценный Cornell Box с зеркальной и стеклянной сферами.
Проект появился ещё в 2008 году и до сих пор отлично показывает базовую механику path tracing.
❤17👍5🔥5
😂 Собеседование на C++ прошло успешно
HR: у вас есть опыт с C++?
Я: конечно, отлично знаю оператор `goes to`.
Никакого специального --> оператора в C++ тут нет.
Это просто:
Сначала берётся текущее значение x и сравнивается с 0, а затем x уменьшается на единицу.
Поэтому код выведет:
Один из тех C++-трюков, который выглядит как отдельный оператор, хотя на самом деле это просто удачно поставленные -- и >.
HR: у вас есть опыт с C++?
Я: конечно, отлично знаю оператор `goes to`.
int x = 10;
while (x --> 0) {
std::cout << x << '\n';
}
Никакого специального --> оператора в C++ тут нет.
Это просто:
x-- > 0
Сначала берётся текущее значение x и сравнивается с 0, а затем x уменьшается на единицу.
Поэтому код выведет:
9
8
7
6
5
4
3
2
1
0
Один из тех C++-трюков, который выглядит как отдельный оператор, хотя на самом деле это просто удачно поставленные -- и >.
🤣32❤13👍4🔥4
`🤖 В SourceCraft появилась команда цифровых разработчиков
Агентам можно назначать задачи прямо в GitLab. Они работают под собственными учётными записями, выполняют поручения и возвращают результат разработчику.
Если по ходу работы чего-то не хватает, агент сам запрашивает данные или согласование у команды — то есть не останавливается на первом незаполненном месте.
Ещё можно подключить собственного агента, в том числе созданного в Yandex AI Studio.
Агентам можно назначать задачи прямо в GitLab. Они работают под собственными учётными записями, выполняют поручения и возвращают результат разработчику.
Если по ходу работы чего-то не хватает, агент сам запрашивает данные или согласование у команды — то есть не останавливается на первом незаполненном месте.
Ещё можно подключить собственного агента, в том числе созданного в Yandex AI Studio.
❤3🔥2👍1🤔1
🐧 Linux Cheat Sheet - шпаргалка по командам Linux
Самая удобная шпаргалка по Linux и Bash на русском: теория простым языком (как устроены файлы, процессы, права, память, загрузка и сеть), команды терминала, права доступа, процессы, сеть, SSH, systemd, grep/sed/awk, Vim и готовые однострочники - с примерами.
А для тех, кто идёт дальше, - продвинутый уровень: Bash для профи, LVM и RAID, трассировка и производительность, ядро, безопасность, контейнеры, восстановление системы и вопросы с собеседований.
https://github.com/justxor/Linux-/
Самая удобная шпаргалка по Linux и Bash на русском: теория простым языком (как устроены файлы, процессы, права, память, загрузка и сеть), команды терминала, права доступа, процессы, сеть, SSH, systemd, grep/sed/awk, Vim и готовые однострочники - с примерами.
А для тех, кто идёт дальше, - продвинутый уровень: Bash для профи, LVM и RAID, трассировка и производительность, ядро, безопасность, контейнеры, восстановление системы и вопросы с собеседований.
https://github.com/justxor/Linux-/
❤7🔥4👍2🎉1
Minimum-Cost Maximum-Flow всего в ~110 строках C++
Хороший компактный пример одного из самых полезных алгоритмов на графах.
Задача MCMF: провести через сеть максимально возможный поток и одновременно сделать его стоимость минимальной.
В этой реализации:
- residual graph хранит оставшиеся возможности для потока
- SPFA каждый раз ищет самый дешёвый увеличивающий путь
- после поиска определяется bottleneck - сколько потока реально можно протолкнуть по найденному пути
- поток отправляется по пути
- процесс повторяется, пока путь из источника в сток больше найти нельзя
Особенно красивый трюк - обратные рёбра.
Прямое и обратное ребро добавляются подряд, поэтому получить индекс пары можно через:
Если id чётный, id ^ 1 даст следующее нечётное ребро. Если нечётный - вернёт предыдущее чётное.
MCMF пригодится там, где мало просто найти максимальный поток и у каждого решения есть цена:
• назначение сотрудников на задачи
• логистика
• маршрутизация
• matching с разной стоимостью
• распределение ресурсов
• расписания
Компактный пример того, как residual network, shortest path и greedy augmentation собираются в один мощный алгоритм.
Хороший компактный пример одного из самых полезных алгоритмов на графах.
Задача MCMF: провести через сеть максимально возможный поток и одновременно сделать его стоимость минимальной.
В этой реализации:
- residual graph хранит оставшиеся возможности для потока
- SPFA каждый раз ищет самый дешёвый увеличивающий путь
- после поиска определяется bottleneck - сколько потока реально можно протолкнуть по найденному пути
- поток отправляется по пути
- процесс повторяется, пока путь из источника в сток больше найти нельзя
Особенно красивый трюк - обратные рёбра.
Прямое и обратное ребро добавляются подряд, поэтому получить индекс пары можно через:
id ^ 1
Если id чётный, id ^ 1 даст следующее нечётное ребро. Если нечётный - вернёт предыдущее чётное.
MCMF пригодится там, где мало просто найти максимальный поток и у каждого решения есть цена:
• назначение сотрудников на задачи
• логистика
• маршрутизация
• matching с разной стоимостью
• распределение ресурсов
• расписания
Компактный пример того, как residual network, shortest path и greedy augmentation собираются в один мощный алгоритм.
🔥2❤1