2009年5月12日星期二
CSS bug顺口溜 (转)
二、浮动产生有缘故,若要父层包含住,紧跟浮动要清除,容器自然显其中;
三、三像素文本慢移不必慌,高度设置帮你忙;
四、兼容各个浏览须注意,默认设置行高可能是杀手;
五、独立清除浮动须铭记,行高设无,高设零,设计效果兼浏览;
六、学布局须思路,路随布局原理自然直,轻松驾驭html,流水布局少hack,代码清爽,兼容好,友好引擎喜欢迎。
七、所有标签皆有源,只是默认各不同,span是无极,无极生两仪—内联和块级,img较特殊,但也遵法理,其他只是改造各不同,一个*号全归原,层叠样式理须多练习,万物皆规律。
八、图片链接排版须小心,图片链接文字链接若对齐,padding和vertical-align:middle要设定,虽差微细倒无妨。
九、IE浮动双边距,请用display:inline拘。
十、列表横向排版,列表代码须紧靠,空隙自消须铭记。
2009年5月11日星期一
常用正则表达式 附带中文注释
原帖地址 http://hi.baidu.com/dxssi/blog/item/88e3e5501b24bb541038c21f.html
// 表单填写的用户名
var userNameMatches = /^[A-Za-z0-9\\d]+$/;
userNameMatches.test(userName)
// 表单填写的密码
var userPassWordMatches = /^[A-Za-z0-9\\d]+$/; //正则表达式
/^\w{6,16}$/
//表单填写的电子邮件
var userEmailMatches = /^\w+([-+.]\w+)*@\w+([-.]\w+)*\.\w+([-.]\w+)*$/; //正则表达式
//表单填写的真实姓名
var userTrueuNameMatches = /^[\u0391-\uFFE5]+$/; //正则表达式
//表单填写的身份证号
var userIDcardMatches =/^(\d{15}|\d{18}|\d{17}[X,x])$/; //正则表达式
//表单填写的年龄
var userAgeMatches =/^\d+$/; //正则表达式
//表单填写的用户昵称
var userNickNameMatches =/^[A-Za-z0-9\u0391-\uFFE5\\d]+$/; //正则表达式
//表单填写的用户地址
var userAddressMatches =/^[A-Za-z0-9\u0391-\uFFE5\\d]+$/; //正则表达式
//表单填写的用户地址
var userPostalcodeMatches =/^[0-9\\d]+$/; //正则表达式
//表单填写的用户QQ号
var userQQMatches =/^[0-9\\d]+$/; //正则表达式
//表单填写的用户联系电话
var userTelephoneMatches =/^[0-9\\d]+$/; //正则表达式
正则表达式使用手册
\将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,‘n’ 匹配字符 “n”。‘\n’ 匹配一个换行符。序列 ‘\\’ 匹配 “\” 而 “\(” 则匹配 “(”。
^匹配输入字符串的开始位置。如果设置了 RegExp 对象的 Multiline 属性,^ 也匹配 ‘\n’ 或 ‘\r’ 之后的位置。
$匹配输入字符串的结束位置。如果设置了RegExp 对象的 Multiline 属性,$ 也匹配 ‘\n’ 或 ‘\r’ 之前的位置。
*匹配前面的子表达式零次或多次。例如,zo* 能匹配 “z” 以及 “zoo”。* 等价于{0,}。
+匹配前面的子表达式一次或多次。例如,‘zo+’ 能匹配 “zo” 以及 “zoo”,但不能匹配 “z”。+ 等价于 {1,}。
?匹配前面的子表达式零次或一次。例如,“do(es)?” 可以匹配 “do” 或 “does” 中的“do” 。? 等价于 {0,1}。
{n}n 是一个非负整数。匹配确定的 n 次。例如,‘o{2}’ 不能匹配 “Bob” 中的 ‘o’,但是能匹配 “food” 中的两个 o。
{n,}n 是一个非负整数。至少匹配n 次。例如,‘o{2,}’ 不能匹配 “Bob” 中的 ‘o’,但能匹配 “foooood” 中的所有 o。‘o{1,}’ 等价于 ‘o+’。‘o{0,}’ 则等价于 ‘o*’。
{n,m}m 和 n 均为非负整数,其中n <= m。最少匹配 n 次且最多匹配 m 次。例如,“o{1,3}” 将匹配 “fooooood” 中的前三个 o。‘o{0,1}’ 等价于 ‘o?’。请注意在逗号和两个数之间不能有空格。
?当该字符紧跟在任何一个其他限制符 (*, +, ?, {n}, {n,}, {n,m}) 后面时,匹配模式是非贪婪的。非贪婪模式尽可能少的匹配所搜索的字符串,而默认的贪婪模式则尽可能多的匹配所搜索的字符串。例如,对于字符串 “oooo”,‘o+?’ 将匹配单个 “o”,而 ‘o+’ 将匹配所有 ‘o’。
.匹配除 “\n” 之外的任何单个字符。要匹配包括 ‘\n’ 在内的任何字符,请使用象 ‘[.\n]‘ 的模式。
(pattern)匹配 pattern 并获取这一匹配。所获取的匹配可以从产生的 Matches 集合得到,在VBScript 中使用 SubMatches 集合,在JScript 中则使用 $0…$9 属性。要匹配圆括号字符,请使用 ‘\(’ 或 ‘\)’。
(?:pattern)匹配 pattern 但不获取匹配结果,也就是说这是一个非获取匹配,不进行存储供以后使用。这在使用 “或” 字符 (|) 来组合一个模式的各个部分是很有用。例如, ‘industr(?:y|ies) 就是一个比 ‘industry|industries’ 更简略的表达式。
(?=pattern)正向预查,在任何匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如,‘Windows (?=95|98|NT|2000)’ 能匹配 “Windows 2000″ 中的 “Windows” ,但不能匹配 “Windows 3.1″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始。
(?!pattern)负向预查,在任何不匹配 pattern 的字符串开始处匹配查找字符串。这是一个非获取匹配,也就是说,该匹配不需要获取供以后使用。例如‘Windows (?!95|98|NT|2000)’ 能匹配 “Windows 3.1″ 中的 “Windows”,但不能匹配 “Windows 2000″ 中的 “Windows”。预查不消耗字符,也就是说,在一个匹配发生后,在最后一次匹配之后立即开始下一次匹配的搜索,而不是从包含预查的字符之后开始
x|y匹配 x 或 y。例如,‘z|food’ 能匹配 “z” 或 “food”。‘(z|f)ood’ 则匹配 “zood” 或 “food”。
[xyz]字符集合。匹配所包含的任意一个字符。例如, ‘[abc]‘ 可以匹配 “plain” 中的 ‘a’。
[^xyz]负值字符集合。匹配未包含的任意字符。例如, ‘[^abc]‘ 可以匹配 “plain” 中的‘p’。
[a-z]字符范围。匹配指定范围内的任意字符。例如,‘[a-z]‘ 可以匹配 ‘a’ 到 ‘z’ 范围内的任意小写字母字符。
[^a-z]负值字符范围。匹配任何不在指定范围内的任意字符。例如,‘[^a-z]‘ 可以匹配任何不在 ‘a’ 到 ‘z’ 范围内的任意字符。
\b匹配一个单词边界,也就是指单词和空格间的位置。例如, ‘er\b’ 可以匹配“never” 中的 ‘er’,但不能匹配 “verb” 中的 ‘er’。
\B匹配非单词边界。‘er\B’ 能匹配 “verb” 中的 ‘er’,但不能匹配 “never” 中的 ‘er’。
\cx匹配由 x 指明的控制字符。例如, \cM 匹配一个 Control-M 或回车符。x 的值必须为 A-Z 或 a-z 之一。否则,将 c 视为一个原义的 ‘c’ 字符。
\d匹配一个数字字符。等价于 [0-9]。
\D匹配一个非数字字符。等价于 [^0-9]。
\f匹配一个换页符。等价于 \x0c 和 \cL。
\n匹配一个换行符。等价于 \x0a 和 \cJ。
\r匹配一个回车符。等价于 \x0d 和 \cM。
\s匹配任何空白字符,包括空格、制表符、换页符等等。等价于 [ \f\n\r\t\v]。
\S匹配任何非空白字符。等价于 [^ \f\n\r\t\v]。
\t匹配一个制表符。等价于 \x09 和 \cI。
\v匹配一个垂直制表符。等价于 \x0b 和 \cK。
\w匹配包括下划线的任何单词字符。等价于‘[A-Za-z0-9_]‘。
\W匹配任何非单词字符。等价于 ‘[^A-Za-z0-9_]‘。
\xn匹配 n,其中 n 为十六进制转义值。十六进制转义值必须为确定的两个数字长。例如,‘\x41′ 匹配 “A”。‘\x041′ 则等价于 ‘\x04′ & “1″。正则表达式中可以使用 ASCII 编码。.
\num匹配 num,其中 num 是一个正整数。对所获取的匹配的引用。例如,‘(.)\1′ 匹配两个连续的相同字符。
\n标识一个八进制转义值或一个向后引用。如果 \n 之前至少 n 个获取的子表达式,则 n 为向后引用。否则,如果 n 为八进制数字 (0-7),则 n 为一个八进制转义值。
\nm标识一个八进制转义值或一个向后引用。如果 \nm 之前至少有 nm 个获得子表达式,则 nm 为向后引用。如果 \nm 之前至少有 n 个获取,则 n 为一个后跟文字 m 的向后引用。如果前面的条件都不满足,若 n 和 m 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm。
\nml如果 n 为八进制数字 (0-3),且 m 和 l 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (?)。
2009年5月10日星期日
彻底优化让Firefox不再卡
Firefox是Linux用户首选的浏览器,对其不作过多的介绍。只要看看LDCN的访客留言就知道他的流行程度了。
Firefox虽然是一款优秀的浏览器,但是不免还有些不足。对我而言,最大的不足就是其性能,简单的说,刚开始用很流畅,用久了,会越用越卡。
今天琢磨了一下Firefox,分析下Firefox卡的原因,并通过设定相关参数解决了这个问题。从此上网变得更加畅快!
—–
我的Firefox用户目录(~/.mozilla/firefox)是从Ubuntu 7.10时开始建立的,前前后后用过十几个插件,经历了从Firefox 2到Firefox 3,从Ubuntu 7.10到Ubuntu 8.04。
在Ubuntu 7.10的Firefox 2时,就遇到卡的问题,常常界面灰掉。
等到Ubuntu 8.04的Firefox 3,情况好一点,但是还是卡。后来我用极致编译参数编译了回Firefox 3.0,情况好了点,地址栏反应快了一点点,仅此而已。关闭Firefox的时候,还是会有很长的停顿时间,有时还卡死。
虽然重新建立用户目录会解决问题(即把~/.mozilla/firefox删除掉),但是相当多的资料/插件要重来,这个代价受不了,所以还得从Firefox本身动手脚。
查阅了相关资料,终于发现是由“历史访问”和“位置”引起的。
这个可不是我们能看到的“历史记录”和“地址栏”的已访问纪录,而是数据层面的。
让我们来看看,你的数据是不是过大了
查到数据库的大小
来到~/.mozilla/firefox/***.default(因人而异),下面有一个places.sqlite文件,看看它的大小。如果超过了10MB,理论上就能引起Firefox卡了。像我是21MB,一般用了一年左右的话,会有这个程度。
这个文件里存了些什么呢?让我用SQLite Manager这个扩展来看看:
在moz_favicons这张中,存了1500多个站点的Favicon,就是网站的Logo图标
moz_historyvisits这张表中,保存着所有访问过的纪录,我这里是六万条!
而moz_places这里存着近三万多的places:地址,标题和反转域名信息。
这些数据量到底对Firefox的性能有啥影响呢?我试着把places.sqlite改了个名,然后重启Firefox。
所有的停顿和卡都不复存在了!Firefox变得非常流畅。
当然问题是所有的历史纪录和地址栏信息都没有了,相当于起到了彻底“清除隐私纪录”的作用,只是这个的程度比“工具”->“清除隐私纪录”更深。
于是得出结论,在使用Firefox当中只要你要访问网站,它就会频繁的操作这个数据库,因为数据库很大,就影响了查询效率,所以会卡。而在关闭Firefox时,要对数据库作写入保存的操作,因为文件大,所以停顿很久也就不奇怪了。
清理数据
查明了是这个文件里面数据太多的原因,如果你对当前的历史和纪录没什么要求的话,直接删除就行了。
或者也可以用“工具”->“清除隐私纪录”,指定一些删除选项,也会有不错的效果,不过这并不能使文件变小,你需要用SQLite Manager,然后选择好数据库,并Database->Compact Database。这样会压缩数据库,使文件减少。
如果你熟悉Sql数据操作,那就更好了。可以有所保留地清理数据库。
在moz_places这张表中,有个字段(frencency)记录着每个条目的“频繁程度”,通过这个,你可以把一些不常使用的纪录全都通过sql语句查询并删除掉。只留下一些常用的纪录。
比如不常用的纪录frencnecy值一般为0,两三天才访问一次的网站可能为140,而我每天上的Gmail是6000!
永久性优化
“OK,我也会手动清理历史纪录,让我的Firefox快起来,问题是如何让它不再慢下去呢?”
我们来更改一个Firefox的隐藏设定,让它少记录点条目,我们就可以不用定期去清理它了。
在地址栏输入:about:config,过滤器中输入history,注意图中的以browser.history_expire_为前缀的条目:
browser.history_expire_days:表示历史纪录过期天数,默认是180天!
browser.history_expire_days.mirror:这个不详,跟镜像有关?
browser.history_expire_days_min:是用户值,即在“Firefox首选项”、“隐私”、“历史”当中,表示“保存我的历史,至少X天”。即使你在首选项中把“至少X天”设置成了了1天,或取消,Firefox还是会保存浏览历史,因为系统保留值为180天。
browser.history_expire_sites:这个是最大保存的站点数量,默认是四万个。
也就是说,系统要么保存180天的纪录,要么保存四万个浏览纪录,不过我上面的moz_historyvisits怎么达到了六万个呢?可能是指moz_places这张表。
差不多搞明白后,把值设置成下面的样子,站点数保存四千个就够了,系统保存3天的浏览纪录,用户最少1天。那个mirror随便设置了个值。
需要注意的是,如果你没有手动清理过places.sqlite,仅仅设定了这些值的话,文件是不会有变化的。清理还是得手动来。
接下来,就用实践来检验一切了,再过个半年查询一下places.sqlite的纪录,看看是否是被限制在了四千以内,这样的话Firefox应该再也卡不起来了。
另外,建议把“首选项”,“安全”,把有关”嫌疑攻击站点“和”伪造站点“的两个选择勾掉,有关这两个东西的文件也会相当大。不过没有places.sqlite夸张罢了。
ubuntu下firefox的收藏夹目录
mysql 字段类型说明
mysql 字段类型说明- -
MySQL支持大量的列类型,它可以被分为3类:数字类型、日期和时间类型以及字符串(字符)类型。本节首先给出可用类型的一个概述,并且总结每个列类型的存储需求,然后提供每个类中的类型性质的更详细的描述。概述有意简化,更详细的说明应该考虑到有关特定列类型的附加信息,例如你能为其指定值的允许格式。
由MySQL支持的列类型列在下面。下列代码字母用于描述中:
M
指出最大的显示尺寸。最大的合法的显示尺寸是 255 。
D
适用于浮点类型并且指出跟随在十进制小数点后的数码的数量。最大可能的值是30,但是应该不大于M-2。
方括号(“[”和“]”)指出可选的类型修饰符的部分。
注意,如果你指定一个了为ZEROFILL,MySQL将为该列自动地增加UNSIGNED属性。
TINYINT[(M)] [UNSIGNED] [ZEROFILL]
一个很小的整数。有符号的范围是-128到127,无符号的范围是0到255。
SMALLINT[(M)] [UNSIGNED] [ZEROFILL]
一个小整数。有符号的范围是-32768到32767,无符号的范围是0到65535。
MEDIUMINT[(M)] [UNSIGNED] [ZEROFILL]
一个中等大小整数。有符号的范围是-8388608到8388607,无符号的范围是0到16777215。
INT[(M)] [UNSIGNED] [ZEROFILL]
一个正常大小整数。有符号的范围是-2147483648到2147483647,无符号的范围是0到4294967295。
INTEGER[(M)] [UNSIGNED] [ZEROFILL]
这是INT的一个同义词。
BIGINT[(M)] [UNSIGNED] [ZEROFILL]
一个大整数。有符号的范围是-9223372036854775808到9223372036854775807,无符号的范围是0到18446744073709551615。注意,所有算术运算用有符号的BIGINT或DOUBLE值完成,因此你不应该使用大于 9223372036854775807(63位)的有符号大整数,除了位函数!注意,当两个参数是INTEGER值时,-、+和*将使用BIGINT运算!这意味着如果你乘2个大整数(或来自于返回整数的函数),如果结果大于9223372036854775807,你可以得到意外的结果。一个浮点数字,不能是无符号的,对一个单精度浮点数,其精度可以是<=24,对一个双精度浮点数,是在25 和53之间,这些类型如FLOAT和DOUBLE类型马上在下面描述。FLOAT(X)有对应的FLOAT和DOUBLE相同的范围,但是显示尺寸和小数位数是未定义的。在MySQL3.23中,这是一个真正的浮点值。在更早的MySQL版本中,FLOAT(precision)总是有2位小数。该句法为了ODBC兼容性而提供。
FLOAT[(M,D)] [ZEROFILL]
一个小(单精密)浮点数字。不能无符号。允许的值是-3.402823466E+38到-1.175494351E-38,0 和1.175494351E-38到3.402823466E+38。M是显示宽度而D是小数的位数。没有参数的FLOAT或有<24 的一个参数表示一个单精密浮点数字。
DOUBLE[(M,D)] [ZEROFILL]
一个正常大小(双精密)浮点数字。不能无符号。允许的值是-1.7976931348623157E+308到 -2.2250738585072014E-308、 0和2.2250738585072014E-308到1.7976931348623157E+308。M是显示宽度而D是小数位数。没有一个参数的 DOUBLE或FLOAT(X)(25 < = X < = 53)代表一个双精密浮点数字。
DOUBLE PRECISION[(M,D)] [ZEROFILL]
REAL[(M,D)] [ZEROFILL]
这些是DOUBLE同义词。
DECIMAL[(M[,D])] [ZEROFILL]
一个未压缩(unpack)的浮点数字。不能无符号。行为如同一个CHAR列:“未压缩”意味着数字作为一个字符串被存储,值的每一位使用一个字符。小数点,并且对于负数,“-”符号不在M中计算。如果D是0,值将没有小数点或小数部分。DECIMAL值的最大范围与DOUBLE相同,但是对一个给定的 DECIMAL列,实际的范围可以通过M和D的选择被限制。如果D被省略,它被设置为0。如果M被省掉,它被设置为10。注意,在MySQL3.22 里,M参数包括符号和小数点。
NUMERIC(M,D) [ZEROFILL]
这是DECIMAL的一个同义词。 DATE
一个日期。支持的范围是'1000-01-01'到'9999-12-31'。MySQL以'YYYY-MM-DD'格式来显示DATE值,但是允许你使用字符串或数字把值赋给DATE列。
DATETIME
一个日期和时间组合。支持的范围是'1000-01-01 00:00:00'到'9999-12-31 23:59:59'。MySQL以'YYYY-MM-DD HH:MM:SS'格式来显示DATETIME值,但是允许你使用字符串或数字把值赋给DATETIME的列。
TIMESTAMP[(M)]
一个时间戳记。范围是'1970-01-01 00:00:00'到2037年的某时。MySQL以YYYYMMDDHHMMSS、YYMMDDHHMMSS、YYYYMMDD或YYMMDD格式来显示TIMESTAMP值,取决于是否M是14(或省略)、12、8或6,但是允许你使用字符串或数字把值赋给TIMESTAMP列。一个 TIMESTAMP列对于记录一个INSERT或UPDATE操作的日期和时间是有用的,因为如果你不自己给它赋值,它自动地被设置为最近操作的日期和时间。你以可以通过赋给它一个NULL值设置它为当前的日期和时间。
TIME
一个时间。范围是'-838:59:59'到'838:59:59'。MySQL以'HH:MM:SS'格式来显示TIME值,但是允许你使用字符串或数字把值赋给TIME列。
YEAR[(2|4)]
一个2或4位数字格式的年(缺省是4位)。允许的值是1901到2155,和0000(4位年格式),如果你使用2位,1970-2069( 70-69)。MySQL以YYYY格式来显示YEAR值,但是允许你把使用字符串或数字值赋给YEAR列。(YEAR类型在MySQL3.22中是新类型。)
CHAR(M) [BINARY]
一个定长字符串,当存储时,总是是用空格填满右边到指定的长度。M的范围是1 ~ 255个字符。当值被检索时,空格尾部被删除。CHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词。NATIONAL CHAR(短形式NCHAR)是ANSI SQL的方式来定义CHAR列应该使用缺省字符集。这是MySQL的缺省。CHAR是CHARACTER的一个缩写。
[NATIONAL] VARCHAR(M) [BINARY]
一个变长字符串。注意:当值被存储时,尾部的空格被删除(这不同于ANSI SQL规范)。M的范围是1 ~ 255个字符。 VARCHAR值根据缺省字符集以大小写不区分的方式排序和比较,除非给出BINARY关键词值。 VARCHAR是CHARACTER VARYING一个缩写。
TINYBLOB
TINYTEXT
一个BLOB或TEXT列,最大长度为255(2^8-1)个字符。
BLOB
TEXT
一个BLOB或TEXT列,最大长度为65535(2^16-1)个字符。
MEDIUMBLOB
MEDIUMTEXT
一个BLOB或TEXT列,最大长度为16777215(2^24-1)个字符。
LONGBLOB
LONGTEXT
一个BLOB或TEXT列,最大长度为4294967295(2^32-1)个字符。
ENUM('value1','value2',...)
枚举。一个仅有一个值的字符串对象,这个值式选自与值列表'value1'、'value2', ...,或NULL。一个ENUM最多能有65535不同的值。
SET('value1','value2',...)
一个集合。能有零个或多个值的一个字符串对象,其中每一个必须从值列表'value1', 'value2', ...选出。一个SET最多能有64个成员。