Домашнее задание 1. Обход файлов
-
Разработайте класс
Walk, осуществляющий подсчет хэш-сумм файлов.-
Формат запуска:
java Walk <входной файл> <выходной файл>
- Входной файл содержит список файлов, которые требуется обойти.
-
Выходной файл должен содержать по одной строке для каждого файла.
Формат строки:
<шестнадцатеричная хэш-сумма> <путь к файлу>
- Для подсчета хэш-суммы используйте алгоритм FNV.
- Если при чтении файла возникают ошибки, укажите в качестве его хэш-суммы все нули.
- Кодировка входного и выходного файлов — UTF-8.
- Размеры файлов могут превышать размер оперативной памяти.
-
Пример
Входной файл samples/1 samples/12 samples/123 samples/1234 samples/1 samples/binary samples/no-such-fileВыходной файл 050c5d2e samples/1 2076af58 samples/12 72d607bb samples/123 81ee2b55 samples/1234 050c5d2e samples/1 8e8881c5 samples/binary 00000000 samples/no-such-file
-
Формат запуска:
-
Сложный вариант:
-
Разработайте класс
RecursiveWalk, осуществляющий подсчет хэш-сумм файлов в директориях. - Входной файл содержит список файлов и директорий, которые требуется обойти. Обход директорий осуществляется рекурсивно.
-
Пример:
Входной файл samples/binary samples samples/no-such-fileВыходной файл 8e8881c5 samples/binary 050c5d2e samples/1 2076af58 samples/12 72d607bb samples/123 81ee2b55 samples/1234 8e8881c5 samples/binary 00000000 samples/no-such-file
-
Разработайте класс
-
При выполнении задания следует обратить внимание на:
- Дизайн и обработку исключений, диагностику ошибок.
- Программа должна корректно завершаться даже в случае ошибки.
- Корректная работа с вводом-выводом.
- Отсутствие утечки ресурсов.
- Возможность повторного использования кода.
-
Требования к оформлению задания.
- Проверяется исходный код задания.
-
Весь код должен находиться в пакете
info.kgeorgiy.ja.фамилия.walk.
Домашнее задание 2. Множество на массиве
-
Разработайте класс
ArraySet, реализующий неизменяемое упорядоченное множество.-
Класс
ArraySetдолжен реализовывать интерфейс SortedSet (простой вариант) или NavigableSet (сложный вариант). - Все операции над множествами должны производиться с наилучшей асимптотической эффективностью.
-
Класс
-
При выполнении задания следует обратить внимание на:
- Применение стандартных коллекций.
- Избавление от повторяющегося кода.
- Отсутствие unchecked warnings при компиляции.
- Отсутствие излишних подавленных unchecked warnings.
Домашнее задание 3. Студенты
-
Разработайте класс
StudentDB, осуществляющий поиск по базе данных студентов.-
Класс
StudentDBдолжен реализовывать интерфейсStudentQuery(простой вариант) илиGroupQuery(сложный вариант). - Каждый метод должен состоять из ровно одного оператора. При этом длинные операторы надо разбивать на несколько строк.
-
Класс
-
При выполнении задания следует обратить внимание на:
- применение лямбда-выражений и потоков;
- избавление от повторяющегося кода.
Домашнее задание 4. Реализация потоков
-
Разработайте класс
Streams, реализующий сплитераторы для деревьев и дополнительные коллекторы.- Простой вариант (интерфейс
EasyStreams) — реализуйте:- сплитераторы для двоичных деревьев, двоичных деревьев с известным размером, k-ичных деревьев;
- коллекторы первого, последнего, среднего элементов;
- коллекторы общего префикса и суффикса строк;
- преобразователь строки в её непустые префиксы;
- преобразователь, оставляющий каждый n-й элемент;
- преобразователь, оставляющий префикс потока состоящий из уникальных элементов.
- Сложный вариант (интерфейс
HardStreams) — дополнительно реализуйте:- сплитераторы всех видов деревьев над списками элементов;
- коллектор k-ого элемента;
- коллекторы первых и последних n элементов.
- преобразователь строки в её непустые суффиксы;
- преобразователь, оставляющий i-й из каждого n-элементного окна;
- преобразователь, оставляющий префикс потока, для которых функция выдаёт уникальные элементы.
- Простой вариант (интерфейс
-
При выполнении задания следует обратить внимание на:
- характеристики создаваемых сплитераторов;
- избавление от повторяющегося кода.
Домашнее задание 5. Implementor
-
Реализуйте класс
Implementor, генерирующий реализации классов и интерфейсов.- Аргумент командной строки: полное имя класса/интерфейса, для которого требуется сгенерировать реализацию.
-
В результате работы должен быть сгенерирован java-код класса с суффиксом
Impl, расширяющий (реализующий) указанный класс (интерфейс). - Сгенерированный класс должен компилироваться без ошибок.
- Сгенерированный класс не должен быть абстрактным.
- Методы сгенерированного класса должны игнорировать свои аргументы и возвращать значения по умолчанию.
-
В задании выделяются три варианта:
- Простой —
Implementorдолжен уметь реализовывать только интерфейсы (но не классы). Поддержка generics не требуется. - Сложный —
Implementorдолжен уметь реализовывать и классы, и интерфейсы. Поддержка generics не требуется. - Бонусный —
Implementorдолжен уметь реализовывать generic-классы и интерфейсы. Сгенерированный код должен иметь корректные параметры типов и не порождать unchecked warnings.
- Простой —
Домашнее задание 6. Jar Implementor
Это домашнее задание связано с предыдущим и будет приниматься только с ним. Предыдущее домашнее задание отдельно сдать будет нельзя.
-
Создайте
.jar-файл, содержащий скомпилированныйImplementorи сопутствующие классы.-
Созданный
.jar-файл должен запускаться командойjava -jar. -
Запускаемый
.jar-файл должен принимать те же аргументы командной строки, что и классImplementor.
-
Созданный
-
Модифицируйте
Implementorтак, чтобы при запуске с аргументами-jar имя-класса файл.jarон генерировал.jar-файл с реализацией соответствующего класса (интерфейса). Для компиляции можно использовать код из тестов. - Вы можете создавать файлы и директории в текущем каталоге, но не за его пределами.
-
Для проверки, кроме исходного кода, также должны быть представлены:
-
скрипт для создания запускаемого
.jar-файла, в том числе, исходный код манифеста; -
запускаемый
.jar-файл.
-
скрипт для создания запускаемого
- Сложный вариант. Решение должно быть модуляризовано.
Домашнее задание 7. Javadoc
Это домашнее задание связано с двумя предыдущими и будет приниматься только с ними. Предыдущие домашние задания отдельно сдать будет нельзя.
-
Документируйте класс
Implementorи сопутствующие классы с применением Javadoc.-
Должны быть документированы все классы и все члены классов,
в том числе
private. - Документация должна генерироваться без предупреждений.
-
Сгенерированная документация должна содержать корректные
ссылки на классы стандартной библиотеки и модулей
info.kgeorgiy.java.advanced.*.
-
Должны быть документированы все классы и все члены классов,
в том числе
-
Для проверки, кроме исходного кода, также должны быть представлены:
- скрипт для генерации документации (он может рассчитывать, что рядом с вашим репозиторием склонирован репозиторий курса);
- сгенерированная документация.
В последующих домашних заданиях все public и
protected сущности должны быть документированы.
Домашнее задание 8. Итеративный параллелизм
-
Реализуйте класс
IterativeParallelism, который будет обрабатывать списки в несколько потоков. -
В простом варианте должны быть реализованы следующие методы:
argMax(threads, list, comparator)— индекс первого максимума;argMin(threads, list, comparator)— индекс первого минимума;indexOf(threads, list, predicate)— индекс первого элемента, удовлетворяющего предикат;lastIndexOf(threads, list, predicate)— индекс последнего элемента, удовлетворяющего предикат;sumIndices(threads, list, predicate)— сумма индексов элементов, удовлетворяющих предикат;
-
В сложном варианте должны быть дополнительно реализованы следующие методы:
indices(threads, list, predicate)— индексы элементов, удовлетворяющих предикат;filter(threads, list, predicate)— вернуть список, содержащий элементы удовлетворяющие предикату;map(threads, list, function)— вернуть список, содержащий результаты применения функции;
-
Во все функции передается параметр
threads— сколько потоков надо использовать при вычислении. Вы можете рассчитывать, что число потоков относительно мало. - Не следует рассчитывать на то, что переданные компараторы, предикаты и функции работают быстро.
-
Можно сделать O(
threads), но не O(list.size()) действий без распараллеливания. - При выполнении задания нельзя использовать Concurrency Utilities и Parallel Streams.
Домашнее задание 9. Параллельный запуск
-
Напишите класс
ParallelMapperImpl, реализующий интерфейсParallelMapper.public interface ParallelMapper extends AutoCloseable { <T, R> List<R> map( Function<? super T, ? extends R> f, List<? extends T> args ) throws InterruptedException; @Override void close(); }-
Метод
mapдолжен параллельно вычислять функциюfна каждом из указанных аргументов (args). -
Конструктор
ParallelMapperImpl(int threads)должен создаватьthreadsрабочих потоков, которые используются для распараллеливания. -
Метод
closeдолжен останавливать все рабочие потоки. -
К одному
ParallelMapperImplмогут одновременно обращаться несколько клиентов. - При недостатке потоков для распараллеливания, задания на исполнение должны накапливаться в очереди и обрабатываться в порядке поступления.
- В реализации не должно быть активных ожиданий.
- Код должен находиться в пакете
iterative. -
Обратите внимание на обработку исключений,
кидаемых функцией
f.- Исключения не должны приводить к сокращению числа рабочих потоков.
- Сложный вариант.
Исключения должны выкидываться из метода
map.
-
Метод
-
Доработайте класс
IterativeParallelismтак, чтобы он мог использоватьParallelMapper.-
Добавьте конструктор
IterativeParallelism(ParallelMapper). -
Методы класса должны делить работу на
threadsфрагментов и исполнять их при помощиParallelMapper. -
При наличии
ParallelMapperсамIterativeParallelismновые потоки создавать не должен. -
Должна быть возможность одновременного запуска и работы
нескольких клиентов, использующих один
ParallelMapper.
-
Добавьте конструктор
- При выполнении задания всё ещё нельзя использовать Concurrency Utilities и Parallel Streams.
Домашнее задание 10. Web Crawler
-
Напишите потокобезопасный класс
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<String> extractLinks() throws IOException; }Ссылки, возвращаемые документом, являются абсолютными и имеют схемуhttpилиhttps.
-
Метод
-
Должен быть реализован метод
main, позволяющий запустить обход из командной строки-
Командная строка
WebCrawler url [depth [downloaders [extractors [perHost]]]]
-
Для загрузки страниц требуется использовать реализацию
CachingDownloaderиз тестов.
-
Командная строка
-
Класс
-
Версии задания
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
perHost >= downloaders). - Полная — требуется учитывать все ограничения.
- Бонусная — сделать параллельный обход в ширину без синхронизации между слоями.
- Простая — не требуется учитывать ограничения
на число одновременных закачек с одного хоста
(
- Задание подразумевает активное использование Concurrency Utilities, в частности, в решении не должно быть «велосипедов», аналогичных/легко сводящихся к классам из Concurrency Utilities.
Домашнее задание 11. HelloUDP
- Реализуйте клиент и сервер, взаимодействующие по UDP.
-
Класс HelloUDPClient должен отправлять запросы
на сервер, принимать результаты и выводить их на консоль.
-
Аргументы командной строки:
- имя или ip-адрес компьютера, на котором запущен сервер;
- номер порта, на который отсылать запросы;
- префикс запросов (строка);
- число параллельных потоков запросов;
- число запросов в каждом потоке.
- Запросы должны одновременно отсылаться в указанном числе потоков. Каждый поток должен ожидать обработки своего запроса и выводить сам запрос и результат его обработки на консоль. Если запрос не был обработан, требуется послать его заново.
- Запросы должны формироваться по схеме <префикс запросов><номер запроса в потоке>_<номер потока>.
-
Аргументы командной строки:
-
Класс HelloUDPServer должен принимать задания, отсылаемые
классом HelloUDPClient и отвечать на них.
-
Аргументы командной строки:
- номер порта, по которому будут приниматься запросы;
- число рабочих потоков, которые будут обрабатывать запросы.
- Ответом на запрос должно быть Hello, <текст запроса>.
- Несмотря на то, что текущий способ получения ответа по запросу очень прост, сервер должен быть рассчитан на ситуацию, когда этот процесс может требовать много ресурсов и времени.
- Если сервер не успевает обрабатывать запросы, прием запросов может быть временно приостановлен.
-
Аргументы командной строки: