Как выглядят будни разработчиков управляемых БД, S3 и CDN в стартапе внутри big tech?
Слушайте в подкасте «Расскажите про MWS». В новом выпуске мы беседуем с Дмитрием Черёмухиным, руководителем направления Data Platform в MWS.
Обсудим, без каких сервисов не может существовать ни одно современное облако, какие команды их разрабатывают и с какими сложностями они сталкиваются. И самое важное, то, о чём все мечтают, — прекрасный green field, в котором все так хотели поработать.
Смотрите и слушайте на всех популярных площадках:
🎬 YouTube
🎬 VK Видео
🎧 Яндекс Музыка
🎧 Apple Podcasts
🎧 Mave Digital
Слушайте в подкасте «Расскажите про MWS». В новом выпуске мы беседуем с Дмитрием Черёмухиным, руководителем направления Data Platform в MWS.
Обсудим, без каких сервисов не может существовать ни одно современное облако, какие команды их разрабатывают и с какими сложностями они сталкиваются. И самое важное, то, о чём все мечтают, — прекрасный green field, в котором все так хотели поработать.
Смотрите и слушайте на всех популярных площадках:
🎬 YouTube
🎬 VK Видео
🎧 Яндекс Музыка
🎧 Apple Podcasts
🎧 Mave Digital
🌐 JTS Topology Suite — мощная Java-библиотека для работы с геометрией. Проект предоставляет инструменты для создания и манипуляции векторной геометрией, включая пространственные операции. Входит в рабочую группу LocationTech Eclipse Foundation и служит основой для многих GIS-решений.
В комплекте идёт TestBuilder с GUI для визуализации геометрии и тестирования функций. Библиотека особенно полезна разработчикам GIS-приложений систем пространственного анализа. На базе JTS построены популярные порты для C++, .NET и JavaScript.
🤖 GitHub
@javatg
В комплекте идёт TestBuilder с GUI для визуализации геометрии и тестирования функций. Библиотека особенно полезна разработчикам GIS-приложений систем пространственного анализа. На базе JTS построены популярные порты для C++, .NET и JavaScript.
🤖 GitHub
@javatg
🔥5❤1👍1
Инструмент доступен для использования двумя способами: в виде Spring Boot стартера для Spring Boot приложений и в виде отдельной библиотеки для приложений, которые используют Reactor Netty HTTP Server напрямую. Настройка простая: достаточно подключить зависимость в проект и добавить файл logback-access.xml с Logback конфигурацией access-логов (appender, encoder, pattern).
🤖 GitHub
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
❤4👍1🔥1
This media is not supported in your browser
VIEW IN TELEGRAM
🔥 Совет дня: преобразование списка в `Map` за 1 строчку с Java Streams
Хочешь из списка сделать
📌 Удобно для:
— подсчёта повторов
— агрегации данных
— замены SQL
@javatg
Хочешь из списка сделать
Map
, где ключ — объект, а значение — частота его появления? Без циклов — через Stream:
import java.util.*;
import java.util.stream.*;
public class FrequencyCount {
public static void main(String[] args) {
List<String> items = List.of("apple", "banana", "apple", "orange", "banana", "apple");
Map<String, Long> freq = items.stream()
.collect(Collectors.groupingBy(e -> e, Collectors.counting()));
System.out.println(freq);
// 👉 {orange=1, banana=2, apple=3}
}
}
📌 Удобно для:
— подсчёта повторов
— агрегации данных
— замены SQL
GROUP BY
@javatg
👍19❤11🥰2
⚠️ Чем опасен Scheduled(fixedRate) без Transactional в Spring?
Многие используют
👎 Проблема:
Если метод выполняется дольше, чем интервал
Результат — дублирование обработки, гонки, порча данных.
Пример:
💥 Через 10 секунд начнёт работать следующий вызов, даже если первый ещё не закончен.
✅ Решение: обернуть в @Transactional и использовать блокировки:
📌 Также можно:
— использовать fixedDelay вместо fixedRate — он ждёт окончания предыдущей задачи
— добавить флаг locked, чтобы явно помечать уже взятые задачи
— заменить @Scheduled на более надёжные инструменты:
🔹 Spring Batch — для сложных задач
🔹 Spring Integration / Camunda — если нужны гарантии и retry
🔹 Quartz — если важны очередь и контроль запуска
🔧 Не упирайтесь в @Scheduled, если задача критична к повторной обработке.
@javatg
Многие используют
@Scheduled
для запуска задач по таймеру, но забывают об одной критичной вещи — транзакциях. Особенно если указан fixedRate
.👎 Проблема:
Если метод выполняется дольше, чем интервал
fixedRate
, запускается второй поток, который снова возьмёт те же данные. Результат — дублирование обработки, гонки, порча данных.
Пример:
@Scheduled(fixedRate = 10_000)
public void cleanUp() {
List<Job> jobs = jobRepository.findAllByStatus(PENDING);
jobs.forEach(job -> {
job.setStatus(PROCESSING);
jobRepository.save(job);
});
}
💥 Через 10 секунд начнёт работать следующий вызов, даже если первый ещё не закончен.
✅ Решение: обернуть в @Transactional и использовать блокировки:
@Transactional
@Scheduled(fixedRate = 10_000)
public void cleanUp() {
List<Job> jobs = jobRepository.findAllByStatusForUpdate(PENDING);
...
}
📌 Также можно:
— использовать fixedDelay вместо fixedRate — он ждёт окончания предыдущей задачи
— добавить флаг locked, чтобы явно помечать уже взятые задачи
— заменить @Scheduled на более надёжные инструменты:
🔹 Spring Batch — для сложных задач
🔹 Spring Integration / Camunda — если нужны гарантии и retry
🔹 Quartz — если важны очередь и контроль запуска
🔧 Не упирайтесь в @Scheduled, если задача критична к повторной обработке.
@javatg
👍18❤2🔥2🥰1😱1
🧱 Maven vs. ⚡️Gradle — что выбрать разработчику?
Когда речь заходит о сборке Java-проектов, чаще всего выбор стоит между двумя фреймворками: Maven и Gradle. Оба стали стандартом в индустрии, но у каждого — свои сильные и слабые стороны. Разбираем, кому что подойдёт 👇
🔹 Maven — стабильная классика:
✅ Строгая структура: легко читать и сопровождать
✅ Надёжность и предсказуемость сборки
✅ Много плагинов и готовых решений
⚠️ XML-конфигурация громоздкая
⚠️ Медленнее по сравнению с Gradle
🔸 Gradle — гибкость и скорость:
✅ Поддержка Kotlin и Groovy DSL
✅ Инкрементальные сборки и кэширование
✅ Гибкий подход к конфигурации
⚠️ Порог входа выше
⚠️ Сложности с отладкой настроек
📌 Вывод:
🔷 Выбирай Maven, если важны стабильность, читаемость и простота
🔶 Выбирай Gradle, если хочешь максимум производительности и гибкости
💬 В крупных проектах Gradle становится всё популярнее, особенно с Kotlin.
Но в enterprise-среде Maven по-прежнему остаётся стандартом.
А ты чем пользуешься? Делись в комментариях ⬇️
@javatg
Когда речь заходит о сборке Java-проектов, чаще всего выбор стоит между двумя фреймворками: Maven и Gradle. Оба стали стандартом в индустрии, но у каждого — свои сильные и слабые стороны. Разбираем, кому что подойдёт 👇
🔹 Maven — стабильная классика:
✅ Строгая структура: легко читать и сопровождать
✅ Надёжность и предсказуемость сборки
✅ Много плагинов и готовых решений
⚠️ XML-конфигурация громоздкая
⚠️ Медленнее по сравнению с Gradle
🔸 Gradle — гибкость и скорость:
✅ Поддержка Kotlin и Groovy DSL
✅ Инкрементальные сборки и кэширование
✅ Гибкий подход к конфигурации
⚠️ Порог входа выше
⚠️ Сложности с отладкой настроек
📌 Вывод:
🔷 Выбирай Maven, если важны стабильность, читаемость и простота
🔶 Выбирай Gradle, если хочешь максимум производительности и гибкости
💬 В крупных проектах Gradle становится всё популярнее, особенно с Kotlin.
Но в enterprise-среде Maven по-прежнему остаётся стандартом.
А ты чем пользуешься? Делись в комментариях ⬇️
@javatg
👍9❤3🥰1
🧩 Java‑задача для тех, кто не боится `Concurrency` и `Immutable`
Представьте, что вы пишете in-memory кеш конфигураций. У вас есть
🔹 Загружать конфигурации из базы (эмулируется `loadConfigFromDB()`)
🔹 Раздавать *текущую* версию конфигурации многопоточным клиентам
🔹 Давать 100% thread‑safety и 0 блокировок
🔹 Позволять hot‑reload без блокировки клиентов
🔹 Гарантировать, что ни один поток никогда не увидит "смешанную" конфигурацию
🔧 Что нужно сделать:
Реализуйте
1. Конфигурация всегда была консистентной
2. Потоки не блокировали друг друга
3. Обновления конфигурации были моментальными и безопасными
📦 Пример API:
🧠 Хитрость: нельзя использовать synchronized, volatile массивы, CopyOnWrite, ReentrantLock, и т.п. — только атомарность и неизменяемость.
🚀 Challenge accepted?
@javatg
Представьте, что вы пишете in-memory кеш конфигураций. У вас есть
ConfigService
, который должен:🔹 Загружать конфигурации из базы (эмулируется `loadConfigFromDB()`)
🔹 Раздавать *текущую* версию конфигурации многопоточным клиентам
🔹 Давать 100% thread‑safety и 0 блокировок
🔹 Позволять hot‑reload без блокировки клиентов
🔹 Гарантировать, что ни один поток никогда не увидит "смешанную" конфигурацию
🔧 Что нужно сделать:
Реализуйте
ConfigService
, который использует AtomicReference<Config>
и `Immutable`-объекты, чтобы:1. Конфигурация всегда была консистентной
2. Потоки не блокировали друг друга
3. Обновления конфигурации были моментальными и безопасными
📦 Пример API:
class ConfigService {
public Config getCurrentConfig(); // read-only, вызывается часто
public void reload(); // обновить конфиг, редко
}
🧠 Хитрость: нельзя использовать synchronized, volatile массивы, CopyOnWrite, ReentrantLock, и т.п. — только атомарность и неизменяемость.
🚀 Challenge accepted?
@javatg
❤7👍4🤔2🎉1
Java Совет 💡
Как понять, что Java‑код мог быть сгенерирован ИИ?
▪ Если вы видите в коде
А
📌 Документация:
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html#toList()
@javatg
#java #tip
Как понять, что Java‑код мог быть сгенерирован ИИ?
▪ Если вы видите в коде
Collectors.toList()
, а не Stream.toList()
— это явный намёк 😉Stream.toList()
появился только в Java 16. А
Collectors.toList()
— с нами ещё с Java 8, поэтому его до сих пор полно в туториалах, на Stack Overflow и во всех датасетах, на которых обучают ИИ.📌 Документация:
https://docs.oracle.com/en/java/javase/17/docs/api/java.base/java/util/stream/Stream.html#toList()
@javatg
#java #tip
👍15🤯6❤3🔥2😁2🤔2
🔥 БЕСПЛАТНЫЙ КУРС ПО СОЗДАНИЮ НЕЙРО-СОТРУДНИКОВ НА GPT И ДРУГИХ LLM 🔥
Ищете практический и углубленный курс, чтобы освоить создание нейро-сотрудников? Мы создали курс из 5 объемных занятий. Это именно то, что нужно, чтобы прокачать свои навыки абсолютно бесплатно!
📌 Темы занятий:
1. Введение в мир нейро-сотрудников
2. Как работают LLM и их аналоги
3. Создание базы знаний для нейро-сотрудника (RAG)
4. Тестирование и отладка нейро-сотрудников
5. Интеграция нейро-сотрудников в Production
Вот 5 тем курса - он максимально простой и доступный, общеобразовательный, без какого-либо сложного программирования 📚Прохождение этого курса, скорее всего, займет у вас от 1 до 3 часов
🤖 Присоединяйтесь к нашему бесплатному курсу и разберитесь в этой увлекательной теме с нами!
Ищете практический и углубленный курс, чтобы освоить создание нейро-сотрудников? Мы создали курс из 5 объемных занятий. Это именно то, что нужно, чтобы прокачать свои навыки абсолютно бесплатно!
📌 Темы занятий:
1. Введение в мир нейро-сотрудников
2. Как работают LLM и их аналоги
3. Создание базы знаний для нейро-сотрудника (RAG)
4. Тестирование и отладка нейро-сотрудников
5. Интеграция нейро-сотрудников в Production
Вот 5 тем курса - он максимально простой и доступный, общеобразовательный, без какого-либо сложного программирования 📚Прохождение этого курса, скорее всего, займет у вас от 1 до 3 часов
🤖 Присоединяйтесь к нашему бесплатному курсу и разберитесь в этой увлекательной теме с нами!
😁3
🧠 Продвинутая задача Java — Невидимая утечка памяти в лямбдах
Задача:
Предположим, вы пишете сервис, в котором создаются задачи (например, отложенные действия):
Теперь создайте 1_000_000 таких задач:
Вопрос:
Почему
Разбор:
На первый взгляд,
Но на самом деле лямбда-захват переменной
Это называется неявная утечка памяти через замыкания.
---
Как исправить?
Чтобы избежать утечки, выносите только нужные значения в лямбду:
Или даже:
НО! Убедитесь, что переменные вне лямбды не держат в памяти тяжёлые объекты, которые не нужны после исполнения.
💡 Вывод:
- Java лямбды могут неявно захватывать контекст, включая большие объекты
- Это может привести к утечкам памяти, особенно в long-lived объектах (пулы задач, слушатели и т.п.)
- Профилируйте и проверяйте, что захватывает ваша лямбда
#java #memoryleak #lambda #gc #profiling
@javatg
Задача:
Предположим, вы пишете сервис, в котором создаются задачи (например, отложенные действия):
public class TaskScheduler {
private final List<Runnable> tasks = new ArrayList<>();
public void scheduleTask(String name) {
String largeData = name.repeat(10_000); // имитируем большой объект
tasks.add(() -> {
System.out.println("Running task: " + name);
});
}
public void runAll() {
tasks.forEach(Runnable::run);
}
}
Теперь создайте 1_000_000 таких задач:
TaskScheduler scheduler = new TaskScheduler();
for (int i = 0; i < 1_000_000; i++) {
scheduler.scheduleTask("Task" + i);
}
Вопрос:
Почему
String largeData
не освобождается сборщиком мусора, хотя он нигде явно не используется?Разбор:
На первый взгляд,
largeData
нигде не используется — его можно было бы освободить. Но на самом деле лямбда-захват переменной
name
удерживает весь стек метода scheduleTask
, включая largeData
.Это называется неявная утечка памяти через замыкания.
---
Как исправить?
Чтобы избежать утечки, выносите только нужные значения в лямбду:
public void scheduleTask(String name) {
String taskName = name; // только то, что действительно нужно
tasks.add(() -> {
System.out.println("Running task: " + taskName);
});
}
Или даже:
tasks.add(() -> System.out.println("Running task: " + name));
НО! Убедитесь, что переменные вне лямбды не держат в памяти тяжёлые объекты, которые не нужны после исполнения.
💡 Вывод:
- Java лямбды могут неявно захватывать контекст, включая большие объекты
- Это может привести к утечкам памяти, особенно в long-lived объектах (пулы задач, слушатели и т.п.)
- Профилируйте и проверяйте, что захватывает ваша лямбда
#java #memoryleak #lambda #gc #profiling
@javatg
👍17❤5🤔5🔥2
🧩 Java‑задача для тех, кто не боится `Concurrency` и `Immutable`
Представьте, что вы пишете in-memory кеш конфигураций. У вас есть
🔹 Загружать конфигурации из базы (эмулируется `loadConfigFromDB()`)
🔹 Раздавать *текущую* версию конфигурации многопоточным клиентам
🔹 Давать 100% thread‑safety и 0 блокировок
🔹 Позволять hot‑reload без блокировки клиентов
🔹 Гарантировать, что ни один поток никогда не увидит "смешанную" конфигурацию
🔧 Что нужно сделать:
Реализуйте
1. Конфигурация всегда была консистентной
2. Потоки не блокировали друг друга
3. Обновления конфигурации были моментальными и безопасными
📦 Пример API:
🧠 Хитрость: нельзя использовать synchronized, volatile массивы, CopyOnWrite, ReentrantLock, и т.п. — только атомарность и неизменяемость.
@javatg
Представьте, что вы пишете in-memory кеш конфигураций. У вас есть
ConfigService
, который должен:🔹 Загружать конфигурации из базы (эмулируется `loadConfigFromDB()`)
🔹 Раздавать *текущую* версию конфигурации многопоточным клиентам
🔹 Давать 100% thread‑safety и 0 блокировок
🔹 Позволять hot‑reload без блокировки клиентов
🔹 Гарантировать, что ни один поток никогда не увидит "смешанную" конфигурацию
🔧 Что нужно сделать:
Реализуйте
ConfigService
, который использует AtomicReference<Config>
и `Immutable`-объекты, чтобы:1. Конфигурация всегда была консистентной
2. Потоки не блокировали друг друга
3. Обновления конфигурации были моментальными и безопасными
📦 Пример API:
class ConfigService {
public Config getCurrentConfig(); // read-only, вызывается часто
public void reload(); // обновить конфиг, редко
}
🧠 Хитрость: нельзя использовать synchronized, volatile массивы, CopyOnWrite, ReentrantLock, и т.п. — только атомарность и неизменяемость.
@javatg
👍4🔥2❤1
📱 Inure — необычный файловый менеджер для Android с открытым исходным кодом. Этот проект выделяется полностью кастомным интерфейсом, поддержкой Material You и встроенным терминалом.
Приложение разрабатывается одним человеком, но уже попало в подборки лучших open-source решений для Android. Оно работает как на рутированных устройствах, так и через Shizuku, предлагая продвинутый анализ установленных приложений.
🤖 GitHub
@javatg
Приложение разрабатывается одним человеком, но уже попало в подборки лучших open-source решений для Android. Оно работает как на рутированных устройствах, так и через Shizuku, предлагая продвинутый анализ установленных приложений.
🤖 GitHub
@javatg
👍5🔥2🥰2❤1🤔1
📢 Выходцы из Jetbrains запилили годноту для Java/Kotlin-разработчиков.
Стартап называется ❇️ Explyt.
Они только что выкатили мощный релиз.
Вкратце: это плагин в IDE, который сам генерирует тесты с интересными возможностями:
✔️ Vibe debugging. За счет интеграции с IDE, плагин собирает данные по исполнению программы и генерирует тест по этим данным, что экономит время на тестировании и отлавливает ошибки на 80-90% (!)
✔️ Агентский режим. Ассистент, который живёт в проекте и следит за покрытием, сам находит незакрытые места и предлагает тесты. Работает в фоне, как часть команды.
👉 Кому интересно - вот ссылка на релиз и установку плагина
Стартап называется ❇️ Explyt.
Они только что выкатили мощный релиз.
Вкратце: это плагин в IDE, который сам генерирует тесты с интересными возможностями:
✔️ Vibe debugging. За счет интеграции с IDE, плагин собирает данные по исполнению программы и генерирует тест по этим данным, что экономит время на тестировании и отлавливает ошибки на 80-90% (!)
✔️ Агентский режим. Ассистент, который живёт в проекте и следит за покрытием, сам находит незакрытые места и предлагает тесты. Работает в фоне, как часть команды.
👉 Кому интересно - вот ссылка на релиз и установку плагина
👍6
This media is not supported in your browser
VIEW IN TELEGRAM
💡 Хардкорный совет для Linux-админов:
Найди процессы, которые держат удалённые бинарники — те, что были уже удалены с диска, но всё ещё выполняются.
Это частая причина "почему не очищается диск", даже после rm — потому что процесс использует файл, которого уже "нет".
sudo lsof +L1 | grep -E 'DEL|deleted'
!!!🧟♂️ Процессы с удалёнными файлами (Zombie binaries detector)
Иногда вы обновили бинарник, перезапустили systemd-сервис — а старый процесс всё ещё в фоне и держит старую версию (в том числе уязвимую).
Чтобы освободить место и память: завершите процесс вручную.
#linux #debug #sysadmin #filesystem #devops
@javatg
Найди процессы, которые держат удалённые бинарники — те, что были уже удалены с диска, но всё ещё выполняются.
Это частая причина "почему не очищается диск", даже после rm — потому что процесс использует файл, которого уже "нет".
sudo lsof +L1 | grep -E 'DEL|deleted'
!!!🧟♂️ Процессы с удалёнными файлами (Zombie binaries detector)
Иногда вы обновили бинарник, перезапустили systemd-сервис — а старый процесс всё ещё в фоне и держит старую версию (в том числе уязвимую).
Чтобы освободить место и память: завершите процесс вручную.
#linux #debug #sysadmin #filesystem #devops
@javatg
👍6❤3🔥2
🌐 dnsjava — DNS-клиент и сервер на Java. Эта библиотека предлагает полную реализацию DNS-протокола с поддержкой современных стандартов — от DNSSEC и EDNS0 до TSIG-аутентификации. Проект позволяет не только выполнять запросы, но и организовывать трансфер зон, динамические обновления и даже разворачивать авторитативный сервер.
Инструмент имеет встроенный механизм валидации DNSSEC через
🤖 GitHub
@javatg
Инструмент имеет встроенный механизм валидации DNSSEC через
ValidatingResolver
и гибкая система конфигурации через системные свойства. Поддерживает Java 8+ и может заменять стандартный DNS-резолвер JVM. 🤖 GitHub
@javatg
❤11👍4🔥4
🚀 Хочешь быстро разобраться, как использовать GraphQL с Spring Boot?
📦 Репозиторий содержит набор готовых микросервисов на Spring Boot, каждый из которых показывает разные аспекты интеграции с GraphQL: от простых запросов до работы с subscriptions и federated схемами.
Что внутри:
- 📌 Примеры с использованием Spring Boot 3 и GraphQL Java
- 🔗 Демонстрация схемы Federation с Apollo Gateway
- ☁️ Микросервисная архитектура + Docker Compose
- ⚙️ Использование Spring Data и JPA с GraphQL
- 🔄 Примеры запросов и мутаций через GraphiQL
Полезно как для новичков в GraphQL, так и для разработчиков, строящих продвинутые API на Spring Boot. Всё собрано и работает из коробки.
👉 Репозиторий: https://github.com/piomin/sample-spring-boot-graphql
@javatg
📦 Репозиторий содержит набор готовых микросервисов на Spring Boot, каждый из которых показывает разные аспекты интеграции с GraphQL: от простых запросов до работы с subscriptions и federated схемами.
Что внутри:
- 📌 Примеры с использованием Spring Boot 3 и GraphQL Java
- 🔗 Демонстрация схемы Federation с Apollo Gateway
- ☁️ Микросервисная архитектура + Docker Compose
- ⚙️ Использование Spring Data и JPA с GraphQL
- 🔄 Примеры запросов и мутаций через GraphiQL
Полезно как для новичков в GraphQL, так и для разработчиков, строящих продвинутые API на Spring Boot. Всё собрано и работает из коробки.
👉 Репозиторий: https://github.com/piomin/sample-spring-boot-graphql
@javatg
👍7❤3🥰2
🚀 Kotlin-Result — функциональный подход к обработке ошибок. Библиотека предлагает монаду Result для Kotlin, вдохновлённую решениями из Rust и Haskell. Позволяет явно разделять успешный результат (
Проект имеет zero-overhead реализацию через inline-классы и поддержку корутин. Подходит для проектов, где важна предсказуемость и читаемость кода обработки ошибок.
🤖 GitHub
@javatg
Ok
) и ошибку (Err
), избегая исключений и null-значений. Проект имеет zero-overhead реализацию через inline-классы и поддержку корутин. Подходит для проектов, где важна предсказуемость и читаемость кода обработки ошибок.
🤖 GitHub
@javatg
🔥6❤2👍2
🔍 jclasslib — мощный инструмент для глубокого анализа и модификации Java-байткода. Это полноценный редактор, позволяющий напрямую изменять констант-пул и инструкции байткода через удобный графический интерфейс.
Проект сочетает desktop-приложение для визуальной работы и Kotlin Multiplatform библиотеку для программного взаимодействия с class-файлами. Поддерживает работу с JAR-архивами, предлагает темную тему и локализации на несколько языков.
🤖 GitHub
@javatg
Проект сочетает desktop-приложение для визуальной работы и Kotlin Multiplatform библиотеку для программного взаимодействия с class-файлами. Поддерживает работу с JAR-архивами, предлагает темную тему и локализации на несколько языков.
🤖 GitHub
@javatg
👍5❤2🔥1