🚀 В Spring Boot можно точечно отключать ненужную автоконфигурацию через аннотацию
**@SpringBootApplication(exclude = …)**.
Это удобно, когда в проекте есть своя кастомная конфигурация, которая конфликтует с дефолтной, или когда вы хотите убрать лишние автоматические настройки и контролировать поведение вручную.
Так вы оставляете только нужные части автоконфигурации и избегаете скрытых конфликтов.
#SpringBoot #JavaDev
**@SpringBootApplication(exclude = …)**.
Это удобно, когда в проекте есть своя кастомная конфигурация, которая конфликтует с дефолтной, или когда вы хотите убрать лишние автоматические настройки и контролировать поведение вручную.
Так вы оставляете только нужные части автоконфигурации и избегаете скрытых конфликтов.
#SpringBoot #JavaDev
❤7👍6
📌 Durable Execution Engine на SQLite:
• Durable Execution (DE) - это подход, который позволяет выполнять длинные многошаговые процессы так, чтобы после сбоя можно было продолжить с последнего успешного шага, а не запускать всё заново.
• В статье показан простой Proof of Concept - Persistasaurus: лёгкий DE-движок на Java, который использует SQLite как хранилище состояния.
• Потоки (flows) пишутся как обычный Java-код: методы помечаются аннотациями
• Идея не новая, но современная Java + SQLite позволяют сделать удивительно компактное и понятное решение без тяжёлой инфраструктуры.
Почему это полезно:
• Упрощает работу с долгоживущими процессами
• Избавляет от повторных вычислений и экономит ресурсы
• Подходит для прототипов, внутренних сервисов и задач средней сложности
Что учитывать:
• Это только прототип - для реальных больших систем нужно масштабирование, отказоустойчивость, параллелизм и дополнительные инструменты
• SQLite отлично подходит для простых сценариев, но не для высоконагруженных распределённых систем
🔗 Читаем тут: morling.dev/blog/building-durable-execution-engine-with-sqlite/
• Durable Execution (DE) - это подход, который позволяет выполнять длинные многошаговые процессы так, чтобы после сбоя можно было продолжить с последнего успешного шага, а не запускать всё заново.
• В статье показан простой Proof of Concept - Persistasaurus: лёгкий DE-движок на Java, который использует SQLite как хранилище состояния.
• Потоки (flows) пишутся как обычный Java-код: методы помечаются аннотациями
@Flow и @Step, а их прогресс автоматически сохраняется. Если процесс падает, можно безопасно перезапустить его без повторного выполнения шагов.• Идея не новая, но современная Java + SQLite позволяют сделать удивительно компактное и понятное решение без тяжёлой инфраструктуры.
Почему это полезно:
• Упрощает работу с долгоживущими процессами
• Избавляет от повторных вычислений и экономит ресурсы
• Подходит для прототипов, внутренних сервисов и задач средней сложности
Что учитывать:
• Это только прототип - для реальных больших систем нужно масштабирование, отказоустойчивость, параллелизм и дополнительные инструменты
• SQLite отлично подходит для простых сценариев, но не для высоконагруженных распределённых систем
🔗 Читаем тут: morling.dev/blog/building-durable-execution-engine-with-sqlite/
❤6👍4
Как создать эффективное REST API или оптимизировать его? Что сделать для ускорения Redis? Какие секреты скрываются под капотом Android? Что делать при конфликте стилей в микрофронтендах? Что поможет провести продуктивное кросс-ревью в команде?
Своим опытом в самых разных сферах делятся frontend-разработчики, системные аналитики, разработчики под Android и iOS из команды ПСБ.
Читайте в блоге ПСБ на Хабре, делитесь в комментариях своим мнением и опытом!
Своим опытом в самых разных сферах делятся frontend-разработчики, системные аналитики, разработчики под Android и iOS из команды ПСБ.
Читайте в блоге ПСБ на Хабре, делитесь в комментариях своим мнением и опытом!
❤4
Forwarded from Kali Linux
🔥 Server Survival: Стройте облачную инфраструктуру!
Играйте в интерактивную 3D-симуляцию, где вы - облачный архитектор. Стройте и масштабируйте облачную инфраструктуру, защищаясь от DDoS-атак и управляя бюджетом. Цель — выжить как можно дольше, обрабатывая легитимный трафик и избегая потерь репутации.
🚀Основные моменты:
- Управление бюджетом и репутацией.
- Разные типы трафика: веб, API и мошеннический.
- Режимы игры: выживание и песочница для экспериментов.
- Улучшение сервисов для повышения производительности.
- Интуитивное управление и визуальная обратная связь.
📌 GitHub: https://github.com/pshenok/server-survival
Играйте в интерактивную 3D-симуляцию, где вы - облачный архитектор. Стройте и масштабируйте облачную инфраструктуру, защищаясь от DDoS-атак и управляя бюджетом. Цель — выжить как можно дольше, обрабатывая легитимный трафик и избегая потерь репутации.
🚀Основные моменты:
- Управление бюджетом и репутацией.
- Разные типы трафика: веб, API и мошеннический.
- Режимы игры: выживание и песочница для экспериментов.
- Улучшение сервисов для повышения производительности.
- Интуитивное управление и визуальная обратная связь.
📌 GitHub: https://github.com/pshenok/server-survival
❤8
💡 Java совет:
Начиная с Java 19, можно использовать *виртуальные потоки* - лёгкие потоки, которые управляются самой JVM, а не операционной системой.
Что это даёт:
- можно запускать тысячи и даже миллионы задач без нагрузки на ОС
- проще писать высоконагруженные приложения без сложной асинхронности
- более понятный и чистый код по сравнению с CompletableFuture и callback-подходами
Виртуальные потоки — главный шаг Java к масштабируемой конкурентности.
#Java #JavaDev
Начиная с Java 19, можно использовать *виртуальные потоки* - лёгкие потоки, которые управляются самой JVM, а не операционной системой.
Что это даёт:
- можно запускать тысячи и даже миллионы задач без нагрузки на ОС
- проще писать высоконагруженные приложения без сложной асинхронности
- более понятный и чистый код по сравнению с CompletableFuture и callback-подходами
Виртуальные потоки — главный шаг Java к масштабируемой конкурентности.
#Java #JavaDev
👍7❤5🔥5👎1
This media is not supported in your browser
VIEW IN TELEGRAM
🧠JAVA ИСПОЛЬЗУЙ TREESET ПРАВИЛЬНО #java
Если в Java нужно убрать дубликаты из списка и отсортировать элементы - используй TreeSet. Он автоматически удаляет повторяющиеся значения и сортирует их либо по естественному порядку, либо по кастомному правилу через Comparator.
Если в Java нужно убрать дубликаты из списка и отсортировать элементы - используй TreeSet. Он автоматически удаляет повторяющиеся значения и сортирует их либо по естественному порядку, либо по кастомному правилу через Comparator.
Естественный порядок
List<String> colors = Arrays.asList("red", "green", "red", "orange", "turquoise");
Set<String> colorsSet = new TreeSet<>(colors);
for (String color : colorsSet) {
System.out.println(color);
}
Сортировка по длине строки
Comparator<String> byLength = Comparator.comparingInt(String::length);
Set<String> sortedSet = new TreeSet<>(byLength);
sortedSet.addAll(colors);
for (String color : sortedSet) {
System.out.println(color);
}
👍8❤3👎3
💡 Java совет: рекурсивная обработка файлов с Files.walk()
Если нужно пройтись по всем файлам в директории и её подкаталогах, не пиши рекурсию вручную — используй
Пример: найти все `.java`-файлы в проекте
Почему это хороший подход:
- Рекурсивный обход «из коробки»
- Работает через Stream API
- Легко фильтровать, маппить и агрегировать
- Автоматически закрывает ресурсы (try-with-resources)
Полезно для:
- анализа исходников
- линтеров и кодогенерации
- поиска файлов по расширению
- утилит и dev-скриптов
#Java #IO
Если нужно пройтись по всем файлам в директории и её подкаталогах, не пиши рекурсию вручную — используй
Files.walk().Пример: найти все `.java`-файлы в проекте
Path startPath = Paths.get("src");
try (Stream<Path> paths = Files.walk(startPath)) {
paths
.filter(Files::isRegularFile)
.filter(path -> path.toString().endsWith(".java"))
.forEach(System.out::println);
} catch (IOException e) {
e.printStackTrace();
}
Почему это хороший подход:
- Рекурсивный обход «из коробки»
- Работает через Stream API
- Легко фильтровать, маппить и агрегировать
- Автоматически закрывает ресурсы (try-with-resources)
Полезно для:
- анализа исходников
- линтеров и кодогенерации
- поиска файлов по расширению
- утилит и dev-скриптов
#Java #IO
❤8👍7🔥2👎1
Spring Boot Tip: тестируем REST проще с `RestTestClient` 🚀
В Spring Boot можно легко писать интеграционные тесты для REST-эндпоинтов,
используя `RestTestClient` вместе с аннотацией:
Это автоматически настраивает клиент и позволяет:
- отправлять запросы прямо из тестов
- проверять статус и тело ответа
- работать с объектами, а не “сырым” JSON
Пример
👉 Для TestRestTemplate есть похожая аннотация:
Тесты становятся чище, короче и ближе к реальному поведению API ✨
В Spring Boot можно легко писать интеграционные тесты для REST-эндпоинтов,
используя `RestTestClient` вместе с аннотацией:
@AutoConfigureRestTestClient
Это автоматически настраивает клиент и позволяет:
- отправлять запросы прямо из тестов
- проверять статус и тело ответа
- работать с объектами, а не “сырым” JSON
Пример
Копировать код
@SpringBootTest
@AutoConfigureRestTestClient
public class PersonControllerTests {
private static final String API_PATH = "/persons";
@Test
void add(@Autowired RestTestClient restTestClient) {
restTestClient.post().uri(API_PATH)
.body(Instancio.create(Person.class))
.exchange()
.expectStatus().is2xxSuccessful()
.expectBody(Person.class)
.value(person -> assertNotNull(person.getId()));
}
}
👉 Для TestRestTemplate есть похожая аннотация:
@AutoConfigureTestRestTemplate
Тесты становятся чище, короче и ближе к реальному поведению API ✨
🔥8👍5❤3
Владение Docker - навык, который отличает новичка от профи
Сегодня почти всё разворачивается в контейнерах.
Если ты не умеешь работать с Docker, ты медленнее, зависим от чужих настроек и постоянно ловишь баги «у меня локально работает».
Этот курс покажет:
• разобраны все возможные ошибки при работе c Docker
• как упаковывать проекты в контейнеры
• как поднимать целые системы за минуты
• как избегать типичных ошибок в продакшене
• как делать стабильные и повторяемые окружения
Только практика и реальные кейсы - с нуля до уверенного уровня.
🎁 40 процентов скидка действует 48 часов в честь нового года
👉 Записывайся и сделай Docker своим настоящим рабочим инструментом.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍1🔥1
orElseGet() вместо orElse(), когда значение считать дорогоМногие пишут так:
User user = cache.find(id).orElse(createDefaultUser());
Проблема: createDefaultUser() выполнится всегда,
даже если пользователь нашёлся в кэше.
Правильнее так:
User user = cache.find(id).orElseGet(() -> createDefaultUser());
💡 В чём фишка
orElse() сначала вызывает аргумент, потом проверяет Optional
orElseGet() вызывает лямбду только если значение пустое
📌 Когда это особенно важно
- создание объектов «по умолчанию» дорогое
- требуется загрузка из БД/сети
- есть тяжёлая сериализация или вычисления
Please open Telegram to view this post
VIEW IN TELEGRAM
👍10❤7🔥4
Есть простой принцип, который часто ломают.
peek() — не для логики. Его задача — подсмотреть, что проходит по конвейеру, и помочь отладке.
Пример — посмотреть, как меняются данные по шагам:
list.stream()
.filter(x -> x > 10)
.peek(x -> System.out.println("Filter: " + x))
.map(x -> x * 2)
.peek(x -> System.out.println("Map: " + x))
.toList();
Вот, как это работает:
- filter() — отбрасывает лишнее
- peek() — просто печатает, ничего не меняя
- map() — преобразует значения
Почему важно не класть туда «настоящую» логику:
- peek() могут удалить или отключить
- порядок выполнения потоков может меняться
- код становится хрупким и непредсказуемым
Коротко:
- нужен вывод - используй peek().
- нужна логика - используй map(), filter() и другие операторы.
Please open Telegram to view this post
VIEW IN TELEGRAM
❤5👍4🔥2
🔥 Хочешь прокачаться в аналитике, но не просто читать теорию, а решать реальные задачи?
Мы запустили полностью бесплатный телеграм-тренажёр 👇
Тебя ждут сценарии, с которыми сталкиваются аналитики каждый день: от простых запросов до задач уровня собеседований.
Что внутри:
✔ живые кейсы из реальной практики
✔ удобный симулятор - как работа в компании, только бесплатно
✔ разбор ошибок — понимаешь не только «как», но и «почему»
✔ добавляем задачи с интервью и улучшаем бот вместе с сообществом
Начни тренироваться сегодня — и почувствуй уверенность в работе с данными.
t.me/Analitics_databot
Мы запустили полностью бесплатный телеграм-тренажёр 👇
Тебя ждут сценарии, с которыми сталкиваются аналитики каждый день: от простых запросов до задач уровня собеседований.
Что внутри:
✔ живые кейсы из реальной практики
✔ удобный симулятор - как работа в компании, только бесплатно
✔ разбор ошибок — понимаешь не только «как», но и «почему»
✔ добавляем задачи с интервью и улучшаем бот вместе с сообществом
Начни тренироваться сегодня — и почувствуй уверенность в работе с данными.
t.me/Analitics_databot
❤7👍3🔥2
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 JAVA ПРОЕКТ ЗА 2 МИНУТЫ
Перед стартом делай правильно:
- Gradle/Maven сразу (без ручных jar)
- структура src/main/java + src/test/java
- JUnit + тесты с первого дня
- Checkstyle/Spotless чтобы код-стайл был единый
- .env / config для настроек (не хардкодь URL/ключи)
Так проект не развалится, когда станет больше 2 файлов.
Сохраняй себе это - и используй каждый раз, когда начинаешь новый Java-проект.
Перед стартом делай правильно:
- Gradle/Maven сразу (без ручных jar)
- структура src/main/java + src/test/java
- JUnit + тесты с первого дня
- Checkstyle/Spotless чтобы код-стайл был единый
- .env / config для настроек (не хардкодь URL/ключи)
Так проект не развалится, когда станет больше 2 файлов.
Сохраняй себе это - и используй каждый раз, когда начинаешь новый Java-проект.
# Gradle проект с авто-структурой
mkdir my_java_app && cd my_java_app
gradle init --type java-application --dsl groovy --test-framework junit-jupiter
# быстрый запуск + тесты
./gradlew test
./gradlew run
❤5🔥3👍2
💡Java Совет : Helper-классы - да. “God class” - нет.
Хорошая практика в Java - выносить повторяющуюся логику в helper / utility классы.
Это делает код чище и уменьшает дублирование.
Но есть опасная крайность - God class:
класс, который “умеет всё” и постепенно превращается в помойку.
✅ Правильно (helper класс)
Например
- форматирование текста
- обработка строк
- простые операции над конкретной областью
❌ Плохо (God class)
Типичный
- работа с файлами
- логирование
- бизнес-операции
- управление задачами
- и ещё 20 методов “на всякий случай”
Почему это плохо:
- сложно тестировать
- сложно поддерживать
- сложно менять (ломается всё)
- растёт связанность и хаос
Правило:
Helper-класс должен иметь одну ответственность.
Если класс делает слишком много несвязанных вещей - разбивай на отдельные компоненты.
Хорошая практика в Java - выносить повторяющуюся логику в helper / utility классы.
Это делает код чище и уменьшает дублирование.
Но есть опасная крайность - God class:
класс, который “умеет всё” и постепенно превращается в помойку.
✅ Правильно (helper класс)
Например
TextUtils, который делает только одну вещь:- форматирование текста
- обработка строк
- простые операции над конкретной областью
❌ Плохо (God class)
Типичный
DoThings, где впихнули всё подряд:- работа с файлами
- логирование
- бизнес-операции
- управление задачами
- и ещё 20 методов “на всякий случай”
Почему это плохо:
- сложно тестировать
- сложно поддерживать
- сложно менять (ломается всё)
- растёт связанность и хаос
Правило:
Helper-класс должен иметь одну ответственность.
Если класс делает слишком много несвязанных вещей - разбивай на отдельные компоненты.
❤9👍2
PostgreSQL: архитектура и тюнинг SQL-запросов
Погрузись в архитектуру и прокачай оптимизацию запросов одной из самых популярных open source СУБД – PostgreSQL.
🌐 В программе курса:
🤩 Разберем, как работают СУБД вообще и PostgreSQL в частности: что такое MVCC, ACID, WAL, LRU, PPC/TPC и другие фундаментальные понятия архитектуры баз данных
🤩 Получите теорию и практику EXPLAIN и EXPLAIN ANALYZE на разных типа запросов: без индексов, с индексами, index only, нормализованные и документ-ориентированные данные и json-поля, изменение параметров сессии/конфигурации для ускорения запросов
🤩 Изучите архитектуру хранения данных в PostgreSQL, типы и особенности индексов, а также получите полезные советы и трюки оптимизации БД
🤩 Получите свой собственный выделенный облачный PostgreSQL-сервер (8 vCPU, 12G RAM, 100G NVMe) – предоставляется БЕСПЛАТНО на время обучения + готовый e-commerce датасет TPC-H (миллион пользователей, несколько миллионов заказов на десятки гигабайт)
🗓 Старт курса: 22 января. 5 недель обучения.
Изучить программу и записаться можно здесь.
🤩 Кто мы: R&D-центр Devhands, основатель школы Алексей Рыбак. Автор курса — Николай Ихалайнен, эксперт по СУБД (ex-Percona), со-основатель MyDB, энтузиаст открытого ПО.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqvHatG2
Погрузись в архитектуру и прокачай оптимизацию запросов одной из самых популярных open source СУБД – PostgreSQL.
Изучить программу и записаться можно здесь.
Реклама. ИП Рыбак А.А. ИНН 771407709607 Erid: 2VtzqvHatG2
Please open Telegram to view this post
VIEW IN TELEGRAM
❤6👍3