Telegram Web Link
🌧️ Camunda 8 — облачная оркестрация бизнес-процессов. Этот open-source стек сочетает в себе движок процессов Zeebe, инструменты для мониторинга и выполнения ручных задач, образуя полноценную платформу для процессного управления.

Особенность инструмента в cloud-native архитектуре: горизонтальное масштабирование, интеграция с Kafka и Kubernetes, отсутствие жесткой привязки к реляционным СУБД. Процессы описываются визуально в BPMN 2.0, а реализовывать их можно практически на любом языке через gRPC-клиенты.

🤖 GitHub

@javatg
Как ускорить разработку ИБ-решений?  
 
🔥 Вебинар 28 мая в 16:00 (мск) — Реальный кейс от Crosstech Solutions Group.
 
Если вы занимаетесь ИТ-продуктами, проектированием архитектуры или руководите разработкой — это приглашение для вас.
 
🔍 Что будет на вебинаре?
Компания Crosstech Solutions Group расскажет, как они создали систему мониторинга и анализа активности в базах данных — от идеи до рабочего продукта.
В центре внимания — Jmix, современная платформа для быстрой разработки бизнес-приложений.
 
📌 Даже если вы никогда не слышали про Jmix — вам будет полезно:
Реальный опыт создания ИБ-системы с нуля.
Как реализовали ролевую модель, отчетность и гибкий конструктор политик.
Демо системы: увидите все в действии.
Ответы на вопросы от команды, которая создавала продукт.
 
🎯 Узнайте, как сэкономить ресурсы и ускорить релиз — без лишнего кода и с максимальной гибкостью.
 
📅 Участие бесплатное — регистрируйтесь сейчас! Не упустите шанс перенять опыт экспертов, которые уже нашли рабочее решение.

#реклама
О рекламодателе
🔐 Feeder — приватный RSS-ридер для Android без синхронизации. Этот open-source инструмент работает полностью локально на устройстве, не отправляя ваши подписки и историю чтения на сторонние серверы.

Проект развивается с 2014 года и сохраняет минималистичную философию: поддержка RSS/Atom/JSONFeed, нотификации о новых статьях и импорт/экспорт через OPML. Недавно добавили экспериментальную поддержку Nostr-лент. Установить можно через F-Droid или собрать вручную (`./gradlew installDebug`).

🤖 GitHub

@javatg
🖥 Java исполняется 30 лет 🎊🎊🎊

Команда Java отмечает это событие шестичасовым прямым эфиром, посвящённым эволюции языка, его глобальному влиянию и формированию его будущего.

💝 Поздравь коллегу

https://www.youtube.com/watch?v=LHHPbI7sYv8

@javatg

#Java #OpenJDK
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥 Самые нужные каналы для Java разработчика, чтобы расти в доходе 💸

Java | Вопросы собесов
Java | Вакансии с удаленкой
Java | LeetCode
Java | Тесты

Подпишись, чтобы не потерять ☝️
🖥 Java — 30 лет!

👍Собрали для вас факты о Java и сделали несколько открыток.

➡️ В 1995 году Java вышла в свет с амбициозным слоганом:
"Write Once, Run Anywhere."
Сегодня, спустя 30 лет, он по-прежнему актуален — и не просто маркетинговая фраза.

Вот 10 крутых фактов о Java, которые доказывают:


🔸 1. Java был создан не для компьютеров


Изначально язык назывался Oak и предназначался для умных телевизоров и микроволновок. Но всё изменилось, когда Sun Microsystems увидела потенциал Java для интернета. В 1995 году Oak стал Java — и начал революцию.

---

🔸 2. Java была первым языком, с которым подружился Netscape

В 90-х Java-апплеты позволяли запускать интерактивный код в браузере. Это был первый шаг к веб-приложениям, задолго до появления React и Angular.

---

🔸 3. Android — тоже Java (почти)

До Kotlin и Jetpack Compose весь Android-код писался на Java. Google создал Dalvik VM, совместимую с Java-синтаксисом. Даже сейчас Java остаётся одним из основных языков в Android-разработке.

---

🔸 4. Java работает в биржах, банках и… спутниках

Крупнейшие финансовые системы (Goldman Sachs, NASDAQ, VISA) используют Java на своих серверах. А ещё Java-код был на борту космического аппарата NASA Deep Space 1.

---

🔸 5. Java запускается более 50 миллиардов раз в день

По оценкам Oracle, JVM стартует 50+ миллиардов раз ежедневно — в приложениях, микросервисах, Android-программах, банках и даже игровых серверах Minecraft.

---

🔸 6. В Java можно писать без `new` и `null`

Благодаря modern-фичам: record, var, sealed, pattern matching, и проектам как Loom (виртуальные потоки) — Java стала элегантнее, лаконичнее и безопаснее.

---

🔸 7. JVM умеет исполнять не только Java

Scala, Kotlin, Groovy, Clojure, Jython — всё это языки, которые работают поверх JVM. Java стала платформой, а не просто языком.

---

🔸 8. Java 21 — это уже не та Java, что в универе

С выпуском Java 21 добавлены:
- Виртуальные потоки (вместо сложного `ExecutorService`)
- Pattern Matching
- Sequenced collections
- Record-массивы
- Scoped values
Теперь Java ближе к Go и Rust по лаконичности, но с тем же надёжным фундаментом.

---

🔸 9. Java — язык с лучшей обратной совместимостью

Код, написанный 20 лет назад, всё ещё компилируется и запускается. Ни один другой язык не может этим похвастаться на таком уровне.

---

🔸 10. Java — не мертва. Она на стероидах

На GitHub Java стабильно в топ-5.
Oracle, RedHat, Amazon, BellSoft, JetBrains — все инвестируют в развитие OpenJDK.
Появляются фреймворки: Quarkus, Micronaut, Helidon — Java теперь быстрая и лёгкая, как Node.js.

@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
JEP 512: Поддержка структурированных массивов в Java

Java готовится к мощному обновлению — структурированные массивы (structured arrays) придут в язык и улучшат работу с плотными, кэш-эффективными структурами данных!

🧬 Что такое структурированные массивы?

Это массивы, где данные объектов хранятся не как ссылки, а в смежной памяти, как в `C`/`C++`/Rust. Это позволяет:
📦 Упаковать данные компактно, без разрывов
🚀 Повысить кэш-локальность и производительность
🔬 Избежать лишних аллокаций и GC overhead

🔧 Пример:


value class Vec3 {
float x, y, z;
}

Vec3[] arr = new Vec3[1000]; // Под капотом — плотно упакованный блок памяти!


📈 Зачем это нужно?

Быстрее в high-performance системах (игры, машинное обучение, базы данных)
Простой способ писать "низкоуровневый" код на Java без перехода на JNI
Поддержка value-классов (Project Valhalla) на новом уровне

📅 Статус и планы:

JEP 512 пока в статусе "Proposed to Target" для Java 23. Это часть большого проекта Valhalla, направленного на улучшение модели памяти и данных в JVM.

💬 Впереди Java с реальными структурами, а не объектами-ссылками. Оптимизация данных выходит на новый уровень!

📖 Подробнее: https://openjdk.org/jeps/512

@javatg
🧠 Java-задача: "Immutable? Не совсем…"

📜 Условие:

У тебя есть якобы *immutable* класс:


public class Point {
public final int x;
public final int y;

public Point(int x, int y) {
this.x = x;
this.y = y;
}
}


И следующий код:


public class Main {
static Point shared;

public static void main(String[] args) throws InterruptedException {
Thread writer = new Thread(() -> {
shared = new Point(1, 2);
});

Thread reader = new Thread(() -> {
Point p = shared;
if (p != null) {
System.out.println("x = " + p.x + ", y = " + p.y);
}
});

writer.start();
writer.join();
reader.start();
reader.join();
}
}


Вопрос:

1. Могут ли быть выведены "x = 1, y = 0" или даже "x = 0, y = 0"?
2. Почему? x и y ведь final — разве этого недостаточно?
3. Как гарантировать корректность и видимость всех полей в многопоточной среде?

⚠️ Подвох:

- В Java Memory Model (`JMM`) даже `final` поля не дают полной гарантии видимости, если объект передаётся между потоками без синхронизации.
- Поток reader может увидеть частично сконструированный объект:
- Конструктор не завершился, а shared уже указывает на объект.
- Это не баг JVM, а результат слабых гарантий JMM без синхронизации.

Правильный ответ:

Да, такой результат возможенreader может увидеть x = 1, y = 0, или даже x = 0, y = 0.

🛡️ Как защититься:

- Сделать shared volatile, или
- Передавать объект через synchronized блоки, Lock, AtomicReference, CountDownLatch, Thread-safe очередь, и т.д.


static volatile Point shared;


🎯 Чему учит задача:

• Знание Java Memory Model (JMM)
• Понимание, что final != synchronized
• Почему даже "immutable" объекты могут стать "опасно mutating"
• Умение писать багоустойчивый многопоточный код

@javatg
🧱 Собираем OpenJDK сами? Лови инструменты от Blackslate!

Если ты хочешь *собрать свою версию OpenJDK* или поэкспериментировать с оптимизациями JVM — тебе сюда:
👉 [Полный список тулов от Blackslate](https://www.blackslate.io/tech-stack/tools-to-build-openjdk)

🔧 Что внутри:
• [JDKBuild](https://github.com/blackslateio/jdkbuild) — фреймворк для сборки JDK из исходников, поддерживает разные версии и платформы.
Builder Docker Images — набор docker-контейнеров, уже готовых к сборке JDK.
Patch Tools — инструменты для управления патчами к JDK, удобно тестировать свои изменения.
Releases — собранные дистрибутивы, если не хочешь собирать сам.

🔥 Особенности:
• Много версий: от Java 8 до Java 21
• Локальная и CI/CD сборка
• Поддержка кастомных патчей и расширений
• Кроссплатформенность: Linux, macOS, Windows

👨‍🔧 Идеально, если ты:
• Тюнишь JVM под свой продукт
• Создаёшь минималистичный JDK под контейнеры
• Хочешь изучить, как всё устроено внутри

https://www.blackslate.io/tech-stack/tools-to-build-openjdk

@javatg
⚙️ Какие инструменты нужны, чтобы собрать OpenJDK?

OpenJDK — это не просто Java. Это сложный проект на C++, Bash, Autoconf и make-файлах. Чтобы собрать его из исходников, одного JDK недостаточно.

🧰 Вот ключевые инструменты, необходимые для сборки OpenJDK:

🛠️ Boot JDK — для сборки вам нужен уже установленный JDK (на одну версию младше).
🧱 Build system — OpenJDK использует make и autoconf.
🧪 Toolchain — компиляторы (GCC или Clang), утилиты вроде zip, unzip, tar, bash, awk.
🐧 Build OS — Linux предпочтителен, но поддерживаются и macOS/Windows.
⚙️ Доп. инструментыfreetype, cups, alsa, devtoolset (для старых OS), pkg-config.

💡 Подсказка: для большинства Linux-дистрибутивов можно установить всё необходимое с помощью system package manager.

🧪 Пример команды:

sudo apt install build-essential autoconf zip unzip \
libx11-dev libxext-dev libxrender-dev libxtst-dev \
libxt-dev libasound2-dev libcups2-dev libfreetype6-dev


🔗 Полный список и инструкции:
https://www.blackslate.io/tech-stack/tools-to-build-openjdk

Сборка OpenJDK — это крутой способ заглянуть под капот Java-машины. Если ты девелопер уровня "пощупать байт-код" — это must try.

@javatg
Большие данные — большие возможности!

🚀 Хотите освоить Spark и научиться разрабатывать продвинутые ML-модели, анализировать временные ряды и строить мощные data-архитектуры?

Курс «Spark Developer» от OTUS — это практический путь к глубинному пониманию Spark. Вы научитесь запускать Spark в Hadoop и Kubernetes, разрабатывать коннекторы, обрабатывать потоковые и табличные данные, а также настраивать мониторинг Spark-приложений.

Наши преподаватели – практикующие эксперты, а диплом OTUS ценится в ведущих компаниях.

После обучения вы сможете разрабатывать Spark-приложения, интегрировать их с различными источниками данных и запускать их в продакшн.Пора действовать!

➡️ Пройдите вступительное тестирование и воспользуйтесь скидкой на обучение по промокоду Early_Spark_5 (до 10 июня включительно): https://tglink.io/428ad13ecce1?erid=2W5zFGVsaBi

#реклама
О рекламодателе
📡 TM-SGNL — Android-приложение для анализа сигналов слежки

Разработано независимым журналистом Micah Lee, это Android-приложение помогает обнаруживать возможные попытки слежки через радиочастотные сигналы. Основано на идеи мониторинга внезапных всплесков в радиодиапазоне, когда телефон переходит в активное взаимодействие (например, при включении микрофона, отправке данных и пр.).

🔍 Основные функции:
Детекция RF-активности через внешние RTL-SDR USB-устройства
Визуализация сигналов в режиме спектрограммы
Поддержка анализа GSM, LTE, Wi-Fi и других диапазонов
Не требует root-доступа

📱 Приложение построено на базе Android + USB-хост API, используется совместно с RTL-SDR донглом через OTG. Отлично подойдёт для тех, кто занимается цифровой безопасностью, OSINT, активизмом или просто хочет знать, что происходит в эфире вокруг.

🔗 GitHub: https://github.com/micahflee/TM-SGNL-Android


@javatg
🧠 Задача с подвохом для Java-разработчиков

Что выведет следующий код?


public class ListMystery {
public static void main(String[] args) {
List<String> items = Arrays.asList("Java", "Kotlin", "Scala");
items.set(1, "Groovy");
items.add("Clojure"); // строка №5
System.out.println(items);
}
}


Варианты ответа:

1️⃣ Компилируется, выводит [Java, Groovy, Scala, Clojure]
2️⃣ Ошибка компиляции
3️⃣ Исключение времени выполнения
4️⃣ Выведет [Java, Groovy, Scala] — метод add проигнорирован

💡 Подсказка:
Метод Arrays.asList() не создаёт обычный ArrayList, а возвращает фиксированную обёртку над массивом. Размер менять нельзя.


Ответ: 3


На строке `items.add("Clojure")` выбрасывается `UnsupportedOperationException`.
Чтобы избежать этой ловушки, создавай изменяемый список явно:


List<String> items = new ArrayList<>(Arrays.asList("Java", "Kotlin", "Scala"));



@javatg
🔐 Управление JWT-токенами с помощью библиотеки Auth0 Java JWT

Если ты работаешь с аутентификацией и безопасностью в Java-приложениях, тебе пригодится библиотека от [Auth0](https://github.com/auth0/java-jwt) для работы с JWT.

📌 Что такое JWT?
JWT (JSON Web Token) — это стандарт, позволяющий безопасно передавать данные между участниками как JSON-объекты. Он используется для авторизации, верификации пользователей и обмена данными без сессий.

🧰 Auth0 Java JWT позволяет:
- Генерировать токены с кастомными claim'ами
- Подписывать токены с помощью HMAC или RSA
- Валидировать и декодировать токены
- Проверять срок действия (exp), аудиторию, субъект и прочее

🧪 Пример: генерация токена

Algorithm algorithm = Algorithm.HMAC256("secret");
String token = JWT.create()
.withIssuer("auth0")
.withClaim("userId", 123)
.withExpiresAt(new Date(System.currentTimeMillis() + 3600_000))
.sign(algorithm);


🔍 Проверка и декодирование токена

JWTVerifier verifier = JWT.require(algorithm)
.withIssuer("auth0")
.build();

DecodedJWT jwt = verifier.verify(token);
System.out.println(jwt.getClaim("userId").asInt());


🛡️ Преимущества:
- Простота API
- Хорошая поддержка и документация
- Безопасное управление ключами и подписями

📚 Статья с примерами и пояснениями:
👉 https://www.blackslate.io/articles/manage-jwt-

Если ты пишешь backend на Java и работаешь с авторизацией — эта библиотека точно стоит твоего внимания.

@javatg
Релиз через два дня. Код готов. Почти...
Остались тесты. Ну, точнее — покрытие. Потому что QA уже дышит в затылок, а ты сидишь и выбираешь: спать или корпеть до утра.
Explyt Test умеет создавать тесты под твой код — сам. Быстро. В IDE. Без плясок.
Хочешь, чтобы релиз прошёл, а не пролетел? Попробуй бесплатно! 👉 explyt.ai
🚀 Spring WebFlux with Server-Sent Events 🚀

Повышайте интерактивность своих приложений с помощью Spring WebFlux и Server-Sent Events (SSE)! 🔥

Что такое Server-Sent Events?
SSE — механизм, позволяющий серверу «толкать» данные клиенту по одному направлению (сервер → браузер) через постоянное HTTP-соединение. Идеально подходит для оповещений, обновлений статуса, live-лент и любых реальных данных, где не требуется двунаправленный сокет.

Почему WebFlux + SSE?
🌀 *Реактивная модель*
WebFlux построен на реактивных потоках (`Flux`/`Mono`), что позволяет обрабатывать тысячи параллельных соединений с минимальным использованием ресурсов.
⏱️ *Низкая задержка*
Вместо опроса (polling) клиент сразу получает новые события, как только сервер их публикует.
⚙️ *Простота интеграции*
Spring WebFlux предоставляет готовые абстракции для SSE, достаточно вернуть Flux<ServerSentEvent<...>> из контроллера.

Пример простого контроллера SSE в Spring WebFlux

@RestController
public class SseController {

@GetMapping(value = "/sse-stream", produces = MediaType.TEXT_EVENT_STREAM_VALUE)
public Flux<ServerSentEvent<String>> streamEvents() {
return Flux.interval(Duration.ofSeconds(1))
.map(seq -> ServerSentEvent.<String>builder()
.id(String.valueOf(seq))
.event("tick")
.data("Тик №" + seq)
.build()
);
}
}


• Здесь Flux.interval() генерирует последовательность чисел каждую секунду.
• Мы формируем ServerSentEvent<String> с идентификатором id, именем события event и полезными данными data.
• Браузер или любой клиент, подписанный на /sse-stream, будет получать сообщение каждую секунду без повторного HTTP-запроса.

Как использовать на клиенте?

<script>
const evtSource = new EventSource("/sse-stream");
evtSource.addEventListener("tick", e => {
console.log("Новое событие:", e.data);
// Можно обновлять UI: например, timestamp или счётчик
});
evtSource.onerror = err => console.error("SSE ошибка:", err);
</script>



• EventSource автоматически подключается к указанному URL и слушает серверные события.
• Метод addEventListener("tick", ...) обрабатывает только события с именем tick.

• Советы и подводные камни
⚠️ Обработка отмены (cancel)
Когда клиент закрывает страницу или отключается, WebFlux автоматически отменит подписку на Flux. При необходимости можно добавить .doOnCancel(...) для логирования или очистки ресурсов.
🛠️ Ошибка и повторная попытка (retry)
При сетевых сбоях браузер сам попытается переподключиться к тому же URL. Если вы хотите контролировать логику на сервере, используйте .retry() или .onErrorResume() в потоке Flux.
🔒 Безопасность
При необходимости защищайте URL SSE с помощью авторизации (JWT, OAuth2) или rate-limit’а, чтобы злоумышленники не «залили» ресурс.
📈 Масштабирование
Благодаря реактивной модели WebFlux вы можете легко масштабировать приложение на Kubernetes, не опасаясь, что сотни SSE-потоков «съедят» память и потоки.

• Где применить?
• Живые обновления статуса задач и билдов (CI/CD, DevOps)
• Чат-сообщения или лента комментариев в режиме «реального времени»
• Мониторинг метрик и дашборды (оперативные алерты)
• Финансовые или спортивные котировки (ticker, live scores)
• Оповещения об изменениях в БД (CDC), когда нужен асинхронный пуш

@javatg
2025/07/01 23:45:02
Back to Top
HTML Embed Code: