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

Логотип телеграм канала @javaproglib — Библиотека джависта | Java, Spring, Maven, Hibernate Б
Актуальные темы из канала:
Memes
Tutorial
Event
Почитать
Гайд
Дайджест
Soft
Javadevjob
Proglib
Bust
All tags
Логотип телеграм канала @javaproglib — Библиотека джависта | Java, Spring, Maven, Hibernate
Актуальные темы из канала:
Memes
Tutorial
Event
Почитать
Гайд
Дайджест
Soft
Javadevjob
Proglib
Bust
All tags
Адрес канала: @javaproglib
Категории: Технологии
Язык: Русский
Количество подписчиков: 23.11K
Описание канала:

Все самое полезное для Java-разработчика в одном канале.
Список наших каналов: https://t.me/proglibrary/9197
Для обратной связи: @proglibrary_feeedback_bot
По рекламе: @proglib_adv
РКН: https://gosuslugi.ru/snet/67a5bbda1b17b35b6c1a55c4

Рейтинги и Отзывы

3.33

3 отзыва

Оценить канал javaproglib и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

1

3 звезд

0

2 звезд

0

1 звезд

1


Последние сообщения 2

2025-12-24 22:02:24
Сохраняйте шпаргалку по циклам в Bash

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

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

#Enterprise
2.14K viewsedited  19:02
Открыть/Комментировать
2025-12-24 17:17:20 Топ-вакансий для джавистов за неделю

Fullstack Developer — 250 000 - 350 000₽ — гибрид (Москва)

Java-разработчик — 300 000 —‍ 490 000 ₽ — гибрид (Москва)

Senior Java Developer (Kotlin) — от 400 000 ₽ — удалёнка

Еще больше топовых вакансий — в нашем канале Java jobs
2.24K viewsedited  14:17
Открыть/Комментировать
2025-12-24 11:24:20
Библиотека джависта

#DevLife
2.48K views08:24
Открыть/Комментировать
2025-12-23 21:49:19 Optional.orElseThrow()

Как обычно обрабатываете отсутствие значения? Проверяете на null, кидаете исключение вручную, пишите if-else?

Optional умеет делать это элегантно.

Что делает orElseThrow()

Возвращает значение из Optional, если оно есть. Если пусто — кидает исключение. Можно передать свой Supplier для кастомного исключения.

Пример

Optional userOpt = findUserById(123);

// Вместо:
if (!userOpt.isPresent()) {
throw new UserNotFoundException("User not found");
}
User user = userOpt.get();

// Пишем:
User user = userOpt.orElseThrow(
() -> new UserNotFoundException("User not found")
);

Без параметра кидает NoSuchElementException:
User user = userOpt.orElseThrow(); // Java 10+

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

— Компактный код без if-блоков.
— Явная обработка отсутствия значения.
— Чистый, декларативный стиль без boilerplate.

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

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

#Enterprise
2.48K views18:49
Открыть/Комментировать
2025-12-23 17:27:37
Enterprise AI: строим системы с предсказуемой логикой

Разработка ИИ-агентов окончательно перешла в плоскость классической инженерии. Мы учим проектировать автономные системы, где каждый шаг логически обоснован и контролируется мониторингом.

В программе курса:

детерминированная логика в LangGraph для управления состояниями агента;
архитектура `RAG` на базе Pinecone / Chroma для точной работы с внешними данными;
промышленная интеграция через n8n для встраивания агентов в сложные воркфлоу;
безопасность в рантайме с использованием LangSmith и Guardrails для защиты системы.

Результат — надёжная AI-система, соответствующая вашим инженерным стандартам.

Узнать больше
2.17K views14:27
Открыть/Комментировать
2025-12-23 14:49:57 Внутреннее устройство PriorityQueue

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

Базовая структура

PriorityQueue использует min-heap реализацию:

public class PriorityQueue {
transient Object[] queue; // массив-куча
private int size = 0;
private final Comparator comparator;

private static final int DEFAULT_INITIAL_CAPACITY = 11;
}

Главные особенности:

→ O(log n) для add и poll (вставка/удаление с перестройкой).
→ O(1) для peek (доступ к минимуму).
→ O(n) для remove(Object) и contains.
→ Не гарантирует полную сортировку, только min в голове.
→ Не потокобезопасна (для concurrent используйте PriorityBlockingQueue).

Как устроено хранение

Binary Heap — complete binary tree в массиве

PriorityQueue с элементами: [2, 5, 8, 9, 12, 10, 15]

Куча (min-heap):
2
/ \
5 8
/ \ / \
9 12 10 15

Массив queue[]:
[2, 5, 8, 9, 12, 10, 15]
0 1 2 3 4 5 6

Индексация:
- Родитель узла i: (i - 1) / 2
- Левый ребёнок узла i: 2 * i + 1
- Правый ребёнок узла i: 2 * i + 2

Свойство min-heap:

Каждый родитель ≤ своих детей. Это НЕ полная сортировка — только гарантия минимума в корне.

Операции добавления и удаления

add(E element) / offer(E element) — добавление

1. Элемент добавляется в конец массива: queue[size++] = element.
2. Вызывается siftUp(size-1) для восстановления heap property:
— Элемент "всплывает" вверх, пока не станет больше родителя.
— Сравнения через Comparator или Comparable.

Алгоритм siftUp:

void siftUp(int k) {
E x = queue[k];
while (k > 0) {
int parent = (k - 1) >>> 1; // деление на 2
E e = queue[parent];
if (compare(x, e) >= 0) break;
queue[k] = e; // родитель опускается
k = parent; // поднимаемся выше
}
queue[k] = x; // вставляем элемент
}

Сложность: O(log n) — высота дерева.

poll() — удаление минимального элемента

1. Сохраняется минимум: E result = queue[0].
2. Последний элемент перемещается в корень: queue[0] = queue[--size].
3. Вызывается siftDown(0) для восстановления heap:
— Элемент "тонет" вниз, меняясь с меньшим ребёнком.

Алгоритм siftDown:

void siftDown(int k) {
E x = queue[k];
int half = size >>> 1; // size / 2
while (k < half) {
int child = (k << 1) + 1; // левый ребёнок
E c = queue[child];
int right = child + 1;
if (right < size && compare(c, queue[right]) > 0) {
child = right; // правый меньше
c = queue[child];
}
if (compare(x, c) <= 0) break;
queue[k] = c; // ребёнок поднимается
k = child; // опускаемся ниже
}
queue[k] = x;
}

Сложность: O(log n).

peek() — доступ к минимуму

E peek() {
return (size == 0) ? null : (E) queue[0];
}

Сложность: O(1) — прямой доступ к корню.

contains(Object o) — проверка наличия


1. Линейный поиск по массиву queue[].
2. Сравнение через equals().

Сложность: O(n) — требуется обход массива.

remove(Object o) — удаление элемента

1. Линейный поиск элемента: O(n).
2. Удаление найденного:
— Перемещение последнего элемента на место удаляемого.
— siftDown() или siftUp() для восстановления heap.

Сложность: O(n) поиск + O(log n) восстановление = O(n).

Важные нюансы

Comparator vs Comparable

Элементы должны быть сравниваемыми. Без Comparator/Comparable → ClassCastException.

НЕ полностью отсортирована

Heap гарантирует только минимум в корне.

Iterator не гарантирует порядок

Для sorted iteration используйте poll() в цикле:

Null элементы НЕ допускаются

Подходит


— Нужен доступ к минимуму/максимуму
— Динамическая сортировка
— Алгоритмы с приоритетами
— Top K проблема

Документация: JavaDoc (Java 17)

Ставьте , если хотите ещё разбор.

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

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

#CoreJava
1.83K views11:49
Открыть/Комментировать
2025-12-22 21:51:23
Библиотека джависта

#DevLife
2.29K views18:51
Открыть/Комментировать
2025-12-22 14:34:32 Магия IntelliJ IDEA: Live Templates с контекстом

Пишешь sout → Tab → System.out.println(). Знакомо? Но IDEA умеет гораздо больше.

Live Templates анализируют контекст кода и подставляют нужные переменные автоматически.

Что умеет

— soutv → выведет переменную под курсором с её именем
— soutm → выведет имя текущего метода и класса
— soutp → выведет все параметры метода
— psvm → создаст main method
— iter → foreach по коллекции под курсором
— ifn / inn → null-check или not-null check переменной

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

— Отладка в 2 нажатия без написания println вручную
— Быстрая генерация шаблонного кода (циклы, проверки)
— Автоматическое использование переменных из контекста

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

— Поставь курсор на переменную → пиши soutv → Tab
— Внутри метода → soutp → Tab (выведет все параметры)
— Создай свой template: Settings → Editor → Live Templates
— Можно задать контекст (Java, Kotlin, внутри метода/класса)

Бонус: psfs → создаст public static final String, lazy → ленивую инициализацию.

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

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

#Enterprise
2.45K views11:34
Открыть/Комментировать
2025-12-12 23:46:10
Библиотека джависта

#DevLife
1.06K views20:46
Открыть/Комментировать
2025-12-12 12:02:04 Git-команда для спасения незакоммиченных изменений

Проблема: вы правили код, тестировали гипотезу, переключились на другую ветку — и Git не даёт сделать checkout. Коммит делать рано, изменения сырые, но и терять их нельзя.

Решение: git stash

git stash временно убирает все незакоммиченные изменения в «карман», возвращая рабочую директорию в чистое состояние. Без потерь и хака.

Спрятать изменения:
git stash

или с комментарием:
git stash push -m "WIP: auth refactor"

Переключиться куда нужно:
git checkout feature/login

Посмотреть, что сохранено:
git stash list

Вернуть изменения:
git stash pop

или аккуратно, без удаления из stash:
git stash apply

Работа с конкретным stash:
git stash apply stash@{1}

Правило: не уверен — stash. Уверен — commit.

Минус один «я потерял код» в вашей карьере

Курс «Алгоритмы и структуры данных»
Получить консультацию менеджера
Сайт Академии Сайт Proglib

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

#Enterprise
1.44K views09:02
Открыть/Комментировать
2025-12-11 20:12:49 Устал каждый раз городить велосипед для Telegram-ботов на Spring Boot?

Новый готовый Spring Boot Starter решает именно эту боль: минимальная конфигурация, понятный pipeline обработки апдейтов, маршрутизация, обработка ошибок и простая интеграция в Spring-экосистему — всё из коробки.

Архитектура разделяет приём апдейтов (Ingress), Delivery, Interceptor, Dispatcher и Router/Handler, а также даёт готовые хуки расширения и обработки нестандартных сценариев.

Подробнее в статье

Курс «Алгоритмы и структуры данных»
Получить консультацию менеджера
Сайт Академии Сайт Proglib

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

#CoreJava
1.62K views17:12
Открыть/Комментировать
2025-12-11 17:59:01
Frontend VK Hub — как работают наши интерфейсы?

Что делает интерфейсы VK быстрыми, удобными и устойчивыми под нагрузкой миллионов пользователей?
Frontend VK Hub — это сообщество инженеров, которые создают и развивают пользовательские интерфейсы для ВКонтакте, VK Play, VK WorkSpace и других сервисов экосистемы. Мы делимся практическим опытом, рассказываем о подходах к производительности, внедрении современных фреймворков и всему, что связано с улучшением Developer Experience.

Здесь можно найти инсайты от ведущих фронтенд-разработчиков, разборы реальных задач, новости индустрии и приглашения на мероприятия VK. И конечно, вакансии!

Подписывайся!

Реклама. ООО "ВК" ИНН 7743001840
1.58K views14:59
Открыть/Комментировать
2025-12-11 17:54:59 Может ли интерфейс быть final?



Конечно может! Более того, в Java 21 появился секретный модификатор ultra-final, после которого IDE будет ругаться на него еще до компиляции!



Интерфейс не может быть объявлен как final. Это противоречит самой природе интерфейсов — они созданы для того, чтобы их реализовывали другие классы. Модификатор final запрещает наследование/реализацию, что делает интерфейс бесполезным.

Интерфейсы по умолчанию являются abstract, что концептуально противоположно final.

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

#core
1.27K views14:54
Открыть/Комментировать
2025-12-11 09:54:20
Библиотека джависта

#DevLife
1.77K views06:54
Открыть/Комментировать
2025-12-10 17:59:00
От первой строчки кода — до миллионов запросов в секунду.

В VK бэкендеры решают задачи, которые действительно меняют цифровой ландшафт. Узнайте об их принципах работы и драгоценных победах. По ссылке — истории из первых рук и вакансии для тех, кто не боится вызовов.
1.76K views14:59
Открыть/Комментировать
2025-12-10 15:31:01 Внутреннее устройство LinkedList

LinkedList — это реализация интерфейса List и Deque на основе двусвязного списка. Отличный выбор для частых вставок/удалений, но медленный доступ по индексу.

Базовая структура

LinkedList состоит из узлов (Node), связанных ссылками:

public class LinkedList {
transient int size = 0;
transient Node first; // голова списка
transient Node last; // хвост списка

private static class Node {
E item;
Node next; // следующий узел
Node prev; // предыдущий узел
}
}

Главные особенности:

— O(1) для add/remove с концов (first/last).
— O(n) для доступа по индексу (нужен обход).
— O(1) для вставки/удаления при наличии ссылки на узел.
— Больше памяти чем ArrayList (~24 байта overhead на элемент).

Как устроено хранение

Внутренности Node

→ item: элемент
→ prev: ссылка на предыдущий узел
→ next: ссылка на следующий узел

Преимущества двусвязного списка

— Обход в обе стороны (вперёд и назад).
— Быстрое удаление узла при наличии ссылки на него.
— Динамический размер без перевыделения памяти.

Операции добавления, удаления и доступа

add(E element) — добавление в конец

1. Создаётся новый Node: newNode = new Node<>(last, element, null).
2. Если список пустой (last == null), то first = last = newNode.
3. Иначе: last.next = newNode И last = newNode.
4. Увеличивается size.

Сложность: O(1).

add(int index, E element) — вставка по индексу

1. Проверяется range: index > size → IndexOutOfBoundsException.
2. Если index == size, вызывается addLast().
3. Иначе находится узел по индексу через node(index).
4. Создаётся новый узел и вставляется перед найденным.
5. Обновляются ссылки prev/next соседних узлов.

Сложность: O(n) — нужен поиск узла по индексу.

get(int index) — получение по индексу

1. Проверка границ: index >= size → IndexOutOfBoundsException.
2. Вызывается node(index) для поиска узла.
3. node(index) использует оптимизацию:
— Если index < size/2: обход от first вперёд.
— Иначе: обход от last назад.
4. Возвращается item найденного узла.

Сложность: O(n) — в худшем случае обход половины списка.

remove(int index) — удаление по индексу

1. Находится узел по индексу через node(index).
2. Узел отсоединяется от списка:
— node.prev.next = node.next (если prev != null).
— node.next.prev = node.prev (если next != null).
3. Обновляются first/last если нужно.
4. Обнуляются ссылки в узле для GC: node.item = null; node.next = node.prev = null.

Сложность: O(n) — поиск узла O(n), удаление O(1).

addFirst(E e) / addLast(E e)

Специальные методы для работы как Deque:

list.addFirst("A"); // O(1) — добавление в начало
list.addLast("Z"); // O(1) — добавление в конец

Сложность: O(1) — прямое изменение first/last.

removeFirst() / removeLast()

list.removeFirst(); // O(1) — удаление первого
list.removeLast(); // O(1) — удаление последнего

Сложность: O(1) — прямой доступ к first/last.

Важные нюансы

Реализует Deque

LinkedList может работать как двусторонняя очередь. Идеально для реализации стеков и очередей.

Память

Каждый узел требует ~24 байта overhead (на 64-bit JVM):
— 12 байт заголовок объекта
— 8 байт ссылка item
— 8 байт ссылка next
— 8 байт ссылка prev
— Padding до 8 байт

Для списка из 1000 элементов overhead ~24 КБ против ~4 КБ у ArrayList.

Нет RandomAccess

LinkedList НЕ реализует RandomAccess marker interface. Это сигнал для алгоритмов использовать итераторы вместо get(i).

// Медленно — O(n²)
for (int i = 0; i < list.size(); i++) {
String s = list.get(i);
}

// Быстро — O(n)
for (String s : list) {
// iterator используется автоматически
}

ListIterator

ListIterator позволяет двунаправленный обход и модификацию.

Null элементы

LinkedList допускает null значения.

Полезен если

→ Частые вставки/удаления с концов.
→ Модификация при итерации.
→ Неизвестный размер с частым ростом (Нет overhead на расширение массива как у ArrayList).

Документация: JavaDoc (Java 17)

Ставьте , если хотите ещё разбор.

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

#CoreJava
1.45K views12:31
Открыть/Комментировать
2025-12-10 14:02:18 Летим зимовать

Когда холодает, айтишники пакуют чемоданы, а мы разыгрываем ваучер на 50 000 рублей в Островке.

Поехать к морю или остаться среди снежных пейзажей — выбирайте сами!

Чтобы участвовать, нужно оставить любую реакцию под этим постом и подписаться на каналы ниже:

Типичный программист
Библиотека программиста
Ostrovok! Tech

Теперь осталось нажать на кнопку участия под этим постом и вы в игре!

Итоги подведём 12 декабря. Победителя выберем с помощью бота. Подробнее с правилами можно ознакомиться здесь.

Всем удачи!

Участников: 111
Призовых мест: 1
Дата розыгрыша: 19:00, 12.12.2025 MSK (3 дня)
1.09K views11:02
Открыть/Комментировать
2025-12-09 19:02:56
Библиотека джависта

#DevLife
1.79K views16:02
Открыть/Комментировать
2025-12-09 17:19:58
1.64K views14:19
Открыть/Комментировать
2025-12-09 13:13:02 Магия IntelliJ IDEA: Evaluate Expression

Дебажишь сложную бизнес-логику? Остановился на breakpoint, видишь 15 переменных в Variables, но нужно проверить результат user.getOrders().stream().filter(o -> o.getStatus() == PAID).count().

Обычный путь: добавить переменную, пересобрать, перезапустить дебаг. Или лезть в Watch и там собирать выражение.
А IDEA позволяет выполнять произвольный Java-код прямо в точке остановки — с полным доступом к контексту.

Что делает

— Выполняет любой Java-код в текущей области видимости (методы объектов, статика, создание новых объектов)
— Видит все локальные переменные, поля класса, this, параметры метода
— Поддерживает многострочные выражения с промежуточными переменными
— Работает с лямбдами, стримами, рефлексией — любой валидный Java
— Code Completion работает как в обычном редакторе
— Результат можно раскрыть, посмотреть поля, добавить в Watches

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

— Проверить гипотезу без изменения кода (а что если отфильтровать по другому полю?)
— Вызвать приватный метод или геттер для отладки
— Протестировать фикс: user.setStatus(ACTIVE); service.process(user) — сработает?
— Посмотреть сложную агрегацию: items.stream().collect(groupingBy(...))

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

— Поставить breakpoint, дождаться остановки
— Alt+F8 (Cmd+F8 на Mac) или ПКМ → Evaluate Expression
— Написать код, Enter — видишь результат
— Для многострочного: Code Fragment Mode (переключатель в диалоге)
— Можно выделить код прямо в редакторе и нажать Alt+F8 — он подставится автоматически

Курс «Алгоритмы и структуры данных»
Получить консультацию менеджера
Сайт Академии Сайт Proglib

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

#Enterprise
2.08K views10:13
Открыть/Комментировать
2025-12-08 23:11:57 JaCoCo

Если стандартных возможностей IDE для контроля покрытия тестами уже недостаточно, стоит обратить внимание на JaCoCo. Этот инструмент выходит за рамки базового функционала.

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

Многоформатные отчёты — HTML для визуализации, XML и CSV для автоматической обработки
Бесшовная интеграция с системами сборки (Maven/Gradle)
Готовность к CI/CD — работает с Jenkins, GitLab CI и другими платформами
Возможность исключать из анализа ненужные классы и пакеты
Совместимость с SonarQube и аналогичными системами контроля качества

JaCoCo идеален для проектов, где важна прозрачность метрик тестирования и автоматизация проверок качества кода на всех этапах разработки.

JaCoCo GitHub

Курс «Алгоритмы и структуры данных»
Получить консультацию менеджера
Сайт Академии Сайт Proglib

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

#Enterprise
2.23K viewsedited  20:11
Открыть/Комментировать
2025-12-08 11:02:11
Библиотека джависта

#DevLife
2.21K views08:02
Открыть/Комментировать
2025-12-08 08:43:54 Как настроить Prometheus и Grafana для мониторинга

Prometheus + Grafana — индустриальный стандарт для мониторинга и визуализации метрик. Time-series база данных, pull-based сбор метрик, powerful query язык (PromQL), оповещения.

Мониторинг JVM, HTTP requests, кастомных метрик, cache hit rates в реальном времени с историей и алертами.

Добавляем зависимости

Для экспорта метрик в Prometheus нужны spring-boot-starter-actuator и micrometer-registry-prometheus. Micrometer автоматически собирает JVM и application метрики.

Критически важно включить prometheus endpoint через management.endpoints.web.exposure.include=prometheus в application.yml. Без этого /actuator/prometheus не будет доступен.

Устанавливаем и настраиваем Prometheus

Скачайте Prometheus или запустите через Docker. Создайте prometheus.yml конфиг файл с определением targets для scraping.

Добавьте job для вашего приложения: job_name: 'spring-boot-app', targets: ['localhost:8080']. Укажите metrics_path: '/actuator/prometheus' и scrape_interval: 15s. Prometheus начнёт периодически собирать метрики.

Настраиваем кастомные метрики

Inject MeterRegistry в сервисы для регистрации метрик. Используйте Counter для монотонно растущих значений: registry.counter("orders.created", "region", "EU").increment().

Для текущих значений используйте Gauge: registry.gauge("queue.size", queue, Queue::size). Для измерения времени операций используйте Timer с tags для группировки: Timer.builder("api.request.duration").tags("endpoint", "/users").register(registry).

Устанавливаем и подключаем Grafana

Установите Grafana или запустите через Docker. При первом входе (admin/admin) добавьте Prometheus как data source через Configuration → Data Sources.

Укажите URL Prometheus (http://localhost:9090), настройте scrape interval. Grafana автоматически проверит подключение через Test кнопку. После успешного подключения можно создавать дашборды.

Создаём дашборды в Grafana

Импортируйте готовый дашборд для Spring Boot: используйте ID 4701 или 6756 из Grafana Marketplace. Они содержат панели для JVM memory, GC, HTTP metrics, database pool.

Создайте кастомные панели для бизнес метрик. Используйте PromQL для запросов: rate(http_server_requests_seconds_count[5m]) для requests per second, sum by (status)(http_server_requests_seconds_count) для группировки по HTTP статусам.

Настраиваем алерты

В Grafana создайте alert rules через Alerting → Alert rules. Определите условия: например, high error rate — rate(http_server_requests_seconds_count{status="500"}[5m]) > 10.

Настройте каналы оповещения (Slack, email, PagerDuty, webhook) для получения алертов. Укажите threshold values, evaluation interval и for duration (как долго условие должно быть true перед отправкой алерта).

Best practices и оптимизация

Используйте tags (labels) для всех метрик — это позволяет фильтровать и группировать
Не создавайте метрики с high cardinality tags (например, user_id) — это убьёт Prometheus
Настройте retention policy в Prometheus для баланса между историей и хранилищем
Используйте recording rules в Prometheus для предагрегации часто используемых запросы
Используйте @Timed(percentiles = {0.5, 0.95, 0.99}) для SLA трекинга

Что происходит под капотом

Micrometer собирает метрики во время работы приложения: подсчитывает request rate, измеряет latency, собирает JVM статистику. Метрики хранятся в памяти в формате Prometheus.

Prometheus периодически делает HTTP GET запрос к /actuator/prometheus, получает все метрики в текстовом формате. Сохраняет их в time-series БД с timestamp. Grafana запрашивает данные у Prometheus через PromQL, строит графики и проверяет условия алёртов.

Курс «Алгоритмы и структуры данных»
Получить консультацию менеджера
Сайт Академии Сайт Proglib

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

#Enterprise
2.01K views05:43
Открыть/Комментировать
2025-12-07 22:44:01
Java && Coffee

Уже поставили ёлку?) Отправляйте фото своих

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

#DevLife
2.18K views19:44
Открыть/Комментировать
2025-12-06 10:29:36 Security-тест: Настройка Spring Security конфига

Напишите конфигурацию для production-приложения

Задание

Есть REST API с эндпоинтами:

/api/public/** — публичные данные
/api/user/** — данные пользователя
/api/admin/** — админ-панель
/actuator/health — health check
/actuator/** — остальные actuator endpoints

Настройте SecurityFilterChain с правильными правами доступа и защитой от основных атак.

Требования

— Доступы

/api/public/** — доступ всем (включая неавторизованных)
/api/user/** — только авторизованным с ролью USER или ADMIN
/api/admin/** — только ADMIN
/actuator/health — доступ всем
/actuator/** — только ADMIN

Безопасность

→ Включить защиту от CSRF для state-changing операций
→ Настроить CORS: разрешить запросы только с https://example.com
→ Добавить security headers (XSS, clickjacking protection)
→ Использовать stateless сессии (JWT/token-based)
→ Настроить обработку ошибок 401/403

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

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

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

#practise
2.08K views07:29
Открыть/Комментировать
2025-12-05 18:26:14
От Spring Boot к матричным разложениям

Java-разработчики привыкли к строгой типизации и надёжной архитектуре. Но когда дело доходит до анализа данных, возникает «чёрный ящик»: мы можем интегрировать ML-модель, но не всегда понимаем математическую логику её работы.

Чтобы реально прокачаться, нужно спуститься на уровень ниже библиотек — к линейной алгебре.

На курсе «Математика для разработки AI-моделей» мы перезапустили формат: теперь с живыми вебинарами. Первый уже прошёл (отзывы — огонь), но вы ещё успеваете влететь в поток.

Что разбираем на ближайших лекциях:

— векторы, матрицы, определители (основа эффективных вычислений);
— линейную регрессию и метод наименьших квадратов (реализуем алгоритм с нуля);
— SVD-разложение (ключ к созданию рекомендательных систем).

Это не сухая теория, а практика на NumPy.

Последний шанс присоединиться (до 9.12)
2.39K views15:26
Открыть/Комментировать
2025-12-05 14:08:35
Библиотека джависта

#DevLife
2.44K views11:08
Открыть/Комментировать
2025-11-21 17:59:01 Java — это не только про фабрики бинов

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

Вместо, того чтобы искать релевантный контент по всему тг, загляните в папку, где собраны несколько авторских каналов. Можно узнать много полезностей не только про Java, но и про актуальные инструменты и смежные технологии. Пригодится для вашего профессионального роста.
726 views14:59
Открыть/Комментировать
2025-11-21 15:04:00
Библиотека джависта

#DevLife
1.14K views12:04
Открыть/Комментировать
2025-11-21 13:17:11 Kubernetes + Spring Boot

Вместо того чтобы копировать чужие манифесты с GitHub, вы настраиваете полноценный production-ready деплоймент через промпт.

Оптимизированный Dockerfile с multi-stage сборкой, Deployment с resource limits и health probes, Service Discovery через Kubernetes DNS, Ingress с TLS терминацией, автоскейлинг через HPA, NetworkPolicy для изоляции, RBAC для безопасности, и observability через Prometheus/Grafana.

Промпт:

Generate a production-ready Spring Boot 3 application deployment to Kubernetes with enterprise-grade configuration:

— Create optimized multi-stage Dockerfile: Eclipse Temurin JDK 21, layered JAR, non-root user, distroless runtime image, minimal attack surface.

— Configure Kubernetes Deployment: resource requests/limits (CPU/memory), pod anti-affinity, PodDisruptionBudget, rolling update strategy with maxSurge/maxUnavailable, replica count.

— Implement health probes: liveness (/health/liveness), readiness (/health/readiness), startup probe for slow apps, custom health indicators, initial delays and timeouts.

— Set up configuration management: ConfigMaps for application.yml, Secrets for credentials, environment-specific overlays, volume mounts, Spring Cloud Kubernetes Config integration.

— Configure Service and Ingress: ClusterIP Service, NGINX Ingress with path/host routing, TLS termination via cert-manager, rate limiting, CORS policies.

— Implement RBAC: ServiceAccount, Role with least-privilege, RoleBinding, pod security context (runAsNonRoot, readOnlyRootFilesystem).

— Set up autoscaling: HorizontalPodAutoscaler based on CPU/memory/custom metrics, VerticalPodAutoscaler, scaling thresholds.

— Add NetworkPolicy: ingress/egress rules, namespace isolation, pod selector-based restrictions, deny-all default.

— Configure observability: Prometheus ServiceMonitor, Grafana dashboards, Spring Boot Actuator metrics, distributed tracing with Jaeger/Tempo, Loki for logs.

— Implement graceful shutdown: SIGTERM handling, preStop hooks, connection draining, termination grace period (30s+).

— Add secrets management: External Secrets Operator, HashiCorp Vault, AWS/GCP Secrets Manager CSI drivers.

— Create Helm chart: values.yaml with environment configs, templates for all resources, chart dependencies, deployment notes.

— Add Kustomize setup: base manifests, environment-specific overlays, ConfigMap generators.

— Configure init containers: database migrations (Flyway), wait-for-dependencies, secret fetching.

— Implement GitOps: ArgoCD Application manifest, sync policies, health checks, automated rollback.

Deliverables:
— Dockerfile with multi-stage build
— kubernetes/*.yaml (deployment, service, ingress, configmap, secret, hpa, networkpolicy)
— helm/ chart with templates and values
— kustomize/ with base and overlays
— prometheus-servicemonitor.yaml
— grafana-dashboard.json
— README with deployment guide and troubleshooting

Расширения:

— настроить service mesh (Istio) с mTLS;
— добавить canary deployments с Argo Rollouts;
— реализовать policy enforcement через Kyverno;

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

#Enterprise
1.31K views10:17
Открыть/Комментировать