javaproglib | Unsorted

Telegram-канал javaproglib - Библиотека джависта | Java, Spring, Maven, Hibernate

25698

Все самое полезное для Java-разработчика в одном канале. Список наших каналов: https://t.me/proglibrary/9197 Обратная связь: @proglibrary_feedback_bot По рекламе: @proglib_adv Прайс: @proglib_advertising

Subscribe to a channel

Библиотека джависта | Java, Spring, Maven, Hibernate

Когда и как использовать var?

var добавили ещё в Java 10, чтобы облегчить жизнь. Но когда его лучше использовать, а когда стоит быть осторожнее?

Когда использовать:

🔵 Когда всё понятно с контекста: если тип переменной очевиден, то можно не писать лишнее

var list = new ArrayList<String>(); // Это список, и это сразу видно


🔵 Когда тип слишком громоздкий: если объявление слишком длинное и перегружает код, var упрощает задачу:

var map = new HashMap<String, List<Integer>>(); // Чисто и просто


🔵 Короткие методы: в небольших методах с чёткой логикой, var помогает сделать код компактнее и читабельнее.

А вот где лучше избегать:

🔵 Если тип неочевиден: когда сложно сразу понять, что это за переменная, лучше явно указать тип, чтобы не путать коллег.
var result = process(); // И что за процесс тут? 


Итог: var — непдохой инструмент, но используйте его с умом.

💬 Используете var в своих проектах?

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

☕️ Как работает @Slf4j

Если пишешь @Slf4j над классом, вызываешь log.info(...) и не задумываешься, а как это работает, то пост для тебя. Разберём, что стоит за аннотацией, и как не напороться на неочевидные грабли.

🔹 Что делает аннотация

@Slf4j аннотация Lombok'а. При компиляции он через annotation processor генерирует в классе поле:

private static final org.slf4j.Logger log =
org.slf4j.LoggerFactory.getLogger(YourClass.class);


Всё, никакой магии в рантайме. Просто кодогенерация на этапе javac. Если открыть .class — поле будет там как родное.

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

🔹 SLF4J — это фасад, а не реализация

Ключевая идея, которую стоит держать в голове: SLF4J сам ничего не логирует. Это API-контракт. Реальная работа на binding'е:

→ Logback — нативный бэкенд, писался теми же людьми
Log4j2 — через log4j-slf4j2-impl
java.util.logging — через slf4j-jdk14

Binding определяется в classpath в compile/runtime. SLF4J при старте ищет класс org.slf4j.spi.SLF4JServiceProvider (начиная с 2.x) или StaticLoggerBinder (в 1.x). Нашёл — работает. Не нашёл — NOP logger, и ты молча теряешь все логи. В 2.x хотя бы warning кинет.

🔹 Два binding'а в classpath

Классическая проблема транзитивных зависимостей. Если в classpath окажутся и logback-classic, и log4j-slf4j2-impl — SLF4J выберет один (фактически — какой первый найдёт classloader). Поведение недетерминировано. Лечится в Maven через <exclusions> или в Gradle через exclude group.

🔹 Что под капотом вызова

log.info("User {} logged in from {}", username, ip);

Здесь нет конкатенации строк. SLF4J использует параметризованные сообщения — плейсхолдеры {} заменяются лениво, только если уровень логирования активен. Это важно: вызов log.debug(...) при выключенном DEBUG не тратит ресурсы на toString() аргументов.

Но есть подвох. Если ты передаёшь выражение, которое само по себе дорого вычислять:
log.debug("Heavy result: {}", calculateSomethingExpensive());

Метод всё равно вызовется — аргументы вычисляются до передачи в метод (JLS, eager evaluation). Вариант обхода:
if (log.isDebugEnabled()) {
log.debug("Heavy result: {}", calculateSomethingExpensive());
}

Или, если на Log4j2 API напрямую — там есть Supplier-based ленивые аргументы. В SLF4J 2.x появился fluent API:
log.atDebug()
.setMessage("Heavy result: {}")
.addArgument(() -> calculateSomethingExpensive())
.log();


🔹 Логирование исключений

Правильный способ — throwable последним аргументом без плейсхолдера:
log.error("Payment failed for order {}", orderId, exception);

Два {} — нет. Два аргумента — да. SLF4J сам определит, что последний аргумент — Throwable, и выведет стектрейс. Если засунуть exception в {}, получишь только toString() без стектрейса. Это одна из самых частых ошибок.

🔹 Мелочи, на которые стоит обратить внимание

▪️ @Slf4j vs @Log4j2
Lombok умеет генерировать логгеры для разных фасадов/реализаций. @Slf4j — для SLF4J API, @Log4j2 — напрямую для Log4j2 API (со всеми его фичами типа Supplier-аргументов и Markers). Выбирай осознанно.

▪️ Имя логгера

По умолчанию это FQCN класса. Можно переопределить: @Slf4j(topic = "audit"). Удобно для выделения audit/security логов в отдельный appender.

▪️ Serializable классы


Logger не сериализуем. Если класс implements Serializable, после десериализации log будет null. Lombok добавляет transient, но при ручном объявлении — легко забыть.

▪️ Тесты

Если в тестовом classpath нет binding'а, логи молча пропадут. Кинь slf4j-simple в testImplementation / test scope, чтобы видеть что происходит.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

😎 Знакомьтесь с экспертом Proglib.academy: AI-архитектор Андрей Носов

Андрей — один из ключевых спикеров нашего курса AgentOps. Он выстраивает архитектуру, которая выживает в суровом проде и активно делится своим опытом.

За что его ценит IT-комьюнити:

🟣 Топ-спикер AI Conf 2026

Его доклад про мифы семантического поиска и провалы Naive RAG стал одним из самых рейтинговых на конференции.


🟣 Эксперт по GraphRAG и Knowledge Graphs
Андрей внедряет инженерный подход в сложные системы, заменяя «слепую веру» в эмбеддинги строгой логикой графов.


🟣 Автор «14 кругов ада для RAG»
Разработал уникальный набор из 14 unit-тестов, на которых ломается стандартный векторный поиск (от слепоты к отрицаниям до конфликта версий).


🟣 Спикер Saint HighLoad
Регулярно выступает на крупнейших хайлоад-площадках, разбирая архитектуру отказоустойчивых ИИ-сервисов.


Андрей упаковал свои наработки в Google Colab, где можно пощупать 14 сценариев ошибок RAG и их решения:

🔗 Забрать Colab-ноутбук

На курсе Андрей отвечает за самые «мясные» блоки: RAG, оркестрацию агентов и их промышленную эксплуатацию.

Узнать больше о программе и обучении у Андрея:
👉 Курс о том, как внедрять AI-логику в бэкенд и сохранять стабильность сервиса

Так, продолжаем знакомить вас с командой?
👍 — Да, ждем новых лиц
🔥 — Пойду тестить Colab Носова

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔧 javalin — 8.2k ⭐️

Поднимал REST API на Spring Boot ради трёх эндпоинтов? Подключал стартеры, автоконфигурацию, ждал 8 секунд на старте — и всё ради GET /health?

Javalin не тяжелее самого сервиса.

Лёгкий веб-фреймворк поверх Jetty. Никаких аннотаций, никакой магии, никакого classpath-сканирования. Просто код:

var app = Javalin.create(config -> {
config.useVirtualThreads = true;
config.routes.apiBuilder(() -> {
path("/users", () -> {
get(UserController::getAll);
post(UserController::create);
path("/{id}", () -> {
get(UserController::getOne);
delete(UserController::delete);
});
});
});
}).start(7070);


Javalin 7 требует Java 17+, из коробки virtual threads, WebSocket, HTTP/2, SSE и OpenAPI-генерация через annotation processor. Стартует за миллисекунды. Идеален для микросервисов, внутренних тулов и случаев, когда Spring — это из пушки по воробьям.

📱 Репозиторий

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

ThreadLocal + Virtual Threads = утечка памяти

Если вы перешли на virtual threads, но продолжаете использовать ThreadLocal, то у вас проблема, которая пока просто не выстрелила.

ThreadLocal хранит данные в ThreadLocalMap — по одной map на каждый тред. Когда тредов было 200 в пуле, это было терпимо. Когда виртуальных тредов сотни тысяч, каждый несёт свою map, и heap начинает гореть. Плюс мутабельность: ThreadLocal.set() в глубоком call stack — это неявное состояние, которое легко забыть почистить через .remove(). В try-finally это работает до первого необработанного исключения.

Java 21 предлагает замену — ScopedValue.

🔹 Ключевые отличия

ScopedValue.where(TENANT_ID, tenant).run(() -> { ... }) — значение привязано к scope, а не к треду. Вышли из блока и значение автоматически недоступно. Никакого .remove(), никакого «забыл почистить».

Иммутабельность по дизайну. Нельзя сделать .set(). Если нужно другое значение, создаёте вложенный scope. Это убирает целый класс багов с «протеканием» контекста между запросами.

Легковесность. Внутри массив вместо HashMap. При масштабе в 100k+ тредов разница в потреблении памяти ощутимая.

Работает в связке со StructuredTaskScope: дочерние виртуальные треды автоматически наследуют scoped values родителя. Не нужно вручную пробрасывать контекст.

Практический вывод: если вы мигрируете на virtual threads, аудит ThreadLocal — обязательный шаг. ScopedValue пока preview, но API стабилизируется, и направление очевидно. Как минимум стоит уже сейчас заменить ThreadLocal на ReentrantLock-protected shared state или ScopedValue там, где передаёте tenant ID, request context, trace ID и подобные per-request данные.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔥 Знакомьтесь с экспертом Proglib.academy: Эмиль Сатаев

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

🏃‍♀️ Уже 14 мая Эмиль проведет открытый вебинар!

Обсудим самую «больную» тему: «Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало».

🗓 Когда: 14 мая в 19:00 (Мск)

Почему Эмиля стоит послушать:

🟣 8+ лет в разработке (Backend и Frontend)

Прошел путь от фулстека до Backend Platform Developer в SMIT.Studio.


🟣 Международный исследовательский опыт
Работал исследователем в Институте ИИ НИУ ВШЭ и в Национальном университете Сингапура (NUS).


🟣 Преподаватель-практик
Ведет семинары в НИУ ВШЭ, в том числе по проектированию и разработке агентских систем.


🟣 Мастер интеграции AI в Backend
Его главная суперсила — умение правильно встраивать LLM через API, выстраивать workflow и агентную логику в сложных распределенных системах.


🔗 Зарегистрироваться на вебинар

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔴 Завтра тестовое собеседование с Java-разработчиком

13 мая(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
📂 Виктор Анохин, старший разработчик из WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
📂 Виктор будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
📂 В конце можно будет задать любой вопрос Виктору

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔼 Virtual Threads: где спасают, а где нет

С Java 21 virtual threads стали stable (JEP 444). Вместо тяжёлых OS-тредов — легковесные потоки, которыми управляет JVM. Код остаётся синхронным и читаемым, а рантайм под капотом делает M:N scheduling: когда виртуальный тред блокируется на I/O, он паркуется и отпускает carrier thread другому.

На практике это значит одно: Executors.newFixedThreadPool(200) с танцами вокруг размера пула заменяется на Executors.newVirtualThreadPerTaskExecutor(). Блокирующий вызов больше не сжигает OS-тред, пока ждёт ответа от базы.

🔹 Где работает

— веб-сервисы с большим числом конкурентных запросов;
— I/O-heavy бэкенды (база, сеть, файлы);
— замена реактивщины там, где она была вынужденной, а не осознанной.

🔹 Где не работает и не должно


— connection pool базы всё ещё bottleneck.
— CPU-bound задачи не получают выигрыша, т.к. carrier threads и так заняты вычислениями.
— synchronized блоки пинят виртуальный тред к carrier thread (починили в JDK 24). Если у вас hot path с synchronized, переходите на ReentrantLock.
— Внешние API с rate limit'ами никуда не денутся.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#CoreJava

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

Библиотека джависта | Java, Spring, Maven, Hibernate

⚡️ Магия curl

Сервис отвечает 500-кой, а вы не понимаете — проблема в сети, DNS, SSL или бэкенд лёг? Прежде чем лезть в логи и разворачивать Wireshark, попробуйте curl -w и получите полный таймлайн запроса за секунду.

🔹 Зачем это нужно

— Разбивает запрос на фазы: DNS, TCP-коннект, TLS-хендшейк, ожидание первого байта, передача данных.
— Моментально показывает, где именно bottleneck — на уровне сети или приложения.
— Работает везде: на проде, в контейнере, на CI-раннере.

🔹 Как использовать

— Полный таймлайн запроса:

curl -o /dev/null -s -w "\n  DNS: %{time_namelookup}s\n  TCP: %{time_connect}s\n  TLS: %{time_appconnect}s\n  TTFB: %{time_starttransfer}s\n  Total: %{time_total}s\n" https://your-api.com/health


— Если time_namelookup высокий, проблема в DNS, смотрите резолвер.
— Если между time_connect и time_appconnect большой разрыв, тормозит TLS, проверяйте сертификаты.
— Если time_starttransfer зашкаливает при нормальном коннекте, бэкенд думает слишком долго.
— Удобно завернуть в алиас и дёргать по крону для бедняцкого мониторинга latency.

💡 Про-тип: сохраните шаблон в файл и вызывайте через curl -w имя_файла. Не придётся каждый раз гуглить формат переменных.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🗓 14 мая в 19:00 (Мск) встречаемся в онлайне.

Тема: Почему AI-продукты на базе LLM ломаются и как сделать, чтобы работало.

В кружке выше Эмиль Сатаев рассказал, какие именно проблемы с LLM в проде будем разбирать.

Что в программе:

- Разберем реальные кейсы стартапов и ограничения LLM.
- Обсудим рабочие архитектуры: RAG, human-in-the-loop, контроль качества.
- Ответим на ваши вопросы и разберем кейсы участников.


🎁 Бонусы: в конце вебинара подарим промокод на скидку 10.000 ₽ на курсы и разыграем подписки на полезные AI-сервисы.

👉 Зарегистрироваться на вебинар

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🕵️ P6Spy — видишь реальный SQL, который уходит в базу

Включаешь show_sql=true у Hibernate, а в логах всё равно:

where user0_.id=?


Потому что Hibernate логирует до того, как JDBC подставляет значения.

P6Spy садится между твоим кодом и JDBC-драйвером как proxy и пишет запрос уже с реальными значениями — ничего в коде менять не нужно.

→ github.com/p6spy/p6spy ⭐️ 2.2k

🔹 Maven:
<dependency>
<groupId>p6spy</groupId>
<artifactId>p6spy</artifactId>
<version>3.9.1</version>
</dependency>


🔹 application.yml — меняешь только URL и драйвер:
spring:
datasource:
url: jdbc:p6spy:postgresql://localhost/mydb
driver-class-name: com.p6spy.engine.spy.P6SpyDriver


🔹 spy.properties в classpath:
appender=com.p6spy.engine.spy.appender.Slf4JLogger
logMessageFormat=com.p6spy.engine.spy.appender.MultiLineFormat


В логах получишь:
select * from users
where id = 42
and status = 'ACTIVE'
-- took 3 ms


Что ещё умеет:

→ время выполнения каждого запроса: сразу видно N+1 и медленные места
→ свой MessageFormattingStrategy: формат лога под себя
→ фильтрация по пакету или категории запроса

⚠️ Только dev/staging. В prod каждый запрос проходит через proxy.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

📌 Зачем дата-сайентисту матанализ?

Основная компетенция специалиста по Data Science – способность анализировать и интерпретировать данные, а математика является фундаментом для начала работы.

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

Хотите подготовиться к офферу или подтянуть знания? Оставляйте заявку на наш курс по математике для Data Science 💙

P.S. Только до 31 мая на курс (и вообще на все программы Академии) действует СКИДКА 40%

А как у вас дела с высшей математикой?
❤️ — Помню всё
🔥 — Знаю основы
🌚 — Ничего не знаю

🏃‍♀️ Proglib Academy

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔥 База по экономике токенов и кэшированию от AI Platform Lead из Bitrix24

Знакомьтесь, Сергей Нотевский. AI Platform Lead в Bitrix24.

Он один из ключевых экспертов нашего курса AgentOps. На своих лекциях он детально разбирает экономику AI-агентов, кэширование токенов, LLM-инфраструктуру и вывод генеративных систем в стабильный прод.

Мы попросили Сергея поделиться материалами для тех, кто хочет оптимизировать косты на LLM в проде. Сохраняйте методичку по prefix cache метрике, которая напрямую влияет на ваши деньги.

Как говорят создатели Manus:

“KV-cache hit rate is the single most important metric for a production-stage AI agent.”


🛠 Что внутри методички (комбо из 3 статей + код):
Экономика кэширования — особенности провайдеров и как правильно считать затраты.

Частые анти-паттерны — почему ваш кэш постоянно сбрасывается и вы платите больше.

Кэш в AI-агентах — специфика работы с памятью в автономных системах.


🍒 Вишенка на торте: готовый SKILL для агента, который делает ревью вашего проекта, находит анти-паттерны и предотвращает низкое попадание в кэш.

Забрать комбо-материалы на GitHub

P.S. Если хотите послушать Сергея вживую — ловите его на конференциях Kode Waves (май), Conversations AI и Highload Spb (июнь).

🎁 Акция в честь старта продаж!

Прямо сейчас при покупке Инженерного трека вы получаете полный доступ к материалам курса «Разработка ИИ-агентов» в подарок.

👉 Забрать 2 курса по цене 1 и начать обучение

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🤖 AI пишет код. А баги за ним чинишь всё равно ты

Copilot сгенерил код, тесты зелёные, diff чистый. Мержим 👍

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

Знакомо?

Проблема не в том, что модель тупая. Проблема в том, что мы натянули AI-генерацию на старый процесс, где единственная защита — «сеньор посмотрит diff». А сеньор теперь смотрит diff на 3000 строк, где каждая строчка *по отдельности* выглядит разумно.

Один агент не должен одновременно писать код, тесты и ревьюить сам себя.

Лечится это не магическим промптом, а пайплайном: спецификация → TDD → линтеры → SAST/SCA → AI-review → triage → человек.

🔗 Подробный разбор в статье

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔧 Магия kubectl

Под завис в Pending, а вы не знаете почему. Нет ресурсов, не тот nodeSelector или PVC не биндится? kubectl describe pod покажет секцию Events — там Kubernetes прямым текстом пишет причину.

🔹 Зачем это нужно

— Events содержат сообщения от scheduler, kubelet и controller manager.
— Показывает FailedScheduling с причиной: Insufficient cpu, node affinity mismatch, и т.д.
— Видны ошибки pull-а образов, mount томов, readiness/liveness probe failures.

🔹 Как использовать

— Полное описание пода: kubectl describe pod my-pod
— Смотреть только Events (хак): kubectl describe pod my-pod | grep -A 20 "Events:"
— События всего неймспейса: kubectl get events --sort-by='.lastTimestamp'
— Только warning-и: kubectl get events --field-selector type=Warning
— Следить за новыми: kubectl get events -w

💡 Events живут только 1 час по умолчанию. Если под висит в Pending давно и Events пустые, посмотрите kubectl get events -A --sort-by='.lastTimestamp', возможно, событие уже из другого неймспейса.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

✔️ Java-тест: объект в HashSet есть, но contains() возвращает false

Добавили объект в Set. Он там. Но найти его невозможно. Утечка памяти в проде. Почему?

📦 Задание — code review

Команда хранит активные сессии в HashSet. После смены роли пользователя сессия «пропадает» из множества — contains() возвращает false, remove() не удаляет. Set растёт, память течёт.

public class UserSession {
private Long userId;
private String role;

public UserSession(Long userId, String role) {
this.userId = userId;
this.role = role;
}

// getters, setters

@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
UserSession that = (UserSession) o;
return Objects.equals(userId, that.userId)
&& Objects.equals(role, that.role);
}

@Override
public int hashCode() {
return Objects.hash(userId, role);
}
}

@Service
public class SessionManager {

private final Set<UserSession> activeSessions = new HashSet<>();

public void addSession(UserSession session) {
activeSessions.add(session);
}

public void promoteToAdmin(Long userId) {
activeSessions.stream()
.filter(s -> s.getUserId().equals(userId))
.findFirst()
.ifPresent(s -> s.setRole("ADMIN"));
}

public boolean isActive(UserSession session) {
return activeSessions.contains(session);
}

public void removeSession(UserSession session) {
activeSessions.remove(session);
}
}


// Сценарий бага:
sessionManager.addSession(new UserSession(1L, "USER")); // ОК
sessionManager.promoteToAdmin(1L); // меняем роль
sessionManager.isActive(new UserSession(1L, "ADMIN")); // false ?!
// объект внутри Set есть, но достать его нельзя


▪️ Почему после promoteToAdmin() сессия становится невидимой для contains() и remove()?
▪️ Как исправить, не ломая бизнес-логику?

Ставьте → 🔥, если нравится формат. Если нет → 🌚

💬 Решения под спойлер. Сравним, какое будет лучше.

🐸 Библиотека собеса по Java

#practise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🆕 Java Digest: Spring Boot 4, AI-дебаг и AppSec

Топ-3 статьи о Java и смежных технологиях за неделю по версии нашего канала.

1️⃣ Команда Spring о Spring Framework 7 и Spring Boot 4

Интервью InfoQ с core-командой Spring.

Главное: модульная автоконфигурация в Boot 4 (меньше classpath-проверок → быстрее старт, компактнее uber-jar), встроенный retry и @ConcurrencyLimit в ядре Framework 7 без доп. зависимостей, first-class версионирование HTTP API через путь/заголовок/query/media type.

2️⃣ Почему AI-агент чинит симптом, а не баг

Stack trace отвечает «где упало», но не «почему». Авторы показывают на трёх реальных кейсах, как сжатый трейс выполнения (дерево вызовов + аргументы + исключения) меняет ответ агента. Особенно мощный кейс — многопоточный баг, где исключение вообще в другом потоке.

3️⃣ AppSec-слой для Java через Gradle convention plugin

Практический кейс: вместо копирования security YAML между репозиториями — один Gradle-плагин, который стандартизирует SonarQube, OWASP Dependency-Check, CycloneDX SBOM и JaCoCo/Kover. Одна команда ./gradlew securityAnalyze работает и локально, и в CI. Особенно актуально для enterprise с внутренним GitLab, прокси и закрытым контуром, где каждый сервис иначе изобретает security-интеграцию заново.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#News

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

Библиотека джависта | Java, Spring, Maven, Hibernate

Talanto.work - сайт для всех, кто ищет работу в IT.

Мы спарсили за вас все возможные телеграм каналы и сайты с вакансиями исключительно из сферы IT.
Вам не нужно следить за тем, когда выходит вакансия и где, всё это уже сделано за вас.

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

Например: все вакансии Java

На talanto.work собрано 28.000+ вакансий из разных .ru и иностранных сайтов: разработка, QA, аналитика, DevOps, продакт, дизайн, менеджмент и другие IT/Digital-направления.

Более 1700 вакансий за последний месяц из телеграм каналов.

Что еще есть на сайте:

🟠 Фильтры для нормального поиска
Можно искать по стеку, грейду, зарплате, стране, формату работы, релокации и типу занятости.

🟠 Разбор резюме
Загружаете CV и получаете конкретные рекомендации: что улучшить, какие навыки добавить, где слабая структура и что может мешать пройти ATS.

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

🟠Сопроводительное письмо за 10 секунд
Вставляете вакансию и получаете персональное письмо под конкретную компанию и роль, а не шаблон “прошу рассмотреть мою кандидатуру”.

🟠Уведомления в Telegram
Задаёте фильтры один раз и бот присылает новые подходящие вакансии прямо в Telegram.

Поиск работы в IT сейчас и так сложный. Мы хотим, чтобы вы тратили меньше времени на листание сайтов и больше на точные отклики туда, где у вас реально есть шанс.

✈️ 28.000+ вакансий
🟢Бот с уведомлениями о ваших вакансиях: @TalantoWorkBot
🟢Написать сопровод
🟢Разобрать резюме
🟢Проверить соответствие резюме вакансиям

Реклама. Киренкина Марина Дмитриевна, ИНН 345702417736. Erid 2VtzqvCuox3

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🔐 SAP NetWeaver + Keycloak: SAML за два клика, а потом начинается боль

Включить SAML в SAP NetWeaver AS Java дело двух кликов. Отключить возможность обойти Keycloak и зайти напрямую через SAP — уже интереснее. А когда у пользователей два аккаунта с одним email и федерация по Email type, то уже совсем весело.

Ребята из «Инфосистемы Джет» коротко и по делу разобрали:

— как прикрутить Keycloak как IdP к SAP через SAML;
— почему обязательно нужно поднять SAML2LoginModule наверх и сделать его обязательным;
— что делать, когда Keycloak лёг, а configtool.sh ваш единственный друг;
— зачем менять federation type с Email на Logon ID и как это выглядит на стороне Keycloak.

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

🔗 Подробнее

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

😮 Топ-вакансий для джавистов за неделю

Middle Java разработчик — Гибрид (Нижний Новгород) — Nexign

Java-разработчик (YaIoT-платформа) — 330 000 —‍ 550 000 ₽ — удалёнка/гибрид (Москва, Санкт-Петербург)

Разработчик Java — 330 000 —‍ 550 000 ₽ — гибрид (Москва)

➡️ Еще больше топовых вакансий — в нашем канале Java jobs

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🧠 Профдеформация: симптомы, которые точно узнаешь

Жена тыкает «дождь» в Яндекс Погоде, а ты: «Зачем ты повышаешь цены на такси?!».

Знакомо?
Бэкенд-разработчик из ОТП собрал свои симптомы в одну статью. На курсах «войти в айти» о таком не рассказывают.

Пишите, какие симптомы замечали за собой? 👇

📖 Полная статья на Хабре

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

backup PostgreSQL с минимальной нагрузкой на прод

Разберём эффективный способ бэкапа PostgreSQL с помощью pg_basebackup + реплики.

Сценарий: есть продовый PostgreSQL и настроенная горячая реплика (streaming replication). Зачем использовать реплику для бэкапа?

🔵 Причины

— На проде бэкап может замедлить отклик приложения.
— Реплика отличный способ разгрузить основной сервер.
— Бэкап с pg_basebackup возможен только на стопнутой БД или через репликацию.

🔵 Как сделать

pg_basebackup -h replica.host -U repl_user -D /backup/pg -F tar -z -P


🔵 Пояснения

-h — адрес реплики
-U — пользователь с правами репликации
-D — куда класть бэкап
-F tar -z — формат архива и сжатие
-P — прогресс в консоли

А ещё можно добавить в cron и получить стабильный ночной бэкап.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🧹 Git-команда, которая спасёт ваш репозиторий от мусора

Проблема: вы удалили ветки, сделали git reset, отменили мёржи, но репозиторий почему-то весит всё больше. git clone на новом месте занимает вечность. Куда уходит место?

Дело в том, что Git — барахольщик. Он хранит все объекты: старые блобы, недостижимые коммиты, забытые stash'ы. Даже то, что вам давно не нужно.

💡 Решение: git gc и его старший брат git gc --aggressive

Рассмотрим все все возможности git gc.

1️⃣ Сколько мусора накопилось

git count-objects -vH

Обратите внимание на size-pack — это реальный вес вашего репо.

2️⃣ Самые тяжёлые объекты в истории

git rev-list --objects --all \
| git cat-file --batch-check='%(objecttype) %(objectname) %(objectsize) %(rest)' \
| awk '/^blob/ {print $3, $4}' \
| sort -rn \
| head -10

Часто находятся артефакты сборки, дампы БД или случайно закоммиченные .jar на 200 МБ 😬

3️⃣ Запустите агрессивную сборку мусора

git gc --aggressive --prune=now

--aggressive заставляет Git перепаковать объекты с нуля, а --prune=now удаляет недостижимые объекты немедленно, не дожидаясь дефолтных двух недель.

4️⃣ Сравните результат
git count-objects -vH

На живых проектах с историей в 2+ года разница бывает в разы.

⚠️ --prune=now безвозвратно удалит объекты, на которые нет ссылок. Если вы планировали восстановить что-то через git reflog — сделайте это до запуска.

💡 Бонус для CI/CD: если ваш пайплайн клонирует репо каждый раз — добавьте git gc в ночной cron. Экономия трафика и времени сборки может приятно удивить.

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🐸 Библиотека джависта

#DevLife

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

Библиотека джависта | Java, Spring, Maven, Hibernate

🤔 Ты уверен, что твой HikariCP настроен правильно?

Если все настройки — это maximumPoolSize = 32 и в прод, не проходи мимо.

А то потом реплики × 12, PostgreSQL орёт too many connections, p95 ползёт вверх, и база упадёт именно тогда, когда нельзя.

Свежая статья на Хабре про то, как считать размер пула по-настоящему: формула из PostgreSQL wiki, Little's Law, Kubernetes, PgBouncer и 10+ типовых ошибок, которые тихо живут в продовых конфигах.

Плюс чеклист перед релизом и пример конфига, в котором видно зачем выбрано каждое значение.

🔗 Читать на Хабре

══════ Навигация ══════
ВакансииЗадачиСобесы

🐸 Библиотека джависта

#Enterprise

Читать полностью…
Subscribe to a channel