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

2 курс ПМ-ПУ группа

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

Студент TODO №1 №2 №4 №6 Тест 1 №8 №10 Тест 2
53 Lazy MyThreadPool SimpleFTP MyNUnit 1 GUI для FTP MyNUnitWeb Крестики-нолики
Бахметьев Владимир 8
Игнатьев Денис 7
Мельников Дмитрий 8
Олешкевич Евгений 8
Спирякова Юлия 7
Теппоев Дмитрий 8
Терещенко Дмитрий 7

Задачи

Тест 2. 05.12.18
  1. Крестики-нолики

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

Домашняя работа 11. 28.11.18
Веб-программирование, часть 2 (слайды)
Домашняя работа 10. 21.11.18
Веб-программирование, часть 1 (слайды)
Туториал по ASP.NET MVC Core (Model-View-Controller)
  1. MyNUnitWeb

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

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

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

    Нужно:

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

    При этом:

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

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

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

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

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

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

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

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

Домашняя работа 5. 03.10.18
Работа с сетью, высокий уровень (слайды)
Домашняя работа 4. 27.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. 19.09.18
Многопоточное программирование, практика (слайды)
Домашняя работа 2. 12.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. 05.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