Обновить
512K+

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

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

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

Программа поиска по PDF. Разбираем PageIndex, Streamlit и ссылки на страницы

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

«Срок гарантии — 18 месяцев». Красивый ответ. А если в договоре написано 12? Или число 18 стоит в разделе о хранении, а модель просто зацепилась за него?

В чате такие ошибки прячутся за гладкой фразой. Я хотел иной маршрут: задать вопрос к PDF, получить ответ и одним нажатием открыть физическую страницу исходного файла, на которую ссылается модель. Так появился PDF Desk — небольшое приложение на Python, Streamlit, PageIndex и PDFium. Один активный документ. Никакой базы пользователей. Индекс и исходный PDF остаются на компьютере; при использовании внешней модели текст документа всё равно уходит её провайдеру.

Дальше — где проходит граница между SDK и приложением. Почему голый /models не годится для проверки подключения. Из чего собран идентификатор индекса. И почему ссылка на существующую страницу ещё не значит, что ответ доказан. В конце живой прогон DeepSeek, включая браузер, и сценарии, для которых этого прогона мало.

Читать далее

Новости

N‑tier, Clean Architecture и Vertical Slice: практическое сравнение для.NET

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

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

Большинство .NET-разработчиков знакомятся с этими тремя архитектурами в одном и том же порядке: N-tier — в первых проектах, Clean Architecture — когда её приносит команда или шаблон, и Vertical Slice — когда о ней упоминают на код-ревью или в докладе на конференции. Каждую из них подают как улучшение предыдущей. На практике они отвечают на несколько разные вопросы, и правильный выбор зависит скорее от проекта, чем от того, какая из них новее.

Читать далее

Flutter на клиенте, Fletch на сервере: бэкенд на знакомом Dart

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

Вы пишете приложение на Flutter. Модели уже описаны, бизнес-правила продуманы. Осталась небольшая деталь: сервер, который будет принимать запросы и работать с данными.

И здесь обычно начинается второй сезон сериала. Другой язык, другой менеджер пакетов, ещё один набор моделей. Поле переименовали на клиенте, забыли на сервере — поздравляем, у нас распределённая опечатка.

Dart позволяет написать обе стороны приложения. А Fletch предлагает довольно понятный способ сделать серверную: знакомые по Express маршруты, middleware, обработчики запросов и немного инфраструктуры, которую не хочется каждый раз собирать вручную.

Разберёмся, как это выглядит в коде, откуда берётся скорость и какие мелочи стоит заметить до первого деплоя.

Читать далее

Как я создал СуперЗавуч — программу для генерации расписаний занятий

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

Привет, Хабр! Я бы хотел рассказать о том, как я создал программу для составления расписаний для учебных заведений - СуперЗавуч.

СуперЗавуч - современная программа для составления расписаний уроков для школ, лицеев и колледжей. Программа позволяет создать расписание за несколько минут и имеет много параметров для конфигураций.

Читать далее

Typing в Python 3.11–3.14: что изменилось и как это использовать уже сейчас

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

За последнее время я прочитал множество репозиториев, где в Pyhton пользуются типизацией и почти везде синтаксис не новее 3.11: Optional, TypeVar на уровне модуля, Generic[T], кавычки вокруг опережающих ссылок. При этом у Python 3.10 поддержка закончилась, и разработчики языка дали нам новых удобных инструментов и чтобы ими пользоваться не всегда нужно обновляться до последней версии. В этой статье расскажу, какие основные фишки появились за последние несколько лет и как ими пользоваться даже в проектах на старых версиях.

Читать далее

Развитие языков программирования в эру ИИ

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

Создатель языка Elixir Жозе Валим (José Valim) размышляет об изменении языков программирования: изменился разработчик — должны измениться и языки.

Привет, Хабр! На связи Хекслет. Весь материальный мир — от дверных ручек до архитектуры заводов — построен под пропорции и ограничения человека. И гораздо выгоднее делать роботов антропоморфными: пусть у них будут руки, ноги и пальцы — тогда они смогут пользоваться нашей инфраструктурой.

То же и софтом, синтаксисом и IDE: эта инфраструктура оптимизирована под человеческое восприятие. Должны ли мы сохранять эту эргономичность для ИИ-агентов?

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

Читать далее

Не каждый AI-вызов должен генерировать текст

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

Иногда от модели нужен не красивый ответ, а быстрое решение. Пропустить запрос или заблокировать, выбрать маршрут, оценить результат, отфильтровать документы для RAG.

Для этого появился Spring AI TypeSafe. Проект интегрирует Jev API, который отвечает на типизированные вопросы числовыми значениями и не генерирует текст.

Читать далее

Rust 1.99.0: функции с переменным числом аргументов, информация о схеме размещения типа

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

Команда Rust рада сообщить о новой версии языка — 1.99.0. Rust — это язык программирования, позволяющий каждому создавать надёжное и эффективное программное обеспечение.

Если у вас есть предыдущая версия Rust, установленная через rustup, то для обновления до версии 1.99.0 вам достаточно выполнить команду:

$ rustup update stable

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

Если вы хотите помочь нам протестировать будущие выпуски, вы можете использовать канал beta (rustup default beta) или nightly (rustup default nightly). Пожалуйста, сообщайте обо всех встреченных вами ошибках!

Читать далее

Address already in use: как найти, кто занял порт, и почему он не всегда освобождается сразу

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

Представьте: два часа ночи, вы деплоите фикс — а сервис не поднимается: Address already in use. Гуглите, находите PID, делаете kill -9. Помогает. Но утром та же ошибка на том же порту.

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

Разбираем оба случая: быстрый фикс под Linux, macOS, Windows и Docker — и что на самом деле происходит с портом, когда процесса уже нет.

Понять, при чём тут TIME_WAIT →

Часы Unix тикали от розетки: откуда взялся 1970 год и что сломается в 2038-м

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

Первое издание Unix Programmer's Manual датировано 3 ноября 1971 года, и на странице про системный вызов time в нем написано, что система хранит время в шестидесятых долях секунды, прошедших с полуночи 1 января 1971 года. Я наткнулась на эту строчку, когда пыталась ответить себе на вопрос, который, по-моему, хоть раз возникал у каждого, кто видел в логах загадочное 1 января 1970 года: почему именно этот день. Выяснилось, что поначалу Unix собирался считать время с другого года и в других единицах, а тикали его часы от электрической розетки.

Вторая половина истории про будущее. Во вторник, 19 января 2038 года, в 06:14:07 по Москве закончится 32-битный счетчик секунд, и программы, которые на него полагаются, проснутся в пятнице, 13 декабря 1901 года. Я проверила это на C, на JavaScript и на ext4, где файл, датированный 2040 годом, у меня уехал в 1903-й, а заодно выяснила, что кое-где 2038 год наступил уже двадцать лет назад.

Читать далее

Найм уровня undefined

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

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

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

Расскажу, как я получил свою первую работу программиста 25 лет назад. Потому что мне кажется, именно в этой истории ответ на вопрос, почему сейчас такой трэш на рынке труда в IT. Компания “HBM”, известная тогда игровая контора набирала людей для нового проекта под “Буку”, в качестве тестового задания надо было за месяц сделать простую РТС на чем угодно, но с работой по сети. Я тогда студент второго курса, без портфолио, без опыта, без вот этого всего. Взял задание и вечерами на кафедре, потому что своего компа еще не было, а папин был за 200 км и особо не наездишься, наклепал стратежку с видом сверху про пакманов и призраков, которые собирают точки и стреляют друг в друга. Я не знаю как она работала, потому что там было столько косяков, что работать он в принципе не могла, а если слишком быстро перемещать курсор, то крашилась, и поэтому некоторые пакманы начинали стрелять в курсор и стопать его, если скорость была выше положеной.

Читать далее

«Протестировать ML? Чё-то слишком широко берём»: как я собрала QA framework для готовых моделей

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

Если вы меня читаете, то знаете, что где-то полгода назад я проектировала, обучала и, в общем, создавала своего агента для проверки ТЗ. А сейчас у меня появилась новая идея по захвату мира: протестировать ML. И да, я не Data Scientist, но когда это меня останавливало?

В итоге вместо пары экспериментов получился отдельный QA framework, который берёт готовую ML-модель, собирает её контракт и сам решает, какие проверки можно запустить и почему результат должен считаться PASS, FAIL, WARN или SKIP.

Читать далее

Прорыв GPT-6 Astra, Claude взрослеет до версии 5.5, скандал вокруг задачи Навье-Стокса: главные события в ИИ за сентябрь

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

Как и ожидалось, после августовского затишья ИИ-лаборатории устроили нам целый хит-парад релизов. Глаза разбегаются от обилия версий, цифр и апдейтов, которыми компании пытаются перебить инфоповоды друг друга. От OpenAI мы получили разрывающую бенчмарки GPT-6 Astra, Sol аж в двух версиях и целую пачку обновлений с прошедшего DevDay. Anthropic выставили в ответ тяжелую артиллерию в лице Claude Fable 5.1 и семейства Claude 5.5 в неполном составе. Google же продолжают штамповать Flash-версии Gemini и, видимо, копят ульту под какой-то мощный будущий релиз.

За пределами релизов развернулись сюжеты не менее интересные. OpenAI торжественно объявили о решении задачи Навье-Стокса силами своих агентов, но вместо оваций получили обвинения в краже данных и гнев научного сообщества. Лидер Anthropic тоже получил свою долю хейта, только уже от политиков, за призывы замедлить ИИ-гонку. Дженсен Хуанг тем временем продолжает укреплять свою монополию, на этот раз через покупку Hugging Face.

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

Читать далее

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

FAIRouter. Мы научили ИИ выбирать лучшую LLM модель для каждой задачи

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

Привет, Хабр! Мы выложили в открытый доступ библиотеку FAIRouter, которая выбирает LLM-исполнителя под задачу, а после ответа принимает у него работу.

В мире, где количество больших языковых моделей (LLM) растет в геометрической прогрессии, а их возможности и стоимость сильно варьируются, встает вопрос: как выбрать именно ту модель, которая идеально подойдет для конкретной задачи, обеспечит наилучшее качество и при этом будет экономически эффективной? Для решение вышеописанной проблемы мы разработали обучаемую систему автоматической маршрутизации запросов FAIRouter.

Читать далее

ИИ-ревью, или как я себя чуть не уволил

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

AI-ревьюер для GitLab, который проверяет не отдельный merge request, а всю задачу сразу, во всех сервисах, которые она задела. И почему для этого понадобился агент, а не анализ diff через API.

Читать далее

Внешний Fuzzy‑поиск для 1С: транслит, синонимы и любые реквизиты

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

Всем привет!
Меня зовут Шатохин Дмитрий, я работаю в компании SM Lab старшим программистом 1С.

Выносим полнотекстовый поиск за пределы кластера 1С. Нечеткое соответствие, учет опечаток и регистра без нагрузки на сервер и СУБД основной базы.

Sku-search: кроссплатформенный сервис полнотекстового поиска для 1С — находит все по наименованию, артикулу, штрихкоду и любым реквизитам
Когда стандартный поиск 1С сдается, а Elasticsearch кажется пушкой по воробьям.

Знакомая боль?

Оператор в вашей 1С создает новую номенклатуру и вбивает «Болт М16 оцинк.». Система молчит. Он сохраняет — и в базе появляется дубль, потому что «Болт М16х60 оцинкованный ГОСТ 7798-70» уже существовал три года.

Или другой случай. Приходит прайс поставщика. В нем артикул ART-000002, в вашей 1С — тот же, но записан как Art-000002. На первый взгляд безобидно: строки в 1С по умолчанию сравниваются без учета регистра, и «в лоб» эти значения не отличить друг от друга. А для акцизных марок, марок Честного ЗНАКА, серийных номеров и артикулов, где регистр различает модификации, это ловушка: 1С выдает кучу ложных совпадений, а поиск «с учетом регистра» из стандартного запроса не настроить.

Читать далее

Когда технический долг и legacy-системы тянут CIO вниз

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

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

Читать далее

Запустили полнотекстовый и гибридный поиск в YDB: рассказываем, что под капотом

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

Привет, Хабр! Меня зовут Александр Зевайкин, и мы с командой делаем YDB (СУБД Яндекса). Год назад я рассказывал на Хабре, как мы запустили векторный поиск, а весной — как он используется в Нейроюристе для поиска по миллионам юридических документов.

В релизе 26.3 к векторному поиску добавились полнотекстовый поиск с ранжированием и гибридный поиск, который объединяет оба вида поиска в одном SQL-запросе. Кроме того, мы доработали фильтруемый векторный индекс.

Зачем нужны оба вида поиска, хорошо видно на примере. Страховой юрист ищет «выплаты по полису 7702-345678 при переносе рейса». Номер полиса нужно найти слово в слово, а описание случая — понять по смыслу. Полнотекстовый поиск справляется с первой половиной задачи и не справляется со второй, векторный — наоборот.

Прежде чем перейти к статье, я хочу пригласить вас на вебинар «Быстро находите нужное с YDB», который проведу в прямом эфире 15 октября. На нём я покажу рецепт, как за час собрать приложение для поиска сразу по документам, тикетам, карточкам и диалогам. Готовый поиск я подключу к ИИ-ассистенту с помощью RAG, и мы вместе со зрителями посмотрим, как меняется качество ответа. Регистрируйтесь и добавляйте в календарь — всё, что я покажу на вебинаре, доступно в рамках бесплатного тарифа и можно будет сразу попробовать самим.

А под катом в этой статье я отвечу на шесть вопросов о гибридном поиске:

1. Почему одного вида поиска недостаточно и чем два вида дополняют друг друга.

2. Что теряет бизнес, когда поиск работает отдельно от СУБД, и как оба индекса стали таблицами YDB.

3. Как сделать инвертированный индекс в виде распределённой таблицы и что добавляет к нему ранжирование по BM25.

4. Что происходит с каждым индексом при записи и как индекс объединяется с фильтрацией.

5. Как две выдачи объединяются внутри одного плана запроса.

6. Чем гибридный поиск помогает рекомендательным системам и чем измеряют результат.

Читать далее

429 — это не про скорость. Это про бюджет, которого ты не видишь

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

Рейт-лимит — это не ограничение скорости. Это бюджет, и тратишь его не ты один. Разбор на Telegram Bot API, Redis и одном наивном планировщике 2023 года.

Читать далее

Следуй за белым кроликом: пишем VPN на Rust и ищем выход из собственного туннеля

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

Следуй за белым кроликом.

В «Матрице» герои возвращались в реальный мир через телефон. Мне эта идея понравилась настолько, что собственный VPN я назвал PAYPHONE, а в консольном клиенте сделал зелёный дождь из символов. Правда, прежде чем через него удалось выйти в интернет, пришлось разобраться, почему туннель отправляет пакеты самому себе, таймер не срабатывает, а нажатие Ctrl+C не возвращает сеть. Об этом и будет статья — с устройством протокола, фрагментами кода и ошибками, которые обнаружились уже после первого успешного подключения.

Читать далее