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

244 группа

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

Студент TODO №1 №2 №4 №7 Тест 1 №9
39 Lazy MyThreadPool SimpleFTP MyNUnit GUI для FTP
Алексей Гирин 2
Афанасов Артем 5
Балашов Илья 2
Гуданова Варвара 4
Ивашева Валерия 3
Камкова Екатерина 4
Коекин Ярослав 4
Мендалиев Роман 3
Панфилёнок Дмитрий 4
Пиккио Полина 5
Пономарёв Егор 3

Задачи

Домашняя работа 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-2018 HwProj