写在前面 1.排版混乱,看完再下手也不迟,避免掉到坑里。。。 2.本文仅供参考,一切以pc2v9AdminGuide.pdf和实际试验情况为准 3.写的比较匆忙,如果有什么不对的地方,欢迎指正!如果有疑问,欢迎交流。 4.转载请注明出处 http://www.cnblogs.com/xuwangzihao/p/5998333.html 谢谢。 QQ:782927718 E-mail:fffgrdcc@163.com 作者:NEU_徐王 名词解释 核心机器(site):所有的数据都存在这个电脑上,所有的team和judge都和他交互,如果site挂了,比赛就挂了,虽然据说可以做成分布式的,不过没试过。建议在比赛中使用一个site(就是site1),我们姑且把site理解为数据中转枢纽吧。 如何从零开始使用pc^2搞起一场比赛 //以pc2-9.3.3为例 //pc2是基于java的,我默认你已经配置好了site的java环境,board机需要的apache环境和judge机需要的java/C/C++环境 ========================================================== 0.如果是linux系统,建议把pc2的bin目录配进环境变量Path,这样调用脚本方便。 ========================================================== 1.修改pc2v9.ini//这个文件时启动pc2各种脚本时必须的,在哪个目录调用的脚本,请确保在那个目录有该文件,比如我的pc2装在/home/neuacm/Documment/下,但是我的pwd是/home,那么我就需要在/home目录下有个ini文件,否则会报错 在[client]标签后,# Site 1的下面,固定比赛使用的核心机器的ip,端口默认50002,不要改。 ========================================================== 2.启动pc2server 账号密码都是site1,且不能修改。//不用担心会被其他人登录,因为所有和该比赛相关的机器使用的pc2的ini文件都把site1的ip固定了 设置比赛密码//这个密码在你第二次登录site的时候和切换比赛的时候会被要求输入。避免有人在核心电脑偷偷修改比赛数据。 然后server就没什么用了,把它放一边,但是千万不要把它关了!!!如果site被关闭,pc2的任何脚本都无法运行(当然pc2server除外) ========================================================== 3.启动pc2admin 初始账号密码都是administrator1,进入后我们可以在此设置比赛所有信息,和监控正在运行的比赛的所有信息 -----------先说设置比赛Configure Contest--------------- 先设置account,点击Generate批量生成账号,账号有如下五种 管理员(administrator):可以监控比赛和对比赛进行修改。建议两个,有个备用的方便 评测员(judge):可以对选手提交的评测请求(run)进行评测并返回结果,可以看到所有run的信息(包括源代码),可以申请重新评测,可以处理提问(Clarification),可以进行广播。建议7+1,7个用来测run,1个用来答疑 参赛队(team):可以提交run和Clarification,并接收judge返回的信息。建议n+1个,多出来的可以设置为不显示在榜(scoreboard)上,做赛时测试用。 得分榜(scoreboard):生成榜单网页用,打印气球用。。。。(貌似还有别的功能,不过我没用到),建议3个,一个用来生成现场的榜,可以接网线让外网也可以访问,一个打印气球用,一个备用 事件反馈器(feeder):连接icpctools用,建议一个//随便翻译的,轻喷。。//9.3.3版本里是个下拉菜单显示的,然而菜单里只有FEEDER一个选项。。。不排除以后会有变化的可能性,具体请参考文档 最后一行有Start Account Number at,不用填,默认为0. 点击生成,然后关闭。 在这时候就有很多账号出现了,对每一个除了team外的账号edit,更改密码(默认密码就是帐号名,不安全),然后点击load,按照guide的要求导入选手信息,最后一个多出来的选手账号,点击edit,更改密码,更改Shonw on scoreboard displays权限为fallse(这样,这个账号就像是从来没出现在这场比赛一样,不影响排名,不影响FB,但是可以交题,并且被评测返回结果,用来正式比赛提交标程,比选手更快发现问题) //注意的是,这里生成里面填的数字是“新生成多少个”,比如需要200个队,现在已经有199个队了,只要再生成一个就好,千万小心,因为添加进去的账号就不能删了,虽然可以通过修改权限让他变得和没有一样,但是多了后一个个改太烦了2333 //需要注意的是,load的时候,现有team'数必须大于等于导入文件里面的team数,否则会导入失败,不会自动帮你创建账号的,load只负责批量修改 然后设置judgement, 其他都用默认 把TLE的那个改一改,和pc2judge中的状态名字保持一致,否则会不算罚时 然后设置language, 添加比赛支持的语言,参数默认的就可以跑,如果有要求,在compile cmd line 的选项里{:basename}前修改(c++11 -O2之类的) 然后设置time, 默认5h,不用动 开启比赛的时候,在这里点击start 结束的时候,点击stop 然后设置setting, 改比赛名字 改输出文件大小限制(改的比最大的答案大就行,否则肯定谁交谁WA) 改Scoring Properties(罚时规则),默认就行,CE不算罚时,NO都是20一次 然后设置problem, 点击add添加题目 general里设置名字,短名(注意短名不会显示在team的问题的下拉菜单里,为了选手友好,建议题目名的命名为X.xxxx,例如“A.a+b”,短名就ABC那种就行),设置时间限制,单位为秒,选择需要输入文件,下面的team reads from如果选了file,选手需要在程序里写上freopen,所以我们选stdio就好,选择需要答案文件,然后不用点Browse,这个一会儿设置。show output和show compare是和judge有关的,默认选上就好,hide problem是题目不可见,因为添加了就不能删除,所以有这个来弥补,默认未选中就行。 Judging Type里设置judge方式,因为autojudge容易卡死,所以建议人工jude,使用默认设置的Manual Judging就行,下面的CCS默认不勾选就行。 Validator里设置的是比较方式,我们选择Use PC^2 Validator,然后选“4 - ignore all whitespace on lines”,这是出题人派来的裁判说的,因为PE不算WA。。。。//第一次知道 Data Files里面选择“Keep Data Files external to PC^2(requires you to copy files to judge's machines)”,因为另一个是走网络传输的,担心是每次judge都会传输一次,容易出问题,不敢用。然后点击load,指定到该题目数据所在文件夹。//第一次点击keep那个选项的换会弹出一个窗口“Set External Data File Path”,这个设置的是评测机的数据路径 回到general里看下,Input Data File和Answer File里是不是有东西了。 //这里需要注意以下三点 //1.数据文件的文件名不能有空格,否则会评测失败 //2.如果在problem的Datafile选择“keep”开头的那个,答案的输出数据后缀只能是.ans,选的是"Copy"那一个的话则无所谓 //3.如果在problem的Datafile选择“keep”开头的那个,每个题目的数据的名字要求不同。 //4.尽量把不同题目的数据放在不同的文件夹内,避免手抖搞错,或者自动识别文件的时候出问题 //配置specialjudge的话请看pc2根目录下doc目录下的pc2v9AdminGuide.pdf,ubuntu下只要把参数前面加个./就可以,配置的话还有checker怎么写看文档。 然后设置Notifications, 添加打印气球用的scoreboard,一个就够了,建议和做榜单的账号分开。 然后设置autojudge, 如果要开启自动评测的话。可以让不同的评测账号对不同的题目有权限auto,不过我们是人工判题,所以用了默认——都没有权限 然后设置profile, 在这个里面是每一个profile都是一场比赛,可以有不同的设置,建议在比赛前clone一份出来,开启一次test一下,copy版本的比赛没问题,应该就没问题了。switch可以在不同的比赛之间切换。要注意的是,这里如果切换了比赛,重新登录site的时候,应该输入目前活跃(Active)的比赛的比赛密码。 然后就可以了。 -----------然后是监控比赛Run Contest---------------//这里是比赛进行时候用的,设置的话,pc2admin的工作已经结束了,快进到下一个等号分割线 说几个比较有用的,剩下的读文档吧 Team Status: 看team们的连接情况的,很方便知道谁提前登录了,谁没有来参加比赛 Runs: 看选手提交记录的状态用的,admin这边主要用来删掉一些一直处于“Being_Rejudged”状态的run用的,这些是把judge卡死后遗留下来的(我怀疑是bug)没有任何评测机在评,但是显示在评测。删除的方法很简单,选中后把delete勾上就好。 Finalize: 终止比赛用的,点开可以设置金银铜终止名次(注意是终止名次,不是奖牌个数) 需要注意的是,剩余时间必须小于等于0且stop后才能终止,相关设置在ConFigureContest的Time中//剩余时间是可以改的嘿嘿嘿 其他的没啥用了。。。 ========================================================== 4.打开pc2ef(icpc tools连接用) 在event feed中点击start开启服务 //web server无视就好,据说很不好用 放一边就好了,别关掉,因为有些icpc tool会访问eventfeed(ef)。//不过发气球的icpctool实战证明半小时左右就不行了,初步怀疑是ef刷新过快,后期文件比较大,每次没读完就被终止了的原因 这个主要是最后比赛结束后导出简单的比赛数据用的。//给resolver用 导出数据是这样的,点击view,点击save就行 ========================================================== 5.把比赛数据拷到每个裁判机的指定目录下 ========================================================== 6.评测机打开pc2board//如果报错,检查题目数据是否在指定目录下 ========================================================== 7.在board机开启pc2board 此时就生成了summary.html,在pc2根目录的html目录下,需要其他人访问的话请修改apache配置文件指向此 封榜的时候,只需要关掉pc2board就好,这个summary是它实时更新的,关了就停止更新了 ========================================================== 8.选手打开pc2team,等待比赛开始 ========================================================== 9.在admin中的time中选中后点start,比赛开始。 ========================================================== 需要注意的问题 1.site据说在比赛后期很吃内存,所以请更改pc2server的启动脚本,Java加上参数 -XXmx7G//因为我们的评测机总的内存为8G//告诉我们的人是官方派来的裁判,我们也不确定是不是真的 2.TLE默认会返回CE,原因是admin里judgements标签下TLE的名字和judge对TLE的描述里面的名字不一样,多个横杠吧,所以就默认算在CE中,而 CE不算罚时,删掉改成一致的就好 3.ICPC没有PE这一说,在problem的Validator中使用PC2自带的第四个:“ignore all whitespace on lines” 4.即使题目不需要输入输出文件,如果在problem的Datafile选择“keep”开头的那个,也需要设置in文件和ans文件,否则启动judge的时候会报错。//没有输入,比如helloworld,没有输出,比如special_judge 5.如果在problem的Datafile选择“keep”开头的那个,答案的输出数据后缀只能是.ans 6.如果在problem的Datafile选择“keep”开头的那个,每个题目的数据的名字要求不同。 7.启动pc2的时候,在“当前目录”下需要有需要的ini文件 8.ubuntu启动pc2时候在后面带上&,可以让进程在后台运行,避免每次启动pc2脚本要开一个新的终端这个尴尬的问题。 9.虽然pc2judge是带有autojudge功能的,而且可以多开,确实效率高,但是一旦遇上一些奇妙的程序或者恶意的程序就会卡死,所以现场赛不建议使用,还是人工效率高,八个judger都有点儿多,个人认为7个就够,一个专门的judger我们称他为buj(back_up_judger)给其他judge擦屁股(比如有的judge评完忘记给队伍返回结果,还有给恶意代码rejudge和查看源码,处理选手rejudge请求之类的),剩下六个只负责评题,卡死汇报runid给buj,然后直接重启,效率贼高 10.judge界面AllRuns有个标签叫Suppressed,如果为yes,说明这个run没有给选手返回结果(可能是judge手抖了),buj要时刻关注,及时返回结果。 11.pc2reset是清空所有数据用的,使用过后所有的比赛都会消失不见,慎用。 12.我们在win下从来就没有配置好题目过,所有返回的结果不是WA就是ERROR,建议全程使用ubuntu,不要给自己带来不必要的麻烦。人生苦短,我用ubuntu。 13.不是开玩笑,重启确实可以解决很多莫名其妙的问题,重启不行就加上sudo试试看(linux的权限问题,也可以用chmod +x,不过sudo更简单不是吗),评测有问题就在admin端重新加载一遍数据,ef时间对不上重启就好,board数据对不上重启就好,总之及时发现问题,及时reload。 14.比赛结束后尽快备份数据,滚榜和admin让两个人来做吧,尽快备份数据以免发生什么意外。//服务器被热心的志愿者收走之类的 研究pc2时遇到的问题 Q1.如果提交的代码没有用cin,scanf之类的开启输入流,autojudge会卡死 A1.未解决,因为后来都用人工judge,没有再出现这个问题了 Q2.pc2自带的打印气球一直连接不到打印机(不过邮件服务可以用) A2.使用balloonUtil-1.1.0(icpctool) PS.pc2打气球更多信息,详见pc2根目录下的\samps\scripts\loopprint或者咨询刘老师 Q3.balloonUtil-1.1.0出现未知bug,在一次测试中遗漏了至少一个气球。 A3.每半个小时人工比对一次已经出现过的发气球请求和目前的榜单,补发漏掉的气球。 Q4.autojudge会在某些代码编译的时候卡死 A4.卡死就重启,返回RE。 Q5.special_judge按照要求配置好后无法使用 A5.admin里面special_judge的默认参数前面没有"./",在ubuntu下不能开启脚本,加上就好。//win下没有测试过 Q6.TLE没有算罚时 A6.admin里judgements标签下TLE的名字和judge对TLE的描述里面的名字不一样,多个横杠吧,所以就默认算在CE中,而 CE不算罚时,删掉改对就好,然后rejudge之前的。 PS:罚时在admin-setting-Edit Scoring properies中设置 热身赛前夜遇到的问题 Q1.pc2judge打不开 A1.可能是评测机指定路径下没找到指定文件。 Q2.提交标程返回被评为WA A2.1.数据文件的名字里有空格//这样会导致judge把文件名当作两个参数而导致出错 A2.2.可能真的是标程有问题,比如java的程序要求文件名和类名一致,但是标程文件名惨遭修改。 A2.3.格式错误,标准答案末尾看新没有另起一行,但是实际上末尾已经有一个'\n'了,不要手贱去动数据。//ubuntu下文件末尾一个'\n'不会显示换行,两个会显示一个新行。。。。所以肉眼看得像是没有换行 A2.4.错误的限制了输出文件大小,pc2默认是512kb(admin-setting中设置),这里应该修改,让他大于最大的.ans文件大小 Q3.pc2打不开 A3.加上sudo试试看,当前目录下有没有ini文件,site开了么。 Q4.fork炸弹之类申请调用很多计算资源的没法限制,会卡死评测机。 A4.遇到稍等,不行就重启,记录runid,返回re,如果是恶意代码,警告或者禁赛。 Q5.有的run的状态是“Being_Rejudged”但是没有任何一台评测机在评。 A5.可能是曾经卡死评测机的程序,在评测机重启的过程中迷失在进程里了,管理员edit它返回RE勾上delete就行 Q6.想finalize比赛但是提示所有的run都需要被judge才可以结束。 A6.去run标签看看是不是有的run的状态是“Being_Rejudged”,然后参考A5 热身赛遇到的问题 Q1.balloonUtil-1.1.0(气球打印用的icpctool)在开场半小时左右不工作了。 A1.人工对比 Q2.有选手说我们judge端不支持C++11 A2.需要在language标签设置下,pc2默认是不支持的。 Q3.装好的纯粹的codeblocks默认是没有自动换行的,默认不开启C++11 A3.选手自行手动配置下,或者找志愿者。 Q4.有选手问我们stack有多大 A4.官方派来的裁判说pc2默认是8Mb PS.如果需要改,可以在编译参数那儿改。 现场赛遇到的问题 Q1.ef中出现错误数据 A1.发生机制不明。。。不过如果发现ef左上角的时间和admin的时间不同,就重启一次,然后发现数据没问题了。。。。好迷啊 Q2.代码打印出了问题。 A2.待解决。 Q3.比赛时间到了Stop后无法Finalize,提示依然有run没有judge完。 A3.手动del掉being_rejudge的“死run(就是评测机卡死重启后遗留的run)”,如果还提示有,只能手动在导出的xml文件后面添加标签,详情参考resolver使用指南。 未解决的问题 Q1.我怀疑site2不是让比赛分布式,而是可以备份比赛,site1由于某些原因突然offline的时候,比赛也可以基于site2继续,请后人做实验验证 Q2.pc2ef与当前进行的比赛不同步。。。虽然重启后解决了,但是不知道发生机制 Q3.开启比赛时候ef不能访问,现象是访问后闪一下就失去连接。。。不知道为什么。。。是不是在哪儿设置的 Q4.pc2的各种导入导出没用过。。。后人研究研究完善下,为了数据完整性我们把整个/home目录拷走了23333 Q5.在problem的Datafile选择“Copy”开头的那个,据说是通过网络传输答案到评测机而不需要人手拷贝,实测确实方便很多,但是不太确定是只会拷贝一次还是在每次run的时候都会重新拷贝,害怕在比赛时候出问题就没用,有条件可以测测。//以pc2所有设置都是实时生效的尿性,真的担心是每次都重新传。。。 Resolver使用指南 Resolver是一个ICPC Tool,Worldfinal的御用滚榜工具,可以从https://icpc.baylor.edu/icpctools/上下载到 本文基于resolver-1.1.0编写,入门级教程,轻喷。。。 //里面的->不是命令行,只是方便记忆用的流程而已 比赛结束后用pc2ef导出enevtfeed,保存名字为data.xml 备份一份data.bak data.xml -> data.xml(no team,have winner) , pre_team_CN , suf_team /* 如果比赛无法终止,手动在末尾</contest>标签前面添加(注意更改标签间的数据,timestamp为最后一个run的timestamp) <finalized> <comment>Mr.test</comment> <last-bronze>114</last-bronze> <last-gold>19</last-gold> <last-silver>57</last-silver> <time>0</time> <timestamp>1477156621.093</timestamp> </finalized> worldfinal冠军默认为世界冠军,很尴尬,我们需要手动添加冠军 在</finalized>标签后添加(注意更改标签间的数据,<team>标签里是冠军队的编号,提前在board里看清楚) <award> <team>182</team> <type>winner</type> <citation>Champion in ICPC Shengyang site</citation> </award> 把不打星的队伍的信息全部剪切出来(所有的不打星的队伍的team标签)放到pre_team_CN中 如果本来队伍就是英文名,这一步可以省略。 把打星的队伍的信息全部剪切出来放在suf_team中。 */ pre_team_CN -> pre_team_EN //使用替换工具把信息中的队名全部换掉,新的文件存在pre_team_EN中//替换工具具体的请往下看《替换工具使用说明》部分 pre_team_EN data.xml -> data.xml //把英文的不打星的队伍信息放在data中,保存 data.xml --awards.bat-> re.xml //打开awards.bat选择load local event feed从data.xml中获取数据 //添加medal,和first to solve,保存到re.xml中(这一步需要什么添加什么,不要选worldfinal,因为他的冠军是世界冠军hhh) re.xml suf_team -> res.xml //把打星队伍信息加到re.xml中,另存为res.xml中获取数据 //这样就实现了打星队伍不参与颁奖,但是可以滚榜 现在给出一个res.xml的例子,这是沈阳热身赛的真实数据,大家可以自己玩玩看。 http://pan.baidu.com/s/1kUMSJYJ 然后在命令行中输入resolver.bat res.xml --info就可。 (如果需要1/4屏幕显示,则在末尾添加 --display 2指令就好) 滚榜过程中,+-可以改变速度,q是退出,12是快退快进,空格键是下一个(但是不知道为什么正式赛的时候12不管用了。。。) 替换工具使用说明该工具基于Python2.7开发,Python3无法使用 待替换文本放在a.txt,字典的key放在ma.txt,字典的value放在mb.txt,结果会输出在out.txt中 调用时不用加任何参数。 该工具开发者为NEU_QSC,感谢他的付出。这是他的博客传送门 鸣谢 感谢裁判组不辞辛劳的5h待命手动judge。 感谢周子群学弟认真通读英文guide给予宏观上的指导。 感谢其他NEU_ACMer,志协志愿者们,学校领导与老师,ICPC委员会的大力支持。 最重要的是感谢参赛选手们的包容与努力,你们的认可和成绩,是我们前进的动力,相信ACM系列比赛会因为诸位越来越好,谢谢。1 #coding: utf-8 2 import codecs 3 def load_file(file_name): 4 with codecs.open(file_name) as f: 5 return f.readlines() 6 7 def get_ans(file1, file2, file3): 8 list1 = load_file(file1) 9 list2 = load_file(file2) 10 list3 = load_file(file3) 11 ans = [] 12 tot = 0 13 for x in list1: 14 tot += 1 15 if tot == 131: 16 #import pdb 17 #pdb.set_trace() 18 pass 19 for idx in xrange(len(list2)): 20 src = list2[idx][:-2] 21 desc = list3[idx][:-2] 22 x = x.replace(src, desc) 23 ans.append(x) 24 return ans 25 26 def save_file(list_in, out='out.txt'): 27 with codecs.open(out, 'w') as f: 28 f.writelines(list_in) 29 30 if __name__ == '__main__': 31 list_in = get_ans('a.txt', 'ma.txt', 'mb.txt') 32 save_file(list_in)
查看原文:http://chilumanxi.org/2016/10/25/pc2%e4%bd%bf%e7%94%a8%e6%8c%87%e5%8d%97/
PC^2使用指南
最新推荐文章于 2024-04-15 20:58:18 发布