结对编程项目——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成为了我在个人项目阶段最大的遗憾. 在这次结 ...
随机推荐
- ubuntu16.04安装lnmp环境
1.安装mysql sudo apt install mysql-server 2.安装nginx和php #添加nginx和php的ppa源 sudo apt-add-repository ppa ...
- Java引入的一些新特性
Java引入的一些新特性 Java 8 (又称为 jdk 1.8) 是 Java 语言开发的一个主要版本. Oracle 公司于 2014 年 3 月 18 日发布 Java 8 ,它支持函数式编程, ...
- 7.Git分支-分支简介、分支创建、分支切换
1.分支简介 几乎所有的版本控制系统都支持某种形式的分支.使用分支意味着可以把你的工作从开发主线上分离开来,以免影响开发主线.Git的分支是其必杀技,它相对于其它版本控制系统来说,具有难以置信的轻量性 ...
- Python—day17时间模块、系统模块、递推遍历、序列化
一.time'''时间戳(timestamp):time.time()延迟线程的运行:time.sleep(secs)(指定时间戳下的)当前时区时间:time.localtime([secs])(指定 ...
- 【干货】.NET WebApi HttpMessageHandler管道
消息拦截器是一个类,接收 HTTP request并返回 HTTP response,Message handler 继承自抽象类 HttpMessageHandler,那么学习消息过滤器之前你应该了 ...
- localStorage之本地储存
一.定义json var employees = [{ "firstName":"Bill" , "lastName":"Gate ...
- linux-centerOs6.8安装nginx与配置
一:安装nginx 1.安装gcc(命令:yum install gcc)备注:可以输入gcc -v查询版本信息,查看是否自带安装 2.安装pcre(命令:yum install pcre-devel ...
- 使用ML.NET实现白葡萄酒品质预测
导读:ML.NET系列文章 本文将基于ML.NET v0.2预览版,介绍机器学习中的分类和回归两个重要概念,并实现白葡萄酒品质预测. 本系列前面的文章也提到了一些,经典的机器学习最主要的特点就是模拟, ...
- 设计模式的征途(C#实现)—文章目录索引
1.预备篇 UML类图10分钟快速入门 2.创建型模式 ① 设计模式的征途-01.单例(Singleton)模式 ② 设计模式的征途-02.简单工厂(Simple Factory)模式 ③ 设计模式的 ...
- SpringBoot入门教程(一)详解intellij idea搭建SpringBoot
最近公司有一个内部比赛(黑客马拉松),报名参加了这么一个赛事,在准备参赛作品的同时,由于参赛服务器需要自己搭建且比赛产生的代码不能外泄的,所以借着这个机会,本地先写了个测试的demo,来把tomcat ...