Обновить
128K+

Java *

Объектно-ориентированный язык программирования

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

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

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

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

Читать далее

Новости

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

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

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

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

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

Читать далее

Оперативка есть? А если найду?

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

Снова статья о том, как надо/не надо делать.

Long story short.

У меня все еще работает CHUWI CoreBox, который уже появлялся в предыдущих статьях: Core i7-13620H, 16 ГБ LPDDR5 (а жаль!), SSD на 512 ГБ. Он успел побыть прокси, NAS, VPN, сервером Lineage 2 и складом 3D-моделей для печати. Склад потом переехал на отдельный накопитель, а сбор моделей я остановил. Даже качественные модели скачивались гораздо быстрее, чем я успевал их печатать. На освободившемся мини-ПК шла разработка своего продукта, ибо я привык к linux, и там же крутились тесты. С обычными проверками еще можно было жить, но мутационное тестирование занимало часы. Хотелось продолжать работу, пока оно выполняется, а свободных ресурсов на той же машине было немного.

Зато рядом стоял мой любимый игровой компьютер: Ryzen 9 9950X3D и золотые 64 ГБ Kingston FURY Beast DDR5-6000 CL30. Память до 64 ГБ я докупал в 2026 году. Кто в этом году собирал комплуктер, тот понимает, почему я сейчас это упоминаю и ставлю на этом акцент.
К этому моменту я уже смотрел по квартире, у чего еще есть оперативка. Поглядывал дергающимся глазом на робот-пылесос и духовку. Если они подключаются к Wi-Fi, значит, они чем-то думают и чем-то помнят.

Но начал все-таки с ПК. Windows оставил на месте, потому что игры нужно на чем-то играть, поставил WSL с Ubuntu и отдельным Docker. Разработку оставил на мини-ПК, а тяжелые проверки решил вынести на игровую машину. Первый измеренный запуск PIT на ней занял больше девяти часов и закончился с ошибкой памяти. Это же разочарование я ловил много раз на мини-пк, разбирал по этому разочарованию логи, в течение десятков часов, в надежде исключить дефицит памяти. Смотрим.

Читать далее

Transactional Outbox template простыми словами

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

Друзья, многие любят микросервисы, особенно когда их много.

И мало кто хочет признаться, что в 2026 году он сидит на монолите с Java 8 в бэке. Но есть в этих ваших микросервисах (как и в любой распределённой системе) одна неприятная штука — согласованность данных. Вернее, их несогласованность.

Нет-нет да и разъедутся наборы каких-нибудь транзакций в двух смежных системах.
Знакомо? Наверняка. Вот об этом сегодня и поговорим.

Точнее, поговорим об одном из популярнейших решений проблем распределённых транзакций —шаблоне Transactional Outbox. Пройдём путь от поделки на коленке до prod-like версии. Попробуем сделать это без тонн кода, сиквенсов и прочей «духоты», ограничившись лишь простыми наглядными примерами.

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

Читать далее

Liferay в gov секторе — как тяга к халяве, ой, то есть к OpenSource доводит до CWE-319

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

Товарищи, 6 часов назад я просто хотел зарегистрироваться на одном государственном сервисе и спокойно лечь спать, но сейчас, в три, мать его, часа ночи я сижу и пишу этот текст потратив свой вечер на responsible disclosure и попытки выяснить, кто же в этой богадельне отвечает за протоколы безопасности, что бы моё письмо не ушло в почту тому же "специалисту" который накатил коробочный Liferay с дефолтными конфигами и сейчас спокойно сопит в своей постельке.

Выговорился. А теперь - к делу.

Как сделать RAG по профессиональной документации

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

Привет, Хабр! Хотелось бы начать статью с такого вопроса: кто из нас еще не использовал чат ассистентов в своей работе и повседневной жизни? Вот и мы, команда Джеймикс, постоянно используем ИИ-агентов и ассистентов в своей рутине. Кто с нами не знаком — мы (Джеймикс, Jmix) open-source  платформа с ИИ-инструментами для стандартизации разработки корпоративных приложений на Java. И так уж вышло, что у нас есть потребность в постоянной поддержке нашего сообщества в эксплуатации и разработке на нашей же технологии. На это мы постоянно выделяли одного разработчика-дежурного, который отвечал на все вопросы наших клиентов. Понимаете куда ведет это повествование? Конечно же, как только появились языковые модели, которые научились сносно отвечать на технические темы — сразу же возникла идея о делегировании самых базовых и простых вопросов ИИ. Ну и, конечно же, мы на поезде хайпа еще в конце 2023-го года создали собственного ИИ-ассистента на базе ChatGPT 4, который отвечал на темы, связанные только с платформой Джеймикса.

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

И вот прошло 3 года, и мы решили задать вопрос с подвохом (ну бывает же такое, когда хочется спросить что-то каверзное у ИИ). Звучал вопрос так: “какое значение repeatCount заставит таймер сработать пять раз”. Ассистент уверенно выдал готовый XML, хотя такого атрибута в Jmix нет. Чтобы ИИ-ассистент отвечал точнее, мы перестроили поиск. 

Читать далее

Как две строки GLSL едва не свели меня с ума

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

Недавно столкнулся с весьма неприятным багом в движке The Great Tribes.

После обновления драйвера AMD игра начала намертво зависать при перемещении камеры, особенно когда на карте открывалась большая территория. Иногда зависал графический драйвер, иногда JVM падала внутри atio6axx.dll.

Самое интересное — на старом драйвере и других видеокартах всё работало нормально!

Начались поиски. Под подозрение попало практически всё: многопоточность OpenGL, VAO, VBO, индексные буферы, тени, модели юнитов и даже glfwSwapBuffers().

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

В нём обнаружилась вот такая конструкция:

Читать далее

SIGILL при старте: как AOT-кэш JDK уронил Axelix в Docker

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

Почему AOT-кэш JDK 25, собранный на одном процессоре, падает с SIGILL на другом (AOTAdapterCaching, JDK-8388703), как это исправляют JDK 25.0.5 и JDK 27 и как собрать переносимый multi-arch Docker-образ с AOT-кэшем.

Читать далее

Потерянные ключи шифрования, или изучение атомарности в Cassandra

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

Привет, Хабр! На связи системный аналитик Илья Глазунов и разработчик Кирилл Дунаев. Мы работаем с платформой аналитического карточного хранилища Т-Банка. Попутно открываем все новые грани одного из главных компонентов нашего детища — Apache Cassandra. 

Мы уже изучили тонну материалов, сами стали носителями знаний, делимся ими в команде и на Хабре. Но не перестаем натыкаться на интересные механики и особенности Cassandra, которые приходится разбирать по принципу «с миру по нитке». 

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

В статье разберем, почему утверждение «Cassandra — колоночная БД» частично верное. Приоткроем занавес, как база данных работает с мета-данными и объединением неизменяемых файлов при высокой пишущей нагрузке. А еще подискутируем на тему понятия атомарности операций во вселенной Apache Cassandra и разберемся, причем же тут UDT и frozen UDT. 

Читать далее

Выпущена версия Jmix 3.1

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

Выпущен Jmix 3.1. В нём представлены два новых дополнения и несколько UI-компонентов, которые раньше приходилось создавать вручную. Кроме того, дополнение Dynamic Model выходит из экспериментального статуса, а новый инструмент командной строки позволяет создавать проекты без IDE. Spring Boot обновлён до версии 4.1, а Vaadin — до 25.3.

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

Читать далее

Разбираем три самые интересные уязвимости Spring за июнь

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

В июне 2026 года был опубликован список из 71 уязвимости в экосистеме Spring. Из них 31 получила уровень опасности High, 36 — Medium и четыре — Low. Для сравнения: за весь 2025 год было обнаружено 16 уязвимостей.

Из общего списка уязвимостей мы выбрали три, в которых сочетаются относительно понятный путь до уязвимого кода и серьёзные последствия. Нас интересовало, как ошибка проявляется в распространённых сценариях: при обработке JSON Patch, аутентификации через LDAP и передаче сообщений через Kafka.

Разберём чуть подробнее три самые интересные (по нашему мнению) уязвимости.

Читать далее

На каком языке ИИ-агенту искать по своей памяти: SQL или SPARQL?

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

Память агентов в тренде с того момента как они появились, чтобы бороться с галюцинациями и давать ответы и решения LLM на собственной информации. Как лучше запрашивать информацию из таблиц или из графа часто решается на вере, начитавшись постов в интернет без своих экспериментов и измерений. В исследовании Sequeda и соавторов GPT-4 отвечал на вопросы по корпоративной SQL базе верно в 16% случаев, а по графу знаний поверх этой же базы в 54%, где у графа была онтология с описанием, а у SQL схемы только DDL типы и названия таблиц/колонок.

В моем GraphRAG одна и та же информация представлена в двух разных формах. Данные из статьи “Мой PostgreSQL быстрее твоего и почти догнал ClickHouse” извлек в 34 таблицы PostgreSQL, а в граф это превратил с помощью отображения R2RML. Подключил обе формы представления знаний к агенту по MCP и задал ему 15 вопросов о статье: через SQL, через SPARQL и дал еще выбор агенту из двух этих видов сразу. В моем эксперименте агент по очереди запускался на трех LLM с открытыми весами. Их можно развернуть на своей инфраструктуре или ноутбуке и данные и вопросы не уйдут провайдеру в логи или агрегатору между вами и LLM.

Таже я проверил и рассчитал что лучше для векторного хранения и семантического поиска: lance или pgvector. Поделюсь своими измерениями на современных моделях как лучше искать и в чем хранить знания.

Обнаружил в эксперименте как DeepSeek придумал SQL-инъекцию чтобы ответить на мой вопрос.

Читать далее

Скрипты на JVM без лишнего оверхеда: Jumper против LuaJ, Groovy, Jython и других

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

Для JVM нет родного скриптового языка: Lua, JavaScript и Python приходится тащить с других платформ и платить за это оверхедом на каждом вызове. Я написал Jumper — язык с синтаксисом Java, таблицами Lua и типизацией по выбору, который компилируется в байткод и в типизированном режиме работает на 97% от скорости Java. В статье: откуда он взялся, как устроены скрипты, конфиги и песочница, и замеры против 13 движков и 20 библиотек конфигов.

Читать далее

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

Тест падает раз в 30 прогонов, и только в CI. Где искать причину?

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

Интеграционный тест стабильно проходит локально, но в CI падает примерно раз в 30 прогонов. Перезапуск сборки возвращает зелёный статус, а причина сбоя остаётся неизвестной. На примере Java, Spring Boot и JUnit 5 разберём, как случайный порядок запуска тестов и общее состояние базы данных приводят к таким падениям и как найти настоящую причину, прежде чем пытаться её исправить.

Разобрать падение

Иерархия контекстов в Spring. High CVE в Axelix

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

Вступление

Привет, Хабр!

Меня зовут Михаил Поливаха, я Tech Lead проекта Axelix. Если Вы раньше про нас не слышали, то Axelix это платформа для управления и диагностики Spring Boot приложений. Ядро проекта доступно в Open Source, поэтому исходный код, история изменений и, как выяснилось, наши ошибки тоже открыты всем желающим 😁. Новости проекта, релизы и вот такие разборы мы публикуем в нашем Telegram-канале, заглядывайте.

Недавно внешний security researcher Андрей Котов (greatkaa) нашёл в Axelix уязвимость. Если в двух словах: при определённой конфигурации Spring Boot наши Actuator endpoints можно было вызвать без JWT-токена. Мы её уже исправили в версии 1.2.1 и описали в Security Advisory. Андрею, пользуясь случаем, большое спасибо.

Читать далее

Need for Speed Underground 2 на телефоне. Не эмулятор. Сейчас объясню

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

Need for Speed Underground 2 работает на Android без эмулятора: оригинальный exe 2005 года перевели в 8,9 миллиона строк на C и собрали под ARM64. Немного ностальгии, немного техники и пустой файл foobar.

Читать далее

Тестовые данные отдельно, код отдельно: 5 способов изолировать данные в автотестах на Java

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

Статья о том, как развести тестовые данные и код проверок в Java + TestNG. Пять способов — от параметров сборщика до Test Data Factory. С примерами, схемами и разбором ограничений. Для тех, кто только начинает писать автотесты на Java.

Читать далее

Почему BigDecimal считает 1.0 и 1.00 разными числами — и к чему это приводит в Java

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

Цена в базе осталась прежней, но приложение считает, что она изменилась, и повторно отправляет событие. Причина может скрываться в масштабе BigDecimal: equals() сравнивает не только числовое значение, но и количество знаков после запятой, поэтому 1.0 и 1.00 для него не равны. Разберём, как эта особенность влияет на коллекции, денежные расчёты и сравнение данных из разных источников, а также как нормализовать суммы и избежать подобных ошибок.

Разобрать BigDecimal

Можно ли доверить ИИ миграцию Spring Boot 2 → 3?

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

Spring Boot 2 до сих пор крутится в проде у многих команд, хотя бесплатные исправления для него закончились ещё в 2023 году. Переезд откладывают, и чаще всего не из-за ошибок компиляции, а из-за того, что ломается втихую. Сервис стартует, health-check зелёный, а клиенты получают 404 и 401 там, где всё работало.

Можно ли доверить такую миграцию ИИ-агенту? Отдал ему живой сервис на 2 версии бута, запретил трогать контрактные тесты и посмотрел, что будет.

Читать далее

Axelix 1.3 будет поддерживать реактивный стек

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

Всем привет! На связи Михаил Поливаха, технический лидер Open Source проекта Axelix (give us a star!).

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

В ноябре выходит Axelix 1.3. Одно из изменений релиза будет заключаться в том, что Spring Boot стартеры Axelix научаться нативно работать в приложениях на реактивном стеке, то есть на Spring WebFlux с Reactor Netty. Раньше подключить стартер к такому сервису было нельзя. Теперь реактивные приложения можно будет мониторить и отлаживать из Axelix Master так же, как сервлетные.

Читать далее
1
23 ...