Browsed by
分类:Projects

[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的数据表结构 & 我们自己的表结构,对表进行了设计, 最初的表有

 

(之后会在不同的阶段介绍表的具体结构  & 修改)

How we start(No commit id)

经过一周的讨论, 我们最后定下来了第一版的目标 先做出一个可以让用户提交代码(不管能不能测评)能看题的一个壳出来(虽然这个后来很快就实现了), 前端为 sjm 开始学习前端的知识(Bootstrap jQuery等等),后端为 accelercode队伍(即我们队) 我的另外两个队友都没有Web开发的经验, 因此给他们安排的任务是先学习PHP, 然后学Laravel, 在此同时我先开始熟悉laravel5(我之前用的是laravel4) 熟悉5之后, 开始建表, 建Model,建route, wyf 和 我的测评后端的任务是(刚开始没有让我搞测评后端, 我感觉搞OJ最有趣的地方就是测评后端了于是自己也主动去看了) 搭建domjudge, 并且研究judgehost的源码

Build the Domjudge(No commit id)

回去之后,我就开始了自己本地搭建domjudge的过程, 其中遇到了一些问题, 比如 archlinux下 jsoncpp头文件的名字和domjudge 的configure脚本里的名字不符,会导致就算安装了jsoncpp-devel还是找不到头文件, 这时候我在/usr/include/下面mkdir jsoncpp/json/ 然后把所有json/下的头文件拷贝到 jsoncpp/json/下 ,然后 再次configure就OK了 另外在下载源码之后没有configure文件, 需要先./bootstrap才行, 然而 bootstrap的时候会make 一次 latex的东西, 如果电脑里没有latex的东西, 你需要自己将 Makefile里关于latex的东西注释掉,也就是注释掉 make distclean下面的那一行,然后就可以了

Make the Plan for 1.0(931612-ffb28b)

这是我们的第一条commit, 在这个commit的时候, 我将大家拉入了我Bearychat的讨论组 NEUOJ-accelercode(private)

并且, 使用学校的gitlab 服务器 (219.216.96.46)对代码进行托管, 新建了 README.md 当时的计划如下:

 

然后为laravel工程建立了.gitignore, 并将laravel工程建好,配好了PHPStorm, laravel的环境, 配laravel的环境使用的是一键式傻瓜XAMPP, 我们的OJ开发正式开始 [Wed Nov 25 19:35:11 2015 +0800]

justQuiz!开发计划-1

justQuiz!开发计划-1





justQuiz Develop Plan







justQuiz Develop Plan

1 WORKING STEP1 简易答题&判题(客观题)的实现

1.1 WORKING A 题目管理

本阶段要实现题目管理的基本功能 及试题录入以及试卷生成
所有试题初期决定为存入同一个数据表,每一道试题包含的数据域有

  • PID 题目ID
  • title 题目标题
  • body 题目内容
  • attachment 附件路径 为以后使用
  • isObjective 题目是否为选择题
  • isMulti 题目为单选or多选
  • item1 item2 item3 item4 item5 item6 item7 选项内容
  • answer 正确答案 (正确答案支持三种格式 1.单选答案 2.多选答案(可以用XML可以用字符串)3.主观题答案(

支持关键字匹配,全部匹配为正确,部分匹配的情况没有考虑 初期只开发单选)

  • correctNum 答对的次数
  • wrongNum 答错的次数

另外一个数据表存放生成的试卷信息
每一张试卷的数据域有

  • EID 试卷的ID
  • items 题目ID组成的字串
  • rankAnum rankBnum rankCnum rankDnum 各分段学生数量统计
  • TimingInfo 暂时不明确如何存储时限信息,也许用xml STEP1不考虑

1.1.1 DONE Func1-添加题目到题库

CLOSED: 2015-02-07 六 19:59

  • DONE 建立PItemclass类的数据库写入和从POST读入功能
    CLOSED: 2015-02-07 六 13:30
    定义一个PItemclass类,这个类封装一道试题的所有信息以及对试题进行的操作

1.1.2 TODO Func2-用题库的题目组成试卷

1.1.3 DONE 系统初始化的实现

CLOSED: 2015-02-06 五 20:04
暂时搁置这个功能 先采取在数据库内预先生成一套试卷的功能来测试答题判题功能是否工作正常

1.2 DONE B 答题功能

CLOSED: 2015-02-07 六 19:58

1.2.1 DONE Func3-抓取特定试卷的题目显示到答题区

CLOSED: 2015-02-07 六 19:58
为实现本功能,将设计一个Examclass类来对试卷进行操作
examclass类内存有用户的答案和一个PItemclass类数组,并且具有判断题目是否正确的函数
为了保证用户只通过这一个页面就能够访问所有的题目,使用PHPSESSION对其进行管理,Examclass类
内含有显示试题这一函数,因而可以直接使用此函数调取相应的题目

  • DONE 设计Examclass类 完成上述功能
    CLOSED: 2015-02-07 六 13:30

    • DONE 设计Examclass类的同时需要对quiz.php的逻辑进行梳理
      CLOSED: 2015-02-07 六 15:59
  • DONE 扩展PItemclass类的功能,使其支持根据题目ID加载题目
    CLOSED: 2015-02-07 六 13:30

    • DONE 解决中文乱码问题
      CLOSED: 2015-02-07 六 00:23
  • DONE 使用session完成题目在同一页面上显示不同题目,以及对试卷的整体判题
    CLOSED: 2015-02-07 六 13:30
    逻辑关系设计
    判断用户是否为GET到此页面(即第一次访问此页面) 是的话输出选择试卷表单
    否则 判断用户是否已经获得试卷,是的话 输出下一题 否的话 判断用户是否填写了
    选择试卷表单的信息 是则获得试卷,否则输出选择试卷表单

1.2.2 TODO Func4-判题功能

2 TODO STEP2 支持题目上传附件

3 TODO STEP3 支持用户注册,登录

4 TODO STEP4 支持显示该套卷的分数分布

5 TODO STEP5 人工批改功能的添加

6 TODO STEP6 加入不同的答题模式

7 TODO STEP7 UI优化 jQuery Bootstrap优化UI

8 TODO STEP… 其它功能的添加

Date: 2015-02-07T20:13+0800

Author: VOID001

Org version 7.9.3f with Emacs version 24

Validate XHTML 1.0


[Project] Huffman 压缩软件的实现 01 计划及开题报告

[Project] Huffman 压缩软件的实现 01 计划及开题报告

准备写一个Huffman压缩软件 ,通过Huffman编码来实现文件的压缩和解压 计划书如下

Huffman 文件压缩系统

========
1. **Functions**:
1. 对任意文件进行压缩 并且生成压缩文件保存在磁盘上
1. 读入文件并且保存在一个字符串数组内 或者保存文件指针 或文件流对象
2. 根据读入的文件 统计出字符出现的频度 频数 保存在一个优先队列内 为下一步编码做准备
3. 根据字符的频度 建立Huffman树(静态链表结构) 并且保存根节点的标号
4. 通过Huffman树来建立符号表
5. 用符号表对原始文件进行编码 并使用位操作生成新的压缩文件并且输出到文件

2. 对经过Huffman压缩的文件进行解压,把解压后的文件保存在磁盘上
1. 读入压缩后的文件并且保存在一个字符串数组内 或者文件指针 文件流对象
2. 读入压缩时使用的Huffman树
3. 依次读取文件的每一个位 并通过Huffman树对文件进行解码 并导出解压后的文件
4. (选作) 将Huffman 的树型结构展示出来(可视化)

2. **Class Definition**

 
3. **Library to Use**
1. Qt (For Graphic User Interface)
2. STL (vector priority_queue sort …)

4. **Develop Plan** [Hard Deadline Week 19 Date:2014-1-14]
1. Core [Time Planned **5Days**]
1. Structure Build & Function Prototype(vector and class) [5-6h and 2 days]
2. make the Functions work [15h and 2days ]
3. Debugging and inmproving [5h 1day]
2. GUI [Time Planned **5Days**]
1. Study Qt Lib in 5 Days
2. Visualizing

*******
**2014-12-30 By VOID001**

先这么放着~  本系列文章会随开发进度进行更新  有一些需要学的东西~~~感觉不错~