|
|
用户名:guangjui 笔名:guangjui 地区: 行业:其他 |
| 日 | 一 | 二 | 三 | 四 | 五 | 六 |
| 记录下每天所学的东西和思考的东西!每天进步一点 |
工作的本质
编程思考
进程查看器的使用
LOG记录规范
Log作为是调试程序,监视程序运行的一种重要的方式,特别是在多线程程序和分布式程序中,重要的调试方法。有人统计过在程序中,有4%的代码是Log。
绝大多数的大型开发项目都有它们自己专门用于记录程序日志和对程序跟踪调试的API。许多经验证明,调试信息的管理在软件开发过程中扮演了十分重要的角色。日志管理通常提供了以下的几点好处:首先,它能在程序运行过程中精确的提供运行时的上下文(context)方便开发人员找到 BUG,一旦在程序中加入了Log 输出的代码,程序运行过程中就能自动的生成并输出logging信息。其次,log信息可以输出到不同的地方(控制台,文件,日志服务器等等)以备时候研究。最后,除了在开发过程中发挥它的作用外,一个功能足够强大的日志记录开发包能当作一个审计工具(audit tool)使用。
同时,Log确实也存在一些缺陷,比如,它影响了程序运行的速度,增加了代码的开销,增加了许多无谓的输出。为了减少这些负面因数的影响,log应该被设计得尽量的高效和灵活。
Log作为是调试程序,监视程序运行的一种重要的方式,特别是在多线程程序和分布式程序中,重要的调试方法。有人统计过在程序中,有4%的代码是Log。
绝大多数的大型开发项目都有它们自己专门用于记录程序日志和对程序跟踪调试的API。许多经验证明,调试信息的管理在软件开发过程中扮演了十分重要的角色。日志管理通常提供了以下的几点好处:首先,它能在程序运行过程中精确的提供运行时的上下文(context)方便开发人员找到 BUG,一旦在程序中加入了Log 输出的代码,程序运行过程中就能自动的生成并输出logging信息。其次,log信息可以输出到不同的地方(控制台,文件,日志服务器等等)以备时候研究。最后,除了在开发过程中发挥它的作用外,一个功能足够强大的日志记录开发包能当作一个审计工具(audit tool)使用。
同时,Log确实也存在一些缺陷,比如,它影响了程序运行的速度,增加了代码的开销,增加了许多无谓的输出。为了减少这些负面因数的影响,log应该被设计得尽量的高效和灵活。
二、Log基本概念1、 级别(Level):输出日志的重要程度,便于控制日志输出的多少。
2、 输出目的地(Appender):日志可以被写入的存储空间,常见的有控制台、文件、数据库、NT日志库、Syslog、远程文件服务器等等。
3、 输出格式(Layout):日志输出的内容,如日期格式、是否显示输出级别等。
三、Log问题怎么记录Log,在什么地方记,记录什么信息,怎么很容易的在发布版中去掉Log。
3.1 Log的分级在程序中Log进行分级是很重要的,通常可以分为6级:ALL<DEBUG<INFO<ERROR<FATAL<NONE,Log的级别是可以配置的,当总的Log级别是ERROR时,则级别低于ERROR的都不会输出,只有高于或等于ERROR的才被输出。在程序中,可以指定的级别只有中间的四种。
DEBUG代表这些Log是用来输出调试信息,一般是在程序中不是非常重要的地方;INFO代表一些比较重要的信息,比如程序初始化完毕;ERROR一般指程序本身引起的,可以恢复的错误;FATAL一般指程序所依赖的环境出现错误,使的程序不恢复。其中常用的是DEBUG和ERROR。
3.2 在什么地方记Logl 对程序的输入输出要以DEBUG记录下来,常包括从文件、数据库、网络、用户等输入的信息,向文件、数据库、网络输出的信息。
l 对重要对象或结构体的修改,要以INFO记录修改前的信息和修改后的状态。
l 不能忽视每个调用错误。
l 记下打印信息时所在的文件名和函数名(必须能区分开重载函数),有行数最好。
一般原则:1、 在程序开始运行应该以INFO记录程序开始运行的消息。
2、 在程序初始化过程中,如果影响程序主体正常运行错误出现,应该以FATAL记录出现错误的函数名、事件和错误号;如果只是一个不影响程序正常功能的模块出现错误,则应该以ERROR记录出现错误的函数名、模块名、事件和错误号。
3、 在程序初始化完成后,应该以INFO记录程序初始化完成的消息。
4、 在函数的入口,如果需要验证参数,则可以以DEBUG的形式输出参数的信息。如果重要参数不正确,则应该以ERROR输出。
5、 在调用比较成熟的API时,如果失败,则以ERROR记录,并且有错误号记下错误号。
6、 在调用没有经过严格测试的库时,即使返回成功,也要以DEBUG的形式记录下返回的结果。
7、 以捕获异常时,以ERROR记录下错误。
8、 在进行数据库操作时,以DEBUG的级别输出执行的SQL词句,对于取回的结果,最好是能打印出所有构造完成的对象的信息。
9、 在与其它程序进行通信时,以DEBUG记录下通信过程中的重要信息。
10、 对程序中的每个线程,它们的初始化完成和开始运行也要以INFO记录下来。
11、 对程序中需要检查运行性能的地方,以DEBUG记录下运行耗时。
12、 程序正常结束时,和初始化的记录方式相同,对各个模块的卸载采用和加载是一样的处理方式。当程序都卸载完成后以INFO记录程序退出的消息。
C++中函数参数传递的原则
MSDN的BUG
带着问题学计算机专业
从开始接触计算机的那一刻起,我就是带着问题学计算机的。是各种问题带着我前进,使我的理解从机箱面板到主板的结构,从怎么使用windows到windows是处理工作的,从使用IE到IE是怎么从网站上取得网页数据的。有一些问题伴随我多年,从懵懵懂懂的知道大致过程到每个部分的详细细节,理解这些问题我用了几年的时间,有些也还没用理解透,但我认为对每一个学习计算机专业的人来说,理解这些问题是最基本的,也是对以后发展很有帮助的。
问题1、在windows里,现在打开记事本或者其它的能接收键盘输入的输入框,说出从你在键盘上按下一个字母键到这个字母在输入框中显示出来的计算机处理的整个过程,要详细描述。
问题2、在IE中输入一个网址,按下回车后到整个网页都显示出来,这个过程中本地计算机、通过的路由器和WEB服务器都做了些什么工作,要求详细,越细越好。
问题3、在大脑中想像出你在正在用计算机上网、听音乐时计算机内的内存组织、进程的切换、硬盘的读写整个过程协调的工作过程。
问题4、想像你和本地的其它计算机通信的过程,包括数据包怎么发送的,在网络中的传输情况,交换机做了什么工作怎么工作。
问题5、想像一个你写的C/C++程序执行的过程,包括函数调用、栈的状态、和操作系统交互的过程。
以上这些问题是我经常问题自己的问题。我想这些问题可能会引起大家的一些思考。
笔试有感
现在毕业生找工作,动不动就要笔试。我并不反对笔试这种方式,但我希望出笔试题目的人能认真负责一些,出能真正考出求职者水平的题。不要动不动就去国家计算机三级四级或高程的教材上找题。这些题,我认为根本不能考出求职者的真实水平。
做计算机行业,最重要的应该是对算法和数据结构掌握程序。公司完全可以从平时软件开发的过程中遇到的实际问题抽象出几个数据结构和算法题,就靠这些题就可以完全考查出求职者的水平了。从中可以看出求职者对语言的掌握程度,编程的习惯,算法设计的能力。我想这些才是从事计算机行业所必须的本领。如果这些做的很好,并且求职者研究的方向又和公司的方向一致。我想这种人才才是公司真正需要的,才是真有可以培养的人才。
Digester使用过程中应该注意的问题
对于采用XML的配置文件解析一直使用DOM来自己进行解析,在解析时候会写多个for循环进行嵌套,写起来很不好理解,解析过程非常复杂,也很难维护,就想使用递归下降法写解析过程,实现起来也比较有条理,但不通用。于是想起了Digester,以前看过一段时间,但没有怎么用,正好研究一下。发现使用的时候有很多要注意的地方,例程上也没有怎么讲。
1、当使用addSetProperties方法时,如果对应的类里的属性,不符合规范,则不能正常调用。如:
public class Course {
private String name;
private int score;
public void setName(String name) {
this.name = name;
}
public void setScore(String score) {
this.score=String.valueOf(score);
}
public int getScore(){
return 1;
}
public String getName() {
return name;
}
public String toString(){
return "course.name = "+name +" ; score = "+score+"\n";
}
public Course() {
}
}
其中的setScore和getScore不能算是对一个属性的getter和setter。因为他们的类型不一致,这时就不能正常调用。
2、public void addCallMethod(java.lang.String pattern,
java.lang.String methodName,
int paramCount)
方法的意思是当匹配到pattern时,调用当前栈顶的对象的methodName方法,后面是参数的个数。如果参数个数是0,表示把这个pattern中的文本块作为一个参数传给methodName方法。如:
SCJP
SCWCD
//当遇到academy/teacher/certification时,调用addCertification
digester.addCallMethod( "academy/teacher/certification",
"addCertification", 1);
//设置addCertification的参数值,此处的0表示这个元素体的第一个值//(因为就只有一个)
digester.addCallParam( "academy/teacher/certification", 0);
上面两句可以使用一句来代替digester.addCallMethod( "academy/teacher/certification",
"addCertification",0);就可以了。
介绍Digester的几篇好文章:
1、Using The Digester Component by Harshad Oak .
2、Learning and Using Jakarta Digester
3、Package org.apache.commons.digester Description