Domjudge 8.1.3

一键脚本

先直接上个一键 bash 脚本:

mkdir /home/dom/
cd /home/dom/
sudo apt-get update
sudo apt-get upgrade
sudo apt install -y gcc g++ make zip unzip mariadb-server \
apache2 php php-cli libapache2-mod-php php-zip \
php-gd php-curl php-mysql php-json php-xml php-intl php-mbstring \
acl bsdmainutils ntp phpmyadmin python-pygments \
libcgroup-dev linuxdoc-tools linuxdoc-tools-text \
groff texlive-latex-recommended texlive-latex-extra \
texlive-fonts-recommended texlive-lang-european composer
sudo apt install -y enscript
sudo apt install -y libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev
sudo phpenmod json

wget https://www.domjudge.org/releases/domjudge-8.1.3.tar.gz
tar -zxvf domjudge-8.1.3.tar.gz
cd /home/dom/domjudge-8.1.3/
sudo ./configure --prefix=/home/dom/domjudge --with-domjudge-user=root --with-baseurl=127.0.0.1
make domserver && sudo make install-domserver

sudo /home/dom/domjudge/domserver/bin/dj_setup_database -u root install

cd /home/dom/domjudge/domserver
sudo ln -s /home/dom/domjudge/domserver/etc/apache.conf /etc/apache2/conf-available/domjudge.conf
sudo a2enmod rewrite
sudo a2enconf domjudge
sudo systemctl reload apache2
sudo chown www-data:www-data -R webapp/var/*

cat /home/dom/domjudge/domserver/etc/initial_admin_password.secret
cat /home/dom/domjudge/domserver/etc/restapi.secret

最后两行显示的分别是 admin 的账号密码,和 judgehost 连接上去的密码。具体可以看后面的内容。

装好了之后,还需要手动配置一下数据库和 apache2。具体内容直接从【配置 MySQL】看即可。

环境依赖

总之官网上面说的都很谜语人,仿佛默认你都把所有依赖都装好了一样(
首先,默认已经把该换的源都换好了,就执行

sudo apt-get update
sudo apt-get upgrade

然后就开始愉快地装各种依赖了,执行

sudo apt install gcc g++ make zip unzip mariadb-server \
        apache2 php php-cli libapache2-mod-php php-zip \
        php-gd php-curl php-mysql php-json php-xml php-intl php-mbstring \
        acl bsdmainutils ntp phpmyadmin python-pygments \
        libcgroup-dev linuxdoc-tools linuxdoc-tools-text \
        groff texlive-latex-recommended texlive-latex-extra \
        texlive-fonts-recommended texlive-lang-european composer
sudo apt install enscript

执行过程中安装时选择 apache2,在建立 MySQL 时也顺便就把账号密码都搞了。接下来执行

sudo apt install libcurl4-gnutls-dev libjsoncpp-dev libmagic-dev
sudo phpenmod json

于是,你要的依赖都建好啦!

如果遇到安装过程中输入 Y 还是直接 Abort 的情况,在 install 后面加一个 -y 参数即可。

编译 DOMjudge 8.1.3

编译这一步说实话,还是搞了有一点久的......

首先需要创建一个非 root 用户,并且拥有 sudo 权限,执行

useradd -m <username>
passwd <username>

然后输入新用户的密码,之后

vi /etc/sudoers

里面 root 这一行下面加上一行,格式同 root 一行,只是 root 改成用户名。
下面都用 <username> 表示上面新建的用户名。

在 /home/<username>/ 下面下载 DOMjudge

wget https://www.domjudge.org/releases/domjudge-8.1.3.tar.gz

然后解压:

tar -zxvf domjudge-8.1.3.tar.gz

然后

cd /home/<username>/domjudge-8.1.3/

之后就开始编译,执行如下命令:

sudo ./configure --prefix=/home/<username>/domjudge --with-domjudge-user=root --with-baseurl=127.0.0.1
make domserver && sudo make install-domserver

如果要生成更多文档,执行如下命令:

make docs && sudo make install-docs

但至少我这步失败了 233 好像是因为 python 的问题?所以这一步(指生成文档)失败了也不用管。

至此也就编译成功啦

配置数据库

sudo /home/<username>/domjudge/domserver/bin/dj_setup_database -u root install

配置 Web 服务器

cd /home/<username>/domjudge/domserver
sudo ln -s /home/<username>/domjudge/domserver/etc/apache.conf /etc/apache2/conf-available/domjudge.conf
sudo a2enmod rewrite
sudo a2enconf domjudge
sudo systemctl reload apache2
sudo chown www-data:www-data -R webapp/var/*

现在,内网的话就可以访问 http://127.0.0.1/domjudge 然后就看到如下类似界面

反正差不多就行......
此时可以用用户名 admin 和

/home/<username>/domjudge/domserver/etc/initial_admin_password.secret

内的密码来登录管理后台了。

如果是第三方服务器,比如阿里云啥的,要用公网 ip 访问的话检查一下有没有开放 80 端口。

配置 MySQL

执行:

vi /etc/mysql/conf.d/mysql.cnf

然后里面追加下面内容

[mysqld]
max_connections = 1000
max_allowed_packet = 16MB
innodb_log_file_size = 48MB

其中 max_allowed_packet 数值改成两倍于题目测试数据文件的大小,innodb_log_file_size 数值改成十倍于题目测试数据文件的大小。
若使用的是 mariadb,则 /etc/mysql/mariadb.conf.d/50-server.cnf 中 max_allowed_packet 一项也需要修改。

之后执行

sudo systemctl restart mysql

配置 Apache2

vi /etc/apache2/apache2.conf

搜索 KeepAlive 关键字,将其值设为 Off,并在其后新增一行内容:

MaxClients 1000

然后退出,执行

sudo systemctl restart apache2

之后去
```/etc/php/php版本号/apache2/php.ini``` 里,需要修改的东西都在 DOMjudge 后台管理里面有个 Config checker 的东西,位置如下

根据里面的东西来改即可。


至此,DOMserver 的配置全部完毕!更多内容可以参考 https://github.com/minorcong/cn-xcpc-docs/blob/master/domserver.md

Judgehost (docker)

表示实在受不了不用 docker 直接嗯搭的折磨了......所以 Judgehost 就直接用 docker 搭算了(

下载 docker

curl -sSL https://get.daocloud.io/docker | sh

设置 cgroups

然后需要设置本机 cgroups,编辑 /etc/default/grub 文件,将下面这行

GRUB_CMDLINE_LINUX_DEFAULT=""

修改为

GRUB_CMDLINE_LINUX_DEFAULT="quiet cgroup_enable=memory swapaccount=1"

之后执行

update-grub

然后再重启机子即可,之后检查下 /proc/cmdline 里面有无对应 log,有的话就好耶~
如果没有的话,有些机子可能会被 /etc/default/grub.d/ 里面的东西覆盖,在 update-grub 可以看到 Sourcing 了哪些文件,都检查一下,凡是有 GRUB_CMDLINE_LINUX_DEFAULT 的地方都改一下即可。

运行 Judgehost

接下来就是直接在 docker 里面运行 Judgehost。命令如下:

docker run -d -it --privileged -v /sys/fs/cgroup:/sys/fs/cgroup:ro --name judgehost-0 --hostname judgedaemon-0 -e DAEMON_ID=0 -e CONTAINER_TIMEZONE=Asia/Shanghai -e JUDGEDAEMON_PASSWORD=<domserver password> -e DOMSERVER_BASEURL=<domjudge url> domjudge/judgehost:8.1.3

其中 domserver password 是在

/home/<username>/domjudge/domserver/etc/restapi.secret

里面,domjudge url 就是 domserver 对应的地址,最后要加个 / 符号。

如果要配置多台 Judgehost,就把上面 judgehost-0, judgedaemon-0, 对应编号一起改了,依次递增即可。如果一台机子 CPU 是多核(物理核)的话,核心编号就是 DAEMON_ID,从 0 开始编号。

然后在 domjudge 后台管理界面就应该看得到几个 Judgehost 了,像这样

好,终于把这杀千刀的 Judgehost 配置好了(

配置打印机

这次用的打印机据说有点老了,但还是能用就行。

通过 USB 连接上打印机之后,执行

sudo apt install hplip

除了与 root 用户有关的那个选项注意一下其他一路默认即可。

之后再安装

sudo apt install hplip-gui

之后在打印机连接的情况下再安装

sudo hp-plugins

之后执行

sudo hp-setup

如果没有图形的界面的话,执行

sudo hp-setup -i

然后选择 USB,之后会自动寻找到该打印机,一路安装好即可。

之后去 DOMjudge 后台,找到 print_command(在 Configuration 啥的地方),里面加上一句

enscript -b [username] -a 0-10 -f Courier9 [file] 2>&1

其中 username 就是用户名,0~10 就是每次请求只打印前 10 页。

之后,找个用户来登录,就可以看到上面有个 Print,如图

就可以愉快打印啦~

之后再连接惠普系列的打印机时,就不需要配置上面这些了,即插即用

配置 ICPC Tools

注:以下的内容还未在 DOMjudge 8.1.3 测试过,都是基于 7.3.4 测试的

这是个甚么东西?主要就是用来显示一些东西用的,总的来说配好了的话还挺有那味的(

这一部分主要参照 官方文档,但这上面也有一点小错误,这里就整理下吧。

配置 CDS

CDS 又叫 Contest Data Server,主要用以比赛后台的一些管理服务,得先配置好这个才能用其他 Tools(Resolver 除外)。

首先,在 DOMjudge 后台创建一个账号,并且分配其角色为 API reader、API writer、Source code reader,记录下用户名和密码(下面用户名和密码分别称为 usercds 和 usercdspwd)。

之后,在需要运行 CDS 的机子上下载并安装 CDS(这个东西占用资源较大,不太建议把 DOMserver 和 CDS 放一起,当然机子够神的话也无所谓),链接在这里(CDS v2.4.727)
下载好了之后解压,把 wlp 目录重命名为 cds,方便好认些。

接下来,修改 cds/usr/servers/cds/config/cdsConfig.xml,里面所有的内容替换成如下:

<cds>
    <!-- Set location= to a directory that the user running the CDS can write to -->
    <contest location="/home/cds/contest-data" recordReactions="false">
        <!-- Set the url to the URL of your DOMjudge installation, followed by /api/contests/<cid>, where <cid> is your CID or external ID -->
        <!-- Set the user and password to the user you created in the previous step -->
        <ccs
            url="https://www.domjudge.org/demoweb/api/contests/nwerc18"
            user="cds"
            password="somepassword" />
    </contest>
</cds>

其中 location 替换成一个不需要 root 就能访问或者修改的目录(比如

/home/<username>/cds/contest-data

),url 就是

<domjudge url>/api/contests/<contest cid>

,其中 contest cid 就是下面这个

另外还有 user 和 password,分别就对应 usercds 和 usercdspwd。

接下来修改 cds/usr/servers/cds/users.xml,里面的所有用户名不能修改,否则会很麻烦,把所有密码修改一下,为了安全(不修改也可以,但不推荐)。

接下来就可以运行(需要装 java jdk 11 或以上)

cds/bin/server start cds

来启动 CDS 了,关闭的话把 start 换成 stop 即可(没有 restart)。

之后,访问

https://<server ip>:8443/

,这里需要保证 8443 端口开放,直接就 ip:8443 即可。忽略 SSL 警告,就会看到如下界面:

点右上角 login,用 users.xml 里面 admin 的信息来登录。

至此,CDS 算是弄好啦

配置 presentation admin

这又是个甚么东西?可以看 这份文档。总之就是个屏幕显示后台管理工具,可以管理多个 Client 的屏幕显示。

这个东西可以装在任意一台电脑上,点这里下载Presentation Admin v2.3.491,并且据说在 macOS 和 Windows 下更不容易挂?

2.4.727 版本用下面的方法连不通,2.3.491 则可以,目前还没有发现原因。总之能跑就行(

我是在 Windows 下弄的,下载解压之后,在 bash 环境下在该目录内运行(没有 bash 可以装个 git)

ICPC_FONT="Microsoft Yahei" ./presAdmin.bat https://<server ip>:8443/api/contests/<cid> presAdmin <presAdmin password>

其中 presAdmin 还有其密码见 users.xml,server ip 就是上面说的那个 ip:8443。cid 则是上面所说的 contest cid。

要记得一定要加个 ICPC_FONT="Microsoft Yahei" ,否则可能中文支持有问题。后面 ICPC Tools 所有东西都要加个这个。

之后,会出现这个界面

如果一直显示 Disconnected 就重新试一下。

配置 presentation clients

上面这张图左边一个 Client 都没有,接下来来配置。

同样,这一步我还是选择了一台 Windows 来配置的。下载地址Presentation Client v2.4.727,官方文档见 这里

Clients 2.3 版本的有 bug,会遇到可能出现 main connection 之后程序就退出且 log 没有 error。官方给的解决方法是用最新版本的 Client(即 2.4 版本)。这个时候对于一些字体或者 emoji 表情能够正常显示而 2.3 版本则不行

之后解压,还是在 bash 环境下在该目录下运行

ICPC_FONT="Microsoft Yahei" ./client.bat https://<server ip>:8443/api/contests/<cid> presentation <presentation password> --name <client name>

其中 presentation 及密码见 users.xml,最后的 name 是指这台 client 的名称,可以不加。cid 同上面 contest cid。

这样执行完之后,会看到整个屏幕都是下面这个

以及 presentationAdmin 这边也多了一台 Client

然后就可以愉快体验辣(

其他的一个比较有用的参数:--display=id,即如果连了多台显示器,用这个来指定显示的显示器编号。

配置 Resolver(滚榜)

十分感谢 SYSU-Lanly,这里参考了他的博客。这里就用他的这套工具来弄。

先总结一下做了什么:一个就是最基础的滚榜,然后就是给队伍加上了照片。

一场比赛结束后,首先在 DOMjudge 上 Finalize 这场比赛,之后再来调用 resolver。

resolver 可以支持 CDP 格式的文件夹,2.4 版本之后支持的 CDP 文件夹格式如下:

.
├── config              // 非必需
│   ├── contest.yaml    // 从domjudge Import/export页面导出即可
│   ├── groups.tsv      // 从domjudge Import/export页面导出即可
│   ├── problemset.yaml
│   └── teams.tsv       // 从domjudge Import/export页面导出即可
├── contest
│   ├── banner.png      // resolver无用,但在cds放置于此就可显示banner
│   └── logo.png        // resolver主页面的图片&无照片队伍的默认照片
├── events.xml          // 滚榜数据
├── groups              // Categories照片,但在resolver似乎没起到作用
│   └── 3               // Categories的id
│       └── logo.png
├── organizations       // Affiliations照片,只要某Affiliations的队伍有logo,其他同Affiliations的队伍就都是该logo
│   ├── 3000            // 该Affiliations所对应的任一队伍的icpc id
│   │   └── logo.png
│   ├── 3001
│   │   └── logo.png
│   ├── 3012
│   │   └── logo.png
│   ├── 3017
│   │   ├── country_flag.png    // 照源码里是这样放置的,但在resolver似乎没起到作用
│   │   └── logo.png
│   └── 3187
│       └── logo.png
└── teams               // 队伍照片
    ├── 3000            // 队伍的icpc id
    │   └── photo.png   // 照片名字固定是photo
    ├── 3001
    │   └── photo.png
    ├── 3009
    │   └── photo.png
    └── 3010
        └── photo.png

所以队伍照片等等直接按照上面的格式来就行...... 就只有一个 teams 文件夹带上 events.xml 就是最简单的结构了。

最主要的就是这个 events.xml 怎么生成,这里采用了 Lanly 的工具:Github - icpc-resolver-from-domjudge。剩下的直接按照这里面的流程来就行。

不过注意一点,就是配置 config.json 中,各个奖的总数之和不能超过人数。

其中的执行 ./resolver.bat 命令在 Git Bash 下运行,用如下格式:

ICPC_FONT="Microsoft Yahei" ./resolver.bat ./cdp/

如果这场比赛没有 Finalize 的话,上述命令需要在最后加一句
```--test```。

如果遇到 java 报 OutOfMemory 则直接修改 resolver.bat 内最后一句命令,将 -Xmx=1024m 调大,比如 -Xmx=4g 再试试。

然后就可以愉快滚榜啦,具体操作见官方文档


下面的是之前的解决方案,可以不用看了,仅作参考

这一步也是很多坑......

一场比赛结束后,首先在 DOMjudge 上 Finalize 这场比赛,之后去

http://<domjudge url>/api/contests/<cid>/event-feed?stream=false

下载 event-feed。下载完之后,加一个 .json 后缀名,之后来下载 Resolvers v2.4.727,这一步还是在 Windows 上面搞。

之后打开 awards.bat,并且在 Disk 里面找到 event-feed.json,这一步可能会提示这个

一般来说是没有 Finalize 的问题,但也有可能 Finalize 了也有这个。这里不管,点右上角 Save,保存一个 json 文件,姑且命名为 test.json。

之后仍然在 bash 环境下运行

ICPC_FONT="Microsoft Yahei" ./resolver.bat test.json --test

注意:这一步不要./resolver.sh,亲测有点问题。最后的
```--test``` 是在有前面那个 Warning 的情况下加的。

如果遇到 java 报 OutOfMemory 则直接修改 resolver.bat 内最后一句命令,将 -Xmx=1024m 调大,比如 -Xmx=4g 再试试。

然后就可以愉快滚榜啦,具体操作见官方文档

References

CN-XCPC-DOCS
计算机 · DOMjudge Docker 配置
Connecting the ICPC Tools with DOMjudge
ICPC Tools
docker hub - domjudge
DOMjudge Manual 7.3
ICPCToy - DOMjudge
Lanly - 滚榜程序Resolver源码阅读