2009年4月28日星期二

Lua学习(1),编译Lua 与 HelloWorld

前段日子研究了一下python,被她的简洁高效深深吸引。今天在看云风的《游戏之旅-我的编程感悟》时,见他提到Lua,晚上把它弄下来玩玩。废话少说,进入正题...

1.下载源代码,http://www.lua.org/ftp/lua-5.1.4.tar.gz

2.编译Lua 源码
  • 先将lua-5.1.4.tar.gz 解压到一个目录,比如:F:\Program\Dev\lua\lua5_1_4
  • 打开 VS2005的命令提示窗(不是cmd,因为cmd不包含编译器和连接器的路径),cd 到F:\Program\Dev\lua\lua5_1_4目录下;
  • 运行“etc\luavs.bat”, ok,此时在src目录下生成了lua.exe、luac.exe等其他几个文件;
  • 讲src目录添加到系统环境变量中。
3. Helloword

用编辑器编写如下代码:

print "hello world"

保存成 hello.lua文件;再当前目录下,执行 lua hello.lua
可看到执行效果。关于编辑器环境的设置参考:Lua学习(2) 手工配置Lua的开发工具

4.如果用 luac执行编译,例如 luac -o hello.exe hello.lua,可以看到生成的 hello.exe文件,如果执行hello.exe,会得到“s32evnt1.dll 可安装的虚拟设备驱动程序之dll起始设置失败”错误;如图

找不到 C:\Program Files\Symantec\S32EVNT1.DLL,解决方法是 从http://www.dll-files.com/dllindex/s32evnt1.zip?0VGmVCcDdP下载此文件复制到相应路径即可。

即使解决了S32EVNT1.DLL的问题,hello.exe还是不能运行,luac命令是用来编译lua代码模块的,但是Lua代码是不可独自运行的,强行执行,会提示“***Cpu遇到无效指令”。
而我们在第三部中使用 lua命令可以成功执行,因为Lua.exe是一个Lua的解释器。
除此之外我们还可以用其他宿主语言调用lua代码(例如C/C++),后门的学习会给出。

欢迎转载,请注明来自 Hi,Coder




2009年4月19日星期日

如何阅读源代码

+++++++++++

第一章: 导论

++++++++++++

1.要养成一个习惯, 经常花时间阅读别人编写的高品质代码.

2.要有选择地阅读代码, 同时, 还要有自己的目标. 您是想学习新的模式|编码风格|还是满足某些需求的方法.

3.要注意并重视代码中特殊的非功能性需求, 这些需求也许会导致特殊的实现风格.

4.在现有的代码上工作时, 请与作者和维护人员进行必要的协调, 以避免重复劳动或产生厌恶情绪.

5.请将从开放源码软件中得到的益处看作是一项贷款, 尽可能地寻找各种方式来回报开放源码社团.

6.多数情况下, 如果您想要了解"别人会如何完成这个功能呢?", 除了阅读代码以外, 没有更好的方法.

7.在寻找bug时, 请从问题的表现形式到问题的根源来分析代码. 不要沿着不相关的路径(误入歧途).

8.我们要充分利用调试器|编译器给出的警告或输出的符号代码|系统调用跟踪器|数据库结构化查询语言的日志机制|包转储工具和Windows的消息侦查程序, 定出的bug的位置.

9.对于那些大型且组织良好的系统, 您只需要最低限度地了解它的全部功能, 就能够对它做出修改.

10.当向系统中增加新功能时, 首先的任务就是找到实现类似特性的代码, 将它作为待实现功能的模板.

11.从特性的功能描述到代码的实现, 可以按照字符串消息, 或使用关键词来搜索代码.

12.在移植代码或修改接口时, 您可以通过编译器直接定位出问题涉及的范围, 从而减少代码阅读的工作量.

13.进行重构时, 您从一个能够正常工作的系统开始做起, 希望确保结束时系统能够正常工作. 一套恰当的测试用例(test case)可以帮助您满足此项约束.

14.阅读代码寻找重构机会时, 先从系统的构架开始, 然后逐步细化, 能够获得最大的效益.

15.代码的可重用性是一个很诱人, 但难以理解与分离, 可以试着寻找粒度更大一些的包, 甚至其他代码.

16.在复查软件系统时, 要注意, 系统是由很多部分组成的, 不仅仅只是执行语句. 还要注意分析以下内容: 文件和目录结构|生成和配置过程|用户界面和系统的文档.

18.可以将软件复查作为一个学习|讲授|援之以手和接受帮助的机会.
++++++++++++++++++++
第二章: 基本编程元素

++++++++++++++++++++

19.第一次分析一个程序时, main是一个好的起始点.

20.层叠if-else if-...-else序列可以看作是由互斥选择项组成的选择结构.

21.有时, 要想了解程序在某一方面的功能, 运行它可能比阅读源代码更为恰当.

22.在分析重要的程序时, 最好首先识别出重要的组成部分.

23.了解局部的命名约定, 利用它们来猜测变量和函数的功能用途.

24.当基于猜测修改代码时, 您应该设计能够验证最初假设的过程. 这个过程可能包括用编译器进行检查|引入断言|或者执行适当的测试用例.

25.理解了代码的某一部分, 可能帮助你理解余下的代码.

26.解决困难的代码要从容易的部分入手.

27.要养成遇到库元素就去阅读相关文档的习惯; 这将会增强您阅读和编写代码的能力.

28.代码阅读有许多可选择的策略: 自底向上和自顶向下的分析|应用试探法和检查注释和外部文档, 应该依据问题的需要尝试所有这些方法.

29.for (i=0; i

30.涉及两项不等测试(其中一项包括相等条件)的比较表达式可以看作是区间成员测试.

31.我们经常可以将表达式应用在样本数据上, 借以了解它的含义.

32.使用De Morgan法则简化复杂的逻辑表达式.

33.在阅读逻辑乘表达式时, 问题可以认为正在分析的表达式以左的表达式均为true; 在阅读逻辑和表达式时, 类似地, 可以认为正在分析的表达式以左的表达式均为false.

34.重新组织您控制的代码, 使之更为易读.

35.将使用条件运行符? :的表达式理解为if代码.

36.不需要为了效率, 牺牲代码的易读性.

37.高效的算法和特殊的优化确实有可能使得代码更为复杂, 从而更难理解, 但这并不意味着使代码更为紧凑和不易读会提高它的效率.

38.创造性的代码布局可以用来提高代码的易读性.

39.我们可以使用空格|临时变量和括号提高表达式的易读性.

40.在阅读您所控制的代码时, 要养成添加注释的习惯.

41.我们可以用好的缩进以及对变量名称的明智选择, 提高编写欠佳的程序的易读性.

42.用diff程序分析程序的修订历史时, 如果这段历史跨越了整体重新缩排, 常常可以通过指定-w选项, 让diff忽略空白差异, 避免由于更改了缩进层次而引入的噪音.

43.do循环的循环体至少执行一次.

44.执行算术运算时, 当b=2n-1时, 可以将a&b理解为a%(b+1).

45.将a<<n理解为a*k, k=2n.

46.将a>>n理解为a/k, k=2n.

47.每次只分析一个控制结构, 将它的内容看作是一个黑盒.

48.将每个控制结构的控制表达式看作是它所包含代码的断言.

49.return, goto, break和continue语句, 还有异常, 都会影响结构化的执行流程. 由于这些语句一般都会终止或重新开始正在进行的循环,因此要单独推理它们的行为.

50.用复杂循环的变式和不变式, 对循环进行推理.

51.使用保持含义不变的变换重新安排代码, 简化代码的推理工作.

+++++++++++++++++++

第三章: 高级C数据类型

+++++++++++++++++++

52.了解特定语言构造所服务的功能之后, 就能够更好地理解使用它们的代码.

53.识别并归类使用指针的理由.

54.在C程序中, 指针一般用来构造链式数据结构|动态分配的数据结构|实现引用调用|访问和迭代数据元素|传递数组参数|引用函数|作为其他

值的别名|代表字符串|以及直接访问系统内存.

55.以引用传递的参数可以用来返回函数的结果, 或者避免参数复制带来的开销.

56.指向数组元素地址的指针, 可以访问位于特定索引位置的元素.

57.指向数组元素的指针和相应的数组索引, 作用在二者上的运算具有相同的语义.

58.使用全局或static局部变量的函数大多数情况都不可重入(reentrant).

59.字符指针不同于字符数组.

60.识别和归类应用结构或共用体的每种理由.

61.C语言中的结构将多个数据元素集合在一起, 使得它们可以作为一个整体来使用, 用来从函数中返回多个数据元素|构造链式数据结构|映射数据在硬件设备|网络链接和存储介质上的组织方式|实现抽象数据类型|以及以面向对象的方式编程.

62.共用体在C程序中主要用于优化存储空间的利用|实现多态|以及访问数据不同的内部表达方式.

63.一个指针, 在初始化为指向N个元素的存储空间之后, 就可以作为N个元素的数组来使用.

64.动态分配的内在块可以电焊工地释放, 或在程序结束时释放, 或由垃圾回收器来完成回收; 在栈上分配的内存块当分配它的函数退出后释放.

65.C程序使用typedef声明促进抽象, 并增强代码的易读性, 从而防范可移植性问题, 并模拟C++和Java的类声明行为.

66.可以将typedef声明理解成变量定义: 变量的名称就是类型的名称; 变量的类型就是与该名称对应的类型.

+++++++++++++++

第四章: C数据结构

+++++++++++++++

67.根据底层的抽象数据类型理解显式的数据结构操作.

68.C语言中, 一般使用内建的数组类型实现向量, 不再对底层实现进行抽象.

69.N个元素的数组可以被序列for (i=0; i

70.表达式sizeof(x)总会得到用memset或memcpy处理数组x(不是指针)所需的正确字节数.

71.区间一般用区间内的第一个元素和区间后的第一个元素来表示.

72.不对称区间中元素的数目等于高位边界与低位边界的差.

73.当不对称区间的高位边界等于低位边界时, 区间为空.

74.不对称区间中的低位边界代表区间的第一个元素; 高位边界代表区间外的第一个元素.

75.结构的数组常常表示由记录和字段组成的表.

76.指向结构的指针常常表示访问底层记录和字段的游标.

77.动态分配的矩阵一般存储为指向数组列的指针或指向元素指针的指针; 这两种类型都可以按照二维数组进行访问.

78.以数组形式存储的动态分配矩阵, 用自定义访问函数定位它们的元素.

79.抽象数据类型为底层实现元素的使用(或误用)方式提供一种信心的量度.

80.数组用从0开始的顺序整数为键, 组织查找表.

81.数组经常用来对控制结构进行高效编码, 简化程序的逻辑.

82.通过在数组中每个位置存储一个数据元素和一个函数指针(指向处理数据元素的函数), 可以将代码与数据关联起来.

83.数组可以通过存储供程序内的抽象机(abstract machine)或虚拟机(virtual machine)使用的数据或代码, 控制程序的运作.

84.可以将表达式sizeof(x) / sizeof(x[0])理解为数组x中元素的个数.

85.如果结构中含有指向结构自身|名为next的元素, 一般说来, 该结构定义的是单向链表的结点.

86.指向链表结点的持久性(如全局|静态或在堆上分配)指针常常表示链表的头部.

87.包含指向自身的next和prev指针的结构可能是双向链表的结点.

88.理解复杂数据结构的指针操作可以将数据元素画为方框|指针画为箭头.

89.递归数据结构经常用递归算法来处理.

90.重要的数据结构操作算法一般用函数参数或模板参数来参数化.

91.图的结点常常顺序地存储在数组中, 链接到链表中, 或通过图的边链接起来.

92.图中的边一般不是隐式地通过指针, 就是显式地作为独立的结构来表示.

93.图的边经常存储为动态分配的数组或链表, 在这两种情况下, 边都锚定在图的结点上.

94.在无向图中, 表达数据时应该将所有的结点看作是等同的, 类似地, 进行处理任务的代码也不应该基于它们的方向来区分边.

95.在非连通图中, 执行遍历代码应该能够接通孤立的子图.

96.处理包含回路的图时, 遍历代码应该避免在处理图的回路进入循环.

97.复杂的图结构中, 可能隐藏着其他类型的独立结构.

+++++++++++++++++

第五章: 高级控制流程

+++++++++++++++++

98.采用递归定义的算法和数据结构经常用递归的函数定义来实现.

99.推理递归函数时, 要从基准落伍测试开始, 并认证每次递归调用如何逐渐接近非递归基准范例代码.

100.简单的语言常常使用一系列遵循该语言语法结构的函数进行语法分析.

101.推理互递归函数时, 要基于底层概念的递归定义.

102.尾递归调用等同于一个回到函数开始处的循环.

103.将throws子句从方法的定义中移除, 然后运行Java编译器对类的源代码进行编译, 就可以容易地找到那些可能隐式地生成异常的方法.

104.在多处理器计算机上运行的代码常常围绕进程或线程进行组织.

105.工作群并行模型用于在多个处理器间分配工作, 或者创建一个任务池, 然后将大量需要处理标准化的工作进行分配.

106.基于线程的管理者/工人并行模型一般将耗时的或阻塞的操作分配给工人子任务, 从而维护中心任务的响应性.

107.基于进程的管理者/工人并行模型一般用来重用现有的程序, 或用定义良好的接口组织和分离粗粒度的系统模块.

108.基于流水线的并行处理中, 每个任务都接收到一些输入, 对它们进行一些处理, 并将生成的输出传递给下一个任务, 进行不同的处理.

109.竞争条件很难捉摸, 相关的代码常常会将竞争条件扩散到多个函数或模块; 因而, 很难隔离由于竞争条件导致的问题.

110.对于出现在信号处理器中的数据结构操作代码和库调用要保持高度警惕.

111.在阅读包含宏的代码时, 要注意, 宏既非函数, 也非语句.

112.do…while(0)块中的宏等同于控制块中的语句.

113.宏可以访问在它的使用点可见的所有局部变量.

114.宏调用可改变参数的值

115.基于宏的标记拼接能够创建新的标记符.

+++++++++++++++++
第六章: 应对大型项目

+++++++++++++++++

116.我们可以通过浏览项目的源代码树—包含项目源代码的层次目录结构, 来分析一个项目的组织方式. 源码树常常能够反映出项目在构架和软件过程上的结构.

117.应用程序的源代码树经常是该应用程序的部署结构的镜像.

118.不要被庞大的源代码集合吓倒; 它们一般比小型的专门项目组织得更出色.

119.当您首次接触一个大型项目时, 要花一些时间来熟悉项目的目录树结构.

120.项目的源代码远不只是编译后可以获得可执行程序的计算机语言指令; 一个项目的源码树一般还包括规格说明|最终用户和开发人员文档|测试脚本|多媒体资源|编译工具|例子|本地化文件|修订历史|安装过程和许可信息.

121.大型项目的编译过程一般声明性地借助依赖关系来说明. 依赖关系由工具程序, 如make及其派生程序, 转换成具体的编译行动.

122.大型项目中, 制作文件常常由配置步骤动态地生成; 在分析制作文件之前, 需要先执行项目特定的配置.

123.检查大型编译过程的各个步骤时, 可以使用make程序的-n开关进行预演.

124.修订控制系统提供从储存库中获取源代码最新版本的方式.

125.可以使用相关的命令, 显示可执行文件中的修订标识关键字, 从而将可执行文件与它的源代码匹配起来.

126.使用修订日志中出现的bug跟踪系统内的编号, 可以在bug跟踪系统的数据库中找到有关的问题的说明.

127.可以使用修订控制系统的版本储存库, 找出特定的变更是如何实现的.

128.定制编译工具用在软件开发过程的许多方面, 包括配置|编译过程管理|代码的生成|测试和文档编制.

129.程序的调试输出可以帮助我们理解程序控制流程和数据元素的关键部分.

130.跟踪语句所在的地点一般也是算法运行的重要部分.

131.可以用断言来检验算法运作的步骤|函数接收的参数|程序的控制流程|底层硬件的属性和测试用例的结果.

132.可以使用对算法进行检验的断言来证实您对算法运作的理解, 或将它作为推理的起点.

133.对函数参数和结果的断言经常记录了函数的前置条件和后置条件.

134.我们可以将测试整个函数的断言作为每个给定函数的规格说明.

135.测试用例可以部分地代替函数规格说明.

136.可以使用测试用例的输入数据对源代码序列进行预演.

+++++++++++++++++++

第七章: 编码规范和约定

+++++++++++++++++++

137.了解了给定代码库所遵循的文件组织方式后, 就能更有效率地浏览它的源代码.

138.阅读代码时, 首先要确保您的编辑器或优美打印程序的tab设置, 与代码遵循的风格规范一致.

139.可以使用代码块的缩进, 快速地掌握代码的总体结构.

140.对编排不一致的代码, 应该立即给予足够的警惕.

141.分析代码时, 对标记为XXX, FIXME和TODO的代码序列要格外注意: 错误可能就潜伏在其中.

142.常量使用大写字母命名, 单词用下划线分隔.

143.在遵循Java编码规范的程序中, 包名(package name)总是从一个顶级的域名开始(例如, org, com), 类名和接口名由大写字母开始, 方法和变量名由小写字母开始.

144.用户界面控件名称之前的匈牙利记法的前缀类型标记可以帮助我们确定它的作用.

145.不同的编程规范对可移植构造的构成有不同的主张.

146.在审查代码的可移植性, 或以某种给定的编码规范作为指南时, 要注意了解规范对可移植性需求的界定与限制.

147.如果GUI功能都使用相应的编程结构来实现, 则通过代码审查可以轻易地验证给定用户界面的规格说明是否被正确地采用.

148.了解项目编译过程的组织方式与自动化方式之后, 我们就能够快速地阅读与理解对应的编译规则.

149.当检查系统的发布过程时, 常常可以将相应发行格式的需求作为基准.

++++++++++++

第八章: 文档

++++++++++++

150.阅读代码时, 应该尽可能地利用任何能够得到的文档.

151.阅读一小时代码所得到的信息只不过相当于阅读一分钟文档.

152.使用系统的规格说明文档, 了解所阅读代码的运行环境.

153.软件需求规格说明是阅读和评估代码的基准.

154.可以将系统的设计规格说明作为认知代码结构的路线图, 阅读具体代码的指引.

155.测试规格说明文档为我们提供可以用来对代码进行预演的数据.

156.在接触一个未知系统时, 功能性的描述和用户指南可以提供重要的背景信息,从而更好地理解阅读的代码所处的上下文.

157.从用户参考手册中, 我们可以快速地获取, 应用程序在外观与逻辑上的背景知识, 从管理员手册中可以得知代码的接口|文件格式和错误消息的详细信息.

158.利用文档可以快捷地获取系统的概况, 了解提供特定特性的代码.

159.文档经常能够反映和提示出系统的底层结构.

160.文档有助于理解复杂的算法和数据结构.

161.算法的文字描述能够使不透明(晦涩, 难以理解)的代码变得可以理解.

162.文档常常能够阐明源代码中标识符的含义.

163.文档能够提供非功能性需求背后的理论基础.

164.文档还会说明内部编程接口.

165.由于文档很少像实际的程序代码那样进行测试, 并受人关注, 所以它常常可能存在错误|不完整或过时.

166.文档也提供测试用例, 以及实际应用的例子.

167.文档常常还会包括已知的实现问题或bug.

168.环境中已知的缺点一般都会记录在源代码中.

169.文档的变更能够标出那些故障点.

170.对同一段源代码重复或互相冲突的更改, 常常表示存在根本性的设计缺陷, 从而使得维护人员需要用一系列的修补程序来修复.

171.相似的修复应用到源代码的不同部分, 常常表示一种易犯的错误或疏忽, 它们同样可能会在其他地方存在.

172.文档常常会提供不恰当的信息, 误导我们对源代码的理解.

173.要警惕那些未归档的特性: 将每个实例归类为合理|疏忽或有害, 相应地决定是否应该修复代码或文档.

174.有时, 文档在描述系统时, 并非按照已完成的实现, 而是系统应该的样子或将来的实现.

175.在源代码文档中, 单词gork的意思一般是指”理解”.

176.如果未知的或特殊用法的单词阻碍了对代码的理解, 可以试着在文档的术语表(如果存在的话)|New Hacker’s Dictionary[Ray96]|或在Web搜索引擎中查找它们.

177.总是要以批判的态度来看待文档, 注意非传统的来源, 比如注释|标准|出版物|测试用例|邮件列表|新闻组|修订日志|问题跟踪数据库|营销材料|源代码本身.

178.总是要以批判的态度来看待文档; 由于文档永远不会执行, 对文档的测试和正式复查也很少达到对代码的同样水平, 所以文档常常会误导读者, 或者完全错误.

179.对于那些有缺陷的代码, 我们可以从中推断出它的真实意图.

180.在阅读大型系统的文档时, 首先要熟悉文档的总体结构和约定.

181.在对付体积庞大的文档时, 可以使用工具, 或将文本输出到高品质输出设备上, 比如激光打印机, 来提高阅读的效率.

++++++++++++++

第九章: 系统构架

++++++++++++++

182.一个系统可以(在重大的系统中也确实如此)同时出多种不同的构架类型. 以不同的方式检查同一系统|分析系统的不同部分|或使用不同级别的分解, 都有可能发现不同的构架类型.

183.协同式的应用程序, 或者需要协同访问共享信息或资源的半自治进程, 一般会采用集中式储存库构架.

184.黑板系统使用集中式的储存库, 存储非结构化的键/值对, 作为大量不同代码元件之间的通信集线器.

185.当处理过程可以建模|设计和实现成一系列的数据变换时, 常常会使用数据流(或管道—过滤器)构架.

186.在批量进行自动数据处理的环境中, 经常会采用数据流构架, 在对数据工具提供大量支持的平台上尤其如此.

187.数据流构架的一个明显征兆是: 程序中使用临时文件或流水线(pipeline)在不同进程间进行通信.

188.使用图示来建模面向对象构架中类的关系.

189.可以将源代码输入到建模工具中, 逆向推导出系统的构架.

190.拥有大量同级子系统的系统, 常常按照分层构架进行组织.

191.分层构架一般通过堆叠拥有标准化接口的软件组件来实现.

192.系统中每个层可以将下面的层看作抽象实体, 并且(只要该层满足它的需求说明)不关心上面的层如何使用它.

193.层的接口既可以是支持特定概念的互补函数族, 也可以是一系列支持同一抽象接口不同底层实现的可互换函数.

194.用C语言实现的系统, 常常用函数指针的数组, 表达层接口的多路复用操作.

195.用面向对象的语言实现的系统, 使用虚方法调用直接表达对层接口的多嘴复用操作.

196.系统可以使用不同的|独特的层次分解模型跨各种坐标轴进行组织.

197.使用程序切片技术, 可以将程序中的数据和控制之间依赖关系集中到一起.

198.在并发系统中, 一个单独的系统组件起到集中式管理器的作用, 负责启动|停止和协调其他系统进程和任务的执行.

199.许多现实的系统都会博采众家之长. 当处理此类系统时, 不要徒劳地寻找无所不包的构架图; 应该将不同构架风格作为独立但相关的实体

来进行定位|识别并了解.

200.状态变迁图常常有助于理清状态机的动作.

201.在处理大量的代码时, 了解将代码分解成单独单元的机制极为重要.

202.大多数情况下, 模块的物理边界是单个文件|组织到一个目录中的多个文件或拥有统一前缀的文件的集合.

203.C中的模块, 由提供模块公开接口的头文件和提供对应实现的源文件组成.

204.对象的构造函数经常用来分配与对象相关的资源, 并初始化对象的状态. 函数一般用来释放对象在生命期中占用的资源.

205.对象方法经常使用类字段来存储控制所有方法运作的数据(比如查找表或字典)或维护类运作的状态信息(例如, 赋给每个对象一个标识符的

计数器).

206.在设计良好的类中, 所有的字段都应在声明为private, 并用公开的访问方法提供对它们的访问.

207.在遇到friend声明时, 要停下来分析一下, 看看绕过类封装在设计上的理由.

208.可以有节制地用运算符增强特定类的可用性, 但用运算符重载, 将类实现为拥有内建算术类型相关的全部功能的类实体, 是不恰当的.

209.泛型实现不是在编译期间通过宏替换或语言所支持的功能(比如C++模板和Ada的泛型包)来实现, 就是在运行期间通过使用数据元素的指针和函数的指针|或对象的多态性实现.

210.抽象数据类型经常用来封装常用的数据组织方案(比如树|列表或栈), 或者对用户隐藏数据类型的实现细节.

211.使用库的目的多种多样: 重用源代码或目标代码, 组织模块集合, 组织和优化编译过程, 或是用来实现应用程序各种特性的按需载入.

212.大型的|分布式的系统经常实现为许多互相协作的进程.

213.对于基于文本的数据储存库, 可以通过浏览存储在其中的数据, 破译出它的结构.

214.可以通过查询数据字典中的表, 或使用数据库专有的SQL命令, 比如show table, 来分析关系型数据库的模式.

215.识别出重用的构架元素后, 可以查找其最初的描述, 了解正确地使用这种构架的方式, 以及可能出现的误用.

216.要详细分析建立在某种框架之上的应用程序, 行动的最佳路线就是从研究框架自身开始.

217.在阅读向导生成的代码时, 不要期望太高, 否则您会感到失望.

218.学习几个基本的设计模式之后, 您会发现, 您查看代码构架的方式会发生改变: 您的视野和词汇将会扩展到能够识别和描述许多通用的形式.

219.频繁使用的一些模式, 但并不显式地指出它们的名称, 这是由于构架性设计的重用经常先于模式的形成.

220.请试着按照底层模式来理解构架, 即使代码中并没有明确地提及模式.

221.大多数解释器都遵循类似的处理构架, 围绕一个状态机进行构建, 状态机的操作依赖于解释器的当前状态|程序指令和程序状态.

222.多数情况下, 参考构架只是为应用程序域指定一种概念性的结构, 具体的实现并非必须遵照这种结构.

+++++++++++++++++
第十章: 代码阅读工具

+++++++++++++++++

223.词汇工具可以高效地在一个大代码文件中或者跨多个文件查找某种模式.

224.使用程序编辑器和正则表达式查找命令, 浏览庞大的源代码文件.

225.以只读方式浏览源代码文件.

226.使用正则表达式 ^function name 可以找出函数的定义.

227.使用正则表达式的字符类, 可以查找名称遵循特定模式的变量.

228.使用正则表达式的否定字符类, 可以避免非积极匹配.

229.使用正则表达式 symbol-1. *symbol-2, 可以查找出现在同一行的符号.

230.使用编辑器的 tags 功能, 可以快速地找出实体的定义.

231.可以用特定的 tag 创建工具, 增加编辑器的浏览功能.

232.使用编辑器的大纲视图, 可以获得源代码结构的鸟瞰图.

233.使用您的编辑器来检测源代码中圆括号|方括号和花括号的匹配.

234.使用 grep 跨多个文件查找代码模式.

235.使用 grep 定位符号的声明|定义和应用.

236.当您不能精确地表述要查找的内容时, 请使用关键单词的词干对程序的源代码进行查找.

237.用 grep 过滤其他工具生成的输出, 分离出您要查找的项.

238.将 grep 的输出输送到其他工具, 使复杂处理任务自动化.

239.通过对 grep 的输出进行流编辑, 重用代码查找的结果.

240.通过选取与噪音模式不匹配的输出行(grep-v), 过滤虚假的 grep 输出.

241.使用 fgrep 在源代码中查找字符串列表.

242.查找注释, 或标识符大小写不敏感的语言编写的代码时, 要使用大小写不敏感的模式匹配(grep -i).

243.使用 grep –n 命令行开关, 可以创建与给定正则表达式匹配的文件和行号的检查表.

244.可以使用 diff 比较文件或程序不同版本之间的差别.

245.在运行 diff 命令时, 可以使用 diff –b, 使文件比较算法忽略结尾的空格, 用 –w 忽略所有空白区域的差异, 用 –i 使文件比较对大小写不敏感.

246.不要对创建自己的代码阅读工具心存畏惧.

247.在构建自己的代码阅读工具时: 要充分利用现代快速原型语言所提供的能力; 从简单开始, 根据需要逐渐改进; 使用利用代码词汇结构的各种试探法; 要允许一些输出噪音或寂静(无关输出或缺失输出); 使用其他工具对输入进行预处理, 或者对输出进行后期处理.

248.要使编译器成为您的: 指定恰当级别的编译器警告, 并小心地评估生成的结果.

249.使用C预处理器理清那些滥用预处理器特性的程序.

250.要彻底地了解编译器如何处理特定的代码块, 需要查看生成的符号(汇编)代码.

251.通过分析相应目标文件中的符号, 可以清晰地了解源文件的输入和输出.

252.使用源代码浏览器浏览大型的代码集合以及对象类型.

253.要抵制住按照您的编码规范对外部代码进行美化的诱惑; 不必要的编排更改会创建不同的代码, 并妨碍工作的组织.

254.优美打印程序和编辑器语法着色可以使得程序的源代码为易读.

255.cdecl 程序可以将难以理解的C和C++类型声明转换成纯英语(反之亦然).

256.实际运行程序, 往往可以更深刻地理解程序的动作.

257.系统调用|事件和数据包跟踪程序可以增进对程序动作的理解.

258.执行剖析器可以找出需要着重优化的代码, 验证输入数据的覆盖性, 以及分析算法的动作.

259.通过检查从未执行的代码行, 可以找出测试覆盖的弱点, 并据此修正测试数据.

260.要探究程序动态动作时的每个细节, 需要在调试器中运作它.

261.将您觉得难以理解的代码打印到纸上.

262.可以绘制图示来描绘代码的动作.

263.可以试着向别人介绍您在阅读的代码, 这样做一般会增进您对代码的理解.

264.理解复杂的算法或巧妙的数据结构, 要选择一个安静的环境, 然后聚精会神地考虑, 不要借助于任何计算机化或自动化的帮助.

+++++++++++++++++++++

第十一章: 一个完整的例子

+++++++++++++++++++++

265.模仿软件的功能时, 要依照相似实体的线路(类|函数|模块). 在相似的现有实体中, 为简化对源代码库的文本查找, 应选取比较罕见的名称.

266.自动生成的文件常常会在文件的开关有一段注释, 说明这种情况.

267.如果试图精确地分析代码, 一般会陷入数量众多的类|文件和模块中, 这些内容会很快将我们淹没; 因此, 我们必须将需要理解的代码限定在绝对必需的范围之内.

268.采用一种广度优先查找策略, 从多方攻克代码阅读中存在的问题, 进到找出克服它们的方法为止.

2009年4月17日星期五

2009 最贱的话

1 :我的优点是:我很帅;但是我的缺点是:我帅的不明显.
2 :谈钱不伤感情,谈感情最他妈伤钱。
3:我诅咒你一辈子买方便面没有调料包。
4:会计说:“你晚点来领工资吧,我这没零钱。”
5 :虽然你身上喷了古龙水,但我还是能隐约闻到一股人渣味儿。
6 :有一次我上街,一群女孩把我拦住,她们说我帅,我不承认,她们就打我,还说我虚伪。
7 :冲杯三鹿给党喝。
8 :史上最神秘的部门:有关部门。
9:我这辈子只有两件事不会:这也不会,那也不会。
10:人家有的是背景,而我有的是背影。
11 :别把虾米不当海鲜。
12 :我是天使,回不去天堂是因为体重的原因。
13:泡妞就像挂QQ,每天哄她2个小时,很快就可以太阳了。
14 :骗子太多,傻子明显不够用了。
15 :你的手机比话费还便宜。
16 :不怕偷儿带工具,就怕偷儿懂科技!
17 :有空学风水去,死后占个好墓也算弥补了生前买不起好房的遗憾。
18 :明骚易躲,暗贱难防。

七个受用一生的心理寓言

(一)成长的寓言:做一棵永远成长的苹果树


  一棵苹果树,终于结果了。
  第一年,它结了10个苹果,9个被拿走,自己得到1个。对此,苹果树愤愤不平,于是自断经脉,拒绝成长。第二年,它结了5个苹果,4个被拿走,自己得到1个。“哈哈,去年我得到了10%,今年得到20%!翻了一番。”这棵苹果树心理平衡了。
  但是,它还可以这样:继续成长。譬如,第二年,它结了100个果子,被拿走90个,自己得到10个。
  很可能,它被拿走99个,自己得到1个。但没关系,它还可以继续成长,第三年结1000个果子……
  其实,得到多少果子不是最重要的。最重要的是,苹果树在成长!等苹果树长成参天大树的时候,那些曾阻碍它成长的力量都会微弱到可以忽略。真的,不要太在乎果子,成长是最重要的。

  【心理点评】你是不是一个已自断经脉的打工族?
  刚开始工作的时候,你才华横溢,意气风发,相信“天生我才必有用”。但现实很快敲了你几个闷棍,或许,你为单位做了大贡献没人重视;或许,只得到口头重视但却得不到实惠;或许……总之,你觉得就像那棵苹果树,结出的果子自己只享受到了很小一部分,与你的期望相差甚远。
  于是,你愤怒、你懊恼、你牢骚满腹……最终,你决定不再那么努力,让自己的所做去匹配自己的所得。几年过去后,你一反省,发现现在的你,已经没有刚工作时的激情和才华了。
  “老了,成熟了。”我们习惯这样自嘲。但实质是,你已停止成长了。
  这样的故事,在我们身边比比皆是。
  之所以犯这种错误,是因为我们忘记生命是一个历程,是一个整体,我们觉得自己已经成长过了,现在是到该结果子的时候了。我们太过于在乎一时的得失,而忘记了成长才是最重要的。
  好在,这不是金庸小说里的自断经脉。我们随时可以放弃这样做,继续走向成长之路。
  切记:如果你是一个打工族,遇到了不懂管理、野蛮管理或错误管理的上司或企业文化,那么,提醒自己一下,千万不要因为激愤和满腹牢骚而自断经脉。不论遇到什么事情,都要做一棵永远成长的苹果树,因为你的成长永远比每个月拿多少钱重要。

(二)动机的寓言:孩子在为谁而玩

  一群孩子在一位老人家门前嬉闹,叫声连天。几天过去,老人难以忍受。
  于是,他出来给了每个孩子25美分,对他们说:“你们让这儿变得很热闹,我觉得自己年轻了不少,这点钱表示谢意。”
  孩子们很高兴,第二天仍然来了,一如既往地嬉闹。老人再出来,给了每个孩子15美分。他解释说,自己没有收入,只能少给一些。15美分也还可以吧,孩子仍然兴高采烈地走了。
  第三天,老人只给了每个孩子5美分。
  孩子们勃然大怒,“一天才5美分,知不知道我们多辛苦!”他们向老人发誓,他们再也不会为他玩了!

  【心理点评】你在为谁而“玩”
  这个寓言是苹果树寓言的更深一层的答案:苹果树为什么会自断经脉,因为它不是为自己而“玩”。
  人的动机分两种:内部动机和外部动机。如果按照内部动机去行动,我们就是自己的主人。如果驱使我们的是外部动机,我们就会被外部因素所左右,成为它的奴隶。
  在这个寓言中,老人的算计很简单,他将孩子们的内部动机“为自己快乐而玩”变成了外部动机“为得到美分而玩”,而他操纵着美分这个外部因素,所以也操纵了孩子们的行为。寓言中的老人,像不像是你的老板、上司?而美分,像不像是你的工资、奖金等各种各样的外部奖励?
  如将外部评价当作参考坐标,我们的情绪就很容易出现波动。因为,外部因素我们控制不了,它很容易偏离我们的内部期望,让我们不满,让我们牢骚满腹。不满和牢骚等负性情绪让我们痛苦,为了减少痛苦,我们就只好降低内部期望,最常见的方法就是减少工作的努力程度。
  一个人之所以会形成外部评价体系,最主要的原因是父母喜欢控制他。父母太喜欢使用口头奖惩、物质奖惩等控制孩子,而不去理会孩子自己的动机。久而久之,孩子就忘记了自己的原初动机,做什么都很在乎外部的评价。上学时,他忘记了学习的原初动机———好奇心和学习的快乐;工作后,他又忘记了工作的原初动机———成长的快乐,上司的评价和收入的起伏成了他工作的最大快乐和痛苦的源头。
  切记:外部评价系统经常是一种家族遗传,但你完全可以打破它,从现在开始培育自己的内部评价体系,让学习和工作变成“为自己而玩”。

(三)规划的寓言:把一张纸折叠51次

  想象一下,你手里有一张足够大的白纸。现在,你的任务是,把它折叠51次。那么,它有多高?
  一个冰箱?一层楼?或者一栋摩天大厦那么高?不是,差太多了,这个厚度超过了地球和太阳之间的距离。

  【心理点评】
  到现在,我拿这个寓言问过十几个人了,只有两个人说,这可能是一个想象不到的高度,而其他人想到的最高的高度也就是一栋摩天大厦那么高。
  折叠51次的高度如此恐怖,但如果仅仅是将51张白纸叠在一起呢?
  这个对比让不少人感到震撼。因为没有方向、缺乏规划的人生,就像是将51张白纸简单叠在一起。今天做做这个,明天做做那个,每次努力之间并没有一个联系。这样一来,哪怕每个工作都做得非常出色,它们对你的整个人生来说也不过是简单的叠加而已。
  当然,人生比这个寓言更复杂一些。有些人,一生认定一个简单的方向而坚定地做下去,他们的人生最后达到了别人不可企及的高度。譬如,我一个朋友的人生方向是英语,他花了十数年努力,仅单词的记忆量就达到了十几万之多,在这一点上达到了一般人无法企及的高度。
  也有些人,他们的人生方向也很明确,譬如开公司做老板,这样,他们就需要很多技能———专业技能、管理技能、沟通技能、决策技能等等。他们可能会在一开始尝试做做这个,又尝试做做那个,没有一样是特别精通的,但最后,开公司做老板的这个方向将以前的这些看似零散的努力统合到一起,这也是一种复杂的人生折叠,而不是简单的叠加。
  切记:看得见的力量比看不见的力量更有用。
  现在,流行从看不见的地方寻找答案,譬如潜能开发,譬如成功学,以为我们的人生要靠一些奇迹才能得救。但是,在我看来,“通过规划利用好现有的能力远比挖掘所谓的潜能更重要。”

(四)逃避的寓言:小猫逃开影子的招数

  “影子真讨厌!”小猫汤姆和托比都这样想,“我们一定要摆脱它。”
  然而,无论走到哪里,汤姆和托比发现,只要一出现阳光,它们就会看到令它们抓狂的自己的影子。
  不过,汤姆和托比最后终于都找到了各自的解决办法。汤姆的方法是,永远闭着眼睛。托比的办法则是,永远待在其他东西的阴影里。

  【心理点评】
  这个寓言说明,一个小的心理问题是如何变成更大的心理问题的。
  可以说,一切心理问题都源自对事实的扭曲。什么事实呢?主要就是那些令我们痛苦的负性事件。
  因为痛苦的体验,我们不愿意去面对这个负性事件。但是,一旦发生过,这样的负性事件就注定要伴随我们一生,我们能做的,最多不过是将它们压抑到潜意识中去,这就是所谓的忘记。
  但是,它们在潜意识中仍然会一如既往地发挥作用。并且,哪怕我们对事实遗忘得再厉害,这些事实所伴随的痛苦仍然会袭击我们,让我们莫名其妙地伤心难过,而且无法抑制。这种疼痛让我们进一步努力去逃避。
  发展到最后,通常的解决办法就是这两个:要么,我们像小猫汤姆一样,彻底扭曲自己的体验,对生命中所有重要的负性事实都视而不见;要么,我们像小猫托比一样,干脆投靠痛苦,把自己的所有事情都搞得非常糟糕,既然一切都那么糟糕,那个让自己最伤心的原初事件就不是那么疼了。
  曾有人说,99%的吸毒者有过痛苦的遭遇。他们之所以吸毒,是为了让自己逃避这些痛苦。这就像是躲进阴影里,痛苦的事实是一个魔鬼,为了躲避这个魔鬼,干脆把自己卖给更大的魔鬼。
  还有很多酗酒的成人,他们有过一个酗酒而暴虐的老爸,挨过老爸的不少折磨。为了忘记这个痛苦,他们学会了同样的方法。
  除了这些看得见的错误方法外,我们人类还发明了无数种形形色色的方法去逃避痛苦,弗洛伊德将这些方式称为心理防御机制。太痛苦的时候,这些防御机制是必要的,但糟糕的是,如果心理防御机制对事实扭曲得太厉害,它会带出更多的心理问题,譬如强迫症、社交焦虑症、多重人格,甚至精神分裂症等。
  真正抵达健康的方法只有一个———直面痛苦。直面痛苦的人会从痛苦中得到许多意想不到的收获,它们最终会变成当事人的生命财富。
  切记:阴影和光明一样,都是人生的财富。
  一个最重要的心理规律是,无论多么痛苦的事情,你都是逃不掉的。你只能去勇敢地面对它,化解它,超越它,最后和它达成和解。如果你自己暂时缺乏力量,你可以寻找帮助,寻找亲友的帮助,或寻找专业的帮助,让你信任的人陪着你一起去面对这些痛苦的事情。
  美国心理学家罗杰斯曾是最孤独的人,但当他面对这个事实并化解后,他成了真正的人际关系大师;美国心理学家弗兰克有一个暴虐而酗酒的继父和一个糟糕的母亲,但当他挑战这个事实并最终从心中原谅了父母后,他成了治疗这方面问题的专家;日本心理学家森田正马曾是严重的神经症患者,但他通过挑战这个事实并最终发明出了森田疗法……他们生命中最痛苦的事实最后都变成了他们最重要的财富。你,一样也可以做到。

(五)行动的寓言———螃蟹、猫头鹰和蝙蝠

  螃蟹、猫头鹰和蝙蝠去上恶习补习班。数年过后,它们都顺利毕业并获得博士学位。不过,螃蟹仍横行,猫头鹰仍白天睡觉晚上活动,蝙蝠仍倒悬。

  【心理点评】
  这个寓言故事,它的寓意很简单:行动比知识重要。
  用到心理健康中,这个寓言也发人深省。
  心理学的知识堪称博大精深。但是,再多再好的心理学知识也不能自动帮助一个人变得更健康。其实,我知道的一些学过多年心理学的人士,他们学心理学的目的之一就是要治自己,但学了这么多年以后,他们的问题依旧。
  之所以出现这种情况,一个很重要的原因是,他们没有身体力行,那样知识就只是遥远的知识,知识并没有化成他们自己的生命体验。
  我的一个喜欢心理学的朋友,曾被多名心理学人士认为不敏感,不适合学心理学。但事实证明,这种揣测并不正确。他是不够敏感,但他有一个非常大的优点:知道一个好知识,就立即在自己的生命中去执行。这样一来,那些遥远的知识就变成了真切的生命体验,他不必“懂”太多,就可以帮助自己,并帮助很多人。
  如果说,高敏感度是一种天才素质,那么高行动力是更重要的天才素质。
  这个寓言还可以引申出另一种含义:不要太指望神秘的心理治疗的魔力。最重要的力量永远在你自己的身上,奥秘的知识、玄妙的潜能开发、炫目的成功学等等,都远不如你自己身上已有的力量重要。我们习惯去外面寻找答案,去别人那里寻找力量,结果忘记了力量就在自己身上。
  切记:别人的知识不能自动地拯救你。
  如果一些连珠的妙语打动了你,如果一些文字或新信条启发了你。那么,这些别人的文字和经验都只是一个开始,更重要的是,你把你以为好的知识真正运用到你自己的生命中去。
  犹太哲学家马丁·布伯的这句话,我一直认为是最重要的:
  你必须自己开始。假如你自己不以积极的爱去深入生存,假如你不以自己的方式去为自己揭示生存的意义,那么对你来说,生存就将依然是没有意义的。

(六)放弃的寓言:蜜蜂与鲜花

  玫瑰花枯萎了,蜜蜂仍拼命吮吸,因为它以前从这朵花上吮吸过甜蜜。但是,现在在这朵花上,蜜蜂吮吸的是毒汁。
  蜜蜂知道这一点,因为毒汁苦涩,与以前的味道是天壤之别。于是,蜜蜂愤不过,它吸一口就抬起头来向整个世界抱怨,为什么味道变了?!
  终于有一天,不知道是什么原因,蜜蜂振动翅膀,飞高了一点。这时,它发现,枯萎的玫瑰花周围,处处是鲜花。

  【心理点评】
  这是关于爱情的寓言,是一位年轻的语文老师的真实感悟。
  有一段时间,她失恋了,很痛苦,一直想约我聊聊,希望我的心理学知识能给她一些帮助。我们一直约时间,但快两个月过去了,两人的时间总不能碰巧凑在一起。
  最后一次约她,她说:“谢谢!不用了,我想明白了。”
  原来,她刚从九寨沟回来。失恋的痛苦仍在纠缠她,让她神情恍惚,不能享受九寨沟的美丽。不经意的时候,她留意到一只小蜜蜂正在一朵鲜花上采蜜。那一刹那间,她脑子里电闪雷鸣般地出现了一句话:“枯萎的鲜花上,蜜蜂只能吮吸到毒汁。”
  当然,大自然中的小蜜蜂不会这么做,只有人类才这么傻,她这句话里的蜜蜂当然指她自己。这一刹那,她顿悟出了放弃的道理。以前,她想让我帮她走出来,但翅膀其实就长在她自己身上,她想飞就能飞。
  放弃并不容易,爱情中的放弃尤其令人痛苦。因为,爱情是对我们幼小时候的亲子关系的复制。幼小的孩子,无论从哪个方面看,都离不开爸爸妈妈。如果爸爸妈妈完全否定他,那对他来说就意味着死亡,这是终极的伤害和恐惧。我们多多少少都曾体验过被爸爸妈妈否定的痛苦和恐惧,所以,当爱情———这个亲子关系的复制品再一次让我们体验这种痛苦和恐惧时,我们的情绪很容易变得非常糟糕。
  不过,爱情和亲子关系相比,有一个巨大的差别:小时候,我们无能为力,一切都是父母说了算;但现在,我们长大了,我们有力量自己去选择自己的命运。可以说,童年时,我们是没有翅膀的小蜜蜂,但现在,我们有了一双强有力的翅膀了。
  但是,当深深地陷入爱情时,我们会回归童年,我们会忘记自己有一双可以飞翔的翅膀。等我们自己悟出这一点后,爱情就不再会是对亲子关系的自动复制,我们的爱情就获得了自由,就有了放弃的力量。
  切记:爱情是两个人的事情,两个完全平等的、有独立人格的人的事情。你可以努力,但不是说,你努力了就一定会有效果,因为另一个人,你并不能左右。
  所以,无论你多么在乎一次爱情,如果另一个人坚决要离开你,请尊重他的选择。
  并且,还要记得,你不再是童年,只能听凭痛苦的折磨。你已成人,你有一双强有力的翅膀,你完全可以飞出一个已经变成毒药的关系。

(七)亲密的寓言:独一无二的玫瑰

  小王子有一个小小的星球,星球上忽然绽放了一朵娇艳的玫瑰花。以前,这个星球上只有一些无名的小花,小王子从来没有见过这么美丽的花,他爱上这朵玫瑰,细心地呵护她。
  那一段日子,他以为,这是一朵人世间唯一的花,只有他的星球上才有,其他的地方都不存在。
  然而,等他来到地球上,发现仅仅一个花园里就有5000朵完全一样的这种花朵。这时,他才知道,他有的只是一朵普通的花。
  一开始,这个发现,让小王子非常伤心。但最后,小王子明白,尽管世界上有无数朵玫瑰花,但他的星球上那朵,仍然是独一无二的,因为那朵玫瑰花,他浇灌过,给她罩过花罩,用屏风保护过,除过她身上的毛虫,还倾听过她的怨艾和自诩,聆听过她的沉默……一句话,他驯服了她,她也驯服了他,她是他独一无二的玫瑰。
  “正因为你为你的玫瑰花费了时间,这才使你的玫瑰变得如此重要。”一只被小王子驯服的狐狸对他说。

  【心理点评】
  这是法国名著《小王子》中一个有名的寓言故事,我曾读过十数遍,但仍然是直到2005年才明白这一点。
  面对着5000朵玫瑰花,小王子说:“你们很美,但你们是空虚的,没有人能为你们去死。”
  只有倾注了爱,亲密关系才有意义。但是,现在我们越来越流行空虚的“亲密关系”,最典型的就是因网络而泛滥的一夜情。
  我们急着去拥有。仿佛是,每多拥有过一朵玫瑰,自己的生命价值就多了一分。网络时代,拥有过数十名情人,已不再是太罕见的事情。但我所了解的这些滥情者,没有一个是不空虚的。他们并不享受关系,他们只享受征服。
  “征服欲望越强的人,对于关系的亲密度越没有兴趣。”广州白云心理医院的咨询师荣玮龄说,“没有拥有前,他们会想尽一切办法拉近关系的距离。但一旦拥有后,他们会迅速丧失对这个亲密关系的兴趣。征服欲望越强,丧失的速度越快。”
  对于这样的人,一个玫瑰园比起一朵独一无二的玫瑰花来,更有吸引力。
  然而,关系的美,正在乎两人的投入程度和被驯服程度。当两个人都自然而然地去投入,自然而然地被驯服后,关系就会变成人生养料,让一个人的生命变得更充盈、更美好。
  但是,无论多么亲密。小王子仍是小王子,玫瑰仍是玫瑰,他们仍然是两个个体。如果玫瑰不让小王子旅行,或者小王子旅行时非将玫瑰花带在身上,两者一定要黏在一起,关系就不再是享受,而会变成一个累赘。
  切记:一个既亲密而又相互独立的关系,胜于一千个一般的关系。这样的关系,会把我们从不可救药的孤独感中拯救出来,是我们生命中最重要的一种救赎。
  如果不曾体验过,你就无法知道这种关系的美。


2009年4月16日星期四

零和竞争

零和竞争:通常指一种技术的应用带来的市场份额上的增加,必然会导致另一种技术在市场份额的减少,双方加起来的总变化量为零。现在也用来比喻无法带来总量增加或整体进步的恶性竞争。

零和竞争(zero game)是博弈论(game theory)中的术语,是从西方语言中意译而来,同汉语里的“此消彼长”有相通之处,我们可以据此来理解。按照博弈论,生活中工作中几乎所有的行动都可被看作一次次的博弈过程,如何看待博弈的优劣,简单就是看其是否是零和竞争。零和竞争意味着有赢必有输,而非零和竞争则不同,它有两层意思,一是两方(也可多方)共赢,另外是两方(也可多方)共损,长期有利于博弈参与者的是共赢的博弈,也就是第一种情况,也只有这样,才有优胜劣汰。市场经济中很多经济活动无不如此。

用vs2005编写python


1. 添加工具:工具->外部工具->添加
设置如下:
2. 添加工具栏,工具->自定义-》命令-》工具

将“外部工具n”拖到工具栏上,如下图:

3.新建一个 test.py 测试一下:


2009年4月14日星期二

如何提高 情商 EQ



我们无法预定智商,却可以提高情商,一个杰出的人未必有着高智商,却一定有着高情商。提高情商其实有着简而易行的方法,你需要的就是坚持。
1. 学会划定恰当的心理界限,这对每个人都有好处。

你也许自认为与他人界限不明是一件好事,这样一来大家能随心所欲地相处,而且相互之间也不用激烈地讨价还价。这听起来似乎有点道理,但它的不利之处在于,别人经常伤害了你的感情而你却不自知。

其实仔细观察周遭你不难发现,界限能力差的人易于患上病态恐惧症,他们不会与与侵犯者对抗,而更愿意向第三者倾诉。如果我们是那个侵犯了别人心理界限的人,发现事实的真相后,我们会感觉自己是个冷血的大笨蛋。同时我们也会感到受伤害,因为我们既为自己的过错而自责,又对一个第三者卷进来对我们评头论足而感到愤慨。

界限清晰对大家都有好处。你必须明白什么是别人可以和不可以对你做的。当别人侵犯了你的心理界限,告诉他,以求得改正。如果总是划不清心理界限,那么你就需要提高自己的认知水平。

2. 找一个适合自己的方法,在感觉快要失去理智时使自己平静下来,从而使血液留在大脑里,做出理智的行动。

美国人曾开玩笑地说:当遇到事情时,理智的孩子让血液进入大脑,能聪明地思考问题;野蛮的孩子让血液进入四肢,大脑空虚,疯狂冲动。

是的,当血液充满大脑的,你头脑清醒,举止得当,反之,当血液都流向你的四肢和舌头的时候,你就会做蠢事,冲动暴躁,口不择言。

事实上,科学实验证明,当我们在压力之下变得过度紧张时,血液的确会离开大脑皮层,于是我们就会举止失常。此时,大脑中动物的本性起了主导作用,使我们像最原始的动物那样行事。要知道,在文明社会中,表现得像个原始动物会带来大麻烦。

控制情绪爆发有很多策略,其中一个方法就是注意你的心律,它是衡量情绪的精确尺子。当你的心跳快至每分钟100次以上时,整顿一下情绪至关重要。在这种速率下,身体分泌出比平时多得多的肾上腺素。我们会失去理智,变成好斗的蟋蟀。

当血液又开始涌向四肢时,你可以选用以下的方法来平静心情:

1、深呼吸,直至冷静下来。慢慢地、深深地吸气,让气充满整个肺部。把一只手放在腹部,确保你的呼吸方法正确。

2、自言自语。比如对自己说:“我正在冷静。”或者说:“一切都会过去的。”

3、有些人采用水疗法。洗个热水盆浴,可能会让你的怒气和焦虑随浴液的泡沫一起消失。

4、你也可以尝试美国心理学家唐纳·艾登的方法:想着不愉快的事,同时把你的指尖放在眉毛上方的额头上,大拇指按着太阳穴,深吸气。据艾登说,这样做只要几分钟,血液就会重回大脑皮层,你就能更冷静地思考了。

3. 想抱怨时,停一下先自问:“我是想继续忍受这看起来无法改变的情形呢,还是想改变它呢?”

对于没完没了的抱怨,我们称之为唠叨。抱怨会消耗用力而又不会有任何结果,对问题的毫无用处,又很少会使我们感到好受一点。

几乎所有的人都发现,如果对有同情心的第三方倾诉委屈,而他会跟着一起生气的话,我们会感觉好受一些。有人对你说:“可怜的宝贝。”这对你来说是莫大的安慰,你的压力似乎减轻了,于是你又能重新面对原有的局面了,尽管事情没有任何改变。

但是如果你不抱怨呢,你会感受到巨大的心理压力。压力有时并不是个坏东西,是的,它也许会让你感觉不舒服,但同时也是促使你进行改变的力量。一旦压力减轻,人就容易维持现状。然而,如果压力没有在抱怨中流失,它就会推积起来,到达一个极限,迫使你采取行动变现状。

因此,当你准备向一个同情你的朋友报怨的,先自问一下:我是想减轻压力保持现状呢,还是想让压力持续下去促使我改变这一切呢?如果是前者,那就通过报怨把压力赶走吧。逐个人都有发牢骚的时侯,它会让我们暂时好受一些。但如果情况确实需要改变的话,下定决心切实行动起来吧!

4. 扫除一切浪费精力的事物。

什么是不利于我们提高情商的力量呢?答案就是一切浪费精力的事物。

许多人的神经系统就像父亲的手一样长了厚厚的老茧。我们已经习惯于意识不到精力的消耗。精力是微妙的,但也可以体会到明显的变化,比如听到好消息时,肾上腺素会激增,而听到坏消息时,会感到精疲力竭。我们通常不会留意精力细微地消耗,比如与一个消极的人相处、在桌上到处找一张纸等等。

你的生活中有哪些缓慢消耗精力的事情?我家的墙角堆着一小块地毯,每次看到它,我都会想可能有人会被它绊倒。这本不是什么大不了的问题,但它分散我的精力。这就是我们如何界定分散精力的事物——每次接触之后都会感到精力被分散了。有时和朋友所处也是如此——相互吸取和给予精力——但有些是精力的吸血鬼,他们只会吸取你的精力。这时有两个选择:一是正视这个问题,建立心理界限继续与他们谨慎交往;另一个是减少与这种人交往。

的确,我们需要去除缓慢地浪费精力的东西,解脱出来以集中精力提高我们的情商。

想加速——你可以选择减小阻力或增加推动力。

试试我们提供的方法吧:

1、经常列出消耗你精力的事情。

2、系统地分析一下名单,并分成两部分:

A、可以有所作为的。

、不可改变的。

3、逐一解决A单中的问题。比如对我来说,把汽车钥匙挂在一个固定的钩子上,这样就不用到处找了。

4、再看一下B单中的问题,你是否有把握?有没有把其中一些移到A单加以解决的可能?

5、放弃B单中的问题。

5. 找一个生活中鲜活的榜样。

我们都曾经历过学榜样的年代,那些榜样对于我们来说高尚而又疏远。于是我们学榜样的热忱在和榜样的距离中渐渐熄灭了,因为我们知道,自己也许一生都成不了大英雄。

是的,你不能成为大英雄,但你可以成为一个快乐的常人,比如你的朋友丹宁,她精力充沛、年轻、大方、聪明、有趣。她经营妇科诊所、做公司顾问、为一家市被定期写专栏文章,有英俊的丈夫和可爱的女儿。

你身边有这样的出色人物吗,把他作为你的榜样吧!你可以想:她所能做的我也可以,但我们的风格迥异,我不可能以她的方式完成她所做的事。但我会模仿她做的一些事,以我的方式来完成。从她身上你总能看到从来没察觉到的自身潜能。

在周围的人中找出你学习的榜样吧!他们比你虽聪明、所受教育更好、层次更高、比你更有毅力。你会在追赶他们的过程中自然地提高自己的情商。

6. 为人父母。

为人父母会教会你很多东西。当孩子尖叫“为什么不给我买?我恨你!”时,你不能绝望,不能暴怒,你需要理解他并接受极怨恨的现实。要知道,这是孩子所能给予你的最好的礼物,当然这种恨不要持续下去。

养育孩子是一个双赢的结局。在养育孩子的过程中,孩子学会了如何与还不算成熟的年轻父母相处。作为父母的我们,则在抑制我们的需求来满足孩子的需求的过程中磨平了棱角。养育孩子会自动提高我们的情商,使我们成为更合格的父母。

如果你不愿意生养孩子,不妨试试为朋友看孩子,与孩子相处可以真正地提高我们的情商。

7. 从难以相处的人身上学到东西。

我们的周围有很多牢骚满腹,横行霸道、装胆作势的人,我们多么希望这些人从生活中消失,因为他们会让人生气和绝望,甚至发狂。为什么不能把这些人圈起来,买张飞机票,送到一个小岛上,在那里他们再也不

会打扰到别人。可是,最好别这样,这些难以相处的人是我们提高情商的帮手。你可以从多嘴多舌的人身上学会沉默,从脾气暴躁的人身上学会忍耐,从恶人身上学到善良,而且你不用对这些老师感激涕零。

而且,你定义的“难以相处的人”,最终被证明可能只是与你不同的人,而对所谓的难以相处的人来说,你也是难以相处的人。

应付难以相处的人最有效的方式就是灵活。也就是说,发现他们的方式,在与之交往的过程中,尽量灵活到采用与之相同的方式。如果这人喜欢先闲谈再谈正事的话,你的反应应当是放松下来,聊聊家常。另一方面,如果这人直截了当,你也应当闲话少说,直奔主题。这样,在与难以相处的人打交道时会更有效率,而且会发现这些人并不那么难以相处。

应付难以相处的人的第二点就是把他们当成礼物。朱迪嫁给了一个霸道的人。婚姻生活对她来说充满坎坷,因为她没有很明确的界限。在分手多年以后,她学会了感谢他,因为他教给她建立和维持界限的重要性。现在再遇到这样的男人时,她根本不在乎。朱迪说:“当与他一起生活过以后,这些家伙你就会根本不放在眼里。”如果她当时嫁给了一个随和的人,她可能到现在还没有明确的界限,也很难对付那些难缠的家伙。

不过,如果可以选择的话,或许我们永远不会选择难以相处的人。

8. 时不时尝试另一种完全不同的方式,你会拓宽视野,提高情商。

你是一个性格开朗外向的人还是性格内向、只喜欢独处或和几个密友在一起的人呢?你喜欢提前计划好每一天,以知道要干些什么事,还是毫无计划呢?人人都有自己的偏爱,如果可以选择的话,每个人都会选择自己偏爱的方式。然而,突然常规,尝试截然相反的行动会更有助于我们的成长。

如果你总是聚会中热衷于做中心人物,这次改改吧,试着让那些平日毫不起眼的人出出风头。如果你总是被动地等待别人和你搭讪,不妨主动上前向对方问个好。

2009年4月9日星期四

sun is down?

IBM 收购 sun的消息从上月开始闹得沸沸扬扬,但最终以谈判破裂而告终。sun方面,施瓦茨想接受每股9.40美元的报价,而麦克尼利不同意;IBM方面,收购 sun会导致两个公司在服务器、操作系统、数据库方面的业务重合,很明显是一种资源浪费,对于两个公司来说未必是件好事;IBM认为对高级工程人员的支出比原来预期的高很多,IBM调低了对Sun的收购股价,从原来的9.55美元每股调低到9.40美元每股,而这个新价格比Sun预期中的要低,谈崩啦……

IBM自从将eclipse开源以来,和Sun在java的企业应用等众多方向一直竞争不断,从eclipse(日蚀)的命名我们可以看到一点端倪。

从去年开始 sun不断的重组,频繁的裁员,仍然不能力挽股市上的颓势。

IBM和SUN的结合,无疑会在硅谷升起一轮蓝色太阳,其蓝色帝国的地位将更加巩固…其结果还是很令人期待的。然而现在谈判破裂,自由SUN未来如何?重组、裁员?残延苟喘,病入膏肓,等待死亡?寻找下一个东家?

又上演了google 和 yahoo的一幕,哎,历史是如此的相似!

本文首次贴在我的appspot:http://see-see.appspot.com/ GAE要收费啦,以后就贴在这里啦……