PHP version 5.3.0 is released

Filed Under (Anything) by Dream☆Wing on 30-06-2009

Tagged Under :

The PHP development team is proud to announce the immediate release of PHP 5.3.0. This release is a major improvement in the 5.X series, which includes a large number of new features and bug fixes.

The key features of PHP 5.3.0 include:

This release also drops several extensions and unifies the usage of internal APIs. Users should be aware of the following known backwards compatibility breaks:

For users upgrading from PHP 5.2 there is a migration guide available here, detailing the changes between those releases and PHP 5.3.0.

For a full list of changes in PHP 5.3.0, see the ChangeLog.

http://php.net/releases/5_3_0.php

  • Share/Save/Bookmark

[转]HTTP协议详解

Filed Under (Web) by Dream☆Wing on 18-06-2009

Tagged Under :

Author :Jeffrey

引言

HTTP是一个属于应用层的 面向对象的协议,由于其简捷、快速的方式,适用于分布式超媒体信息系统。它于1990年提出,经过几年的使用与发展,得到不断地完善和扩展。目前在WWW 中使用的是HTTP/1.0的第六版,HTTP/1.1的规范化工作正在进行之中,而且HTTP-NG(Next Generation of HTTP)的建议已经提出。
HTTP协议的主要特点可概括如下:
1.支持客户/服务器模式。
2.简单快速:客户向服务器请求服务时,只需传送请求方法和路径。请求方法常用的有GET、HEAD、POST。每种方法规定了客户与服务器联系的类型不同。由于HTTP协议简单,使得HTTP服务器的程序规模小,因而通信速度很快。
3.灵活:HTTP允许传输任意类型的数据对象。正在传输的类型由Content-Type加以标记。
4.无连接:无连接的含义是限制每次连接只处理一个请求。服务器处理完客户的请求,并收到客户的应答后,即断开连接。采用这种方式可以节省传输时间。
5.无状态:HTTP协议是无状态协议。无状态是指协议对于事务处理没有记忆能力。缺少状态意味着如果后续处理需要前面的信息,则它必须重传,这样可能导致每次连接传送的数据量增大。另一方面,在服务器不需要先前信息时它的应答就较快。

一、HTTP协议详解之URL篇

http(超文本传输协议)是一个基于请求与响应模式的、无状态的、应用层的协议,常基于TCP的连接方式,HTTP1.1版本中给出一种持续连接的机制,绝大多数的Web开发,都是构建在HTTP协议之上的Web应用。

HTTP URL (URL是一种特殊类型的URI,包含了用于查找某个资源的足够的信息)的格式如下:
http://host[":"port][abs_path]
http 表示要通过HTTP协议来定位网络资源;host表示合法的Internet主机域名或者IP地址;port指定一个端口号,为空则使用缺省端口 80;abs_path指定请求资源的URI;如果URL中没有给出abs_path,那么当它作为请求URI时,必须以“/”的形式给出,通常这个工作 浏览器自动帮我们完成。
eg:
1、输入:
www.guet.edu.cn
浏览器自动转换成:http://www.guet.edu.cn/
2、http:192.168.0.116:8080/index.jsp

二、HTTP协议详解之请求篇

http请求由三部分组成,分别是:请求行、消息报头、请求正文

1、请求行以一个方法符号开头,以空格分开,后面跟着请求的URI和协议的版本,格式如下:Method Request-URI HTTP-Version CRLF
其中 Method表示请求方法;Request-URI是一个统一资源标识符;HTTP-Version表示请求的HTTP协议版本;CRLF表示回车和换行(除了作为结尾的CRLF外,不允许出现单独的CR或LF字符)。

请求方法(所有方法全为大写)有多种,各个方法的解释如下:
GET     请求获取Request-URI所标识的资源
POST    在Request-URI所标识的资源后附加新的数据
HEAD    请求获取由Request-URI所标识的资源的响应消息报头
PUT     请求服务器存储一个资源,并用Request-URI作为其标识
DELETE  请求服务器删除Request-URI所标识的资源
TRACE   请求服务器回送收到的请求信息,主要用于测试或诊断
CONNECT 保留将来使用
OPTIONS 请求查询服务器的性能,或者查询与资源相关的选项和需求
应用举例:
GET方法:在浏览器的地址栏中输入网址的方式访问网页时,浏览器采用GET方法向服务器获取资源,eg:GET /form.html HTTP/1.1 (CRLF)

POST方法要求被请求服务器接受附在请求后面的数据,常用于提交表单。
eg:POST /reg.jsp HTTP/ (CRLF)
Accept:image/gif,image/x-xbit,… (CRLF)

HOST:www.guet.edu.cn (CRLF)
Content-Length:22 (CRLF)
Connection:Keep-Alive (CRLF)
Cache-Control:no-cache (CRLF)
(CRLF)         //该CRLF表示消息报头已经结束,在此之前为消息报头
user=jeffrey&pwd=1234  //此行以下为提交的数据

HEAD方法与GET方法几乎是一样的,对于HEAD请求的回应部分来说,它的HTTP头部中包含的 信息与通过GET请求所得到的信息是相同的。利用这个方法,不必传输整个资源内容,就可以得到Request-URI所标识的资源的信息。该方法常用于测 试超链接的有效性,是否可以访问,以及最近是否更新。
2、请求报头后述
3、请求正文(略)

三、HTTP协议详解之响应篇

在接收和解释请求消息后,服务器返回一个HTTP响应消息。

HTTP响应也是由三个部分组成,分别是:状态行、消息报头、响应正文
1、状态行格式如下:
HTTP-Version Status-Code Reason-Phrase CRLF
其中,HTTP-Version表示服务器HTTP协议的版本;Status-Code表示服务器发回的响应状态代码;Reason-Phrase表示状态代码的文本描述。
状态代码有三位数字组成,第一个数字定义了响应的类别,且有五种可能取值:
1xx:指示信息–表示请求已接收,继续处理
2xx:成功–表示请求已被成功接收、理解、接受
3xx:重定向–要完成请求必须进行更进一步的操作
4xx:客户端错误–请求有语法错误或请求无法实现
5xx:服务器端错误–服务器未能实现合法的请求
常见状态代码、状态描述、说明:
200 OK      //客户端请求成功
400 Bad Request  //客户端请求有语法错误,不能被服务器所理解
401 Unauthorized //请求未经授权,这个状态代码必须和WWW-Authenticate报                 //头域一起使用
403 Forbidden  //服务器收到请求,但是拒绝提供服务
404 Not Found  //请求资源不存在,eg:输入了错误的URL
500 Internal Server Error //服务器发生不可预期的错误
503 Server Unavailable  //服务器当前不能处理客户端的请求,一段时间后,                         //可能恢复正常
eg:HTTP/1.1 200 OK (CRLF)

2、响应报头后述

3、响应正文就是服务器返回的资源的内容

四、HTTP协议详解之消息报头篇

HTTP消息由客户端到服务器的请求和服务器到客户端的响应组成。请求消息和响应消息都是由开始行(对于请求消息,开始行就是请求行,对于响应消息,开始行就是状态行),消息报头(可选),空行(只有CRLF的行),消息正文(可选)组成。

HTTP消息报头包括普通报头、请求报头、响应报头、实体报头。
每一个报头域都是由名字+“:”+空格+值 组成,消息报头域的名字是大小写无关的。

1、普通报头
在普通报头中,有少数报头域用于所有的请求和响应消息,但并不用于被传输的实体,只用于传输的消息。
eg:
Cache-Control   用于指定缓存指令,缓存指令是单向的(响应中出现的缓存指令在请求中未必会出现),且是独立的(一个消息的缓存指令不会影响另一个消息处理的缓存机制),HTTP1.0使用的类似的报头域为Pragma。
请求时的缓存指令包括:no-cache(用于指示请求或响应消息不能缓存)、no-store、max-age、max-stale、min-fresh、only-if-cached;
响应时的缓存指令包括:public、private、no-cache、no-store、no-transform、must-revalidate、proxy-revalidate、max-age、s-maxage.
eg:为了指示IE浏览器(客户端)不要缓存页面,服务器端的JSP程序可以编写如下:response.sehHeader(”Cache-Control”,”no-cache”);
//response.setHeader(”Pragma”,”no-cache”);作用相当于上述代码,通常两者//合用
这句代码将在发送的响应消息中设置普通报头域:Cache-Control:no-cache

Date普通报头域表示消息产生的日期和时间

Connection普通报头域允许发送指定连接的选项。例如指定连接是连续,或者指定“close”选项,通知服务器,在响应完成后,关闭连接

2、请求报头
请求报头允许客户端向服务器端传递请求的附加信息以及客户端自身的信息。
常用的请求报头
Accept
Accept请求报头域用于指定客户端接受哪些类型的信息。eg:Accept:image/gif,表明客户端希望接受GIF图象格式的资源;Accept:text/html,表明客户端希望接受html文本。
Accept-Charset
Accept-Charset请求报头域用于指定客户端接受的字符集。eg:Accept-Charset:iso-8859-1,gb2312.如果在请求消息中没有设置这个域,缺省是任何字符集都可以接受。
Accept-Encoding
Accept-Encoding请求报头域类似于Accept,但是它是用于指定可接受的内容编码。eg:Accept-Encoding:gzip.deflate.如果请求消息中没有设置这个域服务器假定客户端对各种内容编码都可以接受。
Accept-Language
Accept-Language请求报头域类似于Accept,但是它是用于指定一种自然语言。eg:Accept-Language:zh-cn.如果请求消息中没有设置这个报头域,服务器假定客户端对各种语言都可以接受。
Authorization
Authorization请求报头域主要用于证明客户端有权查看某个资源。当浏览器访问一个页面时,如果收到服务器的响应代码为401(未授权),可以发送一个包含Authorization请求报头域的请求,要求服务器对其进行验证。
Host(发送请求时,该报头域是必需的)
Host请求报头域主要用于指定被请求资源的Internet主机和端口号,它通常从HTTP URL中提取出来的,eg:
我们在浏览器中输入:
http://www.guet.edu.cn/index.html
浏览器发送的请求消息中,就会包含Host请求报头域,如下:
Host:
www.guet.edu.cn
此处使用缺省端口号80,若指定了端口号,则变成:Host:www.guet.edu.cn:指定端口号
User-Agent
我 们上网登陆论坛的时候,往往会看到一些欢迎信息,其中列出了你的操作系统的名称和版本,你所使用的浏览器的名称和版本,这往往让很多人感到很神奇,实际 上,服务器应用程序就是从User-Agent这个请求报头域中获取到这些信息。User-Agent请求报头域允许客户端将它的操作系统、浏览器和其它 属性告诉服务器。不过,这个报头域不是必需的,如果我们自己编写一个浏览器,不使用User-Agent请求报头域,那么服务器端就无法得知我们的信息 了。
请求报头举例:
GET /form.html HTTP/1.1 (CRLF)
Accept:image/gif,image/x-xbitmap,image/jpeg,application/x-shockwave-flash,application/vnd.ms-excel,application/vnd.ms-powerpoint,application/msword,*/* (CRLF)
Accept-Language:zh-cn (CRLF)
Accept-Encoding:gzip,deflate (CRLF)
If-Modified-Since:Wed,05 Jan 2007 11:21:25 GMT (CRLF)
If-None-Match:W/”80b1a4c018f3c41:8317″ (CRLF)
User-Agent:Mozilla/4.0(compatible;MSIE6.0;Windows NT 5.0) (CRLF)
Host:www.guet.edu.cn (CRLF)
Connection:Keep-Alive (CRLF)
(CRLF)

3、响应报头
响应报头允许服务器传递不能放在状态行中的附加响应信息,以及关于服务器的信息和对Request-URI所标识的资源进行下一步访问的信息。
常用的响应报头
Location
Location响应报头域用于重定向接受者到一个新的位置。Location响应报头域常用在更换域名的时候。
Server
Server响应报头域包含了服务器用来处理请求的软件信息。与User-Agent请求报头域是相对应的。下面是
Server响应报头域的一个例子:
Server:Apache-Coyote/1.1
WWW-Authenticate
WWW-Authenticate响应报头域必须被包含在401(未授权的)响应消息中,客户端收到401响应消息时候,并发送Authorization报头域请求服务器对其进行验证时,服务端响应报头就包含该报头域。
eg:WWW-Authenticate:Basic realm=”Basic Auth Test!”  //可以看出服务器对请求资源采用的是基本验证机制。

4、实体报头
请求和响应消息都可以传送一个实体。一个实体由实体报头域和实体正文组成,但并不是说实体报头域和实体正文要在一起发送,可以只发送实体报头域。实体报头定义了关于实体正文(eg:有无实体正文)和请求所标识的资源的元信息。
常用的实体报头
Content-Encoding
Content- Encoding实体报头域被用作媒体类型的修饰符,它的值指示了已经被应用到实体正文的附加内容的编码,因而要获得Content-Type报头域中所 引用的媒体类型,必须采用相应的解码机制。Content-Encoding这样用于记录文档的压缩方法,eg:Content- Encoding:gzip
Content-Language
Content-Language实体报头域描述了资源所用的自然语言。没有设置该域则认为实体内容将提供给所有的语言阅读
者。eg:Content-Language:da
Content-Length
Content-Length实体报头域用于指明实体正文的长度,以字节方式存储的十进制数字来表示。
Content-Type
Content-Type实体报头域用语指明发送给接收者的实体正文的媒体类型。eg:
Content-Type:text/html;charset=ISO-8859-1
Content-Type:text/html;charset=GB2312
Last-Modified
Last-Modified实体报头域用于指示资源的最后修改日期和时间。
Expires
Expires 实体报头域给出响应过期的日期和时间。为了让代理服务器或浏览器在一段时间以后更新缓存中(再次访问曾访问过的页面时,直接从缓存中加载,缩短响应时间和 降低服务器负载)的页面,我们可以使用Expires实体报头域指定页面过期的时间。eg:Expires:Thu,15 Sep 2006 16:23:12 GMT
HTTP1.1的客户端和缓存必须将其他非法的日期格式(包括0)看作已经过期。eg:为了让浏览器不要缓存页面,我们也可以利用Expires实体报头域,设置为0,jsp中程序如下:response.setDateHeader(”Expires”,”0″);

五、利用telnet观察http协议的通讯过程

实验目的及原理:
利用MS的telnet工具,通过手动输入http请求信息的方式,向服务器发出请求,服务器接收、解释和接受请求后,会返回一个响应,该响应会在telnet窗口上显示出来,从而从感性上加深对http协议的通讯过程的认识。

实验步骤:

1、打开telnet
1.1 打开telnet
运行–>cmd–>telnet

1.2 打开telnet回显功能
set localecho

2、连接服务器并发送请求
2.1 open
www.guet.edu.cn 80  //注意端口号不能省略

HEAD /index.asp HTTP/1.0
Host:www.guet.edu.cn

/*我们可以变换请求方法,请求桂林电子主页内容,输入消息如下*/
open www.guet.edu.cn 80

GET /index.asp HTTP/1.0  //请求资源的内容
Host:www.guet.edu.cn

2.2 open www.sina.com.cn 80  //在命令提示符号下直接输入telnet www.sina.com.cn 80
HEAD /index.asp HTTP/1.0
Host:www.sina.com.cn

3 实验结果:

3.1 请求信息2.1得到的响应是:

HTTP/1.1 200 OK                                              //请求成功
Server: Microsoft-IIS/5.0                                    //web服务器
Date: Thu,08 Mar 200707:17:51 GMT
Connection: Keep-Alive
Content-Length: 23330
Content-Type: text/html
Expries: Thu,08 Mar 2007 07:16:51 GMT
Set-Cookie: ASPSESSIONIDQAQBQQQB=BEJCDGKADEDJKLKKAJEOIMMH; path=/
Cache-control: private

//资源内容省略

3.2 请求信息2.2得到的响应是:

HTTP/1.0 404 Not Found       //请求失败
Date: Thu, 08 Mar 2007 07:50:50 GMT
Server: Apache/2.0.54 <Unix>
Last-Modified: Thu, 30 Nov 2006 11:35:41 GMT
ETag: “6277a-415-e7c76980″
Accept-Ranges: bytes
X-Powered-By: mod_xlayout_jh/0.0.1vhs.markII.remix
Vary: Accept-Encoding
Content-Type: text/html
X-Cache: MISS from zjm152-78.sina.com.cn
Via: 1.0 zjm152-78.sina.com.cn:80<squid/2.6.STABLES-20061207>
X-Cache: MISS from th-143.sina.com.cn
Connection: close

失去了跟主机的连接

按任意键继续…
4 .注意事项:1、出现输入错误,则请求不会成功。
2、报头域不分大小写。
3、更深一步了解HTTP协议,可以查看RFC2616,在
http://www.letf.org/rfc上找到该文件。
4、开发后台程序必须掌握http协议

六、HTTP协议相关技术补充

1、基础:
高层协议有:文件传输协议FTP、电子邮件传输协议SMTP、域名系统服务DNS、网络新闻传输协议NNTP和HTTP协议等
中 介由三种:代理(Proxy)、网关(Gateway)和通道(Tunnel),一个代理根据URI的绝对格式来接受请求,重写全部或部分消息,通过 URI的标识把已格式化过的请求发送到服务器。网关是一个接收代理,作为一些其它服务器的上层,并且如果必须的话,可以把请求翻译给下层的服务器协议。一 个通道作为不改变消息的两个连接之间的中继点。当通讯需要通过一个中介(例如:防火墙等)或者是中介不能识别消息的内容时,通道经常被使用。
代理(Proxy):一个中间程序,它可以充当一个服务器,也可以充当一个客户机,为其它客户机建立请求。请求是通过可能的翻译在内部或经过传递到其它的 服务器中。一个代理在发送请求信息之前,必须解释并且如果可能重写它。代理经常作为通过防火墙的客户机端的门户,代理还可以作为一个帮助应用来通过协议处 理没有被用户代理完成的请求。
网关(Gateway):一个作为其它服务器中间媒介的服务器。与代理不同的是,网关接受请求就好象对被请求的资源来说它就是源服务器;发出请求的客户机并没有意识到它在同网关打交道。
网关经常作为通过防火墙的服务器端的门户,网关还可以作为一个协议翻译器以便存取那些存储在非HTTP系统中的资源。
通道(Tunnel):是作为两个连接中继的中介程序。一旦激活,通道便被认为不属于HTTP通讯,尽管通道可能是被一个HTTP请求初始化的。当被中继 的连接两端关闭时,通道便消失。当一个门户(Portal)必须存在或中介(Intermediary)不能解释中继的通讯时通道被经常使用。

2、协议分析的优势—HTTP分析器检测网络攻击
以模块化的方式对高层协议进行分析处理,将是未来入侵检测的方向。
HTTP及其代理的常用端口80、3128和8080在network部分用port标签进行了规定

3、HTTP协议Content Lenth限制漏洞导致拒绝服务攻击
使 用POST方法时,可以设置ContentLenth来定义需要传送的数据长度,例如ContentLenth:999999999,在传送完成前,内 存不会释放,攻击者可以利用这个缺陷,连续向WEB服务器发送垃圾数据直至WEB服务器内存耗尽。这种攻击方法基本不会留下痕迹。
http://www.cnpaf.net/Class/HTTP/0532918532667330.html

4、利用HTTP协议的特性进行拒绝服务攻击的一些构思
服务器端忙于处理攻击者伪造的TCP连接请求而无暇理睬客户的正常请求(毕竟客户端的正常请求比率非常之小),此时从正常客户的角度看来,服务器失去响应,这种情况我们称作:服务器端受到了SYNFlood攻击(SYN洪水攻击)。
而Smurf、TearDrop等是利用ICMP报文来Flood和IP碎片攻击的。本文用“正常连接”的方法来产生拒绝服务攻击。
19 端口在早期已经有人用来做Chargen攻击了,即Chargen_Denial_of_Service,但是!他们用的方法是在两台Chargen 服务器之间产生UDP连接,让服务器处理过多信息而DOWN掉,那么,干掉一台WEB服务器的条件就必须有2个:1.有Chargen服务2.有HTTP 服务
方法:攻击者伪造源IP给N台Chargen发送连接请求(Connect),Chargen接收到连接后就会返回每秒72字节的字符流(实际上根据网络实际情况,这个速度更快)给服务器。

5、Http指纹识别技术
Http指纹识别的原理大致上也是相同的:记录不同服务器对Http协议执行中的微小差别进行识别.Http指纹识别比TCP/IP堆栈指纹识别复杂许 多,理由是定制Http服务器的配置文件、增加插件或组件使得更改Http的响应信息变的很容易,这样使得识别变的困难;然而定制TCP/IP堆栈的行为 需要对核心层进行修改,所以就容易识别.
要让服务器返回不同的Banner信息的设置是很简单的,象Apache这样的开放源代码的Http服务器,用户可以在源代码里修改Banner信息,然 后重起Http服务就生效了;对于没有公开源代码的Http服务器比如微软的IIS或者是Netscape,可以在存放Banner信息的Dll文件中修 改,相关的文章有讨论的,这里不再赘述,当然这样的修改的效果还是不错的.另外一种模糊Banner信息的方法是使用插件。
常用测试请求:
1:HEAD/Http/1.0发送基本的Http请求
2:DELETE/Http/1.0发送那些不被允许的请求,比如Delete请求
3:GET/Http/3.0发送一个非法版本的Http协议请求
4:GET/JUNK/1.0发送一个不正确规格的Http协议请求
Http指纹识别工具Httprint,它通过运用统计学原理,组合模糊的逻辑学技术,能很有效的确定Http服务器的类型.它可以被用来收集和分析不同Http服务器产生的签名。

6、其他:为了提高用户使用浏览器时的性能,现代浏览器还支持并发的访问方式,浏览一个网页时同时建立多个连接,以迅速获得一个网页上的多个图标,这样能更快速完成整个网页的传输。
HTTP1.1中提供了这种持续连接的方式,而下一代HTTP协议:HTTP-NG更增加了有关会话控制、丰富的内容协商等方式的支持,来提供
更高效率的连接。

原文链接:http://blog.csdn.net/gueter/archive/2007/03/08/1524447.aspx

  • Share/Save/Bookmark

[转载]25招改善你的jQuery

Filed Under (Javascript) by Dream☆Wing on 05-06-2009

Tagged Under :

译文地址:http://www.cnblogs.com/huyh/archive/2009/03/30/1422976.html

原文地址:http://www.tvidesign.co.uk/blog/improve-your-jquery-25-excellent-tips.aspx

序言

jQuery太棒了。我已经使用了将近一年多的时间。使用它的时间越长,我越了解它的内部运作。

我不是jQuery专家。我也不自称是,因此如果在下面的文章里发现任何错误,请随时纠正或提出改善的建议。

我称自己为中级的jQuery用户,我认为其他一些人可能受益于我过去一年多学到的小技巧、招数和方法。这篇文章比我当初设想的稍长了些,因此我在文章一开始就提供了目录,你可以跳转到感兴趣的部分进行阅读。

目录

1. 从Google Code加载jQuery

2. 使用备忘单

3. 整合所有的脚本并缩减它们

4. 使用Firebug出色的控制台日志工具

5. 通过缓存最小化选择操作

6. 最小化DOM操作

7. 处理DOM插入操作时,将需要的内容包装在一个元素中

8. 尽可能使用IDs而不是classes

9. 给选择器提供上下文

10. 正确使用方法链

11. 学会正确使用效果

12. 了解事件代理

13. 利用classes存储状态

14. 更好的方法是利用jQuery内置的data()方法存储状态

15. 写你自己的选择器

16. 精简你的HTML并在页面加载后修改它

17. 为了速度和SEO方面的考虑,延迟加载内容

18. 使用jQuery提供的工具函数

19. 使用noConflict重命名jQuery对象

20. 如何得知图片已加载完毕

21. 总是使用最新版本

22. 如何检查元素是否存在

23. 给你的HTML属性增加JS类

24. 返回’false’以防止默认行为

25. ready事件的简写

1. 从Google Code加载jQuery

Google Code上已经托管了多种JavaScript类库,从Google Code上加载jQuery比直接从你的服务器加载更有优势。它节省了你服务器上的带宽,能够很快的从Google的内容分布网络(CDN)上加载JS类库。更重要的是,如果用户访问那些发布在Google Code上的站点后它会被缓存下来。

这样做很有意义。有多少站点使用了没有被缓存的相同jQuery副本,而这些很容易做到:

<script src="http://www.google.com/jsapi"></script> 

<script type="text/javascript">

  // Load jQuery 

  google.load("jquery", "1.2.6");

  google.setOnLoadCallback(function() {

  // Your code goes here. 

  });

</script> 

或者,你能够直接引用JS:

<script src="http://ajax.googleapis.com/ajax/libs/jquery/1.2.6/jquery.min.js" type="text/javascript"></script>

这里有详细的用法说明

2. 使用备忘单

不仅仅是jQuery,很多编程语言也有类似的备忘单,在一张A4的纸上就可以很容易看到每个函数的用法。幸运的是已经有好心的家伙把jQuery的备忘单做得很完善了:

http://www.gscottolson.com/weblog/2008/01/11/jquery-cheat-sheet/

http://colorcharge.com/jquery/

【译注】

jQuery 1.3 Cheat Sheet

3. 整合所有的脚本并缩减它们

不错,这是JavaScript的一个常见技巧。可是一个使用了jQuery的大项目可能使用了很多相关的jQuery插件(本站就使用了easing,localScroll,lightbox,preload),因此它通常是适用的。

浏览器不能同时加载JS脚本(大多数情况下),这意味着如果你同一时间加载很多脚本的话,将减缓页面的加载速度。因此,如果每个页面都要加载这些脚本,你应该考虑在发布之前将这些脚本整合成一个稍大的JS脚本。

一些jQuery插件已经最小化了,但是你应该打包你的JS脚本和那些没有缩减过的脚本,这仅需要几秒的时间就可以完成。就个人而言,我推荐Packer by Dean Edwards

4. 使用Firebug出色的控制台日志工具

如果你还没有安装Firebug,那么你真的应该把它装上。除了许多其它有用的特性(比如允许你检查http传输情况、发现你的CSS问题),它也有极好的日志命令,允许你很容易调试JS脚本。

这里有Firebug所有特性的详细说明

我最喜欢的特性有”console.info“,通过它你可以把信息和变量值输出到控制台上,而不必使用alert;”console.time”则允许你在一组代码上设置定时器,从而计算出JS脚本运行所花费的时间。这一切都很容易做到:

 console.time('create list');

 for (i = 0; i < 1000; i++) {
  var myList = $('.myList');

  myList.append('This is list item ' + i);
 }

 console.timeEnd('create list');

在这个例子中我故意写上一些没有效率的代码!在接下来的技巧里我将展示如何使用计时器显示我们对JS代码所做的改进。

5. 通过缓存最小化选择操作

jQuery的选择器棒极了。它们可以在页面上以极其简单的方法找到任何元素,但是在内部它们必须通过大量的步骤才可以实现选择操作,如果你错误的使用它们,那么你可能发现一切都变得相当慢。

如果你一次又一次的选择相同元素(例如在一个循环中),那么你可以一次选择出它并放入内存中,同时你可以在核心内容里操作它。看下面的例子,这里我们利用循环往UL里添加条目:

 for (i = 0; i < 1000; i++) {
  var myList = $('.myList');

  myList.append('This is list item ' + i);
 }

这在我的PC上Firefox 3花费了1066毫秒时间(可以设想一下在IE6中的情况!),对JavaScript而言这个操作相当慢。现在让我们来看看下面的代码,这里我们仅使用了一次选择操作:

 var myList = $('.myList');

 for (i = 0; i < 1000; i++) {

  myList.append('This is list item ' + i);
 }

仅仅用了224毫秒,通过移动一行代码就快了将近4倍。

6. 最小化DOM操作

我们通过减少对DOM的插入操作可以让上面的代码运行得更快。DOM的插入操作(像.append(),.prepend(),.after(),.wrap())是相当耗时的,执行这些操作会拖慢程序的运行。

我们所要做的就是使用字符串拼接来构造一个list项并用一个函数往列表里添加这些项,比如.html()。请看下面的例子:

 var myList = $('#myList');

 for (i=0; i<1000; i++){

  myList.append('This is list item ' + i);
 } 

在我的PC上花费了216毫秒,仅仅在1/5秒左右。但是如果我们使用字符串构造list项,使用下面的HTML方法完成插入操作:

 var myList = $('.myList');

 var myListItems = '';

 for (i = 0; i < 1000; i++) {

  myListItems += '<li>This is list item ' + i + '</li>';
 }

 myList.html(myListItems);

它耗时185毫秒,尽管没有快很多,但是也提高了31毫秒的时间。

7. 处理DOM插入操作时,将需要的内容包装在一个元素中

嗯,不要问我为什么要这样做(我相信一个有相当经验的程序员会给你解释)。

在上面的例子中我们使用.html()将1000个item项插入到UL中。如果在插入操作之前我们将这些项包装在UL标签中,然后把完整的UL插入到另一个DIV标签中,那么我们实际上仅仅插入一个标签而不是1000个,这看起来要更高效些。请看下面这个例子:

 var myList = $('.myList');

 var myListItems = '<ul>';

 for (i = 0; i < 1000; i++) {

  myListItems += '<li>This is list item ' + i + '</li>';
 }

 myListItems += '</ul>';

 myList.html(myListItems); 

现在所花费的时间仅19毫秒,比我们之前的第一个例子明显提高了50倍。

8. 尽可能使用IDs而不是classes

jQuery利用classes进行DOM元素选择操作与通过ID进行选择一样容易,因此与之前相比更自由的使用classes进行元素选择操作很有吸引力。不过由于jQuery使用浏览器固有的方法(getElementById )进行选择操作,因此利用ID进行选择操作更有优势。有多快呢?让我们来看看。

我使用前一个例子,修改它以便于我们创建的每个LI有一个唯一的class。然后我将遍历之,每次选择一个元素:

 var myList = $('.myList');

 var myListItems = '<ul>';

 for (i = 0; i < 1000; i++) {

 myListItems += '<li class="listItem' + i + '">This is a list item</li>';

 }

 myListItems += '</ul>';

 myList.html(myListItems);

// Select each item once 

 for (i = 0; i < 1000; i++) {

 var selectedItem = $('.listItem' + i);

 }
 

正如所想的,我的浏览器花费了5066毫秒的时间(5秒多)。因此我修改上述代码以使用ID而不是class,然后通过ID进行选择。

 // Create our list
 var myList = $('.myList');

 var myListItems = '<ul>'; 

 for (i = 0; i < 1000; i++) {

 myListItems += '<li id="listItem' + i + '">This is a list item</li>';

 }

 myListItems += '</ul>';

 myList.html(myListItems);

 // Select each item once 

 for (i = 0; i < 1000; i++) {

 var selectedItem = $('#listItem' + i);

 }
 

仅仅耗时61毫秒,几乎快了100倍。

9. 给选择器提供上下文

默认情况下,当你使用类似$(’.myDiv’)的选择器时将在整个DOM文档查找元素,这有很大的代价。

当执行选择操作时,jQuery函数可以指定第二个参数:

jQuery( expression, context )

通过给选择器提供一个上下文,那就会在这个context中进行元素查找,而不必在整个DOM文档中查找元素。

为了解释这个,我们采用前面的第一段代码。它创建一个有1000项内容的UL,每项都有一个单独的class。然后遍历之每次选择一项。你应该记得通过class选择所有的1000项item需要耗时5秒多。

 var selectedItem = $('#listItem' + i);

然后我给其添加一个上下文,以便于仅在UL中执行选择操作:

 var selectedItem = $('#listItem' + i, $('.myList'));

由于效率太差,仍耗时3818毫秒的时间,但是通过一个很小的修改仍获得了25%的速度提升。

10. 正确使用方法链

jQuery最炫的一个特性就是jQuery能够连续的进行方法调用。举例来说,你想去切换元素的class:

 $('myDiv').removeClass('off').addClass('on');

如果你像我这样,你可能在前五分钟的jQuery学习就可以更进一步使用它。首先它仍可以跨行操作(jQuery是JavaScript) ,这意味着你能够写出下面这样工整的代码:

 $('#mypanel')

  .find('TABLE .firstCol')
  .removeClass('.firstCol')

  .css('background' : 'red')
  .append('<span>This cell is now red</span>');

使用链表的习惯将有助于你减少选择器的使用。然而可以更深入使用之,你想在一个元素上执行好几个函数,但是以某种方式改变了操作的元素:

 $('#myTable').find('.firstColumn').css('background','red');

我们选择了一个表格,在其中找到class为”firstColumn”的单元格,然后使之背景变为红色。

现在我们希望将所有class为”lastColumn”的单元格背景设为蓝色。因为我们已经使用了find()函数过滤出class不为”firstColumn”的所有单元格,因此我们需要再一次对表格使用选择操作,我们难道不能连续进行方法调用吗?幸运的是jQuery提供了end()函数,这将匹配的元素列表变为前一次状态以便于你可以执行方法链表:

 $('#myTable')

  .find('.firstColumn')
  .css('background','red')

  .end()

  .find('.lastColumn')
  .css('background','blue');

写一个能够进行方法链式调用的自定义jQuery函数也很容易。你所做的就是要写个能修改元素并返回元素的函数。

 $.fn.makeRed = function() {
  return $(this).css('background', 'red');

 }

 $('#myTable').find('.firstColumn').makeRed().append('hello'); 

它很简单吧!

11. 学会正确使用效果

在我刚开始使用jQuery的时候,就很喜欢这一点:它可以很容易使用预定义好的各种动画效果,像slideDown()和fadeIn()之类的。由于jQuery提供的animate()方法十分易用和强大,我们很容易深入使用它。事实上,在jQuery源代码中不少方法就是通过animate()函数来实现效果的。

 slideDown: function(speed,callback){

  return this.animate({height: "show"}, speed, callback);
 },

 fadeIn: function(speed, callback){

  return this.animate({opacity: "show"}, speed, callback);
 }

animate()方法仅仅作用在CSS上,根据数值平滑的进行转换。因此你能够改变宽度、高度、透明度、背景色、top、left、margin、颜色、字体大小以及任何你想要的。

给菜单项添加高度变化的效果是很容易做到的:

 $('#myList li').mouseover(function() {
  $(this).animate({"height": 100}, "slow");

 }); 

不像其他的jQuery函数,动画效果自动的排进队列,因此如果在第一个特效完成之后你想运行第二个特效,需要两次调用animate方法:

 $('#myBox').mouseover(function() {

  $(this).animate({ "width": 200 }, "slow");
  $(this).animate({"height": 200}, "slow");

 }); 

如果你想动画效果同时发生,那么需要将所有的styles作为一个参数对象传入方法中:

 $('#myBox').mouseover(function() {

  $(this).animate({ "width": 200, "height": 200 }, "slow");
 });

你能够给值是数字的属性添加动画效果。你也可以下载插件帮助你给非数字值的属性添加动画效果,像colors and background colors

12. 了解事件代理

与之前相比,jQuery能够更容易得向DOM元素无缝添加事件。这是很棒的特性,然而向元素添加太多的事件是效率很差的。在很多情况下事件代理允许你用少量的事件实现同样的目的。最好的解释方法就是使用实例:

 $('#myTable TD').click(function(){
  $(this).css('background', 'red');

 });

当我们点击表格中的单元格时,上面的代码将使所有单元格背景变为红色。比方说,你有一个10列、50行的网格,那么就会绑定上500个事件。

嗯,这时就是事件代理出场的时候了:

 $('#myTable').click(function(e) {

  var clicked = $(e.target);
  clicked.css('background', 'red');

 }); 

‘e’包含了事件的信息,包括了实际接收到click事件的目标元素。我们所要做的就是检查是哪个单元格被点击了。相当的巧妙!

事件代理带来了另外一个好处。正常情况下,在你往一个元素集合绑定一个事件,该事件仅仅只是绑定到这些集合元素上。如果你向DOM中添加了新的元素,尽管这些新元素被选择器所匹配,但是这些新元素并不会绑定上事件处理(你同意我的观点吗?),因此不会有事件发生。

当使用事件代理时,你能够在事件被DOM绑定后仍然可以添加多个被匹配的元素到其中,而它们同样能够正常工作。

13. 利用classes存储状态

这是在html中存储信息最基本的方法。jQuery擅长基于classes进行元素的操作,因此如果你需要存储元素的状态信息,为什么不试试使用额外的class来存储它呢?

这里有一个例子。我们想创建一个展开的菜单。当你点击按钮时,我们希望通过slideDown()和slideUp()进行菜单的展开与收缩。请看下面的HTML:

  <div class="menuItem expanded">

  <div class="button">
  click me

  </div>

  <div class="panel">

  <ul>

  <li>Menu item 1</li>
  <li>Menu item 2</li>

  <li>Menu item 3</li>

  </ul>
  </div>

 </div>

非常的简单!我们仅仅向包装器DIV添加一个额外的class,它只是告诉我们item项的状态。因此在按钮点击之后我们所需要的只是click事件处理,这会执行相应的slideUp()和slideDown()方法。

 $('.button').click(function() {

  var menuItem = $(this).parent();

  var panel = menuItem.find('.panel');

  if (menuItem.hasClass("expanded")) {

  menuItem.removeClass('expanded').addClass('collapsed');
  panel.slideUp();

  }

  else if (menuItem.hasClass("collapsed")) {

  menuItem.removeClass('collapsed').addClass('expanded');
  panel.slideDown();

  }

 });

这是很简单的一个例子,不过你可以给一个元素或HTML片断添加额外的classes以存储所有种类的信息。

然而,除了在简单的情况之外我们更应该使用下面这个技巧。

14. 更好的方法是利用jQuery内置的data()方法存储状态

由于某些原因,这方面没有很好的文档可以参考。jQuery提供了内置的data()方法,与DOM元素不同的是,它可以用来存储key/value类型的数据。数据的存储是很容易的:

 $('#myDiv').data('currentState', 'off'); 

我们修改上一个例子的代码,以便于我们可以使用相同的HTML内容(除了没有”expanded”类)并使用data()函数来进行状态的存储:

  $('.button').click(function() {

  var menuItem = $(this).parent();
  var panel = menuItem.find('.panel'); 

  if (menuItem.data('collapsed')) {
  menuItem.data('collapsed', false);

  panel.slideDown();

  }

  else {
  menuItem.data('collapsed', true);

  panel.slideUp();

  }

 }); 

我相信你也会赞同这种方法的使用的确更加的精巧,对于data()和removeData()的更多信息,请查看jQuery internals

15. 写你自己的选择器

jQuery有许多内置的选择器用以通过ID、class、标签、属性以及其他元素进行选择操作。然而当你需要基于其它一些内容进行元素选择而jQuery却没有提供该选择器时,你能做什么呢?

嗯,一个解决方案可能是从一开始就给元素添加上classes,从而利用这些classes进行元素的选择操作。然而这被证明很难对jQuery扩展出新的选择器。

最好的解释方法就是使用实例:

 $.extend($.expr[':'], {
  over100pixels: function(a) {

  return $(a).height() > 100;

  }

 });

 $('.box:over100pixels').click(function() {

  alert('The element you clicked is over 100 pixels high');
 });

代码的前一部分创建一个自定义的选择器,它可以找出所有长度超过100px的元素。接下来的代码仅仅是将click事件绑定到使用该选择器查找出来的那些元素上。

这里我不做更具体的讲解,但是你能设想一下它有多么的强大!如果你在google上搜索”custom jquery selector”,你会看到有很多这方面的例子。

16. 精简你的HTML并在页面加载后修改它

这个标题可能没有多大意思,但是这个技巧可能理顺你的代码、减小代码体积和页面的下载时间、有助优化你的搜索引擎。请看下面的例子:

 <div class="fieldOuter">
 <div class="inner">
 <div class="field">This is field number 1</div>
 </div>
 <div class="errorBar">
 <div class="icon"><img src="icon.png" alt="icon" /></div>
 <div class="message"><span>This is an error message</span></div>
 </div>
 </div>
 <div class="fieldOuter">
 <div class="inner">
 <div class="field">This is field number 2</div>
 </div>
 <div class="errorBar">
 <div class="icon"><img src="icon.png" alt="icon" /></div>
 <div class="message"><span>This is an error message</span></div>
 </div>
 </div>

上面是一个HTML的具体例子,为了解释目的做了少量修改。我相信你也会认为这段代码相当的丑陋。如果类似代码很长的话,你最终会形成一个相当长且丑陋的页面。因此你可以像下面这样处理它:

 <div class="field">This is field 1</div>
 <div class="field">This is field 2</div>
 <div class="field">This is field 3</div>
 <div class="field">This is field 4</div>
 <div class="field">This is field 5</div> 

所有你要做的就是在页面加载完成之后通过jQuery的操作将丑陋的HTML添加回去:

 $(document).ready(function() {
  $('.field').before('<div class="fieldOuter"><div class="inner">');
  $('.field').after('</div><div class="errorBar"><div class="icon">
  <img src="icon.png" alt="icon" /></div><div class="message">
  <span>This is an error message</span></div></div></div>');
 });
 

这样做并不总是可取的,在页面加载后的一瞬间你将会看到页面的闪动,但是在特定情况下你有很多重复的HTML内容,这时通过这个方法你可以显著的减小页面代码体积,减少无关且重复的标记能使你的SEO从中受益。

17. 为了速度和SEO方面的考虑,延迟加载内容

另外还有一个方法可以提升页面加载速度,理顺Spiders搜索的HTML内容,通过在页面加载之后使用AJAX请求晚加载其他内容,这样用户就可以马上开始浏览,让Spider看到你想要它们进行索引的内容。

我们已经在自己的网站上使用了这个技术。本页面上部的紫色按钮会弹出三个表格,方位与Google地图,这会使我们页面大小增加两倍。因此我们仅需要把这些HTML内容放入一个静态页面中,在页面加载完成之后通过load()函数加载它:

 $('#forms').load('content/headerForms.html', function() {
  // Code here runs once the content has loaded
  // Put all your event handlers etc. here.
 });
 

我不会在页面上随处使用这个技巧。对此,你必须权衡考虑。你需要有额外的页面请求,而且页面上的部分内容不能立即呈现给用户,但是正确的使用这个技巧对优化会很有帮助。

18. 使用jQuery提供的工具函数

jQuery不仅仅有闪光的效果。jQuery作者也提供了一些相当实用的方法,这填补了JacaScript的一些缺陷。
http://docs.jquery.com/Utilities

尤其,提供一些常见的数组函数的浏览器支持是一个补丁。jQuery提供了迭代、过滤、克隆、合并和从数组中去除重复项的方法。

其他常用的函数包括得到下拉框中的选择项。用传统的JavaScript方法,你就必须使用getElementById得到<select>元素,然后通过遍历它的子元素找出被选中的元素。而jQuery提供了相当容易使用的方法:

 $('#selectList').val(); 

花时间浏览官方网站上的jQuery文档与一些不常用的方法上是很值得的。

19. 使用noConflict重命名jQuery对象

大多数JavaScript框架都使用$符号作为缩写,当在同一个页面使用多个JS框架时,页面很容易发生冲突。幸运的是有一个简单的方法。noConflict()函数交回$的控制权并允许你设置成自己的变量名:

 var $j = jQuery.noConflict();
 $j('#myDiv').hide();
 

20. 如何得知图片已加载完毕

这也一个没有很好文档说明的问题(至少在我查找时没看到),但是在创建照片库、旋转灯笼效果等方面,它是相当常见的需求。而这在jQuery中很容易实现。

所有你要做的就是在IMG上使用.load()方法,在其中添加一个回调函数。下面的例子改变了一个图片src的属性同事附加上一个简单的load函数:

 $('#myImage').attr('src', 'image.jpg').load(function() {
  alert('Image Loaded');
 }); 

你应该可以发现一旦图片加载完毕就会弹出一个alert。

21. 总是使用最新版本

jQuery仍在不断的更新,它的作者John Resig一直在寻找提高jQuery性能的方法。

jQuery当前的版本是1.2.6,John已经宣称他正在写一个新的选择器引擎Sizzle,这可能会显著的提高选择器性能(在Firefox中提升了4倍),因此我们应当保持最新版本。

【译注】
这是去年年底写的文章,而目前最新版本是v.1.3.2。

22. 如何检查元素是否存在

你不必检查元素是否在页面上存在就可以使用它,因为如果没有在DOM中找到合适的元素,jQuery什么也不会做。可是当我们需要检查元素是否被选择了,或是有多少项被选择了,你可以使用length属性:

 if ($('#myDiv).length) {
  // your code
 }
 

简单之极。

23. 给你的HTML属性增加JS类

我是从Karl Swedberg那学到这个技巧,过去学习jQuery时一直在看他的书。

他最近在我以前的文章留下了对该用法的评论,基本原则如下示之。

首先,在jQuery加载之后你可以使用方法将”JS”类添加到HTML标签中:

 $('HTML').addClass('JS');

因为这仅仅发生在javascript有效的时候,如果用户打开JavaScript开关,那么你可以使用它给元素添加上CSS风格:

 .JS #myDiv{display:none;}

因此,这意味着在JavaScript打开时我们可以隐藏内容,然后在需要时使用jQuery显示这些内容(比如在用户点击时收缩或展开内容),同时在关闭JavaScript(以及搜索Spiders)时会看到所有内容。我将在晚些时候使用这个技巧。

可以在这里看到他的所有文章

24. 返回’false’以防止默认行为

这是很明显的,也可能不是。如果你有这样的习惯:

<a href="#" class="popup">Click me!</a> 

然后添加上如下的事件处理:

$('popup').click(function(){
  // Launch popup code
 }); 

你在长页面使用上述方法时,它可能可以正常工作。有些时候你会注意到在点击链接后锚点会跳转到页面上部。

所有你要做的就是阻止它的默认行为,或者实际上你可以把”return false;”添加到任何事件的默认行为上。像这样:

$('popup').click(function(){
  // Launch popup code
  return false;
});

25. ready事件的简写

一个小技巧但是通过使用$(document).ready()的简写,你可以少输入几个字符。
取代:

$(document).ready(function (){
  // your code
}); 

你可以简写成:

$(function (){
  // your code
 });

如果你喜欢这篇文章,请digg一下。

———————————————
感谢翻译本文的译者,这篇文章真是写的太赞了,之前看到英文原文就一直想翻译一下,苦于没有时间,这几天twitter上被RT很多,于是google了下中文标题,竟然发现已有中文版,在此再次感谢译者的无私奉献!

  • Share/Save/Bookmark

《巴比伦富翁的理财课》

Filed Under (Life) by Dream☆Wing on 29-05-2009

Tagged Under :

第1课 勇敢面对债务以获得自尊自重
1.勇敢面对你的债务!不要有任何侥幸之心,坚信清偿债务比躲债和赖账更加容易,也更能让你获得自尊自重,无债一身轻松。
2.尽快罗列所有的债务清单,与每一位债主沟通协商,坦诚地将现状据实相告,向他们解释你的偿债计划并达成协议。
3.更加辛勤努力地工作,首先将所有收入的7/10留作家用,以保证家人的生活温饱和衣食无忧,这既是你的爱心,也是你应当承担的责任。
4.公平、老实地将所有收入的2/10分成苦干等份偿还债主,坚定不移地履行偿债的承诺,债主们会理解并赞扬你的行为。
5.坚持培养自己储蓄的习惯,将所有收入的1/10储存起来,积少成多,以备急需或者今后用于稳定而安全的投资。
6.无论如何,永远都需要量入为出,约束自己的花费,坚持所有开销不能超过收入7/10的原则,即便是还清了债务之后。

第2课 开启自我心灵和精神的巨大潜能
1. 如果你带着有色的眼光看待这个世界,你就不会发现这个世界真实的颜色,也就会被许多软弱而卑贱的心态和假象所蒙蔽。
2. 放纵自己,经常花钱入不敷出的人,往往内心充满了怯懦,也终将种下苦果,最后必然遭到报应,陷溺于困境和羞辱的结局。
3. 假如一个人内心里面藏有做奴隶的灵魂,无论他出身如何,他终将沦为奴隶;假如一个人内心里面具有自由人的灵魂,则无论他再怎么不幸,他仍然能获得荣誉并受人尊敬。
4. 人生总有一连串的问题和考验需要面对,拥有做自由人的灵魂,就能获得巨大的毅力和坚定的信念,既能勇敢面对,又能成功解决;而藏有做奴隶的灵魂,就只能是逃避和哀叹。
5. 你的债务将是你最大的敌人,你若回避或放任它们,它们就会日益强大,不仅会逼迫你背井离乡,而且还会让你失去曾经拥有的全部傲气与尊严。
6. 如果你有高尚的心灵,你就能坚定而睿智地与债务进行搏斗,你最终就会战胜并且制服它们,重新赢回你的尊严,因为“有志者事竟成”这句哲理之言将永远颠扑不破。

第3课 辛勤工作是运气和财富的源泉

1.即使身为奴隶,辛勤工作也会给你带来好运。因为任何一个主人都不会将辛勤为他干活的奴隶打死,他们也会喜欢勤奋努力的人,并且善待他们。
2.喜欢你的工作,把辛勤工作当成你最好的朋友!这样,幸运就会和你结伴而行了,不仅可以使你免遭厄运和灾难降临,甚至有时还可以挽救你的生命。
3.任何财富的积累总是从辛勤工作开始的,你越努力工作,你就越容易更快更多地赚取金钱,也就容易成为财富自由的人。
4.幸运只偏爱那些辛勤工作的人,诸神也会眷顾惠赐他们。厄运则必然会降临那些厌恶和漠视工作的人,他们将与苦难为伍,悲惨一生。
5.辛勤工作是创造运气和财富的真正秘诀,这个秘诀对任何人都简单有效,无一例外。坚持这一信念既能解救自己于苦难之中,更能成就自己的精彩人生。
6.与其能够继承富有前辈的财产馈赠,不如传承他们辛勤工作的精神品质和启示。这样,你最终就能和他们一样富有、荣耀并令人敬重。

第4课 严守你的金钱并让它增值
1.假如你需要帮助你的朋友,你完全可以帮,但是绝不能把你朋友的负担转稼到自己身上,从而变成了自己的负担。
2.最好不要把金钱随意借给你的朋友,因为这样的结果,往往会使你既可能丢掉了金钱,又可能丧失了朋友。
3.可以借给他钱的三种人:拥有的财富超过其所借款项的人;拥有持续而稳定收入的人;有抵押品或可靠担保的人。当然,他们都应该是自尊自重、值得信赖的人。
4.绝不可借给他钱的三种人:陷入苦闷、麻烦不断的人;欠缺知识、经验和能力的人;债台高筑无力偿还的人。总之,所有那些放纵自己、不讲信用的人。
5.如果你拥有一笔不算少的钱财,请遵循下列两条原则:第一是保证它们安全无恙;第二是尽量使它们增值。如果第二条没有把握做到,就请回到第一条。
6.对金钱的借贷而言,有一条重要的格言,这条格言在任何情况下都同时适用于任何放款和借款的人:永远谨慎一点,强过追悔莫及。

第5课 为自己的钱财修筑坚固的城墙
1. 无论一个人、一座城市或一个王国,如果能够拥有财富和荣耀,那就一定存在其中的根源和道理,任何人都应该思考、理解并学习这些道理,并把它们运用到自己的实践之中。
2. 巴比伦的富庶和昌盛可能来自许多方面,但至少包括:尽可能地利用所有资源,人定胜天的智慧、进取心和创造力,不断积累和创造财富并为它们修筑不被敌族掠夺的城墙。
3. 巴比伦能够世代繁荣并延续千百年,就是因为它完全受到了坚固城墙和英勇战士的保护,任何个人也必须为自己的财富建立妥善的保护并顽强守卫。
4. 任何钱财都是长有脚的灵物,并不断受到他人的觊觎和盘算,如果不能妥善看管和严加守卫,它们随时随地都可能偷偷溜走或被他人巧取豪夺。
5. 我们应该更加聪明地利用保险、储蓄和可靠投资带来的保护,并发展出更好和更广泛的保护措施,从而使我们的财富、生命和未来幸免于难。
6. 任何人都需要也希望受到保护,这是人类天性中固有的愿望,但要使愿望成真,我们就需要不断为自己构筑坚固的城墙并勇敢地守卫它。

全文http://docs.google.com/View?id=dgms7ptc_76fw4gqvfv

  • Share/Save/Bookmark

Zend Studio 7.0 EA 发布!

Filed Under (PHP) by Dream☆Wing on 21-05-2009

Tagged Under :

刚“升”到6.1.2,这7.0又快出了,直接一个版本的跳跃,看来是要修正好多问题,其实最主要的还是要跟进PHP5.3吧,提供的特性都挺方便的,不过暂时开发用的还是5.2.9,所以先关注下,等正式版出来再继续“升”吧。。。

———————以下为官方的发布介绍的部分翻译———————–

Zend Studio 7.0 Early Access (EA) 提供了一些7.0新增特性和改进的预览

这些特性并没有全部完成,但是可以提前预览下这些即将到来的新特性

点此反馈和提交bug

Zend Studio 7.0 基于Eclipse 的最新版本(Galileo).

注意:虽然开发人员尽量使这个版本保持稳定,但是毕竟是EA版本,请小心使用,不要用在任何线上产品上。

点此下载

Zend Studio 7.0有哪些新特性?

What’s New in Zend Studio 7.0?

支持PHP 5.3

支持PHP的最新特性,比如namespaces(命名空间)和lambda functions(匿名函数):

  • PHP 5.3 特性的代码提示和语法高亮
  • Namespace 大纲
  • 捆绑了 PHP 可执行和调试功能

加强的源码编辑功能

Enhanced Source Code Editing

拥有更强大的面向对象的编辑功能

  • 标示来源 of Language Elements, Exit Paths and Requires
  • 重载指示 for quick navigation between methods
  • 类型阶级 view for structured class hierarchy
  • Open Type / Method with Camel-Case Match
  • Code Assist Grouping
  • Inline Refactoring for fast element renaming
  • Develop modular applications with Build and Include Path features
  • Turn a block of code into a function or a variable with Extract Variable / Method
  • Semantic Analysis and Auto Fix

集成Zend Server进行快速的本地调试

Quick Root Cause Analysis through Zend Server Integration

Tight integration with Zend Server for easy debugging and problem resolution

  • Auto Detection and configuration of the local Zend Server
  • Easy Deployment to Local Server
  • Easy Debug setup
  • List View of Associated Servers
  • Quick launch of Zend Server Events List
  • Debug Imported Events

快速的Zend Framework应用开发

Rapid Application Development with Zend Framework

Integration with Zend Tool and code generation for rapid application development

  • Easy Creation of Zend Framework Elements
  • Customized Zend Framework Project Layout
  • Updated Zend Framework Example Project
  • Code generation through Zend Tool integration

更好的性能

Better Performance

  • Reduced memory footprint with better workspace modeling
  • Use of Eclipse Indexing and Caching architecture
  • Removed unneeded dependencies

如何进行反馈

访问 Zend Forums 进行反馈,提问或者提交bug

Zend Studio的更新提示

Get Notified on Zend Studio Updates

Make sure you sign up for the Zend PHP Update Email to receive information about Zend Studio, tips and tricks, PHP development best practices and more.

  • Share/Save/Bookmark

header中的Cache-control参数说明

Filed Under (PHP) by Dream☆Wing on 10-05-2009

Tagged Under : , ,

网页的缓存是由HTTP消息头中的“Cache-control”来控制的,常见的取值有private、no-cache、max-age、must-revalidate等,默认为private。其作用根据不同的重新浏览方式分为以下几种情况:

(1) 打开新窗口
值为private、no-cache、must-revalidate,那么打开新窗口访问时都会重新访问服务器。
而如果指定了max-age值,那么在此值内的时间里就不会重新访问服务器,例如:
Cache-control: max-age=5(表示当访问此网页后的5秒内再次访问不会去服务器)

(2) 在地址栏回车
值为private或must-revalidate则只有第一次访问时会访问服务器,以后就不再访问。
值为no-cache,那么每次都会访问。
值为max-age,则在过期之前不会重复访问。

(3) 按后退按扭
值为private、must-revalidate、max-age,则不会重访问,
值为no-cache,则每次都重复访问

(4) 按刷新按扭
无论为何值,都会重复访问

Cache-control值为“no-cache”时,访问此页面不会在Internet临时文章夹留下页面备份。

另外,通过指定“Expires”值也会影响到缓存。例如,指定Expires值为一个早已过去的时间,那么访问此网时若重复在地址栏按回车,那么每次都会重复访问: Expires: Fri, 31 Dec 1999 16:00:00 GMT

比如:禁止页面在IE中缓存

http响应消息头部设置:

CacheControl = no-cache
Pragma=no-cache
Expires = -1

Expires是个好东东,如果服务器上的网页经常变化,就把它设置为-1,表示立即过期。如果一个网页每天凌晨1点更新,可以把Expires设置为第二天的凌晨1点。

当HTTP1.1服务器指定CacheControl = no-cache时,浏览器就不会缓存该网页。

旧式 HTTP 1.0 服务器不能使用 Cache-Control 标题。
所以为了向后兼容 HTTP 1.0 服务器,IE使用Pragma:no-cache 标题对 HTTP 提供特殊支持。
如果客户端通过安全连接 (https://)与服务器通讯,且服务器在响应中返回 Pragma:no-cache 标题,
则 Internet Explorer不会缓存此响应。注意:Pragma:no-cache 仅当在安全连接中使用时才防止缓存,如果在非安全页中使用,处理方式与 Expires:-1相同,该页将被缓存,但被标记为立即过期

header常用指令
header分为三部分:
第一部分为HTTP协议的版本(HTTP-Version);
第二部分为状态代码(Status);
第三部分为原因短语(Reason-Phrase)。

// fix 404 pages:   用这个header指令来解决URL重写产生的404 header
header(’HTTP/1.1 200 OK’);

// set 404 header:   页面没找到
header(’HTTP/1.1 404 Not Found’);

//页面被永久删除,可以告诉搜索引擎更新它们的urls
// set Moved Permanently header (good for redrictions)
// use with location header
header(’HTTP/1.1 301 Moved Permanently’);

// 访问受限
header(’HTTP/1.1 403 Forbidden’);

// 服务器错误
header(’HTTP/1.1 500 Internal Server Error’);

// 重定向到一个新的位置
// redirect to a new location:
header(’Location: http://www.example.org/‘);

延迟一段时间后重定向
// redrict with delay:
header(’Refresh: 10; url=http://www.example.org/’);
print ‘You will be redirected in 10 seconds’;

// 覆盖 X-Powered-By value
// override X-Powered-By: PHP:
header(’X-Powered-By: PHP/4.4.0′);
header(’X-Powered-By: Brain/0.6b’);

// 内容语言 (en = English)
// content language (en = English)
header(’Content-language: en’);

//最后修改时间(在缓存的时候可以用到)
// last modified (good for caching)
$time = time() - 60; // or filemtime($fn), etc
header(’Last-Modified: ‘.gmdate(’D, d M Y H:i:s’, $time).’ GMT’);

// 告诉浏览器要获取的内容还没有更新
// header for telling the browser that the content
// did not get changed
header(’HTTP/1.1 304 Not Modified’);

// 设置内容的长度 (缓存的时候可以用到):
// set content length (good for caching):
header(’Content-Length: 1234′);

// 用来下载文件:
// Headers for an download:
header(’Content-Type: application/octet-stream’);
header(’Content-Disposition: attachment; filename=”example.zip”‘);
header(’Content-Transfer-Encoding: binary’);

// 禁止缓存当前文档:
// load the file to send:readfile(’example.zip’);
// Disable caching of the current document:
header(’Cache-Control: no-cache, no-store, max-age=0, must-revalidate’);
header(’Expires: Mon, 26 Jul 1997 05:00:00 GMT’);

// 设置内容类型:
// Date in the pastheader(’Pragma: no-cache’);
// set content type:
header(’Content-Type: text/html; charset=iso-8859-1′);
header(’Content-Type: text/html; charset=utf-8′);

// plain text file
header(’Content-Type: text/plain’);

// JPG picture
header(’Content-Type: image/jpeg’);

// ZIP file
header(’Content-Type: application/zip’);

// PDF file
header(’Content-Type: application/pdf’);

// Audio MPEG (MP3,…) file
header(’Content-Type: audio/mpeg’);

// flash file
header(’Content-Type: application/x-shockwave-flash’);

// 显示登录对话框,可以用来进行HTTP认证
// Flash animation// show sign in box
header(’HTTP/1.1 401 Unauthorized’);
header(’WWW-Authenticate: Basic realm=”Top Secret”‘);
print ‘Text that will be displayed if the user hits cancel or ‘;
print ‘enters wrong login data’;?>

  • Share/Save/Bookmark

我正在用的Firefox附件组件

Filed Under (Computer) by Dream☆Wing on 08-05-2009

Tagged Under :

FireBug–调试必备

YSlow–性能优化参考

FirePHP–调试PHP

HttpFox–调试必备

TwitterFox–挺好用

Delicious–收藏站点必备

Diigo–用的人有点少,圈子太少

Feedly–看Greader不错,页面推荐也不错

Better Greader–跟上面的有点冲突了,爱怎么用就怎么用吧

DownThemAll–非常好用的下载工具

Cooliris–效果很棒,但是不常用

All-in-one Gestures–很方便的鼠标手势插件

Easy DragToGo–很方便的鼠标拖拽插件

FoxTab–效果不错,但是不实用

gDocsBar–Google Doc常用工具,不常用就禁用了。。。

Pearl Crescent Page Saver Basic–网页截图插件

Ubiquity–很强大的插件,习惯了更强大

Javascript Debugger–被禁用了,还没机会试用

It’s All Text–被禁用了+1

  • Share/Save/Bookmark

[转]水煮互联网创业,互联网创业的盲区

Filed Under (Anything) by Dream☆Wing on 08-05-2009

Tagged Under :

1 鞋厂理论:

世界上有无数家鞋厂,制造着各自的鞋子,销售给各自的客户。

在网络上,当某个生意已经有人在做的时候,就想想皮鞋理论,你会发现:在大多数情况下,即使有很多人在做鞋子,也并不意味着你就不能再去做鞋子了,别人做了耐克,你可以做李宁,不行就做安踏啥的,即使不知名的杂牌也在三线城市卖的不错。

如 果其他的鞋厂都在赚钱,那么你也有机会在这个市场里分一杯羹;如果其他鞋厂都在亏钱,那么你要想办法把他们亏掉的钱赚到自己手上。把成本、产品、服务、渠 道、营销都做好,你就有机会超过现有的竞争对手。赚钱的生意,往往都是已经有很多人都在做的生意。如果某种生意只有你一个人在做,也许说明你的生意没法赚 钱,所以没人看得上。

2 杂货店理论

很多大型的卖场或公司,比如沃尔玛、八佰伴、麦当劳等,最初都是从一家小店起家的,从小蚂蚁逐渐做到巨无霸。

在 网络上,很多人相信,在没有VC的时候,公司亏钱是正常的,等某一天拿了巨额的VC,扩大规模、全国连锁,就肯定会赚钱,于是公司的核心团队把时间精力都 花在了各类投资经理身上。这时候,就该想想杂货店理论,如果你经营一家小杂货店却一直亏钱,那么,如果有人帮你做到了7-11那样的全球连锁,你会亏得更 多。

除去那些具有技术革命性的公司(比如3G、云计算、光存储啥的),在大部分情况下,一个好的公司、或者说一个好的商业模式,如果在大 范围内可以赚钱,那么缩小到一个小范围去运营,也应该是赚钱的。这样的公司,尽管前期需要少量的初始资本和时间来配置人员、软硬件,但绝不会把自己的未来 寄托在虚无缥缈的巨额投资和全球扩张上。沉浸在VC幻想里的孩子们,不如先去经营个杂货店,会比见VC学到更多东西。

3 户口本悖论

警察局有当地所有居民的户口档案,但是警察局能从中赚钱么?

在 网络上,很多人都把“抓用户”作为唯一的追求(或者作为前几年的唯一追求),而忽略了构建真正可行的健康的盈利模式。这时候,你就该想想户口本理论:警察 局拥有那么多用户的详细资料,详细到血型、电话和住址门牌号,你的网站能比警察局更牛逼么?如果你以为靠那点用户的email就能赚钱的话,警察局早就可 以去纳斯达克了。

当然,我不否认一定基数的用户的确是赚钱的重要条件之一,但是光养用户、不思现金流是没有意义的。有很多手持几百万注册 用户的网站还看不到任何赚钱的希望,而有些才几万人的小站却每天有稳健的现金入账。所以,如果赚不到钱的话,建议别再到处炫耀有xx百万用户了,搞那么多 用户还不赚钱,只能证明两个字:无能。

4 沸水理论:

把水煮沸后,看上去热气腾腾,但水的总量不会增加,而且需要供热成本。

在 网络上,很多人不择手段地去追求用户的“活跃度 ”,却不考虑活跃度到底能带来什么收益。活跃度本质上有两种:跟业务相关的活跃度,比如经常上淘宝看流行商品的活跃用户,一般来说会增加购买的几率;另一 种则是与业务无关的活跃度,假设淘宝搞了个跟购物无关的免费网游,结果每天有几百万人上线来玩(产品经理可以报上很漂亮的activation rate和retention rate),但这些人单纯迷恋网游的人转去淘宝购物的机会有多大呢?由网游带来的收益是否能超过开发和维护网游服务器的成本呢?没人知道。

这 时候想想一桶沸水,为了维持一个看上去热腾腾的活跃度,你需要不断添柴、加火,这些供暖成本很高的,而由此产生的热气却无法增加额外的水量,那么还要煮沸 它做什么呢。特蕾莎修女说,一个人的逝去是个悲剧,而一群人的逝去只是一个数字。在网络上,当我们看到一群人的活跃是个漂亮数字的时候,应该去看看每个人 活跃的背后到底意味着什么价值。

5 热水器理论

有很多人愿意花钱购买热水器,也有很多人愿意花钱维修出故障的热水器。

在 网络上,很多人相信,如果一个网络产品不是人们的必需品,那么就很难收费。的确,网络上的用户已经习惯了免费的生活,正如人们习惯了免费的空气、免费的马 路一样。这个时候你就该想想热水器理论,热水器也不是生活必需品,人们完全可以洗免费的冷水澡,甚至不洗澡,为啥家家都有一台动辄上千元的热水器呢?

很 简单,因为人类有意愿追求高质量的生活体验(包括但不限于洗澡),而热水器没有更廉价的替代品。如果你的网络产品或服务能够给人们带来真正高质量的生活体 验,同时又没有廉价的替代品,那么一样有人愿意付钱。比如,我很愿意为Gmail的手机客户端付钱,很愿意为Pandora的在线音乐付钱,很愿意为 Yeeyan的高质量译文付钱,当然也愿意为Tucia的设计服务付钱。跟我一样的人还有很多,请不要对互联网绝望。

6 油条铺现象:

如果你去跟街上卖油条、卖煎饼的师傅聊一聊,你会发现他们每月的收入很稳定,有的甚至可以月入几万。

网 上总说创业99%会失败,什么九死一生,什么倾家荡产都用来形容创业者。这时候,想想卖油条煎饼的创业者,人家在街边随便摆个三轮车,就能养活一家人了。 再去看看大街上的餐厅、奶茶铺、手机配件店、杂货店、床上用品店。。。。为什么这些创业者大部分都活得好好的?而号称IT创业精英的大学生反而一分钱都赚 不到?

如果把“能够养活一家人”作为最低成功标准的话,那么大街上的普通人的创业成功率超过80%,而我们还用“创业九死一生、失败也正常”来安慰自己的无能,真他妈窝囊!


我简单总结了一下:

  • Share/Save/Bookmark

[转]挨踢加班人士的心声

Filed Under (Life) by Dream☆Wing on 29-04-2009

Tagged Under :



跟现在的状态很像。。。。。
  • Share/Save/Bookmark

几大出租房网站操作体验

Filed Under (Web) by Dream☆Wing on 17-04-2009

1. 58
其他的不做评论,在我把标题处理的只剩中文时仍然提示我“标题含特殊符号”,我就不懂了。发布失败
上传图片没有取消按钮,一度导致我中途卡住,无法进行操作,而且最多只能传4张
验证码直接显示,很容易就超时错误了,为啥不点击时再显示

2.赶集
体验很棒!发布信息的按钮做的很突出!58的发布按钮我就找了N久才找到!
小区选择的提示建议做的很到位,除了不支持多个字的首字母。
那个图片的高级上传相比其他网站做的很棒!不过直接显示高级也没什么的吧,普通上传完全可以取消嘛,而且就算有也可以不采用弹出窗口的形式嘛

3.焦点
差!
选小区,几百个小区在下拉菜单里,想找死人啊,更可怕的是从头找到尾没找到自己的小区。。。。
而且在FF,Chrome下JS效果完全没用,无法填房租。。。。发布失败
我说焦点怎么这么爱用下拉。。。楼层都来下拉。。。还最多99层。。。无语
那个视频难道有几个人传的吧。。。发布完了还得手机验证。。。彻底无语

  • Share/Save/Bookmark