Версия 2.3.2 (r3929) (20070206) =============================== Много-много изменений и усовершенствований. Необходимая информация для миграции с версии 2.2.* на текущую версию находится в файле UPGRADE.RUS. Поддерживаются новые версии программ и библиотек: expat-2.0 jdk-1.6 httpd-2.2 configure --------- CGI-программы по умолчанию устанавливаются в каталог ${prefix}/libexec/ejudge/cgi-bin, а не в ${prefix}/cgi-bin, поэтому, возможно, потребуется обновить символические ссылки в каталоге cgi-bin HTTP-сервера. Поддерживается новая опция `--enable-new-server-socket', которая позволяет задать путь по умолчанию к сокету для работы с программой `new-server'. Поддерживается новая опция `--enable-ajax', которая активирует поддержку AJAX на стороне сервера в программе `new-server'. Клиентская часть реализована с использованием DoJo Framework, которую нужно будет сделать доступной на HTTP-сервере. Поддерживается новая опция `--with-mysql', которая активирует поддержку СУБД MySQL для хранения данных. В текущей версии не реализована. Поддерживается новая опция `--enable-style-prefix', которая позволяет задать префикс URL для доступа к стилевым файлам. По умолчанию опция имеет значение `/ejudge/', то есть URL для доступа к стилевым файлам имеет вид: HOST/ejudge/file, то есть стилевые файлы должны располагаться в каталоге ejudge корня HTML документов веб-сервера. Если стилевые файлы предполагается разместить в домашнем каталоге пользователя, опция может быть установлена в /~USER/. Многие параметры командной строки configure теперь имеют значения по умолчанию: --enable-socket-path /tmp/userlist-socket --enable-super-serve-socket /tmp/super-serve-socket --enable-new-server-socket /tmp/new-server-socket --enable-contests-home-dir /home/judges --enable-conf-dir /home/judges/data --enable-cgi-conf-dir ../cgi-data Поэтому если значение параметра командной строки совпадает со значением по умолчанию, его можно опустить. На архитектуре x86_64-*linux* каталог для библиотечных файлов автоматически устанавливается в ${exec_prefix}/lib64. Поддерживается JDK 1.6. В системе, в которую инсталлируется ejudge, не требуется наличие программы `uudecode'. Упрощённая версия программы `uudecode' включена в ejudge. contest.xml ----------- Добавлены новые элементы: , , , , , . Подробное описание новых элементов находится в Wiki-разделе сайта www.ejudge.ru. У элемента добавлены новые аттрибуты: "new_managed", "assign_logins", "force_registration", "disable_name", "enable_forgot_password", "exam_mode", "disable_locale_change". Подробное описание новых элементов находится в Wiki-разделе сайта www.ejudge.ru. ejudge.xml ---------- Добавлены новые элементы: , , , , , . Подробное описание новых элементов находится в Wiki-разделе сайта www.ejudge.ru. У элемента поддерживаются атрибуты: "name", "type", "load", "default". serve.cfg --------- Добавлены новые глобальные конфигурационные переменные: `disable_user_standings', `problem_navigation', `appeal_deadline', `statement_dir', `description_file', `disable_banner_page'. Глобальная конфигурационная переменная `is_virtual' является алиасом глобальной конфигурационной переменной `virtual'. Подробное описание новых элементов находится в Wiki-разделе сайта www.ejudge.ru. Добавлены новые конфигурационные переменные задачи: `manual_checking', `examinator_num', `check_presentation', `ignore_exit_code', `disable_user_submit', `disable_submit_after_ok', `max_vm_size', `max_stack_size', `max_data_size', `enable_language', `require', `statement_file', `alternatives_file', `type', `alternative', `stand_attr'. Конфигурационная переменная `output_only' является алиасом переменной `type'. Подробное описание новых элементов находится в Wiki-разделе сайта www.ejudge.ru. Поддерживаются следующие типы задач: standard output-only short-answer text-answer select-one select-many Добавлена новая конфигурационная переменная `memory_limit_type' секции описания тестера. Переменная может принимать следующие значения: default dos java Переделана поддержка ограничения задач по памяти. Теперь значение указывается в переменной max_vm_size или max_stack_size в разделе описания задачи, а не в разделе тестировщика. runs.log -------- Изменен формат хранения записи о посылки. Теперь одна запись занимает 128 байт и хранит больше информации. test.inf -------- Поддерживаются новые конфигурационные переменные: exit_code check_stderr userlist.xml ------------ Поддерживаются следующие новые элементы в файле базы пользователей: , , , . Поддерживаются новые атрибуты: "ssl", "role", "cnts_last_login", "info_create", "recovery". javac ----- Поддерживается приём на тестирование java-программ без ограничения имени класса. new-server ---------- Реализована новая программа new-server, которая должна заменить сервер турниров `serve'. new-server поддерживает обслуживание нескольких турниров одновременно, реализует новый интерфейс пользователя и т. д. Программа `serve' теперь считается устаревшей и не рекомендуется к использованию в новых турнирах. В форматных преобразованиях поддерживается %Mr, %Ur, означающее поле "Region". Поддерживаются виртуальные турниры по системе OLYMPIAD. Полное тестирование решений участника производится непосредственно после истечения его времени решения, либо когда он явно завершит виртуальный турнир. Администратору турнира доступны новые команды (по сравнению с командами, доступными администратору в старой программе `serve'): "Clear displayed runs" "Ignore displayed runs" "Disqualify displayed runs" "Add new runs in CSV format" "Download runs" Для непривилегированных пользователей поддерживается механизм восстановления паролей. При отображении страниц непривилегированных пользователей используется JavaScript (AJAX). Впрочем, реализация AJAX неполна и находится в активной разработке. Поддерживается отображение условий задач на странице сдачи решений. Поддерживаются задачи с выбором правильного ответа из предъявленных (как в тестах). new-client ---------- Новый CGI-клиент для работы с программой `new-server'. Программа `new-client' (и символические ссылки на неё: new-master, new-judge и т. д.) заменяет старых CGI-клиентов `team', `master', `judge'. Пользовательский CGI-интерфейс для непривилегированных пользователей радикально переделан. Пользовательский интерфейс для привелегированных пользователей в целом не изменился. Отдельные элементы переработаны и добавлено много новых команд. libchecker ---------- Строки, передаваемые в функции библиотеки, теперь имеют тип `char' а не `unsigned char' для лучшей совместимости с C++. Добавлены типы данных для разбора и хранения S-выражений. Новая функция `checker_read_buf_2': char *checker_read_buf_2( int ind, // номер потока для чтения const char *name, // имя считываемого параметра int eof_error_flag, // 1, если EOF является ошибкой char *sbuf, // адрес фиксированного буфера size_t ssz, // размер фиксированного буфера char **pdbuf, // адрес переменной для расш. буфера size_t *pdsz); // адрес размера для расш. буфера Функция считывает слово из указанного потока ввода. Перед чтением пропускаются пробельные символы, слово представляет собой последовательность непробельных символов, после которого идёт конец файла или пробельный символ. Этот пробельный символ остаётся во входном потоке. Слово может считываться либо в буфер фиксированного размера, либо в расширяемый буфер, либо в оба буфера. Чтобы задать чтение в буфер фиксированного размера необходимо указать ненулевые значения параметров `sbuf', `ssz'. Чтобы задать чтение в расширяемый буфер необходимо указать ненулевые значения параметров `pdbuf', `pdsz'. Если заданы параметры только для буфера фиксированного размера, слово считывается в него. Если считываемое слово не помещается в буфер, работа проверяющей программы завершается с ошибкой "Presentation error" или "Check failed" в зависимости от номера потока. Если заданы параметры только для расширяемого буфера, слово считывается в него. Если заданы параметры и буфера фиксированного размера, и расширяемого буфера, то чтение сначала ведётся в буфер фиксированного размера. Если считываемое слово превышает размер буфера, то далее используется расширямый буфер. В любом случае функция возвращает указатель на начало буфера, в который считано слово, или NULL, если был достигнут конец файла и параметр `eof_error_flag' равен 0. Новая функция `checker_read_file_f': void checker_read_file_f( FILE *f, // поток для чтения из файла char **pbuf, // буфер для чтения size_t *psize); // размер файла после чтения Функция считывает содержимое файла в память. Корректно поддерживаются бинарные файлы. После содержимого файла в памяти добавляется нулевой байт, таким образом, если файл текстовый, то со считанным в память содержимым файла можно работать как с текстовой строкой языка C. Все функции вида `checker_read_team_*' переименованы в `checker_read_out_*'. Старые имена сохранены для обратной совместимости. Функция `checker_team_eof' переименована в `checker_out_eof', функция `checker_team_close' переименована в `checker_out_close'. Новая функция: `checker_out_eoln': void checker_out_eoln(int lineno); функция пропускает все пробельные символы, кроме `\n'. Если далее следует символ `\n' функция завершается. В противном случае выдаётся "Presentation error". Улучшена работа функций чтения целых чисел из потоков. Теперь корректно обрабатывается переполнение при чтении. Новые функции checker_eq_{float,double,long_double}_abs: int checker_eq_TYPE_abs(TYPE v1, TYPE v2, TYPE eps); Функции сравниваеют два числа заданного типа с плавающей точкой с указанной абсолютной точностью. Если два числа равны с указанной точностью, то функция возвращает значение 1. В противном случае функция возвращает значение 0. Новая функция `checker_read_sexpr': checker_sexpr_t checker_read_sexpr(int ind); Функция считывает S-выражение с указанного потока. Новая функция `checker_eq_sexpr': int checker_eq_sexpr(checker_sexpr_t l_corr, checker_sexpr_t l_out); Функция сравнивает два S-выражения. Возвращается 1, если два S-выражения равны, и 0 - в противном случае. Новые функции `checker_{koi8r,cp866,cp1251,iso,mac}_to_ucs2': int checker_CHARSET_to_ucs2(int c); Функция конвертирует символ в указанной русской кодировке в символ в кодировке ucs2. Новые функции `checker_{koi8r,cp866,cp1251,iso,mac,utf8}_to_ucs2': unsigned short *checker_CHARSET_to_ucs2_buf( const char *str, unsigned short* buf, size_t size); Функции ковертируют строку `str' в указанной кодировке в строку в кодировке UCS2. Длина конвертируемой строки задаётся параметром `size', таким образом, в строке могут находится нулевые байты. Для строк в кодировке UTF8 символы с кодом больще 0xffff не поддерживаются. Адрес буфера результата задаётся параметром `buf'. Буфер результата должен иметь достаточный размер, то есть sizeof(short) * size байт. Функция возвращает указатель на начало буфера результата, то есть значение параметра `buf'. Новая функция `checker_ucs2_tolower': int checker_ucs2_tolower(int c); Функция переводит символ в кодировке ucs2 в нижний регистр. Поддерживаются пока только английские и русские буквы. Новая функция `checker_ucs2_tolower_buf': unsigned short *checker_ucs2_tolower_buf( unsigned short *buf, size_t size); Функция переводит строку в кодировке ucs2 в нижний регистр. Поддерживаются пока только английские и русские буквы. Параметр `buf' задаёт адрес начала строки, а параметр `size' - её размер. Новая функция `checker_strcmp_ucs2': int checker_strcmp_ucs2( const unsigned short *s1, const unsigned short *s2); Функция сравнивает две строки в кодировке ucs2. Две строки должны завершаться значением 0 типа `unsigned short' (по аналогии со строками C). Новая функция `checker_eq_str_rus_ucs2': int checker_eq_str_rus_ucs2( const char *s1, const unsigned short *s2); Функция сравнивает строку `s1' в одной из русских кодировок со строкой `s2' в кодировке ucs2. Основное применение этой функции - сравнение строки в русской кодировке, выведенной тестируемой программой `s1', с заданной литеральной строкой `s2'. Для этого литеральная строка должна быть предварительно конвертирована в кодировку ucs2. Новая функция `checker_eq_str_rus_ucs2_nocase': int checker_eq_str_rus_ucs2_nocase( const char *s1, const unsigned short *s2); Функция работает аналогично функции `checker_eq_str_rus_ucs2', но сравнивает без учёта регистра букв. Стандартные проверяющие программы cmp_{float,double,long_double}, cmp_{float,double,long_double}_seq обрабатывают переменную окружения `ABSOLUTE'. Если переменная `ABSOLUTE' установлена (в произвольное значение), то сравнение выполняется в режиме абсолютной погрешности, а не относительной, как по умолчанию. Проверяющая программа `cmp_huge_int' сравнивает числа произвольного размера (без ограничения 1 мб). Новая стандартная проверяющая программа `cmp_sexpr' сравнивает два S-выражения на равенство. Новая стандартная проверяющая программа `cmp_yesno' сравнивает ответы вида `Yes' и `No'. При этом в случае несовпадения регистров букв результата работы программы и эталонного ответа выдаётся "Presentation error". compile ------- Программа `compile' корректно работает в режиме демона. При получении сигнала `SIGHUP' программа корректно перезапускает себя, таким образом перечитывая конфигурационный файл. Кроме того поддерживаются следующие новые параметры командной строки: -i режим инициализации. В этом режиме создаются все необходимые каталоги, затем `compile' завершает работу. Режим инициализации используется при установке и настроке системы ejudge. -D режим демона. -u UID задать uid пользователя для работы. Может использоваться, только если `compile' запущена пользователем root. Используется при установке и настройке системы ejudge. -g GID задать gid группы пользователей для работы. Может использоваться, только если `compile' запущен пользователем root. Используется при установке и настройке системы ejudge. -C DIR в начале работы перейти в указанный каталог DIR. compile-control --------------- Новая программа для управления программой `compile' из командной строки. Особенно полезна, когда программа `compile' работает в режиме демона. Использование: compile-control [stop|restart] edit-userlist ------------- При просмотре зарегистрированных пользователей доступна команда `o', которая копирует информацию о пользователе из одного турнира в другой. ejudge-control -------------- Новая программа для управления системой ejudge в целом из командной строки. Поддерживаются следующие опции командной строки: -u UID задать uid пользователя для работы. Может использоваться, только если `ejudge-control' запущен пользователем root. -g GID задать gid группы пользователей для работы. Может использоваться, только если `ejudge-control' запущен пользователем root. Поддерживаются следующие основные команды: start запустить все необходимые программы (userlist-server, super-serve, compile, new-server, job-server) в режиме демона. stop завершить все программы, работающие в режиме демона. job-server ---------- Корректно поддерживается `sendmail' для отправки писем. Обрабатывается сигнал SIGHUP и вызывает перезапуск программы. Поддерживаются новые команды "stop" и "restart". Поддерживаются следующие опции командной строки: -u UID задать uid пользователя для работы. Может использоваться, только если `job-server' запущена пользователем root. Используется при установке и настройке системы ejudge. -g GID задать gid группы пользователей для работы. Может использоваться, только если `job-server' запущен пользователем root. Используется при установке и настройке системы ejudge. -C DIR в начале работы перейти в указанный каталог DIR. super-serve ----------- При редактировании вариантов поддерживаются новые команды: "Clear variants" "Random variants" Поддерживаются следующие опции командной строки: -D работать в режиме демона -u UID задать uid пользователя для работы. Может использоваться, только если `super-serve' запущена пользователем root. Используется при установке и настройке системы ejudge. -g GID задать gid группы пользователей для работы. Может использоваться, только если `super-serve' запущен пользователем root. Используется при установке и настройке системы ejudge. -C DIR в начале работы перейти в указанный каталог DIR. job-server-control ------------------ Новая программа для управления демоном `job-server' из командной строки. Использование: job-server-control [stop|restart] new-server-control ------------------ Новая программа для управления сервером турниров `new-server' из командной строки. Использование: new-server-control [stop|restart] new-server-cmd -------------- Новая программа для работы с сервером турниров `new-server' из командной строки. Эта программа аналогична программе `serve-cmd', которая работает со старым сервером турниров `serve'. В настоящий момент реализованы следующие команды: login team-login user-login observer-login examiner-login chief-examiner-login coordinator-login judge-login admin-login master-login logout write-xml-runs export-xml-runs dump-runs dump-problems soft-update-stand suspend-testing resume-testing judge-suspended-runs has-transient-runs team-run-status run-status dump-source team-dump-source dump-clar team-dump-clar get-contest-name get-contest-type submit-run team-submit-run import-xml-runs dump-runs dump-master-runs dump-report full-import-xml-runs По сравнению с программой `serve-cmd' не реализованы следующие команды: dump-team-report dump-standings dump-all-users super-serve-control ------------------ Новая программа для управления демоном `super-serve' из командной строки. Использование: super-serve-control [stop|restart] userlist-server --------------- Реализована поддержка загружаемых модулей для хранения базы пользователей. В текущий момент поддерживается единственный (встроенный) модуль: хранение базы в XML-файле. В разработке находится загружаемый модуль хранения базы в MySQL. Корректно поддерживается `sendmail' для отправки писем. Поддерживаются следующие новые опции командной строки: -u UID задать uid пользователя для работы. Может использоваться, только если `userlist-server' запущена пользователем root. Используется при установке и настройке системы ejudge. -g GID задать gid группы пользователей для работы. Может использоваться, только если `userlist-server' запущен пользователем root. Используется при установке и настройке системы ejudge. -C DIR в начале работы перейти в указанный каталог DIR. userlist-server-control ------------------ Новая программа для управления демоном `userlist-server' из командной строки. Использование: userlist-server-control [stop|restart]