h1. Установка интерактивных задач NEERC

В этом году на NEERC начали cтавить интерактивные задачи с тестированием на Java. Эти задачи удалось поставить на DL; здесь задокументирован процесс установки.

Jan 2014. Автоматически обнаруживаются и устанавливаются задачи данного типа при загрузке DL Master'ом.

h2. Содержание

[Описание системы|#NEERC]
[Слой совместимости для DL|#DL]
[Процесс установки|#setup]
[#TODO]

h2. {anchor:NEERC}Описание системы

В папке с задачей есть следующие файлы:
- {{problem.xml}} (файл конфигурации)
- {{Interact.jar}} (программа-собеседник) + исходники
- {{coact.exe}} (программа-тестер)
- {{Check.jar}} (программа-чекер) + исходники

В {{problem.xml}} (файл конфигурации) есть тег {{<interactor type="%simple">}}. В нём указан файл программы-собеседника ({{Interact.jar}}) и способ запуска ({{Java7}}).

{{Interact.jar}} \- программа-собеседник (читает {{<taskname>.in}}, даёт вывод для решения, получает ввод для него же и выводит информацию о процессе тестирования в {{<taskname>.out}}).

{{coact.exe}} запускается со следующими параметрами:
{code}
coact.exe <timelimit(seconds)> <memlimit(bytes)> <interactor> <solution>
{code}
Например:
{code}
coact.exe 2s 268435456 interact.exe sol.exe
{code}
При этом он умеет обрабатывать кавычки в параметрах:
{code}
coact.exe 2s 268435456 "java -jar Interact.jar" sol.exe
{code}
{{Check.jar}} \- реализация класса чекера для библиотеки {{testlib4j.jar}}. Он запускается следующей командой:
{code}
java -cp "<путь>testlib4j.jar;Check.jar" ru.ifmo.testlib.CheckerFramework Check <infile> <chkfile> <outfile>
{code}
Он читает {{<taskname>.out}}, генерирует комментарий и завершает работу; результат он возвращает кодом выполнения:
* 0: OK
* 1: Wrong Answer
* 2: Presentation Error

h2. {anchor:DL}Слой совместимости для DL

Задача ставится как интерактивная, с чекером, все файлы забираются с собой:
{code:title=task.cfg}
CHECKER = 1
CHECKSUBJECT = FILE
CHECKFILES = {*.*}
TYPE = INTERACTIVE
{code}
Для запуска {{coact.exe}} был написан скрипт {{coact.bat}} с одним параметром (скомпилированный файл решения). В [{{StdSwp}}|http://dl.gsu.by/images/agulenko/stdswp.zip] был добавлен код, передающий управление этому скрипту при его наличии; также добавлен код, обнаруживающий файл {{solution.bat}} и передающий его первую непустую строку как команду запуска решения (файл генерируется при компиляции Java-решений). Поскольку ограничение по времени проверяет {{coact.exe}}, оно же для {{StdSwp}} повышено:
{code:title=task.cfg}
TIME_LIMIT = 5
{code}
На данный момент TIME_LIMIT вычисляется как ограничение задачи + 3 секунды.

Для обработки чекера был написан вспомогательный чекер [{{InteractChecker.jar}}|http://dl.gsu.by/images/agulenko/neerc/InteractChecker.jar] ([исходники|http://dl.gsu.by/images/agulenko/neerc/InteractChecker-src.rar]), запускаемый с помощью скрипта {{checker.bat}} (из-за особенностей Delta пришлось дописать [{{checker.exe}}|http://dl.gsu.by/images/agulenko/neerc/checker.pas], просто вызывающий этот скрипт).

h2. {anchor:setup}Процесс установки

* Убираем все посторонние файлы из корня задачи, в первую очередь авторские решения и скомпилированные из них экзешники.
** Для переноса в подпапку {{old/}} можно запускать команду вроде
{code}
move *.exe *.cpp *.pas *.py *.java old/
{code}
** В корне нужно оставить (или вернуть после переноса) следующие файлы:
{code}
coact.exe
checker.exe
{code}
* Устанавливаем слой совместимости с DL
** Копируем файлы из [{{release.rar}}|http://dl.gsu.by/images/agulenko/neerc/release.rar] в папку с задачей
** Добавляем в начало {{task.cfg}} следующие строки:
{code:title=task.cfg}
CHECKER = 1
CHECKSUBJECT = FILE
CHECKFILES = {*.*}
TYPE = INTERACTIVE
{code}
** Меняем {{TIME_LIMIT}} в {{task.cfg}}; ставим ограничения в {{coact.bat}}
* Тестируем
** Пробуем отсылать авторские решения на {{Pascal}}/{{C+\+}}/{{Java}}
*** При наличии непонятных проблем проверить папку установленной задачи на наличие посторонних файлов (в частности, {{*.exe}})

h2. {anchor:TODO}TODO

* Интерфейс:
** Изменить отображаемое ограничение по времени (значение в {{task.cfg}} больше фактического)
* Тестирование:
** прикрутить тестирование решений на Java (прежде всего авторских):
*** добавил в скрипты компиляции Java генерацию {{solution.bat}}, в {{stdswp}} -- передачу его содержимого как команды запуска решения
**** разнести изменения файлов {{compile_java?.cmd}} и {{stdswp.exe}} по машинам (нету на Nit5)
** установить Java 7 на сервер тестирования (нету на Nit и Nit3)
*** или можно портировать {{Interact}} и {{Check}} под Java 6:
**** копируем файлы из [{{prepare.rar}}|http://dl.gsu.by/images/agulenko/neerc/prepare.rar] в папку с задачей
**** запускаем {{prepare.bat}}
**** при наличии ошибок компиляции правим код в указанных местах и снова запускаем {{prepare.bat}}
**** удаляем содержимое {{prepare.rar}} из папки с задачей