<?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>半瓶</title>
	<atom:link href="http://www.banping.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.banping.com</link>
	<description>一瓶子不满  半瓶子晃荡</description>
	<lastBuildDate>Wed, 09 May 2012 08:19:08 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>使用Linux管道批量删除Redis的key</title>
		<link>http://www.banping.com/2012/04/17/linux-pipe-redis-key-del/</link>
		<comments>http://www.banping.com/2012/04/17/linux-pipe-redis-key-del/#comments</comments>
		<pubDate>Tue, 17 Apr 2012 04:02:23 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1056</guid>
		<description><![CDATA[<p>Redis并没有提供批量删除记录的方法，这有时候很不方便，特别是重新初始化数据的时候。一般有两种做法：</p> <p>如果业务场景明确，可以通过DBID进行区分，Redis默认的DBID是0，默认的配置文件是有16个DB，可以在应用中通过select方法指定数据库的ID进行存取。然后通过FlushDB命令能清空某个ID的数据库，达到重新初始化的目的。</p> <p>如果某个ID的数据库已经有很多类型的记录了，无法整个库清空，那么就需要批量的删除key值，这时可以采用Linux管道，比如我要删除DBID为1的test开头的key值：</p> <p>[root@banping redis]# /banping/redis/src/redis-cli -n 1 keys "test*" &#124; xargs /banping/redis/src/redis-cli -n 1 del<br /> (integer) 5095</p> <p>把keys的输出作为del的输入，这样就批量删除了。</p> <p>附redis-cli 命令：</p> <p>redis-cli 2.4.2</p> <p>Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]<br /> -h Server hostname (default: 127.0.0.1)<br /> -p Server port (default: 6379)<br /> -s Server socket (overrides hostname and port)<br /> -a Password to [...]]]></description>
			<content:encoded><![CDATA[<p>Redis并没有提供批量删除记录的方法，这有时候很不方便，特别是重新初始化数据的时候。一般有两种做法：</p>
<p>如果业务场景明确，可以通过DBID进行区分，Redis默认的DBID是0，默认的配置文件是有16个DB，可以在应用中通过select方法指定数据库的ID进行存取。然后通过FlushDB命令能清空某个ID的数据库，达到重新初始化的目的。</p>
<p>如果某个ID的数据库已经有很多类型的记录了，无法整个库清空，那么就需要批量的删除key值，这时可以采用Linux管道，比如我要删除DBID为1的test开头的key值：</p>
<blockquote><p>[root@banping redis]# /banping/redis/src/redis-cli -n 1 keys "test*" | xargs /banping/redis/src/redis-cli -n 1 del<br />
(integer) 5095</p></blockquote>
<p>把keys的输出作为del的输入，这样就批量删除了。</p>
<p>附redis-cli 命令：</p>
<blockquote><p>redis-cli 2.4.2</p>
<p>Usage: redis-cli [OPTIONS] [cmd [arg [arg ...]]]<br />
-h Server hostname (default: 127.0.0.1)<br />
-p Server port (default: 6379)<br />
-s Server socket (overrides hostname and port)<br />
-a Password to use when connecting to the server<br />
-r Execute specified command N times<br />
-i When -r is used, waits seconds per command.<br />
It is possible to specify sub-second times like -i 0.1.<br />
-n Database number<br />
-x Read last argument from STDIN<br />
-d Multi-bulk delimiter in for raw formatting (default: \n)<br />
--raw Use raw formatting for replies (default when STDOUT is not a tty)<br />
--latency Enter a special mode continuously sampling latency.<br />
--help Output this help and exit<br />
--version Output version and exit</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/04/17/linux-pipe-redis-key-del/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>MySQL的wait_timeout参数太小导致表级锁失效</title>
		<link>http://www.banping.com/2012/04/07/mysql-wait_timeout-lock-tables/</link>
		<comments>http://www.banping.com/2012/04/07/mysql-wait_timeout-lock-tables/#comments</comments>
		<pubDate>Sat, 07 Apr 2012 11:22:20 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1050</guid>
		<description><![CDATA[<p>如果想让某个表只读不能被修改，可以在MySQL Server层面加表级锁：</p> <p>mysql&#62; lock tables sms read;<br /> Query OK, 0 rows affected (0.01 sec)</p> <p>然后其他的连接去更新或插入数据是不会成功的：</p> <p>mysql&#62; insert into sms(id) values (555);</p> <p>因为要等待表级锁的释放，可以通过processlist看到这一点：</p> <p>mysql&#62; show processlist;<br /> +--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+<br /> &#124; Id &#124; User &#124; Host &#124; db &#124; Command &#124; Time &#124; State &#124; Info &#124;<br /> +--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+ &#124;<br /> &#124; 364733 &#124; root &#124; [...]]]></description>
			<content:encoded><![CDATA[<p>如果想让某个表只读不能被修改，可以在MySQL Server层面加表级锁：</p>
<blockquote><p>mysql&gt; lock tables sms read;<br />
Query OK, 0 rows affected (0.01 sec)</p></blockquote>
<p>然后其他的连接去更新或插入数据是不会成功的：</p>
<blockquote><p>mysql&gt; insert into sms(id) values (555);</p></blockquote>
<p>因为要等待表级锁的释放，可以通过processlist看到这一点：</p>
<blockquote><p>mysql&gt; show processlist;<br />
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+<br />
| Id | User | Host | db | Command | Time | State | Info |<br />
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+ |<br />
| 364733 | root | localhost | banpingdb | Query | 0 | NULL | show processlist |<br />
| 364734 | root | localhost | banpingdb | Query | 148 | Waiting for table level lock | insert into sms(id) values (555) |<br />
+--------+-------------+---------------------+---------------+---------+------+-------------------------------------------+-----------------------------------------+<br />
2 rows in set (0.00 sec)</p></blockquote>
<p>当然，更详细的信息也可以看到：</p>
<blockquote><p>mysql&gt; show engine innodb status \G<br />
------------<br />
TRANSACTIONS<br />
------------<br />
Trx id counter 5AA0D8A<br />
Purge done for trx's n:o &lt; 5AA0D77 undo n:o &lt; 0<br />
History list length 1063<br />
LIST OF TRANSACTIONS FOR EACH SESSION:<br />
---TRANSACTION 0, not started, process no 21967, OS thread id 1286076736<br />
mysql tables in use 1, locked 1<br />
MySQL thread id 364734, query id 3527582 localhost root Waiting for table level lock<br />
insert into sms(id) values (555)<br />
---TRANSACTION 0, not started, process no 21967, OS thread id 1284471104<br />
mysql tables in use 1, locked 1<br />
MySQL thread id 364733, query id 3527604 localhost root<br />
show engine innodb status</p></blockquote>
<p>但是，今天奇怪的发现，在等待了一段时间后，insert语句竟然莫名其妙的成功了，分析了一下原因。并没有什么地方控制表级锁的超时，就是因为表级锁被释放了，才能使得insert成功，而表级锁被释放的源头就是wait_timeout参数，这个参数的意思是：</p>
<blockquote><p>The number of seconds the server waits for activity on a noninteractive connection before closing it.</p></blockquote>
<p>如果这个值设置的小，比如说一分钟，那么一分钟后，不活动的连接就会被释放，而连接的释放会导致这个连接发出的表级锁被解锁。如果你的系统里这个参数很小，下面的这些信息一定是你经常看到的：</p>
<blockquote><p>ERROR 2006 (HY000): MySQL server has gone away<br />
No connection. Trying to reconnect...<br />
Connection id: 364743<br />
Current database: banpingdb</p></blockquote>
<p>这个错误提示的就是连接超时了重新连的意思。<br />
还有另外一个参数是interactive_timeout，是针对interactive connection的超时时间，但是在global层面设置这个值会引起wait_timeout的连带改变。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/04/07/mysql-wait_timeout-lock-tables/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>如何在mac下长期使用SecureCRT</title>
		<link>http://www.banping.com/2012/03/30/mac-securecrt/</link>
		<comments>http://www.banping.com/2012/03/30/mac-securecrt/#comments</comments>
		<pubDate>Fri, 30 Mar 2012 02:21:54 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1039</guid>
		<description><![CDATA[<p>SecureCRT是一个优秀的收费的工具，一个License貌似是99美金。但是不少人不愿意花钱买软件使用，于是破解大行其道。</p> <p>Windows下的破解版很多了，但是Mac下貌似很少，搜了一下，在网上找到一个可用的针对6.7.3发破解版，过程如下：</p> <p>一、首先去官网下载SecureCRT 6.7.3 for mac 版本。</p> <p>二、去一个热心网友的<a href="http://suddymail.org/attachment.php?id=116" target="_blank">网站</a>下载patch。</p> <p>三、执行以下命令：</p> <p>sudo chmod -R 777 /Applications/SecureCRT.app/Contents/MacOS</p> <p>四、运行patch程序，点击select Application选择已经安装好的SecureCRT.app，等待Patch完成。</p> <p>五、使用补丁内附带的序列号注册即可。</p> <p>六、如果无法保存密码，在SecureCRT的Preferences选择Terminalx下的Advanced，把Mac Options选型的Use KeyChain打勾去掉。</p> <p>本人并不推荐使用破解软件，如果想省钱，可以使用替代方案，比如iterm2。</p>]]></description>
			<content:encoded><![CDATA[<p>SecureCRT是一个优秀的收费的工具，一个License貌似是99美金。但是不少人不愿意花钱买软件使用，于是破解大行其道。</p>
<p>Windows下的破解版很多了，但是Mac下貌似很少，搜了一下，在网上找到一个可用的针对6.7.3发破解版，过程如下：</p>
<p>一、首先去官网下载SecureCRT 6.7.3 for mac 版本。</p>
<p>二、去一个热心网友的<a href="http://suddymail.org/attachment.php?id=116" target="_blank">网站</a>下载patch。</p>
<p>三、执行以下命令：</p>
<p>sudo chmod -R 777 /Applications/SecureCRT.app/Contents/MacOS</p>
<p>四、运行patch程序，点击select Application选择已经安装好的SecureCRT.app，等待Patch完成。</p>
<p>五、使用补丁内附带的序列号注册即可。</p>
<p>六、如果无法保存密码，在SecureCRT的Preferences选择Terminalx下的Advanced，把Mac Options选型的Use KeyChain打勾去掉。</p>
<p>本人并不推荐使用破解软件，如果想省钱，可以使用替代方案，比如iterm2。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/03/30/mac-securecrt/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>如何使用Amazon的邮件服务SES</title>
		<link>http://www.banping.com/2012/03/19/amazon-aws-ses/</link>
		<comments>http://www.banping.com/2012/03/19/amazon-aws-ses/#comments</comments>
		<pubDate>Mon, 19 Mar 2012 11:54:49 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1042</guid>
		<description><![CDATA[<p>云服务提供商Amazon有一项邮件服务，叫做SES（Simple Email Service），如果不想搭建自己的邮件系统，使用这个服务是很不错的一个选择。本文记录如何使用这项服务。</p> <p>首先需要去Amazon AWS注册一个账号，然后就可以使用这项服务了，首先需要验证几个邮箱进行测试用，可以是用PHP或者Java、Perl等语言编写程序发送邮件，测试完成后，就可以申请转到生产环境，审批申请的时间是一个工作日内，具体官网上都有介绍，比较简单。</p> <p>SES提供了三种API方式进行交互，一种是SendMail，一种是SendRawMail，还有是传统的SMTP方式，可以按需使用。</p> <p>如果使用JAVA和SES通信，需要使用官方的SDK，即aws-java-sdk-1.3.5.jar这个包，还需要Apache的httpclient包，也就是httpcore-4.1.4.jar和httpclient-4.1.3.jar这两个jar包。</p> <p>在测试过程中发现SES代发的邮件会被一些邮件服务商评断为垃圾邮件，进入了垃圾箱，比如163。为了解决这个问题，可以给邮件服务增加SPF、SenderID和DKIM验证，测试证明前两者基本被163忽略，而能解决问题的就是DKIM，有了这个DKIM，Gmail在显示邮件信息的时候甚至会把默认出现的amazon代发的头部信息去掉，很棒。关于DKIM，我<a href="http://www.banping.com/2011/07/19/postfix-dkim/" target="_blank">以前的一篇文章</a>曾经介绍过，不过那是和Postfix整合的，这次是要通过应用程序来调用，要注意的是，使用DKIM功能必需使用SendRawMail接口来发邮件。</p> <p>增加SPF和SenderID的方法就是在DNS上增加以下TXT记录：</p> <p>v=spf1 include:amazonses.com ?all</p> <p>spf2.0/pra include:amazonses.com ?all</p> <p>增加DKIM功能，需要先生成密钥：</p> <p>[root@dev banping]# openssl genrsa -out banping.private 1024</p> <p>[root@dev banping]# openssl rsa -in banping.private -out banping.public -pubout -outform PEM</p> <p>然后把public key添加到DNS记录里：</p> <p> 主机记录：s1._domainkey.mail</p> <p>内容：k=rsa;t=y;p=......（public key内容）</p> <p>对于如何使用private key进行签名，可以使用Apache James项目提供的一个包<a href="http://james.apache.org/download.cgi#Apache_jDKIM" target="_blank">JDKIM</a>，需要apache-jdkim-library-0.2.jar、apache-jdkim-mailets-0.2.jar、apache-mime4j-core-0.7.jar和apache-mime4j-dom-0.7.jar四个JAR文件。</p> <p>特别要注意的是，JDKIM不能使用原始的Private key，必需经过格式转换和编码，我今天大部分时间都花在了处理这个问题上，因为官方文档并没有说这些，或者说了我没发现，后来看JDKIM的源码才发现了问题所在：</p> <p>[root@dev banping]# openssl pkcs8 -topk8 -inform PEM [...]]]></description>
			<content:encoded><![CDATA[<p>云服务提供商Amazon有一项邮件服务，叫做SES（Simple Email Service），如果不想搭建自己的邮件系统，使用这个服务是很不错的一个选择。本文记录如何使用这项服务。</p>
<p>首先需要去Amazon AWS注册一个账号，然后就可以使用这项服务了，首先需要验证几个邮箱进行测试用，可以是用PHP或者Java、Perl等语言编写程序发送邮件，测试完成后，就可以申请转到生产环境，审批申请的时间是一个工作日内，具体官网上都有介绍，比较简单。</p>
<p>SES提供了三种API方式进行交互，一种是SendMail，一种是SendRawMail，还有是传统的SMTP方式，可以按需使用。</p>
<p>如果使用JAVA和SES通信，需要使用官方的SDK，即aws-java-sdk-1.3.5.jar这个包，还需要Apache的httpclient包，也就是httpcore-4.1.4.jar和httpclient-4.1.3.jar这两个jar包。</p>
<p>在测试过程中发现SES代发的邮件会被一些邮件服务商评断为垃圾邮件，进入了垃圾箱，比如163。为了解决这个问题，可以给邮件服务增加SPF、SenderID和DKIM验证，测试证明前两者基本被163忽略，而能解决问题的就是DKIM，有了这个DKIM，Gmail在显示邮件信息的时候甚至会把默认出现的amazon代发的头部信息去掉，很棒。关于DKIM，我<a href="http://www.banping.com/2011/07/19/postfix-dkim/" target="_blank">以前的一篇文章</a>曾经介绍过，不过那是和Postfix整合的，这次是要通过应用程序来调用，要注意的是，使用DKIM功能必需使用SendRawMail接口来发邮件。</p>
<p>增加SPF和SenderID的方法就是在DNS上增加以下TXT记录：</p>
<blockquote><p>v=spf1 include:amazonses.com ?all</p>
<p>spf2.0/pra include:amazonses.com ?all</p></blockquote>
<p>增加DKIM功能，需要先生成密钥：</p>
<blockquote><p>[root@dev banping]# openssl genrsa -out banping.private 1024</p>
<p>[root@dev banping]# openssl rsa -in banping.private -out banping.public -pubout -outform PEM</p></blockquote>
<p>然后把public key添加到DNS记录里：</p>
<blockquote><p> 主机记录：s1._domainkey.mail</p>
<p>内容：k=rsa;t=y;p=......（public key内容）</p></blockquote>
<p>对于如何使用private key进行签名，可以使用Apache James项目提供的一个包<a href="http://james.apache.org/download.cgi#Apache_jDKIM" target="_blank">JDKIM</a>，需要apache-jdkim-library-0.2.jar、apache-jdkim-mailets-0.2.jar、apache-mime4j-core-0.7.jar和apache-mime4j-dom-0.7.jar四个JAR文件。</p>
<p>特别要注意的是，JDKIM不能使用原始的Private key，必需经过格式转换和编码，我今天大部分时间都花在了处理这个问题上，因为官方文档并没有说这些，或者说了我没发现，后来看JDKIM的源码才发现了问题所在：</p>
<blockquote><p>[root@dev banping]# openssl pkcs8 -topk8 -inform PEM -in banping.private -outform DER -nocrypt -out rsapriv.der</p>
<p>[root@dev banping]# base64 rsapriv.der</p></blockquote>
<p>把base64转码后的输出作为private key参数传给JDKIM的对应函数就可以了，同时，DNS里记录的信息要和这里加密的头信息保持一致，比如在DKIM_HEADER_TEMPLATE里记录：</p>
<blockquote><p>s=s1; d=mail.banping.com</p></blockquote>
<p>否则邮件接收方在验证DNS信息的时候不匹配，认证会无法通过。还有就是发件人无法显示中文，会乱码，邮件标题和内容里的中文乱码的问题，可以通过设置utf-8解决。</p>
<p>update 20120330 ：如果你的用于发送邮箱配置了腾讯的企业邮箱，那么发送到QQ邮箱的邮件列表会显示Amazon的发件地址，同时会提示此邮件地址未验证之类的信息，解决的办法是不要使用腾讯的企业邮箱。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/03/19/amazon-aws-ses/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>TechClub第六次技术沙龙小记</title>
		<link>http://www.banping.com/2012/02/29/techclub-share-6/</link>
		<comments>http://www.banping.com/2012/02/29/techclub-share-6/#comments</comments>
		<pubDate>Wed, 29 Feb 2012 12:18:05 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1037</guid>
		<description><![CDATA[<p>上周日，TechClub第六次技术沙龙在<a href="http://weibo.com/atcafeme" target="_blank">@爱特咖啡</a>举行，这次报名的人很多，最后到场的大概有40多位朋友，大家度过了一个愉快的下午，一场技术的盛宴。</p> <p>这次活动的技术话题是国内知名，国际上也有很多用户的两个开源项目，手机游戏引擎<a href="http://www.cocos2d-x.org" target="_blank">cocos2d-x</a>和高性能web app server，基于Nginx的<a href="http://www.openresty.org" target="_blank">openresty</a>。两位讲师来自两个项目的研发团队或主导人员，绝对是重量级的分享。</p> <p>张彬（来自cocos2d-x，捕鱼达人研发团队）分享的第一个话题：</p> <p></p> <p>&#160;</p> <p>技术大牛,openresty项目发起人 <a href="http://weibo.com/agentzh" target="_blank">@agentzh</a> 带来的第二个话题：</p> <p></p> <p>&#160;</p> <p>春哥开发的很多Nginx模块有很多国际知名的互联网公司在用，今天听了现场分享，确实太给力了，效率没的说。</p> <p>希望以后能邀请到更多这样的朋友来和大家分享技术，学然后知不足，交流才能进步。</p> <p>更多分享资料请移步TechClub官网：http://www.tech-club.org/?p=247</p>]]></description>
			<content:encoded><![CDATA[<p>上周日，TechClub第六次技术沙龙在<a href="http://weibo.com/atcafeme" target="_blank">@爱特咖啡</a>举行，这次报名的人很多，最后到场的大概有40多位朋友，大家度过了一个愉快的下午，一场技术的盛宴。</p>
<p>这次活动的技术话题是国内知名，国际上也有很多用户的两个开源项目，手机游戏引擎<a href="http://www.cocos2d-x.org" target="_blank">cocos2d-x</a>和高性能web app server，基于Nginx的<a href="http://www.openresty.org" target="_blank">openresty</a>。两位讲师来自两个项目的研发团队或主导人员，绝对是重量级的分享。</p>
<p>张彬（来自cocos2d-x，捕鱼达人研发团队）分享的第一个话题：</p>
<p><img class="alignnone" title="cocos2d-x" src="http://ww3.sinaimg.cn/bmiddle/61fe8dbdjw1dqfo5g94xsj.jpg" alt="" width="440" height="586" /></p>
<p>&nbsp;</p>
<p>技术大牛,openresty项目发起人 <a href="http://weibo.com/agentzh" target="_blank">@agentzh</a> 带来的第二个话题：</p>
<p><img class="alignnone" title="openresty" src="http://ww2.sinaimg.cn/large/620a994ajw1dqfs05d7wxj.jpg" alt="" width="648" height="364" /></p>
<p>&nbsp;</p>
<p>春哥开发的很多Nginx模块有很多国际知名的互联网公司在用，今天听了现场分享，确实太给力了，效率没的说。</p>
<p>希望以后能邀请到更多这样的朋友来和大家分享技术，学然后知不足，交流才能进步。</p>
<p>更多分享资料请移步TechClub官网：http://www.tech-club.org/?p=247</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/02/29/techclub-share-6/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>过年</title>
		<link>http://www.banping.com/2012/01/22/2012-spring-festival/</link>
		<comments>http://www.banping.com/2012/01/22/2012-spring-festival/#comments</comments>
		<pubDate>Sun, 22 Jan 2012 15:57:30 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1029</guid>
		<description><![CDATA[<p>正在过年。</p> <p>外面下着雨，冷雨。</p> <p>撑一纸雨伞，回到空旷的房子里。</p> <p>空旷而幽暗，听见金鱼的呼吸。</p> <p>感悟，想要说些什么，却不知从何说起。</p> <p>电梯里，ONLY SMS.</p> <p>不想看春晚了，没有坚持的心情和欲望。</p> <p>RT上，微博上，流淌着节日的时光。</p> <p>翻了翻前几天的日子，模糊而碎片。</p> <p>时间溜走了。</p> <p>就在那弹指一挥。</p> <p>翻看david的博客，想象他怎样的被青春打湿双眼。</p> <p>想象那无法回到的过去，之中的人和事。</p> <p>其实，一个人经历的，正是大多数人经历的，</p> <p>所以，世界上 ，才会有共鸣。</p> <p>所以，诗人才会钟爱某一种水果。（亦或植物？）</p> <p>所以，81才会面对年复一年的问题。</p> <p>所以，张导和八达才能把简单的情节演绎的刻骨，</p> <p>因为，那就是他，或他们自己。</p> <p>桌上的mac，竟然没有去折腾它的欲望，</p> <p>还一直没打开。</p> <p>鞭炮，让我想起黄洋界上的诗句。</p> <p>有时候，生活应是如此的简单，平和，感恩，幸福。</p> <p>有时候，情绪却是魔鬼。</p> <p>这正是鲜活动人生啊，</p> <p>无需去刻意的改变，和逃避。</p> <p>在纯粹的时间里看书，</p> <p>竟然获得意外的充实，</p> <p>我，其实很容易满足。</p> <p>------------------我是华丽的分割线----------------------</p> <p>一直没有心情和时间来想和看。</p> <p>我常说，不仅要埋头做事，更要抬头看路。</p> <p>方向很重要，</p> <p>得过且过的生活态度，</p> <p>会麻木一个人的心灵，</p> <p>所以，每个人要有目标，要去学习。</p> <p>为了现在，为了将来。</p> <p>为了自己，为了团队。</p> <p>那天，和古怪精灵的幸子吃全家福，</p> <p>在街上找奖状而不是荣誉证书，</p> <p>在花店里讨价还价，</p> <p>在忙碌。</p> <p>其实一直心怀感恩，</p> <p>在这样的一个团队里很开心，</p> <p>那一起走过的岁月，</p> <p>和小黑屋里的每一个人。</p> <p>无怨无悔，但是要努力。</p> <p>机会，压力，责任。</p> <p>------------------我是华丽的分割线----------------------</p> <p>想去鼓浪屿走走，</p> <p>一直有很多值得发现的痕迹，</p> <p>而以后，或许上岛的机会就不多了，</p> <p>不想遗憾，</p> [...]]]></description>
			<content:encoded><![CDATA[<p>正在过年。</p>
<p>外面下着雨，冷雨。</p>
<p>撑一纸雨伞，回到空旷的房子里。</p>
<p>空旷而幽暗，听见金鱼的呼吸。</p>
<p>感悟，想要说些什么，却不知从何说起。</p>
<p>电梯里，ONLY SMS.</p>
<p>不想看春晚了，没有坚持的心情和欲望。</p>
<p>RT上，微博上，流淌着节日的时光。</p>
<p>翻了翻前几天的日子，模糊而碎片。</p>
<p>时间溜走了。</p>
<p>就在那弹指一挥。</p>
<p>翻看david的博客，想象他怎样的被青春打湿双眼。</p>
<p>想象那无法回到的过去，之中的人和事。</p>
<p>其实，一个人经历的，正是大多数人经历的，</p>
<p>所以，世界上 ，才会有共鸣。</p>
<p>所以，诗人才会钟爱某一种水果。（亦或植物？）</p>
<p>所以，81才会面对年复一年的问题。</p>
<p>所以，张导和八达才能把简单的情节演绎的刻骨，</p>
<p>因为，那就是他，或他们自己。</p>
<p>桌上的mac，竟然没有去折腾它的欲望，</p>
<p>还一直没打开。</p>
<p>鞭炮，让我想起黄洋界上的诗句。</p>
<p>有时候，生活应是如此的简单，平和，感恩，幸福。</p>
<p>有时候，情绪却是魔鬼。</p>
<p>这正是鲜活动人生啊，</p>
<p>无需去刻意的改变，和逃避。</p>
<p>在纯粹的时间里看书，</p>
<p>竟然获得意外的充实，</p>
<p>我，其实很容易满足。</p>
<p>------------------我是华丽的分割线----------------------</p>
<p>一直没有心情和时间来想和看。</p>
<p>我常说，不仅要埋头做事，更要抬头看路。</p>
<p>方向很重要，</p>
<p>得过且过的生活态度，</p>
<p>会麻木一个人的心灵，</p>
<p>所以，每个人要有目标，要去学习。</p>
<p>为了现在，为了将来。</p>
<p>为了自己，为了团队。</p>
<p>那天，和古怪精灵的幸子吃全家福，</p>
<p>在街上找奖状而不是荣誉证书，</p>
<p>在花店里讨价还价，</p>
<p>在忙碌。</p>
<p>其实一直心怀感恩，</p>
<p>在这样的一个团队里很开心，</p>
<p>那一起走过的岁月，</p>
<p>和小黑屋里的每一个人。</p>
<p>无怨无悔，但是要努力。</p>
<p>机会，压力，责任。</p>
<p>------------------我是华丽的分割线----------------------</p>
<p>想去鼓浪屿走走，</p>
<p>一直有很多值得发现的痕迹，</p>
<p>而以后，或许上岛的机会就不多了，</p>
<p>不想遗憾，</p>
<p>亦或，</p>
<p>想度过这闲暇时间。</p>
<p>想过不一样的生活，</p>
<p>自由和梦想。</p>
<p>现在，</p>
<p>在过年，</p>
<p>这一刻，烟花绚烂。</p>
<p><a href="http://www.banping.com/wp-content/uploads/2012/01/beautiful.png"><img class="aligncenter size-full wp-image-1033" title="烟花绚烂" src="http://www.banping.com/wp-content/uploads/2012/01/beautiful.png" alt="" width="542" height="475" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/01/22/2012-spring-festival/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从2011到2012</title>
		<link>http://www.banping.com/2012/01/01/from-2011-to-2012/</link>
		<comments>http://www.banping.com/2012/01/01/from-2011-to-2012/#comments</comments>
		<pubDate>Sun, 01 Jan 2012 03:42:27 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[随笔]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1027</guid>
		<description><![CDATA[<p>今天是2012年的第一天，元旦佳节，过去的2011虽然已经成为历史，但是依然是值得铭记的时光。</p> <p>昨天是2011年的最后一天，遭遇了诸多的不顺利。</p> <p>在下班的路上，车很拥堵，虽然我出来的已经很晚了，可是还是被这个车堵在了路上：</p> <p></p> <p>后来终于到了天虹，在地下二层停车场找了很久也没有找到停车位，爆满了，中间还接了Jimmy一个电话。最后终于在一个角落把车停了下来，耗时N久。</p> <p>在天虹买了些东西，结果小票不小心丢掉了，本来凭小票是可以免费停车的，没办法只能乖乖的交停车费出来。</p> <p>在出口的路上一样拥堵，各种车各种抢道，凭借极大的耐心好不容易才杀出重围。</p> <p>回家煮面吃，想开一瓶酒，结果不小心酒瓶打落在地，摔得粉碎，满屋酒气。</p> <p>希望，这些小小的不顺利就停留在2011，不再追随。</p> <p>徐志摩说：</p> <p>轻轻的，我走了，正如我轻轻的来，</p> <p>我轻轻的挥手，作别西天的云彩。</p> <p>没有人能阻挡时光匆匆的脚步，我们能做的，唯有珍惜和感恩。</p> <p>因为那曾经虚度的青春，永远永远不再回来。</p> <p>2012会更好，因为路，就在脚下，需要留下我们的足迹。</p>]]></description>
			<content:encoded><![CDATA[<p>今天是2012年的第一天，元旦佳节，过去的2011虽然已经成为历史，但是依然是值得铭记的时光。</p>
<p>昨天是2011年的最后一天，遭遇了诸多的不顺利。</p>
<p>在下班的路上，车很拥堵，虽然我出来的已经很晚了，可是还是被这个车堵在了路上：</p>
<p><img class="alignnone" title="2011的最后一天路上" src="http://ww1.sinaimg.cn/large/620a994ajw1dom24oa6dcj.jpg" alt="" width="364" height="648" /></p>
<p>后来终于到了天虹，在地下二层停车场找了很久也没有找到停车位，爆满了，中间还接了Jimmy一个电话。最后终于在一个角落把车停了下来，耗时N久。</p>
<p>在天虹买了些东西，结果小票不小心丢掉了，本来凭小票是可以免费停车的，没办法只能乖乖的交停车费出来。</p>
<p>在出口的路上一样拥堵，各种车各种抢道，凭借极大的耐心好不容易才杀出重围。</p>
<p>回家煮面吃，想开一瓶酒，结果不小心酒瓶打落在地，摔得粉碎，满屋酒气。</p>
<p>希望，这些小小的不顺利就停留在2011，不再追随。</p>
<p>徐志摩说：</p>
<p>轻轻的，我走了，正如我轻轻的来，</p>
<p>我轻轻的挥手，作别西天的云彩。</p>
<p>没有人能阻挡时光匆匆的脚步，我们能做的，唯有珍惜和感恩。</p>
<p>因为那曾经虚度的青春，永远永远不再回来。</p>
<p>2012会更好，因为路，就在脚下，需要留下我们的足迹。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2012/01/01/from-2011-to-2012/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>MySQL主从复制出错案例一则</title>
		<link>http://www.banping.com/2011/12/15/mysql-replication-error/</link>
		<comments>http://www.banping.com/2011/12/15/mysql-replication-error/#comments</comments>
		<pubDate>Thu, 15 Dec 2011 12:11:13 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1021</guid>
		<description><![CDATA[<p>有时候为了方面的导入数据，可以使用MyISAM存储引擎的表，直接把数据文件Copy一份放到对应的目录下，这样MySQL就能直接识别到，但是在主从复制的环境里这样做是有问题的，因为在从库上并没有这个表，从而导致后续的一些操作失败，比如在主库上执行导入数据的SQL语句，则在从库会报错如下：</p> <p>mysql&#62; show slave status\G<br /> Slave_IO_Running: Yes<br /> Slave_SQL_Running: No<br /> Last_Errno: 1146<br /> Last_Error: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br /> SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br /> group by b.id'</p> <p>同样的信息通过日志也一样会看到：</p> <p>111215 19:17:54 [ERROR] Slave SQL: Error 'Table 'banpingdb.blog_score' doesn't [...]]]></description>
			<content:encoded><![CDATA[<p>有时候为了方面的导入数据，可以使用MyISAM存储引擎的表，直接把数据文件Copy一份放到对应的目录下，这样MySQL就能直接识别到，但是在主从复制的环境里这样做是有问题的，因为在从库上并没有这个表，从而导致后续的一些操作失败，比如在主库上执行导入数据的SQL语句，则在从库会报错如下：</p>
<blockquote><p>mysql&gt; show slave status\G<br />
Slave_IO_Running: Yes<br />
Slave_SQL_Running: No<br />
Last_Errno: 1146<br />
Last_Error: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br />
SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br />
group by b.id'</p></blockquote>
<p>同样的信息通过日志也一样会看到：</p>
<blockquote><p>111215 19:17:54 [ERROR] Slave SQL: Error 'Table 'banpingdb.blog_score' doesn't exist' on query. Default database: 'banpingdb'. Query: 'replace INTO blog_score_result(id,score,avg)<br />
SELECT b.id, min(s.comment), min(s.price) FROM blog_score s,a_blog b where s.name=b.biz_name<br />
group by b.id', Error_code: 1146<br />
111215 19:17:54 [Warning] Slave: Table 'banpingdb.blog_score' doesn't exist Error_code: 1146<br />
111215 19:17:54 [ERROR] Error running query, slave SQL thread aborted. Fix the problem, and restart the slave SQL thread with "SLAVE START". We stopped at log '1-bin.000001' position 130482476</p></blockquote>
<p>这种错误处理也很简单，可以直接跳过，当然要评估可能产生的影响：</p>
<blockquote><p>mysql&gt; slave stop;<br />
Query OK, 0 rows affected (0.22 sec)</p>
<p>mysql&gt; SET GLOBAL SQL_SLAVE_SKIP_COUNTER = 1;<br />
Query OK, 0 rows affected (0.00 sec)</p>
<p>mysql&gt; slave start;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>然后blog_score_result这个表的数据肯定不准确了，可以重新从主库导入数据，视应用的繁忙程度，要保证数据的一致性，先在主库上lock这个表，不让其他用户更新：</p>
<blockquote><p>mysql&gt; lock tables blog_score_result read;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>然后导出数据：</p>
<blockquote><p>[root@banping 3306]# bin/mysqldump --default-character-set=utf8 banpingdb blog_score_result -u root -p&gt;/tmp/blog_score_result.sql;</p></blockquote>
<p>去从库导入数据：</p>
<blockquote><p>[root@banping 3306]# bin/mysql --default-character-set=utf8 banpingdb -u root -p&lt;/tmp/blog_score_result.sql;<br />
Query OK, 0 rows affected (0.00 sec)</p></blockquote>
<p>到主库解锁这个表：</p>
<blockquote>
<pre>mysql&gt; unlock tables;
Query OK, 0 rows affected (0.00 sec)</pre>
</blockquote>
<p>这样就完成了数据一致性的操作。主从复制的同步也正常了。这种事情的处理要结合实际应用情况，不可照搬就是了。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/12/15/mysql-replication-error/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>配置Postfix邮件系统的访问权限</title>
		<link>http://www.banping.com/2011/12/01/postfix-access-rule/</link>
		<comments>http://www.banping.com/2011/12/01/postfix-access-rule/#comments</comments>
		<pubDate>Thu, 01 Dec 2011 03:43:44 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[网站架构]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1018</guid>
		<description><![CDATA[<p>Postfix邮件系统的配置主要通过main.cf文件，路径在/etc/postfix下。如果要允许其他服务器使用Postfix的服务，需要重点关注inet_interfaces和mynetworks这两个参数。</p> <p># The inet_interfaces parameter specifies the network interface<br /> # addresses that this mail system receives mail on. By default,<br /> # the software claims all active interfaces on the machine. The<br /> # parameter also controls delivery of mail to user@[ip.address].<br /> #<br /> # See also the proxy_interfaces parameter, for network addresses [...]]]></description>
			<content:encoded><![CDATA[<p>Postfix邮件系统的配置主要通过main.cf文件，路径在/etc/postfix下。如果要允许其他服务器使用Postfix的服务，需要重点关注inet_interfaces和mynetworks这两个参数。</p>
<blockquote><p># The inet_interfaces parameter specifies the network interface<br />
# addresses that this mail system receives mail on. By default,<br />
# the software claims all active interfaces on the machine. The<br />
# parameter also controls delivery of mail to user@[ip.address].<br />
#<br />
# See also the proxy_interfaces parameter, for network addresses that<br />
# are forwarded to us via a proxy or network address translator.<br />
#<br />
# Note: you need to stop/start Postfix when this parameter changes.<br />
#<br />
inet_interfaces = all</p></blockquote>
<p>要注意的是，修改这个参数必须要停止再启动Postfix，单纯的restart是不生效的。</p>
<blockquote><p># You can also specify the absolute pathname of a pattern file instead<br />
# of listing the patterns here. Specify type:table for table-based lookups<br />
# (the value on the table right-hand side is not used).<br />
#<br />
mynetworks = 11.12.13.14,127.0.0.0/8</p></blockquote>
<p>这个参数指定了要使用Postfix的IP地址，如果不设定正确，会在maillog里看到类似如下的提示信息：</p>
<blockquote><p>Dec 1 11:16:21 mail postfix/smtpd[21197]:warning: 11.12.13.14: address not listed for hostname banping.com<br />
Dec 1 11:16:21 mail postfix/smtpd[21197]: connect from unknown[11.12.13.14]<br />
Dec 1 11:16:21 mail postfix/smtpd[21197]: NOQUEUE: reject: RCPT from unknown[11.12.13.14]: 554 5.7.1: Relay access denied; from= to= proto=ESMTP helo=&lt;banping.com&gt;</p></blockquote>
<p>自己搭建邮件系统还是比较折腾的，使用Amazon ses是比较便捷的做法。</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/12/01/postfix-access-rule/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Xtrabackup 1.6.3安装及恢复数据</title>
		<link>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/</link>
		<comments>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/#comments</comments>
		<pubDate>Tue, 29 Nov 2011 10:21:52 +0000</pubDate>
		<dc:creator>banping</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://www.banping.com/?p=1013</guid>
		<description><![CDATA[<p>Xtrabackup是备份MySQL的很好的工具，目前最新的版本是1.6.3，和之前出过的1.6版本改进了不少，官方Percona目前对1.6.3的文档也改进了很多。安装包不再包含MySQL源码文件了，要根据需要从Percona在Amazon aws的服务器上下载，当然也可以自己下载需要的文件。</p> <p>安装Xtrabackup，可以通过源码安装，也可以拿二进制程序过来直接使用，以下是源码安装的过程：</p> <p>[root@data banping]# wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6.3/source/xtrabackup-1.6.3.tar.gz<br /> [root@data banping]# tar zxf xtrabackup-1.6.3.tar.gz<br /> [root@data banping]# cd xtrabackup-1.6.3<br /> [root@data xtrabackup-1.6.3]# AUTO_DOWNLOAD="yes" ./utils/build.sh 5.5</p> <p>自动下载的是libtar-1.2.11.tar.gz和mysql源码文件，mysql的版本根据给定的参数识别，可选的有以下版本：</p> Value Alias Server innodb51_builtin 5.1 build against built-in InnoDB in MySQL 5.1 innodb51 plugin build agsinst InnoDB plugin in MySQL 5.1 innodb55 5.5 build against InnoDB in MySQL 5.5 xtradb51 [...]]]></description>
			<content:encoded><![CDATA[<p>Xtrabackup是备份MySQL的很好的工具，目前最新的版本是1.6.3，和之前出过的1.6版本改进了不少，官方Percona目前对1.6.3的文档也改进了很多。安装包不再包含MySQL源码文件了，要根据需要从Percona在Amazon aws的服务器上下载，当然也可以自己下载需要的文件。</p>
<p>安装Xtrabackup，可以通过源码安装，也可以拿二进制程序过来直接使用，以下是源码安装的过程：</p>
<blockquote><p>[root@data banping]# wget http://www.percona.com/redir/downloads/XtraBackup/XtraBackup-1.6.3/source/xtrabackup-1.6.3.tar.gz<br />
[root@data banping]# tar zxf xtrabackup-1.6.3.tar.gz<br />
[root@data banping]# cd xtrabackup-1.6.3<br />
[root@data xtrabackup-1.6.3]# AUTO_DOWNLOAD="yes" ./utils/build.sh 5.5</p></blockquote>
<p>自动下载的是libtar-1.2.11.tar.gz和mysql源码文件，mysql的版本根据给定的参数识别，可选的有以下版本：</p>
<table border="1">
<thead valign="bottom">
<tr>
<th>Value</th>
<th>Alias</th>
<th>Server</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>innodb51_builtin</td>
<td>5.1</td>
<td>build against built-in InnoDB in MySQL 5.1</td>
</tr>
<tr>
<td>innodb51</td>
<td>plugin</td>
<td>build agsinst InnoDB plugin in MySQL 5.1</td>
</tr>
<tr>
<td>innodb55</td>
<td>5.5</td>
<td>build against InnoDB in MySQL 5.5</td>
</tr>
<tr>
<td>xtradb51</td>
<td>xtradb</td>
<td>build against Percona Server with XtraDB 5.1</td>
</tr>
<tr>
<td>xtradb55</td>
<td>xtradb55</td>
<td>build against Percona Server with XtraDB 5.5</td>
</tr>
</tbody>
</table>
<p>默认libtar并不会安装，如果需要使用stream功能，需要手动安装这个程序。安装完成后，会生成一个xtrabackup_innodb55文件，可以用它恢复innodb数据，文件的路径如下：</p>
<table border="1">
<thead valign="bottom">
<tr>
<th>Target</th>
<th>Location</th>
</tr>
</thead>
<tbody valign="top">
<tr>
<td>innodb51_builtin</td>
<td>mysql-5.1/storage/innobase/xtrabackup</td>
</tr>
<tr>
<td>innodb51</td>
<td>mysql-5.1/storage/innodb_plugin/xtrabackup</td>
</tr>
<tr>
<td>innodb55</td>
<td>mysql-5.5/storage/innobase/xtrabackup</td>
</tr>
<tr>
<td>xtradb51</td>
<td>Percona-Server-5.1/storage/innodb_plugin/xtrabackup</td>
</tr>
<tr>
<td>xtradb55</td>
<td>Percona-Server-5.5/storage/innobase/xtrabackup</td>
</tr>
</tbody>
</table>
<p>恢复的方法如下：</p>
<blockquote><p>[root@data recover]# /banping/xtrabackup_innodb55 --prepare --target-dir=/banping/recover/</p></blockquote>
<p>prepare就是recover的过程，也就是通过前滚和回滚使数据一致，target-dir就是备份出来的文件路径。这一步的操作和MySQL Server是没有任何关系的。官方还建议执行两次prepare以便生成新的redo文件，个人认为是没什么必要的。</p>
<p>关于1.6版本的安装及备份和Xtrabackup的原理，请参见我以前的文章：</p>
<p><a href="http://www.banping.com/2011/04/14/xtrabackup-mysql55/">http://www.banping.com/2011/04/14/xtrabackup-mysql55/</a></p>
<p><a href="http://www.banping.com/2011/05/24/xtrabackup-stream-mysql/">http://www.banping.com/2011/05/24/xtrabackup-stream-mysql/</a></p>
<p><a href="http://www.banping.com/2011/07/01/xtrabackup-process-backgroud/">http://www.banping.com/2011/07/01/xtrabackup-process-backgroud/</a></p>
<p>&nbsp;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.banping.com/2011/11/29/xtrabackup-1-6-3-install-recover-prepare/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

