Archive for 一月, 2008

控件 input高级用法(转载)

Posted by 机器人 on 30th 一月 2008 in php/javascript

1.取消按钮按下时的虚线框

在input里添加属性值 hideFocus 或者 HideFocus=true

2.只读文本框内容

在input里添加属性值 readonly

3.防止退后清空的TEXT文档(可把style内容做做为类引用)

<INPUT style=behavior:url(#default#savehistory); type=text id=oPersistInput>

4.ENTER键可以让光标移到下一个输入框

<input onkeydown="if(event.keyCode==13)event.keyCode=9" >

5.只能为中文(有闪动)

<input onkeyup="value=value.replace(/[ -~]/g,’’)" onkeydown="if(event.keyCode==13)event.keyCode=9">

6.只能为数字(有闪动)

<input onkeyup="value=value.replace(/[^\d]/g,’’) "onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))">

7.只能为数字(无闪动)

<input style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9" onKeyPress="if ((event.keyCode<48 || event.keyCode>57)) event.returnValue=false">

8.只能输入英文和数字(有闪动)

<input onkeyup="value=value.replace(/[\W]/g,’’)" onbeforepaste="clipboardData.setData(’text’,clipboardData.getData(’text’).replace(/[^\d]/g,’’))">

9.屏蔽输入法

<input type="text" name="url" style="ime-mode:disabled" onkeydown="if(event.keyCode==13)event.keyCode=9">

10. 只能输入 数字,小数点,减号(-) 字符(无闪动)

<input onKeyPress="if (event.keyCode!=46 && event.keyCode!=45 && (event.keyCode<48 || event.keyCode>57)) event.returnValue=false">

11. 只能输入两位小数,三位小数(有闪动)

<input maxlength=9 onkeyup="if(value.match(/^\d{3}$/))value=value.replace(value,parseInt(value/10)) ;value=value.replace(/\.\d*\./g,’.’)" onKeyPress="if((event.keyCode<48 || event.keyCode>57) && event.keyCode!=46 && event.keyCode!=45 || value.match(/^\d{3}$/) || /\.\d{3}$/.test(value)) {event.returnValue=false}" id=text_kfxe name=text_kfxe>

————————————————————————

<input type="text" name="input1" value="中国">

怎样使input中的内容为只读,也就是说不让用户更改里面的内容。

<input type="text" name="input1" value="中国" onfocus=this.blur()>

<input type="text" name="input1" value="中国" readonly>

<input type="text" name="input1" value="中国" disabled>

最好不要用disabled,不然就无法取出里面的值了.

<input type="text" name="input1" value="中国" readonly="true">

<input type="text" name="input1" value="中国" readonly style="color:#999 ;">

机器人 2008-1-30 整理于 北京

bbs_server_install.txt

Posted by 机器人 on 23rd 一月 2008 in php/javascript

1、系统安装

        最小化安装

2、安装额外的软件包:

        lynx-2.8.5-18.2

        unixODBC-devel-2.2.11-1.RHEL4.1

        unixODBC-2.2.11-1.RHEL4.1

        flex-2.5.4a-33

        bison-1.875c-2

        gd-progs-2.0.28-5.4E

        libjpeg-devel-6b-33

        freetype-devel-2.1.9-6.el4

        MySQL-devel-community-5.0.45-0.rhel4

        MySQL-shared-community-5.0.45-0.rhel4

        MySQL-server-community-5.0.45-0.rhel4

        MySQL-client-community-5.0.45-0.rhel4

        perl-DBI-1.40-8

        zlib-devel-1.2.1.2-1.2

        libpng-devel-1.2.7-3.el4_5.1

        gd-devel-2.0.28-5.4E

        gd-2.0.28-5.4E

        glibc-devel-2.3.4-2.39

        gcc-3.4.6-9

        glibc-kernheaders-2.4-9.1.100.EL

        glibc-headers-2.3.4-2.39

        cpp-3.4.6-9

        ZendOptimizer-3.3.0a-linux-glibc23

3、安装Apache-2.2.6

    3.1 download:

        http://www.apache.org/

    3.2 编译安装:

        # tar zxvf httpd-2.2.6.tar.gz

        #  cd httpd-2.2.6/

        # ./configure                 \

        –prefix=/usr/local/apache     \

        –enable-so                     \

        –with-mpm=worker             \

        –enable-dav-fs                 \

        –enable-dav-lock             \

        –enable-dav –enable-proxy     \

        –enable-proxy-http             \

        –enable-proxy-ajp             \

        –enable-rewrite                 \

        –enable-cache                 \

        –enable-disk-cache             \

        –enable-mem-cache             \

        –enable-proxy-balancer       

        …..

        # make

        # make install

4、安装PHP:

    4.1 download:

        http://www.php.net

    4.2 解压缩:

       

        # tar zxvf php-5.2.5.tar.gz

 

    4.3 编译安装:

       

        # cd php-5.2.5/

        # ./configure                                   \

        –prefix=/usr/local/php                         \

        –with-apxs2=/usr/local/apache/bin/apxs         \

        –enable-safe-mode                             \

        –with-mysql                                 \

        –with-pdo-mysql                             \

        –with-unixODBC=/usr                         \

        –with-gd                                     \

        –with-jpeg-dir=/usr                             \

        –with-png-dir=/usr -                            \

        –without-pear                                 \

        –with-freetype-dir                            \

        –enable-gd-native-ttf

       

        ……

        # make

        # make install

        # cp php-ini-dest /usr/local/php/lib/php.ini

5、配置apache

    参见下列文件(/usr/local/apache/conf/目录下)

    httpd.conf

    extra/*

  362  cd /mnt/win/

  363  ls

  364  cd www

  365  ls

  366  cd ../

  367  ls -l

  368  cd www

  369  ls -l

  370  exit

  371  ls

  372  top

  373  exit

  374  exit

  375  ls

  376  ls -l

  377  ls

  378  cd /mnt/

  379  ls

  380  cd win/

  381  ls

  382  ls

  383  cd www/

  384  ls

  385  cd bbs

  386  ls

  387  more index.php

  388  ls

  389  cd ..

  390  ls

  391  rpm -qa | grep zend

  392  rpm -qa | grep optimi

  393  ls

  394  mysql

  395  ps -ef

  396  ps -ef| grep mysql

  397  rpm -qa|grep mysql

  398  ls

  399  cd ..

  400  ls

  401  cd /etc/httpd/conf

  402  ls

  403  vi httpd.conf

  404  ls

  405  cd ..

  406  ls

  407  ls

  408  cd /mnt/win/

  409  ls

  410  ls -lh

  411  ls -l

  412  cd www/

  413  ls

  414  ls -lh

  415  du -sh

  416  cd ..

  417  ls

  418  tar cvf www.20080117.tar www/

  419  ls

  420  ls -lh

  421  scp www.20080117.tar 211.154.164.99:/usr/local/apache/htdocs/

  422  ls

  423  ls -l

  424  ls

  425  cd ..

  426  ls

  427  ls

  428  cd /etc/httpd/

  429  ls

  430  ls

  431  pwd

  432  ls

  433  cd conf

  434  ls

  435  vi httpd.conf

  436  ps -ef

  437  history |more

  438  crontab -l

  439  pwd

  440  ls

  441  vi httpd.conf

  442  ls

  443  cd /usr/local/

  444  ls

  445  cd Zend/

  446  ls

  447  cd bin

  448  ls

  449  cd ..

  450  ls

  451  cd etc/

  452  ls

  453  more php.ini

  454  ls

  455  cd ..

  456  ls

  457  cd ..

  458  ls

  459  cd apache/

  460  ls

  461  pwd

  462  cd /etc/httpd/

  463  ls

  464  cd conf

  465  ls

  466  vi httpd.conf

  467  mysql -u root -p

  468  mysqldump  -u root -p zb > zb.sql

  469  ls

  470  scp zb.sql 211.154.164.99:/root/

  471  ls

  472  ls

  473  ps -ef

  474  ps -fe

  475  top

  476  ls

  477  ps -ef

  478  ls

  479  exit

  480  top

  481  exit

  482  top

  483  exit

  484  top

  485  history

    1  ls

    2  pwd

    3  ls

    4  cd ..

    5  ls

    6  pwd

    7  ls

    8  cd ..

    9  ls

   10  cd ..

   11  ls

   12  ls

   13  cd ..

   14  ls

   15  cd ..

   16  ls

   17  df -h

   18  cd /var/log/

   19  ls

   20  more lastlog

   21  ls

   22  more messages

   23  ntsysv

   24  ls

   25  ps -ef

   26  top

   27  ps -ef

   28  ls

   29  exit

   30  /usr/local/apache/bin/apachectl stop

   31  pwd

   32  ps -ef

   33  ps -ef

   34  ls

   35  cd /etc/

   36  ls

   37  vi inittab

   38  ls

   39  cd selinux/

   40  ls

   41  vi config

   42  ps -ef

   43  pwd

   44  iptables -L

   45  ls

   46  cd ..

   47  ls

   48  ps -ef

   49  ulimit -a

   50  pwd

   51  cd /usr/local/apache/conf/extra/

   52  ls

   53  vi httpd-mpm.conf

   54  ../../bin/apachectl -t

   55  ../../bin/apachectl start

   56  ps ef-

   57  ps -ef

   58  ps -ef

   59  ps -ef

   60  ls

   61  vi httpd-mpm.conf

   62  ../../bin/apachectl restart

   63  ps -ef

   64  ls

   65  ls

   66  vi httpd-mpm.conf

   67  ls

   68  cp httpd-mpm.conf httpd-mpm.conf.bak

   69  vi httpd-mpm.conf

   70  ls

   71  ../../bin/apachectl restart

   72  ps -ef

   73  ls

   74  ls

   75  vi httpd-vhosts.conf

   76  ls

   77  vi httpd-dav.conf

   78  ps -ef

   79  ../../bin/apachectl restart

   80  ps -ef

   81  ps -ef

   82  ps -ef

   83  top

   84  uptime

   85  uptime

   86  ls

   87  ps -ef

   88  service sendmail stop

   89  chkconfig sendmail off

   90  ls

   91  cd ..

   92  ls

   93  vi httpd.conf

   94  ls

   95  cd extra/

   96  ls

   97  vi httpd-autoindex.conf

   98  ls

   99  vi httpd-default.conf

  100  ls

  101  vi httpd-info.conf

  102  l

  103  ../../bin/apachectl -h

  104  ../../bin/apachectl status

  105  ls

  106  cd ..

  107  ls

  108  cd  ..

  109  ls

  110  cd bin

  111  ls

  112  ./apachectl status

  113  cd /usr/local/tswc_file/tech/disk/CentOS/RPMS/

  114  rpm -ivh lynx-2.8.5-18.2.x86_64.rpm

  115  /usr/local/apache/bin/apachectl status

  116  /usr/local/apache/bin/apachectl status

  117  ls

  118  cd ..

  119  ls

  120  cd /usr/local/apache/conf/

  121  ls

  122  vi httpd.conf

  123  /usr/local/apache/bin/apachectl restart

  124  /usr/local/apache/bin/apachectl status

  125  ls

  126  cd extra/

  127  ls

  128  vi httpd-info.conf

  129  /usr/local/apache/bin/apachectl status

  130  /usr/local/apache/bin/apachectl restart

  131  /usr/local/apache/bin/apachectl status

  132  /usr/local/apache/bin/apachectl status |more

  133  /usr/local/apache/bin/apachectl status |more

  134  /usr/local/apache/bin/apachectl status |more

  135  /usr/local/apache/bin/apachectl status |more

  136  /usr/local/apache/bin/apachectl status |more

  137  exit

  138  /usr/local/apache/bin/apachectl stop

  139  ps -ef

  140  exit

  141  mysql

  142  cd /usr/local/

  143  ls

  144  cd php

  145  ls

  146  cd bin

  147  ls

  148  php

  149  ./php

  150  cd ../

  151  ls

  152  cd ../

  153  cd apache/

  154  ls

  155  cd conf/

  156  ls

  157  cd httpd.conf

  158  cd ../

  159  ls

  160  cd cgi-bin/

  161  ls

  162  vi test-cgi

  163  sz

  164  sr

  165  exit

  166  history

1  ls

    2  pwd

    3  ls

    4  cd ..

    5  ls

    6  pwd

    7  ls

    8  cd ..

    9  ls

   10  cd ..

   11  ls

   12  ls

   13  cd ..

   14  ls

   15  cd ..

   16  ls

   17  df -h

   18  cd /var/log/

   19  ls

   20  more lastlog

   21  ls

   22  more messages

   23  ntsysv

   24  ls

   25  ps -ef

   26  top

   27  ps -ef

   28  ls

   29  exit

   30  /usr/local/apache/bin/apachectl stop

   31  pwd

   32  ps -ef

   33  ps -ef

   34  ls

   35  cd /etc/

   36  ls

   37  vi inittab

   38  ls

   39  cd selinux/

   40  ls

   41  vi config

   42  ps -ef

   43  pwd

   44  iptables -L

   45  ls

   46  cd ..

   47  ls

   48  ps -ef

   49  ulimit -a

   50  pwd

   51  cd /usr/local/apache/conf/extra/

   52  ls

   53  vi httpd-mpm.conf

   54  ../../bin/apachectl -t

   55  ../../bin/apachectl start

   56  ps ef-

   57  ps -ef

   58  ps -ef

   59  ps -ef

   60  ls

   61  vi httpd-mpm.conf

   62  ../../bin/apachectl restart

   63  ps -ef

   64  ls

   65  ls

   66  vi httpd-mpm.conf

   67  ls

   68  cp httpd-mpm.conf httpd-mpm.conf.bak

   69  vi httpd-mpm.conf

   70  ls

   71  ../../bin/apachectl restart

   72  ps -ef

   73  ls

   74  ls

   75  vi httpd-vhosts.conf

   76  ls

   77  vi httpd-dav.conf

   78  ps -ef

   79  ../../bin/apachectl restart

   80  ps -ef

   81  ps -ef

   82  ps -ef

   83  top

   84  uptime

   85  uptime

   86  ls

   87  ps -ef

   88  service sendmail stop

   89  chkconfig sendmail off

   90  ls

   91  cd ..

   92  ls

   93  vi httpd.conf

   94  ls

   95  cd extra/

   96  ls

   97  vi httpd-autoindex.conf

   98  ls

   99  vi httpd-default.conf

  100  ls

  101  vi httpd-info.conf

  102  l

  103  ../../bin/apachectl -h

  104  ../../bin/apachectl status

  105  ls

  106  cd ..

  107  ls

  108  cd  ..

  109  ls

  110  cd bin

  111  ls

  112  ./apachectl status

  113  cd /usr/local/tswc_file/tech/disk/CentOS/RPMS/

  114  rpm -ivh lynx-2.8.5-18.2.x86_64.rpm

  115  /usr/local/apache/bin/apachectl status

  116  /usr/local/apache/bin/apachectl status

  117  ls

  118  cd ..

  119  ls

  120  cd /usr/local/apache/conf/

  121  ls

  122  vi httpd.conf

  123  /usr/local/apache/bin/apachectl restart

  124  /usr/local/apache/bin/apachectl status

  125  ls

  126  cd extra/

  127  ls

  128  vi httpd-info.conf

  129  /usr/local/apache/bin/apachectl status

  130  /usr/local/apache/bin/apachectl restart

  131  /usr/local/apache/bin/apachectl status

  132  /usr/local/apache/bin/apachectl status |more

  133  /usr/local/apache/bin/apachectl status |more

  134  /usr/local/apache/bin/apachectl status |more

  135  /usr/local/apache/bin/apachectl status |more

  136  /usr/local/apache/bin/apachectl status |more

  137  exit

  138  /usr/local/apache/bin/apachectl stop

  139  ps -ef

  140  exit

  141  mysql

  142  cd /usr/local/

  143  ls

  144  cd php

  145  ls

  146  cd bin

  147  ls

  148  php

  149  ./php

  150  cd ../

  151  ls

  152  cd ../

  153  cd apache/

  154  ls

  155  cd conf/

  156  ls

  157  cd httpd.conf

  158  cd ../

  159  ls

  160  cd cgi-bin/

  161  ls

  162  vi test-cgi

  163  sz

  164  sr

  165  exit

  166  history

  167  top

  168  ps -ef

  169  exit

  170  exit

  171  ls

  172  rm log.tar.gz

  173  top

  174  cd /usr/local/

  175  ls

  176  cd zend

  177  cdzend

  178  cd zend

  179  ls

  180  cd Z

  181  cd Zend/

  182  ls

  183  cd bin

  184  ls

  185  exit

  186  cd /usr/local/apache/

  187  ls

  188  cd conf/

  189  tail

  190  more httpd.conf

  191  ls

  192  tail httpd.conf

  193  cd ../

  194  ls

  195  cd htdocs/

  196  ls

  197  cd www

  198  ls

  199  cd ../

  200  ls

  201  cd ../

  202  ls

  203  ls

  204  exit

  205  man mount

  206  who

  207  cd mnt

  208  cd /mnt

  209  ls

  210  mhd

  211  ls

  212  mkdir tmp

  213  ls

  214  cd /usr/local/tswc_file/

  215  ls

  216  cd tech/

  217  ls

  218  mount -o loop CentOS-4.6-x86_64-binDVD.iso /mnt/tmp

  219  cd /mnt/tmp

  220  ls

  221  umount -o loop /mnt/tmp/

  222  umount  /mnt/tmp/

  223  ls

  224  cd repodata/

  225  ls

  226  cd ../

  227  ls

  228  cd CentOS/

  229  ls

  230  cd RPMS/

  231  LS

  232  ls

  233  ls | grep httpd

  234  ls | grep mysqld

  235  ls | grep mysql

  236  ls | grep php

  237  ls

  238  q

  239  man umount

  240  umount -r  /mnt/tmp/

  241  umount   /mnt/tmp/

  242  umount -l

  243  umount -l /mnt/tmp

  244  umount -l /mnt/tmp

  245  umount -l /mnt/tmp

  246  cd /mnt/tmp

  247  ls

  248  exit

  249  exit

  250  top

  251  ps -ef

  252  /usr/local/apache/bin/apachectl top

  253  /usr/local/apache/bin/apachectl start

  254  top

  255  ip addr

  256  top

  257  la

  258  ls

  259  ls

  260  cd /usr/local/

  261  ls

  262  cd apache/

  263  ls

  264  cd bin

  265  ls

  266  ./ab -c 100000 -n 2000 http://211.154.164.99/

  267  ./ab -c 20000 -n 2000 http://211.154.164.99/

  268  ./ab -c 10000 -n 2000 http://211.154.164.99/

  269  ./ab -c 10000 -n 1000 http://211.154.164.99/

  270  ./ab -c 10000 -n 1000 http://211.154.164.99:80/

  271  ./ab -c 10000 -n 1000 http://211.154.164.99:80/phpinfo.php

  272  ./ab -c 10000 -n 200 http://211.154.164.99:80/phpinfo.php

  273  ./ab -c 20000 -n 200 http://211.154.164.99:80/phpinfo.php

  274  ./ab -c 3000 -n 200 http://211.154.164.99:80/phpinfo.php

  275  ./ab -c 3000 -n 100 http://211.154.164.99:80/phpinfo.php

  276  ./ab  -n 100 http://211.154.164.99:80/phpinfo.php

  277  ./ab  -n 500 http://211.154.164.99:80/phpinfo.php

  278  ./ab  -n 20000 http://211.154.164.99:80/phpinfo.php

  279  top

  280  ls

  281  ./apachectl status | more

  282  ./apachectl status | more

  283  ./apachectl status | more

  284  ./apachectl status | more

  285  ./apachectl status | more

  286  ./apachectl status | more

  287  ./apachectl status | more

  288  ./apachectl status | more

  289  ./apachectl status | more

  290  ./apachectl status | more

  291  ./apachectl status | more

  292  ./apachectl status | more

  293  ./apachectl status | more

  294  ./apachectl status | more

  295  ./apachectl status | more

  296  ./apachectl status | more

  297  ./apachectl status | more

  298  ./apachectl status | more

  299  ./apachectl status | more

  300  ./apachectl status | more

  301  ./apachectl status | more

  302  ./apachectl status | more

  303  ./apachectl status | more

  304  ./apachectl status | more

  305  ./apachectl status | more

  306  ./apachectl status | more

  307  ./apachectl status | more

  308  ./apachectl status | more

  309  ./apachectl status | more

  310  top

  311  ./apachectl status | more

  312  ./apachectl status | more

  313  ./apachectl status | more

  314  ./apachectl status | more

  315  ./apachectl status | more

  316  ./apachectl status | more

  317  ./apachectl status | more

  318  ./apachectl status | more

  319  ./apachectl status | more

  320  ps -ef

  321  ps -ef

  322  ls

  323  ip addr

  324  ps -ef

  325  exit

  326  top

  327  history

linux mount命令的基本用法是

Posted by 机器人 on 18th 一月 2008 in linux/server

载自:网络

格式:mount [-参数] [设备名称] [挂载点]

其中常用的参数有:

-a 安装在/etc/fstab文件中类出的所有文件系统。

-f 伪装mount,作出检查设备和目录的样子,但并不真正挂载文件系统。

-n 不把安装记录在/etc/mtab 文件中。

-r 讲文件系统安装为只读。

-v 详细显示安装信息。

-w 将文件系统安装为可写,为命令默认情况。

-t <文件系统类型> 指定设备的文件系统类型,常见的有:

ext2 linux目前常用的文件系统

msdos MS-DOS的fat,就是fat16

vfat windows98常用的fat32

nfs 网络文件系统

iso9660 CD-ROM光盘标准文件系统

ntfs windows NT/2000/XP的文件系统

auto 自动检测文件系统

-o <选项> 指定挂载文件系统时的选项,有些也可写到在/etc/fstab中。常用的有:

defaults 使用所有选项的默认值(auto、nouser、rw、suid)

auto/noauto 允许/不允许以 –a选项进行安装

dev/nodev 对/不对文件系统上的特殊设备进行解释

exec/noexec 允许/不允许执行二进制代码

suid/nosuid 确认/不确认suid和sgid位

user /nouser 允许/不允许一般用户挂载

codepage=XXX 代码页

iocharset=XXX 字符集

ro 以只读方式挂载

rw 以读写方式挂载

remount 重新安装已经安装了的文件系统

loop 挂载回旋设备

需要注意的是,挂载点必须是一个已经存在的目录,这个目录可以不为空,但挂载后这个目录下以前的内容将不可用,umount以后会恢复正常。使用多个-o参数的时候,-o 只用一次,参数之间用半角逗号隔开:

# mount –o remount,rw /

例如要挂载windows下文件系统为FAT32的D盘,一般而言在Linux下这个分区对应/dev/hda5,根据具体的分区情况会有不同,这里就以hda5来举例说明:

# mkdir /mnt/hda5 //创建hda5的目录作为挂载点,位置和目录名可自定义//

# mount -t vfat /dev/hda5 /mnt/hda5

一般而言,Linux会自动探测分区的文件系统,除非让你指定时,否则-t vfat 可以省掉。

# mount /dev/hda5 /mnt/hda5

这样就可以进入/mnt/hda5目录去访问分区中的资源了。

3. 为什么mount上分区后显示不了中文文件为问号/乱码?

显示问号表明你的系统中没有可识别使用的中文字体,请先安装中文字体。确保你的系统已经可以很好的显示中文。显示为乱码一般是mount默认使用的文件系统编码和文件系统中文件的实际编码不一致造成的。要想正常显示中文文件,mount时需要用到 -o 参数里的codepage和iocharset选项。codepage指定文件系统的代码页,简体中文中文代码是936;iocharset指定字符集,简体中文一般用cp936或gb2312。

# mount –o iocharset=gb2312 codepage=936 /dev/hda5 /mnt/hda5

一般来说 mount –o iocharset=cp936 /dev/hda5 /mnt/hda5 就可以解决问题了。

如果这样做了以后还有问题,请尝试UTF-8编码:

# mount –o iocharset=utf8 /dev/hda5 /mnt/hda5

4. 为什么mount上去以后分区普通用户不可写?

mount时加上 –o umask=000 即可:

# mount –o umask=000, iocharset=cp936 /dev/hda5 /mnt/hda5

5. 为什么mount上去后的分区中的文件都变成短文件名了?

这是文件系统挂错的原因,将FAT32挂载成FAT16时就会出现这种情况,先umount,然后用 –t vfat 重新挂载即可解决问题。

# mount –t vat /dev/hda5 /mnt/hda5

7. 如何挂载U盘和mp3?

如果计算机没有其它SCSI设备和usb外设的情况下,插入的U盘的设备路径是 /dev/sda1,用命令:

# mkdir /mnt/u

# mount /dev/sda1 /mnt/u

挂载即可。

8. 可以直接使用iso文件吗?

可以,就是mount的这一选项使得Linux下有免费虚拟光驱的说法,具体用法是:

# mkdir /mnt/iso

# mount –o loop linux.iso /mnt/iso

当然,挂载以后挂载点/mnt/iso也是只读的。

12. 如何开机自动挂载分区?

每次挂载都要输入那么长的命令的确是繁琐了些,只要将分区信息写到/etc/fstab文件中即可实现系统启动的自动挂载,例如对于/dev/hda5的自动挂载添加如下的行即可:

/dev/hda5 /mnt/hda5 vfat defaults,iocharset=cp936, rw 0 0

13. 如何挂载samba 分区?

# mkdir /mnt/share

# mount -t smbfs -o username=root,password=abc,codepage=936,iocharset=gb2312 //192.168.1.100/share /mnt/share

如果中文显示不正常请尝试UTF-8编码。当然可以写到fstab中实现自动挂载。

14. mount –bind是什么意思?

mount –bind 是将一个目录中的内容挂载到另一个目录上,用法是

# mount –bind olddir newdir

这个命令使得自己搭建的FTP要共享某个目录的时候变得特别方便。如果要取消mount用命令:

# mount –move olddir newdir 即可。

如果mount –bind 也想写入fstab中的话格式如下:

olddir newdir none bind 0 0

16. 为什么umount的时候老显示 device busy?

这是因为有程序正在访问这个设备,最简单的办法就是让访问该设备的程序退出以后再umount。可能有时候用户搞不清除究竟是什么程序在访问设备,如果用户不急着umount,则可以用:

# umount -l /mnt/hda5

来卸载设备。选项 –l 并不是马上umount,而是在该目录空闲后再umount。还可以先用命令 ps aux 来查看占用设备的程序PID,然后用命令kill来杀死占用设备的进程,这样就umount的非常放心了。

机器人 2008-1-18 于 北京

xp fonts to ubuntu

Posted by 机器人 on 18th 一月 2008 in linux/server

1. mount c: to /mnt/c
2. copy /mnt/c/windows/fonts/ to /usr/share/fonts/xp
3. chmod 777 on xp
4.create font cache command.

cd /usr/share/fonts/vista/
sudo mkfontscale
sudo mkfontdir
sudo fc-cache -fv

5.reboot you system.

linux解压 tar命令

Posted by 机器人 on 18th 一月 2008 in linux/server

来自:网络

tar命令

[root@linux ~]#

tar [-cxtzjvfpPN] 文件与目录 ….

参数:

-c :建立一个压缩文件的参数指令(create 的意思);

-x :解开一个压缩文件的参数指令!

-t :查看 tarfile 里面的文件!

特别注意,在参数的下达中, c/x/t 仅能存在一个!不可同时存在!

因为不可能同时压缩与解压缩。

-z :是否同时具有 gzip 的属性?亦即是否需要用 gzip 压缩?

-j :是否同时具有 bzip2 的属性?亦即是否需要用 bzip2 压缩?

-v :压缩的过程中显示文件!这个常用,但不建议用在背景执行过程!

-f :使用档名,请留意,在 f 之后要立即接档名喔!不要再加参数!

   例如使用『 tar -zcvfP tfile sfile』就是错误的写法,要写成

   『 tar -zcvPf tfile sfile』才对喔!

-p :使用原文件的原来属性(属性不会依据使用者而变)

-P :可以使用绝对路径来压缩!

-N :比后面接的日期(yyyy/mm/dd)还要新的才会被打包进新建的文件中!

–exclude FILE:在压缩的过程中,不要将 FILE 打包!

范例:

范例一:将整个 /etc 目录下的文件全部打包成为 /tmp/etc.tar

[root@linux ~]# tar -cvf /tmp/etc.tar /etc <==仅打包,不压缩!

[root@linux ~]# tar -zcvf /tmp/etc.tar.gz /etc <==打包后,以 gzip 压缩

[root@linux ~]# tar -jcvf /tmp/etc.tar.bz2 /etc <==打包后,以 bzip2 压缩

# 特别注意,在参数 f 之后的文件档名是自己取的,我们习惯上都用 .tar 来作为辨识。

# 如果加 z 参数,则以 .tar.gz 或 .tgz 来代表 gzip 压缩过的 tar file ~

# 如果加 j 参数,则以 .tar.bz2 来作为附档名啊~

# 上述指令在执行的时候,会显示一个警告讯息:

# 『tar: Removing leading `/’ from member names』那是关於绝对路径的特殊设定。

范例二:查阅上述 /tmp/etc.tar.gz 文件内有哪些文件?

[root@linux ~]# tar -ztvf /tmp/etc.tar.gz

# 由於我们使用 gzip 压缩,所以要查阅该 tar file 内的文件时,

# 就得要加上 z 这个参数了!这很重要的!

范例三:将 /tmp/etc.tar.gz 文件解压缩在 /usr/local/src 底下

[root@linux ~]# cd /usr/local/src

[root@linux src]# tar -zxvf /tmp/etc.tar.gz

# 在预设的情况下,我们可以将压缩档在任何地方解开的!以这个范例来说,

# 我先将工作目录变换到 /usr/local/src 底下,并且解开 /tmp/etc.tar.gz ,

# 则解开的目录会在 /usr/local/src/etc 呢!另外,如果您进入 /usr/local/src/etc

# 则会发现,该目录下的文件属性与 /etc/ 可能会有所不同喔!

范例四:在 /tmp 底下,我只想要将 /tmp/etc.tar.gz 内的 etc/passwd 解开而已

[root@linux ~]# cd /tmp

[root@linux tmp]# tar -zxvf /tmp/etc.tar.gz etc/passwd

# 我可以透过 tar -ztvf 来查阅 tarfile 内的文件名称,如果单只要一个文件,

# 就可以透过这个方式来下达!注意到! etc.tar.gz 内的根目录 / 是被拿掉了!

范例五:将 /etc/ 内的所有文件备份下来,并且保存其权限!

[root@linux ~]# tar -zxvpf /tmp/etc.tar.gz /etc

# 这个 -p 的属性是很重要的,尤其是当您要保留原本文件的属性时!

范例六:在 /home 当中,比 2005/06/01 新的文件才备份

[root@linux ~]# tar -N ’2005/06/01′ -zcvf home.tar.gz /home

范例七:我要备份 /home, /etc ,但不要 /home/dmtsai

[root@linux ~]# tar –exclude /home/dmtsai -zcvf myfile.tar.gz /home/* /etc

范例八:将 /etc/ 打包后直接解开在 /tmp 底下,而不产生文件!

[root@linux ~]# cd /tmp

[root@linux tmp]# tar -cvf – /etc | tar -xvf –

# 这个动作有点像是 cp -r /etc /tmp 啦~依旧是有其有用途的!

# 要注意的地方在於输出档变成 – 而输入档也变成 – ,又有一个 | 存在~

# 这分别代表 standard output, standard input 与管线命令啦!

# 这部分我们会在 Bash shell 时,再次提到这个指令跟大家再解释啰!

机器人 2008-1-18 于 北京

 

 

 

程序员的温情管理文化(转载)

Posted by 机器人 on 16th 一月 2008 in php/javascript

转自: http://blog.devep.net/virushuo/2008/01/10/programmer-warmth-manage.html

 今天戴飞和我聊起来为什么在一些公司会很闲但是很累,在另外一些公司工作量大但是很开心的话题。不由得勾起了我总结一下长久以来关于工作,尤其是对程序员的工作管理的一些话题。

从我带第一个技术团队算起,已经有很多年了。我始终坚持的一件事就是温情。所谓温情,很简单,替别人多想一些。我在附中的时候,下班总要“轰”大家回家,不让团队成员加班。如果为了躲避晚高峰不想走,我就鼓动他们玩玩游戏,看看电影看看书,别太累。

这事情在所谓“管理者”眼里是个笑话,在他们那里几个参数是等同的,加班==工资==产能。事实上每个工作过几年的人都知道这不可能。程序员是这样一群家伙,他们可以把1000行代码写成10行,当然也可以把10行代码写成1000行。他们可以让这1000行代码比那10行容易看懂效率更高,也可以让那10行比这1000行容易看懂效率更高。

在这种情况下,我更愿意在质量和工作量中找一个平衡点。即,不让任何一个人累着,不要让他们早晨起来躺在床上懒得上班,不要让他们因为加班被家人抱怨甚至感情危机。人首先是生活的人,如果放弃了生活,工作也没意义。皮之不存,毛将焉附?

最终找到的这种平衡点很有趣。那就是,程序员很难在一天内完成超过4个小时的高效工作。我说的是要求质量,有能动性,要动脑子,有创意的那种工作,拼贴代码那种机械工作咱们就不讨论了。因此我尝试在我和tiny的新公司实行每天6小时,每周30小时工作制。同时我们在力所能及的情况下不主动压低任何人的工资。我们不用期权引诱人,我们首先保证所有人生活正常,无压力,虽然我们认为我们的期权很值钱。但值钱不值钱这件事不是自己吹牛吹出来的,是大家共同努力出来的。

事实证明,每天6个小时工作时间不但没有降低效率,反而比8个小时高很多。想想也不奇怪,早晚放弃了1个小时,所有人都可以躲过早晚交通高峰,路上花费更少的时间,不会被人挤,心情不会太差,到公司可以很快进入工作状态,且心情轻松。

我倾向于相信,如果生活稳定,家庭幸福,收入正常,且在做一份有未来的事业,所有人都愿意尽自己最大努力。反之,其实所有人都有去稳定的大公司的机会。没人愿意来创业。

说到这里,一定会有人反驳:软件工程就是用来降低程序员不稳定性,工作量不够,产品质量不高的问题的。是的,这种说法完全对,不过仅限于外包领域。外包领域具有明确的需求和验收标准,产品相当稳定。他们追求的是重复性,可复用性。因此他们希望通过一种机制,让程序员变成机器。一个程序员“坏了”(不开心了,辞职了,老了精力下降了),那就换一个,就好像换掉一个巨大机器上面的齿轮,咔的一声,拧好螺丝,继续运转,一切都跟没发生过一样。刚才那个被拧下的齿轮呢?老天,谁关心那个。

在互联网,尤其是带有较高技术含量的领域,或是新鲜的领域,我们因为没有标准可循,所以并不需要这种机器。我力图把程序员重新还原成人。所以我更喜欢创造一个有温情的环境。其实不仅仅我这个小创业者的胡思乱想,google给员工极度的自由,极好的待遇,我觉得也可以看做这种思路。google知道无法管理技术人员,所以他们干脆选择了彻底的,全面的妥协。一切都交给你们,你们努力去做就好,我们不给你压力。事实上,在选好人的情况下,这种思路产生的产能是惊人的。当然,在中国似乎没选好人,所以产生的浪费也是惊人的。

几乎所有武术都在讲,出拳的时候手臂要放松,接触目标的瞬间发力,这样才有力量。如果出拳即发力,则会导致肌肉紧张,动作变形,最终你使出了全身的力气,却只打出了软绵绵的一拳。这多么的悲哀。

30分钟搞定shell脚本编程

Posted by 机器人 on 15th 一月 2008 in linux/server

一个最简单的脚本
这篇指南将通过一些例子来帮助大家学习功能强大的shell脚本编程.
在这一节中我将学习一些简单的脚本,它将有利于你深入学习一些知识。
一个最经典的Hello World程序

#!/bin/bash
echo Hello World

这个脚本只有二行,它的第一行这个脚本程序由那个程序来解释.第二行只有一个简单的动作,它的功能是在终端上打印出一行”Hello World” 。如果你测试着执行这个命令时(./hello.sh),你将会得到一个command not found的信息,这种情况大部分可能是你的第一行#!/bin/bash这个程序有问题,你一定要确保bash可以找到并且可用。(一般情况下你还要对这个脚本附一个可执行权限)

#chmod u+x hello.sh

一个非常简单的备份脚本

#!/bin/bash
tar -cZf /var/my-backup.tgz /home/me/

在这个脚本中,它替换了上一个例子的将一行信息打印在终端上的功能,取尔代之的是一个备份/home目录的tar备份命令。
关于重定向的一些信息
最基本的理论基础
这里有对于三个文件的重定向定义: stdin(标准输入), stdout(标准输出) and stderr(标准错误输出) (std=standard).
基本上你可以
1. 重定向 stdout 到一个文件
2. 重定向 stderr 到一个文件
3. 重定向 stdout 到stderr
4. 重定向 stderr 到 stdout
5. 重定向 stderr 到 stdout 中并且成为一个文件
6. 重定向 stderr and stdout to stdout
7. 重定向 stderr and stdout to stderr
在Linux中 1代表 ‘标准输出’, 2代表’标准错误’
标准输出
这个例子将会使ls的显示结果重定向到一个文件中.

ls -l > ls-l.txt

标准错误
这个例子将会使grep命令在运行过程中出现的错误输出到一个文件中

grep da * 2> grep-errors.txt

管道
这一节我们将解释一个非常简单的并且你以后一定会用到的功能,它就是管道。
为什么大家都会用到管道?
管道可以使你非常方便的将一个程序的结果转向到另外一个程序中。
一个sed的例子
这个例子使用了非常简单的管道功能:

ls -l | sed -e "s/[aeio]/u/g"

当我们执行以下命令后:首先ls –l会先执行并且它会输出结果信息但是如果它的后面跟是一个管道符的话,那么它就会将结果重新定向到sed这个程序中,sed使用了替换功能,所以这个例子执行完会,会将ls –l结果中所有含有aeio的英文单词替换成单词u.
通过另外的方法实现ls –l *.txt
也许这种方法不同于ls –l *.txt,但是它避免了出现一条 No Such file Or Directory这种信息。

ls -l | grep ".txt"

当ls –l 执行后,它会将程序结果输出到grep这个程序中,并且去匹配.txt这条信息。
变量
你可在任何编程语言中使用变量,但是在脚本编程中它们是没有类型的,简称弱类型编程语言,在这个变量中可以保含一个数字,一个字符串,一个单词等。你并不需要声明这个变量,它会在引用这个变量时创建它。
使用变量来实现一个简单的Hello World

#!/bin/bash
STR="Hello World!"
echo $STR

第二行建立一个STR的变量并且为其附了一个“Hello World”的字符串变量值。当在这个变量前面加上一个$符号时,我们就将会得到这个变量的值。
例子(一个使用变量的备份脚本)

#!/bin/bash
OF=/var/my-backup-$(date +%Y%m%d).tgz
tar -cZf $OF /home/me/

局部变量
局部变量的生命是有限的,请看下面的例子

#!/bin/bash
HELLO=Hello
function hello {
	local HELLO=World
	echo $HELLO
}
echo $HELLO
hello
echo $HELLO

条件语句
条件语句可以使你决定是完成一个运作或是不去完成一个动作时,通过一些判断来实现,一般情况都是通过一些操作符来实现判断。
条件语句可以有许多实现方法,最多的情况是基于if expression then 这种情况,也就是大家常常说的if判断语句。它的语法基本结构如下:
if [expression];
then
code if ‘expression’ is true.
fi
一个最基本的使用if …then的例子

#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
fi

这段代码执行if判断,如果foo等于foo的话,那么你就会执行then语句下的输出语句,最后通过fi来结束,这里我要强调一点,就是很多新手在输入源码时特别是在if 语句后面没有空格,在大括号后面没有空格,在等号两边没有空格,这些都会制造出一些麻烦的。
一个简单的控制if .. then …else

#!/bin/bash
if [ "foo" = "foo" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi

6.4 通过变量进行判断控制

#!/bin/bash
T1="foo"
T2="bar"
if [ "$T1" = "$T2" ]; then
echo expression evaluated as true
else
echo expression evaluated as false
fi

7. 循环结构
在这一节中,你将会学习for、while、until loops循环
对于for 循环它有一点不同于其他的编程语言,它有一点像VB中的for each语句,就是所谓的递归的循环。
对于while循环,它其实是一个加强的if语句,如果它的条件为真,那么它就一直执行while循环中的语句中的内容。
7.1 For sample

#!/bin/bash
for i in $( ls ); do
echo item: $i
done

在第二行上,我们声明了一个i的变量,它将一直将ls命令的结果全部循环出来。其中do 和done之间是所要执行的代码。
While循环例子

#!/bin/bash
COUNTER=0
while [ $COUNTER -lt 10 ]; do
echo The counter is $COUNTER
let COUNTER=COUNTER+1
done

这里面大家可能看到一个-lt的命令选项,这里它代表小于等于
-eq 等于
-ne 不等于
-gt 大于
-ge 大于等于
-lt 小于
-le 小于等于
Until的例子

#!/bin/bash
COUNTER=20
until [ $COUNTER -lt 10 ]; do
echo COUNTER $COUNTER
let COUNTER-=1
done

函数
对于大多数编程语言,你都可以调用函数来执行一段代码,这样可以使用减少重复的书写代码。
函数的例子

#!/bin/bash
function quit {
exit
}
function hello {
echo Hello!
}
hello
quit
echo foo

在 2-4行包含了一个quit函数,在5-7行包含了 hello函数,如果你不是很确定这个脚本是是什么意思,那么我建议试试它。Notice that a functions don’t need to be declared in any specific order.
当你运行这个脚本时你的程序将会最先调用hello函数,以后再调用quit函数最后才执行echo 输出命令。
在函数中使用参数

#!/bin/bash
function quit {
exit
}
function e {
echo $1
}
e Hello
e World
quit
echo foo

这个脚本几乎和前一个脚本没有什么不能,但最主要的不同是e这个函数可以使用参数了。
用户接口
使用select命令制作简单的菜单

#!/bin/bash
OPTIONS="Hello Quit"
select opt in $OPTIONS; do
 
 
 
 
 
if [ "$opt" = "Quit" ]; then
echo done
exit
elif [ "$opt" = "Hello" ]; then
echo Hello World
else
clear
echo bad option
fi
done

如果你运行这个脚本你将会看到一个非常简单的菜单
使用read读入用户输入
在多数情况下你可能会用到提示请进行输入这种状态并且有几种方法可以用。这是其中的一种方法:

#!/bin/bash
echo Please, enter your name
read NAME
echo "Hi $NAME!"

对于变量来说,你可以通过多个值来读入。

#!/bin/bash
echo Please, enter your firstname and lastname
read FN LN
echo "Hi! $LN, $FN !"

算术操作
使用以下的命令:
echo 1 + 1
如果你希望看到2,那么你会很失望,那么我们应该如何进行操作哪? echo $((1+1))
我们可以使用以下方法:
echo $[1+1]

算术操作
+
-
*
/
% (remainder)
关系操作
-lt (< )
-gt (>)
-le (< =)
-ge (>=)
-eq (==)
-ne (!=)

载自:http://fanqiang.chinaunix.net/program/shell/2005-09-07/3619.shtml

Apache并发请求数及其TCP连接状态查看的方法

Posted by 机器人 on 14th 一月 2008 in 未分类

这两天搭建了一组Apache服务器,每台服务器4G内存,采用的是prefork模式,一开始设置的连接数太少了,需要较长的时间去响应用户的请求,后来修改了一下Apache 2.0.59的配置文件httpd.conf:

引用
# prefork MPM

# StartServers: number of server processes to start

# MinSpareServers: minimum number of server processes which are kept spare

# MaxSpareServers: maximum number of server processes which are kept spare

# MaxClients: maximum number of server processes allowed to start

# MaxRequestsPerChild: maximum number of requests a server process serves

StartServers         10

MinSpareServers      10

MaxSpareServers      15

ServerLimit          2000

MaxClients           2000

MaxRequestsPerChild  10000

 


查看httpd进程数(即prefork模式下Apache能够处理的并发请求数):

Linux命令:

引用
ps -ef | grep httpd | wc -l

返回结果示例:

1388

表示Apache能够处理1388个并发请求,这个值Apache可根据负载情况自动调整,我这组服务器中每台的峰值曾达到过2002。


查看Apache的并发请求数及其TCP连接状态:

Linux命令:

引用
netstat -n | awk ‘/^tcp/ {++S[$NF]} END {for(a in S) print a, S[a]}’

 

  (这条语句是从 新浪互动社区事业部新浪互动社区事业部新浪互动社区事业部技术总监王老大那儿获得的,非常不错)

返回结果示例:

LAST_ACK 5

SYN_RECV 30

ESTABLISHED 1597

FIN_WAIT1 51

FIN_WAIT2 504

TIME_WAIT 1057

其中的SYN_RECV表示正在等待处理的请求数;ESTABLISHED表示正常数据传输状态;TIME_WAIT表示处理完毕,等待超时结束的请求数。


关于TCP状态的变迁,可以从下图形象地看出:

Apache并发请求数及其TCP连接状态查看的方法_网页教学网webjx.com整理  

状态:描述

CLOSED:无连接是活动的或正在进行

LISTEN:服务器在等待进入呼叫

SYN_RECV:一个连接请求已经到达,等待确认

SYN_SENT:应用已经开始,打开一个连接

ESTABLISHED:正常数据传输状态

FIN_WAIT1:应用说它已经完成

FIN_WAIT2:另一边已同意释放

ITMED_WAIT:等待所有分组死掉

CLOSING:两边同时尝试关闭

TIME_WAIT:另一边已初始化一个释放

LAST_ACK:等待所有分组死掉

五种常见的 PHP 设计模式

Posted by 机器人 on 14th 一月 2008 in php/javascript

设计模式只是为 Java 架构师准备的 —— 至少您可能一直这样认为。实际上,设计模式对于每个人都非常有用。如果这些工具不是 “架构太空人” 的专利,那么它们又是什么?为什么说它们在 PHP 应用程序中非常有用?本文解释了这些问题。

设计模式不仅代表着更快开发健壮软件的有用方法,而且还提供了以友好的术语封装大型理念的方法。例如,您可以说您正在编写一个提供松散耦合的消息传递系统,也可以说你正在编写名称为观察者 的模式。

用较小的示例展示模式的价值是非常困难的。这往往有些大材小用的意味,因为模式实际上是在大型代码库中发挥作用的。本文不展示大型应用程序,所以您需要思索的是在您自己的大型应用程序中应用示例原理的方法 ——而不是本文演示的代码本身。这不是说您不应该在小应用程序中使用模式。很多良好的应用程序都以小应用程序为起点,逐渐发展到大型应用程序,所以没有理由不以此类扎实的编码实践为基础。

既然您已经了解了设计模式以及它们的有用之处,现在我们来看看 PHP5 的五种常用模式。

工厂模式

最初在设计模式 一书中,许多设计模式都鼓励使用松散耦合。要理解这个概念,让我们最好谈一下许多开发人员从事大型系统的艰苦历程。在更改一个代码片段时,就会发生问题,系统其他部分 —— 您曾认为完全不相关的部分中也有可能出现级联破坏。

该问题在于紧密耦合 。系统某个部分中的函数和类严重依赖于系统的其他部分中函数和类的行为和结构。您需要一组模式,使这些类能够相互通信,但不希望将它们紧密绑定在一起,以避免出现联锁。

在大型系统中,许多代码依赖于少数几个关键类。需要更改这些类时,可能会出现困难。例如,假设您有一个从文件读取的 User 类。您希望将其更改为从数据库读取的其他类,但是,所有的代码都引用从文件读取的原始类。这时候,使用工厂模式会很方便。

工厂模式 是一种类,它具有为您创建对象的某些方法。您可以使用工厂类创建对象,而不直接使用 new。这样,如果您想要更改所创建的对象类型,只需更改该工厂即可。使用该工厂的所有代码会自动更改。

清单 1 显示工厂类的一个示列。等式的服务器端包括两个部分:数据库和一组 PHP 页面,这些页面允许您添加反馈、请求反馈列表并获取与特定反馈相关的文章。

list1

 

interface IUser {
    function getName();
}
class User implements IUser {
    public function __construct( $id ) {

    }
    public function getName() {
        return "Jack";
    }
}
class UserFactory {
    public static function Create( $id ) {
        return new User( $id );
    }
}
$uo = UserFactory::Create( 1 );
echo( $uo->getName()."\n" );

IUser 接口定义用户对象应执行什么操作。IUser 的实现称为 User,UserFactory 工厂类则创建 IUser 对象。此关系可以用图 1 中的 UML 表示。

图 1. 工厂类及其相关 IUser 接口和用户类

如果您使用 php 解释器在命令行上运行此代码,将得到如下结果:

测试代码会向工厂请求 User 对象,并输出 getName 方法的结果。

% php factory1.php

Jack

%

有一种工厂模式的变体使用工厂方法。类中的这些公共静态方法构造该类型的对象。如果创建此类型的对象非常重要,此方法非常有用。例如,假设您需要先创建对象,然后设置许多属性。此版本的工厂模式会将该进程封装在单个位置中,这样,不用复制复杂的初始化代码,也不必将复制好的代码在在代码库中到处粘贴。

清单2.显示使用工厂方法的一个示例。

list2

 

interface IUser {
    function getName();
}
class User implements IUser {
    public static function Load( $id ) {
        return new User( $id );
    }
    public static function Create( ) {
        return new User( null );
    }
    public function __construct( $id ) {
    }
    public function getName() {
        return "Jack";
    }
}
$uo = User::Load( 1 );
echo( $uo->getName()."\n" );

这段代码要简单得多。它仅有一个接口 IUser 和一个实现此接口的 User 类。User 类有两个创建对象的静态方法。此关系可用图 2 中的 UML 表示。

图 2. IUser 接口和带有工厂方法的 user 类

在命令行中运行脚本产生的结果与清单 1 的结果相同,如下所示:

% php factory2.php

Jack

%

如上所述,有时此类模式在规模较小的环境中似乎有些大材小用。不过,最好还是学习这种扎实的编码形式,以便应用于任意规模的项目中。

单元素模式

某些应用程序资源是独占的,因为有且只有一个此类型的资源。例如,通过数据库句柄到数据库的连接是独占的。您希望在应用程序中共享数据库句柄,因为在保持连接打开或关闭时,它是一种开销,在获取单个页面的过程中更是如此。

单元素模式可以满足此要求。如果应用程序每次包含且仅包含一个对象,那么这个对象就是一个单元素(Singleton)。清单 3 中的代码显示了 PHP V5 中的一个数据库连接单元素。

 list3

require_once("DB.php");
class DatabaseConnection {
    private $_handle = null;
    public static function get() {
        static $db = null;
        if ($db == null)
        $db = new DatabaseConnection();
        return $db;
    }
    private function __construct() {
        $dsn = 'mysql://root:password@localhost/photos';
        $this->_handle =& DB::Connect( $dsn, array() );
    }
    public function handle() {
        return $this->_handle;
    }
}
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );
print( "Handle = ".DatabaseConnection::get()->handle()."\n" );

此代码显示名为 DatabaseConnection 的单个类。您不能创建自已的 DatabaseConnection,因为构造函数是专用的。但使用静态 get 方法,您可以获得且仅获得一个 DatabaseConnection 对象。此代码的 UML 如图 3 所示。

图 3. 数据库连接单元素

在两次调用间,handle 方法返回的数据库句柄是相同的,这就是最好的证明。您可以在命令行中运行代码来观察这一点。

% php singleton.php

Handle = Object id #3

Handle = Object id #3

%

返回的两个句柄是同一对象。如果您在整个应用程序中使用数据库连接单元素,那么就可以在任何地方重用同一句柄。

您可以使用全局变量存储数据库句柄,但是,该方法仅适用于较小的应用程序。在较大的应用程序中,应避免使用全局变量,并使用对象和方法访问资源。

观察者模式

观察者模式为您提供了避免组件之间紧密耦合的另一种方法。该模式非常简单:一个对象通过添加一个方法(该方法允许另一个对象,即观察者 注册自己)使本身变得可观察。当可观察的对象更改时,它会将消息发送到已注册的观察者。这些观察者使用该信息执行的操作与可观察的对象无关。结果是对象可以相互对话,而不必了解原因。

一个简单示例是系统中的用户列表。清单 4 中的代码显示一个用户列表,添加用户时,它将发送出一条消息。添加用户时,通过发送消息的日志观察者可以观察此列表。

 list4

interface IObserver {
    function onChanged( $sender, $args );
}
interface IObservable    {
    function addObserver( $observer );
}

class UserList implements IObservable {
    private $_observers = array();
    public function addCustomer( $name ) {
        foreach( $this->_observers as $obs )
        $obs->onChanged( $this, $name );
    }

    public function addObserver( $observer ) {
        $this->_observers []= $observer;
    }
}

class UserListLogger implements IObserver {
    public function onChanged( $sender, $args ) {
        echo( "'$args' added to user list\n" );
    }
}
$ul = new UserList();
$ul->addObserver( new UserListLogger() );
$ul->addCustomer( "Jack" );

此代码定义四个元素:两个接口和两个类。IObservable 接口定义可以被观察的对象,UserList 实现该接口,以便将本身注册为可观察。IObserver 列表定义要通过怎样的方法才能成为观察者,UserListLogger 实现 IObserver 接口。图 4 的 UML 中展示了这些元素。

图 4. 可观察的用户列表和用户列表事件日志程序

如果在命令行中运行它,您将看到以下输出:

% php observer.php

‘Jack’ added to user list

%

测试代码创建 UserList,并将 UserListLogger 观察者添加到其中。然后添加一个消费者,并将这一更改通知 UserListLogger。

认识到 UserList 不知道日志程序将执行什么操作很关键。可能存在一个或多个执行其他操作的侦听程序。例如,您可能有一个向新用户发送消息的观察者,欢迎新用户使用该系统。这种方法的价值在于 UserList 忽略所有依赖它的对象,它主要关注在列表更改时维护用户列表并发送消息这一工作。

此模式不限于内存中的对象。它是在较大的应用程序中使用的数据库驱动的消息查询系统的基础。

命令链模式

命令链 模式以松散耦合主题为基础,发送消息、命令和请求,或通过一组处理程序发送任意内容。每个处理程序都会自行判断自己能否处理请求。如果可以,该请求被处理,进程停止。您可以为系统添加或移除处理程序,而不影响其他处理程序。清单 5 显示了此模式的一个示例。

 list5

interface ICommand {
    function onCommand( $name, $args );
}
class CommandChain {
    private $_commands = array();
    public function addCommand($cmd) {
        $this->_commands []= $cmd;
    }

    public function runCommand( $name, $args ) {
        foreach( $this->_commands as $cmd ) {
            if ($cmd->onCommand($name,$args))
                return;
        }
    }
}

class UserCommand implements ICommand {
public function onCommand($name,$args) {
    if ($name != 'addUser') return false;
        echo( "UserCommand handling 'addUser'\n" );
        return true;
    }
}
class MailCommand implements ICommand {
    public function onCommand( $name, $args) {
        if($name != 'mail') return false;
        echo( "MailCommand handling 'mail'\n" );
        return true;
    }
}
$cc = new CommandChain();
$cc->addCommand( new UserCommand() );
$cc->addCommand( new MailCommand() );
$cc->runCommand( 'addUser', null );
$cc->runCommand( 'mail', null );

此代码定义维护 ICommand 对象列表的 CommandChain 类。两个类都可以实现 ICommand 接口 —— 一个对邮件的请求作出响应,另一个对添加用户作出响应。图 5 给出了 UML。

图 5. 命令链及其相关命令

如果您运行包含某些测试代码的脚本,则会得到以下输出:

% php chain.php

UserCommand handling ‘addUser’

MailCommand handling ‘mail’

%

代码首先创建 CommandChain 对象,并为它添加两个命令对象的实例。然后运行两个命令以查看谁对这些命令作出了响应。如果命令的名称匹配 UserCommand 或 MailCommand,则代码失败,不发生任何操作。

为处理请求而创建可扩展的架构时,命令链模式很有价值,使用它可以解决许多问题。

策略模式

我们讲述的最后一个设计模式是策略模式。在此模式中,算法是从复杂类提取的,因而可以方便地替换。例如,如果要更改搜索引擎中排列页的方法,则策略模式是一个不错的选择。思考一下搜索引擎的几个部分 ——一部分遍历页面,一部分对每页排列,另一部分基于排列的结果排序。在复杂的示例中,这些部分都在同一个类中。通过使用策略模式,您可将排列部分放入另一个类中,以便更改页排列的方式,而不影响搜索引擎的其余代码。

作为一个较简单的示例,清单 6 显示了一个用户列表类,它提供了一个根据一组即插即用的策略查找一组用户的方法。

 list6

interface IStrategy {
    function filter( $record );
}
class FindAfterStrategy implements IStrategy {
    private $_name;
    public function __construct( $name ) {
        $this->_name = $name;
    }

    public function filter( $record ) {
        return strcmp( $this->_name, $record ) <= 0;
    }
}

class RandomStrategy implements IStrategy {
    public function filter( $record ) {
        return rand( 0, 1 ) >= 0.5;
    }
}

class UserList {
    private $_list = array();
    public function __construct( $names ) {
        if ( $names != null ) {
            foreach( $names as $name ) {
                $this->_list []= $name;
            }
        }
    }
    public function add( $name ) {
        $this->_list []= $name;
    }

    public function find( $filter ) {
        $recs = array();
        foreach($this->_list as $user) {
            if ($filter->filter($user))    $recs []= $user;
        }
        return $recs;
    }
}

$ul = new UserList( array( "Andy", "Jack", "Lori", "Megan" ) );
$f1 = $ul->find( new FindAfterStrategy( "J" ) );
print_r( $f1 );

$f2 = $ul->find( new RandomStrategy() );
print_r( $f2 );

      此代码的 UML 如图 6 所示。

图 6. 用户列表和用于选择用户的策略

UserList 类是打包名称数组的一个包装器。它实现 find 方法,该方法利用几个策略之一来选择这些名称的子集。这些策略由 IStrategy 接口定义,该接口有两个实现:一个随机选择用户,另一个根据指定名称选择其后的所有名称。运行测试代码时,将得到以下输出:

% php strategy.php

Array

(

[0] => Jack

[1] => Lori

[2] => Megan

)

Array

(

[0] => Andy

[1] => Megan

)

%

测试代码为两个策略运行同一用户列表,并显示结果。在第一种情况中,策略查找排列在 J 后的任何名称,所以您将得到 Jack、Lori 和 Megan。第二个策略随机选取名称,每次会产生不同的结果。在这种情况下,结果为 Andy 和 Megan。

策略模式非常适合复杂数据管理系统或数据处理系统,二者在数据筛选、搜索或处理的方式方面需要较高的灵活性。

机器人 2008-2-28 整理 于 北京

 

 

各种颜色的英文代码 (收藏)

Posted by 机器人 on 8th 一月 2008 in php/javascript
颜色 英文代码 形像颜色 HEX格式 RGB格式
  LightPink 浅粉红 #FFB6C1 255,182,193
  Pink 粉红 #FFC0CB 255,192,203
  Crimson 猩红 #DC143C 220,20,60
  LavenderBlush 脸红的淡紫色 #FFF0F5 255,240,245
  PaleVioletRed 苍白的紫罗兰红色 #DB7093 219,112,147
  HotPink 热情的粉红 #FF69B4 255,105,180
  DeepPink 深粉色 #FF1493 255,20,147
  MediumVioletRed 适中的紫罗兰红色 #C71585 199,21,133
  Orchid 兰花的紫色 #DA70D6 218,112,214
  Thistle #D8BFD8 216,191,216
  plum 李子 #DDA0DD 221,160,221
  Violet 紫罗兰 #EE82EE 238,130,238
  Magenta 洋红 #FF00FF 255,0,255
  Fuchsia 灯笼海棠(紫红色) #FF00FF 255,0,255
  DarkMagenta 深洋红色 #8B008B 139,0,139
  Purple 紫色 #800080 128,0,128
  MediumOrchid 适中的兰花紫 #BA55D3 186,85,211
  DarkVoilet 深紫罗兰色 #9400D3 148,0,211
  DarkOrchid 深兰花紫 #9932CC 153,50,204
  Indigo 靛青 #4B0082 75,0,130
  BlueViolet 深紫罗兰的蓝色 #8A2BE2 138,43,226
  MediumPurple 适中的紫色 #9370DB 147,112,219
  MediumSlateBlue 适中的板岩暗蓝灰色 #7B68EE 123,104,238
  SlateBlue 板岩暗蓝灰色 #6A5ACD 106,90,205
  DarkSlateBlue 深岩暗蓝灰色 #483D8B 72,61,139
  Lavender 熏衣草花的淡紫色 #E6E6FA 230,230,250
  GhostWhite 幽灵的白色 #F8F8FF 248,248,255
  Blue 纯蓝 #0000FF 0,0,255
  MediumBlue 适中的蓝色 #0000CD 0,0,205
  MidnightBlue 午夜的蓝色 #191970 25,25,112
  DarkBlue 深蓝色 #00008B 0,0,139
  Navy 海军蓝 #000080 0,0,128
  RoyalBlue 皇军蓝 #4169E1 65,105,225
  CornflowerBlue 矢车菊的蓝色 #6495ED 100,149,237
  LightSteelBlue 淡钢蓝 #B0C4DE 176,196,222
  LightSlateGray 浅石板灰 #778899 119,136,153
  SlateGray 石板灰 #708090 112,128,144
  DoderBlue 道奇蓝 #1E90FF 30,144,255
  AliceBlue 爱丽丝蓝 #F0F8FF 240,248,255
  SteelBlue 钢蓝 #4682B4 70,130,180
  LightSkyBlue 淡蓝色 #87CEFA 135,206,250
  SkyBlue 天蓝色 #87CEEB 135,206,235
  DeepSkyBlue 深天蓝 #00BFFF 0,191,255
  LightBLue 淡蓝 #ADD8E6 173,216,230
  PowDerBlue 火药蓝 #B0E0E6 176,224,230
  CadetBlue 军校蓝 #5F9EA0 95,158,160
  Azure 蔚蓝色 #F0FFFF 240,255,255
  LightCyan 淡青色 #E1FFFF 225,255,255
  PaleTurquoise 苍白的绿宝石 #AFEEEE 175,238,238
  Cyan 青色 #00FFFF 0,255,255
  Aqua 水绿色 #00FFFF 0,255,255
  DarkTurquoise 深绿宝石 #00CED1 0,206,209
  DarkSlateGray 深石板灰 #2F4F4F 47,79,79
  DarkCyan 深青色 #008B8B 0,139,139
  Teal 水鸭色 #008080 0,128,128
  MediumTurquoise 适中的绿宝石 #48D1CC 72,209,204
  LightSeaGreen 浅海洋绿 #20B2AA 32,178,170
  Turquoise 绿宝石 #40E0D0 64,224,208
  Auqamarin 绿玉\碧绿色 #7FFFAA 127,255,170
  MediumAquamarine 适中的碧绿色 #00FA9A 0,250,154
  MediumSpringGreen 适中的春天的绿色 #F5FFFA 245,255,250
  MintCream 薄荷奶油 #00FF7F 0,255,127
  SpringGreen 春天的绿色 #3CB371 60,179,113
  SeaGreen 海洋绿 #2E8B57 46,139,87
  Honeydew 蜂蜜 #F0FFF0 240,255,240
  LightGreen 淡绿色 #90EE90 144,238,144
  PaleGreen 苍白的绿色 #98FB98 152,251,152
  DarkSeaGreen 深海洋绿 #8FBC8F 143,188,143
  LimeGreen 酸橙绿 #32CD32 50,205,50
  Lime 酸橙色 #00FF00 0,255,0
  ForestGreen 森林绿 #228B22 34,139,34
  Green 纯绿 #008000 0,128,0
  DarkGreen 深绿色 #006400 0,100,0
  Chartreuse 查特酒绿 #7FFF00 127,255,0
  LawnGreen 草坪绿 #7CFC00 124,252,0
  GreenYellow 绿黄色 #ADFF2F 173,255,47
  OliveDrab 橄榄土褐色 #556B2F 85,107,47
  Beige 米色(浅褐色) #6B8E23 107,142,35
  LightGoldenrodYellow 浅秋麒麟黄 #FAFAD2 250,250,210
  Ivory 象牙 #FFFFF0 255,255,240
  LightYellow 浅黄色 #FFFFE0 255,255,224
  Yellow 纯黄 #FFFF00 255,255,0
  Olive 橄榄 #808000 128,128,0
  DarkKhaki 深卡其布 #BDB76B 189,183,107
  LemonChiffon 柠檬薄纱 #FFFACD 255,250,205
  PaleGodenrod 灰秋麒麟 #EEE8AA 238,232,170
  Khaki 卡其布 #F0E68C 240,230,140
  Gold #FFD700 255,215,0
  Cornislk 玉米色 #FFF8DC 255,248,220
  GoldEnrod 秋麒麟 #DAA520 218,165,32
  FloralWhite 花的白色 #FFFAF0 255,250,240
  OldLace 老饰带 #FDF5E6 253,245,230
  Wheat 小麦色 #F5DEB3 245,222,179
  Moccasin 鹿皮鞋 #FFE4B5 255,228,181
  Orange 橙色 #FFA500 255,165,0
  PapayaWhip 番木瓜 #FFEFD5 255,239,213
  BlanchedAlmond 漂白的杏仁 #FFEBCD 255,235,205
  NavajoWhite Navajo白 #FFDEAD 255,222,173
  AntiqueWhite 古代的白色 #FAEBD7 250,235,215
  Tan 晒黑 #D2B48C 210,180,140
  BrulyWood 结实的树 #DEB887 222,184,135
  Bisque (浓汤)乳脂,番茄等 #FFE4C4 255,228,196
  DarkOrange 深橙色 #FF8C00 255,140,0
  Linen 亚麻布 #FAF0E6 250,240,230
  Peru 秘鲁 #CD853F 205,133,63
  PeachPuff 桃色 #FFDAB9 255,218,185
  SandyBrown 沙棕色 #F4A460 244,164,96
  Chocolate 巧克力 #D2691E 210,105,30
  SaddleBrown 马鞍棕色 #8B4513 139,69,19
  SeaShell 海贝壳 #FFF5EE 255,245,238
  Sienna 黄土赭色 #A0522D 160,82,45
  LightSalmon 浅鲜肉(鲑鱼)色 #FFA07A 255,160,122
  Coral 珊瑚 #FF7F50 255,127,80
  OrangeRed 橙红色 #FF4500 255,69,0
  DarkSalmon 深鲜肉(鲑鱼)色 #E9967A 233,150,122
  Tomato 番茄 #FF6347 255,99,71
  MistyRose 薄雾玫瑰 #FFE4E1 255,228,225
  Salmon 鲜肉(鲑鱼)色 #FA8072 250,128,114
  Snow #FFFAFA 255,250,250
  LightCoral 淡珊瑚色 #F08080 240,128,128
  RosyBrown 玫瑰棕色 #BC8F8F 188,143,143
  IndianRed 印度红 #CD5C5C 205,92,92
  Red 纯红 #FF0000 255,0,0
  Brown 棕色 #A52A2A 165,42,42
  FireBrick 耐火砖 #B22222 178,34,34
  DarkRed 深红色 #8B0000 139,0,0
  Maroon 栗色 #800000 128,0,0
  White 纯白 #FFFFFF 255,255,255
  WhiteSmoke 白烟 #F5F5F5 245,245,245
  Gainsboro Gainsboro #DCDCDC 220,220,220
  LightGrey 浅灰色 #D3D3D3 211,211,211
  Silver 银白色 #C0C0C0 192,192,192
  DarkGray 深灰色 #A9A9A9 169,169,169
  Gray 灰色 #808080 128,128,128
  DimGray 暗淡的灰色 #696969 105,105,105
  Black 纯黑 #000000 0,0,0

 

机器人 2008年1月8日 于 北京