<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>php程序员技术博客,关注PHP</title>
	<atom:link href="http://php.dayanmei.com/feed" rel="self" type="application/rss+xml" />
	<link>http://php.dayanmei.com</link>
	<description>专注于PHP技术</description>
	<lastBuildDate>Mon, 14 May 2012 02:28:01 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>php解压rar文件 php打包zip文件 源码php_rar.dll pclzip示例</title>
		<link>http://php.dayanmei.com/php_rar-dll_php_zip_pclzip_code.htm</link>
		<comments>http://php.dayanmei.com/php_rar-dll_php_zip_pclzip_code.htm#comments</comments>
		<pubDate>Mon, 14 May 2012 02:21:53 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[php zip压缩]]></category>
		<category><![CDATA[php_rar.dll]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=244</guid>
		<description><![CDATA[php解压rar文件 php打包zip文件 源码php_rar.dll pclzip示例

]]></description>
			<content:encoded><![CDATA[<p>php解压rar文件 php打包zip文件 源码php_rar.dll pclzip示例</p>
<pre name=code class=php>
<?php
define('ROOT_DIR','D:/web/');

$rar = '2012051008.rar';
$rar_name = basename($rar,'.rar');

$rar_file = rar_open(ROOT_DIR.$rar) or die("失败");
$entries = rar_list($rar_file);
$arr_name = array();
foreach($entries as $entry){
	$name = $entry->getName();
	if(substr($name,-4) == '.txt') {
		$entry->extract(ROOT_DIR);
		$arr_name[] = $name;
	}
}
rar_close($rar_file);

$arr_name = array('2012051008.txt','说明.txt');
$file = ROOT_DIR.$rar_name.'.zip';
require('./pclzip.lib.php');
$zip = new pclzip($file);
$list = $zip->create($arr_name);
if($list != 0) {
	foreach($arr_name as $key=>$val) {
		unlink(ROOT_DIR.$val);
	}
}
</pre>
<p>下载地址 http://download.csdn.net/detail/psdshow/4300064</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/php_rar-dll_php_zip_pclzip_code.htm/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>php.ini安全配置</title>
		<link>http://php.dayanmei.com/php-ini-safely.htm</link>
		<comments>http://php.dayanmei.com/php-ini-safely.htm#comments</comments>
		<pubDate>Thu, 26 Apr 2012 06:36:36 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=242</guid>
		<description><![CDATA[（1）打开php的安全模式
php的安全模式是个非常重要的内嵌的安全机制，能够控制一些php中的函数，比如system()，同时把很多文件操作函数进行了权限控制，也不允许对某些关键字文件的文件，比如/etc/passwd，但是默认的php.ini是没有打开安全模式的，我们把它打开：
safe_mode = on
（2）用户组安全
当safe_mode打开时，safe_mode_gid被关闭，那么php脚本能够对文件进行访问，而且相同组的用户也能够对文件进行访问。而且相同组的用户也能够对文件进行访问。
建议设置为：
safe_mode_gid = off
如果不进行设置，可能我们无法对我们服务器网站目录下的文件进行操作了，比如我们需要对文件进行操作的时候。
（3）安全模式下执行程序主目录
如果安全模式打开了，但是却是要执行某些程序的时候，可以指定要执行程序的主目录：
safe_mode_exec_dir = /usr/bin
一般情况下是不需要执行什么程序的，所以推荐不要执行系统程序目录，可以指向一个目录：然后把需要执行的程序拷贝过去，比如：
safe_mode_exec_dir = /temp/cmd
但是，我更推荐不要执行任何程序，那么就可以指向我们网页目录：
safe_mode_exec_dir = /usr/www
（4）安全模式下包含文件
如果要在安全模式下包含某些公共文件，那么就修改一下选项：
safe_mode_include_dir = /usr/www/include/
其实一般php脚本中包含文件都是在程序自己已经写好了，这个可以根据具体需要设置。
（5）控制php脚本能访问的目录
使用open_basedir选项能够控制PHP脚本只能访问指定的目录，这样能够避免PHP脚本访问不应该访问的文件，一定程序上显示了phpshell的危害，我们一般可以设置为只能访问网站目录：
open_basedir = /usr/www
（6）关闭危险函数
如果打开了安全模式，那么函数禁止是可以不需要的，但是我们为了安全还是考虑进去。比如，我们觉得不希望执行包括system()等在内的执行明了的php函数，或者能够查看php信息的phpinfo()等函数，那么我们就可以禁止它们：
disable_functions = system, passthru, exec, shell_exec, popen, phpinfo, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl
如果你要禁止任何文件和目录的操作，那么可以关闭很多文件操作
disable_functions = chdir, chroot, dir, getcwd, opendir, readdir, scandir, fopen, unlink, delete, copy, mkdir, rmdir, rename, file, file_get_contents, fputs, fwrite, chgrp,chmod, chown
以上只是列了部分比较常用的文件处理函数，你也可以把上面执行命令函数和这个函数结合，就能给抵制大部分的phpshell了。
（7）关闭php版本信息在http头中的泄露
我们为了防止黑客获取服务器中php版本的信息，可以关闭该信息泄露在http头中：
expose_php = off
比如黑客在 telnet www.girlcoding.com:80 的时候，那么将无法看到PHP的信息
（8）关闭注册全局变量
在PHP中提交的变量，包括使用POST或者GET提交的变量，都将自动注册为全局变量，能够直接访问，这是对服务器非常不安全的，所以我们不能让它注册为全局变量，就把注册全局变量选项关闭：
register_globals = off
当然，如果这样设置了，那么获取对应变量的时候就要采取合理方式，比如获取GET提交的变量var，那么就要用$_GET['var']来进行获取，这个php程序员要注意。
（9）打开magic_quotes_gpc来防止SQL注入
SQL注入是非常危险的问题，小则网站后台被入侵，重则整个服务器沦陷，所以一定要小心。php.ini中有一个设置：
magic_quotes_gpc [...]]]></description>
			<content:encoded><![CDATA[<p>（1）打开php的安全模式</p>
<p>php的安全模式是个非常重要的内嵌的安全机制，能够控制一些php中的函数，比如system()，同时把很多文件操作函数进行了权限控制，也不允许对某些关键字文件的文件，比如/etc/passwd，但是默认的php.ini是没有打开安全模式的，我们把它打开：</p>
<p>safe_mode = on</p>
<p>（2）用户组安全</p>
<p>当safe_mode打开时，safe_mode_gid被关闭，那么php脚本能够对文件进行访问，而且相同组的用户也能够对文件进行访问。而且相同组的用户也能够对文件进行访问。</p>
<p>建议设置为：</p>
<p>safe_mode_gid = off</p>
<p>如果不进行设置，可能我们无法对我们服务器网站目录下的文件进行操作了，比如我们需要对文件进行操作的时候。</p>
<p>（3）安全模式下执行程序主目录</p>
<p>如果安全模式打开了，但是却是要执行某些程序的时候，可以指定要执行程序的主目录：</p>
<p>safe_mode_exec_dir = /usr/bin</p>
<p>一般情况下是不需要执行什么程序的，所以推荐不要执行系统程序目录，可以指向一个目录：然后把需要执行的程序拷贝过去，比如：</p>
<p>safe_mode_exec_dir = /temp/cmd</p>
<p>但是，我更推荐不要执行任何程序，那么就可以指向我们网页目录：</p>
<p>safe_mode_exec_dir = /usr/www</p>
<p>（4）安全模式下包含文件</p>
<p>如果要在安全模式下包含某些公共文件，那么就修改一下选项：</p>
<p>safe_mode_include_dir = /usr/www/include/</p>
<p>其实一般php脚本中包含文件都是在程序自己已经写好了，这个可以根据具体需要设置。</p>
<p>（5）控制php脚本能访问的目录</p>
<p>使用open_basedir选项能够控制PHP脚本只能访问指定的目录，这样能够避免PHP脚本访问不应该访问的文件，一定程序上显示了phpshell的危害，我们一般可以设置为只能访问网站目录：</p>
<p>open_basedir = /usr/www</p>
<p>（6）关闭危险函数</p>
<p>如果打开了安全模式，那么函数禁止是可以不需要的，但是我们为了安全还是考虑进去。比如，我们觉得不希望执行包括system()等在内的执行明了的php函数，或者能够查看php信息的phpinfo()等函数，那么我们就可以禁止它们：</p>
<p>disable_functions = system, passthru, exec, shell_exec, popen, phpinfo, escapeshellarg, escapeshellcmd, proc_close, proc_open, dl</p>
<p>如果你要禁止任何文件和目录的操作，那么可以关闭很多文件操作</p>
<p>disable_functions = chdir, chroot, dir, getcwd, opendir, readdir, scandir, fopen, unlink, delete, copy, mkdir, rmdir, rename, file, file_get_contents, fputs, fwrite, chgrp,chmod, chown</p>
<p>以上只是列了部分比较常用的文件处理函数，你也可以把上面执行命令函数和这个函数结合，就能给抵制大部分的phpshell了。</p>
<p>（7）关闭php版本信息在http头中的泄露</p>
<p>我们为了防止黑客获取服务器中php版本的信息，可以关闭该信息泄露在http头中：</p>
<p>expose_php = off</p>
<p>比如黑客在 telnet www.girlcoding.com:80 的时候，那么将无法看到PHP的信息</p>
<p>（8）关闭注册全局变量</p>
<p>在PHP中提交的变量，包括使用POST或者GET提交的变量，都将自动注册为全局变量，能够直接访问，这是对服务器非常不安全的，所以我们不能让它注册为全局变量，就把注册全局变量选项关闭：</p>
<p>register_globals = off</p>
<p>当然，如果这样设置了，那么获取对应变量的时候就要采取合理方式，比如获取GET提交的变量var，那么就要用$_GET['var']来进行获取，这个php程序员要注意。</p>
<p>（9）打开magic_quotes_gpc来防止SQL注入</p>
<p>SQL注入是非常危险的问题，小则网站后台被入侵，重则整个服务器沦陷，所以一定要小心。php.ini中有一个设置：</p>
<p>magic_quotes_gpc = off</p>
<p>这个默认是关闭的，如果它打开后将自动把用户提交对sql的查询进行转换，比如把’转为\’等，这对防止sql注入有很大作用，所以我们推荐设置为：</p>
<p>magic_quotes_gpc = off</p>
<p>有次程序在本地的上传不好用了，但在服务器上好使~也可能是继承了discuz的核心文件造成的，获取路径出现了问题，后来打开这个参数，问题解决了。</p>
<p>（10）错误信息控制</p>
<p>一般php在没有连接到数据库或者其他情况下会有错误提示，一般错误信息中会包含php脚本当前的路径信息或者查询的SQL语句等信息，这类信息提供给黑客后，是不安全的，所以一般服务器建议禁止错误提示：</p>
<p>display_errors = Off</p>
<p>如果你确实要显示错误信息，一定要设置显示错误的级别，比如只显示警告以上的信息：</p>
<p>error_reporting = E_WARNING &#038; E_ERROR</p>
<p>当然，我还是建议关闭错误提示。</p>
<p>（11）错误日志</p>
<p>建议在关闭display_errors后能够把是错误信息记录下来，便于查找服务器运行的原因：</p>
<p>log_errors = On</p>
<p>同时也要设置错误日志存放的目录，建议根apache的日志存在一起：</p>
<p>error_log = /usr/local/apache2/logs/php_error.log</p>
<p>注意：给文件必须允许apache用户或组具有写的权限。</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/php-ini-safely.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux 变更一个参数 全站压缩输出，大大压缩文件</title>
		<link>http://php.dayanmei.com/linux-output_handler-ob_gzhandler.htm</link>
		<comments>http://php.dayanmei.com/linux-output_handler-ob_gzhandler.htm#comments</comments>
		<pubDate>Fri, 20 Apr 2012 03:41:01 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[ob_gzhandler]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=235</guid>
		<description><![CDATA[由于主要是文本文件，很适合压缩，因此尝试修改了一个php配置参数
全站启用ob_gzhandler压缩
output_handler = ob_gzhandler
一个网页原来640k,压缩后只有58k
经过几天的观察，在IP和PV数量基本稳定的情况下，流量消耗下降一半多

但是内存占用较多，而且还使用了系统swap,不是好现象，如果内存较多的情况下可以使用此功能
]]></description>
			<content:encoded><![CDATA[<p>由于主要是文本文件，很适合压缩，因此尝试修改了一个php配置参数<br />
全站启用ob_gzhandler压缩<br />
output_handler = ob_gzhandler<br />
一个网页原来640k,压缩后只有58k</p>
<p>经过几天的观察，在IP和PV数量基本稳定的情况下，流量消耗下降一半多<br />
<a href="http://php.dayanmei.com/uploads/2012/04/graphs.jpg"><img src="http://php.dayanmei.com/uploads/2012/04/graphs.jpg" alt="" title="graphs" width="455" height="274" class="alignnone size-full wp-image-238" /></a></p>
<p>但是内存占用较多，而且还使用了系统swap,不是好现象，如果内存较多的情况下可以使用此功能</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/linux-output_handler-ob_gzhandler.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linux ls 按文件大小排序</title>
		<link>http://php.dayanmei.com/linux-ls-sort-by-size.htm</link>
		<comments>http://php.dayanmei.com/linux-ls-sort-by-size.htm#comments</comments>
		<pubDate>Wed, 18 Apr 2012 04:54:58 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[ls]]></category>
		<category><![CDATA[sort]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=233</guid>
		<description><![CDATA[ls -hla &#124;sort -n -k 5
]]></description>
			<content:encoded><![CDATA[<p>ls -hla |sort -n -k 5</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/linux-ls-sort-by-size.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>内存文件系统使用及示例:ramdisk, ramfs, tmpfs</title>
		<link>http://php.dayanmei.com/ramdisk-ramfs-tmpfs.htm</link>
		<comments>http://php.dayanmei.com/ramdisk-ramfs-tmpfs.htm#comments</comments>
		<pubDate>Tue, 03 Apr 2012 07:51:40 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=231</guid>
		<description><![CDATA[第一部分
在Linux中可以将一部分内存mount为分区来使用，通常称之为RamDisk。
RamDisk有三种实现方式：
第一种就是传统意义上的，可以格式化，然后加载。
这在Linux内核2.0/2.2就已经支持，其不足之处是大小固定，之后不能改变。
为了能够使用Ramdisk，我们在编译内核时须将block device中的Ramdisk支持选上，它下面还有两个选项，一个是设定Ramdisk的大小，默认是4096k；另一个是initrd的支持。
如果对Ramdisk的支持已经编译进内核，我们就可以使用它了：
查看一下可用的RamDisk，使用ls /dev/ram*
首先创建一个目录，比如test，运行mkdir /mnt/test；
然后对/dev/ram0 创建文件系统，运行mke2fs /dev/ram0；
最后挂载 /dev/ram0，运行mount /dev/ram /mnt/test，就可以象对普通硬盘一样对它进行操作了。 
更详细的内容可以参考： http://www.linuxfocus.org/ChineseGB/November1999/article124.html                                             [...]]]></description>
			<content:encoded><![CDATA[<p>第一部分<br />
在Linux中可以将一部分内存mount为分区来使用，通常称之为RamDisk。<br />
RamDisk有三种实现方式：<br />
第一种就是传统意义上的，可以格式化，然后加载。<br />
这在Linux内核2.0/2.2就已经支持，其不足之处是大小固定，之后不能改变。<br />
为了能够使用Ramdisk，我们在编译内核时须将block device中的Ramdisk支持选上，它下面还有两个选项，一个是设定Ramdisk的大小，默认是4096k；另一个是initrd的支持。<br />
如果对Ramdisk的支持已经编译进内核，我们就可以使用它了：<br />
查看一下可用的RamDisk，使用ls /dev/ram*<br />
首先创建一个目录，比如test，运行mkdir /mnt/test；<br />
然后对/dev/ram0 创建文件系统，运行mke2fs /dev/ram0；<br />
最后挂载 /dev/ram0，运行mount /dev/ram /mnt/test，就可以象对普通硬盘一样对它进行操作了。 </p>
<p>更详细的内容可以参考： http://www.linuxfocus.org/ChineseGB/November1999/article124.html                                                 http://www.vanemery.com/Linux/Ramdisk/ramdisk.html </p>
<p>另两种则是内核2.4才支持的，通过Ramfs或者Tmpfs来实现：<br />
它们不需经过格式化，用起来灵活，其大小随所需要的空间而增加或减少。 </p>
<p>Ramfs顾名思义是内存文件系统，它它处于虚拟文件系统（VFS）层，而不像ramdisk那样基于虚拟在内存中的其他文件系统(ex2fs)。 </p>
<p>因而，它无需格式化，可以创建多个，只要内存足够，在创建时可以指定其最大能使用的内存大小。<br />
如果你的Linux已经将Ramfs编译进内核，你就可以很容易地使用Ramfs了。创建一个目录，加载Ramfs到该目录即可：<br />
                  # mkdir  /testRam<br />
                  # mount -t ramfs none /testRAM<br />
缺省情况下，Ramfs被限制最多可使用内存大小的一半。可以通过maxsize（以kbyte为单位）选项来改变。<br />
                  # mount -t ramfs none /testRAM -o maxsize=2000 (创建了一个限定最大使用内存为2M的ramdisk） </p>
<p>Tmpfs是一个虚拟内存文件系统，它不同于传统的用块设备形式来实现的Ramdisk，也不同于针对物理内存的Ramfs。<br />
  Tmpfs可以使用物理内存，也可以使用交换分区。在Linux内核中，虚拟内存资源由物理内存（RAM）和交换分区组成，这些资源是由内核中的虚拟内存子系统来负责分配和管理。<br />
  Tmpfs向虚拟内存子系统请求页来存储文件，它同Linux的其它请求页的部分一样，不知道分配给自己的页是在内存中还是在交换分区中。同Ramfs一样，其大小也不是固定的，而是随着所需要的空间而动态的增减。<br />
   使用tmpfs，首先你编译内核时得选择&#8221;虚拟内存文件系统支持（Virtual memory filesystem support）&#8221; 。<br />
  然后就可以加载tmpfs文件系统了：<br />
            # mkdir -p /mnt/tmpfs<br />
            # mount tmpfs /mnt/tmpfs -t tmpfs<br />
  同样可以在加载时指定tmpfs文件系统大小的最大限制：<br />
           # mount tmpfs /mnt/tmpfs -t tmpfs -o size=32m </p>
<p>使用df -aT命令可以看到有个/dev/shm目录，该目录的文件系统是tmpfs的，因此这个目录下的文件访问是非常快的，但是其大小可能不同机器都不一样，而且每次重启后文件也就丢失了。 </p>
<p>第二部分<br />
LINUX下我所接触过的内存文件系统有三个:</p>
<p>(1)ramdisk,使用前需要先创建文件系统,并且调整文件系统大小比较麻烦,需要修改内核引导参数并重新启动操作系统,在繁杂多变的应用与需要 7X24不间断运行的系统来说,并不是一个可以接受的选择.好处是自2.0版本起内核便支持(这也算好处?嗯,确实算,如果你手头真有这样的系统的话)</p>
<p>(2)ramfs,使用前不需要去创建文件系统了,直接通过mount的方式即可挂载上来用,需要的时候可以使用&#8221;mount -o remount,maxsize=&#8230;&#8221;这种方式来调整大小.</p>
<p>(3)tmpfs,同ramfs在表面上基本上一样啦,不同于ramfs针对&#8221;物理内存&#8221;,tmpfs是在虚拟内存下分配空间的,也就是说tmpfs实例中存储的文件既可能存在于物理内存中,也可能存在于交换分区中,具体存在哪里,是由&#8221;虚拟内存子系统&#8221;来调度的.</p>
<p>纯性能角度讲,ramfs会在进程占用内存使用较多的情况下会优于tmpfs,在没有交换分区或进程占用内存较小而不发生swap行为的情况下,两者性能不会有差异(这个结论没有实测过,我&#8221;想当然&#8221;用猜的)</p>
<p>基本情况介绍完毕,下面介绍tmpfs的应用,(没办法,我手头机器内存不是那么宽裕&#8230;)</p>
<p>0,根据需要创建挂载目录,例:</p>
<p>mkdir -p $DIR_TMP;</p>
<p>1,挂载</p>
<p>mount my_tmpfs $DIR_TMP -t tmpfs -o size=512m</p>
<p>my_tmpfs这个名字需要起,一个标识而已,会出现在df 的Filesytem一列,起个别致点的名字比较容易被自己写的其它监控脚本找到,如果非要起个none或tmpfs之类的名字的话&#8230;反正系统默认挂载的tmpfs都比较喜欢用这两个名字,好坏自己琢磨吧.</p>
<p>成功以后自己用df 看一下就知道了,写监控脚本时可以用&#8221;df -t tmpfs|grep ^my_tmpfs&#8221;来找到这一行.</p>
<p>2,调整</p>
<p>应用中如果感觉不合适,随时可以用mount命令调整</p>
<p>mount $DIR_TMP -o remount,size=1024m,nr_inodes=100k</p>
<p>nr_inodes为最大节点数,如果你的$DIR_TMP使用df命令查看明明有空间,却无法创建新文件(例如touch一个新文件),可能是文件节点用到上限了,可以用&#8221;df -i&#8221;命令来查看,如果是有空间但节点达到上限,就需要用nr_inodes来调整了.</p>
<p>其它可以调整的参数:<br />
mode,uid,gid,<br />
        uid和gid就不多说了,不知道的回家补基础,mode也不多说了,取值是3个八进制数字,表示许可权限,不知道这个的也回家&#8230;<br />
其它参数,参见mount命令的man page之OPTIONS一节中&#8221;-o&#8221;参数的说明.</p>
<p>3,卸载</p>
<p>umount $DIR_TMP</p>
<p>4,其它</p>
<p>mount 命令的man page中对tmpfs提及不多,详细一些的文档,请参阅内核文档Documentation/filesystems/tmpfs.txt(内核源代码目录内)</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/ramdisk-ramfs-tmpfs.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>editplus正则表达式查找用法</title>
		<link>http://php.dayanmei.com/editplus.htm</link>
		<comments>http://php.dayanmei.com/editplus.htm#comments</comments>
		<pubDate>Sat, 31 Mar 2012 02:33:21 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[editplus]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=229</guid>
		<description><![CDATA[网上搜集了些实例
正则表达式是一个查询的字符串，它包含一般的字符和一些特殊的字符，特殊字符可以扩展查找字符串的能力，正则表达式在查找和替换字符串的作用不可忽视，它能很好提高工作效率。
EditPlus的查找，替换，文件中查找支持以下的正则表达式：
Expression Description
\t Tab character.
\n New line.
. Matches any character.
&#124; Either expression on its left and right side matches the target string.
For example, &#8220;a&#124;b&#8221; matches &#8220;a&#8221; and &#8220;b&#8221;.
[] Any of the enclosed characters may match the target character.
For example, &#8220;[ab]&#8221; matches &#8220;a&#8221; and &#8220;b&#8221;. &#8220;[0-9]&#8221; matches any digit.
[^] None of the enclosed characters may match the [...]]]></description>
			<content:encoded><![CDATA[<p>网上搜集了些实例</p>
<p>正则表达式是一个查询的字符串，它包含一般的字符和一些特殊的字符，特殊字符可以扩展查找字符串的能力，正则表达式在查找和替换字符串的作用不可忽视，它能很好提高工作效率。</p>
<p>EditPlus的查找，替换，文件中查找支持以下的正则表达式：</p>
<p>Expression Description<br />
\t Tab character.<br />
\n New line.<br />
. Matches any character.<br />
| Either expression on its left and right side matches the target string.<br />
For example, &#8220;a|b&#8221; matches &#8220;a&#8221; and &#8220;b&#8221;.<br />
[] Any of the enclosed characters may match the target character.<br />
For example, &#8220;[ab]&#8221; matches &#8220;a&#8221; and &#8220;b&#8221;. &#8220;[0-9]&#8221; matches any digit.<br />
[^] None of the enclosed characters may match the target character.<br />
For example, &#8220;[^ab]&#8221; matches all character EXCEPT &#8220;a&#8221; and &#8220;b&#8221;.<br />
&#8220;[^0-9]&#8221; matches any non-digit character.<br />
* Character to the left of asterisk in the expression should match 0 or more times.<br />
For example &#8220;be*&#8221; matches &#8220;b&#8221;, &#8220;be&#8221; and &#8220;bee&#8221;.<br />
+ Character to the left of plus sign in the expression should match 1 or more times.<br />
For example &#8220;be+&#8221; matches &#8220;be&#8221; and &#8220;bee&#8221; but not &#8220;b&#8221;.<br />
? Character to the left of question mark in the expression should match 0 or 1 time.<br />
For example &#8220;be?&#8221; matches &#8220;b&#8221; and &#8220;be&#8221; but not &#8220;bee&#8221;.<br />
^ Expression to the right of ^ matches only when it is at the beginning of line.<br />
For example &#8220;^A&#8221; matches an &#8220;A&#8221; that is only at the beginning of line.<br />
$ Expression to the left of $ matches only when it is at the end of line.<br />
For example &#8220;e$&#8221; matches an &#8220;e&#8221; that is only at the end of line.<br />
() Affects evaluation order of expression and also used for tagged expression.<br />
\ scape character. If you want to use character &#8220;\&#8221; itself, you should use &#8220;\\&#8221;.</p>
<p>例子：</p>
<p>原始串<br />
str[1]abc[991];<br />
str[2]abc[992];<br />
str[11]abc[993];<br />
str[22]abc[994];<br />
str[111]abc[995];<br />
str[222]abc[996];<br />
str[1111]abc[997];<br />
str[2222]abc[999];</p>
<p>目标串：<br />
abc[1];<br />
abc[2];<br />
abc[11];<br />
abc[22];<br />
abc[111];<br />
abc[222];<br />
abc[1111];<br />
abc[2222];</p>
<p>处理：<br />
查找串：str\[([0-9]+)\]abc\[[0-9]+\]<br />
替换串：abc[\1]</p>
<p>【1】正则表达式应用——替换指定内容到行尾<br />
原始文本如下面两行<br />
abc aaaaa<br />
123 abc 444</p>
<p>希望每次遇到“abc”，则替换“abc”以及其后到行尾的内容为“abc efg”<br />
即上面的文本最终替换为：<br />
abc efg<br />
123 abc efg</p>
<p>解决：<br />
① 在替换对话框，查找内容里输入“abc.*”<br />
② 同时勾选“正则表达式”复选框，然后点击“全部替换”按钮<br />
其中，符号的含义如下：<br />
“.” ＝匹配任意字符<br />
“*” ＝匹配0次或更多</p>
<p>注意：其实就是正则表达式替换，这里只是把一些曾经提出的问题加以整理，单纯从正则表达式本身来说，就可以引申出成千上万种特例。</p>
<p>【2】正则表达式应用——数字替换<br />
希望把<br />
asdadas123asdasdas456asdasdasd789asdasd<br />
替换为:<br />
asdadas[123]asdasdas[456]asdasdasd[789]asdasd</p>
<p>在替换对话框里面，勾选“正则表达式”复选框；<br />
在查找内容里面输入“[0-9][0-9][0-9]”，不含引号<br />
“替换为:”里面输入“[\0\1\2]”，不含引号<br />
范围为你所操作的范围，然后选择替换即可。</p>
<p>实际上这也是正则表达式的使用特例，“[0-9]”表示匹配0～9之间的任何特例，同样“[a-z]”就表示匹配a～z之间的任何特例<br />
上面重复使用了“[0-9]”，表示连续出现的三个数字<br />
“\0”代表第一个“[0-9]”对应的原型，“\1”代表第二个“[0-9]”对应的原型，依此类推<br />
“[”、“]”为单纯的字符，表示添加“[”或“]”，如果输入“其它\0\1\2其它”，则替换结果为：</p>
<p>asdadas其它123其它asdasdas其它456其它asdasdasd其它789其它asdasd</p>
<p>功能增强（by jiuk2k）：<br />
如果将查找内容“[0-9][0-9][0-9]”改为“[0-9]*[0-9]”，对应1 或 123 或 12345 或 …<br />
大家根据需要定制</p>
<p>相关内容还有很多，可以自己参考正则表达式的语法仔细研究一下</p>
<p>【3】正则表达式应用——删除每一行行尾的指定字符<br />
因为这几个字符在行中也是出现的,所以肯定不能用简单的替换实现<br />
比如<br />
12345 1265345<br />
2345<br />
需要删除每行末尾的“345”<br />
这个也算正则表达式的用法，其实仔细看正则表达式应该比较简单，不过既然有这个问题提出，说明对正则表达式还得有个认识过程，解决方法如下<br />
解决：<br />
在替换对话框中，启用“正则表达式”复选框<br />
在查找内容里面输入“345$”<br />
这里“$”表示从行尾匹配</p>
<p>如果从行首匹配，可以用“^”来实现，不过 EditPlus 有另一个功能可以很简单的删除行首的字符串<br />
a. 选择要操作的行<br />
b. 编辑－格式－删除行注释<br />
c. 在弹出对话框里面输入要清除的行首字符，确定</p>
<p>【4】正则表达式应用——替换带有半角括号的多行<br />
几百个网页中都有下面一段代码：<br />
\n<br />
在替换对话框启用“正则表达式”选项，这时就可以完成替换了</p>
<p>【5】正则表达式应用——删除空行<br />
启动EditPlus，打开待处理的文本类型文件。<br />
①、选择“查找”菜单的“替换”命令，弹出文本替换对话框。选中“正则表达式”复选框，表明我们要在查找、替换中使用正则表达式。然后，选中“替换范围”中的“当前文件”，表明对当前文件操作。<br />
②、单击“查找内容”组合框右侧的按钮，出现下拉菜单。<br />
③、下面的操作添加正则表达式，该表达式代表待查找的空行。（技巧提示：空行仅包括空格符、制表符、回车符，且必须以这三个符号之一作为一行的开头，并且以回车符结尾，查找空行的关键是构造代表空行的正则表达式）。<br />
直接在”查找”中输入正则表达式“^[ \t]*\n”，注意\t前有空格符。<br />
（1）选择“从行首开始匹配”，“查找内容”组合框中出现字符“^”，表示待查找字符串必须出现在文本中一行的行首。<br />
（2）选择“字符在范围中”，那么在“^”后会增加一对括号“[]”，当前插入点在括号中。括号在正则表达式中表示，文本中的字符匹配括号中任意一个字符即符合查找条件。<br />
（3）按一下空格键，添加空格符。空格符是空行的一个组成成分。<br />
（4）选择“制表符”，添加代表制表符的“\t”。<br />
（5）移动光标，将当前插入点移到“]”之后，然后选择“匹配 0 次或更多”，该操作会添加星号字符“*”。星号表示，其前面的括号“[]”内的空格符或制表符，在一行中出现0个或多个。<br />
（6）选择“换行符”，插入“\n”，表示回车符。<br />
④、“替换为”组合框保持空，表示删除查找到的内容。单击“替换”按钮逐个行删除空行，或单击“全部替换”按钮删除全部空行（注意：EditPlus有时存在“全部替换”不能一次性完全删除空行的问题，可能是程序BUG，需要多按几次按钮）。</p>
<p>1.在汉化的时候，是否经常碰到这样的语句需要翻译：</p>
<p>Code:<br />
&#8220;Error adding the post!&#8221;;<br />
&#8220;Error adding the comment!&#8221;;<br />
&#8220;Error adding the user!&#8221;;</p>
<p>如果有很多类似的文件一个一个翻译显然很累而且感觉很无聊。</p>
<p>其实可以这样处理，在Editplus里面用 替换 功能，在替换对话框选中“正则表达式”复选框：<br />
查找原文件：</p>
<p>Code:<br />
&#8220;Error adding ([^!|"|;]*)</p>
<p>替换成：</p>
<p>Code:<br />
&#8220;在增加\1时发生错误</p>
<p>这样替换之后发生了什么？结果是：</p>
<p>Code:<br />
&#8220;在增加the post时发生错误!&#8221;;<br />
&#8220;在增加the comment时发生错误!&#8221;;<br />
&#8220;在增加the user时发生错误!&#8221;;</p>
<p>ok，接下来你会怎么做？当然再替换一次把the post、the comment、the user替换成你要翻译的词。得到最后的结果：</p>
<p>Code:<br />
&#8220;在增加帖子时发生错误!&#8221;;<br />
&#8220;在增加评论时发生错误!&#8221;;<br />
&#8220;在增加用户时发生错误!&#8221;;</p>
<p>2.要提取的单词在中间，比如：</p>
<p>Code:<br />
can not be deleted because<br />
can not be added because<br />
can not be updating because</p>
<p>可以用这种方式：<br />
在Editplus里面用 替换 功能，在替换对话框选中“正则表达式”复选框：<br />
查找原文件：</p>
<p>Code:<br />
can not be ([^ ]*) because</p>
<p>替换成：</p>
<p>Code:<br />
无法被\1因为</p>
<p>这样替换之后发生了什么？结果是：</p>
<p>Code:<br />
无法被deleted因为<br />
无法被added因为<br />
无法被updating因为</p>
<p>其余步骤如上。</p>
<p>在汉化量很大而且句式比较单调的情况下对效率的提高很明显！</p>
<p>解释一下：([^!|"|;]*) 的意思是 不等于 ! 和 &#8221; 和 ; 中的任何一个，意思就是这3个字符之外的所有字符将被选中（替换区域）；<br />
\1 即被选中的替换区域所在的新位置（复制到这个新位置）。</p>
<p>3.经常手工清理一行一行地删除文本文件里面的空白行，其实可以交给Editplus更好的完成，在Editplus里面用替换功能，在替换对话框选中“正则表达式”复选框：<br />
查找原文件：</p>
<p>Code:<br />
^[ \t]*\n</p>
<p>替换部分为空就可以删除空白行了，执行一下看看：）</p>
<p>abandon[2'b9nd2n]v.抛弃，放弃<br />
abandonment[2'b9nd2nm2nt]n.放弃<br />
abbreviation[2bri:vi'ei62n]n.缩写<br />
abeyance[2'bei2ns]n.缓办，中止<br />
abide[2'baid]v.遵守<br />
ability[2'biliti]n.能力<br />
able['eibl]adj.有能力的，能干的<br />
abnormal[9b'n0:m2l]adj.反常的，变态的<br />
aboard[2'b0:d]adv.船(车)上</p>
<p>1.<br />
查找: (^[a-zA-Z0-0\-]+)(\[*.*\]+)(.*)<br />
替换: @@@@@&#8221;\1&#8243;,&#8221;\2&#8243;,&#8221;\3&#8243;,<br />
效果:<br />
@@@@@&#8221;abandon&#8221;,&#8221;[2'b9nd2n]&#8220;,&#8221;v.抛弃，放弃&#8221;,<br />
@@@@@&#8221;abandonment&#8221;,&#8221;[2'b9nd2nm2nt]&#8220;,&#8221;n.放弃&#8221;,<br />
@@@@@&#8221;abbreviation&#8221;,&#8221;[2bri:vi'ei62n]&#8220;,&#8221;n.缩写&#8221;,<br />
@@@@@&#8221;abeyance&#8221;,&#8221;[2'bei2ns]&#8220;,&#8221;n.缓办，中止&#8221;,<br />
@@@@@&#8221;abide&#8221;,&#8221;[2'baid]&#8220;,&#8221;v.遵守&#8221;,<br />
@@@@@&#8221;ability&#8221;,&#8221;[2'biliti]&#8220;,&#8221;n.能力&#8221;,<br />
@@@@@&#8221;able&#8221;,&#8221;['eibl]&#8220;,&#8221;adj.有能力的，能干的&#8221;,<br />
@@@@@&#8221;abnormal&#8221;,&#8221;[9b'n0:m2l]&#8220;,&#8221;adj.反常的，变态的&#8221;,<br />
@@@@@&#8221;aboard&#8221;,&#8221;[2'b0:d]&#8220;,&#8221;adv.船(车)上&#8221;,</p>
<p>2.<br />
查找: \n<br />
替换:<br />
注: 要次替换内容为空<br />
效果:<br />
@@@@@&#8221;abandon&#8221;,&#8221;[2'b9nd2n]&#8220;,&#8221;v.抛弃，放弃&#8221;,@@@@@&#8221;abandonment&#8221;,&#8221;[2'b9nd2nm2nt]&#8220;,&#8221;n.放弃&#8221;,@@@@@&#8221;abbreviation&#8221;,&#8221;[2bri:vi'ei62n]&#8220;,&#8221;n.缩写&#8221;,@@@@@&#8221;abeyance&#8221;,&#8221;[2'bei2ns]&#8220;,&#8221;n.缓办，中止&#8221;,@@@@@&#8221;abide&#8221;,&#8221;[2'baid]&#8220;,&#8221;v.遵守&#8221;,@@@@@&#8221;ability&#8221;,&#8221;[2'biliti]&#8220;,&#8221;n.能力&#8221;,@@@@@&#8221;able&#8221;,&#8221;['eibl]&#8220;,&#8221;adj.有能力的，能干的&#8221;,@@@@@&#8221;abnormal&#8221;,&#8221;[9b'n0:m2l]&#8220;,&#8221;adj.反常的，变态的&#8221;,@@@@@&#8221;aboard&#8221;,&#8221;[2'b0:d]&#8220;,&#8221;adv.船(车)上&#8221;,@@@@@&#8221;abolish&#8221;,&#8221;[2'b0li6]&#8220;,&#8221;v.废除，取消&#8221;,@@@@@&#8221;abolition&#8221;,&#8221;[9b2'li62n]&#8220;,&#8221;n.废除，取消&#8221;</p>
<p>3.<br />
查找: @@@@@<br />
替换: \n<br />
效果:<br />
&#8220;abandon&#8221;,&#8221;[2'b9nd2n]&#8220;,&#8221;v.抛弃，放弃&#8221;,<br />
&#8220;abandonment&#8221;,&#8221;[2'b9nd2nm2nt]&#8220;,&#8221;n.放弃&#8221;,<br />
&#8220;abbreviation&#8221;,&#8221;[2bri:vi'ei62n]&#8220;,&#8221;n.缩写&#8221;,<br />
&#8220;abeyance&#8221;,&#8221;[2'bei2ns]&#8220;,&#8221;n.缓办，中止&#8221;,<br />
&#8220;abide&#8221;,&#8221;[2'baid]&#8220;,&#8221;v.遵守&#8221;,<br />
&#8220;ability&#8221;,&#8221;[2'biliti]&#8220;,&#8221;n.能力&#8221;,<br />
&#8220;able&#8221;,&#8221;['eibl]&#8220;,&#8221;adj.有能力的，能干的&#8221;,<br />
&#8220;abnormal&#8221;,&#8221;[9b'n0:m2l]&#8220;,&#8221;adj.反常的，变态的&#8221;,<br />
&#8220;aboard&#8221;,&#8221;[2'b0:d]&#8220;,&#8221;adv.船(车)上&#8221;,<br />
&#8220;abolish&#8221;,&#8221;[2'b0li6]&#8220;,&#8221;v.废除，取消&#8221;,</p>
<p>4. 任务完成</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/editplus.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>直接拷贝文件备份数据库注意事项</title>
		<link>http://php.dayanmei.com/cp-backup-mysql-database.htm</link>
		<comments>http://php.dayanmei.com/cp-backup-mysql-database.htm#comments</comments>
		<pubDate>Thu, 22 Mar 2012 16:30:32 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=226</guid>
		<description><![CDATA[1.FLUSH TABLES WITH READ LOCK;
2.开始拷贝文件
3.UNLOCK TABLES;
]]></description>
			<content:encoded><![CDATA[<p>1.FLUSH TABLES WITH READ LOCK;<br />
2.开始拷贝文件<br />
3.UNLOCK TABLES;</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/cp-backup-mysql-database.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>mysql 命令行show processlist;</title>
		<link>http://php.dayanmei.com/mysql-show-processlist.htm</link>
		<comments>http://php.dayanmei.com/mysql-show-processlist.htm#comments</comments>
		<pubDate>Thu, 22 Mar 2012 13:38:36 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[show processlist]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=224</guid>
		<description><![CDATA[mysql 命令行show processlist;
查看进程
show processlist\G;
则显示完整进程信息
杀死进程 kill 进程ID 就可以了 
]]></description>
			<content:encoded><![CDATA[<p>mysql 命令行show processlist;<br />
查看进程<br />
show processlist\G;<br />
则显示完整进程信息</p>
<p>杀死进程 kill 进程ID 就可以了 </p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/mysql-show-processlist.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>scp备份公匙</title>
		<link>http://php.dayanmei.com/scp%e5%a4%87%e4%bb%bd%e5%85%ac%e5%8c%99.htm</link>
		<comments>http://php.dayanmei.com/scp%e5%a4%87%e4%bb%bd%e5%85%ac%e5%8c%99.htm#comments</comments>
		<pubDate>Mon, 26 Dec 2011 15:58:08 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>
		<category><![CDATA[scp备份]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=221</guid>
		<description><![CDATA[1、scp在建立连接中是需要密码认证的，所以我们第一步就是添加ssh公匙。
ssh终端运行
ssh-keygen -t rsa
　　结果如下
　　Generating public/private rsa key pair.
　　Enter file in which to save the key (/home/.username/ssh/id_rsa):#回车
　　Enter passphrase (empty for no passphrase):#回车
　　Enter same passphrase again:#回车
　　Your identification has been saved in /home/.username /.ssh/id_rsa.
　　Your public key has been saved in /home/.username /.ssh/id_rsa.pub.
　　The key fingerprint is:
　　38:25:c1:4d:5d:d3:89:bb:46:67:bf:52:af:c3:17:0c username@localhost
　　Generating RSA keys:
　　Key generation complete.
　　会在用户目录~/.ssh/产生两个文件，id_rsa，id_rsa.pub
2.是把本地(10.1.1.1)主机上的id_rsa.pub文件拷贝到远程linux(10.1.1.2)主机的root用户主目录下的.ssh目录下,并且改名为authorized_keys
　　即：
scp /root/.ssh/id_rsa.pub root@10.1.1.2:/root/.ssh/authorized_keys
　　这样在本地linux(10.1.1.1)主机上使用scp命令复制文件到远程linux主机(10.1.1.2)上将不提示输入密码了，直接复制了。反之亦然！
（为了安全建议将authorized_keys属性变更为600）
3.创建一个sh文件 vi backup.sh
#!/bin/bash
cd /var/www/html/backup
#定义备份名字 bbs和home 设定每月备份一次 备份完就删除
BbsBakName=Bbs_$(date +&#8221;%Y%m%d&#8221;).tar.gz
#打包Ningyuan文件
tar [...]]]></description>
			<content:encoded><![CDATA[<p>1、scp在建立连接中是需要密码认证的，所以我们第一步就是添加ssh公匙。<br />
ssh终端运行</p>
<p>ssh-keygen -t rsa<br />
　　结果如下<br />
　　Generating public/private rsa key pair.<br />
　　Enter file in which to save the key (/home/.username/ssh/id_rsa):#回车<br />
　　Enter passphrase (empty for no passphrase):#回车<br />
　　Enter same passphrase again:#回车<br />
　　Your identification has been saved in /home/.username /.ssh/id_rsa.<br />
　　Your public key has been saved in /home/.username /.ssh/id_rsa.pub.<br />
　　The key fingerprint is:<br />
　　38:25:c1:4d:5d:d3:89:bb:46:67:bf:52:af:c3:17:0c username@localhost<br />
　　Generating RSA keys:<br />
　　Key generation complete.<br />
　　会在用户目录~/.ssh/产生两个文件，id_rsa，id_rsa.pub<br />
2.是把本地(10.1.1.1)主机上的id_rsa.pub文件拷贝到远程linux(10.1.1.2)主机的root用户主目录下的.ssh目录下,并且改名为authorized_keys<br />
　　即：</p>
<p>scp /root/.ssh/id_rsa.pub root@10.1.1.2:/root/.ssh/authorized_keys<br />
　　这样在本地linux(10.1.1.1)主机上使用scp命令复制文件到远程linux主机(10.1.1.2)上将不提示输入密码了，直接复制了。反之亦然！<br />
（为了安全建议将authorized_keys属性变更为600）</p>
<p>3.创建一个sh文件 vi backup.sh<br />
#!/bin/bash<br />
cd /var/www/html/backup</p>
<p>#定义备份名字 bbs和home 设定每月备份一次 备份完就删除<br />
BbsBakName=Bbs_$(date +&#8221;%Y%m%d&#8221;).tar.gz</p>
<p>#打包Ningyuan文件<br />
tar zcf /var/www/html/backup/$BbsBakName /var/www/html/domain.me<br />
#拷贝到远程服务器<br />
scp -P 22 /var/www/html/backup/$BbsBakName root@127.0.0.1:/var/www/html/backup/<br />
#删除文件<br />
rm -rf /var/www/html/backup/$BbsBakName</p>
<p>4.增加可执行权限 chmod +x backup.sh</p>
<p>5.加入计划任务 crontab -e 每天凌晨1点10分执行<br />
10 1 * * * /var/www/html/backup/backup.sh</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/scp%e5%a4%87%e4%bb%bd%e5%85%ac%e5%8c%99.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在IBM开发者上看到一个 敏捷开发的小故事</title>
		<link>http://php.dayanmei.com/agile-development-story.htm</link>
		<comments>http://php.dayanmei.com/agile-development-story.htm#comments</comments>
		<pubDate>Wed, 16 Nov 2011 06:26:33 +0000</pubDate>
		<dc:creator>老李</dc:creator>
				<category><![CDATA[php]]></category>

		<guid isPermaLink="false">http://php.dayanmei.com/?p=218</guid>
		<description><![CDATA[举个例子，大家更好的理解敏捷是如何被实践的，我们说一说运用敏捷方法完成一次家庭出游计划：
这有一家四口人要出游了，首先敏捷规划，我们大致规划出我们去几天呢？要去什么地方？ 一家几口人出行？ 坐什么交通工具呢？ 而还有个终极目标：那就是保证大家的绝对愉悦，增进家人感情和安全按时的返回。 
大致目标规划好了就可以开展了，并且呢，我们将这次出行定为4天，第一天主要完成去的工作，第二三天在目的地玩耍，第四天返回。 
在行程中了，我们虽然规划了大致方向，但是可能遇到堵车啦、修路啦等突发事件，于是我们必要情况下要选择其他路线，还有，你的stakeholder们可能有许多新点子，比如你的孩子希望在河边停下来看看风景啦，你的妻子希望在经过一座城市的时候进去那里的博物馆参观啦。总之、你的行程、事件、速度都可能被突发情况所影响。而随着调整的过程，仍然达到满足大家开开心心、安全按时返回的目标就对了。 
最后，值得提醒，要合理安排休息时间，保证项目进展的可持续性。 
这就是个很好运用敏捷的例子。
]]></description>
			<content:encoded><![CDATA[<p>举个例子，大家更好的理解敏捷是如何被实践的，我们说一说运用敏捷方法完成一次家庭出游计划：<br />
这有一家四口人要出游了，首先敏捷规划，我们大致规划出我们去几天呢？要去什么地方？ 一家几口人出行？ 坐什么交通工具呢？ 而还有个终极目标：那就是保证大家的绝对愉悦，增进家人感情和安全按时的返回。 </p>
<p>大致目标规划好了就可以开展了，并且呢，我们将这次出行定为4天，第一天主要完成去的工作，第二三天在目的地玩耍，第四天返回。 </p>
<p>在行程中了，我们虽然规划了大致方向，但是可能遇到堵车啦、修路啦等突发事件，于是我们必要情况下要选择其他路线，还有，你的stakeholder们可能有许多新点子，比如你的孩子希望在河边停下来看看风景啦，你的妻子希望在经过一座城市的时候进去那里的博物馆参观啦。总之、你的行程、事件、速度都可能被突发情况所影响。而随着调整的过程，仍然达到满足大家开开心心、安全按时返回的目标就对了。 </p>
<p>最后，值得提醒，要合理安排休息时间，保证项目进展的可持续性。 </p>
<p>这就是个很好运用敏捷的例子。</p>
]]></content:encoded>
			<wfw:commentRss>http://php.dayanmei.com/agile-development-story.htm/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

