Практика по Java

202 (АУ, MIT-2016) группа

Тимофей Брыксин

Студент TODO №1 №2 №3 Тест 1 №4 №5 Тест 2 Тест 3
35 Pool Lazy X/O FTP MD5 FTP GUI XUnit 1
Алехина Ольга 2
Егоров Владимир 1
Елисеева Мария 1
Ермилов Антон 2
Карлина Любовь 1
Крючков Максим 5
Лупуляк Ольга 2
Мурашкина Наташа 1
Никифоровская Анна 1
Орлова Александра 3
Парадовский Юрий 3
Правилов Михаил 1
Саютин Дмитрий 6
Соликов Павел 2
Фарутин Вадим
Федоров Александр 1
Федотов Александр 1
Шаркова Дарья 1
Швецова Анна 1

Задачи

Тест 3. 25.05.18
  1. Реализовать свой собственный CountdownLatch, который ещё и умеет увеличивать счётчик:
    * конструктор, принимающий число (начальное значение счётчика) в качестве аргумента
    * метод await(), который блокирует вызвавший его поток, пока счётчик не станет равным нулю
    * метод countDown(), который уменьшает счётчик на 1 и запускает все потоки, заблокированные на await, если счётчик достиг 0
    * Если счётчик и так 0, countDown() блокирует поток до тех пор, пока счётчик не станет положительным, потом уменьшает его
    * метод countUp(), который увеличивает счётчик на 1 и запускает потоки, заблокированные на countDown(), если такие есть
    Нельзя использовать synchronized, но можно Lock/Condition

Тест 2. 04.05.18
  1. Pair

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

Домашняя работа 5. 30.04.18
Аннотации, процессоры аннотаций, Lombok (презентация)
  1. XUnit

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

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

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

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

    Дедлайн: 18.05.2018, 10:00, 23:59

Домашняя работа 4. 18.04.18
  1. FTP GUI

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

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

Тест 1. 13.04.18
  1. MD5

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

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

    Требуется:

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

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

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

Домашняя работа 3. 01.04.18
Effective Java
Ссылка на описание исследования, проводимого в рамках одного из НИР
  1. 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

    Полезные ссылки:
    * Google -> Java Sockets
    * https://docs.oracle.com/javase/tutorial/networking/sockets/clientServer.html

Домашняя работа 2. 02.03.18
JavaFX
  1. X/O

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

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

Домашняя работа 1. 16.02.18
Результаты
Система штрафов
Презентация про потоки
  1. Pool

    Реализовать простой пул задач с фиксированным числом потоков (число задается в конструкторе). При создании объекта данного класса в нем должно начать работу заданное количество потоков. У каждого потока есть два состояния: ожидание задачи и выполнение задачи. Задача — вычисление некоторого значения, вызов get() у объекта типа Supplier<R>. Если при добавлении задачи в пуле есть ожидающий поток, то он должен приступить к ее исполнению, иначе задача будет ожидать исполнения, пока не освободится какой-нибудь поток. В классе должен быть метод shutdown должен завершить работу потоков (через Thread.interrupt()). Задачи, принятые к исполнению, представлены в виде объектов интерфейса LightFuture с несколькими методами.

    • isReady() возвращает true, если задача выполнена.
    • get() возвращает результат выполнения задачи. Если результат еще не вычислен, метод ожидает его и возвращает полученное значение. Если соответствующий задаче supplier завершился с исключением, этот метод должен завершиться с исключением LightExecutionException.
    • thenApply() — принимает объект типа Function, который может быть применен к результату данной задачи X и возвращает новую задачу Y, принятую к исполнению. В качестве аргумента объекту Function будет передан результат исходной задачи, и все Y должны исполняться на общих основаниях (т.е. должны разделяться между потоками пула). Новая задача будет исполнена не ранее, чем завершится исходная. Метод thenApply() может быть вызван несколько раз, при этом не должен блокировать работу потока, если результат задачи X ещё не вычислен.
  2. Lazy

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

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

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

    Создавать объекты надо не вручную, а с помощью класса LazyFactory, который должен иметь два метода с сигнатурами вида public static <T> Lazy<T> create...Lazy(Supplier<T>), возвращающих две разные реализации Lazy<T>:
    - Простая версия с гарантией корректной работы в однопоточном режиме (без синхронизации)
    - Гарантия корректной работы в многопоточном режиме; вычисление не должно производиться более одного раза

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

© 2014-2018 HwProj