OJ生成器(一)制作Online Judge前的准备和策划

我这校区新的微机老师斗志昂扬,准备让我们这学校萎靡的信息技术竞赛重振雄风。然后有一次我半开玩笑地说建一个自己的OJ吧,老师也就鼓励我去做了。

开什么玩笑……!我可是马上要参加NOIP的人!

于是老师说,慢慢来吧。

嗯,正好我也有兴趣,那就慢慢来吧。先策划一下。

然后我就被吓到了。

(注:以下内容纯属纸上谈兵,若坑了请善待><)

零、服务器何在

话说老师办公室里有N台学校淘汰下来的机子,用来做服务器再合适不过了,随便捉一台来装上Linux(学会Linux真是有必要),放在老师办公室24小时挂着,还不用交电费。

至于访问,暂时只准备学校内网用。虽然破掉了学校的总网关,可以映射端口,然而80端口被电信残忍地封掉了。准备以后要外网访问就用VPN连上我那VPS,VPS再反向代理让公网访问……

因为OJ还早,所以上面放了个App Inventor给FTC机器人竞赛的用。啊,物尽其用=。=

一、拿来,还是原创

首先我先搜索了一下现成的OJ。我是觉得Vijos、Codevs什么的相当精美好用,然而……不开源啊。

看上了一个叫hustoj的开源OJ,演示站点感觉还不错,然而——

真实效果丑哭了好吗!尤其是后台!绝对是我打开方式不对……

然后后台添加个题目,提交试试,然后是无尽的等待编译……目测是哪个服务没配置好。懒得检查了,反正我爱折腾,让我自己写个!

二、技术困难,和脑补的应对措施

建一个OJ,感觉技术困难还是挺多的……在这把能想到的列举一下,附带臆测的解决方案。其中部分借鉴了hustoj和网上(主要是知乎)的信息。

0.整个OJ的运行架构

目前我想的是Web+n个分离的评测机。当然Web也可能兼任一个评测机。

Web:PHP + MySQL

评测机:Python + CPP + MySQL

其中Web部分平台应该Windows和Linux都可以,而评测机应该不能跨平台,因为调用的系统API不同。想了想决定评测机放在Linux平台,主要是Linux服务器更主流,开发时网上资料多些(对我这技术渣Google是必备的)。而且安全方面也好操作些。

1.OJ运行流程

目前想象的是这样:

用户提交-->Web界面-->Web服务器在数据库中新建评测-->Web服务器找到应轮到的评测机,下发评测指令和相关数据(用户代码、标准输入输出)-->评测机开始评测,向数据库写入结果-->用户在Web界面获取结果

上面是我乱想的……真的OJ是不是这样也不清楚……因为我只看了hustoj的一点点代码。

2.安全问题

这是个重要问题……要是来一发恶意代码,整个网站挂掉了……甚至服务器完全沦陷。俗话网上说得好,毕竟别人写代码给你运行,就算限时1秒都能干很多事了。

现在对于这个重大问题,我的方案是:

0.首先,必须在fork时限制使用的内存和CPU时间,然后禁止网络访问,权限给它弄到几乎为0。

1.然后,听闻Docker的大名,虽然我到现在一次都没有用过……准备把程序放在Docker里面,只留一个读写评测数据的目录和母机互通。

2.如果Docker启动速度非常快的话……那就每次评测都重启一次Docker虚拟机。

3.如果Docker启动速度没那么快……那就要在母机程序中加一个监测的,状态不对再重启虚拟机。

4.母机程序准备用Python(因为好写),虚拟机内程序用C++(因为快又方便控制资源)。

然而以上纯属臆想……我是否方了还需时间验证……(〃∀〃)

3.其他的小问题

其他还有一些小问题,比如如何监测评测机的在线状态,挂了自动转移……还有Web界面让我这个美工废怎么动刀……

但这都是小问题了,毕竟专业挖坑三百年,只管挖坑不管填(つд⊂)

时间: 2024-10-20 14:10:29

OJ生成器(一)制作Online Judge前的准备和策划的相关文章

(转)discuz教程:制作网站模板前必须了解的界面结构(页头页尾模板文件)

页头文件路径:template/default/common/header.htm header.htm文件二次加载的文件有: template/default/common/header_common.htm 全局公共文件     |--该文件中包含了页面TITLE,对浏览器的申明,以及全局必须存在的基本代码,所以不建议新手修改此文件 template/default/common/header_diy.htm DIY模式时加载的DIY浮层菜单template/default/common/m

cocos2dx 制作单机麻将(一)

今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos2dx部分, 由于要把这部分留到后面讲,主要是还在考虑用3d做还是用2d做. 到最后能够扩展AI部分的机器人 和 server模块 麻将逻辑1. 打乱麻将顺序(初始化牌堆) 国标麻将共同拥有144张牌 #define MAX_REPERTORY 144 先把全部的牌放入一个常量数组中保存 每种牌都是

DIY PCB电路板制作(简单方便快捷)

原作者:步云天地 平时我们自己画了PCB板,但是出于价钱考虑,又不想发出去打板,或者不知道自己画的板是否存在问题,或者自己想DIY一下....(或者..自己想吧...嘻嘻) 过去有感光干膜,金属蚀刻制作,现在我针对感光干膜制作说一下制作过程,,原因是感光干膜制作相对于前两张成本较低些,但是步骤多一些,不过这不重要,相信看了下面的讲解之后,一定会......... 好了,,话不多少,马上切入主题::::::::::::: 首先介绍下制作的材料准备:   产品 数量 单价 金额 1 感光蓝油100克

7z制作自解压安装包

像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应用程序安装包. 熟悉应用程序安装的朋友应该清楚,安装一个应用程序真的是可简单,简单到很简单,也可以复杂,复杂到很复杂很复杂.简单的诸如把几个文件放在一起打个压缩包,解压到目标机器就行了.复杂些的诸如vistual studio和office的安装,要安装这些工具对windows来说可谓是”伤筋动骨”

制作U盘启动盘及安装操作系统的方法

U盘启动盘制作方法: 1.从网上下载最新的老毛桃U盘启动制作工具主程序并安装 2.插入U盘(制作启动盘前先保存好你的资料到其它地方,以防丢失不可找回) 3.插入正确的U盘后程序会自动检测到U盘,启动模式用默认USB-HDD即可,然后再单击下面的“一键制成USB启动盘”按钮 4.在弹出的“警告”确认对话框中单击“是”按钮继续 5.随后程序主界面下文显示“正在写入启动文件”的字样,此时一定不能随便碰到或拔掉U盘 6.稍等一会即可看到成功的提示对话框,按提示拔掉U盘再重新插入即可. 7.之后即可用此U

用Phaser来制作一个html5游戏——flappy bird (一)

Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希望大家看后也能做出自己的html5游戏.大家可以先点击这里来试玩一下我已经做好的这个游戏,感受一下Phaser的游戏效果,游戏的完整代码我已经放到github上了.支持的浏览器:IE9+.Firefox.Chrome.Opera.Safari以及移动端的能支持html5的浏览器,推荐使用谷歌浏览器,

SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作)

SWF在线绘本批量制作高质量PDF的新方法(重点在批量制作) 2012-12-21  未来决定... http://www.ebama.net/thread-107643-1-1.html 含笑 发表于 2012-12-10 13:51 请教楼主,如何进行压制?是用什么软件吗? 虚拟装载DVD后DVDdcrypter分割提取VOBdgindex制作工程文件和分轨Megui+avs压制mmg封包 具体的教程和软件,TLF小组出过一个打包文件,全在里面了 字幕的话各种情况提取办法不同,图片字幕用su

Windows Server 2008 R2模板机制作(VMware Workstation)

本文主要是针对于VMware Workstation平台制作Windows Server 2008 R2模板机的,制作模板机前需要在VMware Workstation中安装好了windows server 2008 r2后再操作如下步骤: 1安装vmware tools 选择虚拟机--安装vmware tools根据提示打开光盘驱动器,选择典型安装即可.一路点击下一步完成后重启即可. 2.关闭防火墙 开始--控制面板--系统和安全--防火墙--打开或关闭防火墙--关闭所有防火墙 3.网卡设置中

游戏制作大致流程粗谈之三

这次的粗谈主要细谈游戏策划的七大步骤(来源文库) 一:立项报告 1:了解公司现有的技术资源和技术能力. 2:分析目标消费群体,确定游戏风格 3:确定基本玩法玩点.故事背景. 立项报告讨论通过后方可进入下一个阶段 二:项目初期策划文档 1:游戏类型说明(游戏构架) 2:世界观设定(剧本) 3:玩法玩点详细分析及总结(提出游戏元素并分析) 4:预计开发周期(包括策划.技术分析.代码编写.美工.内部测试.公开测试) 5:提出开发小组人员构成名单 6:工作量预估(按工时预估个人工作量) 7:分析宣传方法