Platinum DEV
Platinum DEV
  • 70
  • 873 047
Всё о HttpClient и запросах в .NET
HttpClient... С одной стороны это базовая тема. И в каком-то смысле "заезженная", но если копнуть глубже, то она вовсе не простая. Прошлым летом на работе меня попросили подготовить доклад на внутреннюю конференцию и я выбрал эту тему. А также написать небольшую статью на хабр. Кстати, будет очень здорово, если вы ее посмотрите. Так что, тема, можно сказать, обкатана и в новом видео мы подробно ее разберем.
Статья на Хабре: habr.com/ru/companies/zyfra/articles/780226/
Поддержать канал: pay.cloudtips.ru/p/cb07a2f0
Код: github.com/andreisfedotov/HttpClientSandbox
Telegram-канал: t.me/platinum_tech_talks
Telegram-чат для всех: t.me/platinum_chat
00:00 - Начало
00:11 - Приветствие
01:22 - Вступление
02:31 - Краткая история развития протокола HTTP
08:28 - История выполнения HTTP-запросов в мире .NET
10:09 - HttpClient
11:47 - Альтернативы HttpClient
12:45 - Проблемы HttpClient
20:36 - HttpClientHandler
21:29 - Общий flow HttpRequestMessage
25:25 - IHttpClientFactory
32:54 - Внутреннее устройство IHttpClientFactory
42:00 - Плохие примеры из реальных проектов
43:05 - Выводы и рекомендации
43:32 - Параллельная симфония собачьего лая
44:34 - Ссылки
45:46 - Конец
Переглядів: 2 372

Відео

Что нового в C# 12
Переглядів 5 тис.10 місяців тому
Код с примерами: github.com/platinum-team/csharp12-features Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat 00:00 Вступление 01:03 Фича: Псевдоним любого типа 03:40 Фича: Первичные конструкторы 09:20 Фича: Выражения коллекции 12:19 Фича: Встроенные массивы 13:00 Фича: Параметры лямбда выражений по умолча...
Что нового в C# 11 - новые фичи языка C#
Переглядів 8 тис.2 роки тому
Код из видео: github.com/andreisfedotov/csharp11-features Рассматриваем основные фичи C# 11 .NET 7 Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat
Собеседование .NET 2022 - Разбор вопросов
Переглядів 35 тис.2 роки тому
Отобрали несколько вопросов, которые задавались на разных собеседованиях в различные компании в этом году и разобрали их. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat 00:00 - Вступление 01:52 - await внутри конструкции lock 06:39 - В чем ошибка этого кода (гонки потоков, async, await..) 13:03 - Какой ...
8. Minimal APIs для больших проектов
Переглядів 4,9 тис.2 роки тому
Проекты имеют свойство разрастаться. В этом видео мы поговорим о том, как можно было бы структурировать Minimal APIs проект в реальной разработке. Технология новая, опыта разработчиками накоплено немного, но тем не менее какие-то рекомендации уже есть. На просторах сети есть, разные рекомендации о том как можно организовать код, но мне больше понравились размышления Шона Вёлдемуса на конференци...
7. Minimal APIs - добавляем аутентификацию
Переглядів 4,3 тис.2 роки тому
В данном видео мы добавим аутентификацию для Web API проекта. Сгенерируем токен доступа и закроем эндпоинты от неавторизованного доступа. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Код из видео: github.com/andreisfedotov/Hotels/commit/b15a656953179d3bbc5766a3ff01915a073acf89
6. Minimal APIs .NET 6 - что ещё интересного умеет эта технология
Переглядів 3,3 тис.2 роки тому
В данном видео мы посмотрим какие ещё клёвые вещи умеет делать Minimal APIs в .NET 6. Мы узнаем как в Minimal APIs вернуть XML (или любой другой отличный от формата ответа по-умолчанию). Также мы разберемся как определить кастомную DTO и то как ее парсить. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat ...
5. Minimal APIs - добавляем Swagger в Web API
Переглядів 3,6 тис.2 роки тому
В очередном выпуске по Minimal APIs мы посмотрим как подключить Swagger в проект для автодокументрования кода. В отличие от проектов, использующих контроллеры, здесь это выглядит очень интересно! Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Код из видео: github.com/andreisfedotov/Hotels/commit/898a81e...
4. Minimal APIs - добавляем репозиторий
Переглядів 4,5 тис.2 роки тому
В 4-м выпуске по Minimal APIs мы продолжим "усложнять" (разрабатывать) Web API проект для работы с информацией об отелях и добавим репозиторий, чтобы не работать с контекстом напрямую. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Код из видео 2-4: github.com/andreisfedotov/Hotels/commit/3d85bb2384d9ae...
3. Minimal APIs .NET 6 - добавляем базу данных
Переглядів 7 тис.2 роки тому
В этом видео мы продолжим писать Minimal APIs проект и добавим EntityFrameworkCore и базу данных. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Код из видео 2-4: github.com/andreisfedotov/Hotels/commit/3d85bb2384d9ae54a4c992c865f0af726602f40d
2. Minimal APIs .NET 6 - пишем компактный Web API проект
Переглядів 14 тис.2 роки тому
В данном видео мы напишем с нуля простой Minimal APIs проект, который будем улучшать в дальнейших видео. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Код из видео 2-4: github.com/andreisfedotov/Hotels/commit/3d85bb2384d9ae54a4c992c865f0af726602f40d
1. Minimal APIs .NET 6 - Вступление
Переглядів 15 тис.2 роки тому
Minimal APIs - новый подход к созданию Web API, который был представлен в .NET 6. В течение нескольких видео мы познакомимся с этой технологией и напишем небольшой Web API проект с нуля. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat Итоговый код: github.com/andreisfedotov/Hotels
Как бесплатно за 5 минут задеплоить любое веб приложение на Vercel
Переглядів 6 тис.2 роки тому
В данном коротком видео будет показано, как за 5 минут развернуть фронтенд приложение на платформе Vercel (ранее известный как Now). По словам разработчиков, Vercel - лучшее место чтобы бесплатно задеплоить своё приложение. Давайте посмотрим что это такое. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Telegram чат для всех: t.me/platinum_chat
Всё о Enum в C# | Перечисления в C# .NET
Переглядів 3,5 тис.3 роки тому
В данном выпуске мы поговорим про перечисления в C# (Enum'ы). Поговорим о том, это такое и устраним все возможные пробелы в данной теме, а также посмотрим на подробных примерах различные сценарии использования. Если хотите поддержать канал: pay.cloudtips.ru/p/cb07a2f0 Мы в Telegram: t.me/platinum_tech_talks Чат для общения и вопросов: t.me/platinum_chat
Путь через искусственный интеллект и нейронные сети
Переглядів 6723 роки тому
В этом выпуске у нас в гостях инженер-программист и молодой учёный - Алексей Першуткин. Вместе с ним мы познакомимся с его деятельностью, поговорим про искусственный интеллект и нейронные сети. Мы в Telegram: t.me/platinum_tech_talks Чат для общения и вопросов: t.me/platinum_chat
Всё об Entity Framework Core
Переглядів 56 тис.3 роки тому
Всё об Entity Framework Core
Собеседование C# - Задача на баланс скобок | Хеллоуиновский выпуск
Переглядів 9 тис.3 роки тому
Собеседование C# - Задача на баланс скобок | Хеллоуиновский выпуск
Что нового в C# 10 - новые фичи языка C#
Переглядів 15 тис.3 роки тому
Что нового в C# 10 - новые фичи языка C#
Serilog - Логгирование
Переглядів 12 тис.3 роки тому
Serilog - Логгирование
Автогенерация клиента для Web API. Использование клиента в React приложении
Переглядів 13 тис.3 роки тому
Автогенерация клиента для Web API. Использование клиента в React приложении
Версионирование API - поддержка нескольких версий
Переглядів 8 тис.3 роки тому
Версионирование API - поддержка нескольких версий
Swagger - автодокументирование кода
Переглядів 15 тис.3 роки тому
Swagger - автодокументирование кода
Unit-тесты в .NET с использованием xUnit
Переглядів 21 тис.3 роки тому
Unit-тесты в .NET с использованием xUnit
IdentityServer4 - логин и регистрация пользователя
Переглядів 17 тис.3 роки тому
IdentityServer4 - логин и регистрация пользователя
IdentityServer4 - Пишем свой сервис авторизации. Конфигурация
Переглядів 25 тис.3 роки тому
IdentityServer4 - Пишем свой сервис авторизации. Конфигурация
Аутентификация и авторизация - OAuth, OIDC, IdentityServer
Переглядів 18 тис.3 роки тому
Аутентификация и авторизация - OAuth, OIDC, IdentityServer
Что такое Middleware? Пишем свой Middleware для обработки исключений
Переглядів 15 тис.3 роки тому
Что такое Middleware? Пишем свой Middleware для обработки исключений
FluentValidation - валидация данных с Fluent API
Переглядів 13 тис.3 роки тому
FluentValidation - валидация данных с Fluent API
Создание ASP NET Core Web API приложения
Переглядів 30 тис.3 роки тому
Создание ASP NET Core Web API приложения
Внедрение зависимостей в теории и на практике
Переглядів 23 тис.3 роки тому
Внедрение зависимостей в теории и на практике

КОМЕНТАРІ

  • @iddqdsft1347
    @iddqdsft1347 2 дні тому

    services.AddMediatR(Assembly.GetExecutingAssembly());

  • @vael6555
    @vael6555 15 днів тому

    Искал алмаз, а нашел золото, лучшие!)

  • @Aslan2
    @Aslan2 Місяць тому

    Сразу видное миллионер

  • @charodejtv444
    @charodejtv444 Місяць тому

    А как лучше работать с httpClientFactory при большом количестве прокси в многопотоке? Именованные клиенты на каждый прокси сервер?

    • @PlatinumTechTalks
      @PlatinumTechTalks Місяць тому

      что такое многопоток и большое количество прокси? вы имеете в виду, что у вас много внешних сервисов, к которым вы обращаетесь? если так, то да, на каждый именнованный клиент сделать или еще круче Refit клиентов. если у вас много реализаций одного интерфейса для сервисов то можно в сторону keyed services посмотреть

  • @vladi4_
    @vladi4_ Місяць тому

    Видео начинается с 16:45

  • @IQ-120
    @IQ-120 2 місяці тому

    Нейросети призваны классифицировать ... Не более..

  • @IQ-120
    @IQ-120 2 місяці тому

    И все же, если не секрет - сколько зп у Сеньера?

  • @IQ-120
    @IQ-120 2 місяці тому

    Не, молодцы! Вопрос про запрос с А4 страничку это не минус EF. Это минус прогера! Проще запросить чистый сиквел и смапить на модельку... Молодцы, что не забыли про AsNotracking() и ContextFactory .. особенно про async using обертку... И как красиво работать с Generic and Expession конструкциями, супер!!! Надеюсь, никто не юзает AutoMapper with EF Proxies ?

  • @smetanka-h9h
    @smetanka-h9h 2 місяці тому

    Лайк за контент неглядя. Хотелось бы тутор выпуск по микросервисам + брокеру

  • @Gromoboy33
    @Gromoboy33 2 місяці тому

    Спасибо большое за контент, рад, что ты вернулся к видео!

  • @IQ-120
    @IQ-120 2 місяці тому

    54:00 вопрос: а как так связи строятся один к одному? Примари ключи совпадают что ли? И Нахера гемморой такой?

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      Да, примари ключи должны совпадать. И в одной таблице примари ключ - должен быть одновременно примари ключом + форейн Кеем на другую таблицу. modelBuilder.Entity<Blog>() .HasOne(e => e.Header) .WithOne(e => e.Blog) .HasForeignKey<BlogHeader>(e => e.BlogId) .IsRequired();

    • @IQ-120
      @IQ-120 2 місяці тому

      @PlatinumTechTalks бедный sql как же ему две таблички разруливать на identity? Может проще одну табличку иметь в таком случае?

  • @OlegMongol18675
    @OlegMongol18675 2 місяці тому

    Привет, давно не виделись)

  • @alexandrchioroglo5612
    @alexandrchioroglo5612 2 місяці тому

    Отсматриваем!

  • @illson4666
    @illson4666 2 місяці тому

    42 08, какая утечка может быть, юзинг уничтожает обьект

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      объект-то может и уничтожится, а вот TCP соединения останутся. это ведь уровень операционной системы, а не приложения. на 12:45 про это как раз говорится

  • @sinbladee8334
    @sinbladee8334 2 місяці тому

    20 минут сказки про историю, 20 минут про фреймворк, и на сдачу зачитка LLM текста, ахуенно

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      вот и первый LLM-комментарий)

  • @KoichiHub
    @KoichiHub 2 місяці тому

    Автор, видео замечательное. Но почему код в статье на Habr такой Legacy? У меня реально идет кровь из глаз когда я на него смотрю. Неужели у вас в компании так пишут? UPD: А, не сразу понял, что это вам в наследство осталось

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      спасибо! и радостно слышать про кровь из глаз, это значит, что мы в команде всё сделали правильно в итоге =D вообще там много такого всякого было.. в статье только то, что к HttpClient'у относится отражено. есть еще одна статья про тесты, там тоже есть примеры "интересного" кода: habr.com/ru/companies/zyfra/articles/847502/

  • @AlexGnatuyk
    @AlexGnatuyk 2 місяці тому

    Использовал эти наработки что бы найти работу в Европе!

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      надо сделать выпуск про IT в Европе и в целом про всё с этим связанное)

    • @AlexGnatuyk
      @AlexGnatuyk 2 місяці тому

      @@PlatinumTechTalks В нынешнее время залетит на ура

  • @azizashurov923
    @azizashurov923 2 місяці тому

    Я рад вас видеть снова (ВАШЕ ЛИЦО В ПЕРВЫЙ РАЗ КОНЕЧНО).... после два года как я наткнулся на ваш канал могу с уверенностью писать вы мой учитель по CleanArchitecture.... до сех пор этот плейлист про CleanArchitecture служит мне как шпаргалга в проектах где требуется данная архитектура Благодарю вам за ваш труд...

    • @PlatinumTechTalks
      @PlatinumTechTalks 2 місяці тому

      спасибо большое за теплые слова!!! хах, в других видео тоже бывает лицо, но конечно в основном в видосах, которые записывались совместно и давно) тут после долгого радиомолчания подумал, что стоит всех поприветствовать лично)))

  • @vasek2999
    @vasek2999 2 місяці тому

    У вас ошибка при копировании с очередью у вас из дерева б строка копируется в дерево а, но тест это не отлавливает

  • @Julia-nr8ne
    @Julia-nr8ne 2 місяці тому

    Объясните, плиз, не понимаю. Почему через Таск Ран запускается, почему не просто идет вызов Process?

    • @Георгий-ь6с
      @Георгий-ь6с 2 місяці тому

      Чтобы в другом потоке Process() запустился и выполнялся параллейно основному потоку. А при await task основной поток будет "ждать", когда этот Process закончится

    • @Julia-nr8ne
      @Julia-nr8ne 2 місяці тому

      @@Георгий-ь6с спасибо, что нашли время написать. Вот пример, которыей иллюстрирует обратное: я могу считать строку из консоли из главного потока после запуска Таск, то есть он не блокируется до момента вызова await (и там он тоже не блокируется на самом деле, потому что после await уже другой поток работает, если бы он заблокировался, мы бы продолжили выполнение после await в том же потоке что был до: public static async Task Main(string[] args) { Console.WriteLine($"Main in {Environment.CurrentManagedThreadId}"); var task = Process(); Console.ReadLine(); Console.WriteLine($"Main continue in {Environment.CurrentManagedThreadId}"); await task; Console.WriteLine($"Main after task in {Environment.CurrentManagedThreadId}"); } static async Task Process() { Console.WriteLine($"Process start"); await Task.Delay(10000); Console.WriteLine($"Process end"); }

    • @Julia-nr8ne
      @Julia-nr8ne 2 місяці тому

      Наверное просто перемудрили с примером

  • @IQ-120
    @IQ-120 2 місяці тому

    Парни! Зачёт! Вот, херню с авейтом в локе - я бы не додумался так сделать! Сильно! А про запросы к базе в мидлваре - тоже офигенно! И легенда про сборщика мусора ... Пря полный бардачок Говнокодеоа... Не, молодцы!!! Если также бизнес код писать, то кассовый разрыв обеспечен...мне теперь страшно код писать... лезут пакости авайта в локе...:)))) у Вас, видимо, куча свободного времени, чтобы в кишках ковыряться... Там же сложно... или Вы из учебников легенды тяните...? Кто-нить тыкал начинку мусорщика или ночинку статемашины для асинк авайт... ? На засыпку: почему у типа string недавно стали требовать дописывать ?

  • @ВасилийМузюкин-б3м
    @ВасилийМузюкин-б3м 2 місяці тому

    На 12 минуте не смог слушать дальше, ребята, вы потренируйтесь говорить а потом видос пишите. На собесах при таких тормознутых ответах могут всё прервать, даже если ход мыслей около правильный

  • @ДмитрийЩетинин-з1ч
    @ДмитрийЩетинин-з1ч 2 місяці тому

    Спасибо.

  • @madarator1318
    @madarator1318 3 місяці тому

    Спасибо большое Олег

  • @a.r.m.e.n.i.a.
    @a.r.m.e.n.i.a. 3 місяці тому

    Что он глотает постоянно!!???

  • @xy777top
    @xy777top 4 місяці тому

    Очень жестокое видео, автор сильно избивает кнопку Enter

  • @AgentsAI-hl6wt
    @AgentsAI-hl6wt 4 місяці тому

    Топ!

  • @Бойправ-ж8ы
    @Бойправ-ж8ы 4 місяці тому

    вся эта энтети - херня полнейшая.

  • @larissasavchenko4101
    @larissasavchenko4101 5 місяців тому

    речь у автора ролика хорошая, но нужно хорошую речь оформить в виде рисунков для наглядности.

  • @larissasavchenko4101
    @larissasavchenko4101 5 місяців тому

    стоящее видео. спасибо автору. успехов ему в преподавательской деятельности.

  • @SoulGoodman-c7j
    @SoulGoodman-c7j 5 місяців тому

    Посмотрел первые минуты, это ведь идет объяснение не IoC, а DIP. Разве нет?

    • @N0R16
      @N0R16 4 місяці тому

      не dip, а di. Инъекция зависимостей, это один из вариантов реализации ioc. т.е. в этом моменте все логично) а вот понятие ioc-контейнер, которое использует автор, особо смысла не несет

  • @ramzone255
    @ramzone255 5 місяців тому

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

    • @PlatinumTechTalks
      @PlatinumTechTalks 3 місяці тому

      Спасибо, что написали! Вы проделали большой путь! 💪 удачи вам в дальнейшем пути!

  • @dimka59ru
    @dimka59ru 5 місяців тому

    Так себе идея кидать 404 если не найдено что-то в бд. Сам то ресурс доступен.

    • @PlatinumTechTalks
      @PlatinumTechTalks 3 місяці тому

      А как бы вы сделали в данном случае? И смотря что считать ресурсом

  • @dimka59ru
    @dimka59ru 5 місяців тому

    Весьма странное решение мапить дто в команду...

  • @dimka59ru
    @dimka59ru 5 місяців тому

    Спасибо, все понятно. Но крайне кратко.

  • @light2night
    @light2night 5 місяців тому

    Просто смотрю с очерованным лицом и вижу насколько просто и гениально можно было упростить всё то, что я когда-то делал. Middleware для обработки конкретных исключений это насколько гениально и просто, что я поражаюсь. Спасибо за такой отличный гайд

  • @KINOSHOT999
    @KINOSHOT999 5 місяців тому

    На словах мэпится на объект классов все сразу понятно . Вы пытаетесь объяснить или сделать так что бы вообще никто ничего не понял ?

  • @tonycarlson1977
    @tonycarlson1977 5 місяців тому

    большое спасибо за видео. Ваш труд один из лучших на ру сегменте

  • @ГлебСветогор-ж1х
    @ГлебСветогор-ж1х 6 місяців тому

    Спасибо за видео. Подчеркнул для себя немного нового

  • @АнтонВоронов-ы9ц
    @АнтонВоронов-ы9ц 6 місяців тому

    6:50 "гонки потоков ... 9 раз отработает хорошо". Читатель почти всегда закрывается до попытки чтения (на 6 строке).

  • @timurkatsuka8765
    @timurkatsuka8765 6 місяців тому

    Если объект достаточно большой, то рационально ли создавать его. Возможно, будет эффективнее воспользоваться тернарником с точки зрения производительности, а проблему инкапсуляции решить иначе

  • @maximr4987
    @maximr4987 6 місяців тому

    Нижняя камера лишняя! )) Зачем он себя постоянно трогает? )

  • @artak9439
    @artak9439 6 місяців тому

    1:44:42 Это работает только когда делаешь Include

  • @fatalien6634
    @fatalien6634 6 місяців тому

    Использую Obsidian в связке с Git Из плюсов можно и на мобилке использовать, правда надо один раз запариться с генерацией токена GitHub

  • @begemotik88888888
    @begemotik88888888 6 місяців тому

    Добрый день уточнение когда загружается мастер и подчиненная таблицы, например 10 мастер и в каждой детайл 100 то получается что 1000 загружается даже если пейдж инг ?

  • @user-nj6ff9ko9u
    @user-nj6ff9ko9u 6 місяців тому

    САМОЕ ЛУЧШЕЕ ВИДЕО ПО ТЕМЕ КОТОРОЕ ПОКА ВСТРЕЧАЛ

  • @AnnaKomarova-g9e
    @AnnaKomarova-g9e 6 місяців тому

    Добрый день! Что нужно настроить, чтобы в браузере можно также как на видео работать с БД PostgreSql? Спасибо

    • @PlatinumTechTalks
      @PlatinumTechTalks 6 місяців тому

      Добрый день! Ответ от докладчика: 1. поставить docker (Docker Desktop для Windows) 2. запусть бд: docker run \ -p 5432:5432 \ --name container-postgresdb \ -e POSTGRES_PASSWORD=admin \ -d postgres 3. запустить pgadmin: docker run \ -p 5050:80 \ -e "PGADMIN_DEFAULT_EMAIL=name@example.com" \ -e "PGADMIN_DEFAULT_PASSWORD=admin" \ -d dpage/pgadmin4 4. открыть localhost:80 И ввести такие параметры: name: container-postgresdb host: host.docker.internal database: postgres user: postgres password: admin

  • @araslanrus
    @araslanrus 7 місяців тому

    Конечно ребята умные и явно разбирающиеся - по манере речи понятно. но за объяснение материала диз

  • @313Eugene
    @313Eugene 7 місяців тому

    Спасибо!

  • @313Eugene
    @313Eugene 7 місяців тому

    Спасибо!👍