-
Разработайте класс
Walk, осуществляющий подсчет хеш-сумм файлов.-
Формат запуска:
java Walk <входной файл> <выходной файл>
-
Входной файл содержит список файлов, которые требуется обойти.
-
Выходной файл должен содержать по одной строке для каждого файла. Формат строки:
<шестнадцатеричная хеш-сумма> <путь к файлу>
-
Для подсчета хеш-суммы используйте алгоритм SHA-256 (поддержка есть в стандартной библиотеке).
-
Если при чтении файла возникают ошибки, укажите в качестве его хеш-суммы все нули.
-
Кодировка входного и выходного файлов — UTF-8.
-
Размеры файлов могут превышать размер оперативной памяти.
-
Пример
Входной файл
samples/1 samples/12 samples/123 samples/1234 samples/1 samples/binary samples/no-such-file
Выходной файл
6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b samples/1 6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918 samples/12 a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 samples/123 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 samples/1234 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b samples/1 40aff2e9d2d8922e47afd4648e6967497158785fbd1da870e7110266bf944880 samples/binary 0000000000000000000000000000000000000000000000000000000000000000 samples/no-such-file
-
-
Сложный вариант:
-
Разработайте класс
RecursiveWalk, осуществляющий подсчет хеш-сумм файлов в директориях. -
Входной файл содержит список файлов и директорий, которые требуется обойти. Обход директорий осуществляется рекурсивно.
-
Пример:
Входной файл
samples/binary samples samples/no-such-file
Выходной файл
40aff2e9d2d8922e47afd4648e6967497158785fbd1da870e7110266bf944880 samples/binary 6b86b273ff34fce19d6b804eff5a3f5747ada4eaa22f1d49c01e52ddb7875b4b samples/1 6b51d431df5d7f141cbececcf79edf3dd861c3b4069f0b11661a3eefacbba918 samples/12 a665a45920422f9d417e4867efdc4fb8a04a1f3fff1fa07e998e86f7f7a27ae3 samples/123 03ac674216f3e15c761ee1a5e255f067953623c8b388b4459e13f978d7c846f4 samples/1234 40aff2e9d2d8922e47afd4648e6967497158785fbd1da870e7110266bf944880 samples/binary 0000000000000000000000000000000000000000000000000000000000000000 samples/no-such-file
-
-
При выполнении задания следует обратить внимание на:
- Дизайн и обработку исключений, диагностику ошибок.
- Программа должна корректно завершаться даже в случае ошибки.
- Корректная работа с вводом-выводом.
- Отсутствие утечки ресурсов.
- Возможность повторного использования кода.
-
Требования к оформлению задания.
- Проверяется исходный код задания.
- Весь код должен находиться в пакете
info.kgeorgiy.ja.фамилия.walk.
- Разработайте класс
ArraySet, реализующий неизменяемое упорядоченное множество.- Класс
ArraySetдолжен реализовывать интерфейс SortedSet (простой вариант) или NavigableSet (сложный вариант). - Все операции над множествами должны производиться с максимально возможной асимптотической эффективностью.
- Класс
- При выполнении задания следует обратить внимание на:
- Применение стандартных коллекций.
- Избавление от повторяющегося кода.
- Разработайте класс
StudentDB, осуществляющий поиск по базе данных студентов.- Класс
StudentDBдолжен реализовывать интерфейсStudentQuery(простой вариант) илиGroupQuery(сложный вариант). - Каждый метод должен состоять из ровно одного оператора. При этом длинные операторы надо разбивать на несколько строк.
- Класс
- При выполнении задания следует обратить внимание на:
- применение лямбда-выражений и потоков;
- избавление от повторяющегося кода.
- Реализуйте класс
Implementor, генерирующий реализации классов и интерфейсов.- Аргумент командной строки: полное имя класса/интерфейса, для которого требуется сгенерировать реализацию.
- В результате работы должен быть сгенерирован java-код класса с суффиксом
Impl, расширяющий (реализующий) указанный класс (интерфейс). - Сгенерированный класс должен компилироваться без ошибок.
- Сгенерированный класс не должен быть абстрактным.
- Методы сгенерированного класса должны игнорировать свои аргументы и возвращать значения по умолчанию.
- В задании выделяются три варианта:
- Простой —
Implementorдолжен уметь реализовывать только интерфейсы (но не классы). Поддержка generics не требуется. - Сложный —
Implementorдолжен уметь реализовывать и классы, и интерфейсы. Поддержка generics не требуется. - Бонусный —
Implementorдолжен уметь реализовывать generic-классы и интерфейсы. Сгенерированный код должен иметь корректные параметры типов и не порождатьUncheckedWarning.
- Простой —
Это домашнее задание связано с предыдущим и будет приниматься только с ним. Предыдущее домашнее задание отдельно сдать будет нельзя.
- Создайте
.jar-файл, содержащий скомпилированныйImplementorи сопутствующие классы.- Созданный
.jar-файл должен запускаться командойjava -jar. - Запускаемый
.jar-файл должен принимать те же аргументы командной строки, что и классImplementor.
- Созданный
- Модифицируйте
Implemetorтак, чтобы при запуске с аргументами-jar имя-класса файл.jarон генерировал.jar-файл с реализацией соответствующего класса (интерфейса). - Для проверки, кроме исходного кода так же должны быть представлены:
- скрипт для создания запускаемого
.jar-файла, в том числе исходный код манифеста; - запускаемый
.jar-файл.
- скрипт для создания запускаемого
- Сложный вариант. Решение должно быть модуляризовано.
Это домашнее задание связано с двумя предыдущими и будет приниматься только с ними. Предыдущие домашнее задание отдельно сдать будет нельзя.
- Документируйте класс
Implementorи сопутствующие классы с применением Javadoc.- Должны быть документированы все классы и все члены классов, в том числе
private. - Документация должна генерироваться без предупреждений.
- Сгенерированная документация должна содержать корректные ссылки на классы стандартной библиотеки.
- Должны быть документированы все классы и все члены классов, в том числе
- Для проверки, кроме исходного кода так же должны быть представлены:
- скрипт для генерации документации;
- сгенерированная документация.
- Реализуйте класс
IterativeParallelism, который будет обрабатывать списки в несколько потоков. - В простом варианте должны быть реализованы следующие методы:
minimum(threads, list, comparator)— первый минимум;maximum(threads, list, comparator)— первый максимум;all(threads, list, predicate)— проверка, что все элементы списка, удовлетворяют предикату;any(threads, list, predicate)— проверка, что существует элемент списка, удовлетворяющий предикату.count(threads, list, predicate)— подсчёт числа элементов списка, удовлетворяющих предикату.
- В сложном варианте должны быть дополнительно реализованы следующие методы:
filter(threads, list, predicate)— вернуть список, содержащий элементы удовлетворяющие предикату;map(threads, list, function)— вернуть список, содержащий результаты применения функции;join(threads, list)— конкатенация строковых представлений элементов списка.
- Во все функции передается параметр
threads— сколько потоков надо использовать при вычислении. Вы можете рассчитывать, что число потоков относительно мало. - Не следует рассчитывать на то, что переданные компараторы, предикаты и функции работают быстро.
- При выполнении задания нельзя использовать Concurrency Utilities.
-
Напишите класс
ParallelMapperImpl, реализующий интерфейсParallelMapper.public interface ParallelMapper extends AutoCloseable { <T, R> List map( Function<? super T, ? extends R> f, List<? extends T> args ) throws InterruptedException;
@Override void close();}
- Метод
mapдолжен параллельно вычислять функциюfна каждом из указанных аргументов (args). - Метод
closeдолжен останавливать все рабочие потоки. - Конструктор
ParallelMapperImpl(int threads)создаетthreadsрабочих потоков, которые могут быть использованы для распараллеливания. - К одному
ParallelMapperImplмогут одновременно обращаться несколько клиентов. - Задания на исполнение должны накапливаться в очереди и обрабатываться в порядке поступления.
- В реализации не должно быть активных ожиданий.
- Метод
-
Доработайте класс
IterativeParallelismтак, чтобы он мог использоватьParallelMapper.- Добавьте конструктор
IterativeParallelism(ParallelMapper) - Методы класса должны делить работу на
threadsфрагментов и исполнять их при помощиParallelMapper. - При наличии
ParallelMapperсамIterativeParallelismновые потоки создавать не должен. - Должна быть возможность одновременного запуска и работы нескольких клиентов, использующих один
ParallelMapper.
- Добавьте конструктор
-
При выполнении задания всё ещё нельзя использовать Concurrency Utilities.
- Напишите потокобезопасный класс
WebCrawler, который будет рекурсивно обходить сайты.-
Класс
WebCrawlerдолжен иметь конструкторpublic WebCrawler(Downloader downloader, int downloaders, int extractors, int perHost)
downloaderпозволяет скачивать страницы и извлекать из них ссылки;downloaders— максимальное число одновременно загружаемых страниц;extractors— максимальное число страниц, из которых одновременно извлекаются ссылки;perHost— максимальное число страниц, одновременно загружаемых c одного хоста. Для определения хоста следует использовать методgetHostклассаURLUtilsиз тестов.
-
Класс
WebCrawlerдолжен реализовывать интерфейсCrawlerpublic interface Crawler extends AutoCloseable { Result download(String url, int depth);
void close();}
- Метод
downloadдолжен рекурсивно обходить страницы, начиная с указанного URL, на указанную глубину и возвращать список загруженных страниц и файлов. Например, если глубина равна 1, то должна быть загружена только указанная страница. Если глубина равна 2, то указанная страница и те страницы и файлы, на которые она ссылается, и так далее. - Метод
downloadможет вызываться параллельно в нескольких потоках. - Загрузка и обработка страниц (извлечение ссылок) должна выполняться максимально параллельно, с учетом ограничений на число одновременно загружаемых страниц (в том числе с одного хоста) и страниц, с которых загружаются ссылки.
- Для распараллеливания разрешается создать до
downloaders + extractorsвспомогательных потоков. - Повторно загружать и/или извлекать ссылки из одной и той же страницы в рамках одного обхода (
download) запрещается. - Метод
closeдолжен завершать все вспомогательные потоки.
- Метод
-
Для загрузки страниц должен применяться
Downloader, передаваемый первым аргументом конструктора.public interface Downloader { public Document download(final String url) throws IOException; }
-
Метод
downloadзагружает документ по его адресу (URL). -
Документ позволяет получить ссылки по загруженной странице:
public interface Document { List extractLinks() throws IOException; }
Ссылки, возвращаемые документом, являются абсолютными и имеют схему
httpилиhttps.
-
-
Должен быть реализован метод
main, позволяющий запустить обход из командной строки-
Командная строка
WebCrawler url [depth [downloads [extractors [perHost]]]]
-
Для загрузки страниц требуется использовать реализацию
CachingDownloaderиз тестов.
-
-
- Версии задания
- Простая — не требуется учитывать ограничения на число одновременных закачек с одного хоста (
perHost >= downloaders). - Полная — требуется учитывать все ограничения.
- Бонусная — сделать параллельный обход в ширину.
- Простая — не требуется учитывать ограничения на число одновременных закачек с одного хоста (
- Задание подразумевает активное использование Concurrency Utilities, в частности, в решении не должно быть «велосипедов», аналогичных/легко сводящихся к классам из Concurrency Utilities.
- Реализуйте клиент и сервер, взаимодействующие по UDP.
- Класс HelloUDPClient должен отправлять запросы на сервер, принимать результаты и выводить их на консоль.
- Аргументы командной строки:
- имя или ip-адрес компьютера, на котором запущен сервер;
- номер порта, на который отсылать запросы;
- префикс запросов (строка);
- число параллельных потоков запросов;
- число запросов в каждом потоке.
- Запросы должны одновременно отсылаться в указанном числе потоков. Каждый поток должен ожидать обработки своего запроса и выводить сам запрос и результат его обработки на консоль. Если запрос не был обработан, требуется послать его заново.
- Запросы должны формироваться по схеме <префикс запросов><номер потока>_<номер запроса в потоке>.
- Аргументы командной строки:
- Класс HelloUDPServer должен принимать задания, отсылаемые классом HelloUDPClient и отвечать на них.
- Аргументы командной строки:
- номер порта, по которому будут приниматься запросы;
- число рабочих потоков, которые будут обрабатывать запросы.
- Ответом на запрос должно быть Hello, <текст запроса>.
- Несмотря на то, что текущий способ получения ответа по запросу очень прост, сервер должен быть рассчитан на ситуацию, когда этот процесс может требовать много ресурсов и времени.
- Если сервер не успевает обрабатывать запросы, прием запросов может быть временно приостановлен.
- Аргументы командной строки:
- Добавьте к банковскому приложению возможность работы с физическими лицами.
- У физического лица (
Person) можно запросить имя, фамилию и номер паспорта. - Удалённые физические лица (
RemotePerson) должны передаваться при помощи удалённых объектов. - Локальные физические лица (
LocalPerson) должны передаваться при помощи механизма сериализации, и при последующем использовании не требовать связи с сервером. - Должна быть возможность поиска физического лица по номеру паспорта, с выбором типа возвращаемого лица.
- Должна быть возможность создания записи о физическом лице по его данным.
- У физического лица может быть несколько счетов, к которым должен предоставляться доступ (через
Person). - Счёту физического лица с идентификатором subId должен соответствовать банковский счёт с id вида passport:subId.
- Изменения, производимые со счётом в банке (создание и изменение баланса), должны быть видны всем соответствующим
RemotePerson, и только темLocalPerson, которые были созданы после этого изменения. - Изменения в счетах, производимые через
RemotePerson, должны сразу применяться глобально, а производимые черезLocalPerson– только локально для этого конкретногоLocalPerson.
- У физического лица (
- Реализуйте приложение, демонстрирующее работу с физическим лицами.
- Аргументы командной строки: имя, фамилия, номер паспорта физического лица, номер счёта, изменение суммы счёта.
- Если информация об указанном физическом лице отсутствует, то оно должно быть добавлено. В противном случае – должны быть проверены его данные.
- Если у физического лица отсутствует счёт с указанным номером, то он создается с нулевым балансом.
- После обновления суммы счёта новый баланс должен выводиться на консоль.
- Напишите тесты, проверяющие вышеуказанное поведение как банка, так и приложения.
- Для реализации тестов рекомендуется использовать JUnit (Tutorial). Множество примеров использования можно найти в тестах.
- Если вы знакомы с другим тестовым фреймворком (например, TestNG), то можете использовать его.
- Добавьте jar-файлы используемых библиотек в каталог
libвашего репозитория. - Нельзя использовать самописные фреймворки и тесты, запускаемые через
main.
- Сложный вариант
- На каждом счету всегда должно быть неотрицательное количество денег.
- Тесты не должны рассчитывать на наличие запущенного RMI Registry.
- Создайте класс
BankTests, запускающий тесты. - Создайте скрипт, запускающий
BankTestsи возвращающий код (статус)0в случае успеха и1в случае неудачи. - Создайте скрипт, запускающий тесты с использованием стандартного подхода для вашего тестового фреймворка. Код возврата должен быть как в предыдущем пункте.
- Приложения и тесты должны находится в пакете
info.kgeorgiy.ja.*.bankи его подпакетах.
-
Создайте приложение
TextStatistics, анализирующее тексты на различных языках.-
Аргументы командной строки:
- локаль текста,
- локаль вывода,
- файл с текстом,
- файл отчета.
-
Поддерживаемые локали текста: все локали, имеющиеся в системе.
-
Поддерживаемые локали вывода: русская и английская.
-
Файлы имеют кодировку UTF-8.
-
Подсчет статистики должен вестись по следующим категориям:
- предложения,
- слова,
- числа,
- деньги,
- даты.
-
Для каждой категории должна собираться следующая статистика:
- число вхождений,
- число различных значений,
- минимальное значение,
- максимальное значение,
- минимальная длина,
- максимальная длина,
- среднее значение/длина.
-
Пример отчета:
Анализируемый файл "input.txt" Сводная статистика Число предложений: 43. Число слов: 275. Число чисел: 40. Число сумм: 3. Число дат: 3. Статистика по предложениям Число предложений: 43 (43 различных). Минимальное предложение: "Аргументы командной строки: локаль текста, локаль вывода, файл с текстом, файл отчета.". Максимальное предложение: "Число чисел: 40.". Минимальная длина предложения: 13 ("Число дат: 3."). Максимальная длина предложения: 211 ("GK: если сюда поставить реальное предложение, то процесс не сойдётся"). Средняя длина предложения: 55,465. Статистика по словам Число слов: 275 (157 различных). Минимальное слово: "GK". Максимальное слово: "языках". Минимальная длина слова: 1 ("с"). Максимальная длина слова: 14 ("TextStatistics"). Средняя длина слова: 6,72. Статистика по числам Число чисел: 40 (24 различных). Минимальное число: -12345,0. Максимальное число: 12345,67. Среднее число: 207,676. Статистика по суммам денег Число сумм: 3 (3 различных). Минимальная сумма: 100,00 ₽. Максимальная сумма: 345,67 ₽. Средняя сумма: 222,83 ₽. Статистика по датам Число дат: 3 (3 различных). Минимальная дата: 19 мая 2023 г.. Максимальная дата: 2 июн. 2023 г.. Средняя дата: 26 мая 2023 г..
-
-
Вы можете рассчитывать на то, что весь текст помещается в память.
-
При выполнении задания следует обратить внимание на:
- Декомпозицию сообщений для локализации.
- Согласование сообщений по роду и числу.
-
Напишите тесты, проверяющие вышеуказанное поведение приложения.
-
Приложение и тесты должны находится в пакете
info.kgeorgiy.ja.*.i18nи его подпакетах.