0x00 前提

自从2015年WeJudge(亦简称为OJ)第一个版本面世以来,经历过两次比较大规模的重写。为什么是重写不是重构?因为代码写的很烂。目前的3.x版本是最好的一个版本了,但无论是从技术层面来看,还是从产品层面来看,它都还存在很多很多的问题。基于这些问题,加上我对个人成长的期望,我希望能从现有的基础出发,开发一套代码判题服务实现的解决方案。这个项目会以BSD协议开源,同时,判题机程序deer-executor会以GPL协议开源。开源是希望能够和大家分享交流,希望知识和成果要属于大家。

0x01 反思

先从技术层面上谈谈现在的WeJudge。技术选型方面,3.x版本[……]

继续阅读

原文作者: 阮一峰

这是阮一峰老师关于RSA算法的一篇很有名的文章,文章对RSA算法的原理讲解的比较细,内容通俗易懂。如果你对密码学感兴趣,本文绝对是值得一读的!原文分了两节,我都整理到一起了,删去了一些失效的链接,并且使用LaTex重新整理各个数学公式,让你更加方便阅读。

原文链接:
http://www.ruanyifeng.com/blog/2013/06/rsa_algorithm_part_one.html
http://www.ruanyifeng.com/blog/2013/07/rsa_algorithm_part_two.html

——小七

如果你问我,哪一[……]

继续阅读

传统的评测模式下,判题机按照固定的顺序执行:运行被测程序,获取运行结果,比对结果数据。由于是严格比较,结果数据和答案属于有任意一个字节(除常用格式字符外)不匹配,都将被判定为WA。

有些时候,这种方式太过于苛刻。在涉及到浮点数运算的题目,如计算圆的面积时,我们不得不面对计算结果的精度误差,这将导致原本正确的程序,被判定为WA,显然这不符合我们的逾期。

在特殊评测功能还没能设计开发出来之前,我们通常的解决办法是固定使用一种数据类型出题,比如要求选手使用double来存储浮点数,这样可以确保最终打印的小数精度和我们设定的答案一致。

我们知道,数据检查工具是判题机的一部分,那么是否能让判题机支持调用出题者编写的数据检查工具呢?

[……]

继续阅读

0x00 获取运行结果

上两篇文章,我介绍了判题机是如何管理进程,并如何限制进程的资源使用。目标程序运行完毕退出后,我们的判题机进程将从等待中唤醒,进行运行数据的收集工作。此时,判题机能够作出判断的状态分别有AC(暂时)、TLE、MLE、RE和OLE。

从进程篇我们可以了解到,WIFSIGNALED(status)可以判定进程是因为收到系统信号而终止的。此时,再使用WTERMSIG(status)获取到进程的信号,根据信号的不同来判定运行状态。

0x01 获取时间、内存使用情况

首先,我们来了解rusage结构体的定义:

其中,计算时间和内存占用的算法如下所示[……]

继续阅读

0x00 资源占用

一个完整的判题机核心,不可避免要支持程序的资源占用判定。我们常以两个维度来判定一个程序的优劣,时间维度和空间维度。在ACM-ICPC比赛里,通常每道题目都有一个期望的最差运行时间,和最大内存占用。如果你的程序算法效率足够高,便可以很快的运行完某个测试数据;如果你的算法效率不够优,也许还可以通过使用内存来优化,但难免会造成内存占用。

一旦程序超出了预期,如运行过慢、陷入了死循环或内存占用太多,判题机核心的工作就是结束掉它,并收集它的信息,再给出相关的出错提示。

从上一节我们可以了解到,wait4()函数可以返回一个rusage结构体,我们可以完成对它信息的收[……]

继续阅读

https://www.zhihu.com/question/390424213/answer/1179758442

今天是WeJudge3.0项目2018年立项开发以来,举办过的最大型比赛了!

本次网赛迎来了广东省各大高校的诸多高手同台竞技,充分展示了各位选手的实力。早上8时开始,不到10分钟,就有6题被拿了一血,不到3小时,排行榜首过15题了!(吐槽一下出题人,怎么出的这么简单;-)截止至晚上8时整,共1196名同学至少过题一道,有19道题被拿一血(总共20题,其中E题无人过题),排行榜上第一名是来自华南理工大学的郑炜城同学,恭喜!

凡事没有一帆风顺,作为WeBug系统([……]

继续阅读

不过是去便利店买了个泡面,居然穿越到了异世界。一次意外的去世,发现自己拥有了死亡后读档的技能…原来,世界线分支交错复杂,不同的世界线里发生着不同的故事…

0x00 进程

进程(Process)是计算机中的程序关于某数据集合上的一次运行活动,是系统进行资源分配和调度的基本单位,是操作系统结构的基础。在早期面向进程设计的计算机结构中,进程是程序的基本执行实体;在当代面向线程设计的计算机结构中,进程是线程的容器。程序是指令、数据及其组织形式的描述,进程是程序的实体。

来自百度百科词条

进程就像是一个个世界线的分支,各自发生着不同的故事,但又是相互关联的。

我们运行[……]

继续阅读

姐姐大人,姐姐大人,你用过在线代码评测工具吗?
蕾姆,蕾姆,用过呢,真好用,给我也整一个……

0x00 我为什么要开发OJ?

在线判题系统(Online Judge)是一种在编程竞赛中用来测试参赛程序的在线系统,也可以用于平时练习。

相信参加过ACM-ICPC、IO的童鞋们都对它不陌生吧,那个偶尔让你产生许许多多的小问号,想AC却又不停的WA,做题做到停不下来的系统。

五年前,作为前ACM校队队员,在深感自己太菜的技术后,一次突发奇想和老师讨论起了怎么把OJ用到教学中去,让学弟学妹们也被折腾一下(这句划掉),从此给自己挖了一个巨大的坑。

0x01 OJ是怎么[……]

继续阅读

0x01 前言

  跨域是前端开发中一个老生常谈的问题。 当今日益复杂的应用场景下,经常会遇到在不同子域名下的不同Web应用访问同一个专用API服务的情况。然而出于安全性考虑,非同源的Ajax请求会被浏览器拦截,导致这一请求失败,无法正常工作。

0x02 跨域策略

  什么是同源?为什么Ajax只能同源访问?

  所谓同源,是指“协议+域名+端口 ”三者相同,即便两个不同的域名指向同一个IP地址,也非同源。以下域名均互为不同源:

  同源策略(SOP, Same origin policy)是一种约定,由Netscape公司1995年引入浏览器,它是浏览[……]

继续阅读

重新开了个系列,此文废弃。

https://www.lanrongqi.com/2020/07/online-judge-development-0/

0x00 背景

WeJudge 3.0 第一期工作已经基本上完成了,平台初步完成了题库模块、判题模块和教学系统(课程模块、作业模块)的开发并进入内测阶段。本文根据内测阶段系统工作情况的反馈,就判题模块反映出的问题,整理相关技术方案,讨论一套更加合适、高效的判题模块设计方案

0x01 判题

关于代码判题,WeJudge判题内核采用的方案为简单黑盒测试。原理是通过对目标程序输入特定的测试数据,获取运行结果并与预定数据进行比对匹[……]

继续阅读