Java библиотека

Логотип телеграм канала @javalib — Java библиотека
Актуальные темы из канала:
Java
Assertj
Jpa
Вакансія
Реклама
Afterpropertiesset
Конкурс
Мерч
All tags
Адрес канала: @javalib
Категории: Технологии
Язык: Русский
Количество подписчиков: 31.42K
Описание канала:

Книги, статьи, мемы и многое другое для Java программиста!
По сотрудничеству и рекламе: @NadikaKir
Канал в перечне РКН: https://vk.cc/cJrT4A
Мы на бирже: https://telega.in/c/javalib/
Сообщество VK https://vk.com/javatutorial

Рейтинги и Отзывы

3.67

3 отзыва

Оценить канал javalib и оставить отзыв — могут только зарегестрированные пользователи. Все отзывы проходят модерацию.

5 звезд

1

4 звезд

0

3 звезд

2

2 звезд

0

1 звезд

0


Последние сообщения

12 янв
Открытый урок «Spring AI: от изображения к данным. Практика распознавания документов».

15 января в 20:00 МСК

Бесплатно. Урок в рамках старта курса «Разработчик на Spring Framework».

На вебинаре:
Введение в Spring AI для обработки документов.
Настройка проекта: зависимости и конфигурация модели.
Ключевые концепции: работа с изображениями, системные промпты, OutputParser.
Сервисный слой: оркестрация шагов AI-пайплайна.
REST API для загрузки/анализа, обработка ошибок и масштабирование.

Кому будет интересно:
Java-разработчикам на Spring, backend-инженерам, архитекторам и тимлидам, которым нужно встроить распознавание документов в сервисы.

Результаты после вебинара:
Соберете простой пайплайн: загрузка изображения → извлечение текста → JSON. Поймете, где в Spring AI применять промпты и OutputParser.

Ссылка на регистрацию: https://vk.cc/cTkyHL

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
2.26K views09:46
Подробнее
Поделиться:
Открыть/Комментировать
12 янв
API архитектурные стили

REST – популярный подход для публичных API и веб-приложений, поддерживает JSON, XML, HTML и текст.
SOAP – использует структуру сообщений с оберткой на основе XML. Применяется в платежных системах и телеком-сервисах, но имеет высокий порог входа.
GraphQL – гибкая схема и система типов, позволяет использовать JSON и подходит для сложных систем и мобильных API.
gRPC – высокопроизводительный фреймворк RPC, работает через протоколы сериализации, используется для высоконагруженных систем.
WebSocket – поддерживает двустороннюю связь, подходит для чатов и других приложений реального времени.
Webhook – асинхронный подход, применим для CI/CD процессов и платежных шлюзов.

Подписывайся на наш канал в Max
2.87K views03:46
Подробнее
Поделиться:
Открыть/Комментировать
11 янв
Паттерн Компоновщик (Composite)

Composite — это структурный паттерн, который позволяет организовать объекты в древовидные структуры для представления иерархий "часть-целое". Он позволяет клиентам единообразно работать как с отдельными объектами, так и с их группами.

Использование:

Когда нужно представить иерархическую структуру объектов, например, дерево файловой системы или меню на сайте.
Когда клиентский код должен одинаково работать как с отдельными объектами, так и с их контейнерами.
Когда необходимо удобно добавлять новые виды компонентов в систему, поддерживая единый интерфейс.

Преимущества:

Позволяет обрабатывать составные и простые элементы одинаково.
Новый тип компонента можно добавить, просто реализовав общий интерфейс.
Можно динамически изменять дерево объектов (добавлять, удалять узлы).

Недостатки:

Усложнение кода: Может сделать систему сложнее из-за необходимости реализации общего интерфейса.
Затраты на проверку типов: Клиентский код иногда должен дополнительно проверять тип узлов, если это необходимо.

Composite отлично подходит для работы с иерархиями, будь то дерево файлов, граф интерфейса или структурированные данные.

Подписывайся на наш канал в Max
3.11K views12:25
Подробнее
Поделиться:
Открыть/Комментировать
9 янв
Какие типы ссылок существуют?

Существует 4 типа ссылок, которые определяют, как объект будет обрабатываться сборщиком мусора (Garbage Collector).

Strong Reference

Это ссылки, которые используются по умолчанию.
String strongRef = new String("Strong Reference");

Объект, на который указывает сильная ссылка, никогда не будет удален сборщиком мусора, пока существует эта ссылка.
Используйте, когда объект нужен в течение всего времени выполнения.

Soft Reference

Создаются с помощью класса SoftReference. Soft ссылка удерживает объект в памяти, пока в JVM достаточно свободной памяти. Если памяти не хватает, объект будет удален.
SoftReference softRef = new SoftReference<>(new String("Soft Reference"));
String softObj = softRef.get();

Удобны для реализации кэшей. Например, если объект можно восстановить, но не хочется держать его в памяти постоянно.
Сборщик мусора удаляет объекты, на которые ссылаются мягкие ссылки, только в случае нехватки памяти.

Weak Reference

Создаются с помощью класса WeakReference. Объект, на который ссылается слабая ссылка, удаляется сборщиком мусора, как только на него больше нет сильных или мягких ссылок.
WeakReference weakRef = new WeakReference<>(new String("Weak Reference"));
String weakObj = weakRef.get();

Часто используются в структурах данных, таких как WeakHashMap, для предотвращения удержания ненужных объектов.
Удобны для создания ссылок на временные объекты.

Phantom Reference

Создаются с помощью класса PhantomReference. Эти ссылки используются исключительно для отслеживания, когда объект будет удален сборщиком мусора.
PhantomReference phantomRef = new PhantomReference<>(new String("Phantom Reference"), new ReferenceQueue<>());

Метод get() у фантомной ссылки всегда возвращает null.
Объекты, на которые ссылаются фантомные ссылки, добавляются в ReferenceQueue, когда сборщик мусора их удаляет.

Подписывайся на наш канал в Max
4.01K views01:15
Подробнее
Поделиться:
Открыть/Комментировать
8 янв
Заметки о java.util.Stream

Stream API (поток) — принципиально новый способ работы с коллекциями в Java (по крайней мере он был таким на момент релиза).

В данной статье речь пойдёт о наиболее интересных и показательных примерах использования Stream.
Обсудим, как применять Stream API эффективно, делая код лучше и избегая ошибок.

о java.util.Stream

Подписывайся на наш канал в Max
4.24K views05:58
Подробнее
Поделиться:
Открыть/Комментировать
7 янв
Динамический массив

В Java динамический массив представляет собой структуру данных, которая позволяет хранить и управлять коллекцией элементов переменного размера.

Он реализуется с помощью класса ArrayList. ArrayList представляет собой реализацию списка, который может изменять свой размер по мере необходимости.


Подписывайся на наш канал в Max
4.35K views14:53
Подробнее
Поделиться:
Открыть/Комментировать
5 янв
Полезный инструмент для работы с JSON

JSON-файлы с высокой вложенностью часто сложно прочитать.
𝐉𝐬𝐨𝐧𝐂𝐫𝐚𝐜𝐤 создает графические диаграммы из JSON-файлов и делает их легко читаемыми.
Кроме того, созданные диаграммы можно скачать в виде изображений.

Также поддерживает YAML и XML форматы.

Подписывайся на наш канал в Max
5.29K views00:01
Подробнее
Поделиться:
Открыть/Комментировать
3 янв
Логирование, трассировка и метрики

Логирование, трассировка и метрики — это три столпа наблюдаемости системы

Логирование
Логирование фиксирует дискретные события в системе. Например, мы можем записывать входящие запросы или обращения к базам данных как события. Это самый объемный тип данных. Для построения платформы анализа логов часто используют стек ELK (Elastic-Logstash-Kibana). Мы часто определяем стандартизированный формат логов для разных команд, чтобы использовать ключевые слова при поиске среди большого объема логов.

Трассировка
Трассировка обычно привязана к запросам. Например, пользовательский запрос проходит через API-шлюз, балансировщик нагрузки, сервис A, сервис B и базу данных — это можно визуализировать в системах трассировки. Это полезно для выявления узких мест в системе. OpenTelemetry используется для демонстрации типичной архитектуры, которая объединяет три столпа в одной платформе.

Метрики
Метрики — это обычно агрегируемая информация из системы. Например, QPS сервиса, отзывчивость API, задержка сервиса и т.д. Сырые данные записываются в базы данных временных рядов, такие как InfluxDB. Prometheus извлекает данные и преобразует их на основе предопределенных правил оповещений. Затем данные отправляются в Grafana для отображения или в менеджер оповещений, который затем рассылает уведомления по email, SMS или в Slack.

Какие инструменты вы используете для мониторинга системы?

Подписывайся на наш канал в Max
5.3K views13:56
Подробнее
Поделиться:
Открыть/Комментировать
3 янв
Класс "обертка" (wrapper class)

Класс-обертка (wrapper class) — это класс, который обеспечивает возможность использования примитивных типов данных как объектов. Каждый примитивный тип данных в Java имеет соответствующий класс-обертку: byte — Byte, short — Short, int — Integer, long — Long, float — Float, double — Double, boolean — Boolean и char — Character.

Классы-обертки используются, например, при работе с объектами коллекций, такими как ArrayList, где примитивные типы не могут быть использованы (список может хранить только объекты).

В этом примере мы создаем объекты классов-оберток для примитивных типов int, double, char и выводим значения этих объектов с помощью метода println().


Подписывайся на наш канал в Max
4.28K views07:01
Подробнее
Поделиться:
Открыть/Комментировать
2 янв
Шпаргалка по основам Java с примерами кода.

В ней есть всё, что может пригодиться начинающему разработчику.

Оригинал в хорошем качестве можно взять тут

Подписывайся на наш канал в Max
4.42K views18:45
Подробнее
Поделиться:
Открыть/Комментировать
2 янв
Spring Boot ПОЛНЫЙ курс для начинающих [2025]

В этом видео вы получите полный курс по Spring Boot для начинающих. Мы подробно разберем, что такое Spring, как он работает и почему является одним из самых популярных фреймворков для разработки на Java. Вы узнаете, как начать свой путь в программировании с помощью Spring Boot, а также я поделюсь лучшими практиками и советами, которые помогут вам стать уверенным разработчиком и освоить современные инструменты Java-разработки. Досмотрите видео до конца, чтобы получить полное представление о том, как работает Spring Boot и с чего начать свой путь в мире Java-разработки.

СМОТРЕТЬ RUTUBE

СМОТРЕТЬ VKVIDEO

СМОТРЕТЬ DZEN

Подписывайся на наш канал в Max
5.41K views10:10
Подробнее
Поделиться:
Открыть/Комментировать
30 дек 2025
Keycloak — это решение с открытым исходным кодом для управления идентификацией и доступом, предназначенное для Java приложений и сервисов!

Оно обеспечивает функции единого входа (SSO), управления доступом и многое другое, упрощая разработчикам процесс аутентификации и авторизации пользователей.

Лицензия: Apache-2.0

Github

Подписывайся на наш канал в Max
6.14K views07:39
Подробнее
Поделиться:
Открыть/Комментировать
29 дек 2025
Что такое MVP?

MVP (Minimum Viable Product) — это минимально жизнеспособный продукт, представляющий собой начальную версию продукта, которая включает только ключевые функции, необходимые для проверки гипотезы или удовлетворения базовых потребностей пользователей.

Ключевые аспекты MVP:

— MVP содержит только те функции, которые являются критически важными для решения основной проблемы пользователя. Остальные функции откладываются на более поздние этапы.

— MVP создаётся для тестирования рыночного спроса или реакции пользователей на продукт с минимальными затратами времени и ресурсов.

— После выпуска MVP собираются отзывы от пользователей, чтобы понять, в правильном ли направлении развивается продукт, и внести изменения.

Важно: MVP — это не просто "сырой" продукт, он должен решать основную задачу, при этом быть полезным и функциональным.

Подписывайся на наш канал в Max
6.59K views17:42
Подробнее
Поделиться:
Открыть/Комментировать
29 дек 2025
OpenGrok — это инструмент для индексирования и поиска исходного кода!

Он помогает разработчикам быстро находить и анализировать код в больших репозиториях, поддерживает множество языков программирования (Java, C/C++, Python, и другие). OpenGrok предоставляет функциональность для поиска по меткам, комментариям, коду и даже документации. Инструмент ориентирован на улучшение работы с кодом в больших проектах и используется для облегчения навигации по огромным кодовым базам.

Github

Подписывайся на наш канал в Max
6.1K views07:06
Подробнее
Поделиться:
Открыть/Комментировать
27 дек 2025
Паттерн Состояние (State)

State — это поведенческий паттерн, который позволяет объекту менять свое поведение в зависимости от внутреннего состояния. Вместо множества условных операторов (if-else или switch), каждое состояние представляется отдельным классом, а сам объект делегирует управление текущему состоянию.

Когда использовать

Когда у объекта есть несколько состояний, и его поведение зависит от текущего состояния.
Когда код с if-else или switch начинает разрастаться и усложняет поддержку.
Когда необходимо четко разделить логику различных состояний и сделать систему более гибкой.

Преимущества

Избавляет от множества if-else конструкций, делая код более читаемым и поддерживаемым.
Облегчает добавление новых состояний без изменения существующего кода.
Обеспечивает инкапсуляцию логики для каждого состояния, упрощая тестирование и модификации.

Недостатки

Может усложнить код, если состояний слишком мало, а логика простая.
Увеличивает количество классов, так как каждое состояние реализуется отдельно.
Вводит дополнительные связи между классами состояний и контекстом.

State — мощный инструмент, когда объекту нужно динамически изменять свое поведение. Он особенно полезен в конечных автоматах, обработке пользовательских действий и моделировании процессов с четко определенными шагами.

Подписывайся на наш канал в Max
1.85K views12:23
Подробнее
Поделиться:
Открыть/Комментировать
27 дек 2025
Shizuku — это инструмент, позволяющий обычным Android-приложениям напрямую использовать системные API с привилегиями ADB или root!

Он работает путем запуска Java-процесса с помощью app_process, что позволяет приложениям взаимодействовать с системными сервисами без необходимости в полном рут-доступе.

Лицензия: Apache-2.0

Github

Подписывайся на наш канал в Max
2.59K views21:43
Подробнее
Поделиться:
Открыть/Комментировать
26 дек 2025
Техника «10 тестов в день» – одна из самых эффективных в изучении Java.

Канал Java Guru выложил в открытый доступ тесты, которые дают на собеседованиях в топовые компании, вроде Яндекс и MailRu.

➤ Открываете задачку – выбираете вариант – видите правильный ответ и детальное объяснение к нему. Так вы усвоите на 50% больше знаний в сжатые сроки.

Подписывайтесь и качайте свои скиллы: @javatasks
2.75K views15:32
Подробнее
Поделиться:
Открыть/Комментировать
26 дек 2025
SQLException

SQLException
это класс исключений, используемый для обработки ошибок, связанных с работой с базами данных.

Обычно он возникает при выполнении запросов к БД через JDBC и сигнализирует об ошибках соединения с БД, синтаксических ошибках в SQL запросе, проблемах с транзакциями и т.д.

Здесь мы подключаемся к БД, выполняем запрос INSERT и отлавливаем возможную ошибку через блок catch по SQLException.

Если запрос выполнится успешно, ничего не будет выведено в консоль.
Если произойдет ошибка, например, из-за неправильного SQL синтаксиса, будет выведена информация об исключении.


Подписывайся на наш канал в Max
3.04K views07:12
Подробнее
Поделиться:
Открыть/Комментировать
25 дек 2025
Что будет результатом кода?
2.75K views12:16
Подробнее
Поделиться:
Открыть/Комментировать
25 дек 2025
Лайфхак: оптимизируем DTO с record

Вместо обычных POJO-классов для DTO используйте record (Java 14+). Меньше кода, больше удобства.

Record автоматически создает иммутабельный класс с приватными финальными полями, конструктором, геттерами, а также переопределенными методами toString(), equals() и hashCode().

Избыточно
public class User {
private final String name;
private final int age;

public User(String name, int age) {
this.name = name;
this.age = age;
}

public String getName() { return name; }
public int getAge() { return age; }

@Override
public String toString() {
return "User{name='" + name + "', age=" + age + "}";
}

@Override
public boolean equals(Object obj) {
if (this == obj) return true;
if (obj == null || getClass() != obj.getClass()) return false;
User user = (User) obj;
return age == user.age && Objects.equals(name, user.name);
}

@Override
public int hashCode() {
return Objects.hash(name, age);
}
}

Красиво и лаконично
public record User(String name, int age) {}

Подписывайся на наш канал в Max
3.41K views21:51
Подробнее
Поделиться:
Открыть/Комментировать
24 дек 2025
Как правильно собрать требования для создания надёжных и масштабируемых решений?

В видеопроекте Road to Highload Евгений Ширанков, руководитель платформенных сервисов в Яндекс 360, на основе практических примеров разбирает, как формировать функциональные и нефункциональные требования, какие ловушки часто встречаются и как их избежать, чтобы создавать надёжные и масштабируемые решения.

Road to Highload — это цикл видео от Яндекс 360 о том, как строятся системы, которыми ежедневно пользуются миллионы людей и тысячи компаний. Здесь говорят о highload и отказоустойчивости не по учебникам, а на основе многолетнего опыта разработки.

Смотрите проект, чтобы узнать, как создаются одни из крупнейших облачных сервисов в России

Сайт проекта
VK Видео
Ютуб
3.45K views12:02
Подробнее
Поделиться:
Открыть/Комментировать
23 дек 2025
Где вы чаще всего пишете код?

IntelliJ IDEA
GIGA IDE
Vim/Emacs
Eclipse
VS Code
Notepad++

Пишите в комментарии интересные/полезные фичи вашего инструмента

Подписывайся на наш канал в Max
3.62K views16:20
Подробнее
Поделиться:
Открыть/Комментировать
23 дек 2025
Завтра тестовое собеседование с Java-разработчиком

24 декабря(уже завтра!) в 19:00 по мск приходи онлайн на открытое собеседование, чтобы посмотреть на настоящее интервью на Middle Java-разработчика.

Как это будет:
Сергей Чамкин, старший разработчик из Uzum, ex-WildBerries, будет задавать реальные вопросы и задачи разработчику-добровольцу
Cергей будет комментировать каждый ответ респондента, чтобы дать понять чего от вас ожидает собеседующий на интервью
В конце можно будет задать любой вопрос Сергею

Это бесплатно. Эфир проходит в рамках менторской программы от ШОРТКАТ для Java-разработчиков, которые хотят повысить свой грейд, ЗП и прокачать скиллы.

Переходи в нашего бота, чтобы получить ссылку на эфир →
@shortcut_sh_bot

Реклама.
О рекламодателе.
3.63K views11:01
Подробнее
Поделиться:
Открыть/Комментировать
23 дек 2025
Xpipe — это кроссплатформенное решение для интеграции данных, ориентированное на простоту настройки и использования!

Оно позволяет подключать и синхронизировать данные между различными системами и форматами, такими как базы данных, файловые системы и API. Xpipe предоставляет графический интерфейс для настройки потоков данных, что делает его доступным для пользователей без глубоких технических знаний.

Лицензия: Apache-2.0

Github

Подписывайся на наш канал в Max
3.47K viewsedited  09:51
Подробнее
Поделиться:
Открыть/Комментировать
23 дек 2025
Java Full Course for free (2025) 12 Hours

Java tutorial for beginners full course.

СМОТРЕТЬ VKVIDEO

Подписывайся на наш канал в Max
3.59K views22:26
Подробнее
Поделиться:
Открыть/Комментировать
22 дек 2025
Последний шанс: набор на курс Highload Architect в этом году завершается!

Если хотите перейти от разработки к архитектуре высоконагруженных систем — действуйте сейчас.
Чтобы попасть в поток и зафиксировать спеццену, нужно успеть пройти вступительное тестирование до закрытия набора.

Вы сможете прокачать:
- Проектирование масштабируемых систем под миллионы запросов
- Оптимизацию производительности и отказоустойчивые архитектуры
- Практику с современными инструментами highload-разработки
- Применение проверенных паттернов и подходов в продакшене

Старт уже совсем скоро, места ограничены. Формат — онлайн, реальные кейсы, проект с защитой и детальный фидбек от практиков.

Пройдите вступительное тестирование прямо сейчас: https://vk.cc/cSDU0q

Подтвердите уровень и поступайте в группу со спецценой. Подробности по скидке уточняйте у менеджера.

Реклама. ООО «Отус онлайн-образование», ОГРН 1177746618576
4.17K views09:32
Подробнее
Поделиться:
Открыть/Комментировать
21 дек 2025
Java tip: избегай шаринга данных между потоками

Используй immutable-объекты
Или передавай данные между потоками через сообщения, а не через общие изменяемые структуры

Подписывайся на наш канал в Max
4.36K views08:01
Подробнее
Поделиться:
Открыть/Комментировать
20 дек 2025
Как подключить MapStruct к проекту

MapStruct — это code-generation библиотека для автоматического маппинга между Java-объектами.

Работает на этапе компиляции, генерирует чистый код без рефлексии — в разы быстрее ModelMapper и Dozer.

Добавляем зависимости

Нужно добавить две зависимости: саму библиотеку mapstruct и процессор mapstruct-processor. Процессор отвечает за генерацию кода во время компиляции.

Критически важно правильно настроить maven-compiler-plugin, именно он запускает annotation processors. В секции annotationProcessorPaths прописываем mapstruct-processor, а если используете Lombok, добавляем его тоже плюс специальный binding для их совместной работы.

Создаём Mapper интерфейс

Создаёте обычный Java-интерфейс с аннотацией @Mapper(componentModel = "spring"). Параметр componentModel указывает, что MapStruct должен сгенерировать Spring-бин, который можно инжектить через конструктор.

В интерфейсе объявляете методы-конвертеры: например UserDto toDto(User user) или List toDtoList(List users). MapStruct сам поймёт, какие поля во что маппить, если названия совпадают.

Настраиваем кастомный маппинг

Когда названия полей отличаются или нужна дополнительная логика, используйте аннотацию @Mapping:

source/target — для переименования полей: @Mapping(target = "fullName", source = "firstName")
expression — для Java-выражений: можно написать простую логику прямо в аннотации
ignore — чтобы игнорировать поле: @Mapping(target = "password", ignore = true)
dateFormat — для форматирования дат: автоматическая конвертация LocalDateTime в String
qualifiedByName — для вызова кастомных методов-конвертеров

Работа со вложенными объектами

MapStruct умеет автоматически маппить вложенные структуры. Если у вас в User есть поле Address, а в UserDto есть AddressDto — создайте отдельный AddressMapper и укажите его в параметре uses = {AddressMapper.class}.

MapStruct сам найдёт нужный маппер и применит его для вложенных объектов. Это работает рекурсивно для любой глубины вложенности.

Обновление существующих объектов

Часто нужно не создавать новый объект, а обновить существующий. Для этого используйте аннотацию @MappingTarget на втором параметре метода. MapStruct сгенерирует код, который обновит только нужные поля.

Добавьте @BeanMapping(nullValuePropertyMappingStrategy = NullValuePropertyMappingStrategy.IGNORE) — тогда null-значения из DTO не затрут существующие данные в Entity.

Кастомные конвертеры

Для сложной логики добавьте в интерфейс default-методы. Пометьте их @Named("имя") и ссылайтесь через qualifiedByName. Например, для конвертации enum в русский текст или склейки нескольких полей.

Можно также создать отдельный класс с @Component и helper-методами, затем подключить его через параметр uses.

Что происходит под капотом

MapStruct анализирует ваш интерфейс на этапе компиляции, смотрит на типы полей, их названия и аннотации. Затем генерирует простой Java-код с прямым присвоением значений, никакой магии, рефлексии или proxy.

Сгенерированный код можно открыть и прочитать. Он выглядит так, будто вы написали его вручную. Это упрощает отладку и понимание происходящего.

Подписывайся на наш канал в Max
4.19K views15:07
Подробнее
Поделиться:
Открыть/Комментировать
20 дек 2025
Java Guru - вопросы и задачи с собеседований. Канал с помощью которого ты точно получишь оффер!

Android Developer - канал для андроид разработчиков! Статьи, вопросы и задачи с собеседований, лайфхаки.

Kotlin Developer - самый топовый канал для котлин разработчика!

Книги для Java программиста - канал с книгами по Java. Постоянно выходят новинки как на русском так и на английском языке!

Java News - канал с последними новостями из мира Java!
4.06K views07:55
Подробнее
Поделиться:
Открыть/Комментировать
20 дек 2025
В Spring Boot можно легко включить асинхронное логирование через конфигурацию logback (logback-spring.xml).

Что это даёт:

Логи отправляются в очередь и обрабатываются отдельным фоновым потоком
Основной поток не блокируется на I/O
Производительность приложения выше под нагрузкой

Асинхронный логгер - простой способ убрать лишние задержки и сделать сервис отзывчивее.

Подписывайся на наш канал в Max
3.94K views21:52
Подробнее
Поделиться:
Открыть/Комментировать