# cpctk **Repository Path**: sduwz/cpctk ## Basic Information - **Project Name**: cpctk - **Description**: 程序设计竞赛工具包 - **Primary Language**: Unknown - **License**: MIT - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 0 - **Created**: 2021-05-06 - **Last Updated**: 2024-06-06 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # 编程竞赛滚榜工具包(xCPC-Toolkit) ## 简介 ICPC为竞赛开发了一套支持工具[ICPC-Tools](https://tools.icpc.global/),其中的滚榜工具包称为[Resolver](https://tools.icpc.global/resolver/),可以从竞赛数据服务器(CDS)即时获取赛事数据并展示榜单、也可在赛后加载数据回放封榜后的榜单变动和获奖情况。滚榜工具包内含**awards**和**resolver**两个程序,前者从竞赛接口提取数据导出赛事文件,后者显示并回滚榜单。`resolver`支持三种输入数据源: - 赛事接口:竞赛平台需支持**Contest API**。滚榜工具动态、即时获取数据并展示,支持显示**校徽、队伍照片**。 - 赛事目录:**Contest Package folder(CDP)**。支持**校徽、队伍照片**,主办方需自行收集整理图片放到目录指定位置。赛事数据为XML格式。这种方式对平台依赖小,但准备工作量大,需要仔细研究CDP目录格式。 - 赛事文件:只需**event-feed**赛事数据文件即可滚榜。旧版称为`awards.json`。**awards**程序可以从赛事接口导出赛事文件。 本项目包含提取、转换、修改竞赛数据、实现滚榜效果的一些辅助程序,解决以下问题: - 赛事所用平台没有直接可用的数据源,需要编程提取竞赛提交和评测等数据,转换成Resolver所需格式。 - `Resolver/Awards`设计的获奖数量较少,金/银/铜奖最多各设10名,需要扩大数量。 - 同时设定邀请赛和省赛两套奖项,以及最佳女队等奖项。 - 队伍、学校、奖项名称支持中文。 ## 运行环境 处理过两次滚榜任务,技术方案不同,运行环境也有差异。 ICPC Tools为Java开发,辅助程序用Python编写,Linux和Win环境均可运行。 - 2024-05-26 CCPC邀请赛(山东)暨山东省赛: - 没打算收集校徽、逐队拍照,所以选了**赛事文件**方案。 - **PTA平台**,具备ICPC Tools兼容接口,可以导出赛事数据文件。平台目前最高兼容到Resolver-2.5.951,实际用的v2.5.940(ICPC Tools官网建议)。 - Win11(滚榜主持人用翻页笔远程操作,驱动程序没有Linux版) - Python-3,主要用内置`json`模块。 - OpenJDK-21(运行Resolver和Awards程序) - 诺为翻页笔N29 - 2021-11-28 山东省赛: - 预先收集了各校校徽,选了**赛事目录**方案 - **牛客平台**,提取Web榜单,生成CDP赛事数据目录。 - MintLinux 20.2 (Ubuntu-20.04 focal) - Python-3(用于提取牛客提交记录) - OpenJDK-17(运行ICPC Resolver滚榜程序) - PostgreSQL-14.1 (保存比赛、选手队伍、题目、提交等数据) - 受闭幕式时间限制,录制的滚榜视频,调速控制在5分钟。 ## 操作笔记 - [赛事文件方案(2024-05省赛)](20240526sd/notes.md) - [赛事目录方案(2021-11省赛)](20211128sd/notes.md) ## 滚榜操作 无线键盘、无线鼠标都可用。距离更远的话可用翻页笔,但需支持自定义按键。 滚榜程序启动后停在开头,黄色提交为封榜后的待决提交。 空格或鼠标点击将滚动到底部。下滚过程较慢,可以提前滚动到底部,等待LED屏操作员切屏后转由主持人控制。 - `Space`或`F`键:前进(Forward)到下一个“事件”,上滚到获奖或提交通过名次变动等。 - `R`或`B`键: 回退(Rewind, Backward)。 - `1`: 快退 - `2`: 快进 - `0`: 重置到初始状态。 - `Up/Down`: 加速、减速。调整动画速度。 - `Ctrl+Q` 退出。程序运行后全屏,为防止意外退出,无视`Ctrl+F4`或`ESC`。 - 滚榜运行时按`Alt+Tab`如果无法切换到其他程序,可以按`Win+D`显示桌面,然后再切换程序。 ## 使用经验 - 滚榜无法显示中文(显示为方框)。 - 用`ICPC_FONT`环境变量指定支持中文的字体。可在系统设置、也可编辑`resolver.sh(bat)`设置环境变量。设定后需重新运行滚榜,确认中英文和符号都能正常显示。实际选用字体可能和指定的不同,找不到指定字体会选后备字体。若担心版权问题可用开源字体:思源黑体、阿里普惠体、方正免费字体等。 - 滚榜程序抛出`OutOfMemoryError`异常。 - `resolver.sh(bat)`为JVM设定的1024m内存不够用,需增大JVM内存量,8GB以上就比较充沛了。 - 2024-05:504队、8100次提交、2600次封榜待决。这次所用电脑内存富裕,为JVM分配了16GB(`java -Xmx16g ...`)。 - 2021-05:768队、13000次提交,用3GB内存撑过。 - 正式赛提交多,滚榜加载速度慢,建议用内存大、CPU性能好的电脑。 - 参考配置:ThinkPad E16, i5-1340P, 40GB内存。多核、GPU影响不大。 - `Resolver`和`Awards`脚本启动缓慢(要等待约20秒),原因是程序用连接`google.com:80`的方式获取本机IP。 - 方案1:用环境变量`ICPC_TOOLS_IP`指定IP。指定`127.0.0.1`没发现什么缺陷。 - 方案2:拉取源码,建立项目,改用连接`baidu.com`获取本机IP,重新构建程序,启动就不会停滞了。相关代码位于`org/icpc/tools/contest/model/internal/NetworkUtil.java`。配置IDEA项目很麻烦,还要签出特定版本确保兼容,好处是可以顺路修改图片资源。 - 方案3:启动如果卡住、等几十秒没反应就`Ctrl+C`,重试几次运气好也能过去。 - 连续回退(`R`或`B`键)时滚榜程序卡住,奖项数量设置可能不合理。 - 此时程序后台抛出了Java的索引越界异常,只能重启程序恢复。建议稳健操作。 - `F, R, B`键可能触发中文输入法,主持人用翻页笔无法处理。 - 滚榜程序启动后先按几下字母键,如果弹出输入法框就关掉。 - 滚榜过程中需有人看管滚榜电脑,必要时帮助操作。 - 滚榜和颁奖可能需要1、2个小时,笔记本**外接电源**,切换到**性能模式**。 - 队伍较多时滚榜启动可能慢达数分钟,个人赛尤为明显。 - 比赛初期题目简单,提交量大,不用紧张。赛程过半后提交就会少下来,不会保持线性增长。 - 21年的经验是队伍数量(而非提交数量)影响更大。 - 近年CPU牙膏挤爆,性能提升明显,问题不大。 - 赛后处理数据时间有限,可提前把命令和参数写成脚本,方便执行、不易出错。 - [ICPC Tools IDEA构建方法](https://github.com/icpctools/icpctools/blob/main/doc/intellij-idea.md) - 步骤繁琐,但照着做确实能行。个别包缺失或文档漏写,从Maven下载并放到对应目录中,再配置导入库即可。用Eclipse配置项目没成功。 ## 术语 - Contest Control System (CCS):竞赛控制系统,各种OJ之类。 - 持有题目、测试集。 - 接受提交并评测。 - Contest Data Server (CDS): 竞赛数据服务器,提供RESTful数据接口,内容包括: - 赛事描述(主题、日期) - 倒计时钟(开赛用) - 竞赛时间 - 竞赛设置(问题、队伍等) - 队伍主目录备份(迁移用?) - `event-feed`,提交、过题等各种“事件”