今年参加了电子设计大赛信息安全专题邀请赛。从4月初一直到8月10号都是参赛时间。平时太忙,大三了,要考研要实习什么的,一直拖到7月10号才开始做。
其实我一直觉得这是一个神话,不管能不能得奖吧,仅用了一个月的时间就做了一个完整的项目,自己都感觉到不可思议。想想光是那些源码就将近17M。就在一个月前,我都不相信我们还能做完。
7月10号那天期末考试的最后一科考完,是非常恶心的全英文的系统分析设计,一不小心考了90+。考完后大家都放松了,该回家的回家,该休息的休息。。。。我们开始了苦哈哈的编程。
这一个月的时间就没闲着过,经常是调程序调的饭都不想吃,每天早晨起来第一件事就是打开电脑进Ubuntu,打开eclipse开始写程序或者是调程序。想想别人回家休息,我们却在经常停水停电的宿舍里光着膀子编啊编,头顶的小风扇也不怎么顶事~晚上睡觉前还得想想明天改写什么了。
其实现在写总结还是太早,14号晚上要去西安,在哪儿呆一星期,比赛。之前买票还引起了一阵风波。可恶的票贩子!!!大家都知道中国买火车票真是困难,着了N种方案,后来老师说,你们不用管了,交给我了,哥当时很高兴。不过后来老师说你们去西站拿票吧。几天后我跟同学去拿票,那票贩子态度非常不好,两次挂我电话。第二次她挂我电话的时候我就想走了,但是那时候票都没了,不好买,后来我们两个人等了半天她才来,一副冷漠的表情。本来说好的是一个人票面+30,结果她后来愣是要50,妈的3张票要1000快,当时我就和同学转身就走。老子宁愿站着去,也不要他的票。
走没两步老师就打电话来了,说买了吧,那150块钱我给你,我没理他,哥就是不卖他的票怎么的!!
当天晚上找了另一个方案,先从北京到郑州,再从郑州到西安,两边都有卧铺。
还是总结一个编程吧。
Linux非常强大,可以再/dev下找到你所有需要的信息(几乎)。
要学会利用各种各样的开源库,有些代码别人写的已经很好了,不用自己再写,拿来改改就行了,当然,要遵循开源的游戏规则 。
Inotify是Linux的2.6非常棒的内核特性,监控整个文件系统,而且不占用什么CPU资源。Inotify+select+队列,非常强大。
epoll也是非常棒的特性,实现了异步调用。自建一个net service一定要用。epoll + 线程池。
开源库libstat...(具体名字忘了)一个非常不错的可以显示整个系统信息的开源库,不用自己再调用 /dev下的文件了。
OpenDPI和lay7都是非常不错的 深度包检测工具,一直检测到应用层,可以分析各种应用层协议。OpenDPI+IPTable可以构建一个不错的状态防火墙。
许多开源的线程池都写得非常不错。我手中的一个线程池就跟一般的不一样。一般的线程池的理念就是在使用之前把所有的线程都创建完毕,但是我手中的不是,他是当线程不够的时候在创建,一直到线程池满为止,这样可以节省不少资源。一个线程创建后线执行他要执行的操作,执行完毕后就wait一个condition,当然,这个condition就是又有一个新线程要来工作了,他就把那个线程的参数和函数装到自己身上开始执行。
编程的过程中遇到了很多莫名其妙的错误。由于我们几个人编程,我用的是C++,另一个人用的是C,结果我们两个人程序整 合的时候出现了大问题。其实我用C++就是贪图STL和String的方便,尤其是在操作数据库的时候,用C语言操作数据库要死人了,除非你用很多存储过程。以后编的时候一定要注意,C++调用C的程序一般不会有问题,但是反响调用就很难说了,问题特别多,别忘了extern "C".有些时候就是extern "C"也解决不了问题。要是C++还用到了class更要注意,c语言调用类里的函数要自己封装才行。还是应该注意,一般不要相互调用,出了问题很莫名其妙。
还是要养成良好的编程习惯,C对语法的检查并不深刻,可能你犯了很多错误C里都是警告但是C++里都是错误。永远不要忽视你的警告,警告有的时候比错误还要可怕,因为一旦运行时出错有的时候是怎么也检查不出来的。
碰上了很多Assertion 。。。。。这样的错误,这种错误只会在某些情况下才能显现出来,所以回来的非常猛烈,导致你的程序错误多多。其中99.9%是由于内存泄露引起的,所以不知道何时正确释放内存千万不要滥用malloc和calloc系列,包括new。内存泄露的问题可能一开始显现不出来,但是一旦出来就是大错误,一般人都懵了,所以不要心存侥幸心理,你分配了空间就记着一定收回,因为你不是再用Java和C#,这里是C和C++。
在Linux里面内存泄露可以用Vrigial这个工具检查,非常强大,都能检测出来。
使用多线程一定要小心。莫名其妙的挂掉非常常见。
还有就是C语言里传指针的问题,传数字,传指针,传二级指针,一定要弄明白你想要得到的结果是什么。如果实在搞不清就去C++传引用。
程序莫名其妙的挂了一定不要找电脑的原因,The computer is not guilty..一定是你写错了,再检查一遍,空间分配是否正确?申请内存是否free?要命的是注意这样的错误:sprintf(string , "%2s,%2s",a,b);注意char* string 空间,他并不是a+b的长度,而是a+b+4的长度!!!
我编的shell命令序列用户行为检测。使用了PrefixSpan这个数据挖掘算法。可惜效果不好,不好的原因是数据清洗的不好,不过这也不能怪我啊,20万行的命令一般人都疯了,根本不可能自己去检测,只能编程序,但是还是有一些处理的不是很得当,没办法。数据用的Purdue大学的UNIX_USR_DATA,其实他们清洗的不好,或者说不是很适合我这个程序。不过我没有NB的实验室,不可能向他们一样花2年的时间收集这么多命令。数据挖掘这东西,没有数据,什么都不行。别管是关联规则还是神经网络。没有好的数据清洗程序更是不行,你肯定得不到任何结果。唉,等我能上研究生再说吧,其实这个是很有意思的。不过现在没条件。
还有数据库编程的时候一定记得多用存储过程,别自己写一个长长(卡卡)的string + + + +。。。。,那样写有饭有容易遭到溢出攻击。
还有就是利用数据库做匹配的时候,记得要Trim(),某些语言不一定有这个函数,但是记得要做这么一件事,否则还是很莫名其妙的错误。出现了莫名其妙的错误,那就多调试吧,eclipse非常好用,断点,单步,还有条件都能用到。不要觉得难,用过了你就会了。不用永远不会。
编程要有一股韧性,不要觉得出了百八十个错误就绝的完了,不想再做了,尤其是到关键时刻和邻近交作品的时候,更容易出现错误。
记得C语言的static是怎么用的,C语言返回值的时候经常会用的static,很不错的用法,有的时候比malloc好的多。
还有一种比较独特的函数编写方式,那就是K & R,跟我们平常用的ANSI的方式不一样,那是一种老是的写法,2000年以前都那么写。没有强制转化,容易出错。现在不用了,但是见了要认识。
出现了莫名其妙的没见过的语法一般都是遇见macro了,仔细看看那个没见过的就行了,搜一下源文件,找找他的宏定义。
另:
不要在编程之前觉得某件事很简单,但是编的时候你会发现你根本做不出来,或者做出来了效果很差。所以想到一个什么东西一定要想想他的可行性。想着简单的可能做起来特别难。
不写了,以后再说。