Telegram Web Link
Как выглядят будни разработчиков управляемых БД, S3 и CDN в стартапе внутри big tech?

Слушайте в подкасте «Расскажите про 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
🔥51👍1
🖥 Logback Access Reactor Netty — управление access-логами для реактивных веб-приложений на Java и Kotlin. Этот проект предоставляет интеграцию популярной Java библиотеки Logback-access с HTTP-сервером Reactor Netty, на которым построен реактивный стек Spring WebFlux.

Инструмент доступен для использования двумя способами: в виде 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

Хочешь из списка сделать 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
👍1911🥰2
⚠️ Чем опасен Scheduled(fixedRate) без Transactional в Spring?

Многие используют @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
👍182🔥2🥰1😱1
🧱 Maven vs. ⚡️Gradle — что выбрать разработчику?

Когда речь заходит о сборке Java-проектов, чаще всего выбор стоит между двумя фреймворками: Maven и Gradle. Оба стали стандартом в индустрии, но у каждого — свои сильные и слабые стороны. Разбираем, кому что подойдёт 👇

🔹 Maven — стабильная классика:

Строгая структура: легко читать и сопровождать
Надёжность и предсказуемость сборки
Много плагинов и готовых решений
⚠️ XML-конфигурация громоздкая
⚠️ Медленнее по сравнению с Gradle

🔸 Gradle — гибкость и скорость:

Поддержка Kotlin и Groovy DSL
Инкрементальные сборки и кэширование
Гибкий подход к конфигурации
⚠️ Порог входа выше
⚠️ Сложности с отладкой настроек

📌 Вывод:

🔷 Выбирай Maven, если важны стабильность, читаемость и простота
🔶 Выбирай Gradle, если хочешь максимум производительности и гибкости

💬 В крупных проектах Gradle становится всё популярнее, особенно с Kotlin.
Но в enterprise-среде Maven по-прежнему остаётся стандартом.

А ты чем пользуешься? Делись в комментариях ⬇️

@javatg
👍93🥰1
🧩 Java‑задача для тех, кто не боится `Concurrency` и `Immutable`

Представьте, что вы пишете 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
🔥21😁75👍4🤔1
Java Совет 💡
Как понять, что 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🤯63🔥2😁2🤔2
🔥 БЕСПЛАТНЫЙ КУРС ПО СОЗДАНИЮ НЕЙРО-СОТРУДНИКОВ НА GPT И ДРУГИХ LLM 🔥

Ищете практический и углубленный курс, чтобы освоить создание нейро-сотрудников? Мы создали курс из 5 объемных занятий. Это именно то, что нужно, чтобы прокачать свои навыки абсолютно бесплатно!

📌 Темы занятий:
1. Введение в мир нейро-сотрудников
2. Как работают LLM и их аналоги
3. Создание базы знаний для нейро-сотрудника (RAG)
4. Тестирование и отладка нейро-сотрудников
5. Интеграция нейро-сотрудников в Production

Вот 5 тем курса - он максимально простой и доступный, общеобразовательный, без какого-либо сложного программирования 📚Прохождение этого курса, скорее всего, займет у вас от 1 до 3 часов

🤖 Присоединяйтесь к нашему бесплатному курсу и разберитесь в этой увлекательной теме с нами!
😁3
Сроки разработки — это социальная конструкция 


@javatg
😁32🥰1
🧠 Продвинутая задача Java — Невидимая утечка памяти в лямбдах

Задача:

Предположим, вы пишете сервис, в котором создаются задачи (например, отложенные действия):


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
👍175🤔5🔥2
🧩 Java‑задача для тех, кто не боится `Concurrency` и `Immutable`

Представьте, что вы пишете 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🔥21
📱 Inure — необычный файловый менеджер для Android с открытым исходным кодом. Этот проект выделяется полностью кастомным интерфейсом, поддержкой Material You и встроенным терминалом.

Приложение разрабатывается одним человеком, но уже попало в подборки лучших open-source решений для Android. Оно работает как на рутированных устройствах, так и через Shizuku, предлагая продвинутый анализ установленных приложений.

🤖 GitHub

@javatg
👍5🔥2🥰21🤔1
📢 Выходцы из Jetbrains запилили годноту для Java/Kotlin-разработчиков.
 
Стартап называется ❇️ 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
👍63🔥2
🌐 dnsjava — DNS-клиент и сервер на Java. Эта библиотека предлагает полную реализацию DNS-протокола с поддержкой современных стандартов — от DNSSEC и EDNS0 до TSIG-аутентификации. Проект позволяет не только выполнять запросы, но и организовывать трансфер зон, динамические обновления и даже разворачивать авторитативный сервер.

Инструмент имеет встроенный механизм валидации 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
👍73🥰2
🚀 Kotlin-Result — функциональный подход к обработке ошибок. Библиотека предлагает монаду Result для Kotlin, вдохновлённую решениями из Rust и Haskell. Позволяет явно разделять успешный результат (Ok) и ошибку (Err), избегая исключений и null-значений.

Проект имеет zero-overhead реализацию через inline-классы и поддержку корутин. Подходит для проектов, где важна предсказуемость и читаемость кода обработки ошибок.

🤖 GitHub

@javatg
🔥62👍2
🔍 jclasslib — мощный инструмент для глубокого анализа и модификации Java-байткода. Это полноценный редактор, позволяющий напрямую изменять констант-пул и инструкции байткода через удобный графический интерфейс.

Проект сочетает desktop-приложение для визуальной работы и Kotlin Multiplatform библиотеку для программного взаимодействия с class-файлами. Поддерживает работу с JAR-архивами, предлагает темную тему и локализации на несколько языков.

🤖 GitHub

@javatg
👍52🔥1
2025/09/14 09:21:46
Back to Top
HTML Embed Code: