🌊 Project Nessie — транзакционный каталог для data lakes с Git-подобным управлением версиями. Этот инструмент позволяет работать с данными как с кодом: создавать ветки, сливать изменения и откатывать их до предыдущих состояний. Особенно удобен для команд, которые хотят внести контроль версий в свои процессы обработки данных.
Инструмент поддерживает таблицы и представления Iceberg, а также интеграцию с популярными инструментами вроде Spark, Hive и Flink. Для быстрого старта можно развернуть готовый Docker-образ или воспользоваться CLI. Проект активно развивается: есть веб-интерфейс, аутентификация через OpenID Connect и подробная документация.
🤖 GitHub
@javatg
Инструмент поддерживает таблицы и представления Iceberg, а также интеграцию с популярными инструментами вроде Spark, Hive и Flink. Для быстрого старта можно развернуть готовый Docker-образ или воспользоваться CLI. Проект активно развивается: есть веб-интерфейс, аутентификация через OpenID Connect и подробная документация.
🤖 GitHub
@javatg
👍5🔥3🥰1
Forwarded from Machinelearning
This media is not supported in your browser
VIEW IN TELEGRAM
• Лёгкий и мощный инструмент для разработки в командной строке
• Работает на базе Gemini 2.5 Pro
• Код агента в открытом доступе (Apache 2.0)
• Поддержка контекста в 1 миллион токенов
• Бесплатный тариф: до 60 запросов в минуту и 1000 в день
• Привязка к Google Search
• Поддержка MCP
• Интеграция с VS Code (Gemini Code Assist)
Запуск в cli:
npx https://github.com/google-gemini/gemini-cli
@ai_machinelearning_big_data
#AI #ML #agent #Google
Please open Telegram to view this post
VIEW IN TELEGRAM
❤8🔥7👍6
⛓️ Jimmer — революционный ORM для JVM (Java/Kotlin), переосмысливающий работу с данными. Этот инструмент позволяет оперировать не отдельными сущностями, а целыми графами объектов любой сложности, как при чтении, так и при сохранении.
Инструмент имеет встроенную поддержку DTO с кодогенерацией, самостоятельного устранения проблемы N+1 запросов и работы с рекурсивными структурами. ORM автоматически оптимизирует SQL-запросы, убирает лишние JOIN'ы и поддерживает многоуровневое кеширование. Проект предлагает удобные DSL для запросов, интеграцию с GraphQL и работает через APT/KSP, что обеспечивает безопасность типов на этапе компиляции.
🤖 GitHub
@androidits
Инструмент имеет встроенную поддержку DTO с кодогенерацией, самостоятельного устранения проблемы N+1 запросов и работы с рекурсивными структурами. ORM автоматически оптимизирует SQL-запросы, убирает лишние JOIN'ы и поддерживает многоуровневое кеширование. Проект предлагает удобные DSL для запросов, интеграцию с GraphQL и работает через APT/KSP, что обеспечивает безопасность типов на этапе компиляции.
🤖 GitHub
@androidits
👍20❤8🔥2😁1
💻 RSocket — протокол для реактивного взаимодействия между сервисами через TCP, WebSockets и Aeron. В отличие от традиционных HTTP-запросов, он поддерживает четыре модели обмена сообщениями: запрос-ответ, поток данных, fire-and-forget и бесконечные подписки на события.
Проект обладает zero-copy режимом для снижения задержек и Java-реализацией с интеграцией в Reactor. Подходит для микросервисов, где важны двунаправленная связь и эффективная работа с потоками данных.
🤖 GitHub
@javatg
Проект обладает zero-copy режимом для снижения задержек и Java-реализацией с интеграцией в Reactor. Подходит для микросервисов, где важны двунаправленная связь и эффективная работа с потоками данных.
🤖 GitHub
@javatg
👍12🔥3❤2
🔌 EA Async — асинхронный код в Java без головной боли. Этот необычный проект от Electronic Arts привносит в JVM-экосистему синтаксис async/await, знакомый разработчикам из C# и JavaScript. С ним асинхронные операции с CompletableFuture выглядят как последовательный код, сохраняя при этом все преимущества неблокирующего выполнения.
Библиотека трансформирует код на этапе компиляции — вы пишете блокирующий код с await, а под капотом генерируются цепочки thenCompose/thenApply. Работает с Java 8+ и Scala, а интеграция через Maven-плагин позволяет вообще исключить runtime-зависимости.
🤖 GitHub
@javatg
Библиотека трансформирует код на этапе компиляции — вы пишете блокирующий код с await, а под капотом генерируются цепочки thenCompose/thenApply. Работает с Java 8+ и Scala, а интеграция через Maven-плагин позволяет вообще исключить runtime-зависимости.
🤖 GitHub
@javatg
🔥11👍5❤4
🌄 Landscapist — элегантная загрузка изображений в Jetpack Compose. Этот проект превращает работу с сетевыми изображениями в Kotlin Multiplatform-приложениях в простой и производительный процесс. Инструмент использует единый API для трех популярных библиотек: Glide, Coil и Fresco, с автоматической оптимизацией под recomposition в Compose.
В проекте интересно реализованы анимации: плавное появление, размытие и круговая раскладка работают из коробки. Также доступна встроенная поддержка Baseline Profiles для ускорения загрузки.
🤖 GitHub
@javatg
В проекте интересно реализованы анимации: плавное появление, размытие и круговая раскладка работают из коробки. Также доступна встроенная поддержка Baseline Profiles для ускорения загрузки.
🤖 GitHub
@javatg
🔥6❤4👍3
📚 Java & Related Concepts — полный гайд по Java-экосистеме. Этот репозиторий представляет собой целую энциклопедию для Java-разработчиков. Автор структурировал материал от основ языка до продвинутых тем: многопоточность, проектирование систем, алгоритмы и даже Kotlin с Android-разработкой.
Проект имеет полезные разделы с примерами кода: от классических паттернов вроде Singleton до задач на динамическое программирование. Для тех, кто готовится к собеседованиям, есть подборка LeetCode-шаблонов и реальных interview-задач.
🤖 GitHub
@javatg
Проект имеет полезные разделы с примерами кода: от классических паттернов вроде Singleton до задач на динамическое программирование. Для тех, кто готовится к собеседованиям, есть подборка LeetCode-шаблонов и реальных interview-задач.
🤖 GitHub
@javatg
🔥11❤2👍2
⚡️ Почему лучшие разработчики всегда на шаг впереди?
Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.
ИИ: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Мл собес 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
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/java_library
Базы данных: 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
Физика: www.tg-me.com/fizmat
Папка 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
Подпишись, чтобы всегда знать, куда двигаться дальше!
Потому что они знают, где брать настоящие инсайд!
Оставь “программирование в вакууме” в прошлом, выбирай свой стек — подпишись и погружайся в поток идей, лайфхаков и знаний, которые не найдёшь в открытом доступе.
ИИ: www.tg-me.com/ai_machinelearning_big_data
Python: www.tg-me.com/pythonl
Linux: www.tg-me.com/linuxacademiya
Мл собес 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
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/java_library
Базы данных: 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
Физика: www.tg-me.com/fizmat
Папка 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
📕Ит-книги: 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
❤3👍1
🌳 AVL, Red-Black и обычные BST — в чём разница и что использовать
Если вы работаете с алгоритмами или backend-структурами, важно понимать, чем отличаются разные виды бинарных деревьев поиска. Они вроде бы похожи, но ведут себя по-разному под нагрузкой.
📘 1. Обычное BST (Binary Search Tree)
🔹 Это простое бинарное дерево, где:
> левый элемент < корень < правый элемент
🔹 Плюсы:
– простая реализация
– отлично работает в идеальных условиях (например, сбалансированные данные)
🔹 Минусы:
– если данные приходят в отсортированном виде — дерево вырождается в связный список
– время поиска, вставки, удаления может стать O(n) вместо O(log n)
📗 2. AVL-дерево
🔹 Это самобалансирующееся BST, в котором:
> разница высот левого и правого поддерева никогда не превышает 1
🔹 Плюсы:
– очень быстрое чтение и поиск (потому что дерево строго сбалансировано)
– гарантированное O(log n) на все операции
🔹 Минусы:
– при вставке и удалении может потребоваться много вращений, особенно при массовых изменениях
– чуть сложнее в реализации
📌 Используется, когда важна максимально быстрая навигация по дереву (например, базы данных, кэшированные индексы)
📕 3. Red-Black Tree (Красно-чёрное дерево)
🔹 Более "гибкое" самобалансирующееся дерево
> баланс поддерживается за счёт цветов узлов и набора правил
> менее строгое, чем AVL, но быстрее на изменениях
🔹 Плюсы:
– меньше вращений при вставке/удалении
– лучше масштабируется, особенно при больших объёмах данных
– используется в
🔹 Минусы:
– чуть менее сбалансировано, чем AVL
– поиск может быть чуть медленнее, но разница минимальна
📌 Используется в системах, где часто происходят вставки и удаления, и важна скорость обновлений, а не только чтения.
🧠 Итого:
🔗 Подробнее:
https://www.java67.com/2019/10/difference-between-binary-tree-avl-red-black-binary-search-tree.html
#algorithms #datastructures #backend #trees #avl #redblack
@javatg
Если вы работаете с алгоритмами или backend-структурами, важно понимать, чем отличаются разные виды бинарных деревьев поиска. Они вроде бы похожи, но ведут себя по-разному под нагрузкой.
📘 1. Обычное BST (Binary Search Tree)
🔹 Это простое бинарное дерево, где:
> левый элемент < корень < правый элемент
🔹 Плюсы:
– простая реализация
– отлично работает в идеальных условиях (например, сбалансированные данные)
🔹 Минусы:
– если данные приходят в отсортированном виде — дерево вырождается в связный список
– время поиска, вставки, удаления может стать O(n) вместо O(log n)
📗 2. AVL-дерево
🔹 Это самобалансирующееся BST, в котором:
> разница высот левого и правого поддерева никогда не превышает 1
🔹 Плюсы:
– очень быстрое чтение и поиск (потому что дерево строго сбалансировано)
– гарантированное O(log n) на все операции
🔹 Минусы:
– при вставке и удалении может потребоваться много вращений, особенно при массовых изменениях
– чуть сложнее в реализации
📌 Используется, когда важна максимально быстрая навигация по дереву (например, базы данных, кэшированные индексы)
📕 3. Red-Black Tree (Красно-чёрное дерево)
🔹 Более "гибкое" самобалансирующееся дерево
> баланс поддерживается за счёт цветов узлов и набора правил
> менее строгое, чем AVL, но быстрее на изменениях
🔹 Плюсы:
– меньше вращений при вставке/удалении
– лучше масштабируется, особенно при больших объёмах данных
– используется в
TreeMap
(Java), std::map
(C++), Linux kernel
🔹 Минусы:
– чуть менее сбалансировано, чем AVL
– поиск может быть чуть медленнее, но разница минимальна
📌 Используется в системах, где часто происходят вставки и удаления, и важна скорость обновлений, а не только чтения.
🧠 Итого:
| Структура | Быстрее при... | Баланс | Где применяется |
|----------------|------------------------|--------|----------------------------------------|
| **BST** | — (только в идеале) | ❌ нет | учебные задачи, простые деревья |
| **AVL** | ✅ Поиске | ✅ строгий | базы данных, индексы, словари |
| **Red-Black** | ✅ Вставке/удалении | ⚠ умеренный | языковые stdlib, ядра, runtime-структуры |
🔗 Подробнее:
https://www.java67.com/2019/10/difference-between-binary-tree-avl-red-black-binary-search-tree.html
#algorithms #datastructures #backend #trees #avl #redblack
@javatg
❤9👍7🔥4
🎨 Mordant — библиотека для стилизации текста в терминале. Этот мультиплатформенный Kotlin-проект превращает скучный терминальный вывод в визуально приятные интерфейсы. С ним можно не просто раскрашивать текст, но и создавать таблицы, анимированные прогресс-бары и даже рендерить Markdown прямо в консоли.
Инструмент умеет автоматически определять возможности терминала и поддерживает корутины для анимаций. Под капотом: умная система виджетов для компоновки элементов и кросс-платформенная работа на JVM, JS и Native.
🤖 GitHub
@androidits
Инструмент умеет автоматически определять возможности терминала и поддерживает корутины для анимаций. Под капотом: умная система виджетов для компоновки элементов и кросс-платформенная работа на JVM, JS и Native.
🤖 GitHub
@androidits
👍7🔥4❤2😁1
Как выглядят будни разработчиков управляемых БД, 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