Программирование

x2017-2019 (программирование) группа

Юрий Литвинов

Студент TODO №1 №2 №4 №7 Тест 1 №9 №11 Тест 2 №12 Тест 3 Тест 4 Тест 5
42 MyThreadPool SimpleFTP MyNUnit GUI для FTP MyNUnitWeb Крестики-нолики Доклады Чат Презентация Защита Декомпилятор
Алексей Гирин 3
Афанасов Артем 2
Балашов Илья 4
Гуданова Варвара 3
Ивашева Валерия 4
Камкова Екатерина 2
Коёкин Ярослав 4
Мендалиев Роман 3
Панфилёнок Дмитрий 4
Пиккио Полина 9
Пономарёв Егор 4

Задачи

Тест 5. 21.12.18
  1. Декомпилятор

    Реализовать с помощью рефлексии генератор кода на C#, печатающий класс.

    • На вход генератор принимает тип (объект типа Type, который должен быть классом)
    • На выход генератор в текущей папке должен создать файл <имя класса>. cs, где содержится исходник переданного класса
      • Реализацию методов печатать не надо, достаточно имя класса и пустые заглушки для его методов
      • Должны быть поля
      • Должны быть модификаторы видимости
      • И всё остальное, что вы можете достать из объявления класса.
Тест 4. 14.12.18
  1. Презентация
  2. Защита
Тест 3. 12.12.18
  1. Чат

    Реализовать консольный сетевой чат.

    • Это должно быть одно приложение, которое в зависимости от опций командной строки запускается либо как клиент, либо как сервер
      • Если указан только порт, приложение запускается как сервер и слушает порт
      • Если указан IP-адрес и порт, приложение запускается как клиент и коннектится к указанному серверу
    • Как только соединение установлено, и клиент, и сервер могут писать друг другу сообщения в консоли, независимо друг от друга
    • Когда кто-либо набирает в консоли “exit”, соединение закрывается и приложения заканчивают работу.

    Примечание: в Visual Studio опции командной строки можно задать в свойствах проекта, во вкладке Debug.

Домашняя работа 12. 07.12.18
О презентациях семестровых
Реактивное программирование и Rx.NET
TPL dataflow
Интернирование строк
unsafe, fixed, P/Invoke (презентация)
unsafe, fixed, P/Invoke (конспект)
  1. Доклады
Тест 2. 30.11.18
  1. Крестики-нолики

    Реализовать с помощью WPF игру крестики-нолики (в классическом варианте, с полем 3 на 3), позволяющую играть двум игрокам в режиме hot seat. После победы одного из игроков или ничьи должно быть можно начать новую партию. Нужны юнит-тесты для всего, что не относится напрямую к GUI.

Домашняя работа 11. 23.11.18
Веб-программирование (слайды)
Веб-программирование (туториал по Model-View-Controller)
  1. MyNUnitWeb

    Реализовать веб-интерфейс для системы юнит-тестирования MyNUnit из 7-й домашней работы. Требуется:

    • Форма для загрузки на сервер сборок, которые надо тестировать
      • Это может быть несколько файлов, например, .dll-ка с тестируемыми классами и .dll-ка с юнит-тестами к ним, их можно загружать по одному
    • Кнопка "Начать тестирование", запускающая юнит-тесты, по завершении которых должен отобразиться результат тестового прогона
      • +2 балла к контрольным за отображение результатов без перезагрузки страницы
    • Форма истории запусков, где можно просмотреть результаты всех тестовых прогонов, когда-либо запускавшихся на сервере:
      • Список всех сборок с тестами, общее количество успешных, проваленных и проигнорированных тестов по каждой сборке
      • Список всех тестов в сборке (возможно, появляющийся при выборе сборки из первого списка), со статусом теста и временем его выполнения
      • Если тест проигнорирован, с сообщением о причине
Домашняя работа 10. 16.11.18
GUI на WPF, часть 2 (слайды)
Домашняя работа 9. 09.11.18
GUI на WPF, часть 1 (слайды)
  1. GUI для FTP

    Сделать GUI для FTP-клиента из домашней работы 4.

    Нужно:

    • иметь возможность задать адрес и порт сервера;
    • при подключении получить список файлов и подпапок папки, на которую "смотрит" сервер;
    • иметь возможность перемещаться по папкам (переходить в подпапки и возвращаться на уровень выше, если он есть --- выходить выше "корневой" папки нельзя);
    • иметь возможность указать папку в файловой системе клиента для скачивания файлов;
    • иметь возможность скачать один файл или все файлы в текущей папке сразу;
      • при этом скачивание нескольких файлов должно происходить параллельно, в клиенте должен как-нибудь отображаться статус файла --- скачивается или уже скачан.

    При этом:

    • надо активно пользоваться Data Binding и паттерном Model-View-ViewModel;
    • юнит-тесты на GUI можно не писать, но вся нетривиальная функциональность "бэкенда" должна быть протестирована.
Домашняя работа 8. 02.11.18
Базы данных (слайды)
Базы данных (конспект)
Тест 1. 26.10.18
  1. MD5

    Реализовать консольное приложение, вычисляющее check-сумму директории файловой системы по такому правилу:

    • f(file) = MD5(<содержимое>)
    • f(dir) = MD5(<имя папки> + f(file1) + ...)

    Результирующая check-сумма не должна зависеть от случайных факторов.

    Требуется:

    • Однопоточный вариант
    • Многопоточный вариант (любым из известных вам способов)
    • Сравнить время их работы в Main-е
    • Юнит-тесты

    Рекомендуется использовать System.Security.Cryptography.MD5 для вычисления хеша и System.Diagnostics.Stopwatch для измерения времени.

Домашняя работа 7. 19.10.18
Рефлексия (слайды)
  1. MyNUnit

    Реализовать command-line приложение, принимающее на вход путь и выполняющее запуск тестов, находящихся во всех сборках, расположенных по этому пути:

    • тестом считается метод, помеченный аннотацией Test
      • у аннотации может быть два аргумента -- Expected для исключения, Ignore (со строковым параметром) -- для отмены запуска и указания причины
    • перед и после запуска каждого теста в классе должны запускаться методы, помеченные аннотациями Before и After
    • перед и после запуска тестов в классе должны запускаться методы, помеченные аннотациями BeforeClass и AfterClass

    Тесты должны запускаться параллельно.

    Приложение должно выводить в стандартный поток вывода отчет:

    • о результате и времени выполнения прошедших и упавших тестов
    • о причине отключенных тестов

    Юнит-тесты на систему тестирования обязательны (при этом они должны быть написаны не на ней самой, а на чём-то более отлаженном, типа NUnit).

Домашняя работа 6. 12.10.18
Работа с сетью, практика (слайды)
Домашняя работа 5. 05.10.18
Работа с сетью, высокий уровень (слайды)
Домашняя работа 4. 28.09.18
Работа с сетью, низкий уровень (слайды)
  1. SimpleFTP

    Требуется реализовать сервер, обрабатывающий два запроса.

    • List — листинг файлов в директории на сервере
    • Get — скачивание файла с сервера

    И клиент, позволяющий исполнять указанные запросы.

    List, формат запроса:

    • <1: Int> <path: String>
    • path — путь к директории

    Формат ответа:

    • <size: Int> (<name: String> <isDir: Boolean>)*,
    • size — количество файлов и папок в директории
    • name — название файла или папки
    • isDir — флаг, принимающий значение True для директорий

    Если директории не существует, сервер посылает ответ с size = -1

    Get, формат запроса:

    • <2: Int> <path: String>
    • path — путь к файлу

    Формат ответа:

    • <size: Long> <content: Bytes>,
    • size — размер файла,
    • content — его содержимое

    Если файла не существует, сервер посылает ответ с size = -1

Домашняя работа 3. 21.09.18
Многопоточное программирование, практика (слайды)
Домашняя работа 2. 14.09.18
Многопоточное программирование - 2 (слайды)
  1. MyThreadPool

    Реализовать простой пул задач с фиксированным числом потоков (число задается в конструкторе)

    • При создании объекта MyThreadPool в нем должно начать работу n потоков
    • У каждого потока есть два состояния: ожидание задачи / выполнение задачи
    • Задача — вычисление некоторого значения, описывается в виде Func<TResult>
    • При добавлении задачи, если в пуле есть ожидающий поток, то он должен приступить к ее исполнению. Иначе задача будет ожидать исполнения, пока не освободится какой-нибудь поток
    • Задачи, принятые к исполнению, представлены в виде объектов интерфейса IMyTask<TResult>
    • Метод Shutdown должен завершить работу потоков. Завершение работы коллаборативное, с использованием CancellationToken — уже запущенные задачи не прерываются, но новые задачи и задачи из очереди не принимаются на исполнение потоками из пула.
    • IMyTask
      • Свойство IsCompleted возвращает true, если задача выполнена
      • Свойство Result возвращает результат выполнения задачи
      • В случае, если соответствующая задаче функция завершилась с исключением, этот метод должен завершиться с исключением AggregateException, содержащим внутри себя исключение, вызвавшее проблему
      • Если результат еще не вычислен, метод ожидает его и возвращает полученное значение, блокируя вызвавший его поток
      • Метод ContinueWith — принимает объект типа Func<TResult, TNewResult>, который может быть применен к результату данной задачи X и возвращает новую задачу Y, принятую к исполнению
      • Новая задача будет исполнена не ранее, чем завершится исходная
      • В качестве аргумента объекту Func будет передан результат исходной задачи, и все Y должны исполняться на общих основаниях (т.е. должны разделяться между потоками пула)
      • Метод ContinueWith может быть вызван несколько раз
      • Метод ContinueWith не должен блокировать работу потока, если результат задачи X ещё не вычислен

    При этом:

    • В данной работе запрещено использование TPL, PLINQ и библиотечных классов Task и ThreadPool.
    • Все интерфейсные методы должны быть потокобезопасны
    • Для каждого базового сценария использования должен быть написан несложный тест
    • Также должен быть написан тест, проверяющий, что в пуле действительно не менее n потоков
Домашняя работа 1. 07.09.18
Введение, многопоточное программирование (слайды)
  1. Lazy

    Реализовать следующий интерфейс, представляющий ленивое вычисление:

    public interface ILazy<T> {
            T Get();
    }
    

    Объект Lazy создаётся на основе вычисления (представляемого объектом Func<T>)

    • Первый вызов Get() вызывает вычисление и возвращает результат
    • Повторные вызовы Get() возвращают тот же объект, что и первый вызов
    • Вычисление должно запускаться не более одного раза

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, который должен иметь два метода с сигнатурами наподобие

    public static Lazy<T> Create...Lazy<T>(Func<T> supplier)
    

    возвращающих две разные реализации ILazy<T>:

    • Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    • Гарантия корректной работы в многопоточном режиме
      • При этом она должна по возможности минимизировать число необходимых синхронизаций (если значение уже вычислено, не должно быть блокировок)
    • supplier вправе вернуть null
    • Библиотечным Lazy пользоваться, естественно, нельзя

    Нужно:

    • CI, на котором проходят ваши тесты
    • Тесты
      • Однопоточные, на разные хорошие и плохие случаи
      • Многопоточные, на наличие гонок

© 2014-2019 HwProj