- Разработайте класс Walk, осуществляющий подсчет хеш-сумм файлов.
- Формат запуска:
java Walk <входной файл> <выходной файл>
- Входной файл содержит список файлов, которые требуется обойти.
- Выходной файл должен содержать по одной строке для каждого файла. Формат строки:
<шестнадцатеричная хеш-сумма> <путь к файлу>
- Для подсчета хеш-суммы используйте алгоритм FNV.
- Если при чтении файла возникают ошибки, укажите в качестве его хеш-суммы 00000000.
- Кодировка входного и выходного файлов — UTF-8.
- Размеры файлов могут превышать размер оперативной памяти.
- Пример
Входной файл
java/info/kgeorgiy/java/advanced/walk/samples/156
java/info/kgeorgiy/java/advanced/walk/samples/127
java/info/kgeorgiy/java/advanced/walk/samples/123
java/info/kgeorgiy/java/advanced/walk/samples/1234
java/info/kgeorgiy/java/advanced/walk/samples/1
java/info/kgeorgiy/java/advanced/walk/samples/binary
java/info/kgeorgiy/java/advanced/walk/samples/no-such-file
Выходной файл
050c5d2e java/info/kgeorgiy/java/advanced/walk/samples/156
2076af58 java/info/kgeorgiy/java/advanced/walk/samples/127
72d607bb java/info/kgeorgiy/java/advanced/walk/samples/123
81ee2b55 java/info/kgeorgiy/java/advanced/walk/samples/1234
050c5d2e java/info/kgeorgiy/java/advanced/walk/samples/1
8e8881c5 java/info/kgeorgiy/java/advanced/walk/samples/binary
00000000 java/info/kgeorgiy/java/advanced/walk/samples/no-such-file
- Формат запуска:
- При выполнении задания следует обратить внимание на:
- Дизайн и обработку исключений, диагностику ошибок.
- Программа должна корректно завершаться даже в случае ошибки.
- Корректная работа с вводом-выводом.
- Отсутствие утечки ресурсов.
- Требования к оформлению задания.
- Проверяется исходный код задания.
- Весь код должен находиться в пакете
ru.ifmo.rain.фамилия.walk.
Для того, чтобы протестировать программу:
- Скачайте тесты (WalkTest.jar) и библиотеки к ним: junit-4.11.jar, hamcrest-core-1.3.jar
- Откомпилируйте решение домашнего задания
- Протестируйте домашнее задание
info.kgeorgiy.java.advanced.walk.Tester Walk <полное имя класса>
- Обратите внимание, что все скачанные
.jar
файлы должны быть указаны вCLASSPATH
.
- Разработайте класс
ArraySet
, реализующие неизменяемое упорядоченное множество.- Класс
ArraySet
должен реализовывать интерфейсSortedSet
. - Все операции над множествами должны производиться с максимально возможной асимптотической эффективностью.
- Класс
- При выполнении задания следует обратить внимание на:
- Применение стандартных коллекций.
- Избавление от повторяющегося кода.
Тестирование
info.kgeorgiy.java.advanced.arrayset.Tester SortedSet <полное имя класса>
- Разработайте класс
StudentDB
, осуществляющий поиск по базе данных студентов.- Класс
StudentDB
должен реализовывать интерфейсStudentQuery
. - Каждый методы должен состоять из ровного одного оператора. При этом длинные операторы надо разбивать на несколько строк.
- Класс
- При выполнении задания следует обратить внимание на:
- Применение лямбда-выражений и поток.
- Избавление от повторяющегося кода.
Тестирование
info.kgeorgiy.java.advanced.student.Tester StudentQuery <полное имя класса>
- Реализуйте класс
Implementor
, который будет генерировать реализации классов и интерфейсов.- Аргументы командной строки: полное имя класса/интерфейса, для которого требуется сгенерировать реализацию.
- В результате работы должен быть сгенерирован java-код класса с суффиксом
Impl
, расширяющий (реализующий) указанный класс (интерфейс). - Сгенерированный класс должен компилироваться без ошибок.
- Сгенерированный класс не должен быть абстрактным.
- Методы сгенерированного класса должны игнорировать свои аргументы и возвращать значения по умолчанию.
- В задании выделяются три уровня сложности:
Implementor
должен уметь реализовывать только интерфейсы (но не классы). Поддержка generics не требуется.
Тестирование
info.kgeorgiy.java.advanced.implementor.Tester interface <полное имя класса>
- Создайте
.jar-файл
, содержащий скомпилированныйImplementor
и сопутствующие классы.- Созданный
.jar-файл
должен запускаться командойjava -jar
. - Запускаемый
.jar-фай
л должен принимать те же аргументы командной строки, что и классImplementor
.
- Созданный
- Модифицируйте
Implemetor
так, что бы при запуске с аргументами -jar имя-класса файл.jar он генерировал.jar-файл
с реализацией соответствующего класса (интерфейса). - Для проверки, кроме исходного кода так же должны быть предъявлены:
- скрипт для создания запускаемого
.jar-файла
, в том числе, исходный код манифеста; - запускаемый
.jar-файл
.
- скрипт для создания запускаемого
Тестирование
info.kgeorgiy.java.advanced.implementor.Tester jar-interface <полное имя класса>
- Документируйте класс
Implementor
и сопутствующие классы с применениемJavadoc
.- Должны быть документированы все классы и все члены классов, в том числе закрытые
private
. - Документация должна генерироваться без предупреждений. Сгенерированная документация должна содержать корректные ссылки на классы стандартной библиотеки.
- Должны быть документированы все классы и все члены классов, в том числе закрытые
- Для проверки, кроме исходного кода так же должны быть предъявлены:
- скрипт для генерации документации;
- сгенерированная документация.
- Реализуйте класс
IterativeParallelism
, который будет обрабатывать списки в несколько потоков. - В простом варианте должны быть реализованы следующие методы:
minimum(threads, list, comparator)
— первый минимум;maximum(threads, list, comparator)
— первый максимум;all(threads, list, predicate)
— проверка, что все элементы списка удовлетворяют предикату;any(threads, list, predicate)
— проверка, что существует элемент списка, удовлетворяющий предикату.
- В сложном варианте должны быть дополнительно реализованы следующие методы:
filter(threads, list, predicate)
— вернуть список, содержащий элементы удовлетворяющие предикату;map(threads, list, function)
— вернуть список, содержащий результаты применения функции;join(threads, list)
— конкатенация строковых представлений элементов списка.
- Во все функции передается параметр threads — сколько потоков надо использовать при вычислении. Вы можете рассчитывать, что число потоков не велико.
- Не следует рассчитывать на то, что переданные компараторы, предикаты и функции работают быстро.
- При выполнении задания нельзя использовать
Concurrency Utilities
. - Рекомендуется подумать, какое отношение к заданию имеют моноиды.
Тестирование
-
простой вариант:
info.kgeorgiy.java.advanced.concurrent.Tester scalar <полное имя класса>
- Класс должен реализовывать интерфейс
ScalarIP
.
- Класс должен реализовывать интерфейс
-
сложный вариант:
info.kgeorgiy.java.advanced.concurrent.Tester list <полное имя класса>
- Класс должен реализовывать интерфейс
ListIP
.
- Класс должен реализовывать интерфейс
- Напишите класс
ParallelMapperImpl
, реализующий интерфейсParallelMapper
.public interface ParallelMapper extends AutoCloseable { <T, R> List<R> run( Function<? super T, ? extends R> f, List<? extends T> args ) throws InterruptedException; @Override void close() throws InterruptedException; }
- Метод
run
должен параллельно вычислять функциюf
на каждом из указанных аргументов(args)
. - Метод
close
должен останавливать все рабочие потоки. - Конструктор
ParallelMapperImpl(int threads)
создаетthreads
рабочих потоков, которые могут быть использованы для распараллеливания. - К одному
ParallelMapperImpl
могут одновременно обращаться несколько клиентов. - Задания на исполнение должны накапливаться в очереди и обрабатываться в порядке поступления.
- В реализации не должно быть активных ожиданий.
- Метод
- Модифицируйте касс
IterativeParallelism
так, чтобы он мог использоватьParallelMapper
.- Добавьте конструктор
IterativeParallelism(ParallelMapper)
- Методы класса должны делить работу на
threads
фрагментов и исполнять их при помощиParallelMapper
. - Должна быть возможность одновременного запуска и работы нескольких клиентов, использующих один
ParallelMapper
. - При наличии
ParallelMapper
самIterativeParallelism
новые потоки создавать не должен.
- Добавьте конструктор
Тестирование
- простой вариант:
info.kgeorgiy.java.advanced.mapper.Tester scalar <ParallelMapperImpl>,<IterativeParallelism>
- сложный вариант:
info.kgeorgiy.java.advanced.mapper.Tester list <ParallelMapperImpl>,<IterativeParallelism>
Внимание! Между полными именами классов ParallelMapperImpl
и IterativeParallelism
должна быть запятая и не должно быть пробелов.
Напишите потокобезопасный класс WebCrawler
, который будет рекурсивно обходить сайты.
-
Класс
WebCrawler
должен иметь конструкторpublic WebCrawler(Downloader downloader, int downloaders, int extractors, int perHost)
downloader
позволяет скачивать страницы и извлекать из них ссылки;downloaders
— максимальное число одновременно загружаемых страниц;extractors
— максимальное число страниц, из которых извлекаются ссылки;perHost
— максимальное число страниц, одновременно загружаемых c одного хоста. Для опредения хоста следует использовать методgetHost
классаURLUtils
из тестов.
-
Класс
WebCrawler
должен реализовывать интерфейсCrawler
public interface Crawler extends AutoCloseable { List<String> download(String url, int depth) throws IOException; void close(); }
- Метод
download
должен рекурсивно обходить страницы, начиная с указанногоURL
на указанную глубину и возвращать список загруженных страниц и файлов. Например, если глубина равна 1, то должна быть загружена только указанная страница. Если глубина равна 2, то указанная страница и те страницы и файлы, на которые она ссылается и так далее. Этот метод может вызываться параллельно в нескольких потоках. - Загрузка и обработка страниц (извлечение ссылок) должна выполняться максимально параллельно, с учетом ограничений на число одновременно загружаемых страниц (в том числе с одного хоста) и страниц, с которых загружаются ссылки.
- Для распараллеливания разрешается создать до ```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 [downloads [extractors [perHost]]]]
- Для загрузки страниц требуется использовать реализацию CachingDownloader из тестов.
- Командная строка
-
Можно не учитывать ограничения на число одновременных закачек с одного хоста
(perHost >= downloaders)
.
Тестирование
info.kgeorgiy.java.advanced.crawler.Tester easy <полное имя класса>
- Реализуйте клиент и сервер, взаимодействующие по
UDP
. - Класс
HelloUDPClient
должен отправлять запросы на сервер, принимать результаты и выводить их на консоль.- Аргументы командной строки:
- имя или ip-адрес компьютера, на котором запущен сервер;
- номер порта, на который отсылать запросы;
- префикс запросов (строка);
- число параллельных потоков запросов;
- число запросов в каждом потоке.
- Запросы должны одновременно отсылаться в указанном числе потоков. Каждый поток должен ожидать обработки своего запроса и выводить сам запрос и результат его обработки на консоль. Если запрос не был обработан, требуется послать его заного.
- Запросы должны формироваться по схеме
<префикс запросов><номер потока>_<номер запроса в потоке>
.
- Аргументы командной строки:
- Класс
HelloUDPServer
должен принимать задания, отсылаемые классомHelloUDPClient
и отвечать на них.- Аргументы командной строки:
- номер порта, по которому будут приниматься запросы;
- число рабочих потоков, которые будут обрабатывать запросы.
- Ответом на запрос должно быть ```Hello, <текст запроса>``.
- Если сервер не успевает обрабатывать запросы, прием запросов может быть временно приостановлен.
- Аргументы командной строки:
- Бонусный вариант. Реализация должна быть полностью неблокирующей.
- Клиент не должен создавать потоков.
- В реализации не должно быть активных ожиданий, в том числе через
Selector
.
Тестирование
- простой вариант:
- клиент:
info.kgeorgiy.java.advanced.hello.Tester client <полное имя класса>
- сервер:
info.kgeorgiy.java.advanced.hello.Tester server <полное имя класса>
- клиент:
- сложный вариант:
- клиент:
info.kgeorgiy.java.advanced.hello.Tester client-i18n <полное имя класса>
- сервер:
info.kgeorgiy.java.advanced.hello.Tester server-i18n <полное имя класса>
- клиент:
- Создайте приложение
TextStatistics
, анализирующее тексты на различных языках. - Аргументы командной строки:
TextStatistics <локаль текста> <локаль вывода> <файл с текстом> <файл отчета>
- Поддерживаемые локали текста: все локали, имеющиеся в системе.
- Поддерживаемые локали вывода: русская и английская,
- Файлы имеют кодировку
UTF-8
.
- Подсчет статистики должен вестись по следующим категориям:
- предложения
- строки
- слова
- числа
- деньги
- даты
- Для каждой категории должна собираться следующая статистика:
- число вхождений
- число различных значений
- минимальное значение
- максимальное значение
- минимальная длина
- максимальная длина
- среднее значение/длина
- Отчет должен выводиться в формате
HTML
. - Пример отчета:
Анализируемый файл: input.txt Сводная статистика Число предложений: 38 Число строк: 41 … Статистика по словам Число слов: 153 (95 уникальных) Минимальное слово: HTML Максимальное слово: языках Минимальная длина слова: 1 (и) Максимальная длина слова: 14 (Поддерживаемые) Средняя длина слова: 10 Статистика по …
- При выполнении задания следует обратить внимание на:
- Декомпозицию сообщений для локализации
- Согласование предложений