9/13/2008

Many tips for optimize your php code

1。 If a method can be static, declare it static。 Speed improvement is by a factor of 4。 如果一个方法可静态化,就对它做静态声明。速率可提升至4倍。

2。 echo is faster than print。 echo 比 print 快。

3。 Use echo’s multiple parameters instead of string concatenation。 使用echo多重参数(译注:指用逗号而不是句点)代替字符串连接。

4。 Set the maxvalue for your for-loops before and not in the loop。 在执行for循环之前确定最大循环数,不要每循环一次都计算最大值。

5。 Unset your variables to free memory, especially large arrays。 注销那些不用变量尤其是大数组,以便释放内存。

6。 Avoid magic like __get, __set, __autoload 尽量避免使用__get,__set,__autoload。

7。 require_once() is expensive 少用require_once()

8。 Use full paths in includes and requires, less time spent on resolving the OS paths。 在包含文件时使用完整路径,解析操作系统路径所需时间会更少。

9。 If you need to find out the time when the script started executing, $_SERVER[’REQUEST_TIME’] is preferred to time() 如果你想知道脚本开始执行时刻,使用$_SERVER[‘REQUEST_TIME’]要好于 time()。

10。 See if you can use strncasecmp, strpbrk and stripos instead of regex。 检查是否能用strncasecmp,strpbrk,stripos函数代替正则表达式完成相同功能。

11。 str_replace is faster than preg_replace, but strtr is faster than str_replace by a factor of 4。 str_replace函数比preg_replace函数快,但strtr函数效率是str_replace函数(9php.com)四倍。

12。 If the function, such as string replacement function, accepts both arrays and single characters as arguments, and if your argument list is not too long, consider writing a few redundant replacement statements, passing one character at a time, instead of one line of code that accepts arrays as search and replace arguments。如果一个字符串替换函数,可接受数组或字符作为参数,并且参数长度不太长,那么可以考虑额外写一段替换代码,使得每次传递参数是一个字符,而不是只写一行代码接受数组作为查询和替换参数。

13。 It’s better to use select statements than multi if, else if, statements。 使用选择分支语句好于使用多个if,else if语句。

14。 Error suppression with @ is very slow。 用@屏蔽错误消息做法非常低效。

15。 Turn on apache’s mod_deflate 打开apachemod_deflate模块。

16。 Close your database connections when you’re done with them。 数据库连接当使用完毕时应关掉。

17。 $row[’id’] is 7 times faster than $row[id]。 $row[‘id’]效率是$row[id]7倍。

18。 Error messages are expensive。 错误消息代价昂贵。

19。 Do not use functions inside of for loop, such as for ($x=0; $x < x="0;">prop++) is 3 times slower than a local variable。 递增一个对象属性(如:$this->prop++)要比递增一个局部变量慢3倍。

23。 Incrementing an undefined local variable is 9-10 times slower than a pre-initialized one。递增一个未预定义局部变量要比递增一个预定义局部变量慢9至10倍。

24。 Just declaring a global variable without using it in a function also slows things down (by about the same amount as incrementing a local var)。 PHP probably does a check to see if the global exists。仅定义一个局部变量而没在函数中调用它,同样会减慢速度(其程度相当于递增一个局部变量)。PHP大概会检查看是否存在全局变量。

25。 Method invocation appears to be independent of the number of methods defined in the class because I added 10 more methods to the test class (before and after the test method) with no change in performance。方法调与类中定义方法数量无关

26。 Methods in derived classes run faster than ones defined in the base class。 派生类中方法运行起来要快于在基类中定义同样方法。

27。 A function call with one parameter and an empty function body takes about the same time as doing 7-8 $localvar++ operations。 A similar method call is of course about 15 $localvar++ operations。调用带有一个参数空函数,其花费时间相当于执行7至8次局部变量递增操作。类似 方法调用所花费时间接近于15次局部变量递增操作。

28。 Surrounding your string by ‘ instead of " will make things interpret a little faster since php looks for variables inside "…" but not inside ‘…’。 Of course you can only do this when you don’t need to have variables in the string。用单引号代替双引号来包含字符串,这样做会更快一些。因为PHP会在双引号包围字符串中搜寻变量,单引号则不会。当然,只有当你不需要在字符串中包含变量时才可以这么做。

29。 When echoing strings it’s faster to separate them by comma instead of dot。 Note: This only works with echo, which is a function that can take several strings as arguments。输出多个字符串时,用逗号代替句点来分隔字符串,速度更快。注意:只有echo能这么做,它是一种可以把多个字符串当作参数“函数 ”(译注:PHP手册中说echo是语言结构,不是真正函数,故把函数加上了双引号)。

30。 A PHP script will be served at least 2-10 times slower than a static HTML page by Apache。 Try to use more static HTML pages and fewer scripts。 Apache解析一个PHP脚本时间要比解析一个静态HTML页面慢2至10倍。尽量多用静态HTML页面,少用脚本。

31。 Your PHP scripts are recompiled every time unless the scripts are cached。 Install a PHP caching product to typically increase performance by 25-100% by removing compile times。除非脚本可以缓存,否则每次调用时都会重新编译一次。引入一套PHP缓存机制通常可以提升25%至100%性能,以免除编译开销。

32。 Cache as much as possible。 Use memcached - memcached is a high-performance memory object caching system intended to speed up dynamic web applications by alleviating database load。 OP code caches are useful so that your script does not have to be compiled on every request。尽量做缓存,可使用memcached。memcached是一款高性能内存对象缓存系统,可用来加速动态Web应用程序,减轻数据库负载。对运算码缓存很有用,使得脚本不必为每个请求做重新编译。

33。 When working with strings and you need to check that the string is either of a certain length you’d understandably would want to use the strlen() function。 This function is pretty quick since it’s operation does not perform any calculation but merely return the already known length of a string available in the zval structure (internal C struct used to store variables in PHP)。 However because strlen() is a function it is still somewhat slow because the function call requires several operations such as lowercase & hashtable lookup followed by the execution of said function。 In some instance you can improve the speed of your code by using an isset() trick。当操作字符串并需要检验其长度是否满足某种要求时,你想当然地会使用strlen()函数。此函数执行起来相当快,因为它不做任何计算,只返回在zval 结构(C内置数据结构,用于存储PHP变量)中存储已知字符串长度。但是,由于strlen()是函数,多多少少会有些慢,因为函数调用会经过诸多步骤,如字母小写化(译注:指函数名小写化,PHP不区分函数名大小写)、哈希查找,会跟随被调用(函数一起执行。在某些情况下,你可以使用isset()技巧加速执行你代码。

举例如下
if (strlen($foo) < 5) { echo "Foo is too short"; } 与下面做比较 if (!isset($foo{5})) { echo "Foo is too short"; } Calling isset() happens to be faster then strlen() because unlike strlen(), isset() is a language construct and not a function meaning that it’s execution does not require function lookups and lowercase。 This means you have virtually no overhead on top of the actual code that determines the string’s length。调用isset()恰巧比strlen()快,因为与后者不同是,isset()作为一种语言结构,意味着它执行不需要函数查找和字母小写化。也就是说,实际上在检验字符串长度顶层代码中你没有花太多开销。 34。 When incrementing or decrementing the value of the variable $i++ happens to be a tad slower then ++$i。 This is something PHP specific and does not apply to other languages, so don’t go modifying your C or Java code thinking it’ll suddenly become faster, it won’t。 ++$i happens to be faster in PHP because instead of 4 opcodes used for $i++ you only need 3。 Post incrementation actually causes in the creation of a temporary var that is then incremented。 While pre-incrementation increases the original value directly。 This is one of the optimization that opcode optimized like Zend’s PHP optimizer。 It is still a good idea to keep in mind since not all opcode optimizers perform this optimization and there are plenty of ISPs and servers running without an opcode optimizer。当执行变量$i递增或递减时,$i++会比++$i慢一些。这种差异是PHP特有,并不适用于其他语言,所以请不要修改你C或Java代码并指望它们能立即变快,没用。++$i更快是因为它只需要3条指令 (opcodes),$i++则需要4条指令。后置递增实际上会产生一个临时变量,这个临时变量随后被递增。而前置递增直接在原值上递增。这是最优化处理一种,正如ZendPHP优化器所作那样。牢记这个优化处理不失为一个好主意,因为并不是所有指令优化器都会做同样优化处理,并且存在大量没有装配指令优化器互联网服务提供商(ISPs)和服务器。 35。 Not everything has to be OOP, often it is too much overhead, each method and object call consumes a lot of memory。并不是事必面向对象(OOP),面向对象往往开销很大,每个方法和对象调用都会消耗很多内存。 36。 Do not implement every data structure as a class, arrays are useful, too。 并非要用类实现所有数据结构,数组也很有用。 37。 Don’t split methods too much, think, which code you will really re-use。 不要把方法细分得过多,仔细想想你真正打算重用是哪些代码? 38。 You can always split the code of a method later, when needed。 当你需要时,你总能把代码分解成方法。 39。 Make use of the countless predefined functions。 尽量采用大量PHP内置函数。 40。 If you have very time consuming functions in your code, consider writing them as C extensions。如果在代码中存在大量耗时函数,你可以考虑用C扩展方式实现它们。 41。 Profile your code。 A profiler shows you, which parts of your code consumes how many time。 The Xdebug debugger already contains a profiler。 Profiling shows you the bottlenecks in overview。评估检验(profile)你的代码。检验器会告诉你,代码哪些部分消耗了多少时间。Xdebug调试器包含了检验程序,评估检验总体上可以显示出代码瓶颈。 42。 mod_gzip which is available as an Apache module compresses your data on the fly and can reduce the data to transfer up to 80%。 mod_zip可作为Apache模块,用来即时压缩你数据,并可让数据传输量降低80%
更多

数据库 设计与优化 - halemyan的专栏 - CSDNBlog

数据库 设计与优化 - halemyan的专栏 - CSDNBlog

数据库中主键和外键的设计原则

主键和外键是把多个表组织为一个有效的关系数据库的粘合剂。主键和外键的设计对物理数据库的性能和可用性都有着决定性的影响。

必须将数据库模式从理论上的逻辑设计转换为实际的物理设计。而主键和外键的结构是这个设计过程的症结所在。一旦将所设计的数据库用于了生产环境,就很难对这些键进行修改,所以在开发阶段就设计好主键和外键就是非常必要和值得的。

主键:

关系数据库依赖于主键---它是数据库物理模式的基石。主键在物理层面上只有两个用途:

1. 惟一地标识一行。

2. 作为一个可以被外键有效引用的对象。

基于以上这两个用途,下面给出了我在设计物理层面的主键时所遵循的一些原则:

1. 主键应当是对用户没有意义的。如果用户看到了一个表示多对多关系的连接表中的数据,并抱怨它没有什么用处,那就证明它的主键设计地很好。

2. 主键应该是单列的,以便提高连接和筛选操作的效率。

注:使用复合键的人通常有两个理由为自己开脱,而这两个理由都是错误的。其一是主键应当具有实际 意义,然而,让主键具有意义只不过是给人为地破坏数据库提供了方便。其二是利用这种方法可以在描述多对多关系的连接表中使用两个外部键来作为主键,我也反 对这种做法,理由是:复合主键常常导致不良的外键,即当连接表成为另一个从表的主表,而依据上面的第二种方法成为这个表主键的一部分,然,这个表又有可能 再成为其它从表的主表,其主键又有可能成了其它从表主键的一部分,如此传递下去,越靠后的从表,其主键将会包含越多的列了。

3. 永远也不要更新主键。实际上,因为主键除了惟一地标识一行之外,再没有其他的用途了,所以也就没有理由去对它更新。如果主键需要更新,则说明主键应对用户无意义的原则被违反了。

注:这项原则对于那些经常需要在数据转换或多数据库合并时进行数据整理的数据并不适用。

4. 主键不应包含动态变化的数据,如时间戳、创建时间列、修改时间列等。

5. 主键应当有计算机自动生成。如果由人来对主键的创建进行干预,就会使它带有除了惟一标识一行以外的意义。一旦越过这个界限,就可能产生认为修改主键的动机,这样,这种系统用来链接记录行、管理记录行的关键手段就会落入不了解数据库设计的人的手中。

数据库设计常识

表和字段的设计(数据库逻辑设计)
表设计原则
1) 标准化和规范化 数 据的标准化有助于消除数据库中的数据冗余。标准化有好几种形式,但Third Normal Form(3NF)通常被认为在性能、扩展性和数据完整性方 面达到了最好平衡。简单来说,遵守3NF 标准的数据库的表设计原则是:“One Fact in One Place”即某个表只包括其本身基本的属性,当不是它们本身所具有的属性时需进行分解。表之间的关系通过外键相连接。它具有以下特点:有一组表专门存放通过键连接起来的关联数据。
举例:某个存放客户及其有关定单的3NF 数据库就可能有两个表:Customer 和Order。Order 表不包含定单关联客户的任何信息,但表内会存放一个键值,该键指向Customer 表里包含该客户信息的那一行。事实上,为了效率的缘故,对表不进行标准化有时也是必要的。

2) 数据驱动 采用数据驱动而非硬编码的方式,许多策略变更和维护都会方便得多,大大增强系统的灵活性和扩展性。 举例,假如用户界面要访问外部数据源(文件、XML 文档、其他数据库等),不妨把相应的连接和路径信息存储在用户界面支持表里。还有,如果用户界面执行工作流之类的任务(发送邮件、打印信笺、修改记录状态等),那么产生工作流的数据也可以存放在数据库里。角色权限管理也可以通过数据驱动来完成。事实上,如果过程是数据驱动的,你就可以把相当大的责任推给用户,由用户来维护自己的工作流过程。

3) 考虑各种变化 在设计数据库的时候考虑到哪些数据字段将来可能会发生变更。举例,姓氏就是如此(注意是西方人的姓氏,比如女性结婚后从夫姓等)。所以,在建立系统存储客户信息时,在单独的一个数据表里存储姓氏字段,而且还附加起始日和终止日等字段,这样就可以跟踪这一数据条目的变化。

字段设计原则
4) 每个表中都应该添加的3 个有用的字段

* CreationDate,在VB 下默认是Now(),而在SQL Server 下默认为GETDATE()
* ModifyDate,记录修改的时间

5) 对地址和电话采用多个字段
描述街道地址就短短一行记录是不够的。Address_Line1、Address_Line2 和Address_Line3 可以提供更大的灵活性。还有,电话号码和邮件地址最好拥有自己的数据表,其间具有自身的类型和标记类别。

6) 使用角色实体定义属于某类别的列
在需要对属于特定类别或者具有特定角色的事物做定义时,可以用角色实体来创建特定的时间关联关系,从而可以实现自我文档化。
举例:用PERSON 实体和PERSON_TYPE 实体来描述人员。比方说,当John Smith, Engineer 提升为 John Smith, Director 乃至最后爬到John Smith, CIO 的高位,而所有你要做的不过是改变两个表PERSON 和 PERSON_TYPE 之间关系的键值,同时增加一个日期/时间字段来知道变化是何时发生的。这样,你的PERSON_TYPE 表就包含了所有 PERSON 的可能类型,比如Associate、Engineer、Director、CIO 或者CEO 等。还有个替代办法就是改变 PERSON 记录来反映新头衔的变化,不过这样一来在时间上无法跟踪个人所处位置的具体时间。

7) 选择数字类型和文本类型尽量充足
在SQL 中使用smallint 和tinyint 类型要特别小心。比如,假如想看看月销售总额,总额字段类型是smallint,那么,如果总额超过了$32,767 就不能进行计算操作了。
而ID 类型的文本字段,比如客户ID 或定单号等等都应该设置得比一般想象更大。假设客户ID 为10 位数长。那你应该把数据库表字段的长度设为12 或者13 个字符长。但这额外占据的空间却无需将来重构整个数据库就可以实现数据库规模的增长了。

8) 增加删除标记字段
在表中包含一个“删除标记”字段,这样就可以把行标记为删除。在关系数据库里不要单独删除某一行;最好采用清除数据程序而且要仔细维护索引整体性。

3. 选择键和索引(数据库逻辑设计)
键选择原则:
1) 键设计4 原则

* 为关联字段创建外键。
* 所有的键都必须唯一。
* 避免使用复合键。
* 外键总是关联唯一的键字段。

2) 使用系统生成的主键
设计数据库的时候采用系统生成的键作为主键,那么实际控制了数据库的索引完整性。这样,数据库和非人工机制就有效地控制了对存储数据中每一行的访问。采用系统生成键作为主键还有一个优点:当拥有一致的键结构时,找到逻辑缺陷很容易。

3) 不要用用户的键(不让主键具有可更新性)
在确定采用什么字段作为表的键的时候,可一定要小心用户将要编辑的字段。通常的情况下不要选择用户可编辑的字段作为键。

4) 可选键有时可做主键
把可选键进一步用做主键,可以拥有建立强大索引的能力。


索引使用原则

索引是从数据库中获取数据的最高效方式之一。95%的数据库性能问题都可以采用索引技术得到解决。

1) 逻辑主键使用唯一的成组索引,对系统键(作为存储过程)采用唯一的非成组索引,对任何外键列采用非成组索引。考虑数据库的空间有多大,表如何进行访问,还有这些访问是否主要用作读写。

2) 大多数数据库都索引自动创建的主键字段,但是可别忘了索引外键,它们也是经常使用的键,比如运行查询显示主表和所有关联表的某条记录就用得上。

3) 不要索引memo/note 字段,不要索引大型字段(有很多字符),这样作会让索引占用太多的存储空间。

4) 不要索引常用的小型表
不要为小型数据表设置任何键,假如它们经常有插入和删除操作就更别这样作了。对这些插入和删除操作的索引维护可能比扫描表空间消耗更多的时间。

4. 数据完整性设计(数据库逻辑设计)

1) 完整性实现机制:
实体完整性:主键
参照完整性:
父表中删除数据:级联删除;受限删除;置空值
父表中插入数据:受限插入;递归插入
父表中更新数据:级联更新;受限更新;置空值
DBMS对参照完整性可以有两种方法实现:外键实现机制(约束规则)和触发器实现机制
用户定义完整性:
NOT NULL;CHECK;触发器

2) 用约束而非商务规则强制数据完整性
采用数据库系统实现数据的完整性。这不但包括通过标准化实现的完整性而且还包括数据的功能性。在写数据的时候还可以增加触发器来保证数据的正确性。不要依赖于商务层保证数据完整性;它不能保证表之间(外键)的完整性所以不能强加于其他完整性规则之上。

3) 强制指示完整性
在有害数据进入数据库之前将其剔除。激活数据库系统的指示完整性特性。这样可以保持数据的清洁而能迫使开发人员投入更多的时间处理错误条件。

4) 使用查找控制数据完整性
控制数据完整性的最佳方式就是限制用户的选择。只要有可能都应该提供给用户一个清晰的价值列表供其选择。这样将减少键入代码的错误和误解同时提供数据的一致性。某些公共数据特别适合查找:国家代码、状态代码等。

5) 采用视图
为了在数据库和应用程序代码之间提供另一层抽象,可以为应用程序建立专门的视图而不必非要应用程序直接访问数据表。这样做还等于在处理数据库变更时给你提供了更多的自由。

5. 其他设计技巧
1) 避免使用触发器
触发器的功能通常可以用其他方式实现。在调试程序时触发器可能成为干扰。假如你确实需要采用触发器,你最好集中对它文档化。

2) 使用常用英语(或者其他任何语言)而不要使用编码
在创建下拉菜单、列表、报表时最好按照英语名排序。假如需要编码,可以在编码旁附上用户知道的英语。

3) 保存常用信息
让一个表专门存放一般数据库信息非常有用。在这个表里存放数据库当前版本、最近检查/修复(对Access)、关联设计文档的名称、客户等信息。这样可以实现一种简单机制跟踪数据库,当客户抱怨他们的数据库没有达到希望的要求而与你联系时,这样做对非客户机/服务器环境特别有用。

4) 包含版本机制
在数据库中引入版本控制机制来确定使用中的数据库的版本。时间一长,用户的需求总是会改变的。最终可能会要求修改数据库结构。把版本信息直接存放到数据库中更为方便。

5) 编制文档
对所有的快捷方式、命名规范、限制和函数都要编制文档。
采用给表、列、触发器等加注释的数据库工具。对开发、支持和跟踪修改非常有用。
对数据库文档化,或者在数据库自身的内部或者单独建立文档。这样,当过了一年多时间后再回过头来做第2 个版本,犯错的机会将大大减少。

6) 测试、测试、反复测试
建立或者修订数据库之后,必须用用户新输入的数据测试数据字段。最重要的是,让用户进行测试并且同用户一道保证选择的数据类型满足商业要求。测试需要在把新数据库投入实际服务之前完成。

7) 检查设计

在开发期间检查数据库设计的常用技术是通过其所支持的应用程序原型检查数据库。换句话说,针对每一种最终表达数据的原型应用,保证你检查了数据模型并且查看如何取出数据。


三、数据库命名规范

1. 实体(表)的命名
1) 表 以名词或名词短语命名,确定表名是采用复数还是单数形式,此外给表的别名定义简单规则(比方说,如果表名是一个单词,别名就取单词的前4 个字母;如果表 名是两个单词,就各取两个单词的前两个字母组成4 个字母长的别名;如果表的名字由3 个单词组成,从头两个单词中各取一个然后从最后一个单词中再取出两 个字母,结果还是组成4 字母长的别名,其余依次类推)
对工作用表来说,表名可以加上前缀WORK_ 后面附上采用该表的应用程序的名字。在命名过程当中,根据语义拼凑缩写即可。注意,由于ORCLE会将字段名称统一成大写或者小写中的一种,所以要求加上下划线。
举例:
定义的缩写 Sales: Sal 销售;
Order: Ord 订单;
Detail: Dtl 明细;
则销售订单明细表命名为:Sal_Ord_Dtl;
2) 如果表或者是字段的名称仅有一个单词,那么建议不使用缩写,而是用完整的单词。
举例:
定义的缩写 Material Ma 物品;
物品表名为:Material, 而不是 Ma.
但是字段物品编码则是:Ma_ID;而不是Material_ID
3) 所有的存储值列表的表前面加上前缀Z
目的是将这些值列表类排序在数据库最后。
4) 所有的冗余类的命名(主要是累计表)前面加上前缀X
冗余类是为了提高数据库效率,非规范化数据库的时候加入的字段或者表
5) 关联类通过用下划线连接两个基本类之后,再加前缀R的方式命名,后面按照字母顺序罗列两个表名或者表名的缩写。
关联表用于保存多对多关系。
如果被关联的表名大于10个字母,必须将原来的表名的进行缩写。如果没有其他原因,建议都使用缩写。
举例:表Object与自身存在多对多的关系,则保存多对多关系的表命名为:R_Object;
表 Depart和Employee;存在多对多的关系;则关联表命名为R_Dept_Emp

2. 属性(列)的命名
1) 采用有意义的列名,表内的列要针对键采用一整套设计规则。每一个表都将有一个自动ID作为主健,逻辑上的主健作为第一组候选主健来定义,如果是数据库自动生成的编码,统一命名为:ID;如果是自定义的逻辑上的编码则用缩写加“ID”的方法命名。如果键是数字类型,你可以用_NO 作为后缀;如果是字符类型则 可以采用_CODE 后缀。对列名应该采用标准的前缀和后缀。
举例:销售订单的编号字段命名:Sal_Ord_ID;如果还存在一个数据库生成的自动编号,则命名为:ID。

2) 所有的属性加上有关类型的后缀,注意,如果还需要其它的后缀,都放在类型后缀之前。
注: 数据类型是文本的字段,类型后缀TX可以不写。有些类型比较明显的字段,可以不写类型后缀。

3) 采用前缀命名
给每个表的列名都采用统一的前缀,那么在编写SQL表达式的时候会得到大大的简化。这样做也确实有缺点,比如破坏了自动表连接工具的作用,后者把公共列名同某些数据库联系起来。
3. 视图的命名
1) 视图以V作为前缀,其他命名规则和表的命名类似;
2) 命名应尽量体现各视图的功能。
4. 触发器的命名

触发器以TR作为前缀,触发器名为相应的表名加上后缀,Insert触发器加 _I ,Delete触发器加 _D ,Update触发器加 _U ,如:TR_Customer_I,TR_Customer_D,TR_Customer_U。
5. 存储过程名

存储过程应以 UP_ 开头,和系统的存储过程区分,后续部分主要以动宾形式构成,并用下划线分割各个组成部分。如增加代理商的帐户的存储过程为 UP_Ins_Agent_Account 。
6. 变量名

变量名采用小写,若属于词组形式,用下划线分隔每个单词,如@my_err_no。
7. 命名中其他注意事项
1) 以上命名都不得超过30个字符的系统限制。变量名的长度限制为29(不包括标识字符@)。
2) 数据对象、变量的命名都采用英文字符,禁止使用中文命名。绝对不要在对象名的字符之间留空格。
3) 小心保留词,要保证你的字段名没有和保留词、数据库系统或者常用访问方法冲突
5) 保持字段名和类型的一致性,在命名字段并为其指定数据类型的时候一定要保证一致性。假如数据类型在一个表里是整数,那在另一个表里可就别变成字符型了。

9/11/2008

军事英语

"cover me" 掩护我
"you take the point" 你占据该要点
"hold this position" 待在(防守)这个位置
"regroup team" 重组队伍
"follow me" 跟着我
"taking fire, need assistance"吸引火力,需要援助
"go" 前进
"fall back" 后退 
"stick together team" 保持队形(不要散了)密集阵形进攻
"get in position" 进入适当的位置
"storm the front" 守住前面
"report in" 请报告情况
"affirmative/roger that"收到
"enemy spotted" 发现敌人
"need backup" 需要支援
"sector clear" 扇区安全(当你确定一个区域安全之后,你可以向你的队友发送这句话。)
"i'm in position" 我到达指定的位置
"reporting in" 报告自己的位置
"negative" 拒绝(接受)
"enemy down" 消灭敌人
"wait for my go" 待在你的作战位置,等我的命令
"fire in the hole" 扔手榴弹(炸弹一类)
"Taking Fire, Need Assistance" 压制火力,需要火力协助
"Fall Back" 全队后撤
"Storm the Front" 守住前面
"Enemy Down" 敌人被消灭
"Hold your fire" 停火
"keep your fire" 保持火力(别停下来)
"move" 走!移动
"move on" 继续前进
"move back" 后撤
"move out" 搬走;开拔

英美军衔
Army 陆军
Field Marshal 元帅
General 上将
Lieutenant General 中将
Major General 少将
Brigadier 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
Lieutenant 中尉
Second Lieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (ClassII) 二级准尉
Staff Sergeant 上士
Sergeant 中士
Corporal 下士
Lance Corporal 一等兵
Private 二等兵
Recruit 新兵
Air Force 空军
Marshal of the Royal Air Force 元帅
Air Chief Marshal 上将
Air Marshal 中将
Air Vice Marshal 少将
Air Commodore 准将
Group Captain 上校
Wing Commander 中校
Squadron Leader 少校
Flight Lieutenant 上尉
Flying Officer 中尉
Pilot Officer 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Flight Sergeant 上士
Sergeant 中士
Corporal 下士
Senior Aircraftman 一等兵
Leading Aircraftman 二等兵
Aircraftman 新兵
Navy 海军
Admiral of the Fleet 元帅
Admiral 上将
Vice Admiral 中将
Rear Admiral 少将
Commodore 准将
Captain 上校
Commander 中校
Lieutenant Commander 少校
Lieutenant 上尉
Sublieutenant 中尉
Acting Sublieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Chief Petty Officer 上士
Petty Officer First Class 中士
Petty Officer Second Class 下士
Leading Seaman 一等兵
Able Seaman 二等兵
Ordinary Seaman 新兵
Marine Corps 海军陆战队
General 上将
Lieutenant General 中将
Major General 少将
Brigadier 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
Lieutenant 中尉
Second Lieutenant 少尉
Warrant Officer (Class I) 一级准尉
Warrant Officer (Class II) 二级准尉
Colour Sergeant 上士
Sergeant 中士
Corporal 下士
Marine First Class 一等兵
Marine Second Class 二等兵
Recruit 新兵



Army 陆军
General of the Army 五星上将
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Chief Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Sergeant First Class 上士
Sergeant 中士
Corporal 下士
Private First Class 一等兵
Private 二等兵
Basic Private 三等兵
Air Force 空军
General of the Air Force 五星上将
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Mayor 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Chief Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Technical Sergeant 技术军士
Staff Sergeant 参谋军士
Airman First Class 一等兵
Airman Second Class 二等兵
Airman Third Class 三等兵
Navy 海军
Fleet Admiral 五星上将
Admiral 上将
Vice Admiral 中将
Rear Admiral 少将
Commodore 准将
Captain 上校
Commander 中校
Lieutenant Commander 少校
Lieutenant 上尉
Lieutenant Junior Class 中尉
Ensign 少尉
Commissioned Warrant Officer 一级准尉
Warrant Officer 二级准尉
Chief Petty Officer 军士长
Petty Officer First Class 上士
Petty Officer Second Class 中士
Petty Officer Third Class 下士
Seaman First Class 一等兵
Seaman Second Class 二等兵
Apprentice Seaman 三等兵
Marine Corps 海军陆战队
General 上将
Lieutenant General 中将
Major General 少将
Brigadier General 准将
Colonel 上校
Lieutenant Colonel 中校
Major 少校
Captain 上尉
First Lieutenant 中尉
Second Lieutenant 少尉
Commissioned Warrant Officer 一级准尉
Warrant Officer 二级准尉
Master Sergeant 军士长
Technical Sergeant 技术军士
Staff Sergeant 参谋军士
Sergeant 中士
Corporal 下士
Private First Class 一等兵
Private 二等兵

9/08/2008

本来就没有开始,也不会有结束,只有存在


生命的本质在于存在,不会有开始和结束。就好像无序与有序。时间倒成一个欺骗小孩的糖果,欺骗着生命去追求永恒。可笑,本来就是不逝的存在,再来什么永恒。思维是凌驾于生命上的另一种存在,必然在这个限定的空间里,永远存在。
空间的本质是一种界限,界定着不同的存在。生命有自己的空间,思维也将有自己的空间,只是被界定了而已,或者是因为你在里面而已。也许时间是生命空间的的规则,但不能保证是所有空间的规则。
思维是一种最原始的回归。回归到无序,足够大,也足够小,自己也感觉好笑,本来就不能用大小来定义,那是空间的尺度。而不是存在的规则。就好比,原子去看分子,分子去看细胞,细胞去看器官,器官去看人体,人体去看地球,地球去看太阳系,太阳系去看银河系....., 等等,这个逻辑本是是错误的,他将是一个正无穷,或者是负无穷。呵呵,就好比孩子突然告诉你,蚂蚁不但有红的,还有黑的,你当然会笑,会笑他无知。呵呵,我们也不是一样吗!

9/01/2008

什么是熵

“熵”是德国物理学家克劳修斯在1850年创造的一个术语,他用它来表示任何一种能量在空间中分布的均匀程度。能量分布得越均匀,熵就越大,那对于个体来讲价值越小如果对于我们所考虑的系统来说,能量完全均匀地分布,那么,这个系统的熵就达到最大值。

熵定律是科学定律之最,这是爱因斯坦的观点。我们知道能源与物质、信息一样,是物质世界的三个基本要素之一, 而在物理定律中,能量守恒定律是最重要的定 律,它表明了各种形式的能量在相互转换时,总是不生不灭保持平衡的。在等势面上,熵增原理反映了非热能与热能之间的转换具有方向性,即非热能转变为热能效 率可以100%,而热能转变成非热能时效率则小于100%(转换效率与温差成正比),这种规律制约着自然界能源的演变方向,对人类生产、生活影响巨大;在 重力场中,热流方向由体系的势焓(势能+焓)差决定,即热量自动地从高势焓区传导至低势焓区,当出现高势焓区低温和低势焓区高温时,热量自动地从低温区传 导至高温区,且不需付出其它代价,即绝对熵减过程。显然熵所描述的能量转化规律比能量守恒定律更重要,通俗地讲:熵定律是"老板",决定着企业的发展方向,而能量守恒定律是"出纳",负责收支平衡,所以说熵定律是自然界的最高定律。

熵是混乱和无序的度量.熵值越大,混乱无序的程度越大.


熵增定律


在克劳修斯看来,在一个系统中,如果听任它自然发展,那么,能量差总是倾向于消除的。让一个热物体同一个冷物体相接触,热就会以下面所说的方式流动:热 物体将冷却,冷物体将变热,直到两个物体达到相同的温度为止。如果把两个水库连接起来,并且其中一个水库的水平面高于另一个水库,那么,万有引力就会使一 个水库的水面降低,而使另一个水面升高,直到两个水库的水面均等,而势能也取平为止。
  因此,克劳修斯说,自然界中的一个普遍规律是:能量密度的差异倾向于变成均等。换句话说,“熵将随着时间而增大”。
  对于能量从密度较高的地方向密度较低的地方流动的研究,过去主要是对于热这种能量形态进行的。因此,关于能量流动和功-能转换的科学就被称为“热力学”,这是从希腊文“热运动”一词变来的。
  人们早已断定,能量既不能创造,也不能消灭。这是一条最基本的定律;所以人们把它称为“热力学第一定律”。
  克劳修斯所提出的熵随时间而增大的说法,看来差不多也是非常基本的一条普遍规律,所以它被称为“热力学第二定律”。
   举例来讲果我们能看到橡皮筋的分子结构,我们会发现它的结构在拉紧和放松的状态时是不一样的。放松的时候它的分子结构像一团乱麻交织在一起。而在把橡皮 筋拉长的时候,那些如同链状的分子就会沿着拉伸的方向比较整齐地排列起来。于是我们可以看到两种状态:一种是自然,或者自发的状态。在这种状态下结构呈“ 混乱”或 “无序”状。而另一种是在外界的拉力下规则地排列起来的状态。这种“无序” 的状态还可以从分子的扩散中观察到。用一个密封的箱子,中间放一个隔板。在隔板的左边空间注入烟。我们把隔板去掉,左边的烟就会自然 (自发)地向右边扩散,最后均匀地占满整个箱体。这种状态称为“无序”。

  在物理学里我们可以用“熵”的概念来描述某一种状态自发变化 的方向。比如把有规则排列的状态称为“低熵”而混乱的状态对应于“高熵”。而熵则是无序性的定量量度。热力学第二定律的结论是:一个孤立系统的熵永不减 少”换句话说,物质世界的状态总是自发地转变成无序;“从低熵”变到“高熵”。比如,当外力去除之后,整齐排列的分子就会自然地向紊乱的状态转变;而箱 子左边的烟一定会自发地向右边扩散。这就是著名的“熵增定律”。



我们这个宇宙是熵增的宇宙.热力学第二定律,体现的就是这个特征. 生命是高度的有序,智慧是高度的有序. 在一个熵增的宇宙为什么会出现生命?会进化出智慧?(负熵) 热力学第二定律还揭示了, 局部的有序是可能的,但必须以其他地方更大无序为代价. 人生存,就要能量,要食物,要以动植物的死亡(熵增)为代价. 万物生长靠太阳.动植物的有序, 又是以太阳核反应的衰竭(熵增),或其他的熵增形势为代价的. 人关在完全封闭的铅盒子里,无法以其他地方的熵增维持自己的负熵. 在这个相对封闭的系统中,熵增的法则破坏了生命的有序.熵增是一个相对的被动的过程,熵减是一个绝对的主动的过程。



熵是时间的箭头,在这个宇宙中是不可逆的. 时间是一个相对的被动的结果!熵与时间密切相关,如果时间停止"流动",熵增也就无从谈起. "任何我们已知的物质能关住"的东西,不是别的,就是"时间". 低温关住的也是"时间". 生命是物质的有序"结构"."结构"与具体的物质不是同一个层次的概念. 就象大厦的建筑材料,和大厦的式样不是同一个层次的概念一样. 生物学已经证明,凡是到了能上网岁数的人, 身体中的原子,已经没有一个是刚出生时候的了. 但是,你还是你,我还是我,生命还在延续. 倒是死了的人,没有了新陈代谢,身体中的分子可以保留很长时间. 意识是比生命更高层次的有序.可以在生命之间传递. 说到这里,我想物质与意识的层次关系应该比较清楚了. 这里之所以将"唯物"二字加上引号. 是因为并不彻底.为什么熵减是这个宇宙的本质,还没法回答.

信息熵

  信息熵的定义与熵的定义相似,我们说的信息熵一般是指信息论的香农理论。

在日常生活中,信息是指“消息”,“情况”等。看电视、看报纸、看书、打电话、听广播、上网浏览,乃至聊天、开会,人们都获得了“消息”。消息通过“消息传递系统”传递,各种系统可以抽象为通讯系统模型。这一模型并不只限于通信系统,对于生物神经系统,遗传系统,市场的经济信号感知反馈系统,管理系统,都可以运用这个模型。



在消息传递系统中,其传输的是消息;但消息传递过程中,最普通,却容易被忽视的一点是:收信人在收到消息以前是不知道消息的具体内容的。消息的传递过程,对收信人来说,是一个从不知到知的过程,或者说是一个从不确定到确定的过程。

从通信过程来看,收信者的所谓“不知”就是不知道发送端将发送描述何种运动状态的消息。例如,看天气预报前,不清楚天气的将出现何种状态; 看天气预报后,这种不确定性就大大缩小了。所以通信过程是一种从不确定到确定的过程。不确定性消除了,收信者就获得了信息。所以香农认为, 信息是不定性的减少或消除。即

I = S(Q/X)-S(Q/X')

I代表信息,Q 代表对某件事的疑问,S 代表不定性,X为收到消息前关于Q的知识,X' 为收到消息后关于Q 的知识。

如何理解信息熵和熵的关系?单从概率的表达式看,两者的定义是相似的

信息熵并不是负熵,它描述的是信源 不确定性而不是 不确定性的减少信息熵大表示信源的不确定程度较大,同样是一种 无序性。香农的信息概念是人们对事物了解的不确定性的减少或消除,这一定义关注的是通信中的信息问题,所以香农信息是一种与信道相关的“信息”。信源、信 道是信宿成了认识过程的不可分割的部分,主客体是不可分的;香农的概率,是主体对客体(信宿对信源)的一种先验主观认识,这本身就加入了主体的因素。因 此,作为“通信中的数学理论”,信源与信宿在信道联系下的“互信息”,才是香农的“信息”。

信道的任务是以信号方传输和存贮信息,通过信息处理后,一般只会增加信息的损失,不可能增加原来获得的信息。这意味着,在任何信息传输系统中,最后获得的信息至多是信源所提供的信息;信息一旦丢失,如不触及信源,就不能再恢复。这就是 信息不增原理,又称 数据处理定理,熵只是平均不确定性的描述,而不确定性的消除才是接受端获得的信息量,信息量不应该与不确定性混为一谈。

信息论并不是香农一个人建立的,实际上它是由好几位科学家差不多在同一时候提出来的。香农从通信编码方面,维纳从滤波理论方面,统计学家费希尔(Fisher )从古典统计理论方面,研究了信息的理论问题。但维纳与香农在信息概念的理解上有些不同

信息论并不是香农一个人建立的,实际上它是由好几位科学家差不多在同一时候提出来的。香农从通信编码方面,维纳从滤波理论方面,统计学家费希尔(Fisher )从古典统计理论方面,研究了信息的理论问题。但维纳与香农在信息概念的理解上有些不同

信息熵并不是负熵,它描述的是信源不确定性而不是不确定性的减少。信息熵大表示信源的不确定程度较大,同样是一种无序性。香农的信息概念是人们对事 物了解的不确定性的叫少或消除,实际上是“互信息”;因为这一定义关注的是通信中的信息问题,所以香农信息是一种与信道相关的“信息”。

变量的不确定性越大,熵也就越大,把它搞清楚所需要的信息量也就越大。
信息熵是信息论中用于度量信息量的一个概念。一个系统越是有序,信息熵就越低;
反之,一个系统越是混乱,信息熵就越高。所以,信息熵也可以说是系统有序化程度的一个度量。也就是熵值低的信息,价值更高!

信息理论的鼻祖之一Claude E. Shannon把信息(熵)定义为离散随机事件的出现概率。所谓信息熵,是一个数学上颇为抽象的概念,在这里不妨把信息熵理解成某种特定信息的出现概率。 而信息熵和热力学熵是紧密相关的。根据Charles H. Bennett对Maxwell's Demon的重新解释,对信息的销毁是一个不可逆过程,所以销毁信息是符合热力学第二定律的。而产生信息,则是为系统引入负(热力学)熵的过程。所以信息 熵的符号与热力学熵应该是相反的。一般而言,当一种信息出现概率更高的时候,表明它被传播得更广泛,或者说,被引用的程度更高。我们可以认为,从信息传播 的角度来看,信息熵可以表示信息的价值。这样子我们就有一个衡量信息价值高低的标准,可以做出关于知识流通问题的更多推论。


信息熵的计算是非常复杂的。而具有多重前置条件的信息,更是几乎不能计算的。所以在现实世界中信息的价值大多是不能被计算出来的。但因为信息熵和热力学熵 的紧密相关性,所以信息熵是可以在衰减的过程中被测定出来的。因此信息的价值是通过信息的传递体现出来的在没有引入附加价值(负熵)的情况下,传播得越 广、流传时间越长的信息越有价值。


熵在传播中是指信息的不确定性,一则高信息度的信息熵是很低的,低信息度的熵则高。具体说来,凡是导致随机事件集合的肯定性,组织性,法则性或有序性等增加或减少的活动过程,都可以用信息熵的改变量这个统一的标尺来度量。

相对的衡量制度可以用熵,绝对的时候,他就没有价值了,然而,这个世界哪来的绝对?个体的意义在于抵抗无序,无序的意义在于消减个体,重新生成个体。哎,无名万物之始,有名万物之母啊!