Методы класса Object, продолжение
Эти методы связаны с концепцией мониторов и синхронизации потоков выполнения в Java. Они используются для координации работы потоков и обеспечения безопасного доступа к ресурсам в многопоточной среде.
Имейте в виду, что методы
Учтите, что в большинстве случаев вам не понадобится использовать эти методы напрямую, так как существуют более современные и удобные механизмы для работы с многопоточностью в Java, такие как классы из пакета java.util.concurrent.
notify(): метод используется для возобновления выполнения потока, ожидающего монитор объекта с помощью метода wait(). Обычно используется в контексте многопоточности.notifyAll(): аналогично методу notify(), но возобновляет выполнение всех потоков, ожидающих монитор объекта.wait(): приостанавливает выполнение потока до тех пор, пока другой поток не вызовет метод notify() или notifyAll() на том же объекте.wait(long timeout): аналогично методу wait(), но добавляет временное ограничение на ожидание, указанное в миллисекундах.wait(long timeout, int nanos): аналогично методу wait(long timeout), но позволяет указать временное ограничение с точностью до наносекунд.Эти методы связаны с концепцией мониторов и синхронизации потоков выполнения в Java. Они используются для координации работы потоков и обеспечения безопасного доступа к ресурсам в многопоточной среде.
Имейте в виду, что методы
notify(), notifyAll() и wait() вызываются только внутри синхронизированного блока кода или метода, который синхронизирован с использованием ключевого слова synchronized.Учтите, что в большинстве случаев вам не понадобится использовать эти методы напрямую, так как существуют более современные и удобные механизмы для работы с многопоточностью в Java, такие как классы из пакета java.util.concurrent.
👍11❤3
Делаю для вас видос. Делаю столько же ошибок сколько и новичок в коде)
Если плохой код - это говнокод, то неудачные дубли это…
Продолжите в комментах)
Если плохой код - это говнокод, то неудачные дубли это…
Продолжите в комментах)
❤12😁3👍1
Так, ребята, не успеваю запилить видос ко времени, к которому хотелось бы, а оставлять вас без дела тоже не хочу.
Поэтому вот вам задание на следующий этап.
Изучите формат JSON
Вам необходимо научиться парсить JSON строки. Для этого:
💠 Подтяните к себе в проект библиотеку jackson. В pom.xml в блоке dependencies укажите такую зависимость (скрин того как надо укажу в комментах)
💠 Обновите зависимости проекта. Для этого в IDEA клацаете ПКМ внутри pom.xml -> maven -> reload project
💠 Для сериализации объектов в json строки и дессериализации json строк в объекты вам нужно использовать класс
💠 Просто введите в коде
💠 Почитайте о работе с данным классом. В основном, вам потребуется всего два метода:
И когда вы все это сделаете, вы будете готовы к выполнению самого задания на следующий этап)
А оно вот такое:
Заведите класс
Теперь вместо строк, вы должны сохранять объекты класса
API останется тем же. Только теперь вместо простой строки, необходимо вводить конкретного person-a в json формате. Например так:
Ставь лайк, если зачесались руки 🤩
Поэтому вот вам задание на следующий этап.
Изучите формат JSON
Вам необходимо научиться парсить JSON строки. Для этого:
💠 Подтяните к себе в проект библиотеку jackson. В pom.xml в блоке dependencies укажите такую зависимость (скрин того как надо укажу в комментах)
💠 Обновите зависимости проекта. Для этого в IDEA клацаете ПКМ внутри pom.xml -> maven -> reload project
💠 Для сериализации объектов в json строки и дессериализации json строк в объекты вам нужно использовать класс
ObjectMapper из библиотеки jackson, которую вы подтяните шагом ранее. 💠 Просто введите в коде
ObjectMapper, и если вы все сделали правильно с зависимостями, IDEA предложит импортировать данный класс.💠 Почитайте о работе с данным классом. В основном, вам потребуется всего два метода:
readValue и writeValueAsString. В комментах выложу примеры кода по работе с данным классом.И когда вы все это сделаете, вы будете готовы к выполнению самого задания на следующий этап)
А оно вот такое:
Заведите класс
Person с полями:name - String,
age - IntegerТеперь вместо строк, вы должны сохранять объекты класса
Person.API останется тем же. Только теперь вместо простой строки, необходимо вводить конкретного person-a в json формате. Например так:
{ "name": "bob", "age": 25 }Ставь лайк, если зачесались руки 🤩
❤17😍2
Media is too big
VIEW IN TELEGRAM
Привет, друзья!
Надо объяснить куда я пропал.
Мне хотелось сделать большой и классный видос на youtube про свое решение нашей String CRUD задачки. Но увы, я уперся и дальше что-то никак не идет. Отнимает много внутренних ресурсов, а результата ноль. И к тому же, ничего другого постить не могу, так как "не закончил ведь видос снимать".
Поэтому я решил отложить эту идею до лучших времен и двигаться дальше. Большой и классный видос я вам не покажу, но маленький, ламповый видосик, записанный на скрипучий микрофон с радостью скину)
Вы можете скачать мое решение отсюда: https://github.com/yourjm/project1/tree/string_crud
И сделать мне ревью кода. Вопросы и замечания приветствуются. Пояснения к коду смотрите в видосике. Надеюсь, вы найдете для себя много чего-полезного.
А я пока подумаю, как нам дальше двигаться вперед 😎
Надо объяснить куда я пропал.
Мне хотелось сделать большой и классный видос на youtube про свое решение нашей String CRUD задачки. Но увы, я уперся и дальше что-то никак не идет. Отнимает много внутренних ресурсов, а результата ноль. И к тому же, ничего другого постить не могу, так как "не закончил ведь видос снимать".
Поэтому я решил отложить эту идею до лучших времен и двигаться дальше. Большой и классный видос я вам не покажу, но маленький, ламповый видосик, записанный на скрипучий микрофон с радостью скину)
Вы можете скачать мое решение отсюда: https://github.com/yourjm/project1/tree/string_crud
И сделать мне ревью кода. Вопросы и замечания приветствуются. Пояснения к коду смотрите в видосике. Надеюсь, вы найдете для себя много чего-полезного.
А я пока подумаю, как нам дальше двигаться вперед 😎
👍13❤1
📢 Привет, друзья! В рамках нашего Sting CRUD проекта вам пришлось много парсить строки. Сегодня я предлагаю вам 10 сложных упражнений, которые помогут вам совершенствовать навык парсинга строк. Эти задания потребуют от вас применения различных методов работы со строками в Java и помогут вам стать опытными разработчиками. Готовы принять вызов? Давайте начнем!
1️⃣ Упражнение 1: Парсинг даты
Напишите метод, который принимает строку, содержащую дату в формате "dd.MM.yyyy", и возвращает объект типа LocalDate, представляющий эту дату.
2️⃣ Упражнение 2: Разбор CSV
Напишите метод, который принимает строку, содержащую данные в формате CSV (Comma-Separated Values, запятая в качестве разделителя), и возвращает массив массивов строк, представляющих значения каждой строки в CSV.
3️⃣ Упражнение 3: Поиск и замена
Напишите метод, который принимает строку и два шаблона: начальный и конечный. Метод должен найти все вхождения начального шаблона в строку и заменить их на конечный шаблон.
4️⃣ Упражнение 4: Извлечение чисел
Напишите метод, который принимает строку и извлекает из нее все числа, возвращая их в виде массива целых чисел.
5️⃣ Упражнение 5: Парсинг JSON
Напишите метод, который принимает строку, содержащую данные в формате JSON, и возвращает объект, представляющий эти данные.
6️⃣ Упражнение 6: Обратный порядок слов, игнорируя знаки препинания
Напишите метод, который меняет порядок слов в строке на обратный, игнорируя знаки препинания, и возвращает новую строку.
7️⃣ Упражнение 7: Проверка сбалансированности скобок
Напишите метод, который принимает строку, содержащую скобки (круглые, квадратные и фигурные) и проверяет, является ли она сбалансированной, то есть каждой открывающей скобке соответствует закрывающая.
8️⃣ Упражнение 8: Удаление HTML-тегов
Напишите метод, который удаляет все HTML-теги из строки и возвращает новую строку без тегов.
9️⃣ Упражнение 9: Подсчет слов с учетом регистра
Напишите метод, который подсчитывает количество вхождений каждого слова в строке, учитывая регистр, и возвращает словарь, где ключами являются слова, а значениями - их количество.
🔟 Упражнение 10: Разбор URL
Напишите метод, который принимает строку, содержащую URL, и разбирает ее на составляющие (протокол, хост, путь и т.д.), возвращая объект, представляющий эти компоненты.
Просьба выполнить эти упражнения и написать соответствующие тесты для каждого из них. Эти задания помогут вам улучшить ваш навык парсинга строк и написания тестов, что сделает вас еще более квалифицированными Java разработчиками.
Завтра я выложу решения для каждого упражнения, и вы сможете сверить свои результаты с моими.
Удачи, и продолжайте развиваться в программировании на Java! 🚀💻
1️⃣ Упражнение 1: Парсинг даты
Напишите метод, который принимает строку, содержащую дату в формате "dd.MM.yyyy", и возвращает объект типа LocalDate, представляющий эту дату.
2️⃣ Упражнение 2: Разбор CSV
Напишите метод, который принимает строку, содержащую данные в формате CSV (Comma-Separated Values, запятая в качестве разделителя), и возвращает массив массивов строк, представляющих значения каждой строки в CSV.
3️⃣ Упражнение 3: Поиск и замена
Напишите метод, который принимает строку и два шаблона: начальный и конечный. Метод должен найти все вхождения начального шаблона в строку и заменить их на конечный шаблон.
4️⃣ Упражнение 4: Извлечение чисел
Напишите метод, который принимает строку и извлекает из нее все числа, возвращая их в виде массива целых чисел.
5️⃣ Упражнение 5: Парсинг JSON
Напишите метод, который принимает строку, содержащую данные в формате JSON, и возвращает объект, представляющий эти данные.
6️⃣ Упражнение 6: Обратный порядок слов, игнорируя знаки препинания
Напишите метод, который меняет порядок слов в строке на обратный, игнорируя знаки препинания, и возвращает новую строку.
7️⃣ Упражнение 7: Проверка сбалансированности скобок
Напишите метод, который принимает строку, содержащую скобки (круглые, квадратные и фигурные) и проверяет, является ли она сбалансированной, то есть каждой открывающей скобке соответствует закрывающая.
8️⃣ Упражнение 8: Удаление HTML-тегов
Напишите метод, который удаляет все HTML-теги из строки и возвращает новую строку без тегов.
9️⃣ Упражнение 9: Подсчет слов с учетом регистра
Напишите метод, который подсчитывает количество вхождений каждого слова в строке, учитывая регистр, и возвращает словарь, где ключами являются слова, а значениями - их количество.
🔟 Упражнение 10: Разбор URL
Напишите метод, который принимает строку, содержащую URL, и разбирает ее на составляющие (протокол, хост, путь и т.д.), возвращая объект, представляющий эти компоненты.
Просьба выполнить эти упражнения и написать соответствующие тесты для каждого из них. Эти задания помогут вам улучшить ваш навык парсинга строк и написания тестов, что сделает вас еще более квалифицированными Java разработчиками.
Завтра я выложу решения для каждого упражнения, и вы сможете сверить свои результаты с моими.
Удачи, и продолжайте развиваться в программировании на Java! 🚀💻
👍13
Media is too big
VIEW IN TELEGRAM
Теперь скину вам свое решение по работе с объектом класса Person вместо строки.
Посмотреть изменения можно сздесь:
https://github.com/yourjm/project1/pull/1/files
Скачать решение можно отсюда:
https://github.com/yourjm/project1/tree/person_json
Ссылка на требования к данному этапу:
https://news.1rj.ru/str/your_java_mentor/67
Посмотреть изменения можно сздесь:
https://github.com/yourjm/project1/pull/1/files
Скачать решение можно отсюда:
https://github.com/yourjm/project1/tree/person_json
Ссылка на требования к данному этапу:
https://news.1rj.ru/str/your_java_mentor/67
Media is too big
VIEW IN TELEGRAM
Как и обещал, делаю ревью человеку, который первым выложил решение к задаче.
@MikhailSumarokov это твое)
Напоминаю, что теперь бесплатно ревью буду делать только первому решившему.
Для всех остальных, ревью в видео-формате будет доступно за:
небольшой донат
либо
рекламку моего канал и (небольшой донат) / 2
Если вы хотите получить видео-разбор своего решения, напишите мне в лс (@zor_07), либо под этим постом чирканите "хочу ревью"
@MikhailSumarokov это твое)
Напоминаю, что теперь бесплатно ревью буду делать только первому решившему.
Для всех остальных, ревью в видео-формате будет доступно за:
небольшой донат
либо
рекламку моего канал и (небольшой донат) / 2
Если вы хотите получить видео-разбор своего решения, напишите мне в лс (@zor_07), либо под этим постом чирканите "хочу ревью"
👍10
Привет, друзья!
Вчера я выложил вам задачки на парсинг строк.
В комментах к этому посту выложу решения к каждой задачке.
Сохраняйте, чтобы не потерять!
Обратите внимание, что эти примеры решений являются лишь одним из множества возможных подходов. Ваше решение может отличаться в зависимости от требований и предпочтений.
Успехов в выполнении этих упражнений, и продолжайте развиваться в программировании на Java! 🚀💻
Вчера я выложил вам задачки на парсинг строк.
В комментах к этому посту выложу решения к каждой задачке.
Сохраняйте, чтобы не потерять!
Обратите внимание, что эти примеры решений являются лишь одним из множества возможных подходов. Ваше решение может отличаться в зависимости от требований и предпочтений.
Успехов в выполнении этих упражнений, и продолжайте развиваться в программировании на Java! 🚀💻
🔥8❤1
Привет, друзья!
Хочу дать вам следующее задание по нашему CRUD приложению.
Работа с HashMap - это конечно круто, но работа с реальной БД - еще круче 😎
Поэтому следующее задание - развернуть базу данных и создать в ней таблицу Person с полями id, age и name.
Но не просто развернуть, а сделать это в докер-контейнере 🐳
Соберем все воедино.
1. Напишите docker-compose файл, который развернет вам Postgres контейнер
2. Напишите init.sql файл, внутри которого напишите скрипт создания таблицы Person
3. Попробуйте настроить docker-compose таким образом, чтобы он выполнил скрипт init.sql
Завтра-послезавтра выложу свое решение 🚀
Хочу дать вам следующее задание по нашему CRUD приложению.
Работа с HashMap - это конечно круто, но работа с реальной БД - еще круче 😎
Поэтому следующее задание - развернуть базу данных и создать в ней таблицу Person с полями id, age и name.
Но не просто развернуть, а сделать это в докер-контейнере 🐳
Соберем все воедино.
1. Напишите docker-compose файл, который развернет вам Postgres контейнер
2. Напишите init.sql файл, внутри которого напишите скрипт создания таблицы Person
3. Попробуйте настроить docker-compose таким образом, чтобы он выполнил скрипт init.sql
Завтра-послезавтра выложу свое решение 🚀
🔥10
Отвечу отдельным постом на этот вопрос.
1️⃣ Первый шаг по выполнению задания по развертыванию бд в докере - установка самого докера
Для этого, в зависимости от того, какая у вас ОС надо гуглить:
Для того, чтобы удостовериться, что вы правильно установили докер необходимо выполнить команду:
Данная команда скачает вам образ докер контейнера и развернет его. Если все ок, вы должны будете увидеть сообщение, которое начинается со слов:
2️⃣ Затем, вам необходимо установить docker-compose. Гуглить по аналогии с поисковым запросом по установке докера. Только вместо docker укажите docker-compose
В интернете много статей на эту тему.
Как только вы выполните эти пункты можете задавать следующий вопрос)
✳️ Я разделяю философию - изучай делая. В работе программиста всегда нужно будет изучать новые технологии, фреймворки и тулы.
Позже я все равно расскажу о докере, а пока попробуйте сделать самостоятельно )
1️⃣ Первый шаг по выполнению задания по развертыванию бд в докере - установка самого докера
Для этого, в зависимости от того, какая у вас ОС надо гуглить:
Docker install windows/ubuntu/mac/итпДля того, чтобы удостовериться, что вы правильно установили докер необходимо выполнить команду:
docker run hello-worldДанная команда скачает вам образ докер контейнера и развернет его. Если все ок, вы должны будете увидеть сообщение, которое начинается со слов:
Hello from Docker!2️⃣ Затем, вам необходимо установить docker-compose. Гуглить по аналогии с поисковым запросом по установке докера. Только вместо docker укажите docker-compose
В интернете много статей на эту тему.
Как только вы выполните эти пункты можете задавать следующий вопрос)
✳️ Я разделяю философию - изучай делая. В работе программиста всегда нужно будет изучать новые технологии, фреймворки и тулы.
Позже я все равно расскажу о докере, а пока попробуйте сделать самостоятельно )
🔥6❤1👍1
Продолжаем плавно знакомиться с Docker 🐳
💡 Представьте себе виртуальную машину, на которой будет установлен linux, в этот linux установится Java, maven и прочие технологии, требуемые для работы Java приложения. И внутри этой ВМ вы запустите свое приложение.
🀄Также представте, что данная виртуальная машина, в сравении с другими, будет быстрее запускаться, потреблять меньше ресурсов и занимать меньше места на диске. Это и есть докер-контейнер.
Докер контейнер - это запускаемая и изолированная среда, в которой работает приложение и все его зависимости. Он создается на основе докер образа.
Докер образ - это шаблон или инструкция для создания докер контейнера. Например, мы можем "сказать" докеру - создай мне образ, на основе ОС Ubuntu, установи на него Java 17. И на основе данного образа вы сможете запускать множество контейнеров.
А Docker - это ПО, которое помогает упаковать и запустить приложения в изолированных средах, т.е. контейнерах.
Сегодня была упрощенная теория, практика будет завтра)
💡 Представьте себе виртуальную машину, на которой будет установлен linux, в этот linux установится Java, maven и прочие технологии, требуемые для работы Java приложения. И внутри этой ВМ вы запустите свое приложение.
🀄Также представте, что данная виртуальная машина, в сравении с другими, будет быстрее запускаться, потреблять меньше ресурсов и занимать меньше места на диске. Это и есть докер-контейнер.
Докер контейнер - это запускаемая и изолированная среда, в которой работает приложение и все его зависимости. Он создается на основе докер образа.
Докер образ - это шаблон или инструкция для создания докер контейнера. Например, мы можем "сказать" докеру - создай мне образ, на основе ОС Ubuntu, установи на него Java 17. И на основе данного образа вы сможете запускать множество контейнеров.
А Docker - это ПО, которое помогает упаковать и запустить приложения в изолированных средах, т.е. контейнерах.
Сегодня была упрощенная теория, практика будет завтра)
👍6❤2
🏁 Spring CRUD проект, карта активности
Цель - создать простой пет-проект на Spring-Boot
1️⃣ CRUD операции на строке используя HashMap
Задание
Мое решение
2️⃣ Заменяем строку на Person, используем JSON
Задание
Мое решение
3️⃣ Развертываем БД в докер-образе
Задание
Мое решение
4️⃣ Замена HashMap на реальную базу данных с использованием JDBC
Задание
Мое решение
PS Данная карта будет пополняться по мере прохождения
Цель - создать простой пет-проект на Spring-Boot
1️⃣ CRUD операции на строке используя HashMap
Задание
Мое решение
2️⃣ Заменяем строку на Person, используем JSON
Задание
Мое решение
3️⃣ Развертываем БД в докер-образе
Задание
Мое решение
4️⃣ Замена HashMap на реальную базу данных с использованием JDBC
Задание
Мое решение
PS Данная карта будет пополняться по мере прохождения
❤11
Media is too big
VIEW IN TELEGRAM
Итак, друзья!
Вот что сделано: https://github.com/yourjm/project1/compare/person_json...docker_compose
Для тех, кто желает ворваться в наш маленький квест по созданию пет-проекта на Spring, можно скачать проект вот отсюда посмотреть что было уже сделано, и продолжать работу прям со следующего задания, модифицируя написанный мною код
В видео я еще раз рассказываю о докере и о том, как с ним работать. Как говорил в видео, новичку не обязательно вникать в тонкости работы докера, достаточно просто уметь с ним работать. Минимальное количество действий, достаточное для работы с докером я показал на видосике выше
Те из вас, кто уже начал кодить со мной - вы большие молодцы, продолжайте в том же духе 😎
Для вас специальное задания - повторить мои действия из видео, и написать в комментах, что базу развернуть удалось. Будут вопросы - пишите также в комменты
ЗЫ Что вообще происходит
Вот что сделано: https://github.com/yourjm/project1/compare/person_json...docker_compose
Для тех, кто желает ворваться в наш маленький квест по созданию пет-проекта на Spring, можно скачать проект вот отсюда посмотреть что было уже сделано, и продолжать работу прям со следующего задания, модифицируя написанный мною код
В видео я еще раз рассказываю о докере и о том, как с ним работать. Как говорил в видео, новичку не обязательно вникать в тонкости работы докера, достаточно просто уметь с ним работать. Минимальное количество действий, достаточное для работы с докером я показал на видосике выше
Те из вас, кто уже начал кодить со мной - вы большие молодцы, продолжайте в том же духе 😎
Для вас специальное задания - повторить мои действия из видео, и написать в комментах, что базу развернуть удалось. Будут вопросы - пишите также в комменты
ЗЫ Что вообще происходит
🔥11❤1
Приветствую всех любителей нажимать на кнопочки и получать за это деньги!
Решил запилить навигационный пост, чтобы всем было удобнее ориентироваться тут 🔍
Для тех, кто у нас совсем недавно, расскажу кратко про себя и наш ламповый чатик.
Меня зовут Анзор, и я помогаю начинающим Java программистам прокачивать свои скиллы и находить работу.
В этом канале я делюсь различными материалами по Java, а также агитирую людей писать код 💻
Навигация по каналу:
Обо мне
💠 Меня зовут Анзор...
💠 Это видео я снял 4 месяца назад...
💠 Картиночки...
Наставничество
👨🏫 О моем наставничестве
Отзывы учеников
👨🎓 Отзыв от Дани
👨🎓 Отзыв от Адама
Проекты нашего канала
🧑💻 Spring CRUD
Решил запилить навигационный пост, чтобы всем было удобнее ориентироваться тут 🔍
Для тех, кто у нас совсем недавно, расскажу кратко про себя и наш ламповый чатик.
Меня зовут Анзор, и я помогаю начинающим Java программистам прокачивать свои скиллы и находить работу.
В этом канале я делюсь различными материалами по Java, а также агитирую людей писать код 💻
Навигация по каналу:
Обо мне
💠 Меня зовут Анзор...
💠 Это видео я снял 4 месяца назад...
💠 Картиночки...
Наставничество
👨🏫 О моем наставничестве
Отзывы учеников
👨🎓 Отзыв от Дани
👨🎓 Отзыв от Адама
Проекты нашего канала
🧑💻 Spring CRUD
❤8👍4
This media is not supported in your browser
VIEW IN TELEGRAM
Итак, мой первый пет-проект, игра морской бой
Я начал писать его еще в школе, когда занимался паскалем у репетитора. Но не смог победить проблему, которую озвучил в кружопеле выше 🤯
А спустя годы и два отчисления из универа, я вдруг почувствовал, что созрел 🦾
На видео выше демонстрация того, как компьютер "стреляет" по оппоненту. Здесь нет передачи хода человеку, стреляет только компьютер. Он стреляет рандомно, но попав в какой-то кораблик, добивает его системно.
Я был счастлив, когда все заработало 🥹
Я написал данный проект на SWING. Это библиотека для создания графических интерфейсов на Java. Почти никто не пишет GUI на Java сейчас (как собственно этого никто не делал и тогда).
Но у меня не было наставника, который сказал бы мне учить Spring, так что я потратил уйму времени на изучение невостребованного стека. Я об этом, конечно, не жалею, но сейчас стараюсь уберегать своих учеников от подобных ошибок 👨🎓
PS Видео сделано 7 лет назад, так что отнеситесь с пониманием к его качеству и выбору музыки 😅
Я начал писать его еще в школе, когда занимался паскалем у репетитора. Но не смог победить проблему, которую озвучил в кружопеле выше 🤯
А спустя годы и два отчисления из универа, я вдруг почувствовал, что созрел 🦾
На видео выше демонстрация того, как компьютер "стреляет" по оппоненту. Здесь нет передачи хода человеку, стреляет только компьютер. Он стреляет рандомно, но попав в какой-то кораблик, добивает его системно.
Я был счастлив, когда все заработало 🥹
Я написал данный проект на SWING. Это библиотека для создания графических интерфейсов на Java. Почти никто не пишет GUI на Java сейчас (как собственно этого никто не делал и тогда).
Но у меня не было наставника, который сказал бы мне учить Spring, так что я потратил уйму времени на изучение невостребованного стека. Я об этом, конечно, не жалею, но сейчас стараюсь уберегать своих учеников от подобных ошибок 👨🎓
PS Видео сделано 7 лет назад, так что отнеситесь с пониманием к его качеству и выбору музыки 😅
❤11🔥1🤩1