Практика по Java

x02-2016 (Java) группа

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

Студент TODO №1 №2 №3 Тест 1 №4 №5 Тест 2 Тест 3
45 Пул потоков Lazy Крестики-нолики Simple FTP GUI для FTP MyJUnit Сетевые крестики-нолики
Абрамов Дмитрий 4
Алфёров Василий 4
Бартош Григорий 3
Василенко Елизавета 1
Ерохина Алина 4
Казаков Дмитрий 1
Казначеев Дмитрий 3
Киракосян Александр 6
Кириленко Андрей 2
Купоросов Василий 3
Недиков Костя 2
Смирдин Андрей 5
Тух Игорь 4
Ютман Михаил 3

Задачи

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

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

Тест 2. 04.05.18
  1. Найди пару

    Реализовать игру "Найди пару". При запуске отображается поле с кнопками размера N x N (N передаётся как параметр при запуске), кнопки без надписей. Каждой кнопке ставится в соответствие случайное число от 0 до N2 / 2. Игрок нажимает на две произвольные (разные) кнопки, на них показываются соответствующие им числа. Если числа совпали, кнопки делаются неактивными. Если числа не совпали, кнопки через некоторое время возвращаются в изначальное положение. Игра заканчивается, когда игрок открыл все пары чисел (программа должна генерировать числа таким образом, чтобы это было возможно).

    (Необязательно) Поучаствовать в исследовании плагина к IDEA, генерирующего код по запросу: https://docs.google.com/forms/d/e/1FAIpQLSeMJPyHxWH6A6mIpT9wm17H61USXlHRH-IlTjajkLXV85OA_w/viewform

Домашняя работа 5. 27.04.18
Практика 4: Аннотации, процессоры аннотаций, Lombok (презентация)
  1. MyJUnit

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

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

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

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

    Дедлайн: 21.05.2018, 10:00

Домашняя работа 4. 13.04.18
  1. GUI для FTP

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

    Дедлайн: до 10:00 13.05.2018

Тест 1. 13.04.18
  1. MD5

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

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

    Требуется:

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

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

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

Домашняя работа 3. 30.03.18
Практика 3: Effective Java (презентация)
  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
    • Должны быть реализованы тесты

    Дедлайн: до 10:00 04.05.2018

    Ссылки на пуллреквесты с решениями (и предыдущих непроверенных задач тоже) посылайте Ильнуру Шугаепову (itmo.stud@gmail.com)

    (необязательно) Поучаствовать в исследовании IDEA context helper plugin: https://docs.google.com/document/d/1gdO5d42Ccq719lrI_0vVOPHgdenjeIVrS9n2tC4kO8I

Домашняя работа 2. 02.03.18
Практика 2: Графический интерфейс на Java (презентация)
  1. Крестики-нолики

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

    Нужны юнит-тесты для всего, что не относится напрямую к GUI

    Дедлайн 23.03.2018, 10:00

Домашняя работа 1. 16.02.18
Практика 1: Введение, потоки (презентация)
Практика 1: Введение, потоки (конспект)
Таблица с баллами
Таблица со штрафами
  1. Пул потоков

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

    • При создании объекта ThreadPoolImpl в нем должно начать работу n потоков
    • У каждого потока есть два состояния: ожидание задачи / выполнение задачи
    • Задача — вычисление некоторого значения, вызов get у объекта типа Supplier<R>
    • При добавлении задачи, если в пуле есть ожидающий поток, то он должен приступить к ее исполнению. Иначе задача будет ожидать исполнения, пока не освободится какой-нибудь поток
    • Задачи, принятые к исполнению, представлены в виде объектов интерфейса LightFuture
    • Метод shutdown должен завершить работу потоков. Для того, чтобы прервать работу потока, рекомендуется пользоваться методом Thread.interrupt()
    • LightFuture
      • Метод isReady возвращает true, если задача выполнена
      • Метод get возвращает результат выполнения задачи
      • В случае, если соответствующий задаче supplier завершился с исключением, этот метод должен завершиться с исключением LightExecutionException
      • Если результат еще не вычислен, метод ожидает его и возвращает полученное значение
      • Метод thenApply — принимает объект типа Function, который может быть применен к результату данной задачи X и возвращает новую задачу Y, принятую к исполнению
      • Новая задача будет исполнена не ранее, чем завершится исходная
      • В качестве аргумента объекту Function будет передан результат исходной задачи, и все Y должны исполняться на общих основаниях (т.е. должны разделяться между потоками пула)
      • Метод thenApply может быть вызван несколько раз
      • Метод thenApply не должен блокировать работу потока, если результат задачи X ещё не вычислен

    При этом:

    • В данной работе запрещено использование содержимого пакета java.util.concurrent
    • Все интерфейсные методы должны быть потокобезопасны
    • Для каждого базового сценария использования должен быть написан несложный тест
    • Также должен быть написан тест, проверяющий, что в пуле действительно не менее n потоков

    Дедлайн: до 10:00 09.03.2018

  2. Lazy

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

    public interface Lazy<T> {
            T get();
    }
    

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

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

    public static <T> Lazy<T> create...Lazy(Supplier<T>)
    

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

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

    Дедлайн: до 10:00 09.03.2018

© 2014-2018 HwProj