Forwarded from Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
Эту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты интерфейса.
uvx showboat --helpЭту команду автор предлагает дать агенту: в справке есть всё необходимое, чтобы тот создал документ с демонстрацией новой функции.
Уиллисон замечал и обход механизма: агент напрямую правит текст отчёта. Тогда записанный вывод может расходиться с реальным запуском. Содержимое демонстрации тоже требует проверки.
#ии #инструменты
Forwarded from Нейроканал
Нейроканал
Showboat и Rodney помогают показать работу ИИ-агента Саймон Уиллисон собирает демонстрации кода с помощью двух своих инструментов. Showboat выполняет команды и записывает их вывод в документ. Rodney управляет Chrome из командной строки и делает скриншоты…
Вспомните последний раз, когда ИИ сделал для вас рабочий результат: код, тесты, документацию или требования. Как вы его проверяли?
Anonymous Poll
16%
Внимательно разобрал сам
35%
Проверил на практике: тесты, запуск, реальные данные
27%
И разобрал, и проверил на практике
1%
Отдал на ревью коллеге
12%
Не проверял, сразу использовал
5%
Не было такого случая или не помню
3%
Другое (напишу в комментариях)
Чашечка Java
Развёрнутое пояснение:
1. Создаётся session, реализующий AutoCloseable: при закрытии он выбрасывает исключение с сообщением close.
2. Внутри блока try возникает исключение с сообщением send, поэтому выполнение блока прерывается.
3. Перед переходом к catch конструкция try с ресурсами автоматически закрывает session; закрытие тоже завершается исключением.
4. Поскольку основное исключение уже возникло в теле try, исключение закрытия добавляется в список подавленных исключений основного. Оно не заменяет причину сбоя отправки.
5. Обработчик catch получает основное исключение: первая строка вывода — send, вторая — 1, поскольку список подавленных исключений содержит один элемент.
Почему это важно
Задача проверяет обработку исключений и управление ресурсами в Java SE. При работе с соединениями и потоками данных ошибка закрытия может сопровождать исходный сбой. Если журналировать только сообщение основного исключения, дополнительная причина останется незаметной; для диагностики нужно учитывать и подавленные исключения.
2. Внутри блока try возникает исключение с сообщением send, поэтому выполнение блока прерывается.
3. Перед переходом к catch конструкция try с ресурсами автоматически закрывает session; закрытие тоже завершается исключением.
4. Поскольку основное исключение уже возникло в теле try, исключение закрытия добавляется в список подавленных исключений основного. Оно не заменяет причину сбоя отправки.
5. Обработчик catch получает основное исключение: первая строка вывода — send, вторая — 1, поскольку список подавленных исключений содержит один элемент.
Почему это важно
Задача проверяет обработку исключений и управление ресурсами в Java SE. При работе с соединениями и потоками данных ошибка закрытия может сопровождать исходный сбой. Если журналировать только сообщение основного исключения, дополнительная причина останется незаметной; для диагностики нужно учитывать и подавленные исключения.
Spring Boot и PostgreSQL: дедлок может быть в транзакциях
Приложение получило ошибку
Достаточно двух строк: транзакция A обновила первую и ждёт вторую, B — наоборот. Такие дедлоки возможны даже без явного
PostgreSQL прервёт одну транзакцию, чтобы остальные продолжили работу. Какая станет жертвой, заранее полагаться нельзя. В локальной проверке двух сессий получен именно
Базовый способ избежать цикла — брать блокировки в согласованном порядке во всех путях приложения. Если всё же повторяете запрос после дедлока, повторять нужно транзакцию целиком, а не только последнюю упавшую команду.
Дедлоки и порядок блокировок
#spring #java
Приложение получило ошибку
40P01? Это PostgreSQL обнаружил цикл ожидания блокировок, а не доказательство взаимной блокировки Java-потоков.Достаточно двух строк: транзакция A обновила первую и ждёт вторую, B — наоборот. Такие дедлоки возможны даже без явного
LOCK TABLE, потому что обновление строки тоже берёт блокировку.PostgreSQL прервёт одну транзакцию, чтобы остальные продолжили работу. Какая станет жертвой, заранее полагаться нельзя. В локальной проверке двух сессий получен именно
deadlock detected с SQLSTATE 40P01.Базовый способ избежать цикла — брать блокировки в согласованном порядке во всех путях приложения. Если всё же повторяете запрос после дедлока, повторять нужно транзакцию целиком, а не только последнюю упавшую команду.
Дедлоки и порядок блокировок
#spring #java
👍1
Почему копирование HashMap стало быстрее в JDK 27
При вызове
В JDK 27 добавили отдельный путь для источника, который является именно HashMap, и для неизменяемой обёртки над такой картой. Реализация обходит внутреннюю таблицу напрямую и использует хеш, уже сохранённый в узле. Это касается и конструктора
В разборе оптимизаций JDK 27 приведены JMH-замеры на AWS Graviton: в выбранных сценариях время операции сократилось на 61–86%. Это результаты конкретных микробенчмарков.
Для других типов исходной Map остаётся общий путь. При обновлении сервиса полезно проверить копирование карт на своих данных: размеры коллекций и типы источников влияют на результат.
#java #производительность
При вызове
putAll() карта раньше читала элементы источника через интерфейс Map: создавала итератор, получала ключи и значения, снова вычисляла хеши. Несколько реализаций Map в одном месте вызова усложняли оптимизацию для JIT.В JDK 27 добавили отдельный путь для источника, который является именно HashMap, и для неизменяемой обёртки над такой картой. Реализация обходит внутреннюю таблицу напрямую и использует хеш, уже сохранённый в узле. Это касается и конструктора
HashMap(Map).В разборе оптимизаций JDK 27 приведены JMH-замеры на AWS Graviton: в выбранных сценариях время операции сократилось на 61–86%. Это результаты конкретных микробенчмарков.
Для других типов исходной Map остаётся общий путь. При обновлении сервиса полезно проверить копирование карт на своих данных: размеры коллекций и типы источников влияют на результат.
#java #производительность
Java в браузере: редактировать, компилировать, запускать
В учебном примере удобно поменять строку Java и сразу увидеть результат. Petr Pravda показывает приложение на React и Vite, в котором компиляция выполняется на устройстве читателя.
TeaVM преобразует Java-байткод в JavaScript или WebAssembly. Чтобы пользователь мог менять исходник, автор добавляет teavm-javac: Java-компилятор тоже работает в браузере. Web Worker получает код, компилирует его и возвращает результат странице, сохраняя отзывчивость редактора.
В демо есть отдельные кнопки Compile Java и Run Java. Программа считает простые числа, рисует небольшой фрактал и показывает доступные системные свойства. Запрос к серверу для компиляции не нужен.
Среда отличается от обычной JVM: доступна часть стандартной библиотеки, а код с JNI, динамической загрузкой классов и произвольной рефлексией потребует изменений. Доступа к файлам и переменным оболочки посетителя тоже нет.
#java #webassembly
В учебном примере удобно поменять строку Java и сразу увидеть результат. Petr Pravda показывает приложение на React и Vite, в котором компиляция выполняется на устройстве читателя.
TeaVM преобразует Java-байткод в JavaScript или WebAssembly. Чтобы пользователь мог менять исходник, автор добавляет teavm-javac: Java-компилятор тоже работает в браузере. Web Worker получает код, компилирует его и возвращает результат странице, сохраняя отзывчивость редактора.
В демо есть отдельные кнопки Compile Java и Run Java. Программа считает простые числа, рисует небольшой фрактал и показывает доступные системные свойства. Запрос к серверу для компиляции не нужен.
Среда отличается от обычной JVM: доступна часть стандартной библиотеки, а код с JNI, динамической загрузкой классов и произвольной рефлексией потребует изменений. Доступа к файлам и переменным оболочки посетителя тоже нет.
#java #webassembly
❤1🔥1
Как собрать Swing-приложение без JVM у пользователя
Quarkus Desktop помогает собрать приложение на AWT или Swing в нативный исполняемый файл. Расширение регистрирует необходимые классы, ресурсы и JNI-вызовы для GraalVM, а библиотеки JDK размещает рядом с бинарником.
В руководстве автора окно становится CDI-компонентом. Оно получает зависимости через
Долгие операции выполняют в фоновом executor, а обновление интерфейса возвращают на EDT через
Нативная сборка выполняется под целевую ОС. Для macOS нужны Quarkus 4.0 и GraalVM 25.1 или новее; на Windows arm64 доступен режим JVM. Динамически загружать неизвестные при сборке классы в нативном приложении нельзя.
#java #swing
Quarkus Desktop помогает собрать приложение на AWT или Swing в нативный исполняемый файл. Расширение регистрирует необходимые классы, ресурсы и JNI-вызовы для GraalVM, а библиотеки JDK размещает рядом с бинарником.
В руководстве автора окно становится CDI-компонентом. Оно получает зависимости через
@Inject и открывается по DesktopStartupEvent в потоке обработки событий Swing — EDT.Долгие операции выполняют в фоновом executor, а обновление интерфейса возвращают на EDT через
EdtExecutor. Для окон подходят области @Singleton и @Dependent: обычный CDI-прокси для Swing-компонента создаёт проблемы.Нативная сборка выполняется под целевую ОС. Для macOS нужны Quarkus 4.0 и GraalVM 25.1 или новее; на Windows arm64 доступен режим JVM. Динамически загружать неизвестные при сборке классы в нативном приложении нельзя.
#java #swing
Lathe: конфигурация редактора из реальной Maven-сборки
Maven собирает проект, а редактор подчёркивает рабочий код как ошибочный. Причина может быть в разных представлениях о module path, зависимостях или обработчиках аннотаций.
Alexey Gavrilov предлагает Java language server Lathe. Расширение Maven записывает параметры компиляции и тестов из самой сборки. Сервер читает этот снимок, чтобы настроить подсказки, диагностику, запуск и отладку. Следующая сборка обновляет конфигурацию.
Для первого захвата после подключения расширения используется:
Папку
Нужны Java 21+ и Maven 3.x. Проект пока молодой: наиболее полный клиент есть для Neovim, Emacs работает через Eglot, поддержка VS Code находится в планах.
#java #maven
Maven собирает проект, а редактор подчёркивает рабочий код как ошибочный. Причина может быть в разных представлениях о module path, зависимостях или обработчиках аннотаций.
Alexey Gavrilov предлагает Java language server Lathe. Расширение Maven записывает параметры компиляции и тестов из самой сборки. Сервер читает этот снимок, чтобы настроить подсказки, диагностику, запуск и отладку. Следующая сборка обновляет конфигурацию.
Для первого захвата после подключения расширения используется:
mvn clean test -Dlathe.capture.only=true
Папку
.lathe/ автор рекомендует добавить в .gitignore. Запуски и тесты затем воспроизводятся по сохранённым настройкам без нового вызова Maven.Нужны Java 21+ и Maven 3.x. Проект пока молодой: наиболее полный клиент есть для Neovim, Emacs работает через Eglot, поддержка VS Code находится в планах.
#java #maven
❤1👍1
Что меняется в TLS 1.3 с JDK 27
JDK 27 поддерживает гибридный обмен ключами: группа
В обзоре Java Security Sean Mullan объясняет и другие изменения TLS. Цепочки сертификатов теперь могут передаваться со сжатием zlib, а редко используемые группы
Для настройки групп есть свойство
При переходе стоит проверить соединения с реальными клиентами и серверами. Поддержка новой группы в JDK ещё не означает, что каждое соединение её согласует: результат зависит и от возможностей второй стороны.
#java #tls
JDK 27 поддерживает гибридный обмен ключами: группа
X25519MLKEM768 объединяет классическую кривую X25519 и постквантовый алгоритм ML-KEM. Она включена по умолчанию, но для её использования поддержку должны иметь обе стороны соединения.В обзоре Java Security Sean Mullan объясняет и другие изменения TLS. Цепочки сертификатов теперь могут передаваться со сжатием zlib, а редко используемые группы
ffdhe6144 и ffdhe8192 убраны из списка по умолчанию.Для настройки групп есть свойство
jdk.tls.namedGroups и метод SSLParameters.setNamedGroups(). Удалённые из стандартного списка группы можно явно включить, если они нужны для совместимости.При переходе стоит проверить соединения с реальными клиентами и серверами. Поддержка новой группы в JDK ещё не означает, что каждое соединение её согласует: результат зависит и от возможностей второй стороны.
#java #tls
В JavaDoc предлагают отдельный тег для предупреждений
Совет по использованию метода или важное ограничение легко потерять внутри длинного описания. Для JDK 28 предлагают тег
В заметке OpenJDK Quality Outreach показаны два варианта: встроенная заметка с вертикальной полосой и блочная с отдельным заголовком. Заголовок можно изменить, например на Caution:
Атрибуты
Пока это предлагаемые изменения для JDK 28. Пример полезен для знакомства с будущим форматом; использовать его как поддерживаемый синтаксис в документации проекта на JDK 27 рано.
#java #документация
Совет по использованию метода или важное ограничение легко потерять внутри длинного описания. Для JDK 28 предлагают тег
@note, который выделяет такие фрагменты при генерации документации.В заметке OpenJDK Quality Outreach показаны два варианта: встроенная заметка с вертикальной полосой и блочная с отдельным заголовком. Заголовок можно изменить, например на Caution:
/**
* {@note (header='Caution:') Verify untrusted input!}
*/
Атрибуты
kind и id позволяют добавить CSS-класс и идентификатор HTML-элемента. Предложение также предусматривает настройку собственных тегов через параметры javadoc.Пока это предлагаемые изменения для JDK 28. Пример полезен для знакомства с будущим форматом; использовать его как поддерживаемый синтаксис в документации проекта на JDK 27 рано.
#java #документация
Почему javac разрешает удалить Integer из Set<Short>
Метод
В последней строке
В разборе Error Prone показано, как находить подобные ошибки при компиляции. Инструмент подключается к javac и использует сведения о типах: проверка CollectionIncompatibleType замечает несовместимый аргумент коллекции.
Другой пример —
#java #инструменты
Метод
remove(Object) принимает любой объект. Поэтому такой код компилируется, но оставляет элемент в коллекции:Set<Short> values = new HashSet<>();
values.add((short) 1);
values.remove(1);
В последней строке
1 упаковывается в Integer. В наборе лежит Short, и равными эти объекты не считаются.В разборе Error Prone показано, как находить подобные ошибки при компиляции. Инструмент подключается к javac и использует сведения о типах: проверка CollectionIncompatibleType замечает несовместимый аргумент коллекции.
Другой пример —
YYYY вместо yyyy в формате даты: год недели может отличаться от календарного в конце декабря. Проверка MisusedWeekYear помогает поймать и эту ошибку. Для правил своей команды можно написать BugChecker, а повторяющиеся замены описать Java-шаблонами Refaster.#java #инструменты
😁1
Hibernate Validator 9.2: проверки паролей через аннотации
В первой бете Hibernate Validator 9.2 появились
В описании релиза есть важная подробность: готового оценщика стойкости и сервиса проверки утечек библиотека не предоставляет. Приложение подключает свои реализации PasswordStrengthEstimator и CompromisedPasswordChecker.
Все три ограничения считают null допустимым значением. Обязательное поле нужно дополнительно пометить
PasswordPolicy объединяет правила в повторно используемый класс. Каждое нарушенное правило создаёт собственную ошибку валидации, поэтому можно показать, какие требования не выполнены.
Это бета; многие новые API ещё экспериментальные. Примеры подключения сервисов в статье стоит рассматривать как основу для знакомства с интерфейсами.
#java #hibernate
В первой бете Hibernate Validator 9.2 появились
@PasswordStrength, @NotCompromised и @PasswordPolicy. Они позволяют проверять стойкость пароля, наличие в известных утечках и соблюдение набора правил.В описании релиза есть важная подробность: готового оценщика стойкости и сервиса проверки утечек библиотека не предоставляет. Приложение подключает свои реализации PasswordStrengthEstimator и CompromisedPasswordChecker.
Все три ограничения считают null допустимым значением. Обязательное поле нужно дополнительно пометить
@NotNull или @NotBlank.PasswordPolicy объединяет правила в повторно используемый класс. Каждое нарушенное правило создаёт собственную ошибку валидации, поэтому можно показать, какие требования не выполнены.
Это бета; многие новые API ещё экспериментальные. Примеры подключения сервисов в статье стоит рассматривать как основу для знакомства с интерфейсами.
#java #hibernate
Jenesis: сборка Java-проекта из module-info.java
Имя модуля и его зависимости уже описаны в Java-коде. Рафаэль Винтерхальтер, автор Byte Buddy, предлагает использовать эту информацию и для сборки.
В знакомстве с Jenesis основным описанием проекта становится
Команда pin фиксирует версии зависимостей и контрольные суммы. Шаги сборки кешируются по входным данным, а для тестов инструмент определяет, какие из них затрагивает изменение.
Для знакомства не обязательно сразу переводить проект на модули: Jenesis умеет читать и pom.xml. В статье есть примеры многомодульной сборки, общего кеша и генерации кода. Перед переходом остаётся проверить, как инструмент справляется с особыми шагами именно вашей сборки.
#java #сборка
Имя модуля и его зависимости уже описаны в Java-коде. Рафаэль Винтерхальтер, автор Byte Buddy, предлагает использовать эту информацию и для сборки.
В знакомстве с Jenesis основным описанием проекта становится
module-info.java. Дополнительные сведения, например главный класс, задаются тегами в Javadoc. Сам инструмент хранится в репозитории как Java-исходники и запускается на JDK 25+:java build/jenesis/Make.java
Команда pin фиксирует версии зависимостей и контрольные суммы. Шаги сборки кешируются по входным данным, а для тестов инструмент определяет, какие из них затрагивает изменение.
Для знакомства не обязательно сразу переводить проект на модули: Jenesis умеет читать и pom.xml. В статье есть примеры многомодульной сборки, общего кеша и генерации кода. Перед переходом остаётся проверить, как инструмент справляется с особыми шагами именно вашей сборки.
#java #сборка
Мониторинг Spring Boot на небольшом VPS
Для нескольких сервисов бывает достаточно видеть задержки, ошибки, память и перезапуски. В руководстве по StatLite показана панель, которая собирает эти данные из Spring Boot Actuator.
StatLite запускается одним Go-бинарником и хранит историю в SQLite. На стороне приложения нужны Actuator, Micrometer с prometheus-registry и доступные сборщику endpoints health и prometheus. Отдельный сервер Prometheus для этого варианта не требуется.
В конфигурации задаются адрес приложения, интервал опроса и тайм-аут. Панель по умолчанию привязана к localhost; доступ к Actuator тоже стоит ограничить сетью и аутентификацией.
Решение рассчитано на небольшой набор приложений. Для распределённых трассировок, централизованных журналов, сложных запросов к метрикам и маршрутизации оповещений понадобится более широкая система. В статье есть готовый демонстрационный Spring Boot-сервис с генератором трафика.
#spring #мониторинг
Для нескольких сервисов бывает достаточно видеть задержки, ошибки, память и перезапуски. В руководстве по StatLite показана панель, которая собирает эти данные из Spring Boot Actuator.
StatLite запускается одним Go-бинарником и хранит историю в SQLite. На стороне приложения нужны Actuator, Micrometer с prometheus-registry и доступные сборщику endpoints health и prometheus. Отдельный сервер Prometheus для этого варианта не требуется.
В конфигурации задаются адрес приложения, интервал опроса и тайм-аут. Панель по умолчанию привязана к localhost; доступ к Actuator тоже стоит ограничить сетью и аутентификацией.
Решение рассчитано на небольшой набор приложений. Для распределённых трассировок, централизованных журналов, сложных запросов к метрикам и маршрутизации оповещений понадобится более широкая система. В статье есть готовый демонстрационный Spring Boot-сервис с генератором трафика.
#spring #мониторинг
❤1
Hibernate 8: проверки версий при конкурентных обновлениях
Оптимистическая блокировка должна обнаружить, что между чтением и записью сущность уже изменил другой запрос. Детали реализации и поведение базы здесь имеют значение.
В разборе изменений Hibernate 8 Beta2 команда описывает усиленные проверки версий: они учитывают ситуации, в которых конкурентное изменение раньше могло остаться незамеченным. Поддержку блокировки по версии получили StatelessSession и EntityAgent из Jakarta Persistence.
Ещё одно изменение касается параллельных upsert в StatelessSession: обработка учитывает гонку вставки. Для разделения данных по арендаторам их идентификаторы последовательно включаются в SQL изменения данных.
Это повод добавить к проверке миграции сценарии с одновременными обновлениями и вставками. Ветка Hibernate 8 пока тестовая; после описанной Beta2 уже вышла Beta3. Возможности из заметки полезно оценивать вместе с актуальным руководством по миграции.
#java #hibernate
Оптимистическая блокировка должна обнаружить, что между чтением и записью сущность уже изменил другой запрос. Детали реализации и поведение базы здесь имеют значение.
В разборе изменений Hibernate 8 Beta2 команда описывает усиленные проверки версий: они учитывают ситуации, в которых конкурентное изменение раньше могло остаться незамеченным. Поддержку блокировки по версии получили StatelessSession и EntityAgent из Jakarta Persistence.
Ещё одно изменение касается параллельных upsert в StatelessSession: обработка учитывает гонку вставки. Для разделения данных по арендаторам их идентификаторы последовательно включаются в SQL изменения данных.
Это повод добавить к проверке миграции сценарии с одновременными обновлениями и вставками. Ветка Hibernate 8 пока тестовая; после описанной Beta2 уже вышла Beta3. Возможности из заметки полезно оценивать вместе с актуальным руководством по миграции.
#java #hibernate
Как HotSpot ускоряет криптографию внутри JDK
Реализация алгоритма написана на Java, но некоторые часто выполняемые операции JVM может заменить машинным кодом под конкретный процессор. Такой механизм называется intrinsic.
В статье команды Java он разобран на постквантовых ML-KEM, ML-DSA и HSS/LMS. У первых двух много повторяющихся операций с коэффициентами полиномов — подходящая работа для векторных инструкций. Проверка подписей HSS/LMS выигрывает от ускорения SHA-256.
Аннотация
В статье приведены замеры JDK 28 на Linux/AArch64. Они сравнивают отдельные алгоритмы с включёнными intrinsics и без них. При оценке результата важны набор параметров алгоритма и возможности CPU: ускорение криптографической операции само по себе не определяет скорость всего сервиса.
#java #jvm
Реализация алгоритма написана на Java, но некоторые часто выполняемые операции JVM может заменить машинным кодом под конкретный процессор. Такой механизм называется intrinsic.
В статье команды Java он разобран на постквантовых ML-KEM, ML-DSA и HSS/LMS. У первых двух много повторяющихся операций с коэффициентами полиномов — подходящая работа для векторных инструкций. Проверка подписей HSS/LMS выигрывает от ускорения SHA-256.
Аннотация
@IntrinsicCandidate отмечает методы, для которых HotSpot может применить такую замену. Java-реализация остаётся запасным вариантом, если подходящего ускорения на платформе нет.В статье приведены замеры JDK 28 на Linux/AArch64. Они сравнивают отдельные алгоритмы с включёнными intrinsics и без них. При оценке результата важны набор параметров алгоритма и возможности CPU: ускорение криптографической операции само по себе не определяет скорость всего сервиса.
#java #jvm
❤1
Quarkus 4: что проверить перед миграцией
Первая бета Quarkus 4 меняет базовые зависимости сразу в нескольких частях приложения. Минимальная версия Java теперь 21, сетевой стек переходит на Netty 4.2 и Vert.x 5.
В обзоре команды также перечислены Hibernate ORM 8, Jackson 3, CDI 5.0 и Jakarta REST 4. Поэтому обновление стоит начинать с проверки расширений, сериализации и работы с базой. Для перехода подготовлено отдельное руководство.
Из новых возможностей — HTTP/3, который включается явно, и Observation API: аннотация
Релиз пока тестовый. Команда просит разработчиков расширений проверять совместимость, а пользователей — прогонять приложения и сообщать о проблемах. Хорошая задача для отдельной ветки: пройти миграцию и посмотреть на поведение интеграционных тестов.
#java #quarkus
Первая бета Quarkus 4 меняет базовые зависимости сразу в нескольких частях приложения. Минимальная версия Java теперь 21, сетевой стек переходит на Netty 4.2 и Vert.x 5.
В обзоре команды также перечислены Hibernate ORM 8, Jackson 3, CDI 5.0 и Jakarta REST 4. Поэтому обновление стоит начинать с проверки расширений, сериализации и работы с базой. Для перехода подготовлено отдельное руководство.
Из новых возможностей — HTTP/3, который включается явно, и Observation API: аннотация
@Observed или программный интерфейс создают метрики и трассировки через Micrometer и OpenTelemetry. В Dev UI появилась встроенная панель наблюдения.Релиз пока тестовый. Команда просит разработчиков расширений проверять совместимость, а пользователей — прогонять приложения и сообщать о проблемах. Хорошая задача для отдельной ветки: пройти миграцию и посмотреть на поведение интеграционных тестов.
#java #quarkus
❤1
Spring AI: похожий документ ещё не содержит ответа
Векторный поиск нашёл текст по теме, но в ответ модели снова попала справочная информация вместо нужного факта. Для такого случая в примере Spring AI Modular RAG поиск разделён на несколько этапов.
Сначала модель переписывает вопрос для поиска и создаёт несколько его вариантов. Найденные фрагменты объединяются, после чего JevDocumentFilter отсеивает неподходящие, а JevDocumentReranker меняет порядок и оставляет лучшие.
Компоненты реализуют интерфейс DocumentPostProcessor и подключаются к RetrievalAugmentationAdvisor. Их можно менять отдельно от хранилища и модели, которая формирует ответ.
Есть полезная деталь: фильтрация и формирование контекста используют исходный вопрос пользователя. Переписанный запрос нужен только для поиска. В статье рядом лежат простая и модульная версии примера — удобно сравнить, какие фрагменты дошли до модели и почему часть была исключена.
#spring #java #rag
Векторный поиск нашёл текст по теме, но в ответ модели снова попала справочная информация вместо нужного факта. Для такого случая в примере Spring AI Modular RAG поиск разделён на несколько этапов.
Сначала модель переписывает вопрос для поиска и создаёт несколько его вариантов. Найденные фрагменты объединяются, после чего JevDocumentFilter отсеивает неподходящие, а JevDocumentReranker меняет порядок и оставляет лучшие.
Компоненты реализуют интерфейс DocumentPostProcessor и подключаются к RetrievalAugmentationAdvisor. Их можно менять отдельно от хранилища и модели, которая формирует ответ.
Есть полезная деталь: фильтрация и формирование контекста используют исходный вопрос пользователя. Переписанный запрос нужен только для поиска. В статье рядом лежат простая и модульная версии примера — удобно сравнить, какие фрагменты дошли до модели и почему часть была исключена.
#spring #java #rag
❤1👍1
Java-сервер с генерацией зависимостей при сборке
Маршруты HTTP и создание компонентов можно подготовить до запуска приложения. В разборе Codename One Backend показано, как аннотации превращаются в обычные Java-классы для маршрутизации и внедрения зависимостей.
Сгенерированный код создаёт объекты прямыми вызовами конструкторов. Отсутствующие зависимости, неоднозначный выбор компонента и циклы конструкторов приводят к ошибке сборки. Затем ParparVM переводит байткод в C для нативной компиляции.
Названия аннотаций напоминают Spring, но находятся в собственном пакете com.codename1.backend.annotations. Это отдельный развивающийся проект со своим набором возможностей.
В статье есть сравнение старта и памяти с Spring Boot, однако замеры сделаны на двух простых HTTP-обработчиках без базы, TLS и авторизации. Интереснее начать с устройства сгенерированного кода, а показатели своего сервиса проверить с его реальными зависимостями.
#java #производительность
Маршруты HTTP и создание компонентов можно подготовить до запуска приложения. В разборе Codename One Backend показано, как аннотации превращаются в обычные Java-классы для маршрутизации и внедрения зависимостей.
Сгенерированный код создаёт объекты прямыми вызовами конструкторов. Отсутствующие зависимости, неоднозначный выбор компонента и циклы конструкторов приводят к ошибке сборки. Затем ParparVM переводит байткод в C для нативной компиляции.
Названия аннотаций напоминают Spring, но находятся в собственном пакете com.codename1.backend.annotations. Это отдельный развивающийся проект со своим набором возможностей.
В статье есть сравнение старта и памяти с Spring Boot, однако замеры сделаны на двух простых HTTP-обработчиках без базы, TLS и авторизации. Интереснее начать с устройства сгенерированного кода, а показатели своего сервиса проверить с его реальными зависимостями.
#java #производительность