我这校区新的微机老师斗志昂扬,准备让我们这学校萎靡的信息技术竞赛重振雄风。然后有一次我半开玩笑地说建一个自己的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++(因为快又方便控制资源)。

5.Docker运行用户要用nobody什么的……

6.要限制文件读写大小,和母机互通的目录准备弄在一个挂载的限制大小的镜像里。

#绿色为20151101更新

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

3.其他的小问题

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

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

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

  1. hadoop研究:mapreduce研究前的准备工作

    继续研究hadoop,有童鞋问我,为啥不接着写hive的文章了,原因主要是时间不够,我对hive的研究基本结束,现在主要是hdfs和mapreduce,能写文章的时间也不多,只有周末才有时间写文章,所 ...

  2. 7z制作自解压安装包

    像7z和winRAR这样的压缩工具都支持制作自解压的文件.所谓自解压的文件就是不需要目标机器上安装解压工具,通过运行压缩包自己即可解压出压缩包中的文件.下面我们就介绍一下如何利用7z的自解压功能制作应 ...

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

    Phaser是一个简单易用且功能强大的html5游戏框架,利用它可以很轻松的开发出一个html5游戏.在这篇文章中我就教大家如何用Phaser来制作一个前段时间很火爆的游戏:Flappy Bird,希 ...

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

    U盘启动盘制作方法: 1.从网上下载最新的老毛桃U盘启动制作工具主程序并安装 2.插入U盘(制作启动盘前先保存好你的资料到其它地方,以防丢失不可找回) 3.插入正确的U盘后程序会自动检测到U盘,启动模 ...

  5. cocos2dx 制作单机麻将(一)

    今天開始打算解说下cocos2dx下怎样制作国标麻将 前半部分先解说麻将的逻辑部分,由于都是代码,可能会比較枯燥无聊. 这部分讲完后,你也能够用其它游戏引擎来制作麻将 后半部分,就解说余下的cocos ...

  6. 如何制作自己的R包?

    摘自 方匡南 等编著<R数据分析-方法与案例详解>.电子工业出版社 R包简介 R包提供了一个加载所需代码.数据和文件的集合.R软件自身就包含大约30种不同功能的包,这些基本包提供了R软件的 ...

  7. 制作Windows XP万能克隆镜像

    制作Windows XP万能克隆镜像 战前分析:对于Windows XP,制作万能克隆时的一个重要问题就是系统激活,因为Windows XP为了防止盗版,采取了激活机制,当硬件发生改变时,系统就会要求 ...

  8. Flask & Vue 构建前后端分离的应用

    Flask & Vue 构建前后端分离的应用 最近在使用 Flask 制作基于 HTML5 的桌面应用,前面写过<用 Python 构建 web 应用>,借助于完善的 Flask ...

  9. InstallShield详细制作说明(一)

    虽然网上关于InstallShield的制作说明已经很多,但是看的时候还是会有些晕乎乎的,不得不说很复杂.前段时候做了一次,后面需要升级,在重新做的时候发现有些地方自己又忘了,所以有必须将自己看的教程 ...

随机推荐

  1. ssh项目部署到weblogic中问题总结

    部署到weblogic还是比较费劲的 ,不过基本上问题全是由于classloader顺序的问题引起的. 首先在web-inf底下添加weblogic.xml文件如下 <?xml version= ...

  2. Vuforia图像追踪,动态创建的对象隐藏显示的坑

    刚做的一个项目,使用Unity3D的Vuforia插件进行图像识别,其中有动态生成的游戏对象模型,地形模型放在ImageTarget下,作为ImageTarget的子物体. 动态生成的敌人则有Pref ...

  3. TotalCommander 之 配置

    一.设置配置界面: 1.进入设置界面       点击菜单栏的配置,然后再点击配置里面的选项,便会出现Total Commander设置的界面. 2.设置字体 刚开始,大家会发现这不是我们熟悉的字体啊 ...

  4. PHP 去除HTML标签 HTML实体转字符 br转\n

    1.去除HTML标签 strip_tags(string,allow)//剥去字符串中的 HTML 标签,但允许使用 <img> 标签:$str =  strip_tags($str,&q ...

  5. iOS进阶篇索引,标记和自定义的table

    一.带索引目录的表视图 ①效果图 图1 带索引的列表 ② 数据源 本想获取通讯录中得名字,但为了用模拟器调试方便,就写死了数据,所以也只写了部分字母,总之有那么点意思就成 @interface Vie ...

  6. JavaScript对象属性(二)

    对象object  例子一: var car = { "wheels":4, "engines":1, "seats":5}; 例子二: v ...

  7. C# DataTable分页处理

    有时候我们从数据库获取的数据量太大,而我们不需要一次性显示那么多的时候,我们就要对数据进行分页处理了,让每页显示不同的数据. public DataTable GetPagedTable(DataTa ...

  8. Immutable api example

    var temp=[{name:"kitty",age:31},{name:"ff",age:22},{name:"kitty",age:4 ...

  9. C/C++源代码从写完到运行发生了什么

    有时候经常听到一些不明觉厉的词语,什么编译啊链接啊语义分析啊的,就找书来看看,把笔记画成了图: 编译器干了些啥呢,如下图: 参考书:<程序员的自我修养——链接.装载与库>,<深入理解 ...

  10. 来杯Caffe——在ubuntu下安装Caffe框架并测试

    Caffe是一种深度学习框架...blablabla...... Caffe要在ubuntu下安装 1. 安装依赖 sudo apt-get install libatlas-base-dev sud ...