Обновить

Бэкенд

Сначала показывать
Порог рейтинга
Биржа заказов Инфостарта: новые задачи по 1С со 16 по 23 сентября
Биржа заказов Инфостарта: новые задачи по 1С со 16 по 23 сентября

На неделе с 16 по 23 сентября на Бирже заказов Инфостарта появились новые предложения – работа с УТ 11, УНФ, ERP и Бухгалтерия 3.0. Есть задачи на разработку по материалам Инфостарта, настройку обменов с Ozon и Wildberries, интеграцию с PayKeeper, исправление дублей банковских документов и создание отчетов.

На Бирже заказов Инфостарта можно найти специалиста для консультации, разработки, настройки интеграций, переноса данных, создания отчетов и сопровождения 1С.

Теги:
+2
Комментарии0

Изолируем зависимости: как создать виртуальное окружение в Python

Когда пишешь код на Python, рано или поздно наступает момент, что один проект начнет ломать другой. Установили новую библиотеку, и вдруг скрипт, который вчера работал, падает с ошибкой. Знакомо? Причина обычно одна — конфликт зависимостей. Все пакеты свалены в один системный Python, версии пересекаются, и что-то обязательно отваливается.

Решение — виртуальное окружение. Это отдельная песочница для проекта: свои библиотеки, свой Python, никакого пересечения с соседями.

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

  • Виртуальное окружение vs виртуальная машина. Первое — это просто отдельная папка с пакетами, второе — целая ОС. Хотя некоторые новички часто путают, и потом удивляются, почему venv весит пару мегабайт.

  • venv, virtualenv, pipenv, poetry, conda. Это пять инструментов, которые решают похожие задачи, но по-разному. Для большинства проектов хватает встроенного venv — он уже есть в Python с версии 3.3, и ничего ставить не надо.

  • Активация. А это самая частая точка спотыкания. Команды различаются для Windows, Linux и macOS, а PowerShell вообще блокирует скрипты по умолчанию. source .venv/bin/activate против .venv\Scripts\activate — и это только начало.

  • requirements.txt. Важно помнить, что папку окружения нельзя копировать между машинами, так как она привязана к ОС и архитектуре. Вместо этого фиксируем список пакетов и разворачиваем его одной командой pip install -r requirements.txt.

  • Git и .gitignore. Виртуальное окружение в репозиторий не кладут — только код и список зависимостей.

Чтобы пройти весь путь по шагам — от создания первой папки до деплоя на сервере через systemd и Gunicorn — читайте подробный гайд на сайте Рег.облака.

Теги:
+3
Комментарии0

Drizzle ORM: типобезопасный SQL без магии тяжёлых ORM

Привет, я Сергей Маркизов, бэкенд-разработчик в веб-продакшне Далее. В своих проектах я часто использую Drizzle ORM — инструмент для TypeScript-разработчиков, которым нужны строгие типы, но не хочется прятать SQL за несколькими слоями абстракций.

Классические ORM избавляют от шаблонного кода, однако на сложных проектах их удобство иногда превращается в ограничение. Появляются скрытое поведение, громоздкий API и сложности с нестандартными запросами. А при переходе на QueryBuilder или raw SQL часть преимуществ ORM может потеряться.

Drizzle предлагает компромисс: запросы остаются похожими на SQL, а TypeScript проверяет их на основе схемы базы данных.

Схема — это TypeScript-код

Например, так можно описать таблицу пользователей:

const activeUsers = await db

  .select({

    id: users.id,

    email: users.email,

  })

  .from(users)

  .where(eq(users.isActive, true))

  .orderBy(desc(users.createdAt))

  .limit(10);

Из этой схемы Drizzle выводит типы для чтения и записи. Отдельно поддерживать интерфейс пользователя и следить, чтобы он не расходился со структурой таблицы, не требуется:

type NewUser = typeof users.$inferInsert;

const user: NewUser = {

  email: 'user@example.com',

};

Если передать поле неправильного типа или пропустить обязательное значение, TypeScript сообщит об ошибке ещё до запуска приложения.

Запросы остаются похожими на SQL

Для простых операций можно использовать ORM API, а более сложные запросы собирать через типизированный конструктор:

const activeUsers = await db

  .select({

    id: users.id,

    email: users.email,

  })

  .from(users)

  .where(eq(users.isActive, true))

  .orderBy(desc(users.createdAt))

  .limit(10);

Здесь нет отдельного языка запросов, который нужно мысленно переводить в SQL. select, from, where и orderBy остаются на своих местах, при этом поля и результат запроса типизированы.

Если возможностей конструктора недостаточно, можно перейти к SQL-фрагментам:

const result = await db

  .select({

    total: sql<number>`count(*)`.mapWith(Number),

  })

  .from(users) 

Это удобно для агрегатов, CTE, специфичных для конкретной СУБД функций и других случаев, когда бороться с абстракцией сложнее, чем явно описать запрос.

Когда Drizzle особенно полезен

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

  • пишут на TypeScript и работают с PostgreSQL, MySQL или SQLite;

  • знают SQL и хотят контролировать реальные запросы;

  • сталкиваются с ограничениями Prisma или TypeORM;

  • не хотят дублировать описание таблиц и TypeScript-типы;

  • планируют внедрять ORM постепенно, без перестройки всей архитектуры.

Drizzle не привязан к конкретному фреймворку. Его можно использовать с Next.js, NestJS, Remix и другими TypeScript-решениями.

Но «магии» здесь действительно меньше

Это одновременно преимущество и ограничение Drizzle. ORM не скрывает работу с базой и не берёт на себя всю инфраструктуру.

Миграции нужно отдельно встроить в CI/CD, read/write split для реплик — реализовать на уровне приложения. Drizzle работает только с SQL-базами, а его экосистема пока меньше, чем у более зрелых ORM. Проект активно развивается, поэтому документация иногда не успевает за изменениями API.

Если команда рассчитывает почти не соприкасаться с SQL, такой подход может показаться слишком низкоуровневым.

Drizzle — это не ORM для тех, кто хочет забыть об SQL

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

В полной версии статьи я подробнее разобрал описание связей, миграции, CRUD-операции, CTE, транзакции, оператор sql, расширения и ограничения Drizzle ORM.

Буду рад почитать о вашем опыте работы с Drizzle в комментариях. 

Теги:
+2
Комментарии0

От разработки в конфигураторе до архитектуры: 4 материала для 1С‑разработчиков

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

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

🔹 «Командная разработка на 1С через EDT и Git: пошаговая настройка проекта»

Статья о том, как перейти от индивидуальной разработки к полноценному командному процессу. Разбираем настройку проекта в EDT, работу с Git и подходы, которые помогают разработчикам эффективно взаимодействовать при изменении конфигурации.

🔹 «Готов ли ты стать функциональным архитектором 1С?»

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

🔹 «Система компоновки данных в 1С»

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

🔹 «Управляемые блокировки в 1С»

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

Бонус: бесплатные уроки по 1С‑разработке

  • 28 сентября, 20:00. «Валидация требований с ИИ в техническом проекте». Записаться.
    Разберем, как использовать ИИ при работе с требованиями и проверять технические решения на этапе проектирования.

  • 29 сентября, 20:00. «Модульные тесты YaxUnit в связке с EDT». Записаться.
    Познакомим с подходом к автоматизированному тестированию 1С‑проектов и разберете работу с YaxUnit в современной среде разработки.

  • 22 октября, 20:00. «Оптимизация запросов 1С». Записаться.
    Разбираем, как находить узкие места в запросах и повышать производительность решений на 1С.

Теги:
+2
Комментарии0

Сравнение redb.Route.Redis и Redis в MassTransit

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

1. Роль Redis

redis
redis

2. Философия

  • MassTransit — это message bus.
    Redis здесь — просто быстрый key-value store для хранения состояния саг.
    Основные транспорты — RabbitMQ, Azure Service Bus, SQS, Kafka, SQL и т.д.
    Redis не является транспортом сообщений.

  • redb.Route — это EIP-роутер в стиле Apache Camel.
    Redis становится полноценным endpoint’ом:
    From(Redis.XRead(...)) → .To(Redis.Set(...)) → .To(Redis.Publish(...))
    Всё в одном декларативном маршруте с единым подключением, телеметрией и shutdown.

3. Ограничения MassTransit Redis

  • Поддерживает только корреляцию по CorrelationId (нет query-based correlation).

  • Нужен интерфейс ISagaVersion (поле Version для optimistic concurrency).

  • Optimistic (по умолчанию) и Pessimistic concurrency.

  • Поддерживает Valkey (форк Redis).

  • Нет встроенной поддержки Redis Streams, Pub/Sub или очередей на списках как транспорта.

Краткий вывод

  • MassTransit Redis = быстрый и удобный saga store.

  • redb.Route.Redis = Redis как полноценный интеграционный endpoint (кэш, события, стримы, очереди, Claim Check).

Они почти не пересекаются по назначению.
Если вам нужны саги в MassTransit .
Если вам нужно активно работать с разными структурами Redis внутри маршрутов  redb.Route.Redis намного богаче и удобнее.

Теги:
0
Комментарии0

Собрали хороший курс, а продаж нет

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

Подключаемся там, где нужна наша помощь: направляем заинтересованных пользователей Хабра на ваши курсы! Для этого у нас есть специальная витрина: здесь 150К+ пользователей ежемесячно выбирают обучение по программированию, аналитике, дизайну, менеджменту, а также иностранным языкам, софт-скиллам, хобби и многому другому.

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

→ Узнать подробности и оставить заявку

Теги:
+6
Комментарии0

Python в VS Code не работает? Разбираем настройку по шагам

Если вы пишете код на Python, рано или поздно встает вопрос: в чем его писать? Вариантов масса: от блокнота до тяжелых IDE вроде PyCharm. Visual Studio Code — отличный компромисс — он легкий, но при этом умеет почти всё, что нужно для комфортной работы. Но сложность в том, что из коробки он бесполезен, пока не настроишь интерпретатор, расширения и окружение. И вот тут начинается самое интересное.

Вот с чего стоит начать и что стоит разобрать, если вы только садитесь за настройку:

  • Интерпретатор. VS Code хранит и редактирует файлы, но код выполняет отдельная программа. Пока вы явно не укажете, какой Python использовать, редактор будет гадать и часто ошибаться.

  • Виртуальное окружение. Без него все библиотеки ставятся в общую систему, и рано или поздно два проекта потребуют разные версии одной и той же библиотеки. Что-то одно сломается.

  • Расширения. Pylance отвечает за автодополнение, Python Debugger — за отладку по шагам, Ruff — за линтинг и форматирование. Но если поставить всё сразу, инструменты начнут конфликтовать между собой.

  • Отладка вместо print(). Точки остановки и панель переменных позволяют увидеть, что реально происходит в коде, вместо того чтобы гадать, где закралась ошибка.

Каждый из этих пунктов — отдельная история с нюансами под Windows, macOS и Linux. Где-то команда называется python, где-то python3. Где-то нужно вручную добавить PATH, где-то переустановить Python из официального пакета.

Если хотите пройти весь путь по шагам: от установки редактора до запуска первого скрипта с отладкой, читайте полное руководство на сайте Рег.облака.

Теги:
+4
Комментарии0

Как исключить ненужные колонки из SELECT *

Когда пишешь SQL-запрос к широким таблицам (где 50 и больше колонок), часто необходимо вывести только конкретные поля исключив ненужные. В стандартном SQL для этого, как правило, приходится вручную перечислять в SELECT все необходимые колонки (например 48 из 50). Ну, либо копировать их список из DDL и удалять лишнее. А если таблица меняется, запрос приходится переписывать.

В ClickHouse можно исключать ненужные колонки проще.

Чтобы не перечислять десятки полей руками, можно использовать модификатор EXCEPT. Он работает в связке со звездочкой и позволяет вывести все колонки, исключив ненужные.

Обычно мы пишем так:

SELECT
  id,
  category,
  user_id,
  -- ... перечисляем остальные колонки руками ...
FROM table

С использованием EXCEPT запрос становится короче:

SELECT * EXCEPT (updated_at)
FROM table

Несколько нюансов:

  1. Исключаемые колонки пишутся в круглых скобках через запятую.

  2. Не путайте модификатор EXCEPT с оператором вычитания множеств.

  3. Модификатор отлично комбинируется с другими модификаторами, например с REPLACE или APPLY (напишу про них в следующих постах).

Ссылка на доку.

Мои статьи по ClickHouse на Хабре.

P.S. Систематизировать знания и получить крепкую базу можно на моем бесплатном курсе «ClickHouse с нуля». А закрепить пройденный материал на его практическом продолжении «ClickHouse с нуля: практика».

Теги:
+3
Комментарии0

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

На вебинаре:

✔️ требования к совместимости наборов записей

✔️ основные операторы и их варианты

✔️ синтаксис и логика работы каждого

✔️ отличия вариантов в производительности запросов

✔️ практический разбор отчёта из реальной задачи

Кому будет полезно:

👨‍💻 Big Data Analyst

👨‍💻 разработчикам, работающим с PostgreSQL

👨‍💻 всем, кто хочет уверенно применять множественные операции в повседневной работе

Что нужно знать заранее:

только основы — умение писать простые запросы к таблицам БД. Всё остальное разберём в эфире.


📆 Когда: 24 сентября в 18:00 (Мск)

👨‍🎓 ️Спикер: Щенников Олег, специалист в области проектирования и разработки БД PgSQL

✍️ Записаться

Теги:
+3
Комментарии0

Онлайн-показ AI-driven Digital Q: как мы построили ИИ-экосистему для команд разработки

7 октября в 18:00 в прямом эфире топ-менеджеры компании «Диасофт» покажут новую ИИ-версию экосистемы для разработчиков – AI-driven Digital Q. Она обеспечивает создание ПО от бизнес-требования до промышленной эксплуатации.  

За последние годы ИИ заметно ускорил написание кода. Но для enterprise-разработки одной генерации кода недостаточно. Нужно учитывать архитектуру, требования, существующие компоненты, безопасность, тестирование, CI/CD, документацию и особенности промышленного контура.

Мы пошли дальше отдельных ИИ-ассистентов и построили единую среду для разработки с ИИ – AI-driven Digital Q.

Что такое AI-driven Digital Q

AI-driven Digital Q — промышленная IDP-платформа с двухконтурной моделью разработки. В новой версии искусственный интеллект встроен непосредственно в процесс создания решения и работает на всем жизненном цикле проекта.

AI-driven движок анализирует задачу, находит подходящие решения и компоненты в корпоративных библиотеках, переиспользует их и интегрирует в новый продукт. Генерация используется там, где готового решения действительно нет. Такой подход позволяет одновременно ускорять разработку и контролировать стоимость работы с моделями.

Использование платформы позволяет:

  • до 10 раз увеличить скорость работы команд разработки;

  • до 70% сократить расход токенов за счет интеллектуального управления моделями;

  • организовать единый end-to-end процесс — от бизнес-требования до промышленной эксплуатации;

  • встроить требования к качеству, безопасности и документации непосредственно в конвейер разработки.

В основе платформы — 5 лет практики enterprise AI-разработки, сотни проектов и опыт построения решений в двух контурах разработки.

Что покажем 7 октября

На мероприятии разберем AI-driven Digital Q на практике.

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

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

Промышленный контур Покажем то, что обычно остается за пределами демонстраций ИИ-кодинга:

  • библиотеку переиспользуемых компонентов;

  • интегрированный CI/CD-конвейер;

  • полный комплект проектной документации, необходимый для передачи решения в промышленную эксплуатацию и сдачи требовательному enterprise-заказчику.

Кому будет полезно

Подключайтесь, если вы отвечаете за разработку enterprise-систем, внедряете ИИ-инструменты в SDLC, развиваете внутреннюю платформу разработки или пытаетесь понять, как перейти от экспериментов с ИИ к управляемому промышленному процессу разработки.

7 октября в 18:00 покажем Digital Q в работе и поговорим о том, как меняется разработка, когда ИИ становится не отдельным помощником разработчика, а частью всей платформы.

Для получения ссылки на трансляцию пройдите регистрацию.

Теги:
+4
Комментарии0

Как перенести приложение с Oracle Forms в веб, сохранив бизнес-логику и привычное поведение экранных форм?

Ранее я уже показывал, как наша СУБД исполняет PL/SQL-код на лету.

Сегодня продолжаем тему: в новом видео разбираем технологию автоматизированного переноса приложений Oracle Forms на Go и демонстрируем её работу на примере тестового приложения.

► Рассказываем, почему замены СУБД недостаточно и что усложняет ручной перенос. Показываем, как из файлов .fmb извлекаются метаданные, SQL и PL/SQL-код, как преобразуются триггеры и как связаны JSON, сервер на Go и браузерный интерфейс.

В представленном решении около 70% работ выполняется автоматически. Оставшаяся часть - адаптация интерфейса и разработка Go-компонентов для конкретных форм.

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

Видео также доступно на (в них есть также и таймкоды):
VK
Rutube
Dzen
YouTube

► С 1 сентября 2026 года компания «Диасофт» переходит на новую лицензионную политику СУБД Digital Q.DataBase (до 4-х ядер бесплатно). 

🔹 Бесплатное получение дистрибутива: 
https://database.diasoft.ru/?utm_source=andrei
🔹
 Документация: доступна внутри дистрибутива
🔹 Telegram-сообщество Digital Q.DataBase: https://t.me/dqdatabase
🔹
 MAX: https://max.ru/channel_dqdatabase
🔹
 RuDB : https://database.ru

Подписывайтесь на наши сообщества, чтобы получать новости, технические материалы и информацию о новых вебинарах.

СУБД, которая понимает диалекты Oracle, MS SQL и PostgreSQL,– без переписывания кода приложений.

Теги:
+11
Комментарии0

Что происходит за пределами вашего стека: 15 открытых уроков недели

Даже если вы глубоко погружены в свою технологию, рабочие задачи редко остаются внутри одного стека. Сегодня разработчику нужно понимать, как устроена инфраструктура, завтра — разобраться в возможностях ИИ‑инструментов, а послезавтра — оценить новый подход к тестированию или архитектуре системы.

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

Разработка

  • 21 сентября в 20:00. «HTTP‑сервер на чистой Java за 30 минут». Записаться.

  • 22 сентября в 20:00. «Горутины и каналы: под капотом (under the hood) и нюансы в продакшене». Записаться.

  • 23 сентября в 20:00. «Создание кроссплатформенного приложения с GUI на Rust: От идеи до реальности». Записаться.

  • 24 сентября в 20:00. «Указатели в Си — от адреса к управлению памятью». Записаться.

AI и машинное обучение

  • 21 сентября в 20:00. «Один рабочий день с ИИ: от писем и таблиц до готовой презентации для руководителя». Записаться.

  • 22 сентября в 20:00. «Можно ли доверять ИИ‑коду: как находить галлюцинации, уязвимости и устаревшие решения». Записаться.

  • 23 сентября в 18:00. «Ландшафт современного NLP: от эмбеддингов и классических ML‑методов до современных LLM». Записаться.

  • 23 сентября в 18:00. «Structured Outputs: как заставить LLM всегда возвращать то, что вам нужно». Записаться.

DevOps и инфраструктура

  • 21 сентября в 20:00. «Типовые задачи с RAID‑массивами: создание, эксплуатация, перенос данных и восстановление». Записаться.

  • 23 сентября в 20:00. «eBPF: рентгеновское зрение для production». Записаться.

  • 23 сентября в 20:00. «Узнайте, как использовать Patroni для управления высокодоступными кластерами PostgreSQL». Записаться.

Тестирование

  • 22 сентября в 20:00. «Автоматизация управления трафиком с mitmproxy». Записаться.

  • 22 сентября в 20:00. «Playwright JS: как быстро начать писать автотесты?». Записаться.

Аналитика и управление

  • 21 сентября в 20:00. «Как аналитик 1С ведет задачу от интервью до приемки: сквозной кейс интеграции с мобильным рабочим местом». Записаться.

  • 23 сентября в 20:00. «Как системному аналитику проводить архитектурное ревью и находить риски до начала разработки». Записаться.

  • 24 сентября в 20:00. «PM + ИИ: собираем статус‑отчёт, реестр рисков и прогноз сроков за 40 минут». Записаться.

Больше бесплатных уроков сентября вы найдете в дайджесте.

Теги:
+5
Комментарии0

Изучал коммиты, которые попали в релиз Go 1.27 и наткнулся на ряд улучшений, которые не отобразили в release notes.

Интересующие нас коммиты в этом посте: f4bfb1a9c6, 9be7615aa2, 5af294bac7, 84e0c4965a, 1bcfdf2df2.

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

Давайте посмотрим на пару примеров:

func Apply() int {
	var f func([]int) int
	f = func(p []int) int { return p[0] * 2 }
	arr := make([]int, 2)
	return f(arr)
}

Пример достаточно вычурный, но явно показывает разницу.

Бенчмарки: Go 1.26:

BenchmarkApply-10                	93288418	        11.95 ns/op	      16 B/op	       1 allocs/op

Go 1.27:

BenchmarkApply-10                	590856250	         2.028 ns/op	       0 B/op	       0 allocs/op

Компиляция с -gcflags=-m сразу укажет на причину.

Go 1.27:

./demo.go:26:6: func literal does not escape
./demo.go:27:13: make([]int, 2) does not escape

Go 1.26:

./demo.go:26:6: func literal does not escape
./demo.go:27:13: make([]int, 2) escapes to heap

Но не все так просто. У меня есть и контрпример, когда escape analysis промахивается:

var g func(*int) int = func(p *int) int { return *p * 3 }

func ApplyUnresolvable() int {
	var f func(*int) int
	f = func(p *int) int { return *p * 2 }
	f = g
	return f(new(int))
}

А в этом примере аргумент замыкания f убежит на хип, потому что в момент вызова f(new(int)) в f может лежать любое из присвоенных значений. Значение g компилятор доказать не может — это переменная уровня пакета, её содержимое escape analysis не отслеживает, то есть «аргумент может утечь куда угодно». Например, что если g будет запускать goroutine внутри. Поэтому тут компилятор выбирает консервативное поведение.

Теперь я покажу, как с переходом с 1.26 на 1.27 можно получить почти восьмикратное ускорение!

type Node struct {
	Val      int
	Children []*Node
}

func Sum(root *Node) int {
	var visit func(*Node) int
	visit = func(n *Node) int {
		t := n.Val
		for _, c := range n.Children {
			t += visit(c)
		}
		return t
	}
	return visit(root)
}

func BuildAndSum(v int) int {
	root := &Node{Val: v, Children: []*Node{{Val: 1}, {Val: 2}}}
	return Sum(root)
}

Здесь ни один экземпляр Node не утечет на хип! Смотрим на бенчмарки. Go 1.26

BenchmarkBuildAndSum-10          	17728094	        66.86 ns/op	     112 B/op	       4 allocs/op

Go 1.27

BenchmarkBuildAndSum-10          	148023318	         8.561 ns/op	       0 B/op	       0 allocs/op

Как и обещал ускорение примерно в 8 раз :)

P.S. Вообще удивительно как интересные вещи пропускают в release notes. Я нашел как минимум еще три изменения, которых нет в release notes, но прямо влияющих на перф. Одна из них так вообще прямо влияет на то как мы пишем бенчмарки! Но об этом в другой раз ;)

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

Теги:
0
Комментарии0

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

После Ruby/Elixir в Go, часть 1

Когда я начал писать на Go после опыта с Ruby и Elixir, одной из самых непривычных вещей стало отсутствие консоли, в которой можно напрямую вызывать код приложения.

Для рубиста такая консоль почти универсальный пульт управления приложением(но пульт довольно опасный). Если нужно посмотреть, что происходит с конкретным пользователем, можно просто открыть консоль, найти его, вызвать нужный метод и понять, почему, например, не работает какая-то функция.

Набираешь:

bundle exec rails c

И через несколько секунд уже находишься внутри приложения и можешь работать с его кодом и данными. Только вместо кнопок у разработчика код. Надо помнить: «С большой силой приходит большая ответственность». © Дядя Бен.

Например, приходит вопрос:

Почему у этого пользователя не появился доступ к фиче?

В Rails можно открыть консоль, вызвать нужный код и довольно быстро проверить несколько гипотез. Когда я пришёл в Go, первое время постоянно хотелось сделать то же самое. Конечно, проверить код всё равно можно. Можно написать тест или небольшую программу, подключиться к базе, сделать отдельную CLI-команду под конкретный кейс, но это уже не то ощущение: «открыл приложение и начал быстро проверять гипотезы».

Ruby здесь не единственный пример. В Elixir есть интерактивная консоль IEx. Можно запустить прямо внутри неё:

iex -S mix

Благодаря возможностям Erlang VM можно даже подключаться консолью к другому запущенному узлу. И вот после Ruby и Elixir Go ощущается особенно необычно. В Ruby удобную консоль обычно даёт фреймворк. В Elixir сама платформа хорошо приспособлена к интерактивной работе с запущенной системой.

В Go это ощущается так:

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

Поначалу это раздражает. Кажется, что раньше на проверку гипотезы уходило 5–10 минут, а теперь приходится что-то дополнительно писать, но со временем я увидел в этом и другую сторону. Удобная консоль очень легко позволяет разработчику стать частью бизнес-процесса. Про эту боль я подробнее писал в статье. Также можно легко сломать продакшен.

Нет нужной кнопки в админке?

Попросим разработчика выполнить команду.

Нужно поправить состояние пользователя?

Разработчик сделает через консоль.

Для небольшого бизнеса это действительно может быть удобно. Но потом внезапно оказывается, что важная операция в продукте существует только потому, что рядом есть разработчик, который знает правильную команду. Я такой подход называю Developer as an admin panel.

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

Я всё ещё считаю консоли в Ruby/Elixir невероятно удобными инструментами. Но теперь, когда хочется в очередной раз сделать что-то вручную, полезно задать себе вопрос:

Мне действительно не хватает консоли или не хватает нормального инструмента?

Теги:
+3
Комментарии5

Решил проверить, что обо мне знает Google. И знает он достаточно. Я есть и в SEO, и в GEO выдаче.

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

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

К посту нельзя прикрепить больше 1 пикчи, но есть выдача и по другим запросам
К посту нельзя прикрепить больше 1 пикчи, но есть выдача и по другим запросам

Есть смысл в маркетинге для разрабов? Что думаете?

Теги:
-2
Комментарии0
redb 4.0.1
redb 4.0.1

redb 4.0.1: транзакции, изоляция кластеров и SQL-коннектор по канону Camel

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

redb.Core

  • Всё, что redb делает внутри общей транзакции .NET (TransactionScope), теперь фиксируется или откатывается вместе с ней, на MSSQL, PostgreSQL и SQLite.

  • Ленивые загрузки идут по соединению того, кто читает, без скрытых соединений.

  • Кэш Props держит нагрузку, а объекты по списку идентификаторов загружаются одним запросом.

  • Нативное расширение SQLite сверяет свою версию при старте и называет устаревший файл, если он попался.

redb.Route

  • Единица работы стала предсказуемой: сначала фиксируется база, потом брокеры, а повтор оборачивает транзакцию целиком. Необработанный сбой везде остаётся сбоем, обработка ошибок ведёт себя как в Apache Camel.

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

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

  • LLM-агенты учитывают побочные эффекты инструментов, сохраняют рассуждения модели, считают бюджет и стоимость.

  • На обмене появилась личность вызывающего, общая для всех входящих транспортов.

redb.Tsak

  • Несколько кластеров на одной базе полностью изолированы: координация, состояние, очередь недоставленных, аудит и планировщик у каждого свои.

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

  • Дашборд снова обновляется сам и отправляет действия на узел нужного кластера.

redb.Identity

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

  • Одно DPoP-доказательство нельзя использовать дважды даже при одновременных запросах.

  • Транзакции маршрутов идут в общей транзакции, а недоступность базы больше не вызывает бесконечных повторов.

Что учесть при обновлении

  • Tsak: если на одной базе живут несколько кластеров, перед обновлением остановите все узлы этой базы.

  • Route: параметры в SQL-запросах переходят на синтаксис Camel, а единица работы и обработка ошибок стали строже. Это стоит проверить на своих маршрутах.

Pro по-прежнему бесплатен и не требует ключа. Полные списки изменений на redb.ru/releases, исходники на GitHub.

Если было полезно, ⭐ на GitHub поможет другим это найти.

Другие мои статьи — redb.ru/articles, ещё — на Хабре.

Теги:
-2
Комментарии0

Окно закрылось: стелс-модель union-alpha деанонилась как Pareto от Unbiased... и счёт за токены, который я не получил.

Вчера я опубликовал разбор стелс модели union-alpha: за один вечер она собрала рабочую ветку комментариев для НЕЛЬЗЯgram агента, мы прогнали её через аудит вторым ИИ, три живых теста и проверку памяти. Статья вышла вечером... Ирония: егодня утром стелса нет. Страница union-alpha сменила плашку:

На месте стелса уже платная unbiased/pareto: 2.50 у.е. за миллион входных токенов и 7.50 у.е. за выходной, те же 262K контекста, описание слово в слово то же самое, релиз 17 сентября.

Это уже второй виток одного паттерна. Прошлый стелс (ox-alpha0 неделю отвечал бесплатно, а потом деанонился как GLM 5.3 Flash от Z.ai. У union-alpha бесплатное окно прожило ровно сутки: 16 и 17 сентября. Мои тесты шли 17 = в последний день окна. Конечно хотелось бы почитать ещё, о том как кто протестировал эту union-alpha до её деанона...на Open router уже её "прогнали" за 2е суток по полной вижу:

  • За 17 сентября модель успела обработать небольшой объем: 120 млн входных токенов (Prompt) и 2,61 млн токенов ответа (Completion);

  • За 18 сентября (на момент публикации поста) виден гигантский скачок - суммарно обработано более 1,13 миллиарда Prompt-токенов (входных данных) и 21,7 миллиона Completion-токенов (ответов модели);

Теперь математика расходов:

Вчерашние мои прогоны данной llm - сборка одной ветки: ТЗ на 28200 токенов входа, чтение проекта, генерация семи файлов, итерации правок, три боя. Типичная сессия Cline такого масштаба это единицы миллионов токенов, где большая часть является кэш чтение. Возьмём средние 3 млн. входных (80-85% кеша) и около 50 тысяч выходных и подставим прайс Pareto:

  • вход без кеша: около 0,5 млн умножить на 2.50 у.е. = 1.25 у.е.

  • кеш чтение: около2,5 млн умножить на 0.25 у.е. = 0.63 у.е.

  • выход: 0,05 млн на 7.50 у.е. = 0.38 у.е.

Итого около 2.3 долларов за вечер работы модели, включая аудиты и три прогона. Мне повезло дважды: поймал окно и взял скромный масштаб задачи.

А теперь подставьте прошлый мой тест - эксперимент ( https://habr.com/ru/articles/1076084/) : 60,9 млн токенов за три дня, 85% кэш хитов. По прайсу GLM Flash тот прогон вышел около $4. По прайсу Pareto он же стоил бы в пределах 45-50 долларов. Разница в десять с лишним раз просто за то, что модель "сняла плащ" (и конечно обьём токенов то).

Вывод тем, кто "охотится" за стелсами, короткий:

  1. Окна сужаются: у ox-alpha было неделя, у union-alpha - сутки. Успел за сутки = считай, заработал.

  2. ТЗ и контекст готовь заранее: их цена от окна не зависит, а вот прогон зависит напрямую.

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

Если интересны подробности и разбор моих тестов - прогонов с кодом скринами , то всё в статье ( https://habr.com/ru/articles/1083578/ ).

Всем добра, и спасибо за внимание =)

Теги:
+5
Комментарии2

Backend без сюрпризов: 15 уроков недели от кода до production

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

На ближайших бесплатных уроках разберём инструменты и подходы, которые помогают backend‑разработчикам решать реальные задачи: проектировать сервисы, работать с данными, понимать поведение приложений под нагрузкой и готовить решения к продакшену. Уроки проведут наши преподаватели – можно будет задать вопросы по теме или формату обучения.

Архитектура и высоконагруженные системы

  • 23 сентября в 20:00. «Узнайте, как использовать Patroni для управления высокодоступными кластерами PostgreSQL». Записаться

  • 6 октября в 20:00. «Практические подходы к переходу от монолита на микросервисы». Записаться

  • 6 октября в 20:00. «Apache Kafka в микросервисной архитектуре – лучшие практики асинхронного обмена». Записаться

  • 22 октября в 19:00. «Основы проектирования бизнес-логики в микросервисной архитектуре». Записаться

Java и Spring

  • 21 сентября в 20:00. «HTTP-сервер на чистой Java за 30 минут». Записаться

  • 30 сентября в 20:00. «Spring AI 2.0 на практике: добавляем AI в Spring Boot и доводим до production». Записаться

  • 22 октября в 20:00. «Spring Boot под нагрузкой: почему сервис работает локально и падает в production». Записаться

Backend на Go и C++

  • 22 сентября в 20:00. «Горутины и каналы: под капотом (under the hood) и нюансы в продакшене». Записаться

  • 1 октября в 20:00. «Паттерн многопоточного программирования Producer–Consumer». Записаться

.NET и ASP.NET Core

  • 1 октября в 20:00. «JIT и AOT в .NET: ReadyToRun и NativeAOT на практике». Записаться

  • 20 октября в 20:00. «OpenTelemetry в .NET: от чёрного ящика к наблюдаемой системе». Записаться

Базы данных и SQL

  • 30 сентября в 20:00. «Подзапросы или CTE – как сделать сложный запрос понятным». Записаться

  • 5 октября в 20:00. «Как SQL Server ищет данные – Scan, Seek и Lookup в плане запроса». Записаться

  • 15 октября в 20:00. «SQL против бардака в данных: поиск по шаблону и регулярные выражения». Записаться

  • 19 октября в 20:00. «Анализируем длинные и сложные запросы в SQL Server». Записаться

Полное расписание бесплатных уроков сентября собрали в дайджесте.

Теги:
+4
Комментарии0

Вот вам еще одна из самых полезных команд в Claude Code для продвинутых
И одна из причин, почему я не фанат Codex Harness -- там такого нет

Это команда /rewind или esc + esc в Claude Code CLI

Эту команду можно воспринимать ее как Ctrl+Z для агента

Сначала вот вам короткое описание из документации Claude Code

Что делает /rewind в Claude Code

Claude Code автоматически создаёт checkpoint перед каждым новым ходом и сохраняет снимки файлов перед своими правками. Команда /rewind или двойное нажатие Esc открывает меню, где можно выбрать прошлое сообщение и:

  • восстановить только разговор;

  • восстановить только изменённые файлы;

  • восстановить и разговор, и файлы;

  • свернуть выбранную часть истории в summary.

Checkpoints сохраняются вместе с сессией, поэтому вернуться к ним можно даже после перезапуска Claude Code. Но если в гит намусорили уже другие сессии, то при измении файлов могут вылезать конфликты

Теперь про юзкейсы и объяснение уже от меня

В основе этой команды лежат две независимые переменные

  1. Состояние git файлов в вашем репозитории

  2. и Conversation — история текущего диалога в context window

При вызове команды /rewind вам предложат выбрать конкретное сообщение и затем выбор из 3-5 вариантов

  1. Restore code and conversation
    Возвращает и файлы, и диалог к выбранной точке Полезно, когда агент долго шёл не туда и оставил после себя плохие изменения. Продолжать поверх такого состояния смысла нет: контекст и файлы уже заполнены ошибочными попытками

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

  3. Restore code
    Откатываются только файлы, а разговор остаётся Так можно признать решение неудачным, стереть его из репозитория и продолжить обсуждение в том же контексте Это чище, чем заставлять агента по памяти выискивать и удалять свои изменения

  4. Summarize

    1. Summarize from here
      Сжать сообщения после выбранной точки

    2. Summarize up to here — сжать всё до точки, оставив последние сообщения дословно /compact подводит итог всей сессии В этих сценариях Claude Code делает форк диалога

  5. И ещё есть просто Fork
    Как и в случаях с саммари — старая ветка не стирается: restore code and conversation и restore conversation создают форк

Теги:
-1
Комментарии2
Биржа заказов Инфостарта: новые задачи по 1С со 9 по 16 сентября
Биржа заказов Инфостарта: новые задачи по 1С со 9 по 16 сентября

На Бирже заказов Инфостарта в период с 9 по 16 сентября появились новые задачи для разработчиков и консультантов 1С. В фокусе — интеграции с кассами, маркетплейсы, обмены, мобильная платформа, НДФЛ и автоматизация договорной работы с помощью ИИ.

Свежие заказы:

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

Теги:
+3
Комментарии0
1
23 ...