Telegram Web Link
🧩 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
⚡️ Почему лучшие разработчики всегда на шаг впереди?

Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.

ИИ: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Devops: www.tg-me.com/DevOPSitsec
Базы данных: www.tg-me.com/sqlhub
Мл собес www.tg-me.com/machinelearning_interview
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
МЛ: www.tg-me.com/machinelearning_ru
Data Science: www.tg-me.com/data_analysis_ml
Javascript: www.tg-me.com/javascriptv
C#: www.tg-me.com/csharp_ci
Java: www.tg-me.com/java_library
Python собеседования: www.tg-me.com/python_job_interview
Мобильная разработка: www.tg-me.com/mobdevelop
Golang: www.tg-me.com/Golang_google
React: www.tg-me.com/react_tg
Rust: www.tg-me.com/rust_code
ИИ: www.tg-me.com/vistehno
PHP: www.tg-me.com/phpshka
Android: www.tg-me.com/android_its
Frontend: www.tg-me.com/front
Big Data: www.tg-me.com/bigdatai
МАТЕМАТИКА: www.tg-me.com/data_math
Kubernets: www.tg-me.com/kubernetc
Разработка игр: https://www.tg-me.com/gamedev
Физика: www.tg-me.com/fizmat
SQL: www.tg-me.com/databases_tg

Папка Go разработчика: www.tg-me.com/addlist/MUtJEeJSxeY2YTFi
Папка Python разработчика: www.tg-me.com/addlist/eEPya-HF6mkxMGIy
Папка ML: https://www.tg-me.com/addlist/2Ls-snqEeytkMDgy
Папка FRONTEND: https://www.tg-me.com/addlist/mzMMG3RPZhY2M2Iy

🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno

🖥 Chatgpt для кода в тг: @Chatgpturbobot -

📕Ит-книги: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
💼ИТ-вакансии www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi

Подпишись, чтобы всегда знать, куда двигаться дальше!
Please open Telegram to view this post
VIEW IN TELEGRAM
👍2🔥2
📖 Bootique — легковесный фреймворк для Java-приложений. Этот проект предлагает альтернативу традиционным JavaEE-контейнерам, позволяя создавать автономные приложения с минимальной конфигурацией. С Bootique можно разрабатывать REST-сервисы, веб-приложения и фоновые задачи, которые запускаются как обычные команды.

Основанный на принципе dependency injection, фреймворк особенно удобен для микросервисов. Достаточно добавить нужные модули через Maven и написать класс с main()-методом — приложение готово к работе без сложных настроек.

🤖 GitHub

@javatg
🔥7👍43
🖥 ОГРОМНАЯ обучающая база по Java на русском языке — настоящая золотая жила для тех, кто хочет освоить один из самых востребованных языков в IT.

Это не просто курс — это полноценный путь от абсолютного нуля до уровня, пригодного для поиска работы.

Вы пройдёте всё: от основ языка и ООП до современных фреймворков, паттернов проектирования и реальных практик разработки.

🔹 Что внутри:

🟡 Полный путь обучения языку: синтаксис, концепции, архитектура, best practices
🟡 Ключевые алгоритмы и паттерны решения задач — с примерами и объяснениями
🟡 Множество видеоразборов сложных тем и реальных кейсов
🟡 Практика на каждом шагу: упражнения разного уровня сложности после каждой лекции
🟡 Проект живёт с 2018 года и постоянно обновляется — вместе с новыми версиями Java, Spring, инструментами и подходами

Здесь вы не просто выучите Java — вы станете настоящим базированным разработчиком.

🚀 Становимся гуру Java здесь

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
18👍3🔥2🤔1
👨‍💻 Sentry для Java/Android — мониторинг ошибок в реальном времени. Этот инструмент помогает разработчикам быстро находить и исправлять ошибки в Java и Android-приложениях.

Инструмент отслеживает не только краши, но и проблемы производительности, интегрируясь с популярными библиотеками вроде Spring Boot и OkHttp. Он будет особенно полезен для команд, которые хотят улучшить стабильность мобильных и серверных приложений без лишнего ручного тестирования. Поддерживает нативный код через NDK.

🤖 GitHub

@javatg
5👍3🔥3
🧩 Задача:


public static void main(String[] args) {
Integer a = 127;
Integer b = 127;
Integer c = 128;
Integer d = 128;

System.out.println(a == b); // ?
System.out.println(c == d); // ?
System.out.println(c.equals(d)); // ?
}
}


Что выведет программа?
🧠 Подвох:
Многие ожидают:


true
true
true

Но на самом деле Java напечатает:


true
false
true


🧠 Объяснение:
В Java значения Integer от -128 до 127 кэшируются (Integer Cache). То есть Integer.valueOf(127) возвращает один и тот же объект.

a == b → true потому что 127 в диапазоне кэширования.

c == d → false потому что 128 не кэшируется, создаются разные объекты.

.equals() сравнивает значения, поэтому c.equals(d) → true.

Урок:
Никогда не сравнивай Integer, Long, Boolean и другие объекты-обёртки через ==. Используй .equals().

@javatg
👍395🤔3🔥1🥰1
This media is not supported in your browser
VIEW IN TELEGRAM
Linux: как быстро найти, какой процесс использует порт?

Иногда нужно понять, кто "держит" нужный порт — особенно при отладке сервисов или настройки nginx, Docker и так далее. Вместо ручного перебора — используйте lsof

Вот команда, которая покажет вам пи ай ди, имя процесса и даже имя пользователя, который занял порт:

Работает на любом Unix-подобном дистрибутиве. Замените <порт> на нужное значение — и сразу увидите виновника конфликта.

sudo lsof -i :<порт>

пример:

sudo lsof -i :5432
👍13🔥53
2025/09/13 09:47:47
Back to Top
HTML Embed Code: