Обучение c# видеоуроки

Формула программиста

основатель — Волосатов Евгений Витольдович

Клуб формулистов - Ежемесячная подписка

Вступление в Клуб Формулистов на выгодных условиях для НОВЫХ участников.

После взноса  999  499 руб. вы получите подписку
в Клуб Формулистов на 30 дней и 256 байт для быстрого старта.
Байты используются для открытия более одного урока в день, по 50 байт за урок.

Стоимость 1 дня за первый месяц: всего 16 рублей.

Первый взнос - 499 руб./30 дней.

Через 30 дней будет списано 3,000 2,400 руб.
за продление подписки в Клуб на 30 дней + подарок 512 байт.

Так будет продолжаться каждые 30 дней, пока вы не отмените подписку.
Средства будет автоматически считываться с вашей карты.
Вы в любой момент сможете отказаться от продления Клуба.

Только ДО КОНЦА НЕДЕЛИ -
-50% скидка на первый взнос, всего 499 (вместо 999) рублей!
-20% скидка на ЕЖЕМЕСЯЧНЫЙ платёж!
Всего 2400 руб/месяц (вместо 3000 руб/месяц), или 80 руб./день - цена чашки кофе.


Стоимость 1 дня: 80 руб.

Хочу вступить!

Также есть другие варианты оплаты участия в КФ:

Билет в клуб формулистов на ...
30+ дней | 60 дней | 150 дней | 380 дней | 1000 дней

Внимание!
Стоимость участия в Клубе формулистов увеличивается 1 числа каждого месяца на 100 рублей.
При оформления подписки стоимость остаётся постоянной, пока подписка не будет отменена.







Первый взнос - 499 руб./30 дней + 500 байт.
Последующие взносы - 3,000 2400 руб./месяц + 512 байт.



Список уроков | фото | видео

# Название видеоурока Видео / Тесты Решило Рейтинг Доступ
1 FREE Что такое сокет 00:09:10
2 теста
31 чел. ★ 4.7 Done
  В этой серии видеоуроков мы подробно разберём принципы работы клиент-серверных программ на основе сокетов и напишем небольшую демонстрационную программу.

Рекомендую ознакомиться со статьёй:
http://qaru.site/questions/12999/what-is-the-difference-between-a-port-and-a-socket
Отчёт отправил: 13417. Chip Выполнено за 49 мин. [Показать отчёт]
Научился: Клиент-серверное приложение состоит из двух частей: из клиента и сервера. Сервер прослушивает линию и ожидает подключения клиентов, обрабатывает их запросы и возвращает ответы. Клиенты обращаются к серверу за необходимой информацией. IP-адрес необходим для задания уникального адреса в сети, по которому ПО сетевого протокола IP сможет найти хост. Соответственно порт необходим для функционирования транспортного протокола, где каждый порт привязывается к определенной службе на хосте. Таким образом, IP-адрес определяет хост в сети, а порт определяет службу на этом хосте. Имея эту пару можно создать канал общения клиента и сервера. Само общение реализуется с помощью создания сокета. Сокет - это экземпляр "канала", программная абстракция соединения между процессами клиента и сервера. 
2 Простейший сервер 00:07:20
2 теста
22 чел. ★ 5 Done
  На этом уроке мы создадим простейший сервер, который будет принимать подключения от клиентов и проверим его работу из  телнета и браузера.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 26 мин. [Показать отчёт]
Научился: При вызове accept процесс сервера блокируется до тех пор, пока в очереди не появится запрос клиента. Написал программу на языке Си. Проверил созданный сервер через браузер и telnet. Через браузер пока что получается неинформативный результат работы, поэтому прикрепил скриншот вывода программы telnet. 
3 Автоответчик 00:10:27
1 тест
21 чел. ★ 4.9 Done
  На этом слайде мы напишем сервер-автоответчик, который всем клиентам будет отправлять одно и тоже сообщение.
Отчёт отправил: 13417. Chip Выполнено за 31 мин. [Показать отчёт]
Научился: Научился отправлять сообщение клиенту, создавать сервер-автоответчик. 
4 Правильный заголовок 00:06:26
2 теста
13 чел. ★ 5 Done
  На этом дополнительном слайде мы сформируем правильный HTTP-ответ,
который будет выдавать наш сервер, чтобы даже привередливые браузеры смогли бы его отобразить.

Отчёт отправил: 13417. Chip Выполнено за 3 час. 13 мин. [Показать отчёт]
Научился: Научился отправлять http-ответ сервера клиенту. Проверил на своём браузере Firefox, установил браузеры Chromium и GNOME Epiphany- везде работает как надо. Дополнительно почитал про другие заголовки, узнал что многие из них связаны с кешированием. Добавил заголовок "Content-Length", который высчитывается перед отправкой сообщения. 
5 Как хорошо уметь читать! 00:10:20
1 тест
18 чел. ★ 5 Done
  На этом слайде мы создадим клиента, который сможет прочитать сообщение от сервера.
Отчёт отправил: 13417. Chip Выполнено за 55 мин. [Показать отчёт]
Научился: Научился создавать сокет на клиентской стороне, подключать его к серверу и получать данные от сервера. 
6 Клиент-серверный диалог 00:14:14
15 чел. ★ 5 Done
  На этом слайде мы обеспечим полноценное общение между клиентом и сервером через сокет
Отчёт отправил: 13417. Chip Выполнено за 1 час. 30 мин. [Показать отчёт]
Научился: Научился передаче сообщений от клиента к серверу и обратно. Теперь сервер обрабатывает запрос клиента и отвечает на него вполне осмысленно, в зависимости от запроса клиента. 
7 Экспериментальный сервачок 00:12:25
1 тест
14 чел. ★ 5 Done
  На этом уроке мы ещё раз построчно и подробно разберём написанные программы и поэкспериментируем с "медленным" сервером. Самостоятельное задание - написать клиент-серверную игру "Угадай число".
Отчёт отправил: 13417. Chip Выполнено за 3 час. 23 мин. [Показать отчёт]
Научился: Реализовал игру угадай число. Сервер загадывает число от 1 до 100, затем ждёт подключения клиентов. Чтобы жизнь клиента не была слишком скучной, первое число, которое загадывает клиент я сделал рандомным в том же интервале от 1 до 100. Затем клиент отправляет это число на сервер и он отвечает ему, является ли число клиента меньше, больше или равно загаданному. Клиент получает ответ и уже далее вычисляет новое число путем деления пополам области поиска. Я добавил задержку между итерациями угадывания числа на клиенте в 2 секунды, чтобы результат получился более интерактивным. Интересная задачка, спасибо Евгений Витольдович, неплохо увлёкся во время пересылок данных между клиентом и сервером :) 
Видеообзор: xoDz4e5yrUs
8 Техническое задание 00:06:25
11 чел. ★ 5 Done
  Мы познакомились с принципом работы сокетов.
Теперь самое время создать какую-нибудь простую клиент-серверную программку.
На этом видео мы сформулируем техническое задание.
Попробуйте самостоятельно написать программу по ТЗ.
Отчёт отправил: 13417. Chip Выполнено за 9 час. 34 мин. [Показать отчёт]
Научился: Реализовал программу Socketor - клиент-серверный калькулятор. Поразительно, но сам клиент-серверный обмен был написан довольно быстро :) Много времени ушло на парсинг командной строки, обработку ошибок ввода, проверка деления на ноль. Спасибо Евгений Витольдович, я хорошо попрактиковался :) 
Видеообзор: iS0WtqiPSoA
9 Основной алгоритм 00:13:05
11 чел. ★ 5 Done
  На этом слайде мы напишем два алгоритма в одной программе: для сервера и для клиента.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 54 мин. [Показать отчёт]
Научился: Так как эту программу я самостоятельно написал на прошлом уроке, то сейчас я решил с нуля переписать ее вслед за Евгением Витольдовичем, без излишеств и стремясь к созданию аналогичной структуры программы. 
10 Скелет телефона 00:03:37
1 тест
11 чел. ★ 5 Done
  На этом коротком слайде мы создадим метод calculate() и очень быстро набросаем скелет класса Phone, используя возможности кодогенерации Intellij Idea.
Отчёт отправил: 13417. Chip Выполнено за 27 мин. [Показать отчёт]
Научился: Понравились возможности кодогенерации IDE и комментарии Евгения Витольдовича "раз-два готово, тыг-дык готово, раз-раз готово, тяп-ляп, не, тяп-ляп не надо :)" 
11 Универсальный сокет 00:15:27
11 чел. ★ 5 Done
  На этом слайде мы создадим все методы универсального сокета в классе Phone.
Протестируйте программу в разных режимах.

Придумайте, какую ещё клиент-серверную программу можно написать.
Отчёт отправил: 13417. Chip Выполнено за 9 час. 24 мин. [Показать отчёт]
Научился: Решил полностью с нуля написать все требуемые функции, не копируя свои прежние наработки. В итоге, повторил и лучше закрепил свои навыки и знания. Попрактиковался в работе с отладчиком gdb. По поводу новых видеокурсов, я бы порекомендовал вам, Евгений Витольдович, курс по созданию инсталлятора программ. Многие формулисты уже создали множество программ на этом проекте, а установкой до сих пор не занимались. Например, я использую систему сборки проекта Autotools, которая позволяет скомпилировать, установить и развернуть приложение на другом компьютере Linux. Так же я практиковался в упаковке программ в rpm-пакеты, которые устанавливаются всего лишь одной командой в терминале. Пора бы другим формулистам устранить этот профессиональный пробел в создании инсталлятора для Windows. Возможно это будет просто мини-курс по использованию известного инсталлятора. Или это будет новая программа, которая сама раскидывает данные пользователя по папкам, работает с реестром и прочее. Интересно будет узнать ваше и мнение других формулистов :) 
12 ФИНАЛЬНЫЙ УРОК без видео
1 тест
11 чел. ★ 5 Done
  Оставьте отзыв об этом миникурсе и отчитайтесь за самостоятельное задание.
Отчёт отправил: 13417. Chip Выполнено за 35 мин. [Показать отчёт]
Научился: Крутой курс! Я поразился насколько просто в Java можно создать клиент-серверное приложение. В добавок к этому в распоряжении программиста имеются дополнительные классы-обертки над потоками ввода-вывода у сокетов, чтобы не мелочиться с буферными массивами. Раз-два готово! :) В этом курсе создается программа сокетный калькулятор - интересный пример клиент-серверного взаимодействия. Было самостоятельное задание написать программу угадай число или быки и коровы. Я выбрал угадай число. Рекомендую всем пройти этот курс - уроки короткие, кода мало, информация полезна :)  
13 FREE VIP. Многопоточность 00:11:34
10 чел. ★ 4.6 Done
  На этом слайде мы поговорим о многопоточности, рассмотрим несколько примеров, кода имеет смысл разделять задачу на потоки, а когда нет. На следующих слайдах мы напишем простой многопоточный сокет для сервера на языке Java
Отчёт отправил: 13417. Chip Выполнено за 35 мин. [Показать отчёт]
Научился: В видео интересные примеры многопоточности :) Мой вариант, когда многопоточность может быть эффективна. Например, стоит задача найти минимальный элемент в огромном массиве. Можно разбить этот массив на несколько более мелких, далее создать несколько потоков, каждый из которых находит минимальный элемент в своём подмассиве. В результате, у нас получится новый массив минимальных элементов и уже в нем основной поток может найти самый минимальный элемент. Чем больше массив и чем больше потоков, тем большая выгода от многопоточности. Вариант, когда многопоточность не эффективна. Сложно придумать вариант, если я правильно понял, основная идея в том, что задачу сложно распараллелить, отсутствуют независимые части, промежуточные этапы и результаты. Поэтому я выбрал следующий вариант: вывод информации в терминал или работа машинистки на печатной машинке. Как известно, информация выводится строго сверху-вниз и слева-направо. (Допустим терминал крайне допотопный и не умеет перемещать курсор) Невозможно напечатать сначала первую строку, потом прыгнуть на пятую, вывести одну букву и потом обратно на первую. Поэтому невозможно разбить задачу вывода на несколько потоков - когда один поток выводит первую строку, другой одновременно с ним пятую и так далее. Вся работа упирается в мощность одного процесса или в скорость работы одной машинистки. Другими словами, если стоит задача набрать один текст формата А4 на печатной машинке, то несколько машинисток не смогут одновременно набирать на одной машинке, скорость работы упирается в скорость набора машинистки. Вы скажете, что можно набирать одновременно на нескольких машинках и получится несколько копий одного листа А4, но суть не меняется. Другие машинистки не могут скооперироваться, что напечатать быстрее один экземпляр. 
Сложности: Придумать варианты эффективности и не эффективности многопоточности. 
14 VIP. Два потока 00:10:49
1 тест
9 чел. ★ 5 Done
  На этом слайде мы создадим простейшую программу с двумя потоками.
Отчёт отправил: 13417. Chip Выполнено за 6 час. 10 мин. [Показать отчёт]
Научился: Научился создавать потоки с помощью функции системного вызова clone. В моем случае, создание потока похоже на способ в Java, когда новый поток запускает указанную функцию. Добавил третий поток, для вывода текста "Third". Чтобы вывод программы не улетал далеко за пределы экрана, добавил задержку в 1 секунду после вывода сообщения. 
15 VIP. Синхрофазатрон 00:14:00
9 чел. ★ 5 Done
  На этом слайде мы создадим коллизию и узнаем, как от неё избавиться.
Отчёт отправил: 13417. Chip Выполнено за 7 час. 47 мин. [Показать отчёт]
Научился: Интересный материал урока, увидел коллизию и способ борьбы с ней. Мне потребовалось изучить дополнительный материал. Возникла масса проблем начиная с того, что нужно было корректно перехватывать завершение работы дочерних потоков и заканчивая созданием синхронизирующего механизма для защиты доступа к переменной count. На видео для языка Java для этого использовалось ключевое слово synchronized, я реализовал схожее поведение через создание фьютекса, ух, было весело:) Попутно узнал про функцию nanosecond, которая позволяет устанавливать задержку в наносекундах. 
16 VIP. Функциональное потокообразование 00:04:52
2 теста
9 чел. ★ 5 Done
  На этом коротком слайде мы узнаем, как создать поток через функциональное программирование.
Отчёт отправил: 13417. Chip Выполнено за 1 час. 54 мин. [Показать отчёт]
Научился: В языке Си нет поддержки функционального программирования, поэтому я решил выполнить этот урок на языке Java. Сначала скачал jdk 11, скомпилировал программу, попробовал запустить, система сказала, что версия моего .class файла ниже, чем поддерживая версия рантайма в операционной системе. Посмотрел текущую версию рантайма, она оказалась равной 1.8, то есть 8, если я правильно понял. Я решил не менять свой рантайм, скачал другую версию jdk 1.8, скомпилировал - запустил - работает. Ура, я справился с Java. Хотел было уже отправить отчёт, но тут подумал, ну если Си не способен создать лямбду, может тогда старший брат С++ поможет? Набрал код на этом языке, запустил, тоже работает. Тут я использовал средства стандартной библиотеки, поэтому код похож на код Java, а не выкрутасы с системными вызовами как было в Си :) Чтобы потоки выполнялись более-менее параллельно, я добавил задержку в 10 мс между итерациями, как и было предложено сделать в видеоуроке. 
17 VIP. Мультики на сервере 00:22:02
1 тест
9 чел. ★ 5 Done
  На этом слайде мы встроим многопоточность в клиент-серверную программу Socketor и продемонстрируем достигнутый эффект.
Отчёт отправил: 13417. Chip Выполнено за 3 час. 39 мин. [Показать отчёт]
Научился: В этом уроке я научился создавать многопоточный сервер. Мне понравилось то, что мы здесь объединили две программы, две рассмотренные в этом курсе темы. Первая это однопоточное клиент-серверное приложение, а второе это потоки. Для проверки работы сервера, я написал скрипт на bash, который симулирует запуск указанного количества клиентов с интервалом в 100мс. В сервер тоже добавил задержку симуляции сложной обработки, 3 секунды на один запрос. Курс мне понравился, Евгений Витольдович выбрал отличную тему для демонстрации многопоточности, спасибо за интересный материал ! :) 
Видеообзор: PebAfxYxvg8
18 VIP. Динамичная многопоточность 00:30:24
9 чел. ★ 5 Done
  На этом заключительном видеоуроке мы познакомимся с другим способом создания многопоточного сервера.
Если на предыдущем уроке у нас "крутилось" несколько копий одной программы,
то теперь мы будем создавать новый поток при каждом подключении клиента.

Сравните оба варианта и напишите в отчёте, какой подход вам больше понравился и почему.
Отчёт отправил: 13417. Chip Выполнено за 2 час. 52 мин. [Показать отчёт]
Научился: Чтобы организовать динамичную многопоточность, мне нужно было придумать как организовать хранение запущенных потоков. В моем случае нет доброго сборщика мусора, я не могу просто так создать анонимный поток и забыть про него, будет утечка памяти. Поэтому для хранения запущенных потоков выбрал двусвязный список в качестве структуры данных, чтобы можно было легко удалять отработавшие потоки из середины списка. Потребовалось освежить знания о том, как добавлять и удалять элементы из списка. Написал свой простой двусвязный список. Чтобы вовремя удалять потоки из списка, мне нужно было пойти дальше и изучить системный вызов poll, который в течение указанного таймаута ждёт подключения клиента. Если клиент пришёл - он обрабатывается acceptом, для него запускается новый поток и потом выполнятся очистка памяти. Если клиент не пришел, accept пропускается и сразу выполняется очистка памяти. В уроке был вопрос, как можно прервать работу сервера. В моем случае я просто посылаю сигнал SIGINT с помощью Ctrl+C. Но чтобы полностью очистить память перед выходом, мне потребовалось научиться перехватывать сигналы. Вариант с динамичной многопоточностью лучше, чем с фиксированной, так как ресурсы не простаивают зря. На видео я запускал клиенты с помощью bash-скрипта, который принимает в качестве параметров количество клиентов, интервал генерации случайных чисел и интервал между обращения к серверу. В общем, хорошо попрактиковался, очень доволен, спасибо :) 
Видеообзор: znmc-j0Xppw
  Итого:   18 видеоуроков 3 час. 22 мин.
15 тестов
9 чел. ★ 4.96  
  Финалисты:   Yefim,   Chip,   Иван Воронин,   Tekashnik,   Александр,   vip,   Айдар,   Dmitry Sinitsin,   Anatoli .

Начинаем практику по языку C#





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

После заполнения формы ты будешь подписан на рассылку «C# Вебинары и Видеоуроки», у тебя появится доступ к видеоурокам и консольным задачам.

Несколько раз в неделю тебе будут приходить письма — приглашения на вебинары, информация об акциях и скидках, полезная информация по C#.

Ты в любой момент сможешь отписаться от рассылки.


Научился: Уже изучал ранее сокеты, всё-равно было интересно. Курс классный, рекомендую его всем для прохождения!
Трудности: Заплатил за этот отзыв 50 байт. Идём дальше!



Научился: Клиентский метод .getInputStream().read() читает один символ, тогда как класс-обёртка для чтения данных - InputStreamReader способен читать уже строку. Применили цепочку из создания объектов, на вершине которой классы BufferedReader и BufferedWriter, способные к чтению и созданию полных строк, которые передавались через сетевой протокол между клиентом и сервером. Приложение для обмена, обработки Сервером полученного, и выведения на экран результата отправки-обработки-приёма реализовывалось как в рамках одного класса (это при том, что запуск доступен в двух ролях Сервера или Клиента), так и в двух классах. Первый класс Socketor имеет точку входа в программу, отвечает за выбор роли, в которой запускается сокет (сервером или клиентом). При каждом запуске создаёт новый экземпляр класса и в зависимости ОТ КОЛИЧЕСТВА принятых от пользователя аргументов запускает: метод runServer в роли Сервера или метод runClient в роли Клиента. =============== Метод runServer создает СОКЕТ - новый экземпляр класса Phone принимая аргументом номер порта для работы. В бесконечном цикле запускается метод приёма входящих пакетов извне. В первой полученной строке записывает строковую переменную a. Во второй полученной строке записывает строковую переменную b. В целочисленную переменную записывает результат работы метода калькуляции, принимающего аргументами (все строкового типа) знак математической операции, а и b - числа для математической операции. О полученном решении создаётся строковая переменная, которая: - выводится на экран в консоли Сервера методом System.out.println - передаётся Клиенту для вывода на экран методом phone.writeLine После вывода на экран соединение с Клиентом закрывается и Сервер возвращается циклом к ожиданию нового входящего соединения. В этом же цикле реализована проверка деления на ноль. ================ Метод калькуляции парсит в целые числа полученные строковые аргументы, и в зависимости от типа операции возвращает целочисленные результат расчётов. ================ Метод runClient принимает строковые аргументы: - сетевой адрес - номер порта - а и b - числа для математической операции. Создаётся экземпляр сокета с двумя аргументами (адрес и порт). Сокет Клиента построчно отправляет а и b - числа для математической операции. Затем с помощью метода readLine() Клиент получает результат вычислений и выводит его в консоль на экран. ################ Второй класс Phone занимается реализацией сокетов Сервера и Клиента. Здесь же составлена матрёшка экземпляров классов, способных обрабатывать строковые символы и целые строки из сетевого трафика. Во всех методах класса Phone применен отлов ошибок try-catch