Версия 2.1.35 (20050118) ======================== В данной версии исправлены некоторые некритические ошибки и добавлены некоторые новые возможности. userlist-server --------------- При чтении XML-файла базы пользователей не выдаётся ошибка разбора XML файла, если какой-либо пользователь имеет пустой пароль (то есть пароль, установленный в пустую строку). Попытка установить пустой пароль (пароль, равный пустой строке) с помощью программы `edit-userlist' теперь приводит к ошибке "Invalid password". Пустые пароли всё равно считаются недопустимыми при проверке пароля при входе в систему. serve ----- Добавлены новые конфигурационные переменные секции описания языка программирования: `disable_testing', `disable_auto_testing'. Они ведут себя точно так же, как одноимённые переменные секции описания задачи, то есть переменная `disable_testing' запрещает всякое тестирование посылки на заданном языке, а переменная `disable_auto_testing' предотвращает автоматическое тестирование посылки на заданном языке сразу после её получения. Такая посылка получает статус "Accepted for testing" и может быть протестирована с помощью явной команды перетестирования посылки администратором турнира. serve ----- Добавлена новая конфигурационная переменная секции описания задачи `disqualified_penalty'. Эта переменная позволяет задать штраф за дисквалифицированную посылку. В данной версии системы ejudge дисквалифицированные посылки учитываются отдельно от обычных посылок и штрафуются отдельно. По умолчанию значение переменной `disqualified_penalty' равно значению переменной `run_penalty'. Таким образом, в текущей версии системы балл за посылку в системе KIROV или OLYMPIAD вычисляется по следующей формуле: S = I * M - A * P + D + J - B * Q Переменные `S', `I', `M', `A', `P', `J' описаны ниже. Переменная `B' - это количество дисквалифицированных посылок, `Q' - штраф за одну дисквалифицированную посылку, задаваемый конфигурационной переменной `disqualified_penalty'. В режиме турнира KIROV или OLYMPIAD в поле "баллы" таблицы посылок пользователя соответственно изменилось отображение формулы, по которой вычислялись баллы за данную посылку. Полный вид отображения формулы выглядит следующим образом: S = I [ * M ] [ - A * P ] [ +/- D ] [ +/- J ] [ - B * Q ] если M == 1, то соответствующая часть формулы не отображается, аналогично для A * P == 0, D == 0, J == 0, B * Q == 0. В журнал посылок в CVS-форме, выводимый с помощью команды serve-cmd dump-master-runs добавлены два поля [27] disq_attempts [28] disq_penalty serve ----- При просмотре листинга программы с помощью команды "View source" CGI программ `judge' или `master' строки программы нумеруются. serve,master,judge ------------------ Кнопка "Reset filter" выражения фильтра теперь очищает только выражение фильтра и номер первой и последней просматриваемой посылки и не очищает параметры просмотра списка сообщений. В диалог задания параметров просмотра списка сообщений добавлен новый параметр, выбираемый с помощью выпадающего меню. Параметр позволяет просматривать либо все сообщения, либо только неотвеченные сообщения. Для программы `judge' по умолчанию устанавливается режим просмотра неотвеченных сообщений, а для программы `master' - режим просмотра всех сообщений. Добавлена кнопка "Reset filter" для сброса параметров просмотра списка сообщений. Данная кнопка расположена рядом с кнопкой "View" просмотра списка сообщений. contest.xml ----------- Добавлен новый элемент . Данный элемент позволяет задать шаблон письма, посылаемого после регистрации нового пользователя. Значение элемента может быть либо полным путём к файлу, либо относительным путём. В последнем случае путь вычисляется относительно каталога конфигурационных файлов турнира, задаваемого либо с помощью элемента , либо с помощью элемента . В значении элемента допускаются форматные преобразования, например, %Vl - номер текущего языкового окружения (0 - английский язык, 1 - русский язык), например: email_tmpl_%Vl.txt Тогда если выбран русский язык, тогда в качестве шаблона регистрационного письма будет использоваться файл email_tmpl_1.txt в каталоге conf (/conf) каталога турнира, а если выбран английский язык, будет использоваться файл email_tmpl_0.txt. Если файл шаблона письма не существует для текущего языкового окружения, загружается файл для шаблона для языкового окружения 0, если и этот шаблон письма не существует, используется шаблон письма в текущем языковом окружении. Если значение элемента не установлено, всегда используется шаблон письма по умолчанию. В тексте шаблона письма также допускаются форматные преобразования, подставляющие параметры нового пользователя в текст письма. Допустимые форматные преобразования перечислены ниже: %Vu - URL для продолжения регистрации в системе %Vl - идентификатор языкового окружения %Ul - регистрационное имя пользователя %Ui - регистрационный номер пользователя %Un - имя пользователя %Ue - регистрационный email пользователя %Uz - автоматически сгенерированный новый пароль пользователя Пример текста письма по умолчанию на английском языке: -------- Hello, Somebody (probably you) have specified this e-mail address (%Ue) when registering an account on the Moscow Programming Contests Server. To confirm registration, you should enter the provided login and password on the login page of the server at the following url: %Vu. Note, that if you do not do this in 24 hours from the moment of sending this letter, registration will be void. login: %Ul password: %Uz Regards The ejudge contest administration system -------- serve-cmd,serve --------------- Реализована новая команда проверки, есть ли в данный момент в турнире посылки в состоянии компиляции или тестирования. Данная команда доступна только с помощью программы `serve-cmd': serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE Если такие посылки есть, то код возврата программы равен 2, если таких посылок нет, код возврата равен 0. Кроме того, вырабатывается код возврата 1, если возникла какая-либо другая ошибка выполнения команды. serve-cmd --------- Реализовано несколько новых команд управления турниром из командной строки: serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE Данная команда приостанавливает тестирование всех поступающих посылок. Посылки получают статус "Accepted for testing" (RUN_ACCEPTED) и не направляются на компиляцию и тестирование. serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE Данная команда отменяет действие предыдущей команды, то есть все поступающие посылки будут обрабатываться как обычно. serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE Данная команда отправляет на компиляцию и тестирование все посылки, которые имеют статус "Accepted for testing" (RUN_ACCEPTED). Эти команды могут использоваться для корректного импорта внешнего журнала посылок в систему. Как было сказано ниже, команда `import-xml-runs' не работает, если в текущий момент в системе есть посылки в состоянии компиляции или тестирования. Поэтому алгоритм импорта внешнего журнала посылок в работающий турнир может выглядеть следующим образом: serve-cmd CONTEST-ID suspend-testing SESSION-ID-FILE serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE while [ "$?" = 2 ] do sleep 1 serve-cmd CONTEST-ID has-transient-runs SESSION-ID-FILE done serve-cmd CONTEST-ID import-xml-runs SESSION-ID-FILE RUNLOG-FILE serve-cmd CONTEST-ID resume-testing SESSION-ID-FILE serve-cmd CONTEST-ID judge-suspended-runs SESSION-ID-FILE В данном фрагменте отсутствует проверка возможных ошибочных ситуаций. serve-cmd CONTEST-ID full-import-xml-runs SESSION-ID-FILE XML-FILE1 ... Данная команда реализует полный алгоритм импорта внешнего журнала посылок в систему, описанный выше. В качестве аргументов команды допускается задание сразу нескольких файлов с журналами посылок, все эти файлы будут проимпортированы. Команда возвращает 0 при успешном завершении, когда все файлы были успешно проимпортированы, 1 - когда ни один файл не был проимпортирован из-за возникшей ошибки, 2 - если ни один файл не был проимпортирован, так как программа была прервана пользователем, 3 - если часть файлов была проимпортирована, а часть нет из-за ошибки в этих файлах. Данная команда корректно восстанавливает состояние турнира в случае, если её выполнение было прервано пользователем, при этом учитывается состояние турнира (то есть, было ли приостановлено тестирование поступающих посылок) на момент начала выполнения команды. serve ----- Добавлены новые возможности в выражение фильтра посылок. Поддерживаются следующие новые предикаты проверки состояния посылки: userinvisible [ ( RUN-ID ) ] Вырабатывает булевский результат TRUE, если посылка RUN-ID выполнена пользователем, который в данном турнире имеет статус "невидимый" (invisible). В противном случае вырабатывается булевский результат FALSE. Если выражение RUN-ID опущено, берётся текущая посылка. userbanned [ ( RUN-ID ) ] Вырабатывает булевский результат TRUE, если посылка RUN-ID выполнена пользователем, который в данном турнире имеет статус "дисквалифицированный" (banned). В противном случае вырабатывается булевский результат FALSE. Если выражение RUN-ID опущено, берётся текущая посылка. userlocked [ ( RUN-ID ) ] Вырабатывает булевский результат TRUE, если посылка RUN-ID выполнена пользователем, который в данном турнире имеет статус "заблокированный" (locked). В противном случае вырабатывается булевский результат FALSE. Если выражение RUN-ID опущено, берётся текущая посылка. curuserinvisible Вырабатывает булевский результат TRUE, если текущая посылка выполнена пользователем, который в данном турнире имеет статус "невидимый" (invisible). В противном случае вырабатывается булевский результат FALSE. curuserbanned Вырабатывает булевский результат TRUE, если текущая посылка выполнена пользователем, который в данном турнире имеет статус "дисквалифицированный" (banned). В противном случае вырабатывается булевский результат FALSE. curuserlocked Вырабатывает булевский результат TRUE, если текущая посылка выполнена пользователем, который в данном турнире имеет статус "заблокированный" (locked). В противном случае вырабатывается булевский результат FALSE. Новые предикаты проверки состояния посылки могут далее связываться логическими связками друг с другом и с другими допустимыми выражениями фильтра, например: !userinvisible && !invisible Этому выражению фильтра удовлетворяют все посылки, которые не являются собственно "невидимыми", и не посланы "невидимыми" пользователями. serve ----- e-mail адреса участников турнира теперь отображаются на странице "View users" CGI-программ `judge' и `master'. serve,run --------- Добавлена новая глобальная конфигурационная переменная `html_report'. Если эта переменная установлена в ненулевое значение, судейский протокол тестирования будет генерироваться программой `run' в формате HTML, а не как простой текст. В HTML-протоколе тестирования добавлены ссылки от таблицы сводной информации, находящейся вверху страницы к результатам тестирования для каждого. В одном турнире могут быть смешаны протоколы тестирования разных типов. Чтобы изменить тип протокола тестирования по ходу турнира необходимо изменить значение переменной `html_report' и перезапустить программу `serve'. Программа `run' в этом случае может не перезапускаться.