结对编程项目——C语言实现WordCount Web化
结对编程项目
代码地址
201631062219,201631011410
gitee项目地址:https://gitee.com/xxlznb/pair_programming
作业地址:https://edu.cnblogs.com/campus/xnsy/2018Systemanalysisanddesign/homework/2188
团队PSP
| PSP2.1 | PSP阶段 | 预估耗时(分钟) | 实际耗时(分钟) |
|---|---|---|---|
| Planning | 计划 | 30 | 40 |
| -Estimate | -估计这个任务需要多少时间 | 20 | 25 |
| Development | 开发 | 600 | 740 |
| -Analysis | -需求分析 | 120 | 80 |
| -Design Spec | -生产设计文档 | 0 | 0 |
| -Design Review | -设计复审 | 0 | 0 |
| -Coding Standard | -代码规范 | 10 | 10 |
| -Design | 具体设计 | 100 | 240 |
| -Coding | -具体编码 | 360 | 480 |
| -Code Review | -代码复审 | 30 | 60 |
| -Test | -测试 | 90 | 30 |
| Reporting | 报告 | 60 | 60 |
| -Test Report | -测试报告 | 0 | 0 |
| - Size Measurement | -计算工作量 | 0 | 0 |
| -Postmortem & Process Improvement Plan | 事后总结,提出过程改进计划 | 30 | 30 |
| 合计 | 810 | 985 |
项目介绍
项目的主要语言为C语言,C语言作为一种平台依赖性较小的语言,同时也是性能非常优秀的语言,同时也是为了玩,所以我们使用了C语言作为开发语言,但是C语言的图形界面并不方便使用,因此我们换了一个思路,我们将这个项目web化了。
同时,web后端也使用C作为开发语言。服务器架构为Apache+CGIC库
CGI——common gateway interface,通用网关接口,我们将客户端提交的http请求通过Apache服务器拆解后发送至CGI程序,由CGI程序处理后输出相应,在此项目中,我们需要解决多文件上传的问题,我们使用CGIC库协助我们开发,CGIC库是一个极度简单的库(https://boutell.com/cgic/)这里为他的主页。

以上为处理逻辑,我们为了保证原始执行程序的独立性,我们只对起做基础包装,CGIC库由于不信任临时文件,因此在API中隐藏了临时文件的信息,无法直接获取临时文件,它推荐的做法是,如果需要保存文件则直接提供临时文件指针,但我们的wc是输入文件路径的,为了直接获取CGIC的临时文件路径,我们得修改库函数,在cgi.c中添加
cgiFormResultType cgiFormTempFileName(
char *name, char *result, int resultSpace)
{
cgiFormEntry *e;
int resultLen = 0;
char *s;
e = cgiFormEntryFindFirst(name);
if(!e){
strcpy(result,"");
return cgiFormNotFound;
}
s = e->tfileName;
while(*s) {
APPEND(result, *s);
s++;
}
if(resultSpace) {
result[resultLen] = '\0';
}
if(!strlen(e->tfileName)) {
return cgiFormNoFileName;
} else if (((int) strlen(e->tfileName)) > (resultSpace - 1)) {
return cgiFormTruncated;
} else {
return cgiFormSuccess;
}
}
同时在cgi.h中添加
extern cgiFormResultType cgiFormTempFileName(
char *name, char *result, int max);
之后就可以通过这个函数直接获取临时文件的路径了,之后我们将临时文件与文件对应的checkbox中的数据进行拼接即可获得一条shell命令。
在获取到命令后,我们使用popen
popen()函数通过创建一个管道,调用fork()产生一个子进程,执行一个shell以运行命令来开启一个进程。可以通过这个管道执行标准输入输出操作。这个管道必须由pclose()函数关闭,必须由pclose()函数关闭,必须由pclose()函数关闭,而不是fclose()函数(若使用fclose则会产生僵尸进程)。pclose()函数关闭标准I/O流,等待命令执行结束,然后返回shell的终止状态。如果shell不能被执行,则pclose()返回的终止状态与shell已执行exit一样。
type参数只能是读或者写中的一种,得到的返回值(标准I/O流)也具有和type相应的只读或只写类型。如果type是"r"则文件指针连接到command的标准输出;如果type是"w"则文件指针连接到command的标准输入。command参数是一个指向以NULL结束的shell命令字符串的指针。这行命令将被传到bin/sh并使用-c标志,shell将执行这个命令。
popen()的返回值是个标准I/O流,必须由pclose来终止。前面提到这个流是单向的(只能用于读或写)。向这个流写内容相当于写入该命令的标准输入,命令的标准输出和调用popen()的进程相同;与之相反的,从流中读数据相当于读取命令的标准输出,命令的标准输入和调用popen()的进程相同。
FILE *fp = NULL;
char c;
fp = popen(command, "r");
if(!fp)
{
perror("popen");
exit(EXIT_FAILURE);
}
while(!feof(fp))
{
c=fgetc(fp);
if(c==-1)break;
printf("%c",c);
}
pclose(fp);
目前已知的问题
前端丑,后端处理后的返回页面没有做,部分功能没有实现。仍待优化。
项目总结
总结:
通过本次项目,我们学到了很多一个人做项目的时候不会学到的东西,掌握了很多新知识,学了很多之前想学而又没时间学习的知识。
首先从结对的角度上来说,一个人写代码的过程是枯燥的,而两个人可以很好的从队友的反馈中调节自己的心态,能够在最艰难的时期咬牙坚持下去。在做停用词功能的时候,由于在一个过程函数中返回了栈中的指针,导致外部程序永远都无法正确地访问到真正的字符串地址,最恐怖的是他在调试的时候一切都是正常的,直到这部分内存被回收之后程序才会报错。我在这个部分卡了整整半个小时,直到后来意识到靠自己确实无法解决这个BUG之后,叫来了结对的小伙伴,我们俩一起审查代码过后找到了原因。这是我在这个项目过程中离放弃最近的一次,多亏结对编程,我最后才能成功解决这个BUG。并且两个人一起写代码过程中,积极性都普遍高于一个人写代码,做项目的这几天里,除了其他不得不完成的任务,其他的时间几乎全部投入到了代码的编写及测试的过程中。
其次从项目内容的角度上来说,我们项目的独立性非常高,从前端到处理Http请求,从Http请求到参数的获取以及文件的获取,从参数到文件的获取到参数的解析以及文件的处理,整个过程基本上都是由我们自己从底层自己搭建的。也因此我们花费了大量的时间去造轮子,导致花在项目主体上的时间不够多,因此可能一部分功能还待实现。但是我们的目标是把这个项目做大做好,不仅仅是为了应付这一次作业,而是做一个长期的打算,通过这个项目去学习我们之前没有学习过的内容,掌握我们还不熟悉的知识,不断将我们的项目完善。
从代码上来看,我们代码耦合度不高,符合面向过程设计规范,很多代码都可以复用。并且我们从开始就考虑了可拓展性,很多可能几行代码就可以实现的功能我们都尽量做到泛化,增强它的可拓展性。正如前面所提到的,我们将这个项目作为一个长期项目来考虑,避免Magic Number以及模棱两可的变量名,做到看名其意。
从优化的角度上来看,我们计划在接下来的时间实现多进程取文件,提升读取效率。权衡时间与空间复杂度,将涉及到查询的代码重构成具有更高效率的查询方式。将前端的页面重新设计并实现。
总而言之,本次项目收获很多,"Learning by doing",孔子曾经说过:“吾听吾忘,吾见吾记,吾做吾悟”,我们在以后的学习中,任将承这种学习态度,在实践中感悟,在实践中成长。
结对编程项目——C语言实现WordCount Web化的更多相关文章
- 结对编程项目报告--四则运算CORE
<!doctype html> sw_lab2.mdhtml {overflow-x: initial !important;}#write, body { height: auto; } ...
- 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业
结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...
- 结对编程项目——四则运算vs版
结对编程项目--四则运算vs版 1)小伙伴信息: 学号:130201238 赵莹 博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...
- 结对编程项目总结 by:陈宏伟&刘益
结对编程项目在欢快的国庆假期中也顺利结束了.从最初拿到结对编程项目的思考,再到一步一步实现,中间经历了一个漫长的过程.在我和队友的多次协商下,最终我们还是选择使用基于python来实现这一次结对编程项 ...
- 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...
- 20175229许钰玮 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结
20175229许钰玮 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 自动生成四则运算题目(加.减.乘.除). 既可以用前缀算法(波兰算法 ...
- 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结
20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...
- 结对编程项目总结(core2组)
结对编程项目总结(core2组) 作业---四则运算(Core 第二组) ----by 吴雪晴 PB16061514 齐天杨 PB16060706 一.项目简介 项目的任务为制作一个给(貌似是?) ...
- 结对编程项目复盘:带UI的小初高数学学习软件
实现个人项目时,由于我当时的Java GUI编程基础还比较薄弱,所以我选择通过命令行实现,并将编程开发的重点放到了算法效率上去.没能设计出用户体验更佳的UI成为了我在个人项目阶段最大的遗憾. 在这次结 ...
随机推荐
- [Swift]LeetCode906. 超级回文数 | Super Palindromes
Let's say a positive integer is a superpalindrome if it is a palindrome, and it is also the square o ...
- linux入门--Linux桌面环境(桌面系统)大比拼[附带优缺点]
早期的 Linux 系统都是不带界面的,只能通过命令来管理,比如运行程序.编辑文档.删除文件等.所以,要想熟练使用 Linux,就必须记忆很多命令. 后来随着 Windows 的普及,计算机界面变得越 ...
- Nginx 动静分离与负载均衡的实现
一.前提 企业中,随着用户的增长,数据量也几乎成几何增长,数据越来越大,随之也就出现了各种应用的瓶颈问题. 问题出现了,我们就得想办法解决,一般网站环境,均会使用LAMP或者LNMP,而我们对于网站环 ...
- IDEA激活码(2019)
如您激活出现问题,请点击这里加入:软件激活问题解决群 前言 IDEA已然成为我最热爱的一款编辑器,作为一个从Eclipse阵营转过来的coder,确实能感受到IDEA的强大,而我电脑桌面的Eclips ...
- RSA算法原理——(1)目前常见加密算法简介
艾伦·麦席森·图灵在二战期间主要负责破译德国人的密码系统Enigma,破解密码需要大量的计算,图灵深知工欲善其事必先利其器的道理,于是一台叫作CO-LOSSUS的计算机在1943年被研制出来,后来 ...
- 微信小程序开发测试
微信小程序 在2017-01-09正式上线,本着跟上时代潮流的精神,写一份教程来看看 微信IDE下载地址为: 微信IDE 在windows下直接 双击 exe安装即可,安装完成后的界面如下: 得到这个 ...
- Vim 复制粘帖格式错乱问题的解决办法
有时候,复制文本(尤其是代码)到 Vim,会出现格式错乱的问题.看样子,应该是自动缩进惹得祸.本文不去深究原因,直接给出解决方法. 1. paste 模式 运行如下命令,进入 paste 模式: :s ...
- 使用Phalcon框架开发一个简易的博客系统
使用Phalcon PHP框架开发一个简易的博客系统(类似于CMS) 最近在做Phalcon(Phalcon在英文中指的是鸟类中飞得最快的那一个物种,由于是高性能框架,借用了这个词)相关的项目,由于刚 ...
- 前端笔记之HTML5&CSS3(中)选择器&伪类伪元素&CSS3效果&渐变背景&过渡
一.CSS3选择器 CSS3是CSS的第三代版本,新增了很多功能,例如:强大的选择器.盒模型.圆角.渐变.动画.2D/3D转换.文字特效等. CSS3和HTML5没有任何关系!HTML5骨架中,可以用 ...
- 阿里注册中心nacos使用整合Dubbo-原创
阿里注册中心nacos是今年开源的框架,一开始以为就是个zk.后面看了图才明白他对标的竟然是consul\eureka,最重要是完美支持dubbo.我想今年开源它也是别有用意 .(目前nacos0.7 ...