<?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>后端技术@tjumicy</title>
	<atom:link href="http://micy.cn/blog/feed" rel="self" type="application/rss+xml" />
	<link>http://micy.cn/blog</link>
	<description>for Web Developer</description>
	<lastBuildDate>Mon, 08 Feb 2010 10:34:34 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=3.0-alpha</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>程序员的优势和劣势</title>
		<link>http://micy.cn/blog/post/103</link>
		<comments>http://micy.cn/blog/post/103#comments</comments>
		<pubDate>Mon, 08 Feb 2010 10:34:34 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=103</guid>
		<description><![CDATA[有段著名的对话：
男：我是程序员。 女：哦，程先生，你好。 男：哈，客气了，叫我序员就好。
现实中的程先生多种多样，如果不去考虑程序员、工程师、架构师等不同的title到底有什么区别，作为通过计算机语言与机器打交道的人群，至少有很多共同的特征。
程序员比其他行业有一个天然的优势，就是自己几乎可以随心所欲的创造出工具来帮助自己，从而大大提升工作效率。这一点在许多传统行业中是完全不可能的，比如：一名建筑工程师，他如果想随心所欲地马上着手创造一把符合他手头工作的锤子，则并不太容易。这种效率提升的前提，是可以将重复手动劳动的自动化。就像一个本来要挖20米深地基的工人，忽然变出10个机器人代替他挖，而他只需要在旁边小屋透过玻璃窗眯着眼睛喝咖啡一样。所以，利用好这个优势后，优秀的程序员可以将效率提升至少一个数量级。
程序员还有一个天然的优势，他的学习成本和创造成本都比较低。首先，技术水平的提升是不依赖复杂昂贵的专有设备和密集的人员的，他需要的只是电脑和网线。其次，创造成本中，除了时间之外，材料成本完全电子化，知识和创意通过代码体现在二进制中。而更不错的事情是：创造出的东西在世界范围内都是可以重用的，可以基于大量经过他人完善测试的库来避免自己的重复劳动。所以，利用好这个优势，在于勤于动手去尝试去做，整理好可以重用的通用库，然后在需要的时候毫不吝啬地将自己的想法实现。
不过，也有劣势
程序员的世界是理想化的，不存在非逻辑的干扰因素。如果已经设计出一套完美的逻辑去做一件事，无论做多少遍，也不会出现无法处理的僵局。所以程序员希望这个世界井然有序，每个实体像系统中的各个模块一样各司其职、准确而高效地交互。而现实中，绝大多数钱能解决的问题不是问题，绝大多数技术能解决的问题也不是问题。
阮一峰在翻译《More Joel on Software》时写的blog（鉴于他的blog内容太敢说真话，如果访问不了请自己想办法），也提到了原作中的一句话：
许许多多的人选择编程，首要的原因就是，他们宁愿将自己的时间花在一个公平有序的地方，一个严格的能者上庸者下的地方，一个只要你是对的就能赢得任何争论的地方。
是。有人会在旁边冷笑，并可能说出类似 “Too Simple, Sometimes Naive” 这样的江湖名句。某种意义上，我并不是个纯粹的理想主义者，但我还是有些偏执地要说：可编程的世界，就是程序员自己构架的理想国。
]]></description>
			<content:encoded><![CDATA[<p>有段著名的对话：</p>
<blockquote><p>男：我是程序员。 女：哦，程先生，你好。 男：哈，客气了，叫我序员就好。</p></blockquote>
<p>现实中的程先生多种多样，如果不去考虑程序员、工程师、架构师等不同的title到底有什么区别，作为通过计算机语言与机器打交道的人群，至少有很多共同的特征。</p>
<p>程序员比其他行业有一个天然的优势，就是自己几乎可以随心所欲的创造出工具来帮助自己，从而大大提升工作效率。这一点在许多传统行业中是完全不可能的，比如：一名建筑工程师，他如果想随心所欲地马上着手创造一把符合他手头工作的锤子，则并不太容易。这种效率提升的前提，是可以将重复手动劳动的自动化。就像一个本来要挖20米深地基的工人，忽然变出10个机器人代替他挖，而他只需要在旁边小屋透过玻璃窗眯着眼睛喝咖啡一样。所以，利用好这个优势后，优秀的程序员可以将效率提升至少一个数量级。</p>
<p>程序员还有一个天然的优势，他的学习成本和创造成本都比较低。首先，技术水平的提升是不依赖复杂昂贵的专有设备和密集的人员的，他需要的只是电脑和网线。其次，创造成本中，除了时间之外，材料成本完全电子化，知识和创意通过代码体现在二进制中。而更不错的事情是：创造出的东西在世界范围内都是可以重用的，可以基于大量经过他人完善测试的库来避免自己的重复劳动。所以，利用好这个优势，在于勤于动手去尝试去做，整理好可以重用的通用库，然后在需要的时候毫不吝啬地将自己的想法实现。</p>
<p>不过，也有劣势</p>
<p>程序员的世界是理想化的，不存在非逻辑的干扰因素。如果已经设计出一套完美的逻辑去做一件事，无论做多少遍，也不会出现无法处理的僵局。所以程序员希望这个世界井然有序，每个实体像系统中的各个模块一样各司其职、准确而高效地交互。而现实中，绝大多数钱能解决的问题不是问题，绝大多数技术能解决的问题也不是问题。</p>
<p>阮一峰在翻译《More Joel on Software》时写的<a href="http://www.ruanyifeng.com/blog/2009/10/why_i_love_programming.html">blog</a>（鉴于他的blog内容太敢说真话，如果访问不了请自己想办法），也提到了原作中的一句话：</p>
<blockquote><p>许许多多的人选择编程，首要的原因就是，他们宁愿将自己的时间花在一个公平有序的地方，一个严格的能者上庸者下的地方，一个只要你是对的就能赢得任何争论的地方。</p></blockquote>
<p>是。有人会在旁边冷笑，并可能说出类似 “Too Simple, Sometimes Naive” 这样的江湖名句。某种意义上，我并不是个纯粹的理想主义者，但我还是有些偏执地要说：可编程的世界，就是程序员自己构架的理想国。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/103/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>表演类艺术与创作类艺术</title>
		<link>http://micy.cn/blog/post/78</link>
		<comments>http://micy.cn/blog/post/78#comments</comments>
		<pubDate>Fri, 22 Jan 2010 08:23:48 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=78</guid>
		<description><![CDATA[最近半年有些事情，让我试图去探索和理解“表演”与“创作”这两类艺术类别的共同点和差异点。
或许这对一个以用计算机语言编写程序作为职业的人来说，有些生僻。但对一个喜欢古典音乐，从5岁开始练习小提琴，业余时间参加了10年交响乐排练和演出的业余小提琴手来说，这个问题在促使我去思考学生生涯那么多 年，这门作为表演类艺术的业余爱好，到底带给了我什么，并使我擅长做什么，布擅长做什么？
于是我先考察了艺术(Art) 的具体定义。在我理解中是一个相对广义的概念，和传统意义上的美术来说，是一个更 general 的定义。参考 wikipedia上的艺术词条如下(适当翻译成简体中文习惯)：
艺术是由所有具有智能思考能力的动物，以通过各种 形式及工具用以表达其情感与意识形态，所产生的形态泛称。
为了让事情明朗一些，我列举了一些我能想到的典型的艺术活 动，并试图用表达载体来分类。举一些例子：

文字

文学创作
剧本
作词


声音

作曲
声乐
器乐演奏


图像

摄影
绘画
平面设计


物体

时装
雕塑、雕刻
建筑
室内装潢


影像

动画制作
电影导演
电影演员


舞台

舞蹈
相声
戏剧
指挥



看完之后，我发现大部分的艺术活动，都是和“创作”紧密相关的。而只有少数是和“表演”紧密相关的，比如：

声乐
舞蹈
相声
戏剧
指挥
电影演员
器乐演奏

我将他们分为表演类的标准是，通常这类活动有一个范本，有类似观众一样的表演受众。表演者在尊重范本的基础上，融合自己的理解产生某种艺术感染力， 通过再现范本来表达给受众。比如：

一位小提琴演奏家需要理解某部作品中作曲家的意思，按照乐谱演奏作品。
电影演员需要读懂剧本，扮演一个虚拟的角色。

再看看创作类的艺术活动。我理解为：在遵循一些公认创作原则的基础上，从无到有地表达创作者希望传达地内容，并无范本可以参照。通俗的说，我觉得这类艺术需要一种 sense，需要一种没有其他参照的巧妙的表达。比如：

王小波写一部小说
贝多芬写一首钢琴奏鸣曲
凡高画一幅抽象画
乔布斯和他的团队带给大家 iPhone 出色的工业设计和用户界面设计

好吧，现在我的问题是：

一个从事表演类艺术的人，转而从事另一种表演类艺术时，是否更加容易？
而如果转而从事另一种创作类艺术时，是否变的困难？
或者本身如此分类和思考就不合适？

思考这个问题的同时，我也对在比较 general 层次上艺术与设计的区别，也产生了兴趣。有机会可以继续写一写。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://micy.cn/blog/wp-content/uploads/2010/01/transitional_violin.jpg"><img src="http://micy.cn/blog/wp-content/uploads/2010/01/transitional_violin.jpg" alt="" title="transitional_violin" width="301" height="300" class="alignnone" /></a>最近半年有些事情，让我试图去探索和理解“表演”与“创作”这两类艺术类别的共同点和差异点。</p>
<p>或许这对一个以用计算机语言编写程序作为职业的人来说，有些生僻。但对一个喜欢古典音乐，从5岁开始练习小提琴，业余时间参加了10年交响乐排练和演出的业余小提琴手来说，这个问题在促使我去思考学生生涯那么多 年，这门作为表演类艺术的业余爱好，到底带给了我什么，并使我擅长做什么，布擅长做什么？</p>
<p>于是我先考察了艺术(Art) 的具体定义。在我理解中是一个相对广义的概念，和传统意义上的美术来说，是一个更 general 的定义。参考 wikipedia上的<a title="艺术" href="http://zh.wikipedia.org/wiki/%E8%89%BA%E6%9C%AF" target="_blank">艺术词条</a>如下(适当翻译成简体中文习惯)：</p>
<blockquote><p>艺术是由所有具有智能思考能力的动物，以通过各种 形式及工具用以表达其情感与意识形态，所产生的形态泛称。</p></blockquote>
<p>为了让事情明朗一些，我列举了一些我能想到的典型的艺术活 动，并试图用表达载体来分类。举一些例子：</p>
<ul>
<li>文字
<ul>
<li>文学创作</li>
<li>剧本</li>
<li>作词</li>
</ul>
</li>
<li>声音
<ul>
<li>作曲</li>
<li>声乐</li>
<li>器乐演奏</li>
</ul>
</li>
<li>图像
<ul>
<li>摄影</li>
<li>绘画</li>
<li>平面设计</li>
</ul>
</li>
<li>物体
<ul>
<li>时装</li>
<li>雕塑、雕刻</li>
<li>建筑</li>
<li>室内装潢</li>
</ul>
</li>
<li>影像
<ul>
<li>动画制作</li>
<li>电影导演</li>
<li>电影演员</li>
</ul>
</li>
<li>舞台
<ul>
<li>舞蹈</li>
<li>相声</li>
<li>戏剧</li>
<li>指挥</li>
</ul>
</li>
</ul>
<p>看完之后，我发现大部分的艺术活动，都是和“创作”紧密相关的。而只有少数是和“表演”紧密相关的，比如：</p>
<ul>
<li>声乐</li>
<li>舞蹈</li>
<li>相声</li>
<li>戏剧</li>
<li>指挥</li>
<li>电影演员</li>
<li>器乐演奏</li>
</ul>
<p>我将他们分为表演类的标准是，通常这类活动有一个范本，有类似观众一样的表演受众。表演者在尊重范本的基础上，融合自己的理解产生某种艺术感染力， 通过再现范本来表达给受众。比如：</p>
<ul>
<li>一位小提琴演奏家需要理解某部作品中作曲家的意思，按照乐谱演奏作品。</li>
<li>电影演员需要读懂剧本，扮演一个虚拟的角色。</li>
</ul>
<p>再看看创作类的艺术活动。我理解为：在遵循一些公认创作原则的基础上，从无到有地表达创作者希望传达地内容，并无范本可以参照。通俗的说，我觉得这类艺术需要一种 sense，需要一种没有其他参照的巧妙的表达。比如：</p>
<ul>
<li>王小波写一部小说</li>
<li>贝多芬写一首钢琴奏鸣曲</li>
<li>凡高画一幅抽象画</li>
<li>乔布斯和他的团队带给大家 iPhone 出色的工业设计和用户界面设计</li>
</ul>
<p>好吧，现在我的问题是：</p>
<ul>
<li>一个从事表演类艺术的人，转而从事另一种表演类艺术时，是否更加容易？</li>
<li>而如果转而从事另一种创作类艺术时，是否变的困难？</li>
<li>或者本身如此分类和思考就不合适？</li>
</ul>
<p>思考这个问题的同时，我也对在比较 general 层次上艺术与设计的区别，也产生了兴趣。有机会可以继续写一写。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/78/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>NASDAQ:BIDU</title>
		<link>http://micy.cn/blog/post/85</link>
		<comments>http://micy.cn/blog/post/85#comments</comments>
		<pubDate>Thu, 21 Jan 2010 06:56:45 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=85</guid>
		<description><![CDATA[iPod Touch上看股价走势很方便，事实上前几天这是我睡觉前的娱乐之一。因为转圈圈的loading图标消失前，你怎么也不会知道今天的走势是什么样子的。
最近两位搜索引擎老大的故事被大家说烂了，我还是补个图吧。这是百度同学 (NASDAQ:BIDU) 最近某段时间的股价走势

图上一共5天，第一天是百度的域名DNS事故导致跌破400刀。第二天是谷歌同学的声明。最后一天是谷歌同学的第二次声明。
第一天声明的时候，我还挺想去logo附近看看来着，走路十分钟就能到，可是天太冷了我退缩了。:-) 
]]></description>
			<content:encoded><![CDATA[<p>iPod Touch上看股价走势很方便，事实上前几天这是我睡觉前的娱乐之一。因为转圈圈的loading图标消失前，你怎么也不会知道今天的走势是什么样子的。</p>
<p>最近两位搜索引擎老大的故事被大家说烂了，我还是补个图吧。这是百度同学 (<a href="http://finance.yahoo.com/q/bc?s=BIDU" target="_blank">NASDAQ:BIDU</a>) 最近某段时间的股价走势</p>
<p><a href="http://micy.cn/blog/wp-content/uploads/2010/01/w.png"><img src="http://micy.cn/blog/wp-content/uploads/2010/01/w.png" alt="NASDAQ:BIDU" title="w" width="512" height="288" class="aligncenter size-full wp-image-86" /></a></p>
<p>图上一共5天，第一天是百度的域名DNS事故导致跌破400刀。第二天是谷歌同学的声明。最后一天是谷歌同学的第二次声明。</p>
<p>第一天声明的时候，我还挺想去logo附近看看来着，走路十分钟就能到，可是天太冷了我退缩了。:-) </p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/85/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>为wikipedia捐助</title>
		<link>http://micy.cn/blog/post/80</link>
		<comments>http://micy.cn/blog/post/80#comments</comments>
		<pubDate>Mon, 28 Dec 2009 11:51:56 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=80</guid>
		<description><![CDATA[踩着2009年的尾巴，跑到wikipedia的捐助页面，用信用卡刷了$20。这个想法由来已久，几个月前注意到开始这个捐助项目时，这个总金额750万美元的项目募集了不到三分之一，当时就动了捐助的念头。最近看到时已经到660万美元了，在这个不是太顺利的一年快要走完的时候，我希望完成这个心愿。
说到捐助的原因，其实很直接。维基百科是让我觉得对我帮助最大的几个网站之一。基于非盈利非商业的前提下，维持服务器、机房等费用的来源只有捐助。所以捐助一笔也是我应该做的回报方式。同时，维基百科在促进全世界信息知识的流通和共享方面发挥了不可替代的作用，而促进信息的流动分享，也是我一直以来的理想。
这个链接是维基百科创始人关于捐助的公开信。如果平日因为维基百科而受益，并且有意贡献，或者只是对这个事情感兴趣，请猛击：
http://wikimediafoundation.org/wiki/Appeal2/zh-hant
捐助的支付方面，可以用信用卡 或者 Paypal。国内普通的双币信用卡，支付美元即可（我没有试过支付港币），我用的招行的。
ps. 支付的时候有一个页面可能是因为墙或者碰巧其他什么网络故障，结果页访问不到。于是我再提交了一次，最终捐助了两份$20（这倒不是个杯具）。大家捐助时遇到结果页无法访问的话，可以先等一等信用卡支付成功的短信，我这里大概延迟几分钟收到。
]]></description>
			<content:encoded><![CDATA[<p><img alt="Wikimedia Foundation Logo" src="http://upload.wikimedia.org/wikipedia/foundation/9/9a/Wikimediafoundation-logo.png" title="Wikimedia Foundation" class="alignnone" />踩着2009年的尾巴，跑到wikipedia的捐助页面，用信用卡刷了$20。这个想法由来已久，几个月前注意到开始这个捐助项目时，这个总金额750万美元的项目募集了不到三分之一，当时就动了捐助的念头。最近看到时已经到660万美元了，在这个不是太顺利的一年快要走完的时候，我希望完成这个心愿。</p>
<p>说到捐助的原因，其实很直接。维基百科是让我觉得对我帮助最大的几个网站之一。基于非盈利非商业的前提下，维持服务器、机房等费用的来源只有捐助。所以捐助一笔也是我应该做的回报方式。同时，维基百科在促进全世界信息知识的流通和共享方面发挥了不可替代的作用，而促进信息的流动分享，也是我一直以来的理想。</p>
<p>这个链接是维基百科创始人关于捐助的公开信。如果平日因为维基百科而受益，并且有意贡献，或者只是对这个事情感兴趣，请猛击：<br />
<a href="http://wikimediafoundation.org/wiki/Appeal2/zh-hant">http://wikimediafoundation.org/wiki/Appeal2/zh-hant</a></p>
<p>捐助的支付方面，可以用信用卡 或者 Paypal。国内普通的双币信用卡，支付美元即可（我没有试过支付港币），我用的招行的。</p>
<p>ps. 支付的时候有一个页面可能是因为墙或者碰巧其他什么网络故障，结果页访问不到。于是我再提交了一次，最终捐助了两份$20（这倒不是个杯具）。大家捐助时遇到结果页无法访问的话，可以先等一等信用卡支付成功的短信，我这里大概延迟几分钟收到。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/80/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Thrift &#8211; 开源多语言RPC框架</title>
		<link>http://micy.cn/blog/post/35</link>
		<comments>http://micy.cn/blog/post/35#comments</comments>
		<pubDate>Sun, 27 Sep 2009 10:16:36 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[架构]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=35</guid>
		<description><![CDATA[RPC (wiki) 在大规模的互联网应用后端技术中非常常见，我们熟悉的搜索引擎、门户、网游服务器等，后端实现中都有涉及。主要原理是基于内网 socket 解决多机多模块之间的数据通讯问题。或者可以简单理解为，将单机的进程间通讯 (IPC) (wiki)，扩展到多机通讯，解决可扩展性问题。
Thrift 是由 Facebook 开源的一个 RPC 框架，现在已经挂在 apache.org 下了。主要的几个好处：

 支持非常多语言，包括在 WEB 开发中很常用的 PHP，以及最重要的 C++/Python/Java 等 WEB后端常用语言，当然，还包括很 cool 的 Ruby、Erlang。
 完整的 RPC 框架实现，用脚本生成通讯相关的框架代码，开发者只需要集中精力处理好业务逻辑。比如搭建一个 Hello World Service 只需要几分钟。
 拥有被 Facebook、Last.fm 等不少大规模互联网应用验证过的性能和可用性。

在 PRC 通讯方面，其实已经成熟多年。比如百度内部是自己定制的二进制协议，比如C++下使用较多的 ACE 框架。而 Thrift 在最近两年脱颖而出，也的确和其跨语言、方便的代码生成框架、以及适于目前高速发展的互联网应用而出名。另外许多人拿 Thrift 和 google 推动的 Protocol Buffer 比较，有不少文章可以参考。
国内从目前的状况看，Thrift 相关的讨论和应用还不太多，这也是我想写出来推荐的原因。
一方面国内的寡头大型互联网企业多数使用自己的协议，没有动力开源，也没有引入的需求。一方面小型互联网公司虽然不少，但规模较大的还很少，大部分公司的业务量，还不太需要 RPC 这类多模块多机的架构去支撑。
另一方面，Thrift 的确系出名门，它的代码实现的很优秀，逻辑层次清楚，易于定制扩展。框架代码生成方便，节省很多通讯方面的开发和调试时间。
最近和几位同事一起，做了对 Thrift 协议传输方面的性能测试和调优，结果还是不错的，用起来也很方便。后面有机会可以把测试过程，以及遇到的一些问题拿出来分享。
]]></description>
			<content:encoded><![CDATA[<p>RPC <a href="http://en.wikipedia.org/wiki/Remote_procedure_call" target="_blank">(wiki)</a> 在大规模的互联网应用后端技术中非常常见，我们熟悉的搜索引擎、门户、网游服务器等，后端实现中都有涉及。主要原理是基于内网 socket 解决多机多模块之间的数据通讯问题。或者可以简单理解为，将单机的进程间通讯 (<abbr title="Inter Process Communication">IPC</abbr>) <a href="http://en.wikipedia.org/wiki/Inter-process_communication" target="_blank">(wiki)</a>，扩展到多机通讯，解决可扩展性问题。</p>
<p><a href="http://incubator.apache.org/thrift/" target="_blank">Thrift</a> 是由 Facebook 开源的一个 <abbr title="Remote Procedure Call">RPC</abbr> 框架，现在已经挂在 apache.org 下了。主要的几个好处：</p>
<ol>
<li> 支持非常多语言，包括在 WEB 开发中很常用的 PHP，以及最重要的 C++/Python/Java 等 WEB后端常用语言，当然，还包括很 cool 的 Ruby、Erlang。</li>
<li> 完整的 RPC 框架实现，用脚本生成通讯相关的框架代码，开发者只需要集中精力处理好业务逻辑。比如搭建一个 Hello World Service 只需要几分钟。</li>
<li> 拥有被 Facebook、Last.fm 等不少大规模互联网应用验证过的性能和可用性。</li>
</ol>
<p>在 PRC 通讯方面，其实已经成熟多年。比如百度内部是自己定制的二进制协议，比如C++下使用较多的 ACE 框架。而 Thrift 在最近两年脱颖而出，也的确和其跨语言、方便的代码生成框架、以及适于目前高速发展的互联网应用而出名。另外许多人拿 Thrift 和 google 推动的 Protocol Buffer 比较，<a href="http://www.google.com/search?q=thrift+protocol+buffer+comparison" target="_blank">有不少文章可以参考</a>。</p>
<p>国内从目前的状况看，Thrift 相关的讨论和应用还不太多，这也是我想写出来推荐的原因。</p>
<p>一方面国内的寡头大型互联网企业多数使用自己的协议，没有动力开源，也没有引入的需求。一方面小型互联网公司虽然不少，但规模较大的还很少，大部分公司的业务量，还不太需要 RPC 这类多模块多机的架构去支撑。</p>
<p>另一方面，Thrift 的确系出名门，它的代码实现的很优秀，逻辑层次清楚，易于定制扩展。框架代码生成方便，节省很多通讯方面的开发和调试时间。</p>
<p>最近和几位同事一起，做了对 Thrift 协议传输方面的性能测试和调优，结果还是不错的，用起来也很方便。后面有机会可以把测试过程，以及遇到的一些问题拿出来分享。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/35/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>单机启动多个MySQL Server</title>
		<link>http://micy.cn/blog/post/37</link>
		<comments>http://micy.cn/blog/post/37#comments</comments>
		<pubDate>Wed, 23 Sep 2009 08:00:06 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=37</guid>
		<description><![CDATA[有时候我们需要在一台服务器启动多个 MySql Server。有一个方法是使用官方的多server管理工具 mysqld_multi ，适合多server运行时的管理，有专用的配置项方便日常管理维护。或者如果不想用 mysqld_multi，我们看看幕后都做了什么，简单的自己动手配置一下。
这篇来讲讲怎么通过自己配置，启动多个mysqld。
无论是发行版包管理工具安装的，还是自己编译安装的，都会默认读取 my.cnf 文件，位置一般是 /etc/my.cnf 、$MYSQL_HOME/my.cnf 等。发行版包管理工具一般只会安装在固定的位置，不方便同时装两个 mysql server。自己编译的话，也不方便临时再 install 到其他位置和读取另外的 my.cnf 文件。
参考 MySQL 官方手册的内容，使用现有的mysql系列可执行程序，在启动server和client时，指定 --defaults-file 参数，即刻达到效果。
1、编辑一个新的 my.cnf 文件用于新的server
sudo cp /etc/my.cnf /etc/my.2.cnf
sudo vim /etc/my.2.cnf
修改配置，防止和原有配置冲突。主要需要修改的有：

端口(port)、socket 文件路径 (socket)、数据文件路径 (datadir)；
如果用到 InnoDB（一般都会用到），则要修改 InnoDB 数据文件路径 (innodb_data_home_dir)、InnoDB 日志文件路径 (innodb_log_group_home_dir)；
如果用到replication时，还要修改server的唯一id (server-id)、下载到master的binlog的存放路径 (relay-log)等。其他配置修改，则根据具体情况自行调整。

这里注意 datadir 和 InnoDB 的几个dir，根据情况新建目录，并给 mysql 用户读写权限，否则无法启动正常。另外特别注意，需要确保这些路径不和 product 环境下对应配置的路径有冲突，除非你的确希望这样做，这可能会损坏对应路径下的数据文件。
2、初始化DB
sudo /usr/bin/mysql_install_db --defaults-file=/etc/my.2.cnf
sudo cd $datadir
sudo chown mysql:mysql . -R
这里 [...]]]></description>
			<content:encoded><![CDATA[<p>有时候我们需要在一台服务器启动多个 MySql Server。有一个方法是使用官方的多server管理工具 <a href="http://dev.mysql.com/doc/refman/5.0/en/mysqld-multi.html" target="_blank">mysqld_multi</a> ，适合多server运行时的管理，有专用的配置项方便日常管理维护。或者如果不想用 mysqld_multi，我们看看幕后都做了什么，简单的自己动手配置一下。</p>
<p>这篇来讲讲怎么通过自己配置，启动多个mysqld。</p>
<p>无论是发行版包管理工具安装的，还是自己编译安装的，都会默认读取 my.cnf 文件，位置一般是 /etc/my.cnf 、$MYSQL_HOME/my.cnf 等。发行版包管理工具一般只会安装在固定的位置，不方便同时装两个 mysql server。自己编译的话，也不方便临时再 install 到其他位置和读取另外的 my.cnf 文件。</p>
<p>参考 <a href="http://dev.mysql.com/doc/refman/5.0/en/option-files.html" target="_blank">MySQL 官方手册的内容</a>，使用现有的mysql系列可执行程序，在启动server和client时，指定 <code>--defaults-file</code> 参数，即刻达到效果。</p>
<p><strong>1、编辑一个新的 my.cnf 文件用于新的server</strong></p>
<blockquote><p><code>sudo cp /etc/my.cnf /etc/my.2.cnf<br />
sudo vim /etc/my.2.cnf</code></p></blockquote>
<p>修改配置，防止和原有配置冲突。主要需要修改的有：</p>
<ul>
<li>端口(port)、socket 文件路径 (socket)、数据文件路径 (datadir)；</li>
<li>如果用到 InnoDB（一般都会用到），则要修改 InnoDB 数据文件路径 (innodb_data_home_dir)、InnoDB 日志文件路径 (innodb_log_group_home_dir)；</li>
<li>如果用到replication时，还要修改server的唯一id (server-id)、下载到master的binlog的存放路径 (relay-log)等。其他配置修改，则根据具体情况自行调整。</li>
</ul>
<p>这里注意 datadir 和 InnoDB 的几个dir，根据情况新建目录，并给 mysql 用户读写权限，否则无法启动正常。另外<strong>特别注意</strong>，需要确保这些路径不和 product 环境下对应配置的路径有冲突，除非你的确希望这样做，这可能会损坏对应路径下的数据文件。</p>
<p><strong>2、初始化DB</strong></p>
<blockquote><p><code>sudo /usr/bin/mysql_install_db --defaults-file=/etc/my.2.cnf<br />
sudo cd $datadir<br />
sudo chown mysql:mysql . -R</code></p></blockquote>
<p>这里 $datadir 是新配置的 my.cnf 的 datadir 项所配置的路径。注意需要对文件权限变更为 mysql，否则启动server时会出现文件无权限等错误。</p>
<p><strong>3、启动 mysqld</strong></p>
<blockquote><p><code>/usr/bin/mysqld_safe --defaults-file=/etc/my.2.cnf &amp;</code></p></blockquote>
<p>查看 $datadir/$host.err 观察是否启动成功。</p>
<p><strong>4、启动 client</strong></p>
<blockquote><p><code>/usr/bin/mysql --defaults-file=/etc/my.2.cnf -hlocalhost -uroot</code></p></blockquote>
<p>这些命令为了方便使用，可以写到shell脚本里。上述步骤只叙述了标题相关内容，在权限、性能等无关方面没有特别说明。另外注意 <code>--defaults-file</code> 的 <code>defaults</code> 有个 s，之前我自己写漏了，整个参数被忽律掉，总报错。:-) </ul>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/37/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>linode的VPS主机</title>
		<link>http://micy.cn/blog/post/16</link>
		<comments>http://micy.cn/blog/post/16#comments</comments>
		<pubDate>Sat, 05 Sep 2009 09:44:39 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=16</guid>
		<description><![CDATA[这个blog是架在 VPS(wiki)主机商 linode.com那里的。
VPS基于虚拟机，相当于提供了完整的root ssh访问权限，和操作一台普通的Linux服务器没有区别，适合和我一样愿意折腾的同学们。
当初购买价格是360MB内存，$19.99/month。和朋友一起买的，一个人买有点贵。初步使用感觉主要还是内存有些不够用，尤其是平时用主流Web Server习惯了，很少考虑内存问题。但实际观察了一下，一个apache进程启动后占5MB，一旦有一次访问，加载了mod_php之后就跳到二三十MB。apache自己prefork几个进程，就吃掉一大块内存。至于硬盘和流量，暂时还不是瓶颈。
目前有口碑的两家VPS主机商是 linode.com 和 slicehost.com，当时买的时候比较了一下，slicehost单价更贵，于是选了linode。
]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://www.linode.com/images/linode_logo_gray.png" title="linode.com logo" class="alignnone" width="288" height="65" />这个blog是架在 VPS(<a href="http://en.wikipedia.org/wiki/Virtual_private_server">wiki</a>)主机商 <a href="http://www.linode.com/">linode.com</a>那里的。</p>
<p>VPS基于虚拟机，相当于提供了完整的root ssh访问权限，和操作一台普通的Linux服务器没有区别，适合和我一样愿意折腾的同学们。</p>
<p>当初购买价格是360MB内存，$19.99/month。和朋友一起买的，一个人买有点贵。初步使用感觉主要还是内存有些不够用，尤其是平时用主流Web Server习惯了，很少考虑内存问题。但实际观察了一下，一个apache进程启动后占5MB，一旦有一次访问，加载了mod_php之后就跳到二三十MB。apache自己prefork几个进程，就吃掉一大块内存。至于硬盘和流量，暂时还不是瓶颈。</p>
<p>目前有口碑的两家VPS主机商是 <a href="http://www.linode.com">linode.com</a> 和 <a href="http://www.slicehost.com/">slicehost.com</a>，当时买的时候比较了一下，slicehost单价更贵，于是选了linode。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/16/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>读《MySQL性能调优与架构设计》</title>
		<link>http://micy.cn/blog/post/10</link>
		<comments>http://micy.cn/blog/post/10#comments</comments>
		<pubDate>Sat, 05 Sep 2009 09:22:08 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[MySQL]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=10</guid>
		<description><![CDATA[《MySQL性能调优与架构设计》(豆瓣链接)(卓越链接)是阿里巴巴的DBA 简朝阳的书。
前段时间读了一下，综合来说还不错，少有的几次读的很畅快的书之一了。作者对MySQL的各部分知识掌握扎实全面，有不少内容是需要深入了解MySQL运行机制后才有的结论。
书分基础、优化、架构三部分。
基础篇
各种介绍，属于初步了解MySQL的程序员和DBA入门需要掌握的基础知识。
性能优化篇
展开讲了MySQL常遇到的各种锁机制、Server参数调优、存储引擎调优、Query优化等等。对MySQL性能调优相关内容有兴趣的话，读起来会比较有兴趣。这里涉及的知识是有一两年经验的LAMP程序员和DBA应当了解的相对高级一些的技巧和内部实现原理。
架构设计篇
展开讲了Replication复制原理、Cluster、大型系统的DB切分方案、监控。其中Cluster因为之前一直生产环境下可行性不高，我不太熟悉。Replication部分是比较基本需要了解的。数据切分虽然篇幅比较长，但介绍的比较泛，可能因为面向DBA有关，在与应用程序的结合上表述不多，实际应用时还有许多细节需要考虑。监控方面值得参考，结合附录Server status和variables参数含义一起理解，是目前不多的对监控介绍比较全面的资料。
此外，有一个小遗憾是第一版笔误和文字错误较多，以及部分内容因为篇幅所限略显不够严谨，虽然这些都不影响这是一本对MySQL爱好者不错的书。好消息是第一次印刷因为卖的好，基本上已经卖完了。作者在blog上更新了勘误表，部分勘误已经交付第二次印刷，新买到的应该会好不少。
]]></description>
			<content:encoded><![CDATA[<p><img alt="" src="http://t.douban.com/lpic/s3780587.jpg" title="MySQL性能调优与架构设计" class="alignnone" width="271" height="340" />《MySQL性能调优与架构设计》(<a href="http://www.douban.com/subject/3729677/">豆瓣链接</a>)(<a href="http://www.amazon.cn/mn/detailApp?prodid=bkbk953742">卓越链接</a>)是阿里巴巴的DBA <a href="http://www.jianzhaoyang.com/">简朝阳</a>的书。</p>
<p>前段时间读了一下，综合来说还不错，少有的几次读的很畅快的书之一了。作者对MySQL的各部分知识掌握扎实全面，有不少内容是需要深入了解MySQL运行机制后才有的结论。</p>
<p>书分基础、优化、架构三部分。</p>
<p><strong>基础篇</strong><br />
各种介绍，属于初步了解MySQL的程序员和DBA入门需要掌握的基础知识。</p>
<p><strong>性能优化篇</strong><br />
展开讲了MySQL常遇到的各种锁机制、Server参数调优、存储引擎调优、Query优化等等。对MySQL性能调优相关内容有兴趣的话，读起来会比较有兴趣。这里涉及的知识是有一两年经验的LAMP程序员和DBA应当了解的相对高级一些的技巧和内部实现原理。</p>
<p><strong>架构设计篇</strong><br />
展开讲了Replication复制原理、Cluster、大型系统的DB切分方案、监控。其中Cluster因为之前一直生产环境下可行性不高，我不太熟悉。Replication部分是比较基本需要了解的。数据切分虽然篇幅比较长，但介绍的比较泛，可能因为面向DBA有关，在与应用程序的结合上表述不多，实际应用时还有许多细节需要考虑。监控方面值得参考，结合附录Server status和variables参数含义一起理解，是目前不多的对监控介绍比较全面的资料。</p>
<p>此外，有一个小遗憾是第一版笔误和文字错误较多，以及部分内容因为篇幅所限略显不够严谨，虽然这些都不影响这是一本对MySQL爱好者不错的书。好消息是第一次印刷因为卖的好，基本上已经卖完了。作者在blog上更新了<a href="http://www.jianzhaoyang.com/mysql-performance-tuning-and-architecture/latest-errors-correction">勘误表</a>，部分勘误已经交付第二次印刷，新买到的应该会好不少。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/10/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>这是一个技术blog</title>
		<link>http://micy.cn/blog/post/1</link>
		<comments>http://micy.cn/blog/post/1#comments</comments>
		<pubDate>Sat, 05 Sep 2009 03:20:59 +0000</pubDate>
		<dc:creator>Qin Yafei</dc:creator>
				<category><![CDATA[未分类]]></category>

		<guid isPermaLink="false">http://micy.cn/blog/?p=1</guid>
		<description><![CDATA[从06年工作之后，就基本暂停了技术blog的写作，更多的是忙于工作上的事。写这个blog是希望积累知识，也是督促自己整理。
主题范围主要是LAMP平台下的各种后端技术（性能、架构、存储等）。
]]></description>
			<content:encoded><![CDATA[<p>从06年工作之后，就基本暂停了技术blog的写作，更多的是忙于工作上的事。写这个blog是希望积累知识，也是督促自己整理。</p>
<p>主题范围主要是LAMP平台下的各种后端技术（性能、架构、存储等）。</p>
]]></content:encoded>
			<wfw:commentRss>http://micy.cn/blog/post/1/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
