Виртуальные потоки: революционное решение для параллелизма
Несмотря на то, что платформе Java почти 30 лет, она стабильно остаётся одной из трёх самых популярных языков программирования. Эта продолжающаяся популярность обусловлена виртуальной машиной Java (JVM), которая абстрагирует такие сложности, как управление памятью, и компилирует код во время выполнения, обеспечивая непревзойдённую масштабируемость на уровне интернета.
Долговременная актуальность Java также объясняется быстрым развитием языка, его библиотек и JVM. Виртуальные потоки Java, представленные в проекте Loom, инициативе сообщества OpenJDK, знаменуют собой революционное изменение в том, как Java справляется с параллелизмом.
Запускает 10 000 platform threads
https://dzone.com/articles/deep-dive-into-java-virtual-threads-a-game-changer
👉@BookJava
Несмотря на то, что платформе Java почти 30 лет, она стабильно остаётся одной из трёх самых популярных языков программирования. Эта продолжающаяся популярность обусловлена виртуальной машиной Java (JVM), которая абстрагирует такие сложности, как управление памятью, и компилирует код во время выполнения, обеспечивая непревзойдённую масштабируемость на уровне интернета.
Долговременная актуальность Java также объясняется быстрым развитием языка, его библиотек и JVM. Виртуальные потоки Java, представленные в проекте Loom, инициативе сообщества OpenJDK, знаменуют собой революционное изменение в том, как Java справляется с параллелизмом.
Запускает 10 000 platform threads
public class PlatformThreadCreationTimeAnalyzer {
private static class Task implements Runnable {
@Override
public void run() {
System.out.println("Hello! I am a Platform Thread");
}
}
public static void main(String[] args) throws Exception {
long startTime = System.currentTimeMillis();
for (int counter = 0; counter < 10_000; ++counter) {
new Thread(new Task()).start();
}
System.out.print("Platform Thread Creation Time: " + (System.currentTimeMillis() - startTime));
}
}
https://dzone.com/articles/deep-dive-into-java-virtual-threads-a-game-changer
👉@BookJava
Улучшенный цикл for
Этот цикл кратко выполняет итерацию по коллекциям.
👉@BookJava
Этот цикл кратко выполняет итерацию по коллекциям.
int[] numbers = {1, 2, 3, 4, 5};
for (int number : numbers) {
System.out.println(number);
}
👉@BookJava
Приходи повышать грейд на хардовый курс «Разработчик на Spring Framework» от OTUS.
🗓 6 ноября в 20:00 мск., пройдет бесплатный открытый урок курса, тема «Spring - разбор (не)стандартных вопросов интервью»
🔗 Ссылка на регистрацию: https://vk.cc/cD2Ahj
Будет интересно!
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Манипуляции со строками с помощью StringBuilder
Используйте StringBuilder для частых изменений, чтобы избежать создания новых объектов String.
👉@BookJava
Используйте StringBuilder для частых изменений, чтобы избежать создания новых объектов String.
StringBuilder message = new StringBuilder(“Hello”);
message.append(“ World!”);
System.out.println(message); // Output: Hello World!
👉@BookJava
Как жить без IntelliJ IDEA? Часть №1. Собери сам
На российском рынке сложилась сложная ситуация с IDE для Java-разработчиков. Новости, связанные с ограничением скачивания IntelliJ IDEA Ultimate, недоступностью JetBrains маркетплейса и блокировкой лицензий, которые использовались на территории РФ порождают огромное количество вопросов, на которые не у всех есть ответы.
Команда Spring АйО подготовила цикл статей, в которых постарается ответить на все вопросы, связанные с уходом IntelliJ IDEA из России.
https://habr.com/ru/companies/spring_aio/articles/852526/
👉@BookJava
На российском рынке сложилась сложная ситуация с IDE для Java-разработчиков. Новости, связанные с ограничением скачивания IntelliJ IDEA Ultimate, недоступностью JetBrains маркетплейса и блокировкой лицензий, которые использовались на территории РФ порождают огромное количество вопросов, на которые не у всех есть ответы.
Команда Spring АйО подготовила цикл статей, в которых постарается ответить на все вопросы, связанные с уходом IntelliJ IDEA из России.
https://habr.com/ru/companies/spring_aio/articles/852526/
👉@BookJava
Хабр
Как жить без IntelliJ IDEA? Часть №1. Собери сам
На российском рынке сложилась сложная ситуация с IDE для Java-разработчиков. Новости, связанные с ограничением скачивания IntelliJ IDEA Ultimate , недоступностью JetBrains маркетплейса и блокировкой...
- умение использовать современные фреймворки: Spring WebFlux, Kafka, реактивный Postgres, Kubernetes.
Вы получите инструменты и знания, которые помогут вам писать код быстрее и чище. Все практические навыки вы сможете незамедлительно применять в своей работе.
Готовы прокачать свою востребованность?
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Проверка на null с помощью Optional
👉@BookJava
Optional
помогает избежать NullPointerExceptions.
String name = "Alice";
Optional<String> maybeName = Optional.ofNullable(name);
System.out.println(maybeName.orElse("Nobody")); // Output: Alice
👉@BookJava
Подчеркивания в числовых литералах (Java SE 7+):
Улучшите читаемость с помощью подчеркиваний в числах.
👉@BookJava
Улучшите читаемость с помощью подчеркиваний в числах.
long largeNumber = 123_456_789L;
System.out.println(largeNumber); // Output: 123456789
👉@BookJava
Двойная инициализация с помощью фигурных скобок (Java SE 7+):
Кратко инициализируйте коллекции.
👉@BookJava
Кратко инициализируйте коллекции.
Map<String, Integer> fruits = Map.of("apple", 1, "banana", 2);
System.out.println(fruits); // Output: {apple=1, banana=2}
👉@BookJava
Подборка Telegram каналов для программистов
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Системное администрирование 📌
https://t.me/sysadmin_girl Девочка Сисадмин
https://t.me/srv_admin_linux Админские угодья
https://t.me/linux_srv Типичный Сисадмин
https://t.me/devops_star DevOps Star (Звезда Девопса)
https://t.me/i_linux Системный администратор
https://t.me/linuxchmod Linux
https://t.me/sys_adminos Системный Администратор
https://t.me/tipsysdmin Типичный Сисадмин (фото железа, было/стало)
https://t.me/sysadminof Книги для админов, полезные материалы
https://t.me/i_odmin Все для системного администратора
https://t.me/i_odmin_book Библиотека Системного Администратора
https://t.me/i_odmin_chat Чат системных администраторов
https://t.me/i_DevOps DevOps: Пишем о Docker, Kubernetes и др.
https://t.me/sysadminoff Новости Линукс Linux
1C разработка 📌
https://t.me/odin1C_rus Cтатьи, курсы, советы, шаблоны кода 1С
Программирование C++📌
https://t.me/cpp_lib Библиотека C/C++ разработчика
https://t.me/cpp_knigi Книги для программистов C/C++
https://t.me/cpp_geek Учим C/C++ на примерах
Программирование Python 📌
https://t.me/pythonofff Python академия. Учи Python быстро и легко🐍
https://t.me/BookPython Библиотека Python разработчика
https://t.me/python_real Python подборки на русском и английском
https://t.me/python_360 Книги по Python Rus
Java разработка 📌
https://t.me/BookJava Библиотека Java разработчика
https://t.me/java_360 Книги по Java Rus
https://t.me/java_geek Учим Java на примерах
GitHub Сообщество 📌
https://t.me/Githublib Интересное из GitHub
Базы данных (Data Base) 📌
https://t.me/database_info Все про базы данных
Мобильная разработка: iOS, Android 📌
https://t.me/developer_mobila Мобильная разработка
https://t.me/kotlin_lib Подборки полезного материала по Kotlin
Фронтенд разработка 📌
https://t.me/frontend_1 Подборки для frontend разработчиков
https://t.me/frontend_sovet Frontend советы, примеры и практика!
https://t.me/React_lib Подборки по React js и все что с ним связано
Разработка игр 📌
https://t.me/game_devv Все о разработке игр
Библиотеки 📌
https://t.me/book_for_dev Книги для программистов Rus
https://t.me/programmist_of Книги по программированию
https://t.me/proglb Библиотека программиста
https://t.me/bfbook Книги для программистов
https://t.me/books_reserv Книги для программистов
БигДата, машинное обучение 📌
https://t.me/bigdata_1 Data Science, Big Data, Machine Learning, Deep Learning
Программирование 📌
https://t.me/bookflow Лекции, видеоуроки, доклады с IT конференций
https://t.me/coddy_academy Полезные советы по программированию
https://t.me/rust_lib Полезный контент по программированию на Rust
https://t.me/golang_lib Библиотека Go (Golang) разработчика
https://t.me/itmozg Программисты, дизайнеры, новости из мира IT
https://t.me/php_lib Библиотека PHP программиста 👨🏼💻👩💻
https://t.me/nodejs_lib Подборки по Node js и все что с ним связано
https://t.me/ruby_lib Библиотека Ruby программиста
QA, тестирование 📌
https://t.me/testlab_qa Библиотека тестировщика
Шутки программистов 📌
https://t.me/itumor Шутки программистов
Защита, взлом, безопасность 📌
https://t.me/thehaking Канал о кибербезопасности
https://t.me/xakep_1 Статьи из "Хакера"
Книги, статьи для дизайнеров 📌
https://t.me/ux_web Статьи, книги для дизайнеров
Английский 📌
https://t.me/UchuEnglish Английский с нуля
Математика 📌
https://t.me/Pomatematike Канал по математике
https://t.me/phis_mat Обучающие видео, книги по Физике и Математике
Excel лайфхак📌
https://t.me/Excel_lifehack
https://t.me/tikon_1 Новости высоких технологий, науки и техники💡
https://t.me/mir_teh Мир технологий (Technology World)
Вакансии 📌
https://t.me/sysadmin_rabota Системный Администратор
https://t.me/progjob Вакансии в IT
Помеченные операторы (break и continue):
Улучшите читаемость управления потоком с помощью меток.
👉@BookJava
Улучшите читаемость управления потоком с помощью меток.
loop:
for (int i = 0; i < 10; i++) {
if (i == 5) {
break loop; // Exit the loop labeled 'loop'
}
System.out.println(i);
}
👉@BookJava
Spring Boot с SAML2 и Keycloak
Эта статья научит вас, как использовать аутентификацию SAML2 с Spring Boot и Keycloak. Security Assertion Markup Language (SAML) — это стандарт для обмена данными об аутентификации и авторизации между поставщиком удостоверений (IdP) и поставщиком услуг. Это протокол на основе XML, который использует токены безопасности с информацией о субъекте. В настоящее время SAML менее популярен, чем OICD (OpenID Connect), но еще не устарел. На самом деле, многие организации до сих пор используют SAML для единого входа (SSO).
https://piotrminkowski.com/2024/10/28/spring-boot-with-saml2-and-keycloak/
👉@BookJava
Эта статья научит вас, как использовать аутентификацию SAML2 с Spring Boot и Keycloak. Security Assertion Markup Language (SAML) — это стандарт для обмена данными об аутентификации и авторизации между поставщиком удостоверений (IdP) и поставщиком услуг. Это протокол на основе XML, который использует токены безопасности с информацией о субъекте. В настоящее время SAML менее популярен, чем OICD (OpenID Connect), но еще не устарел. На самом деле, многие организации до сих пор используют SAML для единого входа (SSO).
https://piotrminkowski.com/2024/10/28/spring-boot-with-saml2-and-keycloak/
👉@BookJava
🗓 6 ноября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework» от Otus.
На вебинаре разберем:
🔗 Ссылка на регистрацию: https://vk.cc/cDxCWy
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Deprecated Event
В статье рассматривается новое событие в JDK 22 для JFR, позволяющее отслеживать вызовы устаревших методов. Это полезно для определения зависимостей в сторонних библиотеках, которые используют методы, планируемые к удалению, такие как методы Security Manager. Такое отслеживание позволяет заранее обновить библиотеки, что может сократить технический долг и упростить переход на актуальные версии библиотек и инструментов.
https://egahlin.github.io/2024/05/31/deprecated-event.html
👉@BookJava
В статье рассматривается новое событие в JDK 22 для JFR, позволяющее отслеживать вызовы устаревших методов. Это полезно для определения зависимостей в сторонних библиотеках, которые используют методы, планируемые к удалению, такие как методы Security Manager. Такое отслеживание позволяет заранее обновить библиотеки, что может сократить технический долг и упростить переход на актуальные версии библиотек и инструментов.
public class API {
public static void enableLogging(boolean enable) {
AccessController.doPrivileged(new PrivilegedAction<Void>() {
public Void run() {
System.setProperty("log", String.valueOf(enable));
return null;
}
});
}
public static void runTask(Runnable task) {
try {
task.run();
} catch (ThreadDeath td) {
System.out.println("Task stopped.");
}
}
}
public class Service {
public static void log(String message) {
String shouldLog = System.getProperty("log", "true");
if (new Boolean("log")) {
System.out.print(message);
}
}
}
https://egahlin.github.io/2024/05/31/deprecated-event.html
👉@BookJava
Тестовое собеседование на Middle Java-разработчика завтра
Заходи завтра, 30 октября в 19:00 по мск, на открытое онлайн-собеседование от ШОРТКАТ, чтобы узнать:
— Чего ждут от кандидатов на Middle позиции в Java-разработке
— Какие вопросы задают на интервью и зачем
— Как подготовиться к собесу, чтобы получить оффер
Интервью проведёт Илья Аров — ведущий разработчик программного обеспечения в T1, ВТБ ID
Чтобы записаться на эфир, переходи в бот → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqumLTg8
Заходи завтра, 30 октября в 19:00 по мск, на открытое онлайн-собеседование от ШОРТКАТ, чтобы узнать:
— Чего ждут от кандидатов на Middle позиции в Java-разработке
— Какие вопросы задают на интервью и зачем
— Как подготовиться к собесу, чтобы получить оффер
Интервью проведёт Илья Аров — ведущий разработчик программного обеспечения в T1, ВТБ ID
Чтобы записаться на эфир, переходи в бот → @shortcut_sh_bot
Реклама. ООО "ШОРТКАТ", ИНН: 9731139396, erid: 2VtzqumLTg8
Совет💡
До Hibernate 6 для правильной настройки требовалось установить правильный dialect для используемой БД. Начиная с версии 6 это больше не требуется. Теперь Hibernate 6 определяет правильный Dialect на основе JDBC URL и JDBC Metadata.
https://docs.jboss.org/hibernate/orm/6.3/javadocs/org/hibernate/cfg/JdbcSettings.html#DIALECT
👉@BookJava
До Hibernate 6 для правильной настройки требовалось установить правильный dialect для используемой БД. Начиная с версии 6 это больше не требуется. Теперь Hibernate 6 определяет правильный Dialect на основе JDBC URL и JDBC Metadata.
https://docs.jboss.org/hibernate/orm/6.3/javadocs/org/hibernate/cfg/JdbcSettings.html#DIALECT
👉@BookJava
🗓 7 ноября в 20:00 МСК
🆓 Бесплатно. Урок в рамках старта курса «Java Developer. Advanced» от Otus.
В современной инфраструктуре всё чаще используются облачные решения, в которых контроль используемых ресурсов напрямую влияет на затраты бизнеса. Поэтому все способы экономии ресурсов важны. Тут на помощь придёт GraalVM!
Но является ли это панацеей?
На вебинаре разберем:
🔗 Ссылка на регистрацию: https://vk.cc/cDMvBB
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
Please open Telegram to view this post
VIEW IN TELEGRAM
Три быстрых способа отображения Java-объектов в пользовательском интерфейсе
В процессе разработки часто наступает момент, когда необходимо быстро отобразить на экране структуры данных в удобочитаемом формате. Во время разработки отладчики часто предоставляют красивое древовидное представление объектов данных, которое помогает визуализировать структуру. Создать нечто подобное для пользовательского интерфейса вручную, конечно, можно, но во многих случаях это слишком дорого - особенно в случае быстрой разработки приложений (RAD) или внутренних бизнес-приложений.
Сегодня генеративный ИИ может создавать достойные визуализации, но на ранних этапах разработки более идеальным было бы полностью динамическое решение.
https://vaadin.com/blog/three-quick-ways-to-display-your-java-objects-in-the-ui
👉@BookJava
В процессе разработки часто наступает момент, когда необходимо быстро отобразить на экране структуры данных в удобочитаемом формате. Во время разработки отладчики часто предоставляют красивое древовидное представление объектов данных, которое помогает визуализировать структуру. Создать нечто подобное для пользовательского интерфейса вручную, конечно, можно, но во многих случаях это слишком дорого - особенно в случае быстрой разработки приложений (RAD) или внутренних бизнес-приложений.
Сегодня генеративный ИИ может создавать достойные визуализации, но на ранних этапах разработки более идеальным было бы полностью динамическое решение.
https://vaadin.com/blog/three-quick-ways-to-display-your-java-objects-in-the-ui
👉@BookJava
Media is too big
VIEW IN TELEGRAM
Spring – эволюция или революция!? | Spring АйО Подкаст №1
В первом выпуске подкаста Spring АйО в студии собрались 4 эксперта сообщества, чтобы попытаться раз и навсегда ответить на вопрос, чем же для нас стал Spring – эволюцией или революцией?
––––– Таймкоды –––––
00:00:00 – Всем привет!
00:00:28 – Какими были ваши первые ощущения от Spring?
00:01:14 – В чём секрет популярности Spring?
00:02:56 – Существует ли Spring без Boot?
00:05:30 – Победил ли Spring?
00:07:08 – А что с другими DI-фреймворками?
00:10:15 – Spring Native – таблетка от всех проблем?
00:14:30 – Что должно быть bean, а что нет?
00:22:10 – Как правильно внедрять зависимость?
00:26:20 – Что там со Spring Data, Михаил?
00:34:19 – AI заменит StackOverflow и Baeldung?
00:36:20 – Не становится ли Spring слишком сложным?
00:39:50 – Почему документация Spring так плоха?
00:41:23 – Есть ли рудименты в Spring?
00:43:28 – Зашел ли в тупик реактивный стек?
00:52:20 – Тупеют ли разработчики из-за Spring?
01:00:42 – В чём разница между сеньором сейчас и 10 лет назад?
01:03:40 – Java/Spring – самое удобное, что есть в этом мире?
01:05:08 – Почему Java так сильно тормозит?
01:08:43 – Чего нам не хватает в Spring?
01:18:00 – Как законтрибьютить в Spring?
01:24:15 – На чём зарабатывает Spring?
01:27:12 – Что делать после открытия Pull Request?
01:30:22 – Всем спасибо!
источник
👉@BookJava
В первом выпуске подкаста Spring АйО в студии собрались 4 эксперта сообщества, чтобы попытаться раз и навсегда ответить на вопрос, чем же для нас стал Spring – эволюцией или революцией?
––––– Таймкоды –––––
00:00:00 – Всем привет!
00:00:28 – Какими были ваши первые ощущения от Spring?
00:01:14 – В чём секрет популярности Spring?
00:02:56 – Существует ли Spring без Boot?
00:05:30 – Победил ли Spring?
00:07:08 – А что с другими DI-фреймворками?
00:10:15 – Spring Native – таблетка от всех проблем?
00:14:30 – Что должно быть bean, а что нет?
00:22:10 – Как правильно внедрять зависимость?
00:26:20 – Что там со Spring Data, Михаил?
00:34:19 – AI заменит StackOverflow и Baeldung?
00:36:20 – Не становится ли Spring слишком сложным?
00:39:50 – Почему документация Spring так плоха?
00:41:23 – Есть ли рудименты в Spring?
00:43:28 – Зашел ли в тупик реактивный стек?
00:52:20 – Тупеют ли разработчики из-за Spring?
01:00:42 – В чём разница между сеньором сейчас и 10 лет назад?
01:03:40 – Java/Spring – самое удобное, что есть в этом мире?
01:05:08 – Почему Java так сильно тормозит?
01:08:43 – Чего нам не хватает в Spring?
01:18:00 – Как законтрибьютить в Spring?
01:24:15 – На чём зарабатывает Spring?
01:27:12 – Что делать после открытия Pull Request?
01:30:22 – Всем спасибо!
источник
👉@BookJava