历时一个月(注:断断续续)开发的 SDOJ 2.5 eXtensible 终于完成了!!!这也是我为九中开发的最后一个 Online Judge,以后估计就不会再有什么大规模的修改了。说来这个 SDOJ 的开发真是很漫长,从 2009年11月开始规划到现在已经快三年了,期间我开发了两个版本的 SDOJ:第一版最初还不叫 SDOJ,叫做 SDNOI,甚至还有个名字叫做 OJSSDOI(Online Judge System for ShuDe Olympiad in Informatics,还好没用)。这一版在 2010年7月搞定,版本 1.0;第二版在高二下期规划(在我的相册里有一个相簿里存放的就是当年手写的规划书),在 2011年12月搞定。之后我对 SDOJ 1.0 进行了修改,将后台服务由VB6改为了由Delphi编写,版本也变为了 1.1。
SDOJ 的前两个版本各有各的问题。第一版开发时没有经验,完全是白手起家,仿照之前使用的 Vijos 进行开发,但由于 HTML 开发能力太差,因此整个界面非常粗糙,功能算得上是 Vijos 的精简版,且所有的功能都是定死了的,没办法进行扩充,也不方便管理。后台方面也基本如此,评测核心参考了 cena 的几句核心代码(注:真的只有几句哦,其他部分是我自己写的),其他的一些操作从网上找了一些,最后拼凑出来了。后台服务写不来,在网上找了一个现成的,修改了一下就直接拿来用了。在网站访问 SQL 数据库方面,我为了防止密码泄露,将所有的数据库操作代码封装在由VB6编写的ActiveX组件中,这个导致后来我修改功能时工序繁多,非常不方便。鉴于以上原因,我进行了第二版的开发。
SDOJ 2.0 eXtended 正如其名,Extended,被扩展的,是在SDOJ 1.0的基础上进行功能扩展而开发出来的。这个版本统一了网站管理功能,使之不再混乱;增加了权限分配功能,细化了各种管理权限,能应对不同的需求;增加了记录动态刷新功能;增加了用户分组功能(即团队,之前只能选择由系统计算出的校区和年级);增加了统计功能;支持编译器扩充。为了安全,我把上一个版本中控制评测服务的功能去掉了。但 SDOJ 2.0 依然采用了ActiveX管理SQL的方式,到后来这个功能越来越不稳定,经常出错,害得我大片大片地写“On Error Resume Next”。。。但让我满意的是SDOJ 2.0后台全部采用了Delphi编写,极大地增加了其稳定性。
再后来。。。就是现在的 SDOJ 2.5 了。由于我不可能一直维护 SDOJ,因此我必须将其做得稳定且容易修改维护。于是我将原先ActiveX的内容全部转写为了ASP代码,从而完全取消了由VB6编写的网页组件,使网站能够变得更稳定。但是如果只用ASP的组件,则显得不太安全,例如ASP里的 OLE 对象,如 Scripting.FileObjectSystem 和 WScript.Shell,这些组件 SDOJ 需要,但也可能被入侵者利。因此又用Delphi封装了上传、文件操作和解压功能。虽然它也是ActiveX组件,但它不用经常修改,能稳定使用就行了。至于ASP自带的组件,将它们卸载就行了。
以前 SDOJ 的后台评测服务都运行在 SYSTEM 权限下,一旦有人提交了精心构造的恶意代码,就会非常麻烦,因此这个版本后台评测系统我是全部重写了的,采用了 LogonUser + CreateProcessAsUser 的方式,将被评测的程序运行在 Guests 权限下,使之很难对系统造成破坏。
下面是 SDOJ 2.5 的一些特色功能:
2)增加了用户站内消息发送功能。用户能够在站内互发消息,消息的显示方式类似于聊天界面。
3)编译器。SDOJ 2.5 能够添加不同的编译器,设置不同的编译命令,添加编译错误提示的翻译。
4)详细的题目筛选功能。
5)代码评测详细结果反馈。评测器会返回每个被评测代码中每个测试点的运行情况。
6)完善的权限管理机制。
7)两种结果比较模式。这两种模式分别是宽松比较和严格比较,它们可以由系统指定选择哪种模式,也可以由题目自己强制指定。
8)提醒功能。系统能够自动提醒用户是否有新的消息,是否有新上传的题目待核审等。
SDOJ 2.5 eXtensible 将成为最稳定的一个版本。同时我也希望数的中学信息学奥赛协会能够发展壮大,强哥天天开心!