WaveManager: Реализуем систему управления волнами врагов в Unity
Реализация системы управления волнами для создания захватывающих столкновений с противниками — это достаточно эффективный способ постепенно увеличивать сложность, поддерживая вовлеченность игроков. В этом руководстве я поделюсь с вами своим опытом реализации WaveManager'а в Unity, включая создание скриптов, генерацию врагов и интеграцию пользовательского интерфейса.
Читать: https://habr.com/ru/companies/otus/articles/919928/?utm_campaign=919928
@a_cup_of_java | Другие наши каналы
Реализация системы управления волнами для создания захватывающих столкновений с противниками — это достаточно эффективный способ постепенно увеличивать сложность, поддерживая вовлеченность игроков. В этом руководстве я поделюсь с вами своим опытом реализации WaveManager'а в Unity, включая создание скриптов, генерацию врагов и интеграцию пользовательского интерфейса.
Читать: https://habr.com/ru/companies/otus/articles/919928/?utm_campaign=919928
@a_cup_of_java | Другие наши каналы
Трудности обслуживания приложений под Android
Недавно наткнулся на новость о том, что количество приложений в Google Play Store сократилось на 47%.
Я сам энтузиаст разработки под Android и последние 5 лет работал над альтернативой для Google Play Music и Podcast под названием MusicSync. Так что, будучи близким к теме человеком, мне захотелось поделиться своим опытом обслуживания приложений и заодно пояснить, почему меня эта новость нисколько не удивила.
У меня есть несколько сторонних проектов, базирующихся на бэкенд-сервере с ограниченным веб-интерфейсом, и их обслуживание требует намного меньше усилий.
Если же говорить о приложении Android, то обслуживать его в качестве хобби-проекта гораздо хлопотнее. Вот некоторые из проблем, с которыми мне приходилось сталкиваться.
Читать: https://habr.com/ru/companies/ruvds/articles/919434/?utm_campaign=919434
@a_cup_of_java | Другие наши каналы
Недавно наткнулся на новость о том, что количество приложений в Google Play Store сократилось на 47%.
Я сам энтузиаст разработки под Android и последние 5 лет работал над альтернативой для Google Play Music и Podcast под названием MusicSync. Так что, будучи близким к теме человеком, мне захотелось поделиться своим опытом обслуживания приложений и заодно пояснить, почему меня эта новость нисколько не удивила.
У меня есть несколько сторонних проектов, базирующихся на бэкенд-сервере с ограниченным веб-интерфейсом, и их обслуживание требует намного меньше усилий.
Если же говорить о приложении Android, то обслуживать его в качестве хобби-проекта гораздо хлопотнее. Вот некоторые из проблем, с которыми мне приходилось сталкиваться.
Читать: https://habr.com/ru/companies/ruvds/articles/919434/?utm_campaign=919434
@a_cup_of_java | Другие наши каналы
Как написать микробенчмарк
Команда Spring АйО перевела статью, в которой приведено несколько правил, которые следует учитывать при написании микробенчмарков для HotSpot JVM.
Читать: https://habr.com/ru/companies/spring_aio/articles/920146/?utm_campaign=920146
@a_cup_of_java | Другие наши каналы
Команда Spring АйО перевела статью, в которой приведено несколько правил, которые следует учитывать при написании микробенчмарков для HotSpot JVM.
Читать: https://habr.com/ru/companies/spring_aio/articles/920146/?utm_campaign=920146
@a_cup_of_java | Другие наши каналы
Эпизод 1: «Скобка, паб и виски с валидацией»
KafkaRail гудел на фоне.
Паб The Broken Tag, где начиналось утро героев, только просыпался — запах старого эля, крошки лог‑файлов, и бильярдный стол под тусклым светом прожектора. Через узел маршрута /corp/news метропоезд пронёсся, как push‑уведомление на рассвете. День в Киберляндии начинался.
JSON откинул капюшон куртки BitStone Protocol с QR‑патчем на рукаве, кивнул Mr. Parseley и заказал, как обычно, Schema Fresca. Он прошёл к бильярдному столу английского пула, стоявшему под старым плакатом «Keep Calm and Close Tags», где RAMmy спорил с TryCatch о синтаксисе ударов.
Читать: https://habr.com/ru/articles/920316/?utm_campaign=920316
@a_cup_of_java | Другие наши каналы
KafkaRail гудел на фоне.
Паб The Broken Tag, где начиналось утро героев, только просыпался — запах старого эля, крошки лог‑файлов, и бильярдный стол под тусклым светом прожектора. Через узел маршрута /corp/news метропоезд пронёсся, как push‑уведомление на рассвете. День в Киберляндии начинался.
JSON откинул капюшон куртки BitStone Protocol с QR‑патчем на рукаве, кивнул Mr. Parseley и заказал, как обычно, Schema Fresca. Он прошёл к бильярдному столу английского пула, стоявшему под старым плакатом «Keep Calm and Close Tags», где RAMmy спорил с TryCatch о синтаксисе ударов.
Читать: https://habr.com/ru/articles/920316/?utm_campaign=920316
@a_cup_of_java | Другие наши каналы
❤1
История Java: развитие, изучение Марса, битва с Microsoft, Spring, Gradle и Maven, IntelliJ IDEA и Eclipse
От появления до покорения Красной планеты. В этой статье — история языка Java: от первых шагов и битвы с Microsoft до инструментов, без которых не обходится ни один Java разработчик. И да, вы узнаете, при чём здесь дуб, кофе и остров.
Читать: https://habr.com/ru/companies/pvs-studio/articles/920360/?utm_campaign=920360
@a_cup_of_java | Другие наши каналы
От появления до покорения Красной планеты. В этой статье — история языка Java: от первых шагов и битвы с Microsoft до инструментов, без которых не обходится ни один Java разработчик. И да, вы узнаете, при чём здесь дуб, кофе и остров.
Читать: https://habr.com/ru/companies/pvs-studio/articles/920360/?utm_campaign=920360
@a_cup_of_java | Другие наши каналы
Docker выпустил новые усиленные базовые образы, которые снижают уязвимости до 95%. Эти минималистичные образы с автоматическим обновлением обеспечивают безопасность контейнеров и совместимы с популярными базовыми образами, упрощая их интеграцию в существующие проекты.
Подробности: https://www.infoq.com/news/2025/06/docker-hardened-images/
#en
@a_cup_of_java | Другие наши каналы
Подробности: https://www.infoq.com/news/2025/06/docker-hardened-images/
#en
@a_cup_of_java | Другие наши каналы
Пишем 3D-игру весом в 600Кб… Ч. 1
...которая работает на первом Android-смартфоне в мире, ретро-компьютерах из 90-х и даже Mac'ах!
Иногда у меня лежит душа просто взять и написать какую-нибудь небольшую игрушку с нуля, без использования готовых движков. В процессе разработки я ставлю перед собой интересные задачки: игра должна весить как можно меньше, работать на как можно большем числе платформ и использовать нетипичный для меня архитектурный паттерн. Недавно я написал трёхмерные «танчики», которые весят всего лишь 600 килобайт и в рамках подробной статьи готов рассказать о всех деталях разработки трёхмерной игры с нуля в 2025 году. Если вам интересно узнать, как работают небольшие 3D-демки «под капотом» от написания фреймворка до разработки геймплея — жду вас под катом!
Читать: https://habr.com/ru/companies/timeweb/articles/918270/?utm_campaign=918270
@a_cup_of_java | Другие наши каналы
...которая работает на первом Android-смартфоне в мире, ретро-компьютерах из 90-х и даже Mac'ах!
Иногда у меня лежит душа просто взять и написать какую-нибудь небольшую игрушку с нуля, без использования готовых движков. В процессе разработки я ставлю перед собой интересные задачки: игра должна весить как можно меньше, работать на как можно большем числе платформ и использовать нетипичный для меня архитектурный паттерн. Недавно я написал трёхмерные «танчики», которые весят всего лишь 600 килобайт и в рамках подробной статьи готов рассказать о всех деталях разработки трёхмерной игры с нуля в 2025 году. Если вам интересно узнать, как работают небольшие 3D-демки «под капотом» от написания фреймворка до разработки геймплея — жду вас под катом!
Читать: https://habr.com/ru/companies/timeweb/articles/918270/?utm_campaign=918270
@a_cup_of_java | Другие наши каналы
65050d76-cd8c-412e-9661-3e2d87da3ae3.gif
2.7 KB
Основы работы с массивами в Java
Статья подробно объясняет, как создавать и обрабатывать массивы в Java, включая сортировку, сравнение и преобразование в другие структуры данных. Практические примеры помогут как новичкам, так и опытным разработчикам освежить знания.
Подробности: http://www.java67.com/2018/02/10-examples-of-array-in-java-tutorial.html
#en
@a_cup_of_java | Другие наши каналы
Статья подробно объясняет, как создавать и обрабатывать массивы в Java, включая сортировку, сравнение и преобразование в другие структуры данных. Практические примеры помогут как новичкам, так и опытным разработчикам освежить знания.
Подробности: http://www.java67.com/2018/02/10-examples-of-array-in-java-tutorial.html
#en
@a_cup_of_java | Другие наши каналы
Как найти k-й элемент с конца в связном списке на Java?
В статье описан эффективный способ решения задачи за один проход с помощью двух указателей — медленного и быстрого. Этот метод позволяет быстро находить нужный элемент без повторного обхода списка. Как работает условие в цикле for?
В статье рассматривается смысл и особенности условия в цикле for, объясняется, как оно влияет на выполнение цикла и почему важно правильно его использовать для оптимизации кода. Это полезно для начинающих и опытных программистов. Полезные приёмы работы с массивами и структурами данных в Java
В статье рассмотрены основные методы работы с массивами и структурами данных на Java: сортировка, поиск, удаление элементов, а также реализация алгоритмов сортировки и обхода деревьев. Полезно для новичков и опытных разработчиков.
Подробности: http://www.java67.com/2020/04/how-to-find-kth-node-from-end-in-linked-list-java.html
#en
@a_cup_of_java | Другие наши каналы
В статье описан эффективный способ решения задачи за один проход с помощью двух указателей — медленного и быстрого. Этот метод позволяет быстро находить нужный элемент без повторного обхода списка. Как работает условие в цикле for?
В статье рассматривается смысл и особенности условия в цикле for, объясняется, как оно влияет на выполнение цикла и почему важно правильно его использовать для оптимизации кода. Это полезно для начинающих и опытных программистов. Полезные приёмы работы с массивами и структурами данных в Java
В статье рассмотрены основные методы работы с массивами и структурами данных на Java: сортировка, поиск, удаление элементов, а также реализация алгоритмов сортировки и обхода деревьев. Полезно для новичков и опытных разработчиков.
Подробности: http://www.java67.com/2020/04/how-to-find-kth-node-from-end-in-linked-list-java.html
#en
@a_cup_of_java | Другие наши каналы
Что такое рекурсия и как её использовать в JavaScript
Рекурсия — это техника, когда функция вызывает сама себя для решения задачи. В статье объясняют основы с примерами: от простой функции до вычисления факториала с контролем завершения, чтобы избежать бесконечного цикла. Что нового в мире Java?
Статья содержит обширный список тем — от основ Java и коллекций до современных подходов, таких как функциональное программирование и многопоточность. Полезный ресурс для подготовки к интервью и освоения ключевых технологий. Архив публикаций на блоге Soma Sharma
В архиве блога Soma Sharma собраны записи с 2012 по 2021 год, включая материалы за разные месяцы и годы. Представлена возможность подписки на новые публикации по электронной почте.
Подробности: http://www.java67.com/2021/11/how-to-use-recursion-in-javascript.html
#en
@a_cup_of_java | Другие наши каналы
Рекурсия — это техника, когда функция вызывает сама себя для решения задачи. В статье объясняют основы с примерами: от простой функции до вычисления факториала с контролем завершения, чтобы избежать бесконечного цикла. Что нового в мире Java?
Статья содержит обширный список тем — от основ Java и коллекций до современных подходов, таких как функциональное программирование и многопоточность. Полезный ресурс для подготовки к интервью и освоения ключевых технологий. Архив публикаций на блоге Soma Sharma
В архиве блога Soma Sharma собраны записи с 2012 по 2021 год, включая материалы за разные месяцы и годы. Представлена возможность подписки на новые публикации по электронной почте.
Подробности: http://www.java67.com/2021/11/how-to-use-recursion-in-javascript.html
#en
@a_cup_of_java | Другие наши каналы
10 непривычных моментов в Go для Java разработчика
Несколько лет назад я начал добавлять Go в свой арсенал языков (будучи на тот момент Java разработчиком). Мне было очень непривычно. Более того, я принял язык не с первой попытки. Причём пришлось принять его больше из-за сложившихся обстоятельств, чем по собственному желанию.
Но прошло время, Go стал моим основным языком и, рискну сказать, любимым. В статье ниже расскажу, почему язык казался мне непривычным, какие парадигмы мне пришлось поменять в своей голове и почему во многом это оказалось более эффективно.
Уточню: статья ориентирована больше на тех, кто планирует перейти в Go, чем для опытных разработчиков.
Читать: https://habr.com/ru/articles/920562/?utm_campaign=920562
@a_cup_of_java | Другие наши каналы
Несколько лет назад я начал добавлять Go в свой арсенал языков (будучи на тот момент Java разработчиком). Мне было очень непривычно. Более того, я принял язык не с первой попытки. Причём пришлось принять его больше из-за сложившихся обстоятельств, чем по собственному желанию.
Но прошло время, Go стал моим основным языком и, рискну сказать, любимым. В статье ниже расскажу, почему язык казался мне непривычным, какие парадигмы мне пришлось поменять в своей голове и почему во многом это оказалось более эффективно.
Уточню: статья ориентирована больше на тех, кто планирует перейти в Go, чем для опытных разработчиков.
Читать: https://habr.com/ru/articles/920562/?utm_campaign=920562
@a_cup_of_java | Другие наши каналы
😭2💊1
Вышел первый milestone Spring Vault 4.0 с поддержкой Spring Framework 7 и улучшенной безопасностью. Обновления получили Spring Boot, Security, Authorization Server и другие проекты. 30 июня 2025 завершится поддержка ряда релизов Spring OSS. Подробнее в релиз-ноутах.
Подробности: https://www.infoq.com/news/2025/06/spring-news-roundup-jun16-2025/
#en
@a_cup_of_java | Другие наши каналы
Подробности: https://www.infoq.com/news/2025/06/spring-news-roundup-jun16-2025/
#en
@a_cup_of_java | Другие наши каналы
Максимальная сумма на уровне бинарного дерева в Java
В статье рассматривается, как найти уровень бинарного дерева с максимальной суммой значений узлов на примере Java-кода. Подробно объяснена структура дерева и приведена реализация с использованием рекурсии для вычисления максимальной суммы уровня. Топовые ресурсы и вопросы для подготовки к интервью по Java и смежным технологиям собраны на одном портале. Здесь найдете практические примеры, курсы и разборы популярных алгоритмов и структур данных, которые помогут быстро прокачать навыки и успешно пройти собеседование. Архив публикаций с 2012 по 2023 год
В статье представлен обширный архив публикаций за период с 2012 по 2023 год с разбивкой по месяцам и годам. Это полезный ресурс для поиска материалов и анализа динамики контента за годы.
Подробности: http://www.java67.com/2022/01/how-to-find-maximum-sum-level-in-given-binary-tree-java.html
#en
@a_cup_of_java | Другие наши каналы
В статье рассматривается, как найти уровень бинарного дерева с максимальной суммой значений узлов на примере Java-кода. Подробно объяснена структура дерева и приведена реализация с использованием рекурсии для вычисления максимальной суммы уровня. Топовые ресурсы и вопросы для подготовки к интервью по Java и смежным технологиям собраны на одном портале. Здесь найдете практические примеры, курсы и разборы популярных алгоритмов и структур данных, которые помогут быстро прокачать навыки и успешно пройти собеседование. Архив публикаций с 2012 по 2023 год
В статье представлен обширный архив публикаций за период с 2012 по 2023 год с разбивкой по месяцам и годам. Это полезный ресурс для поиска материалов и анализа динамики контента за годы.
Подробности: http://www.java67.com/2022/01/how-to-find-maximum-sum-level-in-given-binary-tree-java.html
#en
@a_cup_of_java | Другие наши каналы
❤1
Как найти k-й по величине элемент в бинарном дереве поиска? В статье подробно разбирается алгоритм поиска k-го минимального элемента в BST на Java, объясняется структура дерева и приводится пример кода с объяснениями для удобного понимания. Обзор полезных материалов для программистов и IT-специалистов: от алгоритмов и структур данных до Java, Python и облачных технологий. В статье собраны ссылки на курсы, примеры кода и советы для подготовки к интервью. Полезно для развития карьеры в IT. Архив публикаций за последние годы
В статье представлен подробный архив публикаций блога с распределением по месяцам и годам с 2012 по 2024 год. Это позволяет проследить динамику и активность контента за длительный период.
Подробности: http://www.java67.com/2022/01/how-to-find-kth-smallest-element-in.html
#en
@a_cup_of_java | Другие наши каналы
В статье представлен подробный архив публикаций блога с распределением по месяцам и годам с 2012 по 2024 год. Это позволяет проследить динамику и активность контента за длительный период.
Подробности: http://www.java67.com/2022/01/how-to-find-kth-smallest-element-in.html
#en
@a_cup_of_java | Другие наши каналы
Что такое Deque в Java и как его использовать?
Deque — двунаправленная очередь, позволяющая добавлять и удалять элементы с обоих концов. Этот гибкий структура данных полезна, когда нужно работать с элементами в начале и конце одновременно. В статье есть пример кода и разбор основных операций. Лучшие бесплатные курсы по программированию и IT в одном месте. В подборке — обучение MEAN stack, DSA, SQL, Linux, Docker и многое другое. Отличный ресурс для развития навыков и старта карьеры в IT без затрат. Особенности работы с массивами и структурами данных в Java
Статья подробно рассматривает разные методы работы с массивами и списками в Java: от поиска и сортировки до преобразований и обхода деревьев. Полезный материал для тех, кто хочет углубить знания в программировании на Java.
Подробности: http://www.java67.com/2021/11/how-to-use-deque-in-java-example.html
#en
@a_cup_of_java | Другие наши каналы
Deque — двунаправленная очередь, позволяющая добавлять и удалять элементы с обоих концов. Этот гибкий структура данных полезна, когда нужно работать с элементами в начале и конце одновременно. В статье есть пример кода и разбор основных операций. Лучшие бесплатные курсы по программированию и IT в одном месте. В подборке — обучение MEAN stack, DSA, SQL, Linux, Docker и многое другое. Отличный ресурс для развития навыков и старта карьеры в IT без затрат. Особенности работы с массивами и структурами данных в Java
Статья подробно рассматривает разные методы работы с массивами и списками в Java: от поиска и сортировки до преобразований и обхода деревьев. Полезный материал для тех, кто хочет углубить знания в программировании на Java.
Подробности: http://www.java67.com/2021/11/how-to-use-deque-in-java-example.html
#en
@a_cup_of_java | Другие наши каналы
Комментарии в коде: зло или спасение ?
Когда нужны комментарии в коде, а когда без них лучше. Объясняем на примерах, как писать понятные и полезные комментарии
Читать: «Комментарии в коде: зло или спасение ?»
@a_cup_of_java | Другие наши каналы
Когда нужны комментарии в коде, а когда без них лучше. Объясняем на примерах, как писать понятные и полезные комментарии
Читать: «Комментарии в коде: зло или спасение ?»
@a_cup_of_java | Другие наши каналы
Spring AI: retrieval augmented generation
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
Читать: https://habr.com/ru/articles/920992/?utm_campaign=920992
@a_cup_of_java | Другие наши каналы
Spring AI, который только недавно получил первую стабильную версию, уже предоставляет довольно много возможностей для работы с RAG (retrieval augmented generation).
Благодаря этому подходу нейросеть перед тем, как дать ответ на запрос пользователя, выполнит поиск подходящей информации в векторном хранилище. Причём каждый документ хранится не в виде текста, а в виде массива чисел (т.н. «векторов»).
Процесс преобразования различных документов в такой векторный формат выполняется опять же с помощью LLM и называется embedding («встраивание»). Хорошая новость заключается в том, что всё это можно легко сделать с помощью Spring AI.
Читать: https://habr.com/ru/articles/920992/?utm_campaign=920992
@a_cup_of_java | Другие наши каналы
👍1
Базовый обзор @TempDir в Java
Привет, Хабр!
Сегодня разберемся с
Читать: https://habr.com/ru/companies/otus/articles/920200/?utm_campaign=920200
@a_cup_of_java | Другие наши каналы
Привет, Хабр!
Сегодня разберемся с
@TempDir — мощным, но часто недооценённым инструментом JUnit 5 для работы с временными файлами и директориями в тестах.Читать: https://habr.com/ru/companies/otus/articles/920200/?utm_campaign=920200
@a_cup_of_java | Другие наши каналы
👍1
Java: обновления от MicroProfile, Open Liberty и Apple SwiftJava
В этот раз представлены свежие версии MicroProfile 7.1, Apache TomEE 10.1, Open Liberty 25 и JobRunr 8.0 beta с новыми функциями. Также анонсировали SwiftJava — инструмент для взаимодействия Java и Swift. Подробности в последнем обзоре InfoQ.
Подробности: https://www.infoq.com/news/2025/06/java-news-roundup-jun16-2025/
#en
@a_cup_of_java | Другие наши каналы
В этот раз представлены свежие версии MicroProfile 7.1, Apache TomEE 10.1, Open Liberty 25 и JobRunr 8.0 beta с новыми функциями. Также анонсировали SwiftJava — инструмент для взаимодействия Java и Swift. Подробности в последнем обзоре InfoQ.
Подробности: https://www.infoq.com/news/2025/06/java-news-roundup-jun16-2025/
#en
@a_cup_of_java | Другие наши каналы
Преодоление сложности в самом сердце Анемичной Модели
Доброго времени суток, Хабр!
Сегодня хотел бы поговорить об анемичной модели — одном из самых дискуссионных топиков (особенно для приверженцев DDD) и о том, как, по моему мнению, правильно её готовить. Для кого-то анемичная модель — это антипаттерн, тогда как для других это единственный правильный способ реализации приложений. Многие использовали её годами и даже не знали, как она называется, и что кем-то она считается антипаттерном. Реальность же такова, что анемичная модель — это инструмент, который может подходить или не подходить в зависимости от ситуации, но при этом является очень популярным и, по факту, «стандартом де-факто» для многих программистов и организаций. Хотя в последние годы я и вижу тенденцию к тому, что DDD и, соответственно, богатая доменная модель становятся всё популярнее, пока что, по моему мнению, им далеко до популярности анемичной модели.
Читать: https://habr.com/ru/articles/917012/?utm_campaign=917012
@a_cup_of_java | Другие наши каналы
Доброго времени суток, Хабр!
Сегодня хотел бы поговорить об анемичной модели — одном из самых дискуссионных топиков (особенно для приверженцев DDD) и о том, как, по моему мнению, правильно её готовить. Для кого-то анемичная модель — это антипаттерн, тогда как для других это единственный правильный способ реализации приложений. Многие использовали её годами и даже не знали, как она называется, и что кем-то она считается антипаттерном. Реальность же такова, что анемичная модель — это инструмент, который может подходить или не подходить в зависимости от ситуации, но при этом является очень популярным и, по факту, «стандартом де-факто» для многих программистов и организаций. Хотя в последние годы я и вижу тенденцию к тому, что DDD и, соответственно, богатая доменная модель становятся всё популярнее, пока что, по моему мнению, им далеко до популярности анемичной модели.
Читать: https://habr.com/ru/articles/917012/?utm_campaign=917012
@a_cup_of_java | Другие наши каналы
Шардируй меня полностью
Пришло время заключительной статьи проекта Mireapay, в этой последней статье программы минимум автор расскажет о том, как шардировать сервисы и какие варианты возможны. Но что самое главное, как это сделать просто и не тратить лишнее время на разработку в дальнейшем.
Фотографировать
Читать: https://habr.com/ru/articles/921274/?utm_campaign=921274
@a_cup_of_java | Другие наши каналы
Пришло время заключительной статьи проекта Mireapay, в этой последней статье программы минимум автор расскажет о том, как шардировать сервисы и какие варианты возможны. Но что самое главное, как это сделать просто и не тратить лишнее время на разработку в дальнейшем.
Фотографировать
Читать: https://habr.com/ru/articles/921274/?utm_campaign=921274
@a_cup_of_java | Другие наши каналы