Обновить

Annotate PDF: как я написал клиентский редактор без бэкенда и всё запорол в погоне за улучшениями

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

Представьте ситуацию: вам прислали контракт или учебный материал в PDF. Нужно быстро поставить подпись, обвести важный абзац или добавить пару комментариев. Идти в Adobe Acrobat долго, а загружать документ на сомнительные онлайн-сервисы небезопасно.

Я столкнулся с этой проблемой и решил сделать свой инструмент. Так появился проект Annotate PDF

Это простая «рисовалка» поверх документов, которая работает полностью в браузере.

Читать далее

Как мой телеграмм бот заменил мне Anki

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

На первом курсе университета я столкнулся с классической проблемой студента — необходимостью зубрить. В моем случае это были история и английский язык. Нужно было выучить около сотни исторических дат и 250 английских слов.

Обычно для таких вещей все советуют Anki. Но чтобы им пользоваться, нужно скачать приложение, потом как-то вытащить данные, отформатировать их в нужный формат таблицы (CSV и т.д.) или использовать сторонние чат-боты. Более того, у меня почему-то не работала синхронизация с мобильным приложением.

В итоге терпение лопнуло, и так появилась идея Mnemocards. Мой подход: не нужно нигде регистрироваться, не нужно ничего скачивать. Открыл бота — и учишь.

Читать далее

Playwright + MockAPI: тестируем форму логина без живого бэкенда

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

Пишем E2E-тесты на Playwright для формы логина — без живого бэкенда. Вместо встроенного page.route() используем внешний мок-сервер: настраиваем один эндпоинт с пятью сценариями (успех, неверный пароль, таймаут, 500, 429), матчинг по телу запроса и заголовкам. В итоге — тесты не зависят от состояния бэкенда, граничные кейсы воспроизводятся стабильно, а история запросов доступна в логах.

Читать далее

Запускаем старые игры на Linux с помощью Bottles

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

Steam активно портирует игры на Linux с помощью Proton, да и нативные версии игр (особенно учитывая популярность Steam Deck) сейчас не редкость. Но что делать с остальным софтом и играми? Для них есть проверенное решение — Wine и его удобная обертка Bottles.

Я решил проверить на практике, насколько сложно запустить олдскульную игру на моей Fedora 43. В качестве подопытного выбрал S.T.A.L.K.E.R.: Тень Чернобыля.

Читать далее

Архитектурное мышление в Python

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

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

Когда же дело доходит до ООП, новичок часто пишет код вот так:

Читать далее

Доработка алфавитно-цифрового ЖК-модуля 1602A (ЖКИ LCD1602) для работы от 3.3V

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

Эти модули китайского производства широко доступны на AliExpress, Озон, WB и предназначены для работы при питании напряжением 5.0V в диапазоне температур 0..+50C в стандартном исполнении.

Читать далее

Массивы под капотом: память, адресация и сложность операций

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

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

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

Каждый элемент массива имеет индекс — порядковый номер. В большинстве языков программирования индексация начинается с 0.

Массив в информатике — это тип данных, в котором хранится упорядоченный набор однотипных элементов.

Можно выделить одномерные и многомерные массивы.

Одномерные — это просто ряд про��умерованных значений.

Многомерные — матрица: каждое из значений массива само является массивом. Соответственно, доступ к элементу возможен по двум индексам — строки и столбца

Ассоциативные массивы — особый подвид структуры данных, в котором индексы не обязательно являются упорядоченными целыми числами. Это набор данных в формате «ключ — значение», где ключ — аналог индекса, а значение — аналог элемента.

Читать далее

Внедряем Claude Code нативно в Cursor IDE. Или как 9Router позволяет платить меньше

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

Думаю все, кто начинал использовать claude code, рано или поздно ощущали на себе его недостатки. Не удобно навигироваться по чекпоинтам, не удобно смотреть, какие были внесены изменения, не удобно использовать через CLI. А что если решение есть? Я начал об этом задумываться после того, как настроил свой openclaw, он же используем мою обычную подписку на Claude, почему я не могу использовать ее сам. Тут у многих возникнет вопрос касательно безопасности, кто-то слышал что антропики против подобного использования подписки, но я исхожу из фактов. Я не слышу, чтобы всех повсеместно начали банить за это. Да и в целом если так задуматься, когда мы подключаем наш аккаунт Claude через OAuth к Claude Code, наша цель - написание кода. Так в чем проблема, если мы немного обхитрим систему и внедрим все прямо в Cursor IDE.

Я долго искал нормальное решение и уже думал сам вайбкодить что-то, но в итоге наткнулся на прекрасный инструмент 9Router. Разработчик не я, так что сразу скажу, что ответственности за его использование и в целом всю описанную схему, я на себя не беру. Я просто обозреваю возможность.

Так вот, что такое в целом 9Router. Это некий хаб, куда можно подключить десятками провайдеров нейросетей и использовать все через нужный тебе endpoint.

Читать далее

Transactional Outbox паттерн

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

Transactional Outbox паттерн используется для надежной публикации событий, когда нужно одновременно сохранить изменения в БД и отправить сообщение в брокер.

В распределенных системах нельзя объединить в транзацию сохранение данных в БД и отправку события в брокер сообщений, т.к. это 2 разных системы не объединенные общей системой транзакционности. И правило атомарности для двух операций вместе не действует.

Для решения этой проблемы нам приходит на помощь Transactional Outbox паттерн.

Читать далее

Как в 2026 году IT-специалисту за границей отправить налоговую отчетность в ФНС России? Спойлер: Всё сложно

Ты открыл ИП, уехал за границу и честно хочешь заплатить налоги. У тебя есть Госуслуги, доступ в ЛК ФНС и даже «Госключ». Казалось бы, нажми кнопку и спи спокойно. Но система говорит: «Нет». В этой статье я расскажу, почему удаленная сдача декларации из‑за рубежа превратилась в квест с просроченными подписями, неработающими плагинами и борьбой с IP‑фильтрами. Сэкономил вам десятки часов гугления и нервных клеток — рассказываю, что точно НЕ сработает и какие реальные варианты остались.

Читать далее

UUID мертв? Да здравствует Smart ID! Почему ваш проект заслуживает лучшего

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

В этой статье я поделюсь опытом проектирования идентификаторов для крупной медицинской системы. Мы пройдем путь от простых автоинкрементов до UUID, ULID и в итоге создадим гибридное решение, которое оказалось лучше всех существующих подходов. Спойлер: идеальный ID — это не технология, а архитектура.

Читать далее

Килограмм пуха тяжелее килограмма железа

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

Такой загадкой многие донимали своих одноклассников. И если кто-то отвечал «железо», над ним ржал весь класс. 

Но никто не ставил такой эксперимент. Все только ржут. А мы в ТОПЛЕС решили провести его! Видео есть на нашем канале, а тут расскажем еще больше нюансов о том, как проходил этот эксперимент и как мы несколько раз облажались с ним. 

Для этого эксперимента мы построили большие плечевые весы. Две крупные чаши висят на цепочках на общей балке, а посередине — подшипник, чтобы весы свободно качались.

Читать далее

Tmux для Windows на Win32 API: как я портировал легендарный мультиплексор

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

Многие разработчики, переходящие с Linux на Windows, сталкиваются с одной и той же болью: отсутствием адекватного нативного мультиплексора терминалов. Да, есть WSL, есть вкладки в Windows Terminal, но это не заменяет классический опыт. Настоящий tmux — это когда ты можешь отцепиться (detach) от сессии, закрыть терминал, а потом вернуться и продолжить работу ровно с того же места.

Я решил, что хватит это терпеть, и реализовал tmux-win — нативный порт tmux для Windows, написанный на C с использованием Win32 API без тяжелых слоев совместимости вроде Cygwin или MSYS2.

Читать далее

Как отправить заявки с WordPress в Битрикс24: входящий вебхук и REST API

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

Заявки с форм на сайте удобно сразу получать в CRM. Если у вас WordPress и Битрикс24, интеграцию можно сделать без своего сервера: Битрикс24 даёт входящий вебхук — URL, по которому можно вызывать методы REST API (создание лида, сделки, контакта). В статье разберём, как это устроено и как подключить формы WordPress к такому вебхуку: сначала в общих чертах, потом — пошагово через готовое решение.

Что понадобится

Читать далее

Практические советы при работе с движком ReplacingMergeTree в ClickHouse

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

Я думаю, что многие использовали движок ReplacingMergeTree в ClickHouse, но при этом сталкивались с проблемой наличия нескольких версий документов, т.к. старые версии ClickHouse не удаляет моментально.

В этой статье я хочу поделиться практическими механизмами, которые я использовал в работе для «борьбы со старыми версиями документов».

Читать далее

BilimCalc: как из «лень считать на калькуляторе» получился PWA-калькулятор школьных оценок

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

Я устал вручную пересчитывать СО, СОР и СОЧ в обычном калькуляторе и сделал небольшой PWA-калькулятор оценок. В процессе проект превратился в эксперимент с офлайн-режимом, Service Worker и простым ML-анализом прямо в браузере.

История создания моего первого PWA-проекта

Под капотом синхронного перевода: как работает автопереводчик в умных наушниках

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

Краткая суть: Мгновенный перевод в наушниках представляет собой последовательность технологий распознавания речи, машинного перевода и синтеза голоса. Система работает в условиях строгих ограничений по скорости обработки и потреблению энергии.

Ситуация: аэропорт Токио, требуется найти выход на посадку. Наушник включен, вопрос задан по-русски, ответ получен на японском языке. Либо собеседник говорит на неизвестном языке, а в наушнике звучит перевод.

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

подслушать

Как мы выводим ИИ-агентов в работу команды: многопользовательский чат, RBAC/ABAC и опытно-промышленная эксплуатация

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

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

У нас, например, нельзя использовать облачные решения: ни от OpenAI, DeepSeek, ни другие сервисы, потому что есть риск утечки клиентских данных и интеллектуальной собственности. При этом потребность в автоматизации никуда не делась, наоборот, задач становится только больше.

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

Эта статья про наш практический опыт. Расскажу, как мы реализовали комнаты, где одновременно работают люди и агенты в общем контексте, как разграничили доступ через RBAC и ABAC, и какие архитектурные решения приняли, а какие, честно говоря, сейчас сделали бы иначе.

Если вы тоже делаете on-premise чат с агентами или решаете задачи контроля доступа к RAG, надеюсь, наш опыт и примеры реализации окажутся полезными. И будет особенно интересно узнать, как вы подходили к этим вопросам и какие решения в итоге выбрали.

Читать далее

Как я создал ScrapZone: «Тапалка» на кураже, кейсы и математика азарта на чистом JS

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

Всем привет. Короче, решил на днях собрать какой-нибудь простенький проект, чтоб время убить, и в итоге получилась игра ScrapZone. Сначала думал просто сделать обычный кликер, но потом затянуло и решил добавить туда всяких штук для азарта, типа открытия кейсов и апгрейдов.

В общем, основная тема игры — это сбор металлолома. Начинаешь с нуля, идешь в раздел «Тапалка» и просто кликаешь по шестеренке. За каждый клик дают 10 единиц скрапа. Когда накопишь сотку, можно уже идти открывать кейсы.

Я там сделал два вида ящиков. Внутри разные предметы, и у каждого своя редкость. Самая хреновая — серая, там множитель 0.3, то есть по факту уходишь в минус. Но если повезет, может выпасть золотая с множителем х25. Ленту с предметами в кейсах сделал на чистом CSS и JS, долго мучался, чтоб она плавно останавливалась именно там где надо, но вроде вышло норм.

Еще добавил «Копилку», чтоб можно было пассивно зарабатывать. Закидываешь туда скрап и каждую минуту капает 10% сверху. Там даже таймер есть, который показывает сколько до следующего начисления осталось.

И самая рисковая тема — это апгрейд. Там сам вводишь сколько ставишь и сколько хочешь получить, а игра считает шанс. Максимум можно выкрутить 75% шанса, минимум 1%. Один раз так все слил, пока тестил, но если цель не задирать, то подняться можно.

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

Читать далее

Как я построил корпоративный RAG с гибридным поиском, reranker'ом и автоматической оценкой качества

Строим production-ready RAG-платформу для корпоративного поиска по документам без LangChain — только FastAPI, Qdrant, Celery и немного здравого смысла.

Разберём, почему чистый семантический поиск ломается на реальных документах и как гибрид Dense + Sparse решает это. Добавим cross-encoder reranker на flashrank (ONNX, без torch), fallback-цепочку LLM-провайдеров, защиту от prompt injection и автоматическую оценку качества через RAGAS в CI.

В итоге — микросервисная система, которая разворачивается одной командой и не падает, когда Groq недоступен.

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