2019-11-02
0 comment

用 seccomp 去限制 Go 语言中的 ForkExec 所产生的子进程

本文所有内容均在 linux 环境下(Ubuntu 18.04)。 Go 提倡使用 Gorotuine 来替代系统所提供的 线程、进程,所以在语言中并没有提供直接 fork 或类似的方法。 只有提供了 ForkExec 及类似(包装后)的方法。 为了限制 syscall 的调用,go 语言只能使用 ptrace 进行捕捉后判断,这样使得效率会低下,(可以使用 time strace 做些测试)。那必然就要使用 seccomp,关于 seccomp 的一些东西可以看 开发OJ之沙箱 — syscall 限制; […]

继续阅读 >>
2019-08-02
0 comment

开发OJ之沙箱 — 改用 golang

Why go? 原因很简单,因为 go 好用。 OJ 的 web 端是用的Laravel,而其他部分打算用的是 Go ,虽然 go 能便捷的与 C/C++ 集成在一起,但是并不似很方便,如果涉及到指针也很容易出错,所以就考虑将沙箱也一起用 go 修改,如果以后心血来潮,做 windows 的支持,相比 C/C++ 语言也会方便的多。 改进了什么 Go 语言 为不同的系统提供了不同的API,在 Linux 下 亦有提供 getrusage,setrlimit 这类的API。 新的也考虑引入 cgroup这个资 […]

继续阅读 >>
2019-05-09
0 comment

Laravel + PHPStorm 开发中遇到的坑。。

开了个 项目 Oh-Laravel, 用来记录使用 PHPStorm + Laravel 过程中遇到的坑。 Laravel 好用是好用,就是一不小心就会遇到 bug。 PHPStorm 也好用,但在 git commit 的时候,居然有个文件并不提交,在 Travis 上进行自动测试的时候,死活过不了,最后在命令行中 git status 才发现问题。。。。 本文不怎么更新,都在项目里~~

继续阅读 >>
2019-04-03
0 comment

开发OJ之数据库表设计

因为数据库的表结构涉及到接下来的所有开发,前前后后已经想了很久了,还是尽快决定下来。 规范 MySQL表设计大致遵循 阿里巴巴Java开发手册,但做出了以下改变: 数据表名使用复数形式。 长字段定义:大于2048字节,如有同属于一个表内的长字段且逻辑上有一定关联,会被独立出来并归并到另外一个的表里,否则单独列为一个表,禁止索引任何大字段! 使用created_at, updated_at TIMESTAMP 替代gmt_create, gmt_modified DATETIME (嗯,我不管2038问题,这 […]

继续阅读 >>
2019-03-06
0 comment

开发OJ之沙箱 — 安装,使用

这段时间大部分在看Go语言的一些东西,为写 判题 和 判题队列管理 做着准备。这几天将 C++ 写的沙箱以动态链接库的形式与Go语言进行整合,这里记录一些遇到的问题。 大改 review 了代码之后发现 沙箱核心代码中并没有用到 std::string 的东西,为了性能就砍掉了一部分,将原有使用string的改为使用const char * , 但是在main函数中仍然在使用(为了偷懒。 接着是 Go语言只支持直接使用 C 的代码,这并不是说C++不行,编译成动态链接库之后, 提供一个C语言类型的接口即可, […]

继续阅读 >>
2019-02-20
0 comment

Laravel, Element 使用感想

寒假期间,花费了一些时间熟悉了 Laravel, Element 这两个框架,同时顺便看了 vue bootstrap 的相关内容, 并借写了 一个基于 laravel 的 训练计划 项目在此, 但并没有写完就弃坑了。这里记录一些遇到的问题。 Laravel 数据库中时间戳 laravel 的数据库部分有数据库迁移功能,可用于版本升级时,统一升级数据库,详细请看文档。 使用实例 <?php use Illuminate\Support\Facades\Schema; use Illuminate\Da […]

继续阅读 >>
2019-01-25
0 comment

开发OJ之沙箱 — syscall 限制

计算机系统的各种硬件资源是有限的,在现代多任务操作系统上同时运行的多个进程都需要访问这些资源,为了更好的管理这些资源进程是不允许直接操作的,所有对这些资源的访问都必须有操作系统控制。也就是说操作系统是使用这些资源的唯一入口,而这个入口就是操作系统提供的系统调用(System Call)【简写syscall】。Linux 提供的系统调用种类十分丰富,不乏一些危险的调用,例如vm86,这是我觉得最危险的系统调用之一,当然也有一些十分普遍的调用,比如read,write。 沙箱需要保护系统的安全,所以需要沙箱能控 […]

继续阅读 >>
2018-12-28
0 comment

开发OJ之沙箱 — 资源管理

资源限制是沙箱的重要的一部分, 另一部分是系统调用的拦截. 资源限制包括CPU时间, 内存, 写文件大小, 打开文件个数等等。 时间 时间限制 时间限制算是 算法竞赛 中要求最严格的部分了。 看了那么久的Unix环境高级编程, 一想到的就是拿setrlimit来限制;但是 setrlimit 不仅精度不够,而且他计算的时间是是CPU上运行的时间, 一来个sleep就不计入时间,这样很不好。看到老的judge_client是通过死循环不断看着的,我觉得不合适。参考了 QingdaoU/Judger 他们使用一 […]

继续阅读 >>
2018-12-16
0 comment

开发OJ之沙箱 — 设想和开始

学校现用的 OJ 是HUSTOJ的魔改版, 沙箱自然也是用的它的. 说为沙箱其实并不是很合理, 判题进程包含了构建沙箱这个东西, 他将所有的过程整合在一起, 使得二次开发不是很方便. 所以 专门 立了一个 SandBox 的项目, 新 OJ 将沙箱作为一个单独的项目独立出来, 以方便以后出现 bug 的修复. 我们并不打算考虑多平台, 开发过程中仅在Linux上进行测试, BSD 等 Unix 系统可能需要修改测试, 开发过程中 参考了 QingdaoU judger, EOJ judger, DMOJ j […]

继续阅读 >>
2018-12-09
1 comment

新 OJ 技术选型

这篇文章作为 开发 OnlineJudge 啊分类里 的第一篇文章, 将会阐述网站 数据库 Database, 网站后台 Master, 判题 Judger, 运行环境 Server 的技术选型过程. 构架 整个OJ可以分为 关系数据库, 内存数据库, 网站(后期前后端可以再分离), 判题任务队列管理, 判题机, 这五个部分, 每部分都可以部署在同一服务器或这多台服务器上, 必要时可以一个部分部署在多台服务器上 运行流程: 正常情况: 用户提交代码 -> 插入关系数据库 -> 网站通知队列管理 -> 队列管 […]

继续阅读 >>