白水田头问行路,小溪深处是何山
百度首页 | 百度空间
 
文章列表
 
2008年05月26日 星期一 19:34

1、禁用IPv6

目前IPv6还没有到来,Ubuntu这个超前的功能暂时可以屏蔽掉,以加快速度

#vi /etc/modprobe.d/aliases

alias net-pf-10 ipv6

===>

alias net-pf-10 off #ipv6

2、并行运行开机启动脚本(慎用)

/etc/init.d/下面的都是启动脚本,默认这些脚本是按顺序启动的,实际上,如果你使用的是SATA或SCSI接口,可以并行启动这些脚本程序,加速启动过程。

# vi /etc/init.d/rc

CONCURRENCY=none

===>

CONCURRENCY=shell

3、将localhost化名为主机名

据说这个方法可以改善使用Ubuntu一段后,在GNOME中启动应用程序变慢的问题

# vi /etc/hosts

127.0.0.1 localhost

127.0.1.1 Ubuntu

===>

127.0.0.1 localhost Ubuntu

127.0.1.1 Ubuntu

注:在第一行末尾加上主机名,也就是第二行的那个名字。

4、禁用Pango

Pango是一个着重于国际化的,用于输出和文本渲染的库,但是这个库可能导致Firefox等一些程序占用过高的 CPU,所以我们可以禁用它。

# vi /etc/environment

MOZ_DISABLE_PANGO="1"

5、禁用gettys

# vi /etc/event.d/tty3

把所有以start开头的行,用#注释掉(:%s/^start/#start/)

6、安装preload

可以把一些常用到的lib库和应用程序预加载到内存,以提高程序的启动速度

# apt-get install preload

7、设置swappiness

减少系统对于swap频繁的写入,将加快应用程序之间的切换,有助于提升系统性能

系统默认为60,你可以改为10

# sysctl vm.swappiness=10

如果要让它开机自动设定

# vi /etc/sysctl.conf (加入)

vm.swappiness=10

8、# vi /etc/fstab

# /dev/sda1

UUID=740accd9-9adc-4bce-8ca1-c2a7cb8428cf / ext3 defaults,errors=remount-ro 0 1

===>

# /dev/sda1

UUID=740accd9-9adc-4bce-8ca1-c2a7cb8428cf / ext3 defaults,errors=remount-ro 0 0

9、# vi /boot/grub/menu.lst (取消开机启动画面)
title Ubuntu 7.10, kernel 2.6.22-14-generic
root (hd0,0)
kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=740accd9-9adc-4bce-8ca1-c2a7cb8428cf ro quiet splash
initrd /boot/initrd.img-2.6.22-14-generic
quiet

===>
title Ubuntu 7.10, kernel 2.6.22-14-generic
root (hd0,0)
kernel /boot/vmlinuz-2.6.22-14-generic root=UUID=740accd9-9adc-4bce-8ca1-c2a7cb8428cf ro quiet nosplash
initrd /boot/initrd.img-2.6.22-14-generic
quiet
 
2008年05月13日 星期二 22:09
{ZHUAXIA53694882b427b7248bf7f19bcfc6b142Union}
 
2008年04月01日 星期二 15:42

(1)、back_log:
要求 MySQL 能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接并且启动一个新线程。
back_log 值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很多连接,你需要增加它,换句话说,这值 对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 试图设定back_log高于你的操作系统的限制将是无效的。
当你观察你的主机进程列表,发现大量 264084 | unauthenticated user | xxx.xxx.xxx.xxx | NULL | Connect | NULL | login | NULL 的待连接进程时,就要加大 back_log 的值了。默认数值是50,我把它改为500。

(2)、interactive_timeout:
服务器在关闭它前在一个交互连接上等待行动的秒数。一个交互的客户被定义为对 mysql_real_connect()使用 CLIENT_INTERACTIVE 选项的客户。 默认数值是28800,我把它改为7200。

(3)、key_buffer_size:
索 引块是缓冲的并且被所有的线程共享。key_buffer_size是用于索引块的缓冲区大小,增加它可得到更好处理的索引(对所有读和多重写),到你能 负担得起那样多。如果你使它太大,系统将开始换页并且真的变慢了。默认数值是8388600(8M),我的MySQL主机有2GB内存,所以我把它改为 402649088(400MB)。

(4)、max_connections:
允许的同时客户的数量。增加该值增加 mysqld 要求的文件描述符的数量。这个数字应该增加,否则,你将经常看到 Too many connections 错误。 默认数值是100,我把它改为1024 。

(5)、record_buffer:
每个进行一个顺序扫描的线程为其扫描的每张表分配这个大小的一个缓冲区。如果你做很多顺序扫描,你可能想要增加该值。默认数值是131072(128K),我把它改为16773120 (16M)

(6)、sort_buffer:
每个需要进行排序的线程分配该大小的一个缓冲区。增加这值加速ORDER BY或GROUP BY操作。默认数值是2097144(2M),我把它改为 16777208 (16M)。

(7)、table_cache:
为所有线程打开表的数量。增加该值能增加mysqld要求的文件描述符的数量。MySQL对每个唯一打开的表需要2个文件描述符。默认数值是64,我把它改为512。

(icon_cool.gif、thread_cache_size:
可 以复用的保存在中的线程的数量。如果有,新的线程从缓存中取得,当断开连接的时候如果有空间,客户的线置在缓存中。如果有很多新的线程,为了提高性能可以 这个变量值。通过比较 Connections 和 Threads_created 状态的变量,可以看到这个变量的作用。我把它设置为 80。

(10)、wait_timeout:
服务器在关闭它之前在一个连接上等待行动的秒数。 默认数值是28800,我把它改为7200。

注:参数的调整可以通过修改 /etc/my.cnf 文件并重启 MySQL 实现。这是一个比较谨慎的工作,上面的结果也仅仅是我的一些看法,你可以根据你自己主机的硬件情况(特别是内存大小)进一步修改。

mysql4.1中文解决方法

经过几天的翻阅文档和实验,终于找到了比较好的解决办法。
可以不需要修改my.ini。
在建立数据库的时候,对库和表的字符集设置不太重要,但是对文本类型的字段最好都设置为GBK字符集。
对于已有的数据库可以用以下方法转换字段编码:
ALTER TABLE t MODIFY hoverfly BINARY(100);
ALTER TABLE t MODIFY hoverfly CHAR(100) CHARACTER SET gbk;
注意用此方法如果不修改程序,会发现查询出的结果都是乱码,可以通过在my.ini的[mysqld]段内加default-character-set=gbk来纠正。但是这样你会发现那些没有转换编码的文本字段里的中文都是乱码。
其实有更简单的办法,在进行查询前,只要执行SET character_set_results = NULL就可以。而且这是不管是转换了的还是没转换的字段都不会出现乱码。而转换了的字段可以正常的对中文进行排序。

 
2008年04月01日 星期二 14:52

同时在线访问量继续增大 对于1G内存的服务器明显感觉到吃力严重时甚至每天都会死机 或者时不时的服务器卡一下 这个问题曾经困扰了我半个多月MySQL使用是很具伸缩性的算法,因此你通常能用很少的内存运行或给MySQL更多的被存以得到更好的性能。

安装好mysql后,配制文件应该在 /usr/local/mysql/share/mysql目录中,配制文件有几个,有my-huge.cnf my-medium.cnf my-large.cnf my-small.cnf,不同的流量的网站和不同配制的服务器环境,当然需要有不同的配制文件了。

一般的情况下,my-medium.cnf这个配制文件就能满足我们的大多需要; 一般我们会把配置文件拷贝到/etc/my.cnf 只需要修改这个配置文件就可以了,使用mysqladmin variables extended-status –u root –p 可以看到目前的参数,有3个配置参数是最重要的,即key_buffer_size,query_cache_size,table_cache。

key_buffer_size只对MyISAM表起作用,

key_buffer_size指定索引缓冲区的大小,它决定索引处理的速度,尤 其是索引读的速度。一般我们设为16M,实际上稍微大一点的站点  这个数字是远远不够的,通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size设置是否合理。 比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。 或者如果你装了phpmyadmin 可以通过服务器运行状态看到,笔者推荐用phpmyadmin管理mysql,以下的状态值都是本人通过phpmyadmin获得的实例分析:

这个服务器已经运行了20天

key_buffer_size – 128M 
key_read_requests – 650759289
key_reads - 79112

比例接近1:8000 健康状况非常好

另外一个估计key_buffer_size的办法 把你网站数据库的每个表的索引所占空间大小加起来看看以此服务器为例:比较大的几个表索引加起来大概125M 这个数字会随着表变大而变大。

从4.0.1开始,MySQL提供了查询缓冲机制。使用查询缓冲,MySQL将SELECT语句和查询结果存放在缓冲区中,今后对于同样的SELECT语句(区分大小写),将直接从缓冲区中读取结果。根据MySQL用户手册,使用查询缓冲最多可以达到238%的效率。

通过调节以下几个参数可以知道query_cache_size设置得是否合理

Qcache inserts 
Qcache hits
Qcache lowmem prunes
Qcache free blocks
Qcache total blocks

Qcache_lowmem_prunes的值非常大,则表明经常出现缓冲不够的 情况,同时Qcache_hits的值非常大,则表明查询缓冲使用 非常频繁,此时需要增加缓冲大小Qcache_hits的值不大,则表明你的查询重复率很低,这种情况下使用查询缓冲反而会影响效率,那么可以考虑不用查 询缓冲。此外,在SELECT语句中加入SQL_NO_CACHE可以明确表示不使用查询缓冲。

Qcache_free_blocks,如果该值非常大,则表明缓冲区中碎片很多query_cache_type指定是否使用查询缓冲

我设置:

query_cache_size = 32M 
query_cache_type= 1

得到如下状态值:

Qcache queries in cache 12737 表明目前缓存的条数 
Qcache inserts 20649006
Qcache hits 79060095  看来重复查询率还挺高的
Qcache lowmem prunes 617913 有这么多次出现缓存过低的情况
Qcache not cached 189896   
Qcache free memory 18573912  目前剩余缓存空间
Qcache free blocks 5328 这个数字似乎有点大 碎片不少
Qcache total blocks 30953

如果内存允许32M应该要往上加点

table_cache指定表高速缓存的大小。每当MySQL访问一个表时,如果 在表缓冲区中还有空间,该表就被打开并放入其中,这样可以更快地访 问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加table_cache的值。如果你发现 open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增加table_cache的值了(上述状 态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能 不稳定或者连接失败。

对于有1G内存的机器,推荐值是128-256。

笔者设置table_cache = 256

得到以下状态:

Open tables 256 
Opened tables 9046

虽然open_tables已经等于table_cache,但是相对于服务器运 行时间来说,已经运行了20天,opened_tables的值也 非常低。因此,增加table_cache的值应该用处不大。如果运行了6个小时就出现上述值 那就要考虑增大table_cache。

如果你不需要记录2进制log 就把这个功能关掉,注意关掉以后就不能恢复出问题前的数据了,需要您手动备份,二进制日志包含所有更新数据的语句,其目的是在恢复数据库时用它来把数据尽 可能恢复到最后的状态。另外,如果做同步复制( Replication )的话,也需要使用二进制日志传送修改情况。

log_bin指定日志文件,如果不提供文件名,MySQL将自己产生缺省文件 名。MySQL会在文件名后面自动添加数字引,每次启动服务时,都会 重新生成一个新的二进制文件。此外,使用log-bin-index可以指定索引文件;使用binlog-do-db可以指定记录的数据库;使用 binlog-ignore-db可以指定不记录的数据库。注意的是:binlog-do-db和binlog-ignore-db一次只指定一个数据 库,指定多个数据库需要多个语句。而且,MySQL会将所有的数据库名称改成小写,在指定数据库时必须全部使用小写名字,否则不会起作用。

关掉这个功能只需要在他前面加上#号

#log-bin

开启慢查询日志( slow query log ) 慢查询日志对于跟踪有问题的查询非常有用。它记录所有查过long_query_time的查询,如果需要,还可以记录不使用索引的记录。下面是一个慢查询日志的例子:

开启慢查询日志,需要设置参数log_slow_queries、long_query_times、log-queries-not-using-indexes。

log_slow_queries指定日志文件,如果不提供文件名,MySQL将 自己产生缺省文件名。long_query_times指定慢查询 的阈值,缺省是10秒。log-queries-not-using-indexes是4.1.0以后引入的参数,它指示记录不使用索引的查询。笔者设置 long_query_time=10

笔者设置:

sort_buffer_size = 1M 
max_connections=120
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
interactive_timeout=120
thread_concurrency = 4

参数说明:

back_log

要求MySQL能有的连接数量。当主要MySQL线程在一个很短时间内得到非常多 的连接请求,这就起作用,然后主线程花些时间(尽管很短)检查连接 并且启动一个新线程。back_log值指出在MySQL暂时停止回答新请求之前的短时间内多少个请求可以被存在堆栈中。只有如果期望在一个短时间内有很 多连接,你需要增加它,换句话说,这值对到来的TCP/IP连接的侦听队列的大小。你的操作系统在这个队列大小上有它自己的限制。 Unix listen(2)系统调用的手册页应该有更多的细节。检查你的OS文档找出这个变量的最大值。试图设定back_log高于你的操作系统的限制将是无效 的。

max_connections

并发连接数目最大,120 超过这个值就会自动恢复,出了问题能自动解决

thread_cache

没找到具体说明,不过设置为32后 20天才创建了400多个线程 而以前一天就创建了上千个线程 所以还是有用的

thread_concurrency

#设置为你的cpu数目x2,例如,只有一个cpu,那么thread_concurrency=2 
#有2个cpu,那么thread_concurrency=4
skip-innodb
#去掉innodb支持

代码:

# Example MySQL config file for medium systems. 
#
# This is for a system with little memory (32M - 64M) where MySQL plays
# an important part, or systems up to 128M where MySQL is used together with
# other programs (such as a web server)
#
# You can copy this file to
# /etc/my.cnf to set global options,
# mysql-data-dir/my.cnf to set server-specific options (in this
# installation this directory is /var/lib/mysql) or
# ~/.my.cnf to set user-specific options.
#
# In this file, you can use all long options that a program supports.
# If you want to know which options a program supports, run the program
# with the "--help" option.


# The following options will be passed to all MySQL clients
[client]
#password = your_password
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
# Here follows entries for some specific programs


# The MySQL server
[mysqld]
port = 3306
socket = /tmp/mysql.sock
#socket = /var/lib/mysql/mysql.sock
skip-locking
key_buffer = 128M
max_allowed_packet = 1M
table_cache = 256
sort_buffer_size = 1M
net_buffer_length = 16K
myisam_sort_buffer_size = 1M
max_connections=120
#addnew config
wait_timeout =120
back_log=100
read_buffer_size = 1M
thread_cache=32
skip-innodb
skip-bdb
skip-name-resolve
join_buffer_size=512k
query_cache_size = 32M
interactive_timeout=120
long_query_time=10
log_slow_queries= /usr/local/mysql4/logs/slow_query.log
query_cache_type= 1
# Try number of CPU's*2 for thread_concurrency
thread_concurrency = 4


#end new config
# Don't listen on a TCP/IP port at all. This can be a security enhancement,
# if all processes that need to connect to mysqld run on the same host.
# All interaction with mysqld must be made via Unix sockets or named pipes.
# Note that using this option without enabling named pipes on Windows
# (via the "enable-named-pipe" option) will render mysqld useless!
#
#skip-networking


# Replication Master Server (default)
# binary logging is required for replication
#log-bin


# required unique id between 1 and 2^32 - 1
# defaults to 1 if master-host is not set
# but will not function as a master if omitted
server-id = 1


# Replication Slave (comment out master section to use this)
#
# To configure this host as a replication slave, you can choose between
# two methods :
#
# 1) Use the CHANGE MASTER TO command (fully described in our manual) -
# the syntax is:
#
# CHANGE MASTER TO MASTER_HOST=, MASTER_PORT=,
# MASTER_USER=, MASTER_PASSWORD= ;
#
# where you replace , , by quoted strings and
# by the master's port number (3306 by default).
#
# Example:
#
# CHANGE MASTER TO MASTER_HOST='125.564.12.1', MASTER_PORT=3306,
# MASTER_USER='joe', MASTER_PASSWORD='secret';
#
# OR
#
# 2) Set the variables below. However, in case you choose this method, then
# start replication for the first time (even unsuccessfully, for example
# if you mistyped the password in master-password and the slave fails to
# connect), the slave will create a master.info file, and any later
# change in this file to the variables' values below will be ignored and
# overridden by the content of the master.info file, unless you shutdown
# the slave server, delete master.info and restart the slaver server.
# For that reason, you may want to leave the lines below untouched
# (commented) and instead use CHANGE MASTER TO (see above)
#
# required unique id between 2 and 2^32 - 1
# (and different from the master)
# defaults to 2 if master-host is set
# but will not function as a slave if omitted
#server-id = 2
#
# The replication master for this slave - required
#master-host =
#
# The username the slave will use for authentication when connecting
# to the master - required
#master-user =
#
# The password the slave will authenticate with when connecting to
# the master - required
#master-password =
#
# The port the master is listening on.
# optional - defaults to 3306
#master-port =
#
# binary logging - not required for slaves, but recommended
#log-bin


# Point the following paths to different dedicated disks
#tmpdir = /tmp/
#log-update = /path-to-dedicated-directory/hostname


# Uncomment the following if you are using BDB tables
#bdb_cache_size = 4M
#bdb_max_lock = 10000


# Uncomment the following if you are using InnoDB tables
#innodb_data_home_dir = /var/lib/mysql/
#innodb_data_file_path = ibdata1:10M:autoextend
#innodb_log_group_home_dir = /var/lib/mysql/
#innodb_log_arch_dir = /var/lib/mysql/
# You can set .._buffer_pool_size up to 50 - 80 %
# of RAM but beware of setting memory usage too high
#innodb_buffer_pool_size = 16M
#innodb_additional_mem_pool_size = 2M
# Set .._log_file_size to 25 % of buffer pool size
#innodb_log_file_size = 5M
#innodb_log_buffer_size = 8M
#innodb_flush_log_at_trx_commit = 1
#innodb_lock_wait_timeout = 50


[mysqldump]
quick
max_allowed_packet = 16M


[mysql]
no-auto-rehash
# Remove the next comment character if you are not familiar with SQL
#safe-updates


[isamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M


[myisamchk]
key_buffer = 20M
sort_buffer_size = 20M
read_buffer = 2M
write_buffer = 2M


[mysqlhotcopy]
interactive-timeout

补充

优化table_cachetable_cache指定表高速缓存的大小。每当 MySQL访问一个表时,如果在表缓冲区中还有空间,该表就被打开并 放入其中,这样可以更快地访问表内容。通过检查峰值时间的状态值Open_tables和Opened_tables,可以决定是否需要增加 table_cache的值。如果你发现open_tables等于table_cache,并且opened_tables在不断增长,那么你就需要增 加table_cache的值了(上述状态值可以使用SHOW STATUS LIKE ‘Open%tables’获得)。注意,不能盲目地把table_cache设置成很大的值。如果设置得太高,可能会造成文件描述符不足,从而造成性能 不稳定或者连接失败。对于有1G内存的机器,推荐值是128-256。

案例1:该案例来自一个不是特别繁忙的服务器table_cache – 512open_tables – 103opened_tables – 1273uptime – 4021421 (measured in seconds)该案例中table_cache似乎设置得太高了。在峰值时间,打开表的数目比table_cache要少得多。

案例2:该案例来自一台开发服务器。table_cache – 64open_tables – 64opened-tables – 431uptime – 1662790 (measured in seconds)虽然open_tables已经等于table_cache,但是相对于服务器运行时间来说,opened_tables的值也非常低。 因此,增加table_cache的值应该用处不大。案例3:该案例来自一个upderperforming的服务器table_cache – 64open_tables – 64opened_tables – 22423uptime – 19538该案例中table_cache设置得太低了。虽然运行时间不到6小时,open_tables达到了最大值,opened_tables的值 也非常高。这样就需要增加table_cache的值。优化key_buffer_sizekey_buffer_size指定索引缓冲区的大小,它决定 索引处理的速度,尤其是索引读的速度。通过检查状态值Key_read_requests和Key_reads,可以知道key_buffer_size 设置是否合理。比例key_reads / key_read_requests应该尽可能的低,至少是1:100,1:1000更好(上述状态值可以使用SHOW STATUS LIKE ‘key_read%’获得)。key_buffer_size只对MyISAM表起作用。即使你不使用MyISAM表,但是内部的临时磁盘表是 MyISAM表,也要使用该值。可以使用检查状态值created_tmp_disk_tables得知详情。对于1G内存的机器,如果不使用 MyISAM表,推荐值是16M(8-64M)。

案例1:健康状况key_buffer_size – 402649088 (384M)key_read_requests – 597579931key_reads - 56188案例2:警报状态key_buffer_size – 16777216 (16M)key_read_requests – 597579931key_reads - 53832731案例1中比例低于1:10000,是健康的情况;案例2中比例达到1:11,警报已经拉响。

 
2007年09月05日 星期三 16:18
一个正则表达式就是由普通字符(例如字符 a 到 z)以及特殊字符(称为元字符)组成的文字模式。该模式描述在查找文字主体时待匹配的一个或多个字符串。正则表达式作为一个模板,将某个字符模式与所搜索的字符串进行匹配。如:
JScript VBScript 匹配
/^\[ \t]*$/ "^\[ \t]*$" 匹配一个空白行。
/\d{2}-\d{5}/ "\d{2}-\d{5}" 验证一个ID 号码是否由一个2位数字,一个连字符以及一个5位数字组成。
/<(.*)>.*<\/\1>/ "<(.*)>.*<\/\1>" 匹配一个 HTML 标记。

下表是元字符及其在正则表达式上下文中的行为的一个完整列表:
字符 描述
\ 将下一个字符标记为一个特殊字符、或一个原义字符、或一个 向后引用、或一个八进制转义符。例如,'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} mn 均为非负整数,其中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 匹配 xy。例如,'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 的向后引用。如果前面的条件都不满足,若 nm 均为八进制数字 (0-7),则 \nm 将匹配八进制转义值 nm
\nml 如果 n 为八进制数字 (0-3),且 ml 均为八进制数字 (0-7),则匹配八进制转义值 nml。
\un 匹配 n,其中 n 是一个用四个十六进制数字表示的 Unicode 字符。例如, \u00A9 匹配版权符号 (©)。


下面看几个例子:
"^The":表示所有以"The"开始的字符串("There","The cat"等);
"of despair$":表示所以以"of despair"结尾的字符串;
"^abc$":表示开始和结尾都是"abc"的字符串——呵呵,只有"abc"自己了;
"notice":表示任何包含"notice"的字符串。

'*','+'和'?'这三个符号,表示一个或一序列字符重复出现的次数。它们分别表示“没有或
更多”,“一次或更多”还有“没有或一次”。下面是几个例子:

"ab*":表示一个字符串有一个a后面跟着零个或若干个b。("a", "ab", "abbb",……);
"ab+":表示一个字符串有一个a后面跟着至少一个b或者更多;
"ab?":表示一个字符串有一个a后面跟着零个或者一个b;
"a?b+$":表示在字符串的末尾有零个或一个a跟着一个或几个b。

也可以使用范围,用大括号括起,用以表示重复次数的范围。

"ab{2}":表示一个字符串有一个a跟着2个b("abb");
"ab{2,}":表示一个字符串有一个a跟着至少2个b;
"ab{3,5}":表示一个字符串有一个a跟着3到5个b。

请注意,你必须指定范围的下限(如:"{0,2}"而不是"{,2}")。还有,你可能注意到了,'*','+'和
'?'相当于"{0,}","{1,}"和"{0,1}"。
还有一个'¦',表示“或”操作:

"hi¦hello":表示一个字符串里有"hi"或者"hello";
"(b¦cd)ef":表示"bef"或"cdef";
"(a¦b)*c":表示一串"a""b"混合的字符串后面跟一个"c";

'.'可以替代任何字符:

"a.[0-9]":表示一个字符串有一个"a"后面跟着一个任意字符和一个数字;
"^.{3}$":表示有任意三个字符的字符串(长度为3个字符);

方括号表示某些字符允许在一个字符串中的某一特定位置出现:

"[ab]":表示一个字符串有一个"a"或"b"(相当于"a¦b");
"[a-d]":表示一个字符串包含小写的'a'到'd'中的一个(相当于"a¦b¦c¦d"或者"[abcd]");
"^[a-zA-Z]":表示一个以字母开头的字符串;
"[0-9]%":表示一个百分号前有一位的数字;
",[a-zA-Z0-9]$":表示一个字符串以一个逗号后面跟着一个字母或数字结束。

你也可以在方括号里用'^'表示不希望出现的字符,'^'应在方括号里的第一位。(如:"%[^a-zA-Z]%"表
示两个百分号中不应该出现字母)。

为了逐字表达,必须在"^.$()¦*+?{\"这些字符前加上转移字符'\'。

请注意在方括号中,不需要转义字符。

 
2007年09月04日 星期二 17:18
一、换零钱
哥哥结婚叫我去换50张20的rmb发小红包用。
拿了1k去银行换,sb态度极其不好的说“没有,不能换给你”
态度实在恶劣啊。我十分凶恶的反问“你再说一次”家伙很牛的说“就是没有”
我说“你=着”sb说“你威胁我啊”
我拿了身份证说“开户,存1k”.
结束了,我说“再提20”连着提了二次20。
sb说“侬萨意思啊?”
“cn闹钞票,闹50趟再销户不来三啊”
sb灰溜溜的换了50张擦刮里新额20元白我,贱!!!


二、为什么叫建行
刚刚去医院旁边的贱行取钱,门口的取款机人很多,大家都在排队晒太阳.
但是奇怪的是里面的营业厅却只有一个顾客.,
于是我走到一个窗口,对那个长的人模狗样的职员说取800块。
那个人竟然说到外面的取款机取,我问他为什么卡不能在柜台上取?
他说5000以下都到取款机上取,说这是为了节约时间,提高效率、分流,我当时就傻

了,分流?
我问他,现在外面的取款机排队排的老长,这里面一个人都没有,这节约的什么效
率?
有哪个文件规定5000以下的不能在柜台取?其它的银行都可以!
那个狗东西说是贱行的文件,我说拿给我看!他拿不出来,反正就是不给取。
我看着外面在排队晒太阳的人,再看看里面看报纸吹空调的贱人,气不打一处来,于

是我决定整一整他。
我说好,那就取5000!等他办完了,把5000给我了,我拿了一百,说存100!
取款机上不能存钱,所以他办了。等他办完这100块,我再拿了100块,说存100!
那个狗东西说你不能一次存完么?
我说我给我自己发的文件规定了,一次只能存100,怎样,不行么?我就一次存100
,一
次存100.
慢慢的周围围了很多支持者,大家都说干的好!
旁边马上有人也和我一样干了起来。
最后他们的领导出来了,很嚣张的说:你们扰乱金融次序,我报警。.
我说我是存钱啊,银行不就是存钱的地方么? 你有文件规定了一次不能存一百?拿给

看!
旁边的很多人都支持我,大声的指责他们。
最后那个什么领导说对不起,我们以后一定会改进工作方法。给大家方便,等等
等.......
我转身走的时候,对他说,我现在知道为什么你们是建行了,因为你很贱!


三、招行假币
前2天我去招行拿钱(替公司取的),结果点抄时发现有张假的100元,因为自己是学财

会专业的加上公司以前发生案例(从银行取好钱发的工资,有人发现有假抄),所以

自己特别注意。之后,我对柜台小姐说:小姐,你这张钱有问题。
小姐:什么问题?
我说:假的
小姐:不可能,你离开过柜台了。
我当时就火了:你眼睛有问题啊?你哪只眼睛看我离开过柜台啦?
于是我和她便起了争执,态度可恶劣啦,好象是我故意把钱换似的,对我言辞犀利~
我说:你们的验抄机难道有问题啊?假抄过去都不报警的啊?这样好了,我们报警处

理~不是说发现假币打110么~!
这时银行已经吵的沸沸扬扬了~银行行长出来了~事情还没问清楚~第一时间甩给了我

句话:你离开柜台了伐?离开柜台就不能证明这假抄是我们这发出来的!
我*!我当时就觉得可笑:他是出来解决问题的吗?2话不说就把责任推干净了撒~"
我说:我有没有离开过柜台,我说的不算~这样我们调监控录象出来看~要不我就报警

处理,你们自己看怎么办吧~
这个时候银行行长开始有点"软"了下来,态度也改善了不少,还面带微笑的对我说:

那您看怎么个解决方法呢?您提个方案。
我当时也是气了有点晕晕滴,想也没想:1罚10!冲口而出~
银行行长:1赔10呢,不太可能,要不这样吧,打个对折怎么样?我想了想算了~
结果最后就取了钱对着行长和那个柜台小姐说:你们以后最好记住这张脸,不要玩什

么"花样"(很多银行有违规操作,经常把假币发出来,多数都为数字比较大的帐目上

不容易发现。
最后行长笑嘻嘻的把我迎出了门~


四、农行的VIP
从几个月前开始,呼和浩特农行搞个VIP窗口,只办理5W元以上的业务。有一次我想

1W块钱,小额窗口的队排的超长,VIP窗口空着,我就去VIP窗口办,工作人员问我取

多少,我说取1W,她直接说,5W以下的业务去小额窗口排队。我就说,那我取6W,她

说,6W可以,给我提出6W现金之后,我取了一W,把剩下的5W又塞回去,说:给我存
5W.工作人员直接晕倒。


五、全部提现
还有一次在某工行,甲方一笔140W的拔款到账之后,我去工行办款。因为没有工行
卡,我就打算办张卡把钱转存上去,结果工作人员居然说,办卡要复印身份证,他们

的复印机坏了,要我自己去复印。我暴怒,说,算了,不存了,140W全部提现!今天

晚上你们报计划吧,明天我来取!银行的业务部主任当时脸色就变了,然后,一个小

姑娘满脸笑容的说:您把身份证拿来,我去给您复印,您稍等一会儿。。。嗯,当时

感觉心理就平衡了。。。

看着解气要顶顶
 
2007年09月04日 星期二 16:03
公司的玩具






 
2007年09月04日 星期二 15:55
天津滨海浴场~~







 
2007年08月16日 星期四 14:18
SET GLOBAL SQL_SLAVE_SKIP_COUNTER = N 

This statement skips the next N events from the master. This is useful for recovering from replication stops caused by a statement.

This statement is valid only when the slave thread is not running. Otherwise, it produces an error.

 
2007年08月08日 星期三 14:11

Debian默认设置下是开反向域名解析的。我们连接ssh/ftp的时候就会有一个比较明显的延时,大概要等30秒后才能输入账号密码。解决方法有两个:

1. 将客户机IP和域名对应关系加入到 /etc/hosts上

2. 编辑 /etc/nsswitch.conf

找到 hosts 那行,将其改成下面这样:

hosts:          files dns [NOTFOUND=return]

 
2007年08月08日 星期三 11:19
错误的图标:
正确的图标:
哈哈,批评一下。
 
2007年07月26日 星期四 12:34
以前在群里讨论过这个问题,比较的有意思.mysql的语法真好玩.他们原来都想用PHP的实现随机,但取出多条好像要进行两次以上查询.翻了手册,找到了下面这个语句,可以完成任务了。

SELECT * FROM table_name ORDER BY rand() LIMIT 5;

  rand在手册里是这么说的:

  RAND() ,RAND(N) :返回在范围0到1.0内的随机浮点值。如果一个整数参数N被指定,它被用作种子值。

  mysql> select RAND();  -> 0.5925  mysql> select RAND(20);  -> 0.1811  mysql> select RAND(20);  -> 0.1811  mysql> select RAND();  -> 0.2079  mysql> select RAND();  -> 0.7888

  你不能在一个ORDER BY子句用RAND()值使用列,因为ORDER BY将重复计算列多次。然而在MySQL3.23中,你可以做:

SELECT * FROM table_name ORDER BY RAND(),这是有利于得到一个来自SELECT * FROM table1,table2 WHERE a=b AND c 

  但我试了一下,8千条记录的表,执行一次需要0.08 sec,.慢了些

  
后来请教了google,得到如下代码

   SELECT *  FROM table_name AS r1 JOIN  (SELECT ROUND(RAND() *  (SELECT MAX(id)  FROM table_name)) AS id)  AS r2  WHERE r1.id >= r2.id  ORDER BY r1.id ASC  LIMIT 5;

    执行效率需要0.02 sec.可惜的是,只有mysql 4.1.*以上才支持这样的子查询.

 
2007年07月25日 星期三 12:47
关闭讨厌的beep声音

HowTo: Turn off (mute) system beep

For anyone with a laptop who works in a library or other quiet area, system beeps every time you press the backspace key one too many times, or just using emacs, can be quite disturbing.

To shut them off: open an xterm or terminal, and enter the two lines
file.pngCode:

xset b off xset b 0 0 0


To remove the PC speaker driver until the system is rebooted, execute this command as root:
file.pngCode:

modprobe -r pcspkr

This also disables the PC speaker in programs like Firefox.

To load it back, just type: (as root)
file.pngCode:

modprobe pcspkr


To permanently disable the PC speaker even after reboots, add this to /etc/rc.local before the last line (exit 0):
file.pngCode:

modprobe -r pcspkr


Alternately, black-list the module in /etc/modprobe.d/blacklist. This one also works for Dapper.
file.pngCode:

blacklist pcspkr
 
2007年06月10日 星期日 19:57
今天听了一首很老的歌,以前也一直听,但是突然间看到了歌词,我却惊呆了,一直没有注意歌词的含义,让我感动了半天,有点意思,贴出来大家欣赏一下。
    她来听我的演唱会

曲:梁文福词:黄中原编:黄中原
她来听我的演唱会
在十七岁的初恋第一次约会
男孩为了她彻夜排队
半年的积蓄买了门票一对
他唱得我心醉他唱得我心碎
三年的感情一封信就要收回
她记得月台汽笛声声在催
播我的歌陪着他们流泪
嘿陪他们流泪
她来听我的演唱会
在二十五岁恋爱是风光明媚
男朋友背着她送人玫瑰
她不听电话夜夜听歌不睡
他唱得我心醉他唱得我心碎
成年人分手后都像无所谓
和朋友一起买醉卡拉ok
唱我的歌陪着画面流泪
嘿陪着流眼泪
他唱得我心醉他唱得我心碎
在三十三岁真爱那么珍贵
年轻的女孩求她让一让位
让男人决定跟谁远走高飞
嘿谁在远走高飞
他唱得我心醉他唱得我心碎
我努力不让自己看来很累
岁月在听我们唱无怨无悔
在掌声里唱到自己流泪
嘿唱到自己流泪
她来听我的演唱会
在四十岁后听歌的女人很美
小孩在问我为什么流泪
身边的男人早已深深入睡
她静静听着
我们的演唱会
 
     
 
 
订阅
 
 
     
 
个人档案
 
streamlet_wang

上次登录:
5月26日
加为好友
 
   
 
最新照片
 
   
 
最近访客
 
 

kevinchenkai

左扬

twzer0

iapache

jaspon

larry

天堂路过地域

theallz
     
 
其它
 
已有人次访问本空间
 
订阅RSS  什么是RSS?

您也想拥有这样的空间?请点此申请。
     


©2008 Baidu