Java библиотека
31.1K subscribers
2K photos
82 videos
10 files
1.86K links
Книги, статьи, мемы и многое другое для Java программиста!

По сотрудничеству и рекламе: @NadikaKir

Канал в перечне РКН: https://vk.cc/cJrT4A

Мы на бирже: https://telega.in/c/javalib/

Сообщество VK https://vk.com/javatutorial
Download Telegram
🖥 quarkus-langchain4j — расширение для Quarkus, которое упрощает интеграцию с библиотекой LangChain4j и позволяет использовать модели больших языковых моделей (LLMs) в приложениях на Quarkus!

🌟 Расширение поддерживает работу с различными LLM-провайдерами (такими как OpenAI и Hugging Face), кэширование, интеграцию с хранилищами документов (Redis, Chroma) и обеспечивает совместимость с нативной компиляцией.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍3🔥1
❗️ Что такое нормализация базы данных, и какие существуют нормальные формы?

Нормализация — это процесс приведения структуры базы данных к оптимальному виду для устранения избыточности данных и обеспечения их целостности. Процесс состоит из последовательных этапов, соответствующих нормальным формам (НФ).

Основные нормальные формы (НФ):

1️⃣ Первая нормальная форма (1НФ):
Данные делятся на атомарные (неделимые) значения.
Пример: В одной ячейке таблицы не может быть списка телефонов, вместо этого создается отдельная строка для каждого телефона.

2️⃣ Вторая нормальная форма (2НФ):
Требует выполнения 1НФ и исключения зависимости от части составного первичного ключа. Это устраняет проблему дублирования данных.
Пример: Если таблица использует составной ключ (например, "Курс" и "Студент"), информация, относящаяся только к "Курсу", выносится в отдельную таблицу.

3️⃣ Третья нормальная форма (3НФ):
Выполняется 2НФ и устраняются транзитивные зависимости — неключевые атрибуты должны зависеть только от ключа.
Пример: Если в таблице есть "ID сотрудника", "Отдел" и "Название отдела", то "Название отдела" переносится в отдельную таблицу "Отделы".

Редко используемые нормальные формы:

- Нормальная форма Бойса-Кодда (BCNF): Уточнённая версия 3НФ, где каждое определяющее множество является суперключом. Используется для устранения более сложных аномалий.
- Четвёртая нормальная форма (4НФ): Устраняет многозначные зависимости, которые появляются при использовании нескольких связей между одними и теми же атрибутами.
- Пятая нормальная форма (5НФ): Делает базу данных устойчивой к разделению данных, устраняя зависимости соединений.

Эти формы применяются в сложных сценариях, например, при проектировании корпоративных систем с огромным количеством взаимосвязей. Для большинства приложений 3НФ оказывается достаточной.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍86🔥3
Spring Security 7

Hi Spring fans! In this installment, we look at username/passwords, one-time tokens, passkeys, multi-factor authentication, and OAuth, and a bunch of other nice features in Spring Security 7!

🌐🗣СМОТРЕТЬ VKVIDEO

🎞🗣СМОТРЕТЬ YOUTUBE

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10🔥52
🖥 Opik — это открытая платформа для разработки, тестирования и мониторинга приложений на основе больших языковых моделей (LLM)!

🌟 Этот инструмент помогает отслеживать и анализировать работу LLM, автоматизировать оценку, хранить тестовые случаи и поддерживает интеграцию с CI/CD для упрощения цикла разработки и развертывания. Платформа позволяет как локальный запуск, так и использование в облаке, поддерживает такие фреймворки, как OpenAI, LangChain и другие.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥43
Spring Framework и Spring Boot с нуля! 🚀 (12 часов)

Это видео поможет вам с нуля освоить Spring Framework и Spring Boot. В нем вы:
Познакомитесь с основными инструментами.
Разберетесь в принципах работы Spring Framework изнутри.
Научитесь создавать полноценное приложение, используя всё, о чем говорится в видео.
Если вы никогда не работали со Spring Framework или переходите с другого языка программирования на Java, это видео станет отличным стартом для изучения этого фреймворка и начала работы над собственными проектами!


🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥4👍2
❗️Как работает ConcurrentHashMap под капотом?

ConcurrentHashMap – это высокопроизводительная реализация Map, специально разработанная для многопоточной среды. Она гарантирует безопасность данных при одновременном доступе и минимизирует использование блокировок.

💡 Основные механизмы:

🟡 Сегментация данных (до 8 java): Данные разделялись на сегменты, и блокировка происходила на уровне сегмента, а не всей карты. Это обеспечивало параллельный доступ к разным частям карты.

🟡 Кассовые таблицы (Java 8+): Вместо сегментов используется структура на основе Node[] – массив узлов. Это сделало структуру более гибкой. Вместо сегментации применяется механизм Fine-Grained Locking и Compare-And-Swap:
- Compare-And-Swap используется для операций записи, что позволяет избегать блокировок для большинства операций. Операции с разными бакетами могут выполняться параллельно, поскольку локальная блокировка применяется только к отдельному узлу или бакету.
- Fine-Grained Locking минимизирует область блокировок. Например, если требуется масштабирование (resize) или обработка коллизий, потоки могут продолжать работу с другими бакетами, даже если один из них временно заблокирован.
- synchronized применяется только для случаев, когда CAS не справляется (например, при реорганизации данных или сложных операциях). Это помогает поддерживать баланс между безопасностью и производительностью.

🟡 Масштабируемый массив (Resizable Array): Масштабирование в ConcurrentHashMap происходит градуально, чтобы избежать блокировки всей структуры. Новый массив создаётся с увеличенным размером, и данные переносятся постепенно, по частям. Во время переноса используется специальный узел ForwardingNode, который перенаправляет операции к новому массиву, обеспечивая корректную работу всех потоков.

📚 Основные методы:

🔘 get(Object key):
Легковесная операция, не требует блокировок. Ключ хэшируется, затем вычисляется индекс сегмента. Если в сегменте есть соответствующий узел, он возвращается.

🔘 put(K key, V value):
- Сначала используется CAS для вставки нового элемента.
- Если CAS не срабатывает (например, при наличии коллизии), включается локальная блокировка на соответствующей корзине.

🔘computeIfAbsent/compute:
Более сложные операции, которые комбинируют вычисления с модификацией. Используются короткие локи для минимизации блокировки других потоков.

⚠️ Особенности:

- ConcurrentHashMap не допускает хранения null для ключей и значений. Это связано с невозможностью различать отсутствие значения и реальное хранение null.
- Итерации по карте предоставляют "слабо согласованные" данные, что означает, что изменения, происходящие параллельно, могут быть частично видны.

Документация

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥85👍4
💡 Spring Boot Tip

Когда вы строите REST API в Spring Boot, часто используют префикс /api для всех контроллеров.
Но добавлять @RequestMapping("/api") в каждый контроллер — неудобно и захламляет код.

Гораздо проще задать единый префикс через конфигурацию:


@Configuration
class WebMvcConfig implements WebMvcConfigurer {

@Override
public void configurePathMatch(PathMatchConfigurer configurer) {
configurer.addPathPrefix("/api",
aClass -> aClass.getPackage().getName()
.startsWith("com.sivalabs.bookstore"));
}
}


Так вы автоматически добавляете /api ко всем контроллерам из нужного пакета, а код контроллеров остаётся чистым.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍95🔥4😁1
🖥 perfio — высокопроизводительные буферизированные инструменты ввода-вывода для JVM, оптимизированные для потоковой обработки бинарных и текстовых данных!

🌟 Эти инструменты значительно быстрее стандартных библиотек благодаря упрощенной архитектуре буферов и отказу от многослойного наследования. perfio поддерживает эффективную обработку строк и чисел с оптимизированным использованием памяти и минимизацией накладных расходов на синхронизацию.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥53👍2
Media is too big
VIEW IN TELEGRAM
Знакомство с Resilience4j. CircuitBreaker

В этом видео знакомимся с компонентом библиотеки Resilience4j - CircuitBreaker

📺🗣СМОТРЕТЬ RUTUBE

🌐🗣СМОТРЕТЬ VKVIDEO

📝🗣СМОТРЕТЬ DZEN

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍62🔥2
Совет 👩‍💻 Spring Retry

Spring Retry предлагает возможность автоматического повторного выполнения неудачной операции. 🔥



@Configuration
@EnableRetry
public class Application {

}

@Service
class Service {
@Retryable(retryFor = RemoteAccessException.class)
public void service() {
// ... do something
}
@Recover
public void recover(RemoteAccessException e) {
// ... panic
}
}


🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍51
👇Паттерн Строитель (Builder)

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

Использование:

🟡 Когда нужно создать объект с большим количеством параметров, и не все из них обязательны.
🟡 Когда процесс создания объекта требует выполнения нескольких шагов или дополнительных проверок.
🟡 В случаях, когда один и тот же код должен создавать разные представления объекта (например, текстовое и графическое).

Преимущества:

1️⃣ Упрощает создание сложных объектов, делая процесс понятным и читаемым.
2️⃣ Позволяет создавать объекты с разными вариациями без необходимости дублирования кода.
3️⃣ Разделяет логику создания объекта от его структуры, что упрощает поддержку и модификацию кода.

Недостатки:

1️⃣ Увеличивает сложность кода за счёт создания дополнительных классов и методов.
2️⃣ Может быть избыточным для простых объектов с небольшим количеством параметров.
3️⃣ Требует дополнительного внимания при проектировании, чтобы избежать путаницы между обязательными и необязательными шагами.

📌 Паттерн Builder полезен, если объект имеет много параметров и их нужно задавать гибко. Например, при создании сложных конфигураций для HTTP-запросов (заголовки, тело, параметры), построении графических интерфейсов или генерации HTML-документов. Builder помогает сделать код более понятным и избежать создания конструкций с длинными и неудобными конструкторами.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍4🔥2
Совет по Java/JPA: в JPA можно использовать native queries не только для SELECT, но и для INSERT, UPDATE и DELETE.
Важно: такие операции идут в обход EntityManager/PersistenceContext, поэтому изменения не попадают в контекст и не синхронизируются с сущностями автоматически.

На примере Spring Data JPA:

- @Modifying позволяет выполнять модифицирующие запросы
- nativeQuery = true — включает нативный SQL
- clearAutomatically / flushAutomatically управляют очисткой и синхронизацией контекста транзакции

Нативные INSERT/UPDATE/DELETE удобны, когда нужна высокая производительность, сложный SQL или массовая вставка данных.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍8🔥63
🖥 better-inputs — инструмент для расширенной работы с пользовательским вводом в Java, делая этот процесс более гибким и удобным. Он поддерживает настройки типа ввода, ввод через консоль и графический интерфейс, а также функции для проверки корректности введённых данных.

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

🔐 Лицензия: MIT

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
6🔥3
🖥 Apktool — это инструмент на Java для обратного проектирования сторонних, закрытых, бинарных приложений Android!

🌟 Он может декодировать ресурсы в почти исходную форму и восстанавливать их после внесения некоторых изменений; он позволяет отлаживать smali-код шаг за шагом. Он также упрощает работу с приложениями благодаря проектной файловой структуре и автоматизации некоторых повторяющихся задач, таких как сборка .apk и т. д.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍43🔥3
🔒 Pessimistic vs Optimistic Locking

🟡Pessimistic Locking

- Запись недоступна для других потоков до тех пор, пока текущий поток не закончит работу с ней.
- Даже чтение данных другими потоками невозможно, пока лок не снят.
- Пример: EntityManager.lock(entity, LockModeType.PESSIMISTIC_WRITE) в JPA.
- Минусы: снижает производительность при высоком уровне конкурентного доступа.
- Когда применять: при критической необходимости точности данных.

🟡Optimistic Locking

- Не блокирует данные при чтении, но проверяет версию записи при сохранении.
- Пример: аннотация @Version в JPA (колонка для хранения версии).
- Если версия изменена другим потоком, выбрасывается OptimisticLockException.
- Минусы: требует обработки конфликтов.
- Когда применять: при большом количестве чтений и низкой вероятности конфликтов.

Какой подход вы чаще используете в своих проектах?

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍136🔥5❤‍🔥1
📎Паттерн Фасад (Facade)

Фасад — это структурный паттерн, который предоставляет унифицированный интерфейс для работы с набором сложных подсистем. Он скрывает сложность системы и упрощает взаимодействие с ней, предоставляя более простой и понятный API для клиента.

Использование:

🟡 Когда система состоит из множества классов, и нужно упростить доступ к её функционалу.
🟡 Когда нужно предоставить клиенту единый интерфейс для работы с несколькими подсистемами.
🟡 Когда необходимо уменьшить зависимость между клиентом и сложной системой, скрыв внутренние детали реализации.

Преимущества:

1️⃣ Упрощает взаимодействие с комплексной системой, предоставляя удобный интерфейс.
2️⃣ Снижает зависимость клиента от конкретных классов подсистем, облегчая поддержку и тестирование.
3️⃣ Уменьшает количество точек взаимодействия с системой, что помогает избежать ошибок и повысить удобство работы.

Недостатки:

1️⃣ Может скрывать избыточную функциональность, ограничивая возможности системы.
2️⃣ Увеличивает количество кода за счёт добавления нового фасадного класса.
3️⃣ Если фасад слишком абстрактен, может стать сложным для понимания и поддержки.

📌 Паттерн Фасад полезен, когда нужно объединить несколько подсистем под один общий интерфейс, делая систему более удобной и простой для использования. Например, при работе с библиотеками, требующими сложной настройки, или в крупных проектах, где взаимодействие с множеством компонентов может стать запутанным. Фасад помогает улучшить архитектуру и повысить удобство работы с системой.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍5🔥5❤‍🔥41
🖥Resilience4j — это библиотека для Java, которая предоставляет шаблоны устойчивости, такие как ограничение количества запросов, цепочка перезапусков, схема "предохранитель" (Circuit Breaker), отказоустойчивость и тайм-ауты. Она разработана для повышения стабильности и надежности микросервисов и других распределенных систем, помогая справляться с ошибками и сбоями в вызовах внешних сервисов.

🔍 Основные компоненты Resilience4j:

🌟 Circuit Breaker — схема, которая отслеживает ошибки в зависимости от их частоты и может временно блокировать вызовы к нестабильному сервису.

🌟 Rate Limiter — компонент для контроля частоты запросов и предотвращения перегрузки систем.

🌟 Retry — механизм для повторных вызовов при временных ошибках, позволяющий задать количество попыток и интервалы.

🌟 Bulkhead — ограничение параллельных потоков или разрешенных вызовов для защиты от перегрузки ресурсов.

🌟 TimeLimiter — устанавливает ограничения по времени выполнения, чтобы избежать долгих ожиданий при вызове внешних ресурсов.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
9👍9🔥5
💡 Глубокий взгляд на реализацию Arrays.sort()

А вы задумывались, что скрывается под капотом Arrays.sort()? Быстрая сортировка? Пузырёк? Или, может, что-то ещё?

На самом деле, Arrays.sort() – это больше, чем просто сортировка. Этот метод использует адаптивные алгоритмы и оптимизации, которые подстраиваются под тип данных и размер массива. А главное – в его реализации предусмотрена защита от худших случаев, таких как неудачное распределение данных, чтобы всегда обеспечивать стабильную производительность.

1️⃣ Примитивы: Dual-Pivot Quicksort

Для массивов примитивных типов (int, double и т.д.) используется Dual-Pivot Quicksort. Он выбирает два опорных элемента, которые делят массив на три части: элементы меньше первого опорного, между опорными и больше второго, с последующей рекурсивной сортировкой каждой части.

🔍 Как это выглядит:

if (arr[left] > arr[right]) {
swap(arr, left, right);
}
int pivot1 = arr[left];
int pivot2 = arr[right];

int i = left + 1, lt = left + 1, gt = right - 1;
while (i <= gt) {
if (arr[i] < pivot1) {
swap(arr, i++, lt++); // Элементы меньше первого опорного
} else if (arr[i] > pivot2) {
swap(arr, i, gt--); // Элементы больше второго опорного
} else {
i++; // Элементы между опорными
}
}
swap(arr, left, --lt);
swap(arr, right, ++gt);


📌 Почему это эффективно?

- Использование двух опорных элементов снижает глубину рекурсии.
- Разбиение на три части позволяет сбалансировать массив быстрее, чем в классическом Quicksort.
- Работает in-place, избегая лишних выделений.
- Даже на отсортированных или случайных данных Dual-Pivot Quicksort показывает стабильную производительность.

2️⃣ Ссылочные типы: Timsort

Если вы сортируете объекты (String, Integer и т.д.), то под капотом работает Timsort – гибридный алгоритм, который сочетает Merge Sort и Insertion Sort. Он адаптивно обрабатывает массивы, находя уже отсортированные последовательности (run'ы) и минимизируя количество операций для их слияния.

🔍 Как это выглядит:

int runLen = 32; // Минимальная длина run
for (int i = 0; i < array.length; i += runLen) {
insertionSort(array, i, Math.min((i + runLen - 1), array.length - 1));
}

while (stackSize > 1) {
if (runLen[stackSize - 2] <= runLen[stackSize - 1]) {
mergeRun(stackSize - 2, stackSize - 1); // Слияние соседних run'ов
}
}


📌 Почему это эффективно?

- Timsort автоматически находит уже отсортированные подмассивы, уменьшая объём работы.
- Работает с заранее выделенными буферами для быстрого слияния подмассивов.
- Сохраняет порядок равных элементов, что важно для многих задач.
- Производительность близка к O(n) на частично отсортированных данных.

3️⃣ Небольшие массивы: Insertion Sort

Для массивов с небольшим количеством элементов (до 32) используется Insertion Sort (сортировка вставками). Он работает, проходя по массиву и вставляя каждый элемент на своё место в уже отсортированной части, сдвигая элементы, которые больше текущего, вправо. Этот алгоритм применяется, так как на малых объёмах данных он оказывается быстрее более сложных методов благодаря низким накладным расходам и простоте реализации.

🔍 Как это выглядит:

for (int i = left + 1; i <= right; i++) {
int key = array[i];
int j = i - 1;
while (j >= left && array[j] > key) {
array[j + 1] = array[j];
j--;
}
array[j + 1] = key;
}


📌 Почему это эффективно?

- Алгоритм не требует дополнительной памяти и выполняется in-place.
- Сложность O(n^2) на больших данных компенсируется эффективностью на длине до 32 элементов.
- Использует уже загруженные данные в кэше процессора, что ускоряет доступ к памяти.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍108🔥4
🔼 Roadmap от джуна до сеньора

🟡Инструменты для работы в команде: Освойте Jira, Confluence, Slack, MS Teams, Zoom и другие.
🟡Языки программирования: Углубитесь в 1-2 языка, например, Python, С#.
🟡Разработка API: Изучите REST, GraphQL, gRPC.
🟡Серверы и хостинг: Ознакомьтесь с AWS, Azure, GCP, Kubernetes.
🟡Аутентификация и тестирование: Освойте JWT, OAuth2, TDD и нагрузочное тестирование.
🟡Базы данных: Работайте с SQL (Postgres, MySQL) и NoSQL (MongoDB).
🟡CI/CD: Изучите GitHub Actions, Jenkins.
🟡Алгоритмы: Разберитесь в Big O, деревьях, графах.
🟡Системный дизайн: Погрузитесь в кэширование, микросервисы, балансировку нагрузки.
🟡Паттерны проектирования: Изучите DI, фабрику и другие паттерны.
🟡AI-инструменты: Научитесь использовать GitHub Copilot, ChatGPT.

Какие пункты вы бы ещё добавили?

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
👍126🔥6😁4
В чем основные различия между checked и unchecked исключениями?

Проверяемые исключения (Checked Exceptions) требуют обработки во время компиляции. Это исключения, которые происходят из класса Exception, но не являются подклассами RuntimeException. Нужно либо обрабатывать такие исключения с помощью try-catch, либо объявлять их в сигнатуре метода с ключевым словом throws. Их цель — предупредить ошибки, которые могут быть предсказаны, но неизбежны, например, проблемы с доступом к файлам.

Непроверяемые исключения (Unchecked Exceptions) включают в себя RuntimeException и его подклассы, такие как NullPointerException, IndexOutOfBoundsException и IllegalArgumentException. Эти исключения происходят во время выполнения и сигнализируют о логических ошибках в коде, которые обычно можно избежать, если правильно построить логику программы. Обработка таких исключений — выбор разработчика, поскольку они не проверяются компилятором и, как правило, возникают из-за ошибок программиста, которые не связаны с внешними условиями.

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
8👍3🔥1
📞 kkTerminal — веб-терминал на Vue.js и Java для удаленного подключения к серверам через SSH! Это инструмент, который можно использовать через браузер, с поддержкой таких возможностей, как:

🌟 Подключение по SSH: Пользователи могут устанавливать соединение с удалёнными серверами, настраивая параметры прямо в интерфейсе.

🌟 Интеграция на веб-сайтах: Подключение возможно через использование тега <iframe> на сторонних веб-страницах.

🌟 Поддержка Docker: Приложение легко разворачивается через Docker-образ, предоставленный автором.

🌟 Управление файлами: Есть функционал просмотра, загрузки, редактирования и управления файлами и папками на удалённом сервере.

🌟 Настройка интерфейса: Можно менять фон, шрифты, размер текста и другие визуальные настройки терминала.

🌟 Работа с горячими клавишами: Поддерживаются операции с файлами с использованием сочетаний клавиш.

🔐 Лицензия: Apache-2.0

🖥 Github

Подписывайся на наш канал в Max 🟪
Please open Telegram to view this post
VIEW IN TELEGRAM
3🔥2👍1