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

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

@javaproglib

Все самое полезное для Java-разработчика в одном канале.

Учиться у нас: clc.to/AATM8w

Для обратной связи: @proglibrary_feeedback_bot

По рекламе: @tproger_sales_bot

РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4
Subscribers
22K
Photos
2.5K
Videos
57
Links
3.7K

Showing posts older than #7667 · Back to latest

Older Posts 14 shown
Post #7660 2.33K
📌 Зачем дата-сайентисту матанализ?

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

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

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

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

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

🏃‍♀️ Proglib Academy
  • 🌚 3
  • ❤ 1
  • 🔥 1
Post #7658 2.18K
☕️ Как работает @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
  • 👍 11
  • 🔥 6
  • ❤ 5
  • ⚡ 1
Post #7655 2.29K
🔥 База по экономике токенов и кэшированию от 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 и начать обучение
Post #7653 2.25K
🤖 AI пишет код. А баги за ним чинишь всё равно ты

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

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

Знакомо?

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

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

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

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

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

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

#Enterprise
  • 😢 2
  • ❤ 1
  • 👍 1
  • 🔥 1
  • 🤔 1
Post #7652 2.14K
😎 Знакомьтесь с экспертом 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 Носова
Post #7651 2.21K
🔧 Магия 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
  • 👍 5
  • 🔥 2
  • 🤔 1
Post #7649 1.93K

Forwarded from Библиотека собеса по Java | вопросы с собеседований

✔️ 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
  • 🔥 16
  • 👍 2
  • ❤ 1
  • 👏 1
Post #7648 2.17K
🔧 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
  • 👍 13
  • 🔥 3
  • 🤔 2
  • ❤ 1
Post #7647 2.04K
🆕 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
  • 👍 3
  • ❤ 1
  • 🔥 1
Older posts →
Threads Profile ViewerView any public Threads profile without an account.Open ThreadLook →Writing with AI? Make it sound human.Metric37 rewrites AI drafts so they read naturally. Free AI detector, 1,500 words free.Try Metric37 →