HEZOJ 管理员使用指南

本教程面向零基础新手管理员,争取按照本教程指令,任何人都可以成功传题。

欢迎提出建议,欢迎各位后代管理员修改增删本文。

开始使用

Ubuntu

忘记了,大概方法是下载一个启动盘创建器,然后到官网下一个 Ubuntu,然后把 Ubuntu 放到 U 盘里,创建启动盘。

U 盘插进电脑,进 BIOS,然后把 U 盘的优先级调上去(这步我有点忘了)。然后你就可以进安装界面了。

BitLocker 这种不懂,Win 太智障了,真不行的话,可以把 Win 擦除了。

如果有问题可以问机房使用 Linux 的同学 / DeepSeek / 前几届管理员 / 上网搜。

ssh

忘记了,咕咕咕。

LemonLime

主要是用来修 CDF 的。

CJ 的 cdf 可能非常老,然后 LemonParser 就识别不了了。

这时就要下 LemonLime,打开 cdf,然后把题目名字重新写一遍——然后 cdf 就被重新写入,改好了。

下载 Lemon,首先到 github release 找到对的版本(Ubuntu 好像是下图),下下来应该可以直接 chmod +x 然后 ./ 运行。

image

但是你稍微找个 .cdf 测一下,发现程序无法运行!

这个原因是 Linux 命名空间什么的东西,我不太懂,但是解决方法是到 /etc/sysctl.d 里新建一个叫 100-enable-user-namespace.conf 的文件,里面写

kernel.unprivileged_userns_clone=1
kernel.apparmor_restrict_unprivileged_userns=0

然后重启,LemonLime 的权限就开机自启动了,你可以测评了。

然后还要下载一个靠谱的 testlib,到这里可以找到。(直接复制黏贴到本地就可以了)

Python

不过好像 Ubuntu 最新版的 Python 版本自动就是够的

需要先把 Python 升级到最高版本,不然后面的操作可能出问题。

可以到 anaconda 下载 MiniConda。下载下来后,直接运行那个 .sh 文件(需要先 chmod +x)。然后你已经装好了。

这时主目录下会有一个 miniconda3 这样的东西。然后你在主目录里 vim .bashrc,加入这一行

export PATH="/home/your-computer-name/miniconda3/bin/:$PATH"

然后就可以使用 conda init 初始化,它会帮你把事情做好。

此时你新开一个终端,使用 conda activate,开头应该会跳出来一个 (base) ... 的东西,那已经对了。

检查的话可用 pip --version,如果版本够的话就可以了。

如果你觉得这个平时用不到,就可以用 conda config --set auto_activate_base false 把它关掉。重启终端即可。
要用的话就 conda activate

LemonParser

先建一个你喜欢的文件夹,比如 lemonparser,用 git clone https://github.com/Xiaohuba/LemonParser.git lemonparser 把 lemonparser 下下来。

把 requirement 里面的的东西先下载了。比如下载 pdf2image 用 pip install pdf2image。但是更正确的方法是 pip install -r requirements.txt,如果你 Python 版本不够可能出问题,此时按照上面说的下 Python 就可以了。

OpenAI 的话,文件里边有一个隐藏文件,ls -a 即可显示,叫做 env.example,把里边的东西改成你的 API 即可。但是这个东西是一个 example,就是说它其实没用,你要搞一个真的 .env,内容和这个一样。


Linux 系统可能给你报一些奇怪的错,比如

image

可以改成 pip install --break-system-packages --user -r requirements.txt 强制安装解决。

传题

HEZOJ 大致方法

首先建一个文件夹 data,然后把 solution.pdf, cdf 和数据、down 放在这个目录下面。注意题面必须叫 statement.pdf,题解必须叫 solution.pdf.

目录结构应该是这样的:

~/hezoj/data$ ls
data  down  lap.cdf  solution.pdf

data 和 down 里边,要采用 HEZ 格式,每个题分别子文件夹,例如

data
|
|--- apple
|
|--- game
|
|--- coach

千万不要 down 里套 down!

然后运行 main.py,参数要加全:

python3 main.py -D -E -Z --noip-checker path/to/data

加上的参数是一些帮你干事的操作:自动提取 down,提取题解,自动生成压缩包,使用 NOIP 评测 checker。

然后 OJ 上新建题目,手动加上题目名称和 tag,进入数据页面,点上传数据,选择 .zip 文件上传。然后记得检验配置并更新数据。最后公开题目就可以了。

Trouble Shooting(OJ)

cdf 有问题

不同学校使用的 Lemon 和 cdf 格式都不太一样。比如

  • HSEFZ 每个题都有 checker,但是其实很多题是传统题,不用 checker,data 里也没 checker 文件。此时在 cdf 里搜索 specialJudge,把后面那个引号里的东西删掉即可。

  • CJ 使用的是老版本 cdf,具体解决方法看最上面的 LemonLime.

人家 solution 分 3 份写?

-Z -E 关掉,生成 to_uoj 后手动把 solution.pdf 放进去,并在 problem.conf 里按照 ttx 博客 的流程修改。

题解站传题方法

首先如果你改了 DNS 还是连不上题解站,可以尝试把网断了重新连接。

文件格式和结构是一样的。

使用这些选项:

python3 main.py --parse-pdf --statement-format json -S ../data

切 pdf 是一样的,difficulty 是这样的:

  • \(0\) 是暂无评定

  • \([1, 7]\) 是洛谷难度

  • \(8\) 是难以战胜,银牌题

  • \(9\) 是无法战胜,金牌题

想偷懒可以一路 enter 这个选项。implementation 这个应该也可以偷懒。public 最好设成 y

这时你的 to_uoj 里应该有一堆 .json,一题一题传。

传到题解站上,要使用这个指令:

curl https://sol.internal.moeebius.top/problems/new/edit -H "Cookie: token=your-token" --data-binary @problem-name.json -H "Content-Type: application/json"

problem-name 换成题目名字,your-token 换成你的叫 token 的 cookie。举个例子,题目名字叫做 assign,你的 token 是 EZOI2025,那你应该用

curl https://sol.internal.moeebius.top/problems/new/edit -H "Cookie: token=EZOI2025" --data-binary @assign.json -H "Content-Type: application/json"

Trouble Shooting(Solution site)

不好我把题传了好多遍

千万不要手动删除!这样会永久丢失题号!

采用覆盖的方法。就是你把指令里的 new 变成要覆盖的题号,重新上传即可覆盖!

这个【】学校 sol 只有 markdown 源码

其实只要把后缀名强制改成 .pdf 然后传上去就可以了。可以显示的。

我想改题目又不想把包重新传一遍!

ssh hez-uoj@192.168.90.233
sudo docker exec -it uoj /bin/bash
cd /var/uoj_data/upload/PROBLEM_ID

可以改 problem.conf 了。

如果你要手动把 after contest 数据加上去?(说实话这个过程很吃时的,不如你把包下下来改)

首先要用 scp 把本地文件传到 OJ 的一个文件夹,比如桌面上。(这里以把一整个文件夹传过去为例):

scp -r /local/path/ hez-uoj@192.168.90.233:/target/path

然后再用 docker cp 传到 docker 里。docker 里的路径是,你进入 docker 后,去掉开头 root@ 那一段。

sudo docker cp /oj/path DOCKER-ID:/docker/path

【】你为什么文件名全都不对啊?

请手动使用 Ubuntu 批量重命名的功能(选中然后重命名(快捷键 F2))。

比赛相关

创建比赛

先点创建比赛,然后选择时间。

先把题传了,然后把题加进去。

设置比赛为 Unrated。赛制改成 IOI。不改成 IOI 的效果是默认 OI,然后啥提交都显示 100 分。

后台管理比赛

第一步,进后台。

sudo docker exec -it uoj /bin/bash

第二部分,进 mysql(你如果用 ls -R | grep contest 的话,可以发现一个叫 mysql 的文件夹里有很多神秘文件)

mysql -u root -p

密码可以在 /var/www/uoj/app/.config.php 里看,注意这是一个隐藏文件。

接下来的命令注意分号,没一次执行命令的结尾都要有分号,分号是分隔符。如果你发现忘加分号了,可以下一行再加。多行一个命令是合法的。

进入数据库。

SHOW DATABASES;
USE app_uoj233;

可以查看所有比赛的信息,并找到需要修改的比赛。

SELECT id, name, start_time FROM contests;

可以查看一个东西的结构。

DESC contests_registrants;

如果要加入一个用户,可以这样。下面的 gyydp123_LIM 请修改为用户名。

mysql> INSERT INTO contests_registrants (contest_id, username, user_rating) VALUES(51, 'gyydp123_LIM', 1500);

如果你不小心写挂了,需要后续修改(大概是下面这个东西):

mysql> UPDATE contests_registrants SET user_rating = (SELECT rating FROM user_info WHERE username = 'wosile') WHERE contest_id = 51 AND username = (SELECT username FROM user_info WHERE username = 'wosile');

你要手动改报名人数。

mysql> UPDATE contests
    -> SET player_num = (SELECT COUNT(*) FROM contests_registrants WHERE contest_id = 51)
    -> WHERE id = 51;

最后退出

EXIT;

修理 OJ 和服务器

FTP 相关

怎么开 FTP 呢?如果它告诉你域在线,那没事了。否则,把 ezoii 删掉,再把 i 输进去。然后点“应用”,然后再点那个钩子“将域置于在线”(反正大概这个名字),灯会变绿色。

出联考相关

不可不知的注意事项!

  1. cdf 时限配对没有?

  2. 如果有 pretest,systest 出锅的时候修 pretest 了吗?

  3. 题面有没有问题?

  4. 有没有检查数据合法性?特殊性质的 gen 有没有写对?

posted @ 2026-01-18 18:52  decimal10  阅读(4)  评论(0)    收藏  举报