JCoder是一个正在不断开发迭代的Online Judge与课程管理平台。将来,我们希望JCoder成为一个不仅涵盖计算机科学而且涵盖数学,物理和许多其他领域的在线教学系统,并最终成为一个完整的在线教学终端。
- 使用Nodejs的React框架,采用fetch与后端交互。
- 使用Python的Django框架,使用Records,RabbitMQ,Redis等工具与数据库交互,保证数据安全并提高并发数。
- 使用RabbitMQ与Redis维护测评队列与结果。
- 分为内外两部分,都使用Python实现。
- 使用Docker作为外层容器。
- 使用某工具在Docker内部限制测评与编译进程。
在JCoder设计之初我们便考虑到管理员的体验,致力于让管理员更方便地修改各种设置。
您可以使用MarkDown语法设计题面并可以实时预览。点击保存后对题目所做的更改会立即生效,极大提高了效率。
此外,您还可以随时更新题目名称,可见性与测评限制(暂时不支持)。动态添加来源,标签,更新数据与Rejudge。
- 在提交页面,您可以删除或重新测试某一条记录。
由于JCoder提供了Coures,Team,Group等多级管理方式,管理员权限相互独立。可以提供更灵活的权限分配方式。
JCoder的测评端主要由三部分组成:Outter_Judger,Inner_Judger与Config。其中Outter_Judger负责与后端与数据库交互。由于多线程的使用,Outter_Judger也可以作为测评集群的管理端,负责统计与任务分发。
JCoder测评端从设计之初便有着全功能,分布式的设计思路。后端可以与多个不同的测评机建立连接构成分布式测评系统。
Inner_Judger受Outter_Judger的管控,运行在我们设计好的Docker镜像中。对于Inner_Judger的设计,我们参考了各种开源OJ,并结合大型商业OJ”luogu"的第四代测评机构建方法,设计出了兼具安全稳定与高效率的测评系统。在Docker内部,程序的运行与编译均由Inner_Judger全程托管监控。同时采用特殊工具与特殊指令限制了程序的内存使用,IO访问,CPU时间,REAL时间,输出大小,权限等级,网络访问......等。不仅如此,用户提交的代码在编译运行的全部过程中UID与PID均被锁定,进一步减少程序越狱的可能。此外,我们还通过change_root,cgroup等方式严格限制了代码权限。
正因如此,本测评机敢于支持**C,C++**测评,这两种语言可攻击的范围,防范的难度远大于java。
为了达到教学目的,本测评机也会限制一些奇技淫巧。例如多线程优化,编译优化等。
除此之外,通过自定义配置文件,测评机可以支持多种对比方式与评分标准。您可以自定义每一个测试点的得分与限制。也可以很方便地支持Special Judge。