⚡️Легкий способ получать свежие обновления и следить за трендами в разработке на вашем языке. Находите свой стек и подписывайтесь:
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
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/javatg
Базы данных: www.tg-me.com/sqlhub
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
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка 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
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Собеседования DS: www.tg-me.com/machinelearning_interview
Нерйросети www.tg-me.com/ai_machinelearning_big_data
C++ www.tg-me.com/cpluspluc
Docker: www.tg-me.com/DevopsDocker
Хакинг: www.tg-me.com/linuxkalii
Devops: www.tg-me.com/DevOPSitsec
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/javatg
Базы данных: www.tg-me.com/sqlhub
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
Haskell: www.tg-me.com/haskell_tg
Физика: www.tg-me.com/fizmat
💼 Папка с вакансиями: www.tg-me.com/addlist/_zyy_jQ_QUsyM2Vi
Папка 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
😆ИТ-Мемы: www.tg-me.com/memes_prog
🇬🇧Английский: www.tg-me.com/english_forprogrammers
🧠ИИ: www.tg-me.com/vistehno
🎓954ГБ ОПЕНСОРС КУРСОВ: @courses
📕Ит-книги бесплатно: https://www.tg-me.com/addlist/BkskQciUW_FhNjEy
👍1🔥1
## Условие задачи:
Вам нужно спроектировать и реализовать на Java следующую систему:
1. Система подключается к непрерывному потоку событий (`EventStream`).
2. Каждое событие (`Event`) имеет структуру:
class Event {
String entityId;
Instant timestamp;
String eventType;
Map<String, Object> payload;
}
3. В реальном времени нужно собирать и поддерживать текущее состояние каждой сущности (`Entity`), применяя полученные события.
4. Система должна поддерживать откат состояния:
- Пользователь может запросить состояние любой сущности на любую произвольную временную точку (`Instant timestamp`).
- После отката система должна продолжать обрабатывать новые события без остановки и потери данных.
## Дополнительные требования:
- Потокобезопасность обработки событий и запросов на откат.
- Высокая производительность: обработка миллионов событий в минуту.
- Быстрый откат состояния (target: **< 100 мс**).
- Только стандартные библиотеки Java (`java.util.concurrent`,
java.time
, коллекции и т.д.).- Архитектура должна позволять добавлять новые типы событий без модификации существующего кода.
## Бонус:
- Реализация механизма снимков (`snapshot`) состояний для оптимизации откатов.
- Автоматическое создание snapshot'ов каждые N событий для каждой сущности.
- Поддержка нескольких стратегий отката (например, быстрый откат по ближайшему snapshot + события, или чистая перемотка всех событий).
---
📌 Что оценивается:
Архитектура: Четкая декомпозиция слоёв, масштабируемость и возможность расширения системы без существенных изменений базового кода.
Работа с многопоточностью: Гарантия безопасности доступа к общим структурам данных в условиях параллельной обработки событий.
Производительность: Минимизация блокировок, эффективная работа с большими объёмами данных, оптимизация по времени отклика и использованию ресурсов.
Чистота кода: Понятные и логичные интерфейсы, чистая реализация без "грязных хака", хорошая читаемость и поддерживаемость кода.
Способность предвидеть риски: Умение анализировать потенциальные угрозы системе, например, рост очередей при перегрузке событий или замедление обработки данных.
Стратегии оптимизации: Эффективное использование snapshot'ов состояния, продуманная организация хранения и восстановления событий.
Обработка ошибок и отказоустойчивость: Умение проектировать систему так, чтобы она корректно вела себя при сбоях, сетевых ошибках и высоких нагрузках.
---
# Подводные камни:
- Проблема гонки состояний: если одновременно приходит событие и запрашивается откат — что происходит?
- Рост памяти: если хранить все события, как не "убить" память?
- Перепутанные таймстемпы: что делать, если события приходят с задержкой или не по порядку?
- Обновление типов событий: как легко добавить новый
eventType
без переписывания всей логики?- Производительность при откате: как не делать полный перебор событий за годы работы?
---
# Рекомендация к решению:
- Используйте copy-on-write подход для состояний сущностей.
- Используйте параллельные структуры данных (`ConcurrentHashMap`,
ConcurrentSkipListMap
и т.д.).- Реализуйте инкапсуляцию логики обработки событий через паттерн "Event Handler" или "Command Handler".
- Внедрите отдельный менеджер snapshot'ов и менеджер событий.
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
👍11🔥8❤3🤬1
Есть фича. Есть дедлайн. Есть понимание, что тесты надо писать… но они отъедают время, которого итак впритык.
Один наш знакомый девелопер сказал: «С тех пор как поставил Explyt Test — начал писать меньше тестов… но покрытие стало лучше. Как это вообще возможно?!»
Попробуйте сами. Плагин сам предлагает тесты для вашего кода — прямо в IDE.
👉 explyt.ai — сэкономь себе пару часов уже сегодня.
Один наш знакомый девелопер сказал: «С тех пор как поставил Explyt Test — начал писать меньше тестов… но покрытие стало лучше. Как это вообще возможно?!»
Попробуйте сами. Плагин сам предлагает тесты для вашего кода — прямо в IDE.
👉 explyt.ai — сэкономь себе пару часов уже сегодня.
❤5👍1🔥1
☕️ TeaVM — компилятор Java в JavaScript и WebAssembly. Необычный инструмент, который превращает байт-код Java в компактный и эффективный JavaScript-код.
В отличие от GWT, TeaVM не требует исходников и работает прямо с .class-файлами, предлагая свою реализацию стандартной библиотеки Java. Инструмент также позволяет переносить бизнес-логику с бэкенда на фронтенд без полного переписывания. Поддерживает даже многопоточность через Web Workers.
🤖 GitHub
@java_tg
В отличие от GWT, TeaVM не требует исходников и работает прямо с .class-файлами, предлагая свою реализацию стандартной библиотеки Java. Инструмент также позволяет переносить бизнес-логику с бэкенда на фронтенд без полного переписывания. Поддерживает даже многопоточность через Web Workers.
🤖 GitHub
@java_tg
👍5🔥4❤2
💡 Базовые команды Linux, которые должен знать каждый! 🐧
📁 Работа с файлами и директориями:
📂 Просмотр и редактирование файлов:
🔐 Свойства файлов:
📝 Манипуляции с текстом:
👥 Управление пользователями и группами:
🖥 Мониторинг и управление системой:
🌐 Сетевые команды:
🔥 Сохрани себе, чтобы не забыть и делись с друзьями!
@javatg
📁 Работа с файлами и директориями:
ls — просмотр содержимого папки
cp — копирование файлов/папок
mv — перемещение или переименование
cd — переход между папками
mkdir — создание директории
rm — удаление файлов/папок
📂 Просмотр и редактирование файлов:
cat — вывод содержимого файла
less — постраничный просмотр
head — первые строки файла
tail — последние строки
more — аналог less
nano — простой текстовый редактор
vim — мощный редактор в терминале
🔐 Свойства файлов:
file — тип файла
touch — создать пустой файл или обновить дату
chmod — изменение прав доступа
chgrp — смена группы
wc — подсчёт строк, слов, символов
du — объём занимаемого дискового пространства
📝 Манипуляции с текстом:
grep — поиск по шаблону
cut/paste — извлечение/вставка колонок
tr — замена символов
sort — сортировка
tee — вывод в файл и на экран
expand — замена табуляции пробелами
👥 Управление пользователями и группами:
useradd — добавление пользователя
usermod — изменение пользователя
userdel — удаление пользователя
groupadd — добавление группы
groupdel — удаление группы
groupmod — изменение группы
chgrp — смена группы файла
🖥 Мониторинг и управление системой:
df — свободное место на дисках
uname — информация о системе
free — использование оперативной памяти
shutdown — выключение/перезагрузка
lsof — открытые файлы
rsync — синхронизация данных
ps — активные процессы
🌐 Сетевые команды:
dig/nslookup — DNS-запросы
ping — проверка доступности
curl — запрос к URL
scp — копирование по SSH
ifconfig — настройки сети
traceroute — путь до хоста
🔥 Сохрани себе, чтобы не забыть и делись с друзьями!
@javatg
🔥17👍8❤2
Столкнулись с падением производительности базы данных?
Не делайте резких движений: вы можете ухудшить ситуацию.
Сначала нужно верно диагностировать причину проблемы.
Возможно вы неправильно выбрали индексы, а быть может дело вообще в самой архитектуре БД – вариантов масса!
На открытом вебинаре «Как ускорить работу и повысить надёжность PostgreSQL»
вы узнаете:
🎯как обеспечить высокую производительность и отказоустойчивость базы данных
🎯как вовремя выявить деградацию производительности с помощью диагностики
Вебинар проведёт Дмитрий Золотов, Kotlin-разработчик в «Яндексе».
Приглашаем технических руководителей, админов БД, девопсов и разработчиков.
Все участники получат в подарок видеоурок «Безопасность в PostgreSQL: защита данных, управление доступом и аудит» и скидку 7% на любой курс OTUS.
6 мая, 19:00 МСК
Бесплатно
Записаться - https://otus.pw/RBkj/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFG5y1f6
Не делайте резких движений: вы можете ухудшить ситуацию.
Сначала нужно верно диагностировать причину проблемы.
Возможно вы неправильно выбрали индексы, а быть может дело вообще в самой архитектуре БД – вариантов масса!
На открытом вебинаре «Как ускорить работу и повысить надёжность PostgreSQL»
вы узнаете:
🎯как обеспечить высокую производительность и отказоустойчивость базы данных
🎯как вовремя выявить деградацию производительности с помощью диагностики
Вебинар проведёт Дмитрий Золотов, Kotlin-разработчик в «Яндексе».
Приглашаем технических руководителей, админов БД, девопсов и разработчиков.
Все участники получат в подарок видеоурок «Безопасность в PostgreSQL: защита данных, управление доступом и аудит» и скидку 7% на любой курс OTUS.
6 мая, 19:00 МСК
Бесплатно
Записаться - https://otus.pw/RBkj/
Реклама. ООО "ОТУС ОНЛАЙН-ОБРАЗОВАНИЕ". ИНН 9705100963. erid: 2W5zFG5y1f6
👍2🤯1
🧪 Pocket Science Lab — карманная лаборатория для экспериментов. Это компактное устройство с открытым исходным кодом, превращающее смартфон или ПК в полноценную лабораторию для физических и инженерных экспериментов.
Проект предлагает приложение с впечатляющим функционалом: осциллограф, генератор сигналов, люксметр, датчики давления и даже управление сервоприводами для робототехники. Интересно реализована работа с реальными данными, например, можно анализировать звуковые волны через микрофон или строить графики на основе показаний акселерометра.
🤖 GitHub
@javatg
Проект предлагает приложение с впечатляющим функционалом: осциллограф, генератор сигналов, люксметр, датчики давления и даже управление сервоприводами для робототехники. Интересно реализована работа с реальными данными, например, можно анализировать звуковые волны через микрофон или строить графики на основе показаний акселерометра.
🤖 GitHub
@javatg
👍7🔥3❤2
🦉 Apache ZooKeeper — координация распределенных систем без лишней сложности
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
🤖 GitHub
@javatg
В эпоху Kubernetes и сервис-мешей скромный ZooKeeper продолжает оставаться фундаментальным инструментом для управления конфигурацией и синхронизации распределенных систем. Последние версии проекта (3.5.5+) сохраняют минималистичный подход — чистые Java-бинарники, документация в Markdown и прозрачный процесс сборки через Maven.
Несмотря на появление альтернатив вроде etcd, ZooKeeper по-прежнему широко используется в Hadoop-экосистеме и как бэкенд для Apache Kafka.
🤖 GitHub
@javatg
👍5❤3🔥3
🧩 Задача «Три счётчика» (с подвохом)
Условие
Дан класс
Нужно запустить три параллельных потока, каждый увеличивает счётчик ровно 1 000 000 раз.
В финале программа должна вывести
Допустимы любые потоки (обычные или виртуальные) и любая коллекция из стандартной библиотеки Java 19+.
Тип поля менять нельзя — только
⚡️ В чем здесь подвох?
Операция value++ не атомарна: «прочитать → увеличить → записать».
Без привычных примитивов придётся найти альтернативный путь синхронизации.
💡 Решение через message queue (Actor‑подход)
Создаём очередь команд BlockingQueue<Runnable>.
Поднимаем один служебный поток servo, который единственный обращается к Counter.value.
Три рабочих потока кладут в очередь лямбду counter::increment.
```java
import java.util.concurrent.*;
final class Counter {
int value;
void increment() { value++; }
}
public class ThreeCountersDemo {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
BlockingQueue<Runnable> q = new LinkedBlockingQueue<>();
// 1️⃣ Сервисный поток: изменяет value
Thread servo = Thread.startVirtualThread(() -> {
try { while (true) q.take().run(); }
catch (InterruptedException ignored) {}
});
// 2️⃣ Три рабочих потока — по миллиону инкрементов
Runnable worker = () -> {
for (int i = 0; i < 1_000_000; i++)
q.add(counter::increment);
};
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
// 3️⃣ Ждём опустошения очереди и выключаем сервис
while (!q.isEmpty()) Thread.sleep(10);
servo.interrupt();
servo.join();
System.out.println("Counter value = " + counter.value);
}
}```
✅ Почему это работает
- Value модифицирует только поток servo.
- Очереди java.util.concurrent не были запрещены.
- Параллельность: виртуальные потоки лёгкие (~2 КБ стек), можно масштабировать.
@javatg
Условие
Дан класс
Counter
с полем int value и методом increment().Нужно запустить три параллельных потока, каждый увеличивает счётчик ровно 1 000 000 раз.
В финале программа должна вывести
Counter value = 3000000
Нельзя использовать synchronized, ReentrantLock, Atomic*, LongAdder, VarHandle.
Допустимы любые потоки (обычные или виртуальные) и любая коллекция из стандартной библиотеки Java 19+.
Тип поля менять нельзя — только
int
.⚡️ В чем здесь подвох?
Операция value++ не атомарна: «прочитать → увеличить → записать».
Без привычных примитивов придётся найти альтернативный путь синхронизации.
💡 Решение
Создаём очередь команд BlockingQueue<Runnable>.
Поднимаем один служебный поток servo, который единственный обращается к Counter.value.
Три рабочих потока кладут в очередь лямбду counter::increment.
```java
import java.util.concurrent.*;
final class Counter {
int value;
void increment() { value++; }
}
public class ThreeCountersDemo {
public static void main(String[] args) throws InterruptedException {
Counter counter = new Counter();
BlockingQueue<Runnable> q = new LinkedBlockingQueue<>();
// 1️⃣ Сервисный поток: изменяет value
Thread servo = Thread.startVirtualThread(() -> {
try { while (true) q.take().run(); }
catch (InterruptedException ignored) {}
});
// 2️⃣ Три рабочих потока — по миллиону инкрементов
Runnable worker = () -> {
for (int i = 0; i < 1_000_000; i++)
q.add(counter::increment);
};
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
Thread.ofVirtual().start(worker);
// 3️⃣ Ждём опустошения очереди и выключаем сервис
while (!q.isEmpty()) Thread.sleep(10);
servo.interrupt();
servo.join();
System.out.println("Counter value = " + counter.value);
}
}```
✅ Почему это работает
- Value модифицирует только поток servo.
- Очереди java.util.concurrent не были запрещены.
- Параллельность: виртуальные потоки лёгкие (~2 КБ стек), можно масштабировать.
@javatg
👍15🤯6🔥4❤3
⚡️ Ktorm — минималистичный ORM для Kotlin-разработчиков. Этот фреймворк предлагает принципиально иной подход к работе с базами данных: вместо сложных конфигураций и магии аннотаций здесь чистый Kotlin-код с типизированным SQL DSL.
При этом фреймворк не абстрагируется от SQL, а аккуратно его дополняет: вы всегда видите, какой запрос будет выполнен, но пишете его на понятном Kotlin. Встроенная поддержка пагинации, агрегаций и транзакций делает Ktorm готовым к использованию в production.
🤖 GitHub
@javatg
При этом фреймворк не абстрагируется от SQL, а аккуратно его дополняет: вы всегда видите, какой запрос будет выполнен, но пишете его на понятном Kotlin. Встроенная поддержка пагинации, агрегаций и транзакций делает Ktorm готовым к использованию в production.
🤖 GitHub
@javatg
❤6🔥4👍2
@javatg
Please open Telegram to view this post
VIEW IN TELEGRAM
🔥7👍4❤2
☕ Вопрос с собеседования: Статический блок и порядок инициализации
🔍 Условие:
Что выведет следующий код и почему?
❓ Вопрос:
Какой будет порядок вывода? Почему результат может удивить даже опытных Java-разработчиков?
🔍 Разбор:
✅ Что происходит по шагам:
1️⃣ При запуске программы сначала загружается класс `InitializationPuzzle`. Его статический блок выполняется сразу:
2️⃣ Далее вызывается
- Инициализация
- Инициализация
3️⃣ Наконец выполняется метод
---
✅ Ожидаемый полный вывод:
💥 Подвох:
• Многие разработчики думают, что раз
• Однако Java гарантирует, что перед выполнением любого статического метода класс будет полностью инициализирован.
• Также важно помнить, что при инициализации класса наследника сначала выполняются статические блоки родителя.
🛡️ Лайфхак:
Если вы хотите убедиться, что родительский класс не инициализируется при доступе к статическим полям/методам потомка, нужно использовать константы (static final), которые компилируются напрямую в байткод и не требуют загрузки класса.
✅ Вывод:
• Java строго инициализирует классы в порядке наследования перед вызовом любых статических методов.
• Даже вызов одного «безопасного» статического метода потомка затянет за собой загрузку родителя.
• Такие задачи хорошо проверяют понимание механизма класслоадеров и инициализации классов в JVM.
💡 Бонус-вопрос:
Что изменится, если вы замените
@javatg
🔍 Условие:
Что выведет следующий код и почему?
public class InitializationPuzzle {
static {
System.out.println("Static block 1");
}
public static void main(String[] args) {
Child.doSomething();
}
}
class Parent {
static {
System.out.println("Parent static block");
}
}
class Child extends Parent {
static {
System.out.println("Child static block");
}
static void doSomething() {
System.out.println("Child method");
}
}
❓ Вопрос:
Какой будет порядок вывода? Почему результат может удивить даже опытных Java-разработчиков?
🔍 Разбор:
✅ Что происходит по шагам:
1️⃣ При запуске программы сначала загружается класс `InitializationPuzzle`. Его статический блок выполняется сразу:
Static block 1
2️⃣ Далее вызывается
Child.doSomething()
. Теперь происходит инициализация класса `Child`. В Java при инициализации класса-потомка сначала загружается родительский класс, если он ещё не был загружен.- Инициализация
Parent
:
Parent static block
- Инициализация
Child
:
Child static block
3️⃣ Наконец выполняется метод
doSomething()
:
Child method
---
✅ Ожидаемый полный вывод:
Static block 1
Parent static block
Child static block
Child method
💥 Подвох:
• Многие разработчики думают, что раз
doSomething()
просто статический метод, может выполниться только он. • Однако Java гарантирует, что перед выполнением любого статического метода класс будет полностью инициализирован.
• Также важно помнить, что при инициализации класса наследника сначала выполняются статические блоки родителя.
🛡️ Лайфхак:
Если вы хотите убедиться, что родительский класс не инициализируется при доступе к статическим полям/методам потомка, нужно использовать константы (static final), которые компилируются напрямую в байткод и не требуют загрузки класса.
✅ Вывод:
• Java строго инициализирует классы в порядке наследования перед вызовом любых статических методов.
• Даже вызов одного «безопасного» статического метода потомка затянет за собой загрузку родителя.
• Такие задачи хорошо проверяют понимание механизма класслоадеров и инициализации классов в JVM.
💡 Бонус-вопрос:
Что изменится, если вы замените
doSomething()
на чтение static final поля в Child
? Будет ли тогда инициализирован Parent
?@javatg
👍23❤4🔥4
🌐 Gitnuro — кроссплатформенный Git-клиент без подписок и слежки. Этот полностью открытый клиент на Kotlin предлагает альтернативу тяжеловесным решениям вроде GitKraken или SourceTree.
В отличие от веб-ориентированных аналогов, он работает нативно на Linux, Windows и macOS, при этом не требуя активаций или подписок. Особенность проекта в поддержке сложных операций через минималистичный интерфейс.
🤖 GitHub
@javatg
В отличие от веб-ориентированных аналогов, он работает нативно на Linux, Windows и macOS, при этом не требуя активаций или подписок. Особенность проекта в поддержке сложных операций через минималистичный интерфейс.
🤖 GitHub
@javatg
🔥7👍4❤3
🔍 VisualVM — визуальный мониторинг JVM без лишнего шума. Этот инструмент предлагает то, чего не хватает стандартным JDK-утилитам: удобного интерфейса для профилирования Java-приложений. В отличие от тяжелых решений, он встроен прямо в JDK и умеет показывать метрики кучи, потоки и CPU-нагрузку в реальном времени.
Инструмент особенно полезен для быстрой диагностики, например, когда нужно найти утечку памяти без подключения к продакшену через JMX. Сборка из исходников требует только Ant и NetBeans Platform, а плагины добавляют поддержку Sampler и Thread Dump Analyzer.
🤖 GitHub
@javatg
Инструмент особенно полезен для быстрой диагностики, например, когда нужно найти утечку памяти без подключения к продакшену через JMX. Сборка из исходников требует только Ant и NetBeans Platform, а плагины добавляют поддержку Sampler и Thread Dump Analyzer.
🤖 GitHub
@javatg
👍7❤4
ХОЧЕШЬ ПОВЫШЕНИЕ В 2025 ГОДУ? 😎🔥
Тогда самое время разобраться в микросервисной архитектуре и стать более востребованным специалистом.
🚀 Стартуем 20 мая.
Курс ведет действующий архитектор Кирилл Ветчинкин. Он успешно реализовал проекты для Мегафона, Теле2, ВСS Brокer. Постоянный спикер крупных IT-конференций.
Какие скиллы прокачаем:
📌 Декомпозиция систем на микросервисы, отталкиваясь от бизнес-домена.
📌 Встройка микросервисов в оргструктуру компании.
📌Организация перехода от монолитной системы к микросервисной.
Полная программа ТУТ 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2
А самое главное — поддержка от спикера, чат с одногруппниками и полезные созвоны с разбором домашки.
📕 Сертификат об участии по итогам прохождения курса.
Узнай больше 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwE1oyN
Тогда самое время разобраться в микросервисной архитектуре и стать более востребованным специалистом.
🚀 Стартуем 20 мая.
Курс ведет действующий архитектор Кирилл Ветчинкин. Он успешно реализовал проекты для Мегафона, Теле2, ВСS Brокer. Постоянный спикер крупных IT-конференций.
Какие скиллы прокачаем:
📌 Декомпозиция систем на микросервисы, отталкиваясь от бизнес-домена.
📌 Встройка микросервисов в оргструктуру компании.
📌Организация перехода от монолитной системы к микросервисной.
Полная программа ТУТ 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2
А самое главное — поддержка от спикера, чат с одногруппниками и полезные созвоны с разбором домашки.
📕 Сертификат об участии по итогам прохождения курса.
Узнай больше 👉 https://microarch.ru/courses/microservices?utm_source=posev&utm_medium=erid:2VtzqwE1oyN&utm_campaign=2
Реклама. ИП Ветчинкин К.Е. ИНН: 773376451099 Erid: 2VtzqwE1oyN
🧠 Хитрая задача для Java-разработчиков: “Зеркальная фабрика”
📌 Условие:
Реализуйте абстрактную фабрику
- При создании объекта класса
- Но дополнительно логирует имя каждого вызванного метода и автоматически вызывает метод с тем же именем у другого объекта (его зеркала)
🎯 Иными словами:
❗️**Ограничения:**
- Классы могут быть любыми, но должны реализовывать интерфейсы
- Использовать только стандартные средства Java (рефлексия,
- Методы с одинаковым именем и сигнатурой должны быть вызваны у обоих объектов
✅ Решение:
```java
import java.lang.reflect.*;
public class MirrorFactory {
@SuppressWarnings ("unchecked")
public static <T> T create(T original, T mirror) {
Class<?> clazz = original.getClass().getInterfaces()[0];
return (T) Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "() called");
Object result1 = method.invoke(original, args);
Object result2 = method.invoke(mirror, args);
return result1; // приоритет оригиналу
}
});
}
}
```
Пример использования:
```java
interface MyService {
void doWork();
}
class MyServiceImpl implements MyService {
public void doWork() {
System.out.println("Working: " + this);
}
}
```
🔍 **Подвох:**
- Java `Proxy` работает **только с интерфейсами**
- Метод вызывается **дважды** — нужно быть осторожным с побочными эффектами
- Возврат значения только одного вызова (`original`) — важно, если метод что-то возвращает
🧠 **Чему учит задача:**
- Глубокому пониманию `java.lang.reflect.Proxy`
- Поведению `InvocationHandler` и сигнатур
- Умению комбинировать дизайн-паттерн **Proxy** и **Decorator**
- Практике метапрограммирования и логирования без изменения кода класса
---
@javatg
📌 Условие:
Реализуйте абстрактную фабрику
MirrorFactory
, которая:- При создании объекта класса
T
возвращает прокси, который повторяет все методы оригинального объекта- Но дополнительно логирует имя каждого вызванного метода и автоматически вызывает метод с тем же именем у другого объекта (его зеркала)
🎯 Иными словами:
MyService original = new MyService();
MyService mirror = new MyService();
MyService proxy = MirrorFactory.create(original, mirror);
proxy.doWork();
// Лог:
// doWork() called
// original.doWork() вызван
// mirror.doWork() вызван
❗️**Ограничения:**
- Классы могут быть любыми, но должны реализовывать интерфейсы
- Использовать только стандартные средства Java (рефлексия,
Proxy
, `InvocationHandler`)- Методы с одинаковым именем и сигнатурой должны быть вызваны у обоих объектов
✅ Решение:
```java
import java.lang.reflect.*;
public class MirrorFactory {
public static <T> T create(T original, T mirror) {
Class<?> clazz = original.getClass().getInterfaces()[0];
return (T) Proxy.newProxyInstance(
clazz.getClassLoader(),
new Class[]{clazz},
new InvocationHandler() {
public Object invoke(Object proxy, Method method, Object[] args) throws Throwable {
System.out.println(method.getName() + "() called");
Object result1 = method.invoke(original, args);
Object result2 = method.invoke(mirror, args);
return result1; // приоритет оригиналу
}
});
}
}
```
Пример использования:
```java
interface MyService {
void doWork();
}
class MyServiceImpl implements MyService {
public void doWork() {
System.out.println("Working: " + this);
}
}
```
🔍 **Подвох:**
- Java `Proxy` работает **только с интерфейсами**
- Метод вызывается **дважды** — нужно быть осторожным с побочными эффектами
- Возврат значения только одного вызова (`original`) — важно, если метод что-то возвращает
🧠 **Чему учит задача:**
- Глубокому пониманию `java.lang.reflect.Proxy`
- Поведению `InvocationHandler` и сигнатур
- Умению комбинировать дизайн-паттерн **Proxy** и **Decorator**
- Практике метапрограммирования и логирования без изменения кода класса
---
@javatg
👍9🔥5🤯5❤2
Эволюция архитектурного ревью в Яндекс 360
За последние четыре года команда Яндекс 360 выросла в семь раз, а количество продуктов увеличилось на шесть. Такой рост был бы невозможен без общих технологий, которые мы создаём. Вы узнаете подходы и лайфхаки, которые помогли нам выдержать рост, оставаясь в контексте создания общих решений и не переизобретая велосипеды.
Смотрите доклад Евгения Ширанкова, руководителя платформенных сервисов Яндекс 360, чтобы узнать, как развивался наш подход к проектированию сервисов и как он позволяет создавать решения, которыми пользуется весь Яндекс.
Больше материалов о технологиях в Яндекс 360
@yandex360team
За последние четыре года команда Яндекс 360 выросла в семь раз, а количество продуктов увеличилось на шесть. Такой рост был бы невозможен без общих технологий, которые мы создаём. Вы узнаете подходы и лайфхаки, которые помогли нам выдержать рост, оставаясь в контексте создания общих решений и не переизобретая велосипеды.
Смотрите доклад Евгения Ширанкова, руководителя платформенных сервисов Яндекс 360, чтобы узнать, как развивался наш подход к проектированию сервисов и как он позволяет создавать решения, которыми пользуется весь Яндекс.
Больше материалов о технологиях в Яндекс 360
@yandex360team
❤1🔥1
🌉 Apache Beam — единый мост между batch- и stream-обработкой данных. Этот проект позволяет описывать pipelines всего один раз, а запускать их где угодно: от локальной машины до кластеров Spark или Flink, не переписывая код.
Проект использует один API для всех сценариев — будь то анализ исторических данных или обработка бесконечных потоков событий в реальном времени. При этом инструмент не навязывает конкретную инфраструктуру, оставляя свободу выбора движка исполнения.
🤖 GitHub
@javatg
Проект использует один API для всех сценариев — будь то анализ исторических данных или обработка бесконечных потоков событий в реальном времени. При этом инструмент не навязывает конкретную инфраструктуру, оставляя свободу выбора движка исполнения.
🤖 GitHub
@javatg
🔥4❤2👍1