Практика по Java

x02-2015 (практика по Java) группа

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

Студент TODO №1 №2 №4 Тест 1 №6 №8 №10 Тест 2 Тест 3
39 VCS Продвинутая VCS Simple FTP GUI MyJUnit Сетевые крестики-нолики
Белова Татьяна 6
Веселов Иван 3
Винниченко Максим 3
Горохов Никита 5
Кощенко Екатерина 5
Свидченко Олег 5
Смирнов Даниил 1
Тонких Андрей 5
Шавкунов Михаил 2
Щербин Егор 4

Задачи

Тест 3. 25.05.17
  1. Сетевые крестики-нолики

    Разработать приложение, позволяющие пользователю играть с самим собой по сети в крестики-нолики.

Домашняя работа 11. 19.05.17
Процессоры аннотаций, Lombok (презентация)
Тест 2. 11.05.17
Условие контрольной-2 (презентация)
  1. Найди пару

    Реализовать игру "Найди пару":

    • Поле с кнопками размера N x N, кнопки без надписей
    • Кнопке ставится в соответствие случайное число от 0 до N2 /2
    • Игрок нажимает на две произвольные (разные) кнопки, на них показываются соответствующие им числа
    • Если числа совпали, кнопки делаются неактивными
    • Если числа не совпали, кнопки возвращаются в изначальное положение
    • Игра заканчивается, когда игрок открыл все пары чисел
      • Программа должна генерировать числа так, чтобы это было возможно
Домашняя работа 10. 04.05.17
Аннотации, MyJUnit (презентация)
  1. MyJUnit

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

    • Тестом считается метод, помеченный аннотацией Test
      • У аннотации может быть два аргумента — expected для исключения, ignore — для отмены запуска и указания причины
    • Перед и после запуска каждого теста в классе должны запускаться методы, помеченные аннотациями Before и After
    • Перед и после запуска тестов в классе должны запускаться методы, помеченные аннотациями BeforeClass и AfterClass

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

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

    Дедлайн: 18.05.2017, 14:29

Домашняя работа 9. 27.04.17
Effective Java (презентация)
Домашняя работа 8. 20.04.17
Графический интерфейс на Java (презентация)
  1. GUI

    Сделать GUI для FTP-клиента, позволяющий ходить по дереву файлов с сервера и скачивать файлы

    • Можно пользоваться JavaFX или Swing

    Дедлайн: 03.05.2017 23:59

Домашняя работа 7. 13.04.17
NIO Client (презентация)
Домашняя работа 6. 06.04.17
Разбор контрольной, FTP (презентация)
  1. Simple FTP

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

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

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

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

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

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

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

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

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

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

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

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

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

    Примечания:

    • Разрешается использовать библиотеки для упрощения ввода-вывода
    • Рекомендуется взглянуть на DataInputStream и DataOutputStream
    • Должны быть реализованы тесты
    • Рекомендуется задуматься об интерфейсе сервера и клиента, возможно стоит сделать что-то подобное:
      • Server: start/stop
      • Client: connect/disconnect/executeList/executeGet

    Срок: 27.04.2017 14:30

Тест 1. 30.03.17
Условие контрольной (презентация)
  1. MD5

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

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

    Требуется:

    • Однопоточный вариант
    • Вариант с Fork-Join
    • Сравнить время их работы в main-е

    Файлы могут быть большими и не помещаться в память целиком.

    Классы MessageDigest и DigestInputStream могут быть полезны.

Домашняя работа 5. 23.03.17
Разбор VCS, CountdownLatch (презентация)
Домашняя работа 4. 16.03.17
Библиотеки логирования (презентация)
Mock-объекты (презентация)
  1. Продвинутая VCS

    К системе контроля версий добавляются следующие команды:

    • status: измененные/удаленные/недобавленные/staged файлы
    • reset [file]: данная команда сбрасывает состояние файла
    • rm [file]: файл удаляется как из репозитория, так и физически
    • clean: удаляются все файлы, не добавленные в репозиторий

    Также надо добавить логирование и применить полученные знания по mock-объектам для написания тестов.

    Теперь для каждой ревизии НЕ должна храниться полная копия репозитория
    Срок: 12.04.2017, 23:59

Домашняя работа 3. 09.03.17
Обзор Guava (презентация)
Домашняя работа 2. 02.03.17
Задача про систему контроля версий (презентация)
  1. VCS

    Сделать систему контроля версий, представляющую из себя консольное приложение и умеющую:
    - commit с commit message (сообщение обязательно и принимается как параметр, система должна сама добавлять ещё дату коммита и автора)
    - работу с ветками: создание и удаление
    - checkout по имени ревизии или ветки
    - log --- список ревизий вместе с commit message в текущей ветке
    - merge --- сливает указанную ветку с текущей
    * конфликты разрешайте (или не разрешайте) любым разумным способом

    Нефункциональные требования:
    - Документация: комментарии, помощь для пользователя, краткое описание внутреннего устройства
    - Тесты
    - Исключения, обработка ошибок
    - Вывод в консоль --- только в клиентском коде типа main(), основной код должен позволять себя использовать как библиотеку
    - Развитый программный интерфейс, должно быть можно без проблем потом прикрутить GUI
    - Аннотации @NotNull, @Nullable/Optional
    - Continuous Integration

    Не накладывается никаких ограничений на хранимые на диске данные и их формат, дельта-компрессию делать не надо. Не требуется работа с удалёнными репозиториями.

    Дедлайн --- до 14:30 23.03.

Домашняя работа 1. 16.02.17
Введение и задача про Lazy (презентация)
Введение и задача про Lazy (конспект)
  1. Lazy

    Реализовать следующий интерфейс, представляющий ленивое вычисление:
    public interface Lazy<T> {
    T get();
    }

    Объект Lazy создаётся на основе вычисления (представляемого объектом Supplier)
    - Первый вызов get() вызывает вычисление и возвращает результат
    - Повторные вызовы get() возвращают тот же объект, что и первый вызов
    - В однопоточном режиме вычисление должно запускаться не более одного раза, в многопоточном — как получится (см. далее)

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, который должен иметь три метода с сигнатурами наподобие
    public static <T> Lazy<T> createLazy(Supplier<T>)

    возвращающих три разные реализации Lazy<T>:
    - Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    - Гарантия корректной работы в многопоточном режиме; вычисление не должно производиться более одного раза
    - Что-то наподобие многопоточного синглтона
    - То же, что и предыдущее, но lock-free; вычисление может производиться более одного раза, но при этом Lazy.get всегда должен возвращать один и тот же объект
    - см. AtomicReference/AtomicReferenceFieldUpdater
    - Ограничение по памяти на каждый Lazy-объект: не больше двух ссылок
    - Supplier.get вправе вернуть null

    Нужно:
    - Gradle/Maven
    - CI, на котором проходят ваши тесты
    - Тесты
    - Однопоточные, на разные хорошие и плохие случаи
    - Многопоточные, на наличие гонок

    Дедлайн: до 23:59 02.03

© 2014-2018 HwProj