MENU

GDCPC 2018 背后的故事

November 3, 2018 • 生活阅读设置

前言

这个比赛其实是今年5月份举办的,拖到11月才写,确实是一次很严重的拖更。 比赛完当天在知乎发了一个回答之后,博客就一直拖着没写。前几天最后一笔省赛劳务费到了账(为了避税分成好几个月),我想再不写一下估计就要忘记发生了什么了。

2018年的省赛要在软院办,应该是去年就已经确定的事情;到了今年三月份,整个活动的准备工作陆陆续续开始了。令人没有想到的是,学院让我们年级的辅导员珊姐全权负责,团委学生会接小锅。我离开团委之前在学术部,每年学术部要办两场算法比赛,一个是新生杯,一个是院赛。而今年既然要办省赛,那院赛就省了,学术部接锅;当然其他的一些工作我看到志愿者部、宣传部还有文艺部等也都有帮忙。

说到这里,我其实一直是一个旁观者,毕竟退了团学以后这些事确实和我没关系。以前办这些比赛,都是用的hh教授弄的那个老掉牙的HUSTOJ魔改品,大概是担心这玩意儿会扛不住,我被找了过去负责技术方面的问题。其实这是件好事,依托非团学成员的身份,这是一次真·有偿活动,又拿钱又拿志愿时。

评测系统搭建

寻找硬件

鉴于比赛预算十分充足,一开始我觉得可以上各种云服务,省事。但是某教练说了,比赛必须断网,那这条路就走不通了。采购机器肯定是来不及的,流程走完比赛都结束了。那就只能去要机器。

珊姐带我走访了好几个实验员,南校区计算中心(B7副楼北)和学院实验室(B7副楼南)都问了一遍,得到的结果是“旧机器没有,都报废了;现在的课程紧张,正在使用的机器也不方便用”。最后到了133,负责管理的郭老师表示没有问题,这个机房配好以后就用过两个月,现在也没排课,你可以随便用。说着就给我把门禁指纹录了。打开房门,推起电闸,好家伙!80多台崭新的iMac摆在桌上散发着苹果的香气。

B7133-1

我想天下哪有这种好事,道了谢,心想这下硬件问题是彻底搞定了。

过了几天去准备正式开工,开机倒是没什么问题,就是上不了网。当天冯博士也在133,后面的大桌子上摆着水果全家桶,冯博则悠闲地看着纸质书。发现上不了网,三个人折腾了好一会儿,可以了。最终得出结论是这机房太久没用,交换机都要放坏了。

搭建OJ

真正开始干活的时候才发现,这些iMac其实很辣鸡。i5-7360U的CPU,8G内存,1T机械盘,再配上这个辣眼睛的1080P屏幕……嗯,去苹果官网找到最便宜的那款(8613元),就是它了。不过有macOS加持,倒省得做系统,用起来也很习惯。

之前脑内进行了几秒钟的技术选型,敲定了使用QDUOJ。原因也很简单,QDUOJ前端开发得很现代,Docker部署很方便,分布式配置起来也简单,Judger技术又比较到位。首先在第一台机器上成功地用Docker跑起来整个QDUOJ后,我在第二台机器上只配置评测机和rsync-slave,看看分布式到底好不好弄。这段过程其实还是有点折腾的,当时文档说得比较模糊,需要自己去摸索正确的配置。两台机器组成的分布式评测集群没有问题之后,再进行一番定制,我导出了评测端的Docker备份。

既然机器给得这么多,上多少台合适呢?最后决定1台机器做数据库、API,再来6台专门跑评测。部署这7台机器一共花了一个下午,比预想的还是顺利不少。

B7133-2

打印系统

代码打印这个需求,一开始没跟我说。不过要做,倒也不麻烦。我的做法很暴力,PHP服务器渲染一把梭。每个队伍分配一个账号,从网页提交要打印的内容,再由现场的志愿者人工值守打印出来送过去就好。这样做是真的简单粗暴又有效,而且环境都不用配,macOS自带的PHP跑个development server就搞定了。集群喜加一,增员至8台。

这里可以多说一句。比赛过后选手们对打印系统的评价非常高,这是我没有想到的。评价包括递送速度快(志愿者多),打印字体好看……可能是2017年SCAU搞得实在太辣鸡(没转义,被吃掉一堆字符)了?

第一次彩排

4月15号是第一次彩排的日子。这8台机器部署在哪里是个问题——比赛日是要断网的,而网络拓扑我并不知道。张老师表示,计算中心的138和238都不能互通,你们别想啦!我想这可不是件好事情,搞不好要临时拉交换机走飞线。不过上个学期正式成为专家的刘志老师表示没有问题,B7副楼北侧是可以断网后互通的。那就把iMac们放在138好了,后面还有许多空位。

彩排对于其他人来说,工作是把场地布置成比赛的样子并测试每台机器。对于我来说,则是把评测集群搬过去,确认能顺利接入网络,然后跑起来。一切倒是非常顺利,打印机也OK。
打印测试

部署选手软件

时间到了四月中旬,报名队伍激增,我们发现:两个机房装不下了。经过一番沟通,吴老师同意借B7-338B这个刚换新的机房给我们。也就是说,目前138、238、338B三个机房将用作比赛。我找了一天时间去看,配置大概是这么个情况:138是六年前配的,二代i3,4G内存,慢得要死的机械盘;238配置和一楼差不多,CPU更烂,操作系统还是XP;338B倒是新机器,而且配置很好,E3-1225v6配32G内存,还有GTX 1060加持,简直游戏神器,可惜辣鸡机械硬盘配上还原卡,白瞎了一套好配置,用起来卡的一笔。

138、238属于南校区计算中心,主要用途就是给文科生们上大计基;338B的“好配置”目前用来上工程制图。换句话说,编程用软件一个都没。我考虑了一下,准备统一安装这些软件:

  • Google Chrome
  • Code::Blocks
  • Dev-C++
  • IntelliJ IDEA
  • Oracle JDK

同时,部署了两台下载服务器,提供 Firefox、Eclipse、PyCharm、Python 等软件供选手自行安装使用。

和吴老师讨论了一下,他说,理论上先装好一台机器然后用还原卡走网络部署拷机是可以的,但是这个过程很慢,一台一台人工操作反而快。这没问题,我们丝毫不缺人力,只要发志愿时就行。那就招募志愿者啊,招他几十人,每人也只需要装几台而已。到了4月19号,我们找了50多个志愿者来装机,花了一个下午。

138 INSTALLATION
238 INSTALLATION

试题准备

试题是找UESTC买的。他们的教练在连续发了3次空空如也的邮件之后,终于在4月26号晚上使用百度网盘发来了3套题目。拿到题目的第二天我去把所有的题目导入OJ,并且把标程跑了一遍。跑标程跑出了很多问题,题面也有不少不严谨的地方。题目数据、标程、题面改来改去不少次。
MAILS

同时,还需要准备一份试机用的水题,这倒是简单,这些题目大家应该很熟悉:

  • Your Ride Is Here
  • Perfect Squares
  • Fireworks Show
  • Heat Wave

没错,它们都是来自USACO的水题(

日子到了青年节,试题的问题终于修完了,纸质试题也印刷装袋好了。在这个关键的时刻,最后一个题面错误被发现了……行行行,报到日当天重印了700份试题。最终的试题在这里可以下载。用TeX排版还是很舒服的。

最后一次彩排

说是彩排,其实是正式布置场地了。考虑到报到日当天上午再布置赛场时间可能不够,于是决定前一天晚上等计算中心全部下课后就进行布置。我还是挺轻松,反正都是志愿者干活,只要指挥他们把8台集群和5台打印机搬过去放好,然后调试就行。打印机虽说有5台,其实都是从学工办办公室搬来的,不是专门准备的物资。机器型号都不统一,装起驱动来还是稍费工夫。调好之后,把5000张打印纸平均地分到各个打印位,基本上就完工了。

学术部干事和学工办助理整个下午也没闲着,准备了成吨的物资,摆在学院大堂。

MATERIAL 1
MATERIAL 2

惊险的报到日

BOARD
报到日是5月5日,从上午开始签到。报到地点在B8报告厅,我去打了个转就回了机房。刘志老师上午来了一趟,跟我说已经做好断网了,我试了一下没问题,觉得万事俱备,这是很休闲的一天。然而我错了,这是筹备以来最惊险的一天。

下午开始陆陆续续有队伍来机房试机刷水题了,大家的提交越来越频繁,使得QDUOJ爆发出了一个问题——验证码!很多人开始报告说提交的时候需要输入验证码,并且即便正确输入,也无法成功提交。我开始以为是个别现象,结果问题出现得越来越多,这真的很令人stress。比赛机房上午都断网了,我只能跑到对面133去GitHub上研究代码。更令人崩溃的是,我Python一行都不会写,对Django也处于一个完全无知的状态,想快速定位问题,恐怕很难。过了几分钟,我终于通过搜索关键词captcha找到了疑似问题所在,但是这几分钟却像一年一样漫长。回到138,进入Docker的shell,热改代码,直接不允许使用验证码。好像,problem solved。真的有惊无险。后来作者看了代码证实,当时确实存在bug,需要修复。

LUNCH

修了验证码问题,金书记送来一份外卖。真香。又过了一会儿,UESTC派来的讲题人也到了现场,谈笑风生一会儿。

辛苦的比赛日

抱着“机房又不断电肯定不会出问题”的侥幸心理,我一觉睡到大天亮,吃个早饭,慢悠悠地去了机房。没想到,其实是有早饭提供的。一上午倒是没出什么问题,有几个队伍对题目提出了疑问,UESTC来的同学也都通过系统发布了解释。打印系统运行平稳,气球派送也由于题目难度较高(逃)没有出现任何延迟问题。倒是教练们有些坐不住——既不给他们发试题,又不让他们碰电脑看榜(教练休息室的网络不互通),实在难受。因此珊姐让我每半个小时就从系统导出一份完整榜单,然后用Excel整理好,再到133去(有网络)用QQ发到教练群里。真辛苦!

PANORAMA

中餐是发的金拱门,没记错的话每人应该是一个Big Mac三明治、一个辣鸡腿和一杯饮料。讲道理这中餐是真的不咋地,尤其是三明治,着实难吃。可是舆论上好像说中餐不错?花了两三万倒是真的。吃完饭之后提交量渐渐多了起来,可能跟封榜有点关系。不过这套题数学题确实多,也没有签到题,有几十个队伍一道题都没A。我也替他们捉急啊,真的。大概到最后十分钟左右的时候,有一支来自双鸭山大学的优秀队伍,AK了!场内好像发出了小小的欢呼声。

CLOSING CEREMONY

闭幕式是下午3点开始,想着一个小时的时间应该是足以出最终结果的,但是,我错了。期间一直被催交获奖名单,导出来在Excel搞了一段时间终于把对应学校名称和排名弄了出来,最坑的是全部弄完之后发现有3个队伍貌似没来还是没有提交,结果全部错位,又弄了一次。带着打印出来的结果去到闭幕式现场,讲题时发现获奖名单里少删了3个旅游队(队名没星号!)。大家非常紧张,不停修改,好歹没出什么大乱子,终于在公布结果前修改完毕。闭幕式结束疏散后,回到B7,物资归位,吃了几份麦当劳。终于,结束了。

尾巴

我负责的事情基本上都在掌控之中,也不太复杂,还是比较轻松,并且还有好处拿。团学的同学们就比较辛苦了,准备物资真的很麻烦,其他筹备也很费神,还是“纯义务”工作,挺惨的。倒是承办单位或成最大赢家。

Archives Tip
QR Code for this page
Tipping QR Code