Обновить

kata — библиотека для оркестрации многошаговых операций в Go

Уровень сложностиСредний

Каждый раз когда нужно реализовать многошаговую операцию, я сталкиваюсь с одной и той же проблемой. Если один из шагов падает, нужно откатить всё что успело выполниться до него.

Это выглядит примерно так:

Читать далее

Безрекурсивный алгоритм обхода N-мерных деревьев Константина Тарасенкова

Уровень сложностиПростой

Проснувся, голодненький, начал думать, что мне нужен алгоритм обхода двумерного дерева но без рекурсий, так как выполнять я его буду в while цикле на GPU, а многие GPU языки программирования, особенно графические, рекурсию не умеют, поэтому остаётся только придумать безрекурсивный алгоритм.

И придумал. Где-то за час. Не знаю, есть уже такой или нет, но на всякий случай назову его своим именем: "Безрекурсивный алгоритм обхода N-мерных деревьев Константина Тарасенкова".

Для простоты примера возьмём двумерное дерево, хоть и алгоритм может работать с любой мерностью деревьев.

Каждая нода дерева возвращает правду (t) или ложь (f) -- нужно ли продолжать обход ветвей этой ноды или нет.

Наша цель, которую мы хотим найти, это правда (t) в конечной ветви дерева, которая в данном примере находится только в ноде под индексом 3.

В данном примере, дерево и его ноды выглядят так:

........... 0t ..........

.... 1t ....... 2t .....

.. 3t 4f ... 5f 6f ..

Для вычисления алгоритма дополнительно требуется только одно число (итератор, далее будет выглядеть как i) и один массив чисел (далее массив будет выглядеть как [индекс ноды, индекс ноды, ...])

Алгоритм состоит из 5-ти условий, можете пропустить читать их, они будут более понятны чуть позже:

1. Если итератор равен нулю, и текущая нода массива под итератором имеет индекс -1, -- терминация всего алгоритма.

2. Если текущая нода массива под итератором имеет индекс -1, -- декремент итератора на 1.

3. Если текущая нода массива под итератором имеет индекс не -1 и возвращает ложь (f), -- замена индекса этой ноды в массиве на -1, декремент итератора на 1.

Читать далее

Основные паттерны конкурентности в Go: Worker Pool

Уровень сложностиСредний

Проблемы которые можно решить этим паттерном:

1. Если сервис делает 1000 запросов в секунду к базе данных, а она выдерживает только 100, пул воркеров защитит БД от падения.

2. При внезапном всплеске трафика go func() на каждый запрос может создать 100500 горутин и съесть всю память. Пул ограничивает параллелизм.

3. Если у вас есть пул соединений к сокету или файловых дескрипторов, пул воркеров гарантирует, что вы не превысите лимит ОС.

Суть: Мы создаем фиксированное количество горутин, которые заранее запущены и ждут работы. Основная горутина (диспетчер) ставит задачи в канал (очередь задач). Воркеры конкурентно забирают эти задачи из канала и выполняют их. Результаты они могут отправлять обратно в другой канал.

Ключевая идея: Ограничение количества одновременно выполняемых операций и повторное использование горутин.

Читать далее

Ну это полный мэтч! Как мы сделали бота для знакомств в чатах

Уровень сложностиПростой

Всем привет! Меня зовут Иван, я руковожу компанией НИИ Крокодил.

Как и многие в IT, я состою в куче рабочих чатов, суммарно там, наверное, пару сотен человек. И каждый такой чат живёт одинаково: миллион сообщений, обсуждения сменяются одно за другим, а любая важная информация улетает вверх и теряется.

Особенно заметно, когда в чат приходят новички и пишут интро. Человек рассказывает, кто он и чем занимается, а через пару минут этот текст уже никто не увидит: его просто смывает потоком сообщений.

В какой-то момент мне стало интересно: а можно ли сделать так, чтобы люди находили друг друга не случайно, а по интересам и задачам? Так и появилась идея бота, который помогает знакомиться и «мэтчить» людей внутри сообщества. Спойлер: у нас получилось.

В этой статье расскажу, как мы с командой его сделали.

Читать далее

My Science App: Как превратить расчеты в интерактивное научное приложение за 5 минут

My Science App — это open-source low-code платформа, которую я разработал в 13 лет специально для упрощения сложных расчетов, преобразующая текстовые формулы в интерактивные веб-интерфейсы с поддержкой реактивного пересчета данных и динамической визуализации. Инструмент автоматизирует создание полей ввода (#input), расчетных модулей и графиков симуляций (#range, #inx, #outy), позволяя за 5 минут собрать полноценный научный стенд с экспортом результатов в CSV и генерацией ссылок на рабочие модели. Проект ориентирован на быструю проверку гипотез и образовательные задачи, исключая необходимость ручного написания JS-кода или работы в Excel-таблицах.

Читать далее

React Compiler — конец эпохи useMemo?

7 октября 2025 года команда React анонсировала стабильную версию React Compiler 1.0 — инструмент, о котором мечтали разработчики годами. Обещание простое и привлекательное: забудьте про useMemo, useCallback и React.memo. Компилятор всё сделает за вас.

Но действительно ли мы можем расслабиться и больше не думать о производительности? Давайте разберемся.

Читать далее

Как я устал от того, что локальные ИИ-агенты ломают мои планы, и написал CLI-инструмент для защиты структуры задач

Уровень сложностиСредний

HBT — production-grade CLI для управления иерархическими задачами с защитой от изменений. Идеальный инструмент для работы с LLM, автономными агентами и сложными проектами.

Читать далее

Зачем нам Spinnaker, если есть Python? Как мы написали свой «велосипед» для деплоя в K8s

Привет, Хабр!

Довольно долгое время мы использовали в своём окружении Spinnaker. Очень удобный, правда старомодный,  инструмент, который справлялся со своими задачами. Однако чем дольше пользовались, тем больше становилось очевидно, что Спиннакер малость избыточен, при этом очень прожорливый в плане потребления ресурсов, и тяжёлый в плане обслуживания и поддержки. Особенно когда перестали выходить новые версии CLI под Mac OS, и управление перешло в Докер контейнер. А уж когда после очередного обновления снова стали падать компоненты из-за нехватки памяти и отвалился SSO, пришло озарение...

Читать далее

Автоматически unseal Vault в продакшене

Уровень сложностиПростой

С приходом контейнеров и оркестрации появилась проблема: где безопасно хранить секреты? На рынке достаточно решений - Sealed Secrets, Kubernetes Secrets, Infisical - но сейчас стандартом остаётся HashiCorp Vault. Vault - это не просто хранилище паролей. Это централизованное управление секретами с динамической выдачей секретов, гибкими политиками доступа и полным аудитом.

Но и у Vault есть свои проблемы: высокий порог входа, настройка политик доступа и самая большая боль - unseal. Дело в том, что Vault при запуске находится в sealed-состоянии и не отдаёт секреты, пока его не разблокируют. Перезагрузился под, упала VM - и все сервисы, зависящие от Vault, перестанут запускаться (уже запущенные, кстати, продолжат работать). Вопрос в том, как это решать правильно.

Самый простой способ хранить unseal-ключи - записать на листочек и спрятать в сейф. Но как передать ключи коллеге? Что если единственный носитель ключа уволился, ушёл в отпуск или просто недоступен в 3 часа ночи? Это классическая единая точка отказа - и строить на ней безопасность продакшена как минимум рискованно, а как максимум приведёт к потере секретов навечно.

Решение этой проблемы - auto-unseal через облачные KMS: AWS KMS, GCP Cloud KMS, Azure Key Vault. Сервисы берут на себя расшифровку мастер-ключа при старте Vault, и ручное вмешательство больше не нужно. Но что если вы работаете только в on-premise и отправлять даже ключи шифрования во внешние сервисы - не вариант?

Можно поднять второй Vault, который будет unseалить первый через Transit. Рабочая схема, но это дополнительная инфраструктура, которую тоже нужно обслуживать и мониторить. А если хочется полной отказоустойчивости, цепочка Vault'ов начинает расти.

Читать далее

Создание и настройка аудиторий в Google Analytics 4

Аудитории в Google Analytics - это глобальный фильтр, который настраивается в панели администратора. Он позволяет очень тонко сегментировать посетителей для любых целей: аналитики, настройки контекстной рекламы и тд.

Аудитории работают как с автоматически собираемыми данными о пользователях, так и с событиями, которые можно создать самостоятельно.

Читать далее

Навигация по длинным AI-диалогам: расширение для браузера

Часто использую ChatGPT и другие нейросети для работы: обсуждаю идеи, пишу код, прошу объяснить сложные темы. В итоге в чате накапливаются сотни сообщений. И тут начинается хаос:

Нужно найти функцию, которую обсуждали утром? 5 минут скролла вверх в поисках нужного места — и я уже потерял нить разговора. Приходится начинать заново.

Отдельная боль — потеря контекста моделью. Пишешь код, а модель внезапно «забывает» техническое задание из начала диалога. ChatGPT просто обрезает контекст, а понимаешь это только спустя 10 минут потраченного времени.

В голове крутилась идея, как это исправить. Минутный поиск готовых решений не дал, поэтому сделал собственное расширение.

Читать далее

Зачем сущность Role пишут отдельно, а не добавляют роль в сущность User

Уровень сложностиСредний

Система авторизации по ролям обеспечивает управление доступом к ресурсам приложения в соответствии с ролью пользователя.

Сущность Role пишут отдельно от сущности User, вероятно, для того, чтобы разграничить роли и пользователей и упростить управление ими.

Обычно для хранения информации о пользователях и ролях создают две отдельные таблицы. Затем их связывают через промежуточную таблицу, чтобы реализовать связь «многие ко многим».

Такой подход часто используют в корпоративных системах, интернет-магазинах и других системах, где требуется гибкость в управлении пользователями.

Однако есть мнение, что если пользователь будет иметь только одну роль, то нет смысла создавать отдельную сущность для роли, а лучше поместить её в таблицу пользователя.

Читать далее

Защита Linux-сервера с nftables: моя оборона

Уровень сложностиСредний

Простая блокировка портов несомненно эффективна, но сервисам всё-таки нужно смотреть в открытый интернет. Настоящая защита требует комплексного подхода: динамических списков блокировок и механизмов скрытия сервисов. В этой статье я хочу поделиться своей «боевой» конфигурацией nftables.

Читать далее

Скрывать данные невидимо: как я сделал программу, которая прячет секреты в картинках и музыке

Уровень сложностиСредний

Представьте: у вас есть важная информация, которую нужно перед��ть так, чтобы никто не догадался, что вы что-то передаёте.

Обычное шифрование выглядит подозрительно — "зачем этот файл зашифрован?". А стеганография прячет данные внутри обычной картинки или песни так, что визуально ничем не отличается от нормального файла.

Читать далее

VK Dialog Photo Archiver: маленький десктоп‑инструмент, который решает большую проблему ВК‑диалогов

Уровень сложностиПростой

ВКонтакте остаётся для многих основным рабочим и личным мессенджером, но у него есть одна неприятная особенность: медиаконтент живёт «где‑то в облаке», а нормального способа точечно забрать все фото из одного диалога до сих пор нет.

Да, можно запросить общий архив, подождать, пока он соберётся, скачать несколько гигабайт и вручную разбирать структуру файлов. Можно пытаться листать диалог, сохранять картинки по одной или с помощью скриптов в браузере. Но если в переписке десятки тысяч сообщений и сотни фотографий, это превращается в отдельный проект.

Я столкнулся с этой задачей несколько раз подряд — и в какой‑то момент решил, что проще написать отдельный инструмент.

Читать далее

Как я запустил windows 10 на raspberry pi zero 2w

Многие знают, что Windows 10 требовательна к железу. Официальные системные требования — 2 ГБ ОЗУ, 20 ГБ на диске, процессор не менее 1 ГГц . Raspberry Pi Zero 2W имеет 512 МБ ОЗУ, ARM-процессор  Broadcom BCM2710A1, 4x Cortex-A53 с тактовой частотой 1 ГГц .

Я решил проверить возможно ли запустить windows 10 на Pi zero 2w.

Читать далее

Автоматизация обновлений Ubuntu: создание интерактивного меню на bash

Ubuntu System Updater — Интерактивное приложение на Bash для управления обновлениями в Ubuntu

Привет, сообщество r/linuxr/ubuntu и r/bash!

Хочу поделиться инструментом, над которым работал — Ubuntu Auto Updater — интерактивное приложение на Bash для возможности обновить сразу все установленнык компоненты в Ubuntu и Ubuntu Server. Приложение само сканирует ваши компоненты и ищет для них обновления если таковы есть и предложит обновить все либо либо одни конкретный.

Он создан для удобной работы в терминале: простота, наглядность и скорость.

Читать далее

Секреты Вселенной в разрядах арифмометра

Уровень сложностиСредний

Разбирая тему «вычитание сложением при помощи дополнения с потерей переноса разряда» я столкнулся с трудностями в понимании формулы x +(100000 — y) — 100000, может показаться парадоксальным, что для «вычитания сложением» мы используем формулу с вычитанием. Однако это лишь математическая запись физического процесса, но на данном этапе я этого не осознавал, что и послужило отправной точкой для углубленного анализа разбираемой темы, раскрывая микромеханику спрятанную за «искаженными» дисками арифмометра.

Читать далее

Неевклидова геометрия. Основы

Уровень сложностиПростой

На протяжении 2000 лет люди считали геометрию Евклида единственно возможной. Казалось очевидным, что через точку можно провести только одну параллельную прямую.

Но в XIX веке Лобачевский, Риман и другие математики задали вопрос: а что, если это не единственный вариант?

Оказалось, что можно построить непротиворечивые геометрии, где параллельных прямых либо нет вообще (эллиптическая геометрия), либо их бесконечно много (гиперболоид).

И отвечая на вопрос “зачем?”, можно сказать:  GPS и навигация работают благодаря сферической геометрии - кратчайшие маршруты самолётов идут не по прямым на карте, а по дугам на поверхности Земли.

Теория относительности Эпштейна использует искривлённое пространство-время - массивные объекты вроде Солнца искривляют пространство вокруг себя, и это объясняет гравитацию.

Читать далее
1
23 ...