Обновить
256K+

Java *

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

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

T2M Bridge, часть 2: как я написал Java‑библиотеку для Telegram Bot API вместе с Codex — уже примерно 50/50

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

Это вторая статья из цикла о разработке T2M Bridge - бота для кросспостинга между Telegram-каналами и MAX-каналами.

Читать далее

Новости

T2M Bridge, часть 1: как я написал Java‑библиотеку для MAX Bot API с помощью Codex

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

Это первая статья из цикла о разработке T2M Bridge — бота для кросспостинга между Telegram‑каналами и MAX‑каналами.

Читать далее

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

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

Всем привет, меня зовут Михаил, я работаю senior Java/Kotlin разработчиком в ОТП Банке. В свободное от работы время я занимаюсь менторством. Ко мне приходят разные люди: кто-то уже работает на проекте, кто-то только учится.

Сейчас, в эпоху ИИ, найти информацию стало куда легче, чем раньше. Раньше ты гуглил и тыкал по ссылкам, а теперь все в одном приложении. Да еще и код можно не писать - ну красота же. Но что, если ты и до этого не умел писать код и решил "вкатываться в айтишку" (ненавижу эту фразу)?

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

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

Сегодня поговорим о том, как ИИ влияет на обучение с нуля и как им лучше пользоваться для обучения.

Читать далее

Миграция на Spring Boot 4 и Java 25: пошаговый план, чтобы обновиться и не уронить прод

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

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

В этой статье разбираем, как перейти со Spring Boot 3.x на 4.0 и с Java 21 на Java 25 не одним рискованным прыжком, а как управляемой инженерной процедурой: с промежуточной остановкой, проверками, канарейкой и понятным планом отката.

Разобрать миграцию

gost-curl — консольный HTTP-клиент с поддержкой ГОСТ TLS 1.3

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

Недавно мне понадобился консольный HTTP-клиент для отладки сайта, который закрыт TLS 1.3 на ГОСТ-алгоритмах. Из доступных средств почти не было вариантов. В итоге я разработал на Java небольшую консольную утилиту gost-curl, которая может быть полезна разработчикам, devops-инженерам, администраторам и QA.

gost-curl самодостаточен, не требует установки openssl или каких-то крипто-провайдеров. Бинарные файлы есть для разных ОС. Скачал, запустил, профит.

Читать далее

AI‑агент для склада в Джеймикс. Часть 2: write‑tools, безопасность, метаданные

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

write‑tools, безопасность, метаданные

Это вторая часть статьи по Sping AI в Джеймикс. Короткая аннотация первой — на случай, если прошло время или вы её не читали: мы собрали read‑only агент внутри Джеймикс‑приложения. Пользователь задаёт вопрос на естественном языке; ChatClient из Spring AI крутит agent loop — дёргает @Tool‑методы, пока не наберёт достаточно данных для ответа. Каждый tool данные читает через DataManager с явным fetch plan‑ом, поэтому почти полностью остаётся внутри рамок системы безопасности Джеймикс и возвращает только нужные модели поля. UI — обычный Джеймикс‑вью, без REST‑прослойки. Также, в первой части мы убедились, что выбор модели — не деталь: модель без надёжного native tool calling ломает всю схему. Если первую часть не читали — начните с неё, код ниже строится как продолжение.

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

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

Полный исходник всего, что мы здесь обсуждаем, лежит здесь: https://github.com/jmix‑edu/ai‑warehouse — можно клонировать и сразу запустить.

Что добавляем

Читать далее

Skill of the Week: Spring Data JPA. Никто не знает JPA, даже AI

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

Знание и умение разрабатывать на Spring Data JPA — это обязательный навык для разработчика, если он хочет заниматься разработкой приложений на Spring. Этого мы ожидаем и от AI-агента.

Удовлетворяют ли наши AI-агента этому условию? Во многом зависит от того, насколько продвинутую модель вы используете. Значит ли это, что Opus 4.8 не совершает ошибок? Совсем нет. Более того, иногда удивляешься, почему еще вчера он настроил связь правильно, а уже сегодня сделал ту же работу, но добавил CascadeType.ALL.

В сегодняшнем эпизоде еженедельной рубрики Skill of the Week разберёмся, как, используя Spring Data JPA Skill, научить своего агента важным навыкам при работе со Spring Data JPA.

Читать далее

Интеграционные тесты в Java: ускоряем Testcontainers через tmpfs и прединициализацию

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

Testcontainers - Java-библиотека, которая управляет Docker-контейнерами прямо из тестового кода. Во время выполнения тестов она запускает нужный контейнер - базу данных, брокер сообщений, поисковый движок и т.д. - а по завершении останавливает и удаляет контейнер.

Зачем это нужно? Для интеграционных тестов на реальном ПО, а не на in-memory эмуляторах. Тест работает с тем же движком, что и в продакшене.

В этой статье я разберу, как можно оптимизировать работу с Testcontainers:

tmpfs - перенос файлов в оперативную память.

Прединициализация - перенос тяжёлой инициализацию в отдельный Docker-образ.

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

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

Читать далее

Гейткипинг 2.0: почему open source воюет с ИИ — и что делать вместо этого

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

Open source всё чаще закрывает двери перед ИИ: Zig и NetBSD банят AI-generated контрибьюции, curl под потоком нейрослопа сворачивает баг-баунти. DHH, создатель Ruby on Rails, называет это новым луддизмом и гейткипингом. ThePrimeagen возражает: дело не в зависти, а в том, что мейнтейнеров завалили низкокачественными PR.

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

Проверять код, а не автора

Новые возможности Hibernate 7.4

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

Hibernate 7.4 исправляет старую проблему с пагинацией и fetch join.

Раньше запрос на первые 10 Order вместе с OrderItem не мог безопасно ограничиться на уровне SQL. Из-за join один заказ превращался в несколько строк, и limit мог обрезать коллекцию. Поэтому Hibernate загружал все подходящие строки, а страницу выбирал уже в памяти. На больших данных это било по памяти и могло закончиться OutOfMemoryException.

Теперь Hibernate сначала выбирает нужные id родительских сущностей во вложенном запросе, а затем загружает для них полные дочерние коллекции. Пагинация остается в БД, данные не режутся.

Еще в 7.4 появились history и audit tables. @Temporal хранит версии строк и позволяет читать сущность на конкретный момент времени. @Audited пишет изменения ADD/MOD/DEL в audit-таблицу без Envers.

Читать далее

Единый оркестратор инфраструктуры: что происходит под капотом Digital Q.AppServer

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

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

Проблема в том, что этим набором серверов нужно управлять ежедневно. Администратору уже недостаточно просто понимать, что приложение запущено: нужно контролировать состояние серверов, следить за приложениями и метриками, развертывать новые версии и быстро выполнять типовые операции без лишней ручной работы. Когда ИТ-контуров становится больше, разница между «в целом работает» и «удобно эксплуатируется» начинает ощущаться особенно остро.

Digital Q.AppServer как раз закрывает эту задачу: платформа дает единый интерфейс для работы с серверами приложений Digital Q.TomEE и Digital Q.WildFly и собирает в одном месте основные операции сопровождения. В центре внимания здесь – уже не сам по себе выбор между серверами, а то, что ими можно управлять как частью одного эксплуатационного процесса, а не как набором разрозненных систем.

Читать далее

8 вопросов с java-собеса в банке: Junior отвечает за 10 секунд, Senior — за 3 минуты. Кого берут?

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

Один вопрос на собесе — три ответа.

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

Разобрал 8 таких вопросов. По каждому:
🟢 Junior — что это
🟡 Middle — как работает и где ломается
🔴 Senior — что будет в проде и чем платим

И где на самом деле проходит граница мидл/сеньор (спойлер: не там, где думаешь).

Читать полностью

Правильное использование механизма исключений

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

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

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

Пробросить через исключение

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

Слепая дегустация для кода

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

Привет, Хабр. Я Полина, продакт и главный редактор медиа-платформы «Своё Вино» от Россельхозбанка. Помните, не так давно мы говорили с вами о том, что общего у вина и ИТ? На платформе «Своё вино» мы с редакцией обычно говорим о терруарах, стилях и винтажах, но в этот раз попробуем применить ту же оптику к языкам программирования. Попробуем угадать язык по пяти строкам кода и заодно понять, по каким «ароматам» и «танинам» наш мозг так быстро их различает.

Дегустируйте код

Отладка JVM через MXBeans на коленке

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

Бывает надо заглянуть внутрь JVM.
Увидеть CPU, ядра, потоки, а чаще heapMemory - но у тебя ничего для этого нет.
Ни Prometheus, ни других систем мониторинга. Ещё не настроено окружение.

Иногда может помочь и Endpoint с MXBean-ами.

Читать далее

Полная доказательная база аудита мессенджера MAX

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

Реверс-инжиниринг MAX: Архитектура телеметрии и фоновой эксфильтрации в «защищённом» мессенджере

что скрывает «гос-мессенджер» MAX? Мы провели глубокий статический анализ APK и вскрыли промышленный конвейер сбора данных. Внутри: полное отсутствие E2EE, ежедневный аудит разрешений (камера/микрофон/GPS), скрытое сканирование всех установленных приложений и фоновая выгрузка файлов на сторонние серверы с последующей зачисткой следов на устройстве. Разбираем пакеты, классы и методы, которые превращают мессенджер в систему направленного наблюдения.

Читать далее

Переименовал две колонки и поймал два инцидента

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

Про безопасные миграции написано уже тысячу раз. Мы все наизусть знаем и про expand/contract, и про обратную совместимость, и про то, что схему нельзя ломать под трафиком. А потом всё равно наступаем на эти грабли.

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

Дальше расскажу, как так вышло

Читать далее

Spring Boot 4, Flyway и Postgres: как не стрелять по ногам

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

Разберемся, как на самом деле устроена интеграция Flyway в Spring Boot 4: что изменилось с появлением отдельного starter’а, как Boot прокидывает настройки и почему в связке с PostgreSQL одна неочевидная опция может намертво зависнуть миграцию

Читать далее

Ложное чувство защиты: Почему 90% code coverage не спасает от багов

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

90% code coverage выглядит как повод выдохнуть — до первого бага, который спокойно проходит сквозь все тесты и добирается до прода. В статье разберём, почему покрытие строк создаёт ложное чувство надёжности, чем branch coverage полезнее и как мутационное тестирование показывает реальные дыры в тестовом наборе.

Разобраться в coverage

AI-агент для склада в Джеймикс. Часть 1

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

Это первая из двух статей про построение AI-агента внутри Джеймикс-приложения. Джеймикс (или Jmix, ex. CUBA) - высокоуровневый фреймворк для разработки корпоративных приложений на Java, автор не будет слишком сильно в него погружаться, в наше время любой запрос к AI даст Вам всю нужную информацию. В этой части мы соберем минимальный, но рабочий пример: пользователь задает вопрос на естественном языке, агент решает, какие операции вызвать на бэкенде, дергает их и возвращает осмысленный ответ. В качестве предметной области возьмем склад - сценарий, узнаваемый для большинства бизнес-приложений и достаточно широкий, чтобы во второй части обсудить уже не только чтение, но и запись данных, безопасность, fetch plans и метаданные.

Зачем это вообще нужно? Данные корпоративного приложения живут за списками и формами с фильтрами. Это отлично работает, когда пользователь знает, по каким полям фильтровать - и плохо для размытых, многокритериальных вопросов вроде "где у нас заканчивается кофе тёмной обжарки по северным складам?". Когда иначе пришлось бы открыть несколько экранов и руками свести результаты, AI-агент даёт возможность просто спросить - и собирает ответ из бэкенд-операций, которые у вас уже есть.

Почему строить это внутри Джеймикс-приложения, а не отдельным сервисом? В случае Джеймикса агент едет на том же доступе к данным и той же безопасности, что уже есть во фреймворке, его tools идут через DataManager, поэтому он видит ровно то, что разрешено текущему пользователю - никакого параллельного пути к данным, никакого обхода прав. Именно это свойство делает агента приемлемым в enterprise-контексте, и это поведение - сквозная нить обеих частей.

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