Обновить
512K+

Java *

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

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

Жмых-жмых и в продакшен: как быстро написать админку

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

Всем привет, меня зовут Дмитрий Кремнев и я Java-разработчик в команде Jmix. Недавно на конференции смотрел доклад, в котором спикер рассказывал, как его команда справлялась с проблемой быстрого написания админок для внутренних сервисов. Сначала они реализовали дорогое самописное решение для своей команды, затем появилась идея масштабировать его и для остальных команд. Искали готовые альтернативы на рынке, которые удовлетворят все их бизнес-требования, но в итоге остановились на гибридном кастомном решении, основанном на low-code платформе. Проблемы, которые они решали мне показались очень знакомыми, ведь мы в команде тоже с ними сталкивались. В этой статье я хочу показать, как с помощью Jmix решаются типовые задачи при создании админок. Постараюсь быть конкретным, показать плюсы и ограничения.

Сделать красиво

Задача “Container With Most Water” 150 000$ от Amazon — мое не стандартное решение

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

💧 Условие задачи: «Аквариум» (Container With Most Water)
Представим, что нам дан массив целых чисел — например:
[1, 8, 6, 2, 5, 4, 8, 3, 7]
Каждое число в этом массиве символизирует высоту вертикальной стенки — как будто это столбец, воткнутый вертикально в пол. Все столбцы стоят на одной горизонтальной линии, то есть на «полу» (ось x), и находятся на равном расстоянии друг от друга.
📦 Теперь представим, что между этими столбиками можно налить воду — как будто мы смотрим на 2D-аквариум сбоку.
🧠 Цель задачи
Найти две такие стенки (столбцы), которые, если между ними налить воду (по нижней границе — полу), смогут удержать наибольшее количество воды.
💧 Объём воды между двумя столбцами рассчитывается так:
• Высота воды ограничена меньшей из двух стенок — потому что вода не может быть выше, чем самая низкая из них (иначе вытечет).
• Ширина — это расстояние между этими двумя столбцами (в индексах).
объём = (индекс_правой − индекс_левой) × min(высота_левой, высота_правой)
Массив: [1, 8, 6, 2, 5, 4, 8, 3, 7]
Индексы: 0 1 2 3 4 5 6 7 8
Столбцы (высоты): вертикальные стенки
Пол: горизонтальная база (ось x)
Вода: заливается между двумя стенками и держится на уровне самой низкой из них.
Забегая вперед скажу
2. Классическое решение и его недостатки
Обычно задача решается методом двух указателей с линейной сложностью. Однако этот подход не всегда даёт глубокую интуицию выбора стенок.

3. Предложенный подход
Я ввожу понятие энергоэффективной оценки каждой стенки:
При этом:
• Если стенка ближе к центру, её расстояние меньше — значит штраф за “удалённость” ниже.
• Высокая, но далёкая стенка будет “наказана” в оценке.
• Выбираются две стенки с максимальными result, а затем между ними вычисляется реальный объём воды.

4. Обоснование устойчивости (пример)
При наличии сильно асимметричного массива (например, левые элементы — [1, 2, 1], правые — [9, 8, 9]), алгоритм всё равно выбирает правые высокие значения, потому что они превосходят штраф и сохраняют высокий итоговый результат.
✔ Это делает алгоритм устойчивым к локальным аномалиям и не требует явно жёстких условий или вложенных циклов.

5. Заключение
Предложенный алгоритм демонстрирует новый взгляд на задачу через призму “выгодности” стенки, объединяя геометрическую и энергетическую оценку. Он сохраняет линейную сложность, но обладает дополнительной устойчивостью и хорошей визуальной интерпретацией.
Разница:

Читать далее

Spring Boot 4 и Spring Framework 7: Ключевые фичи и изменения

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

Уже в ноябре 2025 выходит Spring Boot 4 — масштабный релиз, построенный на фундаменте Spring Framework 7.0.0 и Jakarta EE 11. Это не просто очередное обновление, а важный этап в развитии всей Java-платформы: новые возможности для REST и безопасности, улучшенная работа с Kotlin и GraalVM, мощная поддержка облаков и нативных образов, а также инструменты для создания отказоустойчивых приложений.

🧠 Эта статья — больше, чем просто перевод: в ней собрано большое кол-во комментариев от экспертов Spring АйО.

Читать далее

AsyncAPI — Swagger для асинхронного API

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

Привет, Хабр! Меня зовут Александр Митин. Я Java разработчик в компании ИТ-холдинг Т1 с 15 летним опытом, из которых последние 5 лет работаю в финтехе. Мой любимый стек — Java Spring. Я хочу рассказать такое AsyncAPI, как работать со спецификациями, какие есть инструменты и поделюсь нашим опытом перехода на подход API First в наших системах.

Читать далее

Почти ультимативный гайд по Criteria API с продвинутыми возможностями Hibernate

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

Вам нужно создать сложный запрос к реляционной БД с изменяющимися параметрами?

В этой статье рассмотрим основные возможности Criteria API. Также рассмотрим более продвинутые вещи, например создание CTE и оконных функций, которые есть у Hibernate Criteria API. В статье много примеров, которые смогут помочь при написании запросов Criteria API на практике.

Читать далее

Хватит терять время! Ускоряем сборку с помощью Spring Test Profiler

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

Интеграционные тесты на Spring Boot могут тормозить разработку. Причина часто кроется в неэффективной работе с кэшем контекста Spring. 

Spring Test Profiler — это инструмент, который поможет выявить узкие места и оптимизировать конфигурацию тестов. В новом переводе от команды Spring АйО мы рассмотрим, какие тесты вызывают повторную загрузку контекста, где конфигурации расходятся и как можно унифицировать окружение для значительного ускорения тестов.

Читать далее

Stream Gatherers: кастомные промежуточные операции для Stream API

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

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

Когда Java 8 впервые подарила нам Stream API, мы все обрадовались ленивому функциональному стилю работы с коллекциями. Но хочется иногда большего. Вот, например, задача – пропустить из потока только по одному элементу каждого размера строки. Или разбить бесконечный стрим на окна фиксированного размера и обработать первые несколько таких окон. Казалось бы, чем проще: .filter.map.distinct… Но именно этих операций не хватало. До Java 24 набор промежуточных операций в Stream был фиксированным – mapfilterflatMapdistinctsorted и т.д. – и расширить его было нельзя. Приходилось придумывать сложные ухищрения (например, оборачивать объекты в record с особым equals или собирать через collect, а потом резать список), чтобы решить элементарные задачи. В итоге код становился громоздким и неинтуитивным.

Читать далее

ArchUnit против хаоса

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

Привет! Я Масгутов Руслан, архитектор в Т-Банке. Одна из моих задач — вести архитектурный надзор по техническим решениям. Проверка структуры проектов при ревью довольно быстро становится скучной рутиной, и появляется желание автоматизировать эту деятельность, чтобы освободить время для более интересных задач.  

Расскажу, как мы используем ArchUnit для автоматизации архитектурного контроля. Покажу, как мы обернули правила в Gradle-плагин, встроили их в CI/CD, боремся с архитектурными отклонениями до того, как они попадают в pull request, и расскажу о возможности сбора архитектурных метрик.  

Читать далее

Spring Modulith: проверяем границы модулей в монолите и события домена

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

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

Еще в C++20 появилась явная поддержка модулей в языке. Интересно, но в Java тоже давно искали похожее решение для упорядочивания больших монолитных проектов. Spring предлагает свой ответ – проект Spring Modulith, цель которого дать разработчику инструмент для построения модульного монолита. Он не делает всю работу, но помогает структурировать код по модулям, проверять архитектурные правила и организовывать взаимодействие между этими модулями.

Читать далее

Android. Starting Kivy App and Service on bootup. API 35

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

Эта заметка является дополнением к статье Android. Starting Kivy App and Service on bootup, в которой запускал сервисом kivy приложение на API 22 Android 5. Теперь будем запускать на последних версиях Android. C API 26 Android 8 и по текущий API 35 Android 15 который есть у меня, постигли изменения, которые необходимо внести для автостарта сервиса. Проверял работу на API 22...35, телефоны: Highscreen power five, Nokia 8, Xiaomi Redmi Note 14.

Читать далее

Kafka Streams для начинающих. Потоковая обработка данных в мире Java

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

Привет, коллеги-разработчики! За всю историю человечества в разные эпохи  существовали определенные виды ресурсов, которые определяли наше развитие и эволюцию. В 19 веке главным ресурсом для человечества было золото, в 20 веке – нефть и газ, а в 21 веке этим ресурсом стала информация. В нашем быстро меняющемся мире, где данные льются рекой и эти объемы растут с невероятной скоростью, нам как разработчикам приходится постоянно искать новые подходы для эффективной работы. От финансовых транзакций и логов серверов до показаний IoT-сенсоров и кликов пользователей на веб-сайтах — информация поступает непрерывным потоком. Работать с ней в реальном времени становится критически важным для того, чтобы бизнес мог принимать своевременные решения и оставаться конкурентоспособным.

Итак, в этой статье мы разберемся в новомодной технологии для работы с данными – Kafka Streams и узнаем, что это, область применения, а также достоинства и недостатки. 

Читать далее

Работа с Binance REST API с помощью Java

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

В предыдущей статье мы рассмотрели основы парсинга данных в Java.

В этой статье мы пошагово разберём, как с помощью Java 11+ быстро отправлять HTTP GET‑запросы, получать JSON от Binance REST API и извлекать из него символ пары (symbol) и цену (price) — без сторонних зависимостей.

Также в статье мы рассмотрим обход блокировки запросов со стороны сервера.

Читать далее

Bitnami Secure Images: Прощание с Бесплатным Продом

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

Команда Spring АйО перевела статью про то, что не так давно, компания Broadcom, которая на данный момент в силу различных M&A сделок косвенно управляет компанией Bitnami, внесла существуенные изменения в политику поддержки docker образов.

Теперь не бесплатно!

Читать далее

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

Как работать с OpenSearch: обзор полнотекстового поиска и пример использования

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

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

Привет, Хабр! Меня зовут Евгений Ляшенко, я старший разработчик IBS. В эпоху, когда объемы данных растут с каждым днем, эффективный поиск информации становится критически важным для бизнеса и разработчиков. OpenSearch как мощный инструмент для полнотекстового поиска и аналитики предлагает гибкие решения для работы с большими массивами данных. Чтобы наглядно продемонстрировать его работу, я создал pet-проект с поиском по библиотеке книг и фильмов. Но сначала немного теории.

Читать далее

Как RecyclerView создает магию анимаций: архитектура ItemAnimator под капотом

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

RecyclerView умеет превращать обычные операции с данными в плавные анимации. Когда вы добавляете элемент в список, остальные элементы плавно расступаются. При удалении — схлопываются. Эта магия происходит благодаря ItemAnimator — механизму, который я сегодня разберу до последнего винтика.

В этой статье мы погрузимся в архитектуру системы анимаций RecyclerView, проследим путь от вызова notifyItemInserted() до финальной анимации на экране.

Читать далее

Мне не нужен ORM, я могу просто использовать SQL

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

Команда Spring АйО в новом переводе разобрала популярный аргумент «я просто использую SQL» и объяснила, почему Hibernate — это не замена, а дополнение к нативным запросам. А ещё — когда ORM действительно необходим, а когда можно без него обойтись.

Читать далее

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

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

Мы рады объявить о выпуске Jmix 2.6, который включает новую функциональность, улучшения и оптимизацию производительности. Этот релиз приносит значительные обновления в Jmix Studio, представляет новые UI-компоненты и повышает продуктивность благодаря умным инструментам и интеграциям.

Ниже представлен краткий обзор ключевых возможностей Jmix 2.6.

Читать далее

SSO на базе Spring Authorization Server. Можно ли в прод?

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

В современных приложениях централизованная аутентификация и авторизация играют ключевую роль в обеспечении безопасности и удобства пользователей. Именно с такой задачей мы столкнулись в компании NAUKA при создании "Платформы" — экосистемы, предназначенной для функционирования наших решений и разработки собственных прикладных приложений. В качестве основного компонента системы аутентификации и авторизации был выбран Spring Authorization Server.

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

Читать далее

Гайд по использованию Spring GraphQL. Часть 3

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

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

Меня зовут Дмитрий, я бэкенд-разработчик в SENSE и последние 10 лет пишу серверную часть на Java. Эта статья — продолжение серии гайдов по Spring GraphQL, где в первой части мы с нуля подняли проект и подключили GraphQL к Spring Boot, а во второй разобрались с SchemaMapping, DataLoader и реализацией запросов посложнее.

Сегодня двигаемся дальше: разберём валидацию данных, работу с заголовками (headers), обработку ошибок, подключение кастомных скаляров и директив. А ещё посмотрим, как работать с интерфейсами и union-типами, и напишем клиент для GraphQL-сервиса.

Поехали!

Читать далее

Работа над ошибками

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

Достаточно большой период времени занимался технической поддержкой СУБД Oracle. Накопилось некоторое количество историй и заметок на полях по этому поводу, не могу не поделиться ими с вами. В общем — садимся по удобнее, берем попкорн, чашку горячего чая или кофе.. Дело было так.

Читать далее