Forwarded from Amplicode
🤩 Amplicode – идеальное дополнение к IntelliJ IDEA Ultimate. Огромный гайд для Spring-разработчика
Все уже прекрасно понимают, что Amplicode — неотъемлемая часть тулинга для разработки в OpenIDE, IntelliJ IDEA Community Edition и GigaIDE на Spring Boot.
Но стоит установить Amplicode в IntelliJ IDEA Ultimate и ваша, казалось бы, идеальная IDE станет ещё мощнее и удобнее!
Реклама. ООО "ХОУЛМОНТ". ИНН 6316134393. erid: 2W5zFJqCMHz
📚 Подробнее читайте на Хабре: https://habr.com/ru/companies/haulmont/articles/952644/
Все уже прекрасно понимают, что Amplicode — неотъемлемая часть тулинга для разработки в OpenIDE, IntelliJ IDEA Community Edition и GigaIDE на Spring Boot.
Но стоит установить Amplicode в IntelliJ IDEA Ultimate и ваша, казалось бы, идеальная IDE станет ещё мощнее и удобнее!
Реклама. ООО "ХОУЛМОНТ". ИНН 6316134393. erid: 2W5zFJqCMHz
📚 Подробнее читайте на Хабре: https://habr.com/ru/companies/haulmont/articles/952644/
🔥4❤2👍1
👍5🔥2
🏗 Объектная модель без боли: как превратить хаос требований в стройную архитектуру
📅 11 декабря | 20:00 мск | бесплатно
🎓 На вебинаре разберём:
– Как анализировать бизнес-требования и выделять ключевые сущности
– Как находить связи между объектами и формировать целостную модель системы
– Как использовать UML-диаграммы для визуализации архитектуры
– Типичные ошибки при анализе предметной области и как их избежать
– Практический кейс: создаём объектную модель с нуля
💡 Кому будет полезно:
– Backend и FullStack разработчикам, желающим понимать архитектуру на уровне сущностей и связей
– Системным аналитикам, формализующим требования и сценарии взаимодействия
– Архитекторам, строящим масштабируемые и устойчивые модели систем
– Начинающим инженерам, осваивающим объектно-ориентированный анализ
✅ После вебинара вы сможете:
– Анализировать предметную область и выделять главные сущности
– Строить понятные и расширяемые объектные модели
– Использовать UML-диаграммы для визуализации архитектуры
– Превращать сложные требования в структурированные проектные решения
💥 Регистрируйтесь и научитесь мыслить как архитектор: https://vk.cc/cRTBMy
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы освоите DDD, CQRS, Event Storming и научитесь превращать требования в надёжную архитектуру, готовую к росту продукта и команды. 🚀
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
📅 11 декабря | 20:00 мск | бесплатно
🎓 На вебинаре разберём:
– Как анализировать бизнес-требования и выделять ключевые сущности
– Как находить связи между объектами и формировать целостную модель системы
– Как использовать UML-диаграммы для визуализации архитектуры
– Типичные ошибки при анализе предметной области и как их избежать
– Практический кейс: создаём объектную модель с нуля
💡 Кому будет полезно:
– Backend и FullStack разработчикам, желающим понимать архитектуру на уровне сущностей и связей
– Системным аналитикам, формализующим требования и сценарии взаимодействия
– Архитекторам, строящим масштабируемые и устойчивые модели систем
– Начинающим инженерам, осваивающим объектно-ориентированный анализ
✅ После вебинара вы сможете:
– Анализировать предметную область и выделять главные сущности
– Строить понятные и расширяемые объектные модели
– Использовать UML-диаграммы для визуализации архитектуры
– Превращать сложные требования в структурированные проектные решения
💥 Регистрируйтесь и научитесь мыслить как архитектор: https://vk.cc/cRTBMy
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы освоите DDD, CQRS, Event Storming и научитесь превращать требования в надёжную архитектуру, готовую к росту продукта и команды. 🚀
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
👍2🔥2❤1
Что будет результатом кода?
Anonymous Quiz
3%
Ошибка компиляции
7%
3
6%
null
84%
IndexOutOfBoundsException
👍5
3 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.
Как это будет:
Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.
Переходи в нашего бота, чтобы получить ссылку на эфир → @shortcut_sh_bot
Реклама.
О рекламодателе.
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤1
Что будет результатом запуска приложения?
Anonymous Quiz
42%
Пользователь будет создан, транзакция успешно откроется и закроется.
41%
Пользователь будет создан, но метод выполнится без транзакции.
8%
TransactionRequiredException
9%
BeanCreationException
Что будет результатом запуска и обращения на /orders?
Anonymous Quiz
8%
4xx Ошибка
12%
5хх Ошибка
67%
Ошибка компиляции
13%
RuntimeException
👍4❤2
В видеопроекте Road to Highload разработчик ядра Яндекс Диска Андрей Колнооченко рассказывает, как проектировать и развивать базы данных так, чтобы они оставались стабильными и быстрыми даже при росте QPS и объёма данных.
Разберём реальные примеры и обсудим типичные ошибки и подходы, которые помогают избежать проблем с производительностью и консистентностью. Особое внимание уделим согласованности кода и данных в БД для предотвращения проблем с race conditions, которые часто возникают при росте нагрузки.
Road to Highload — это цикл видео от Яндекс 360 о том, как строятся системы, которыми ежедневно пользуются миллионы людей и тысячи компаний. Здесь говорят о highload и отказоустойчивости не по учебникам, а на основе многолетнего опыта разработки.
Смотрите проект, чтобы узнать, как создаются одни из крупнейших облачных сервисов в России:
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍2🔥2
Как остановить поток?
В Java поток представлен классом Thread. В нём есть метод stop(), но пользоваться им нельзя, метод помечен как deprecated. Такая жесткая остановка моментально возвращает все захваченные потоком мониторы, и защищенные ими данные могут оказаться в неконсистентном состоянии.
Разработчики рекомендуют вместо этого использовать флаг, который будет показывать о намерении остановить поток. Флаг выставляется извне потока, а внутри проверяется в подходящий момент. Если нужно остановиться, поток просто выходит из метода run(). В качестве такого флага подойдет переменная типа AtomicBoolean.
Когда в потоке используются блокирующие операции, обычно для определенного типа операции существует свой способ её прервать. Например, можно закрыть сокет, на котором поток ожидает. Для большинства блокирующих операций сработает метод Thread.interrupt(). С его помощью можно прервать Object.wait() и операции из NIO.
Останется только правильно обработать такое прерывание. Прерванный wait() выбросит InterruptedException, Selector.select() вернет результат. Чтобы отличить осознанное прерывание с целью завершить тред от какого-либо другого, его обработку всё ещё необходимо снабдить проверкой флага.
Подписывайся на наш канал в Max🟪
В Java поток представлен классом Thread. В нём есть метод stop(), но пользоваться им нельзя, метод помечен как deprecated. Такая жесткая остановка моментально возвращает все захваченные потоком мониторы, и защищенные ими данные могут оказаться в неконсистентном состоянии.
Разработчики рекомендуют вместо этого использовать флаг, который будет показывать о намерении остановить поток. Флаг выставляется извне потока, а внутри проверяется в подходящий момент. Если нужно остановиться, поток просто выходит из метода run(). В качестве такого флага подойдет переменная типа AtomicBoolean.
Когда в потоке используются блокирующие операции, обычно для определенного типа операции существует свой способ её прервать. Например, можно закрыть сокет, на котором поток ожидает. Для большинства блокирующих операций сработает метод Thread.interrupt(). С его помощью можно прервать Object.wait() и операции из NIO.
Останется только правильно обработать такое прерывание. Прерванный wait() выбросит InterruptedException, Selector.select() вернет результат. Чтобы отличить осознанное прерывание с целью завершить тред от какого-либо другого, его обработку всё ещё необходимо снабдить проверкой флага.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍7❤2🔥1
Приведите примеры использования fork/join framework
Как следует из названий связанных классов, ForkJoinPool используется для рекурсивных задач. Это такие задачи, которые можно делить на порции, подзадачи. Отделение подзадачи – это операция fork, финальная агрегация результатов подзадач – join.
Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом ForkJoinPool не потребуется. Метод parallelSetAll из класса Arrays применяет fork/join для генерации элементов массива; parallelPrefix для модификации; parallelSort для сортировки.
Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример:
Arrays.stream(new int[]{1, 2, 3, 4}).parallel().sum();
Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные RecursiveTask, RecursiveAction, или Spliterator.
Подписывайся на наш канал в Max🟪
Как следует из названий связанных классов, ForkJoinPool используется для рекурсивных задач. Это такие задачи, которые можно делить на порции, подзадачи. Отделение подзадачи – это операция fork, финальная агрегация результатов подзадач – join.
Реализация fork/join для самых популярных общих случаев уже есть в стандартной библиотеке, работать непосредственно с классом ForkJoinPool не потребуется. Метод parallelSetAll из класса Arrays применяет fork/join для генерации элементов массива; parallelPrefix для модификации; parallelSort для сортировки.
Фреймворк неявно работает и в параллельных стримах. В этом случае логику fork определяет его сплитератор, а join выполняют потоковые операции. Классический пример:
Arrays.stream(new int[]{1, 2, 3, 4}).parallel().sum();
Существуют целые категории частных задач, решения которых хорошо параллелизуются: векторные операции, работа с графами, поиск данных. Для специфичных задач придется реализовывать собственные RecursiveTask, RecursiveAction, или Spliterator.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
❤2👍1🔥1
Как реализовать двусторонний обмен данными между потоками?
Вопрос, который зачастую дается в виде практической задачи. Конечно, результата можно добиться разными способами: парой атомарных переменных, критическими секциями, потокобезопасными коллекциями. Но полезно знать, что специально для этого случая в стандартной библиотеке java.util.concurrent есть простой класс Exchanger.
Класс содержит единственный метод V exchange(V x). Один поток передает в него данные, и встает в ожидание. Ожидание завершается, когда второй поток также приходит в метод exchange со своей порцией информации. В качестве результата вызова потоки получают данные друг друга.
На основе класса Exchanger удобно создавать пайплайны обработки данных. Первый поток выполняет свою часть обработки, и складывает результаты в буфер. В качестве буфера может работать любой многоразовый объект-контейнер. Когда он заполняется, следующий поток обменивает его на второй, пустой буфер. Таким образом два буфера используются поочередно, не выделяется лишний раз память и не нагружается GC. Далее из попарно обменивающихся буферами потоков может строиться длинная многопоточная цепочка обработки.
Подписывайся на наш канал в Max🟪
Вопрос, который зачастую дается в виде практической задачи. Конечно, результата можно добиться разными способами: парой атомарных переменных, критическими секциями, потокобезопасными коллекциями. Но полезно знать, что специально для этого случая в стандартной библиотеке java.util.concurrent есть простой класс Exchanger.
Класс содержит единственный метод V exchange(V x). Один поток передает в него данные, и встает в ожидание. Ожидание завершается, когда второй поток также приходит в метод exchange со своей порцией информации. В качестве результата вызова потоки получают данные друг друга.
На основе класса Exchanger удобно создавать пайплайны обработки данных. Первый поток выполняет свою часть обработки, и складывает результаты в буфер. В качестве буфера может работать любой многоразовый объект-контейнер. Когда он заполняется, следующий поток обменивает его на второй, пустой буфер. Таким образом два буфера используются поочередно, не выделяется лишний раз память и не нагружается GC. Далее из попарно обменивающихся буферами потоков может строиться длинная многопоточная цепочка обработки.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥10👍5
Builder — это порождающий паттерн, который позволяет пошагово создавать сложные объекты. Вместо того чтобы создавать объект одним большим конструктором с множеством параметров, Builder организует процесс создания по частям, обеспечивая гибкость и читаемость кода.
Использование:
Преимущества:
Недостатки:
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍6🔥4❤2🤨1
Что такое функциональный интерфейс?
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса Object также игнорируется.
Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией @FunctionalInterface. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции.
Типичные примеры функциональных интерфейсов: Callable, Supplier, Comparable.
Подписывайся на наш канал в Max🟪
Так называется специальная разновидность интерфейса, который определяет тип-функцию, коллбэк.
Чтобы компилятор считал интерфейс функциональным, этот интерфейс должен добавлять единственный абстрактный метод. Вдобавок он может содержать любое количество дефолтных методов с телом. Переобъявление методов класса Object также игнорируется.
Никаких других ограничений на метод не накладывается: он не ограничен в типах аргументов и возвращаемого значения, может иметь любое название и список выбрасываемых исключений (checked и unchecked).
Даже при выполнении всех этих условий, никакие другие разновидности типов кроме interface не могут считаться функциональными интерфейсами.
Дополнительно функциональный интерфейс принято помечать аннотацией @FunctionalInterface. Наличие этой аннотации не необходимо, но оно даёт дополнительную валидацию: её присутствие на нефункциональном типе спровоцирует ошибку компиляции.
Типичные примеры функциональных интерфейсов: Callable, Supplier, Comparable.
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥6👍4
Задачи с собеседований: Проверка, является ли бинарное дерево деревом поиска (middle)
— Как определить, является ли заданное бинарное дерево деревом поиска (BST)?
📌 Ключевые моменты:
- Бинарное дерево поиска (BST) — это бинарное дерево, в котором для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше.
- Для проверки можно использовать рекурсивный подход с отслеживанием допустимых диапазонов значений для каждого узла.
- Как изменить реализацию для работы с любыми типами данных в узлах дерева?
Реализация с числами в узлах на картинке👆
Подписывайся на наш канал в Max🟪
— Как определить, является ли заданное бинарное дерево деревом поиска (BST)?
- Бинарное дерево поиска (BST) — это бинарное дерево, в котором для каждого узла все значения в левом поддереве меньше значения узла, а все значения в правом поддереве больше.
- Для проверки можно использовать рекурсивный подход с отслеживанием допустимых диапазонов значений для каждого узла.
- Как изменить реализацию для работы с любыми типами данных в узлах дерева?
Реализация с числами в узлах на картинке
Подписывайся на наш канал в Max
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2❤1
⚡️ Потоковые приложения с Apache Kafka: от событий к реальному времени
📅 16 декабря | 20:00 мск | бесплатно
🎓 На вебинаре разберём:
– Что такое потоковая обработка и чем она отличается от пакетной
– Как устроена Apache Kafka и почему она стала основой real-time архитектур
– Ключевые паттерны: Event Sourcing, Pub/Sub, CQRS
– Как проектировать и развернуть потоковый конвейер событий
– Как интегрировать Kafka с микросервисами и внешними системами
💡 Кому будет полезно:
– Backend-разработчикам, работающим с событийными системами
– DevOps-инженерам, отвечающим за масштабирование и мониторинг Kafka
– Архитекторам ПО, проектирующим real-time решения
– Системным аналитикам, изучающим потоки данных и событийные модели
✅ После вебинара вы сможете:
– Проектировать потоковые приложения и пайплайны в Kafka
– Встраивать Kafka в микросервисную архитектуру
– Использовать проверенные паттерны для построения систем реального времени
💥 Регистрируйтесь и прокачайте навык проектирования real-time систем: https://vk.cc/cS8OL3
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы освоите DDD, CQRS, Event Storming, Event Sourcing и научитесь создавать архитектуры, готовые к миллионам событий в секунду. 🚀
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
📅 16 декабря | 20:00 мск | бесплатно
🎓 На вебинаре разберём:
– Что такое потоковая обработка и чем она отличается от пакетной
– Как устроена Apache Kafka и почему она стала основой real-time архитектур
– Ключевые паттерны: Event Sourcing, Pub/Sub, CQRS
– Как проектировать и развернуть потоковый конвейер событий
– Как интегрировать Kafka с микросервисами и внешними системами
💡 Кому будет полезно:
– Backend-разработчикам, работающим с событийными системами
– DevOps-инженерам, отвечающим за масштабирование и мониторинг Kafka
– Архитекторам ПО, проектирующим real-time решения
– Системным аналитикам, изучающим потоки данных и событийные модели
✅ После вебинара вы сможете:
– Проектировать потоковые приложения и пайплайны в Kafka
– Встраивать Kafka в микросервисную архитектуру
– Использовать проверенные паттерны для построения систем реального времени
💥 Регистрируйтесь и прокачайте навык проектирования real-time систем: https://vk.cc/cS8OL3
Занятие приурочено к старту курса «Архитектура и шаблоны проектирования», где вы освоите DDD, CQRS, Event Storming, Event Sourcing и научитесь создавать архитектуры, готовые к миллионам событий в секунду. 🚀
Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576, www.otus.ru
👍2🔥2❤1