结对编程项目

代码地址

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/)这里为他的主页。

![2018-10-17 21:48:13屏幕截图](/home/xxl/Pictures/2018-10-17 21:48:13屏幕截图.png)

以上为处理逻辑,我们为了保证原始执行程序的独立性,我们只对起做基础包装,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化的更多相关文章

  1. 结对编程项目报告--四则运算CORE

    <!doctype html> sw_lab2.mdhtml {overflow-x: initial !important;}#write, body { height: auto; } ...

  2. 这就是小学生也会用的四则计算练习APP吗?- by软工结对编程项目作业

    结对编程项目 软件工程 这就是链接 作业要求 这就是链接 作业目标 熟悉在未结对情况下如何结对开发项目 Github与合作者 合作者(学号): 区德明:318005422 虚左以待 Github链接: ...

  3. 结对编程项目——四则运算vs版

    结对编程项目--四则运算vs版 1)小伙伴信息:        学号:130201238 赵莹        博客地址:点我进入 小伙伴的博客 2)实现的功能: 实现带有用户界面的四则运算:将原只能在 ...

  4. 结对编程项目总结 by:陈宏伟&刘益

    结对编程项目在欢快的国庆假期中也顺利结束了.从最初拿到结对编程项目的思考,再到一步一步实现,中间经历了一个漫长的过程.在我和队友的多次协商下,最终我们还是选择使用基于python来实现这一次结对编程项 ...

  5. 20175324王陈峤宇 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175324王陈峤宇 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 这次的结对作业是要求我们利用栈来设计一个计算器. 自动生成四则运算 ...

  6. 20175229许钰玮 2018-2019-2《Java程序设计》结对编程项目-四则运算 第一周 阶段性总结

    20175229许钰玮 2018-2019-2<Java程序设计>结对编程项目-四则运算 第一周 阶段性总结 需求分析 自动生成四则运算题目(加.减.乘.除). 既可以用前缀算法(波兰算法 ...

  7. 20175311胡济栋 2018-2019-2《Java程序设计》结对编程项目-四则运算 第二周 阶段性总结

    20175311胡济栋 2018-2019-2<Java程序设计>结对编程项目-四则运算 第二周 阶段性总结 需求分析 这是利用栈来设计一个计算器的第二阶段总结. 自动生成四则运算的题目( ...

  8. 结对编程项目总结(core2组)

    结对编程项目总结(core2组) 作业---四则运算(Core 第二组)   ----by 吴雪晴 PB16061514 齐天杨 PB16060706 一.项目简介 项目的任务为制作一个给(貌似是?) ...

  9. 结对编程项目复盘:带UI的小初高数学学习软件

    实现个人项目时,由于我当时的Java GUI编程基础还比较薄弱,所以我选择通过命令行实现,并将编程开发的重点放到了算法效率上去.没能设计出用户体验更佳的UI成为了我在个人项目阶段最大的遗憾. 在这次结 ...

随机推荐

  1. [Swift]LeetCode413. 等差数列划分 | Arithmetic Slices

    A sequence of number is called arithmetic if it consists of at least three elements and if the diffe ...

  2. [Swift]LeetCode712. 两个字符串的最小ASCII删除和 | Minimum ASCII Delete Sum for Two Strings

    Given two strings s1, s2, find the lowest ASCII sum of deleted characters to make two strings equal. ...

  3. python +selenium识别不来click事件,出现报错

    assert "login" in browser.title browser.implicitly_wait(10) elem = browser.find_element_by ...

  4. 我要曝光!CDN 省钱大法!

    七夕节刚过去,小明却特别郁闷,因为七夕当天,他错过了和远在北京的女神表白的机会.事情的经过是怎样的呢?为了在七夕当天送给自己女神一件礼物,小明在某购物网站上花重金购买了特别的礼物,礼物是从广东发送,结 ...

  5. AspNetCore 使用NLog日志,NLog是基于.NET平台开的类库!(又一神器)

    NLog是一个基于.NET平台编写的类库,我们可以使用NLog在应用程序中添加极为完善的跟踪调试代码. NLog是一个简单灵活的.NET日志记录类库.通过使用NLog,我们可以在任何一种.NET语言中 ...

  6. Zara带你快速入门WPF(3)---触发器篇

    一.前言 使用触发器,可以动态的改变控件的外观,因为一些事件或属性改变了,把鼠标移动到按钮上,按钮就会改变其外观.通常这些必须写在C#代码中,使用WPF也可以使用XAMl实现,而这只会影响UI. 属性 ...

  7. Python爬虫入门教程 14-100 All IT eBooks多线程爬取

    All IT eBooks多线程爬取-写在前面 对一个爬虫爱好者来说,或多或少都有这么一点点的收集癖 ~ 发现好的图片,发现好的书籍,发现各种能存放在电脑上的东西,都喜欢把它批量的爬取下来. 然后放着 ...

  8. webpack 2 系列

    webpack 2 系列 webpack 是一个强大的工具,学会通过工具来解决开发效率问题,是每一个 工程师都必备的技能之一. 那么我们来从零开始搭建一个 基于webpack 2 到 开发架子,来提升 ...

  9. 当面试官说 “你还有什么问题想问的” ,你该如何回答?

    阅读本文大概需要 4 分钟. 作者:黄小斜 来源:程序员江湖 程序员面试时经常会听到面试官说一些套话,比如"今天的面试就到这里了,回去等通知吧","你还有什么问题想问我的 ...

  10. EF架构~migration对mysql数据库的迁移

    回到目录 ef这个orm工具确实强大,无论在实体建模还是在实体关系上,都发挥的很出色,而最近的code first针对数据库变更的使用更让我眼前一亮,先不说对sqlserver的支持,因为mssql本 ...