欢迎访问
讨论版列表 - 本站建设 - 主题数: 15 | 文章数: 32 | 管理员: admin

本站建设

版面 | 文摘区 | 马克区

文章数: 1 | 分页: << 1 >>
admin
[回复] [修改] [删除] [返回版面] 1  
作者: admin, 讨论版: 本站建设, 发表时间: 2014-02-27 00:54:51 PST
标题: 如何写一个OJ (转载)
关键字:

在自己写了一个完整的OJ系统之后, 没有来得及总结心得.

现在在网上看见别人关于如何写一个OJ的讨论, 搬过来放在这里. 


1. 如何制做在线编译代码的网站

党文亮,http://fookwood.com
chqi LV、肆意雪、JeOam 赞同

前两天的课程设计上正好根同学一块儿设计了一个简单的在线比赛平台,而且平时也经常到网站上做比赛,就简单说下它的实现吧。

把代码提交到网站之后,将其保存成代码,在PHP或JSP中有调用系统命令的东西,如PHP中的exec函数。此时你需要一个判题的脚本,对得到的代码进行编译,运行,得到运行信息之后保存到数据库中,如在php中就可以写一个实现的语句:

    exec("./onj $destFile $file", $output, $verdict);
    //from onj project - Processfile.php - line 105

这就是调用判题功能,原则上可以用任何语言写。onj就是用python写的,对代码进行编译,运行和判断。它需要得到一个比赛题目的标准输入,将标准输出重定向到一个文件中,然后对标准答案进行对比,可以得出用户提交的代码是否能得出正确的结果。
这样的系统在网上好多了,推荐几个:
1. ONJ http://sourceforge.net/projects/onj/ php,代码十分工整,我很喜欢,中文支持不完善。
2.NEUOJ https://github.com/yangzhe1991/neuoj判题是用python写的。
3.HUSTOJ http://code.google.com/p/hustoj/国内好像用的比较多的,我没用过。

//自己写的太丑了,就不帖出来了。
这种比赛的网站搞ACM的人相对熟悉,如果有认识的人可以问问。


2. 怎样做一个 Online Judge(在线评测系统)?

怎样做一个 Online Judge(在线评测系统)?修改
1.需要哪些技术
2.操作系统的选择
3.开发步骤
4.其他需要注意的地方修改
举报 2 条评论 分享 • 邀请回答
按票数排序 按时间排序
3 个回答

大雄,ACM非职业选手,练了十道题就去参加比赛…
YanWei、陈经纶、李永刚 等人赞同

碰巧我做过
操作系统的话,windows和linux皆可,我当时用的是asp.net+windows,windows的“作业”是天生做OJ的好材料,不过win2003的作业貌似有bug不太给力,不过人工计时还是没啥问题的。linux也应该有类似的沙箱对象,如果没有的话,自己写也不是什么大问题。
主要需要以下东西:
1、关键是评判内核,找到合适的系统API去控制进程,限制空间、时间,熟悉运用管道、能获取进程的CPU时间等等,需要看系统API的书籍或文档,我当时是看的《windows核心编程》和msdn。
2、学会一门网站技术和数据库,windows上自然是asp.net+sqlserver最搭配,linux上就java/php+mysql比较普遍,这块问题不大。
3、安全性,这是OJ最大的问题,因为别人要在你的系统上编译程序并运行啊,这要是扔上来个病毒代码直接就挂了。安全方面主要是这几个方面:1)权限控制:要用低权限运行程序、有可能的话使用沙箱限制更多的权限;2)网站安全:要学会基本的防sql注入等;3)系统安全:管理好服务器,不过这个对学生来说可能难点,但是边学边做也还好;4)编译器修改:去掉不安全的.h和obj,这是个艰难的工程;5)源代码分析:定义一些危险关键字,找几个ACMer去实现词法分析&关键词过滤。
4、如果用户量大了或者做大型比赛的话,服务器上要做队列,最好再做多服务器评判,反正要做一个好OJ需要做的事情太多了,就不一一赘述鸟。
2012-07-10 添加评论

邓鋆,天地之灵,游戏程序员,引擎工程师,游戏…
龚子彬、大雄、宗涛 赞同

问题2:
推荐Linux。实在缺乏相关经验的话,windows也可以。

问题1:
1、选择一款你喜欢的web开发环境(PHP、J2EE等是难度较低的选择,有python经验的不妨用python)
2、熟悉你所选择的操作系统中,用于进程控制、获取进程信息的一些API(主要体现为内存用量的控制&获取和时间控制,结束进程、进程输入输出管道)
3、熟悉你所选择的操作系统中,用户权限的控制,确保任何人提交的代码都不会对服务造成伤害。
4、熟悉你的OJ所支持语言的命令行编译器(c/c++就基本是GCC/G++,windows平台想用visual c++就去熟悉里面的cl.exe, java就是javac等等)

问题3:
1、进行相应的初步设计
2、有一个人进行后端功能(除了Judge功能。主要是指各种涉及数据库的功能)的开发,设计数据库的表结构,设计与前端交互的数据格式,挨个实现各个功能,进行一定的单元测试,进行一定的自动化性能测试。
3、有一个人进行前端功能的开发。设计/制作所有的页面,编写CSS和JS,与后台交互
4、后端功能开发的人,顺带进行一些后台管理系统的开发:管理用户,管理BBS,管理题目,管理测试数据,管理比赛,等等等等……
5、有一个人进行Judge功能的开发。编译用户提交的代码,运行编译的结果,测试输出,返回结果

Judge可以做成独立的,也可以整合在后端内,取决于选择的后端技术。更建议做成独立的,便于在有重要比赛时动态增加Judge机器数目。这种情况下,可以直接用HTTP与后端通信。

需要注意的地方:
1、Judge如果用户量偏大,第一个最容易出问题的是数据库。想办法优化吧。
2、如果对外网提供服务,很容易挂在带宽上。如果服务器在学校,和学校的网络中心提前沟通吧。
3、一定要注意执行用户代码的安全!仅仅封禁头文件和库是不保险的,还要仔细研究编译选项,禁止各种做题所不需要的选项。设定用户权限是重要的一步,但依然还有被攻陷导致拒绝服务的可能。采用hook可以一定程度的解决,有必要的话,采用虚拟化的办法是一步到位的最安全措施。
2012-07-10 1 条评论

李绍开,程序员一枚,求推荐啊
JeOam 赞同
恰好我知道有一款开源软件 hustoj, 你懂的


--

最后修改: admin on 2014-02-27 14:20:38 PST
※ 来源: homecox.com  [来自: 66.]


Reply

Please log in first.