Browsed by
Category: PHP

PHP

[看着不爽] NEUCrack 替代掌上东大的网页端查询工具

[看着不爽] NEUCrack 替代掌上东大的网页端查询工具

不得不吐槽一下, 学生竟然需要为了查询寝室班级信息而去下载一个只会用一次, 没错只会用一次, 的软件, 叫掌上东大 因而本着造福大家+宣传我网络部+自己闲着没事玩玩这三个原则, 将掌上东大给实现为了一个网站   传送门 16级的目前还不能查询到自己的信息, 无论是用我这个web还是用app都不行, 目前登陆的时候,你们会看到这样的提示 而当大家信息可以查询的时候, 就会变成这个样子   可以查询掌上东大能查到的各种信息, 主要是给新生使用的 因为这些信息对于13 14 15级的没有什么用= =   下面上几张使用截图      

Gitlab DroneCI 配置记录

Gitlab DroneCI 配置记录

OJ的代码越来越多了, 功能也越来越多= = 也就导致bug越来越多, 测试的必要性就很高了, 因此我们需要用 CI平台鞋好的代码进行及时的测试, 因为OJ的代码是私有的,不能直接用DroneCI 或者是 TravisCI, 因而自己需要搭建一个DroneCI,具体操作如下, 根据DroneCI 官方文档说明  gitlab配置droneCI还有点麻烦, 之间也真遇到了几个坑= = 因此纪录一下过程 服务器端使用CentOS 首先安装docker, 并且 fetch DroneCI的镜像image到本地, 这就是一个基本的DroneCI环境了 根据DroneCI的说明 , 在  gitlab里首先创建一个application Oauth 接口,  配置为 Callback URL:即DroneCI所在的auth URL :http://202.118.31.226:3322/authorize这里为这个 然后会生成application id ****(A) 和 application secret *****(B) 将这两个写在 DroneCI Server的 /etc/drone/dronerc内 分别对应 A=> client_id B=> client_secret 注意REMOTE_DRIVER为 gitlab REMOTE_CONFIG为 http://example.yourgitlab.com?client_id=A&client_secret=B 然后将 这个保存为脚本 sudo docker run \ –volume /var/lib/drone:/var/lib/drone \ –volume /var/run/docker.sock:/var/run/docker.sock \ –env-file /etc/drone/dronerc \ –restart=always \ –publish=80:8000 \ –detach=true \ –name=drone \ drone/drone:0.4 然后运行脚本之后, DroneCI就搭建好了~…

Read More Read More

[NEUOJ日记] #1 Hello World

[NEUOJ日记] #1 Hello World

写在前面: NEUOJ的开发即将满五个月, 算是我在大学阶段做的最大的一个项目了(因为搞ACM的缘故没有在大一大二做什么项目出来) 在开发过程中遇到了很多问题  & 学到了很多东西, 谨以此系列文章记录开发过程以及开发心得体会 文章的格式: 每一篇文章都会以: 一个主标题 开头, 然后 分为多个副标题, 每个副标题后面会跟一个解释下面要讲的内容的commit-id Hello World Why we start (No commit id) 两年半的ACM生涯结束了, 老师征求我们对于重写OJ的想法, 我们队伍的大家早就有自己写一个OJ的想法了, 作为挖坑小能手的我 ( Qrz ) 本来还有点因为自己的时间+个人原因不是很想搞(其实内心是非常想搞的) 被两个队友拉着就果断入坑了, 我们想写出一个能够给大家一个梯度训练, 界面友好, 测评多样化, 符合当今Web开发潮流的新的Online judge 系统, 于是我们队伍+ sjm + wyf就开始了对OJ的开发, 最初的分工是 我们队伍搞 Web 后端开发, sjm 搞前端开发, wyf + 我搞测评端研究 How we design (No commit id) 开发OJ对我来说最陌生的就是测评后端的开发, 不知道如何下手, 好在老师给我们提供了一个开源的测评系统 domjudge, domjudge的后端judgehost已经非常完善了, 支持多语言多环境多测试样例的安全测评, 于是我们初期就直接使用judgehost来做我们的测评后端, 然后前端我们使用的是Bootstrap框架, Web后端使用Laravel框架, 然后我们初步设计了一下表的结构, 参考了hustoj的数据表结构 & 我们自己的表结构,对表进行了设计, 最初的表有   users: 用户登陆信息 problem: 题目相关信息 submissions: 用户提交相应信息 userinfo: 用户的详细信息,基本信息 (之后会在不同的阶段介绍表的具体结构…

Read More Read More

[NEUOJ] 测评后端分析 测评过程分析(judgedaemon.main.php)

[NEUOJ] 测评后端分析 测评过程分析(judgedaemon.main.php)

还没有整理, 先放生肉(Draft) DOMJudge 测评后端API分析 ==== ### 调用流程简介: 1. domserver存储有所有数据信息,包括测评必须的信息 2. domserver提供一套RESTful API供judgedaemon客户端调用, judgedaemon可以有多个实例同时运行 3. judgedaemon运行之后, 每隔一定时间向domserver的api请求数据, 如果有数据的话, server会返回给judgedaemon一个json包,包含要运行的judge所需要的所有信息 4. judgedaemon将信息解析之后, 制作出相应的程序执行,和编译脚本 compile.sh , run.sh 之后执行(可以选择在CHROOT环境下执行, 暂时没有考虑) 5. 执行后的结果通过参数和返回值的形式返回给judgedaemon , 之后judgedaemon将测评结果数据提交给domserver, domserver随即更新数据库内的信息 ### judgedaemon.main.php内函数分析 * dbconfig_get_rest * fetch_executable * judge * read_credentials * request * rest_encode_file * usage #### dbconfig_get_rest * arguments: $name: 用于表示想要get的配置的名称 * description: 获取服务器的配置信息 * retval 服务器的相应的配置信息 #### fetch_executable __核心函数,用于下载用户提交的代码,并且将代码编译, 生成运行测评的脚本run.sh 并且返回run.sh的绝对路径共后续调用使用__ * arguments: $workdirpath: 测评路径 $execid: 需要fetch的执行脚本archive的id $md5sum: zip的校验和 * description: 该函数根据提供的三个参数, 先检查是否本地已经存在运行本次测评需要的所有脚本(或者二进制文件), 如果不存在则从server 访问 REST/executable ,获取下来相应的execid对应的base64加密后的zip文件,解码,然后在本地的workdir/executable/$execid/下进行解压…

Read More Read More

[NEUOJ] 测评后端分析 judgehost文件结构分析

[NEUOJ] 测评后端分析 judgehost文件结构分析

NEUOJ的测评后端暂时使用的是domjudge 的 judgehost作为测评后端 下面分析一下judgehost的工作原理 首先分析一下judgehost的几个核心文件的功能 [这里省略了从clone domjudge repo 到编译安装好judgehost这个过程, 我认为来看这篇文章的应该都是已经可以自己安装好domjudge的人,不然可能这篇文章对于你来说还不适合阅读] 首先看bin下面的文件 runguard 是负责保证用户程序的安全运行, 不会对系统进行破坏的程序, 这个的代码利用了 rlmit, cgroup timeout等方式对用户程序进行限制 judgedaemon 一个php脚本, 测评后端的完整进程, 包括通过服务器下载数据, 到调用相应可执行文件对代码进行编译运行比对之后. 将结果返回给webserver的整个过程都是由这个程序进行的 runpipe: 用于在runjury(特殊的测评程序) 和 user program之间建立双向管道,进行交互式测评(目前只了解这些) create_cgroups: 在设置了enable_cgroup 的编译参数之后, 通过这个来创建domjudge的 control group, cgroup能够获得更精确的运行时间和使用资源情况 dj_make_chroot, dj_make_ubuntu_chroot: 用于让java程序可以在chroot环境下运行 再看etc文件夹下的文件 sudoers.domjudge: 这个文件配置好了 运行测评的时候的用户的sudo权限配置 common-config.php: 一些通常的config文件 judgehost-static.php: 通过make 和 make install生成的静态config文件,不要进行修改 restapi.secret: 里面存有向API请求的时候的API地址和认证信息 再看judgings文件夹 judgings文件夹下, 所有的文件都是测评的时候生成的, 他的第一级给每一个judgehost分配一个不同的文件夹,名字为 HOSTNAME-n  , 每一个judgehost都要以一个不同的用户来运行, 不然会产生问题 每个judgings文件夹下, 有多个endpoint, 每一个endpoint对应你再 restapi.secret里面配置的不同的名字 如endpoint-neuoj 每个endpoint下 , 有 这样的文件夹: c[n]-s[n]-j[n]  每一个文件夹内都是一次测评,如果这个测评之前被测过了, 重新测评的时候, 原来的测评会叫做 c[n]-s[n]-j[n]-old-timestamp , 除了每一个测评一个文件夹以外, 还有两个文件夹, 一个用于存从服务器fetch来的input output, 一个用于存从服务器fetch来的…

Read More Read More

空间红包谜题解法(Linux + base64 + HTTP Header + 摩尔斯电码)

空间红包谜题解法(Linux + base64 + HTTP Header + 摩尔斯电码)

题目 解密红包, 支付宝中文口令红包 (后来被人说二维码扫完还得用电脑重输一遍网址好麻烦 = = 于是我就把二维码对应的网址给出来了 : http://1.justquiz.sinaapp.com/voidmengmengda) —- 这就是完整的题干了, 谜题总共有三关, 个人认为难度是递增的, 下面放出每一关的解法 解法 * 第一关 首先看第一关的内容, 网页本身查看源码并没有什么用处, 不过注意到标题, “请用桌面浏览器打开哦~” 桌面浏览器(即Chrome Firefox) 和一般的移动端浏览器的区别就是, 桌面浏览器支持开发者视图, 可以看到更多详细信息, 除了看到源码, 我们还可以看到cookie session storage等东西, 也包括请求的header, 而这一关的线索就藏在了header里, 在服务器Response你的Request的时候, 会在header里带上下一关的线索,  之后我在空间里也对第一关进行了提示, 有十多人在提示之后到达了第二关QAQ 比我预期的少了很多 附上第一关解决的截图(点击可查看大图) 图中的 HintURL 就是第二关的线索   * 第二关 ( 列出服务器网站目录) 进入到第二关, 你会发现看到一个在线编译器, 以及这样一段提示想信息: Happy New Year~! Congrats! You have solve the first Challenge! See what you can find here Remember : This is a BUGGY online Compiler This is a BUGGY online Compiler 表示这个在线编译器是有bug的,…

Read More Read More

[被迫参加的hackathon] 在线编译系统开发小记

[被迫参加的hackathon] 在线编译系统开发小记

吐槽 因为某种原因我没有参加MSC举办的Hackathon, 不过我的部员们参加了 0.0 然后我本来想去蹭点Pizza之类的东西吃,结果(我感觉他们是给我诱拐过去了) 到了比赛现场之后告诉我, 这里封馆了 Orz 于是乎我就被迫开始写代码(连电脑都没有带只为了去蹭口pizza吃的我TAT[结果最后还没吃到pizza]) 实现的是一个简单的在线编译系统 TOC (Toy Online Compiler) 支持多种语言, 下面简单说一下实现的思路和核心的代码 实现思路 简单分析一下这个系统,由两部分组成 ,代码提交模块和代码编译运行模块 ,前者负责将代码交给后者,后者编译运行完毕将结果返回给前者,然后前者将结果展示给用户. 具体实现方式是: 代码提交模块负责将代码文件保存到服务器, 然后通过socket将消息通知到代码编译模块,然后代码编译模块执行完毕的结果再通过通信的方式传递回来, 很显然实现代码提交模块实现难度很容易,主要的问题在后者的编译模块的通信和编译问题, 下面给出编译模块的核心代码 <?php error_reporting(E_ALL); require_once(‘function.php’); require_once(‘queue.php’); require_once(‘actionclass.php’); $socketQueue = new actionQueue(); $socketQueue->initQueue(); $mainSocket = SocketOpen(); socket_set_option($mainSocket, SOL_SOCKET, SO_REUSEADDR, 1); while(TRUE) { if($socketQueue->len > 5)//Maximum count continue; //Do not accept create new socket $resSocket = socket_accept($mainSocket); if($resSocket != FALSE) { $socketQueue->push($resSocket); } if($socketQueue->isempty() == FALSE) { $currentSocket = $socketQueue->pop(); $rawMsg = SockRead($currentSocket); echo “Raw Msg is $rawMsgn”; if(Auth($rawMsg)…

Read More Read More

[Laravel] 配置phpstorm支持laravel语法补全

[Laravel] 配置phpstorm支持laravel语法补全

QAQ 不得不说,想使用我喜欢的vim来完美的做到larvel的智能补全太难了(以后自己试试能不能写出来插件吧QAQ*() 因此我回到了以前开发时用过的phpstorm, 给phpstorm配置laravel插件, 操作很简单, 不过要注意版本的兼容问题. 1. (其实没有顺序啦) 安装PhpStorm的Laravel Plugin 在phpstorm里连按两下Shift ,打开指令输入窗口,输入 Plugin,  选择 Install Plugin, 搜索laravel插件并且安装. 2.使用Composer 安装 laravel-ide-helper 这个laravel-ide-helper插件是我们要想让上面的插件实现补全的必备依赖, 如果不安装这个插件的话是没有办法使用laravel的补全的功能的, 而这个插件安装的版本要和自己的laravel版本配套 使用的是 4.2.*版本的laravel 需要安装1.11.*的插件 5.* 版本的安装2.*的插件 注意如果版本不匹配是不能安装成功的 , 会提示你缺少依赖   附上laravel-ide-helper插件的地址: Laravel-Ide-Helper

[Laravel] 使用artisan时遇到的问题 (更新中)

[Laravel] 使用artisan时遇到的问题 (更新中)

运行 php artisan migrate 的时候 报错(错误信息见下面) 的解决方法 报错信息如下 [IlluminateDatabaseQueryException] SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name ” (SQL: create table “ (`migration` va rchar(255) not null, `batch` int not null) default character set utf8 collate utf8_unicode_ci) [PDOException] SQLSTATE[42000]: Syntax error or access violation: 1103 Incorrect table name ” 这是因为配置里面少了 一个参数 “migrations” 的值, 加上这个参数 “migrations” => “migration” 之后问题就解决了 ~~~   执行db:seed 时,遇到问题(问题见下文) 主要错误信息: PHP Fatal error: Class User contains 3 abstract methods and must therefore be declared abstract…

Read More Read More

justQuiz!开发计划-1

justQuiz!开发计划-1

justQuiz Develop Plan justQuiz Develop Plan Table of Contents 1 STEP1 简易答题&判题(客观题)的实现 1.1 A 题目管理 1.1.1 Func1-添加题目到题库 1.1.2 Func2-用题库的题目组成试卷 1.1.3 系统初始化的实现 1.2 B 答题功能 1.2.1 Func3-抓取特定试卷的题目显示到答题区 1.2.2 Func4-判题功能 2 STEP2 支持题目上传附件 3 STEP3 支持用户注册,登录 4 STEP4 支持显示该套卷的分数分布 5 STEP5 人工批改功能的添加 6 STEP6 加入不同的答题模式 7 STEP7 UI优化 jQuery Bootstrap优化UI 8 STEP… 其它功能的添加 1 WORKING STEP1 简易答题&判题(客观题)的实现 1.1 WORKING A 题目管理 本阶段要实现题目管理的基本功能 及试题录入以及试卷生成 所有试题初期决定为存入同一个数据表,每一道试题包含的数据域有 PID 题目ID title 题目标题 body 题目内容 attachment 附件路径 为以后使用 isObjective 题目是否为选择题 isMulti 题目为单选or多选 item1 item2 item3 item4 item5…

Read More Read More