Solve Judge System

Правка ru25, от wilcot, 2023-04-27 00:39:35

Привет всем. Хочу рассказать про свою разработку — тестирующую систему Solve с открытым исходным кодом. Да, можно сказать Yet Another Online Judge :) Но не стоит сразу расходиться, у нее есть некоторые крутые моменты и может быть вам захочется поднять собственную инсталляцию для проведения какого-нибудь соревнования.

Вообще, система разрабатывается уже давно, но вот почему я решил написать только сейчас. Да потому что стабильный релиз вышел совсем недавно и полноценного тестирования до этого момента не проводилось.

Для кого этот пост

  1. Для тех, кто хочет проводить соревнования по СП.
  2. Для тех, кто готовит задачи преимущественно в великолепной системе Polygon.
  3. Для тех, кто хочет запустить свою систему без разработки с нуля (например огранизации).
  4. Для тех, кто просто интересуется.

Зачем вообще писать еще одну систему

Это самый лучший вопрос, который стоит задать. Я не буду здесь сравнивать с другими, уже существующими аналогами, скажу лишь что для меня лично в приоритете было:

  1. Приятный, современный, а самое главное понятный интерфейс. Как для участника, так и для администратора. Если это не так, сделано все возможное, чтобы его можно было с легкостью заменить.
  2. Отзывчивый интерфейс. Странички должны отстреливаться как пуля.
  3. Актуальные технологии и подходы. Вообще, система больше заточена для запуска в облаках, но для небольших соревнований (порядка 2-3 сотен участников) вы вполне можете обойтись одной физической машинкой, возможно стоящей у вас дома, в университете либо где-то еще.

Если вы возьмете существующую тестирующую систему, то скорее всего она не будет соответствовать какому-то из этих пунктов (а может сразу нескольким). Не сказать, что это преимущества, скорее просто другие подходы.

Ключевая функциональность

  1. Поддержка пакетов Polygon. Чтобы добавить задачу, вам нужно просто скачать пакет задачи из Polygon и загрузить его в систему. В дальнейшем будет добавлена поддержка автоматического скачивания пакета по URL задачи полигона.
  2. Поддержка форматов соревнований ICPC и IOI. Тут все стандартно — работает так же как и везде, есть заморозка.
  3. Поддержка контейнеризованных компиляторов. Очень полезная функциональность. По умолчанию система поставляется без единого компилятора. Компиляторы добавляются путем загрузки .tar.gz корневой файловой системы через API системы. Для удобства есть отдельная утилита с уже готовыми образами компиляторов.
  4. AWS S3. Если вам надо надежно хранить все ресурсы (пакеты задач, архивы компиляторов, исходники решений), или же вы хотите запустить сразу несколько инстансов системы, данная опция будет для вас полезна. Если же вам все это не надо, то можете использовать локальный диск для хранения всех данных, это подходит для проведения небольших контестов и сборов.
  5. Поддержка Scope Users — аналог внутренних пользователей Я.Контеста.
  6. Поддержка интерактивных задач — как же без них. К сожалению, полигон кажется не умеет строить нормальный протокол взаимодействия, возможно я не нашел какую-то настройку. Поделитесь в комментариях, есть ли какой-то способ, кроме добавление тестов вручную на LaTeX?

Как все это выглядит

Условие задачи
Положение участников
Результат тестирования

Структура системы

Сама система разделена на 3 части:

  1. Репозиторий бекенда Solve: https://github.com/udovin/solve
  2. Репозиторий фронтенда Solve: https://github.com/udovin/solve-web
  3. Репозиторий с утилитой для Solve: https://github.com/udovin/solve-tools

Такое разделение открывает большой простор. Во-первых, вы можете изменить или реализовать с нуля фронтенд и получить уникальный интерфейс для своих нужд (или нужд огранизации). Во-вторых вы можете выбрать, какие компиляторы вам нужны, а какие можно не загружать (например в целях экономии места на диске).

Как попробовать

Поднять бекенд можно по инструкции в репозитории: https://github.com/udovin/solve/blob/master/README.md

Поднять фронтенд можно командой npm install && npm start в репозитории (необходимо наличие node): https://github.com/udovin/solve-web

Загрузить набор компиляторов можно выполнив команду: go build . && ./solve-tools compilers create в репозитории: https://github.com/udovin/solve-tools

Можете также воспользоваться Docker образами: udovin/solve и udovin/solve-web. При этом udovin/solve необходимо запускать с опцией --priviledged (иначе Docker смонтирует /sys/fs/cgroup в read-only, и запуск решений не будет работать). При запуске через докер c --priviledged настоятельно рекомендуется не использовать --user root (по умолчанию должно запуститься от пользователя solve, но можете это указать явно для повышения безопасности). В теории также возможно запустить через rootless-docker.

Какие требования

Операционная система: Linux 5.11+.

Настроенные cgroup2. Как настроить можно почитать тут: https://rootlesscontaine.rs/getting-started/common/cgroup2/

На этом пока все. Пост будет дополняться при необходимости. Интересны также пожелания, претензии и рассуждения в комментариях.

PS. По вопросам вы всегда можете написать в л.с.

Теги online judge, solve, judge

История

 
 
 
 
Правки
 
 
  Rev. Язык Кто Когда Δ Комментарий
ru26 Русский wilcot 2023-04-30 23:53:28 185
ru25 Русский wilcot 2023-04-27 00:39:35 14
ru24 Русский wilcot 2023-04-27 00:38:15 278 Мелкая правка: 'ов вручную?\n\n### К' -> 'ов вручную на LaTeX?\n\n### К'
ru23 Русский wilcot 2023-04-20 13:44:36 57
ru22 Русский wilcot 2023-04-20 13:43:07 129
ru21 Русский wilcot 2023-04-20 13:40:22 116
ru20 Русский wilcot 2023-03-16 23:58:29 32 Мелкая правка: 'у вас дома.\n\nЕсли ' -> 'у вас дома, в университете либо где-то еще.\n\nЕсли '
ru19 Русский wilcot 2023-03-16 22:44:20 987
ru18 Русский wilcot 2023-03-16 18:17:46 1 Мелкая правка: '1. Для тех кто хочет' -> '1. Для тех, кто хочет'
ru17 Русский wilcot 2023-03-16 16:07:55 290
ru16 Русский wilcot 2023-03-16 15:46:20 67
ru15 Русский wilcot 2023-03-16 15:41:43 67 (опубликовано)
ru14 Русский wilcot 2023-03-16 15:37:13 201
ru13 Русский wilcot 2023-03-16 15:34:51 18 Мелкая правка: 'n[cut]\n\n\n### Ключ' -> 'n[cut]\n\n \n### Ключ'
ru12 Русский wilcot 2023-03-16 15:34:23 3 Мелкая правка: 'n[cut]\n\n\n### Ключ' -> 'n[cut]\n\n \n### Ключ'
ru11 Русский wilcot 2023-03-16 15:34:16 6 Мелкая правка: 'n[cut]\n\n\n### Ключ' -> 'n[cut]\n\n \n### Ключ'
ru10 Русский wilcot 2023-03-16 15:34:06 2 Мелкая правка: 'n[cut]\n\n\n### Ключ' -> 'n[cut]\n\n \n### Ключ'
ru9 Русский wilcot 2023-03-16 15:33:53 2 Мелкая правка: 'n[cut]\n\n### Кл' -> 'n[cut]\n\n\n### Кл'
ru8 Русский wilcot 2023-03-16 15:33:40 252
ru7 Русский wilcot 2023-03-16 15:31:40 2
ru6 Русский wilcot 2023-03-16 15:31:25 157
ru5 Русский wilcot 2023-03-16 15:30:21 1074
ru4 Русский wilcot 2023-03-16 15:16:31 168
ru3 Русский wilcot 2023-03-16 15:13:40 105
ru2 Русский wilcot 2023-03-16 15:02:28 395
ru1 Русский wilcot 2023-03-16 14:53:42 1489 Первая редакция (сохранено в черновиках)