Обновить
512K+

Программирование *

Искусство создания компьютерных программ

944,15
Рейтинг
Сначала показывать
Порог рейтинга
Уровень сложности

Можно ли отказаться от Opus и Codex? Проверил MacBook, игровой ноутбук и DGX Spark на одной задаче с ловушками

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели543

В моём пет-проекте open-daimon давно есть роутинг между локальными моделями и облаком.

Сразу оговорюсь: публично open-daimon не обновляется, потому что разработку я веду локально, так быстрее. А на его основе у меня уже есть отдельный закрытый проект, который расширяет его возможности, — студия управления агентами. В ней я всё это и тестировал.

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

В октябре снова всплыло, что в потребительских условиях Anthropic для жителей ЕЭЗ и Швейцарии прямо написано: не использовать сервисы «в коммерческих или деловых целях». Под эти условия попадают Claude.ai и подписки Pro и Max. То есть разработчик в Европе, который пишет рабочий код в Claude Code по подписке Max, формально их нарушает. Для работы нужен API, Team или Enterprise, а это уже совсем другие деньги.

Вторая история про то, что тебе разрешат делать со своим же железом. Автор Decrypt попросил Claude Opus 5.5 помочь заново получить root на собственном телевизоре LG. Защита модели оборвала запрос и предложила переключиться на Opus 4.8. А исследователь, известный находкой с постоянно включённым микрофоном в телевизорах Samsung, пишет, что OpenAI заблокировала его аккаунт за «Cyber Abuse» после анализа прошивки через ChatGPT. Вместе с аккаунтом пропали примерно $500 на балансе API. OpenAI это не комментировала, так что пока это только его слова.

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

Читать далее

Новости

Основы глубокого обучения. Часть 2

Уровень сложностиПростой
Время на прочтение9 мин
Охват и читатели1.7K

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

В этой части мы разберём подробнее свёрточные нейронные сети.

Читать далее

Почему мы запретили AI-менеджеру писать код и поручили это Claude Opus

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели3.5K

AI-менеджер маркетплейсов получил весь API Wildberries, но маржу, сроки поставки и аудит карточек ему приходилось считать заново в каждом разговоре. Нужны были готовые инструменты. Оставалось решить, кто их напишет.

Разрешить писать код самому менеджеру мы не решились: он постоянно читает чужие тексты, а код выполнялся бы рядом с ключами кабинетов. Поэтому инструменты написал Claude Opus в отдельной изолированной службе, а менеджер может только вызывать готовое. Рассказываем, как устроено это разделение и как мы лишили модель возможности выполнить правку без «да» владельца.

Читать далее

Раскладку нельзя определить. Можно только сделать ошибку обратимой

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.1K

ghbdtn и привет — это одни и те же клавиши. Понять, что имел в виду человек, нельзя в принципе. Поэтому фиксер не угадывает, а гарантирует: откат стоит ровно одно нажатие.

Читать далее

Программируем без IDE или применение qwen и qwen coder для написания софта

Уровень сложностиПростой
Время на прочтение5 мин
Охват и читатели10K

Сейчас мы попробуем быстро написать сканер ntfs alternate data streams потоков, на не совсем тривиальном стеке и архитектуре. Сделал я это в первую очередь для тестирования возможностей моделей семейства qwen.

Краткое пояснение для тех, кто не работал в это сфере. NTFS (аббревиатура от англ. new technology file system — «файловая система новой технологии») — стандартная файловая система для семейства операционных систем Windows NT. Одним из ее малоизвестных свойств является наличие альтернативных потоков данных (англ. Alternate Data Streams, ADS), который представляют собой метаданные, связанные с объектом файловой системы NTFS. Таким образом к файлу можно прикрепить еще несколько потоков данных которые будут не видны стандартными средствами ОС.

Читать далее

Выжимаем максимум из BERT: токенизация в 50 раз быстрее

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели8.2K

Даже проверка обычных символов может стать узким местом в обработке текста для языковых моделей. При профилировании bert-base-uncased выяснилось, что на нормализацию уходило 88% времени токенизации. В статье разбираемся, как SIMD‑инструкции, кеширование Unicode и пропуск лишних операций помогли ускорить обработку примерно в 50 раз, почему на разных языках результаты отличаются и где у такого подхода есть ограничения.

Разобрать оптимизацию

Динамический метод численного интегрирования Гаусса‑Лежандра на C#: вычисляем узлы и веса «на лету» без переполнения

Уровень сложностиСредний
Время на прочтение6 мин
Охват и читатели5.9K

Существуют ряд распространенных методов численного интегрирования с постоянным шагом: метод прямоугольников, трапеций Симпсона (парабол). Но оказывается, что в некоторых случаях гораздо эффективнее использовать методы с переменным шагом. Сегодня мы как раз рассмотрим один из таких методов – метод Гаусса-Лежандра. 

Читать далее

React Context без лишних ререндеров: подписка на отдельные поля

Уровень сложностиСредний
Время на прочтение12 мин
Охват и читатели6.2K

Знакомая ситуация: в контексте лежат два поля, скажем, name и age. Меняется age, и ререндерится компонент, который читает только name. У useContext нет селектора, как у useSelector в Redux: React сравнивает value провайдера целиком, а при каждом изменении это новый объект. Ни useMemo, ни React.memo тут не спасают.

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

Почему через контекст стоит передавать не сами данные, а стабильный объект доступа к ним?

Почему обычные приёмы — useMemo на value и раздельные контексты — до этого не дотягивают?

Зачем для подписки нужен useSyncExternalStore и что такое tearing?

На каких деталях легко ошибиться и когда такой контекст вообще нужен?

Читать далее

Написал NetRuleRouter, чтобы сайты, приложения и сети работали через разные подключения без отключения VPN

Уровень сложностиСредний
Время на прочтение16 мин
Охват и читатели8.4K

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

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

А если одновременно нужны корпоративный VPN, личный VPN, мессенджеры, игры и обычный интернет?

Мне надоело постоянно переключаться между подключениями. Поэтому я начал разрабатывать NetRuleRouter — программу, которая позволяет управлять маршрутизацией трафика по сайтам, приложениям, IP-адресам и сетям.

Причём NetRuleRouter — не VPN-клиент. Он работает поверх уже существующих подключений и позволяет выбирать, через какое из них должен идти определённый трафик.

Разработку я начал 1 апреля 2026 года, первые рабочие версии использовал ещё летом, а теперь выпустил первую публичную альфу NetRuleRouter v0.1.0-alpha.1 для Windows и Linux.

Хочу рассказать, откуда появилась идея, что уже умеет программа, как я использую её сам и почему при таком количестве возможностей это пока именно alpha.

Читать далее

Ваш recover() эту ошибку не поймает

Уровень сложностиСредний
Время на прочтение10 мин
Охват и читатели8.7K

В Go‑сервисе recover() может выглядеть надёжной страховкой, пока конкурентная запись в map не завершает процесс через fatal error: concurrent map writes. При этом часть гонок проходит незаметно и приводит к потере данных без единой ошибки в логах. В статье разбираемся, почему recover() не спасает в таких ситуациях, как обнаружить проблему с помощью -race и какой способ синхронизации выбрать для общей map.

Разобрать проблему

Внутри диаграммы Ганта: холст 480 на 360, палитра на 30 цветов и число без последнего бита

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели8.9K

Я собираю файл конфигурации из XML так, чтобы он совпал с платформенным с точностью до бита. Диаграммы Ганта в типовых конфигурациях пустые, и на них ушло шесть дней. Внутри нашлись обычная диаграмма, воображаемый холст 480 на 360, число, у которого платформа теряет последний бит, и палитра, где серия номер -1 получает 15-й цвет. Рассказываю, как это устроено и как добывалось: дизассемблер, Frida и серия загрузок платформой.

Читать далее

Два бага, 20 часов откатов: как я чинил гонки в M:N-рантайме Nova

Уровень сложностиСредний
Время на прочтение9 мин
Охват и читатели8.2K

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

Три истории о гонках в M:N-рантайме языка Nova: что сломалось, как я это искал и что в итоге нашло баг. Объясняю простыми словами, знать устройство рантайма не нужно, а в конце — чек-лист для отладки гонок в многопоточном коде.

Читать далее

Подводные камни битовых полей в C++

Уровень сложностиСредний
Время на прочтение23 мин
Охват и читатели9.2K

Думаю, вы знаете, что C++ — язык, который разрешает вам вообще всё. А потом молча смотрит, как вы на этом подрываетесь. Обычно мы привыкли мыслить категориями байтов, но что делать, если стандартная сетка типов кажется слишком расточительной? Когда внутренний перфекционист требует компактности, на помощь приходят битовые поля. Зачем отдавать под скромный флаг “да/нет” целый восьмибитный контейнер, если можно ювелирно отрезать ровно один бит? Поставил двоеточие — и ты повелитель памяти. Но там, где начинается экономия, заканчивается порядок и предсказуемость. Программист остается один на один с тонкостями стандартов и поведением конкретных платформ. Предлагаю вместе заглянуть под капот C++ и подробно разобрать, как на самом деле устроены битовые поля.

Читать далее

Ближайшие события

Когда генератор нагрузки замирает вместе с сервером

Уровень сложностиПростой
Время на прочтение8 мин
Охват и читатели5.4K

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

В экспериментах SPECjbb2015 разница между режимами достигала 34 против 100 мс, а с Serial GC даже 278 против 1750 мс.

В статье разбираем coordinated omission и объясняем, почему для честного измерения задержек генератор нагрузки стоит вынести в отдельную JVM.

Читать далее

Пайпы OpenWebUI: зачем писать код там, где «всё уже есть в настройках»

Уровень сложностиСредний
Время на прочтение18 мин
Охват и читатели5.6K

Настроить кастомную модель с инструментами и RAG в OpenWebUI — легко. Заставить её работать предсказуемо в бою — сложнее. Наш бот техподдержки на Gemma 4 сначала отвечал правдоподобно, но без данных из систем. Мы разобрались, почему это происходит, и превратили «одну модель в интерфейсе» в детерминированный конвейер с помощью пайпов.

Читать далее

Данные без противоречий: генерация через RegExp

Уровень сложностиСредний
Время на прочтение13 мин
Охват и читатели4.5K

Идея не новая. Генерировать строки по регулярке умеют randexp в JavaScript, Xeger в Java, exrex и Hypothesis в Python. В TDCV2 я добавил это тоже, и первая половина статьи будет знакома тем, кто ими пользовался. Своё начинается дальше: уникальность, которая заранее знает, хватит ли места; точные доли прямо внутри выражения; условие, при котором одна часть строки следует из другой. Последние две вещи живут в расширенном генераторе advanced_regex, и в таком виде я их больше нигде не встречал.

И про слова. RegExp здесь - это синтаксис регулярных выражений, который TDCV2 использует как язык описания строки: конечное подмножество привычного синтаксиса плюс несколько своих конструкций. В конфиге генераторы называются regex и advanced_regex.

Читать далее

В логе было «не удалось получить данные:» и дальше пустота. Это и была вся ошибка

Уровень сложностиСредний
Время на прочтение5 мин
Охват и читатели5.1K

В логе моего сборщика данных годами появлялась строка «не удалось получить данные:» и дальше ничего. Я считал это багом форматирования, пока не посмотрел: код написан правильно, просто у asyncio.TimeoutError пустой str(). Дальше выяснилось интереснее. Рядом лежит хелпер с тремя попытками и паузой в пять секунд, написанный ровно под сетевые сбои, а ловит он except aiohttp.ClientError. Начиная с Python 3.11 asyncio.TimeoutError это встроенный TimeoutError, наследник OSError, и к иерархии aiohttp он отношения не имеет. То есть единственная ошибка, ради которой ретраи существовали, пролетала мимо них. Причём у aiohttp есть и свои таймаутные исключения, которые как раз ClientError, и именно это сбивает с толку. Заодно разбираю, как я на основе этих пустых ошибок записал в заметки несуществующее «сетевое ограничение VPS» и построил вокруг него архитектурное решение.

Читать далее

52 бесплатных урока ноября: от разработки и архитектуры до GenAI и кибербезопасности

Уровень сложностиПростой
Время на прочтение4 мин
Охват и читатели6.4K

Почему приложение тормозит, хотя код работает как надо? Когда микросервисы начинают создавать больше проблем, чем решать? И насколько далеко можно зайти с автоматизацией разработки с помощью ИИ-агентов?

В ноябре преподаватели OTUS разберут эти и другие вопросы на 52 бесплатных демо-уроках. В дайджесте — расписание занятий по восьми ИТ-направлениям: от программирования и архитектуры до машинного обучения, информационной безопасности и управления.

Перейти к расписанию ↓

Я не планировал становиться open-source разработчиком, а теперь развиваю проект с 1000+ звёзд на GitHub

Уровень сложностиПростой
Время на прочтение10 мин
Охват и читатели13K

В начале 2026 года на новогодних праздниках у меня было много свободного времени, и я поставил Claude Code. До этого я уже писал код с ИИ в Cursor и Windsurf, но только на знакомых языках и смотрел весь написанный код. С CLI-агентами всё пошло иначе: я пробовал Claude Code, потом OpenCode и быстро захотел управлять агентом не только из-за компьютера, но и с телефона.

Так появился opencode-telegram-bot — Telegram-клиент для OpenCode. В момент написания этой статьи у него 1298 звезд на GitHub и 48 контрибьюторов. В статье расскажу, как инструмент для себя вырос в open-source-проект и что я понял, пока его развивал.

Читать далее

Staging-слой на EAV: случай, когда антипаттерн оправдан

Уровень сложностиПростой
Время на прочтение15 мин
Охват и читатели5K

В этой статье — про STAGING-слой нашего DWH и о том, как мы работаем с EAV-паттерном. EAV в реляционной базе — устоявшийся антипаттерн, который в большинстве задач стоит обходить стороной. Рассказываю не о том, хорош EAV в целом или плох, а о конкретном случае, когда он оказался оправдан: почему он к нам пришёл, как мы с ним живём, что он даёт и где реально мешает.

Читать далее