Обновить
256K+

Python *

Высокоуровневый язык программирования

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

Аудит алгоритмов: как реализация Boyer-Moore с 190K звёзд на GitHub оказалась brute-force

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

Проверил реализацию Boyer-Moore в TheAlgorithms/Python (190K+ звёзд). Оказалось, что сдвиг bad character записывается в переменную for-цикла, что в Python не имеет эффекта. Алгоритм выдаёт правильные результаты, но работает как brute-force O(nm) вместо O(n/m). Плюс ещё две находки: бесконечный цикл в типичных реализациях full BM и ошибка в оригинальной статье 1977 года, которую исправили только в 1980-м.

Читать далее

Инвертируем зависимости одного FastAPI-эндпоинта

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

Давайте ещё раз поговорим о SOLID. Если ваша работа хоть как-то связана с разработкой программного обеспечения или вы просто интересуетесь программированием, вы наверняка слышали этот печально известный акроним. Ему уже посвящены бесчисленные статьи, публикации в блогах и обучающие видео. Возможно, это одна из самых обсуждаемых аббревиатур в мире разработки. Но в этой статье я хочу подробнее остановиться на последней по порядку, но не по значимости букве – D, которая обозначает принцип инверсии зависимостей (Dependency Inversion PrincipleDIP).

Почему этот принцип важен для написания поддерживаемого кода? Важен ли он вообще? Зачем всё это нужно? Для ответа на эти вопросы давайте попробуем инвертировать зависимости в одном эндпоинтe FastAPI.

Читать далее

Антивирус не помог? Threatbit Simple Scanner находит то, что он пропускает

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

Антивирус почистил ваш компьютер, но присутствуют ограничения? Тогда вам стоит попробовать Threatbit Simple Scanner. Данная утилита open-source под лицензией MIT и очищает компьютер от последствий вредоносного ПО. Он имеет большой функционал: от чистки автозагрузки до сброса Winsock, файла Hosts и DNS-кэша.

Читать далее

Как отладить подключение бота к бирже за час, а не за трое суток

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

🕹️ Подключение бота к бирже за час, а не неделю

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

Статья содержит руководство, как оптимизировать временные затраты на отладку интеграции в биржу

Читать далее

Django-согласия и cookies под 152-ФЗ: версии документов, аудит и экспорт вместо одного чекбокса

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

Согласие на обработку персональных данных в Django-проекте часто начинается с одного BooleanField. Но затем оказывается, что недостаточно помнить только факт нажатия на чекбокс: пользователь мог видеть другую редакцию документа, отозвать согласие, выбрать лишь часть категорий файлов cookie, а администратору может понадобиться журнал действий и выгрузка в CSV.

Я сделал для этого два полностью независимых Django-пакета с открытым исходным кодом: django-consent-152fz для юридически значимых согласий и django-cookies-152fz для политики файлов cookie, категорий, подключённых сервисов и окна выбора. В статье покажу реальную модель данных, минимальное подключение и то, как устроены редакции, журнал событий и выгрузка данных.

Читать далее

LongConspectWriter: автоматическая генерация структурированных конспектов лекций на потребительском GPU

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

Автоматическая генерация структурированных академических конспектов из аудиозаписей лекций по точным и естественным наукам затруднена для локальных малых языковых моделей (small language models, SLM). Транскрипт лекции продолжительностью ≈1,5 ч составляет около 15–20 тыс. токенов и формально умещается в контекстное окно современных локальных SLM, однако при обработке такого контекста single-call SLM систематически деградируют: теряют фрагменты из середины последовательности, не удерживают структуру и галлюцинируют термины и формулы. Это проявление эффекта Lost in the Middle: точность извлечения информации описывает U-образную кривую — высока на краях контекста и падает в середине; в наших условиях используются SLM, поведение которых так же описано в статье, и оно характеризуется выраженным забыванием не только из середины, но также и из начала контекста. Более того, на бюджете 8 ГБ VRAM single-call длинного транскрипта практически неприменим*, что делает декомпозицию не оптимизацией, а необходимым условием работоспособности.

Читать далее

Мой личный джуниор. Часть 3. Учим агента ждать

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

Привет, Хабр! Меня зовут Владимир и это продолжение статьи про разработку локального кодер-агента.

В первой части мы создали инфраструктуру: подняли контейнер с моделью, настроили Langfuse для трассировки и написали простейшего агента с доступом к MCP-инструментам.

Во второй части мы добавили агенту мозги: планировщик, оценщики, защиту от зацикливания и суммаризацию контекста.

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

Читать далее

Мой личный джуниор. Часть 2. Даём агенту немножечко мозгов

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

Привет, Хабр! Меня зовут Владимир и это продолжение статьи про разработку локального кодер-агента на LangGraph с доступом к MCP-инструментам.

В первой части мы создали инфраструктуру, написали простейшего агента и дали ему доступ к MCP-серверам для работы с файлами, кодом Git и документацией. В этой половинке мы добавим агенту немного мозгов.

Читать далее

Невыразимое невалидное. Часть 1. Данные

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

Знакомый сценарий: фильтр или конструктор запросов начинается с одного опрятного класса, а через месяц в нём value: Any, валидатор на сотню строк и ветка, дописанная ночью перед релизом, — её забыли покрыть тестом, и она падает в проде.

Разбираем контринтуитивный выход: не «добавить ещё проверок», а сделать невалидное состояние таким, чтобы его нельзя было даже собрать. В первой части — сами данные: сумма-типы, дискриминированные union’ы и точные значения в pydantic; и где всё это ловит тайп-чекер, а где остаётся рантайму.

Читать далее

CancelledError — не просто очередная ошибка. Разбираемся, как устроена отмена задач в asyncio

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

Это первая из двух статей о CancelledError — сигнале отмены задачи. В ней мы остановимся на стандартном asyncio. Узнаем, что на самом деле представляет собой CancelledError, с точки зрения event‑loop. Разберёмся, как работает счётчик отмены (cancel/uncancel), на котором построены TaskGroup и asyncio.timeout. Наконец, обсудим проблемы, которые возникают на практике, в первую очередь связанные с asyncio.shield.

Читать далее

Открыл бету AI-Мастера для D&D. Главная проблема оказалась не в кубиках, а в памяти

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

Я уже несколько месяцев в свободное время пилю одну штуку — Telegram-бота, который водит тебя по D&D 5e в одиночку. Нейросеть тут за Мастера: генерит историю, описывает сцены, ведёт бой по правилам, тянет кампанию. Играешь прямо в Telegram, лист персонажа и инвентарь — в мини-приложении.

Сразу честно, без «заходите, всё готово»: это активная стройка. Релиза не было. А 13 июня я впервые открыл её для людей — то самое открытое бета-тестирование. До этого бот варился в узком кругу, теперь зайти и поломать может любой.

Я готовился защищать механику. А первым посыпалось совсем другое. Но обо всём по порядку.

D20 на прочтение

Как я написал свой overlay-переводчик на python

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

Бывало у вас такое: находите крутую инди-игру или визуальную новеллу, а официальной русской локализации нет? Сидеть со смартфоном в руках и переводить экран через Google Переводчик - удовольствие сомнительное. Переключаться по Alt+Tab в браузер каждые две минуты - ломает всё погружение.

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

Читать далее

Линеаризация. Увеличиваем мощность А/Б тестов с метрикой отношения

Время на прочтение7 мин
Охват и читатели7.9K

Статья о том, как линеаризация помогает оценивать А/Б тесты с метриками отношения и повышать чувствительность экспериментов.

Разберём применение линеаризации на примере эксперимента со средним чеком. Построим доверительный интервал для метрики отношения. Проверим корректность работы линеаризации и покажем, в каких случаях её эффективность может снизиться. Убедимся, что CUPED увеличивает мощность критерия, и обсудим как линеаризовать ковариату.

Читать далее

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

Компиляция yolov8n в формат HEF для Hailo-8L на Raspberry Pi 5

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

Подготовка модели Yolo для запуска на базе Hailo чипа для Raspberry Pi 5 AI HAT+.


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

Читать далее

Сказ о том, как нейросеть занялась reward hacking прямо у меня на кухне

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

Я хотел просто пожарить кесадилью. В холодильнике лежали зеленые оливки (солено-кислые), сулугуни и фарш, а на полке консервированная кукуруза. И вот стою я над сковородкой и думаю: а оливки с кукурузой вообще сочетаются? А сулугуни не пересолит блюдо вместе с оливками? Сколько чего вообще класть?

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

Читать далее

Как заглянуть внутрь.exe, собранного через Nuitka? Новый инструмент с открытым кодом

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

Как узнать, что внутри .exe, собранного через Nuitka? DeNuitkanizator — инструмент с открытым кодом для анализа таких файлов. Извлекает строки, модули, хэши, информацию о защите и многое другое за один запуск.

Читать далее

Погружение в многозадачность Python: процессы, потоки, GIL и асинхронность

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

Многозадачность кажется простой темой, пока дело не доходит до Python и GIL. В статье разбирается: чем процесс отличается от программы, зачем нужны потоки, что такое ядро процессора и в чём разница между конкурентностью и параллелизмом. Затем – специфика Python: как GIL влияет на потоки, когда стоит использовать процессы, асинхронность или корутины, и чем они отличаются от green threads. Материал сопровождается схемами, рабочими примерами кода и реальными замерами производительности для CPU-bound и I/O-bound задач, а в конце – практические выводы о том, что и когда выбирать.

Читать далее

Квантовая монетка на IBM Quantum: как я переложил выбор свидания на 8 кубитов

Время на прочтение6 мин
Охват и читатели13K

Когда не можешь выбрать, куда пойти на свидание, можно мучиться между кофейней, баром и прогулкой. А можно поступить взросло: отправить задачу на квантовый компьютер IBM и переложить ответственность на физику. Внутри — Qiskit, 8 кубитов, реальный job_id и самый пафосный способ заменить подбрасывание обычной монетки.

Github репо по ссылке

Читать далее

Как я случайно открыл функцию активации с багом, побеждающую Swish

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

Началось всё с того, что мне было нечем заняться, и я баловался с языковой моделью, мучая её всякими разными вопросами по ML. В какой-то момент дело дошло до функций активации — сначала прошлись по уже известным, а затем и до ещё непроверенных. Так и появилась LLA — функция активации, являющаяся центральным элементом всей этой истории.

Формула у неё довольно простая:

Дальше

Почему мы до сих пор неправильно пишем физические движки и 3D-графику

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

Стоит открыть исходники любого современного игрового движка – неважно, это C++-рендер, сделанный на коленке, или какая-нибудь гигантская экосистема вроде Unity или Unreal Engine – вы первым делом натыкаетесь на одни и те же знакомые сущности. Все вокруг живет в Vector3: координаты, направления движения, точки столкновений. Каждая частица указывает, куда она смотрит, с помощью Quaternion. А если требуется что-то покруче – переносить и одновременно крутить объект, то Matrix4x4. Это уже как стандарт де-факто: кто пробовал крутить объекты руками, тот точно переписывал код с этими структурами. Ещё конечно же отдельно существуют лучи, плоскости, сферы, bounding boxes, а между ними тянутся километры функций вроде dot()cross()normalize()lookAt()inverse()project() и бесконечных преобразований типов.

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

И самое интересное заключается в том, что так было не обязательно.

Читать далее