<?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>Hello World !</title>
	<atom:link href="http://www.yongblog.com/feed" rel="self" type="application/rss+xml" />
	<link>http://www.yongblog.com</link>
	<description></description>
	<lastBuildDate>Fri, 18 May 2012 07:22:43 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.2</generator>
		<item>
		<title>红黑树 VS AVL树</title>
		<link>http://www.yongblog.com/archives/392.html</link>
		<comments>http://www.yongblog.com/archives/392.html#comments</comments>
		<pubDate>Wed, 09 May 2012 15:12:00 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[Algorithms]]></category>
		<category><![CDATA[AVL树]]></category>
		<category><![CDATA[平衡二叉查找树]]></category>
		<category><![CDATA[平衡化旋转]]></category>
		<category><![CDATA[算法]]></category>
		<category><![CDATA[红黑树]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=392</guid>
		<description><![CDATA[一、红黑树的好处及用途 红黑树并不追求“完全平衡”——它只要求部分地达到平衡要求，降低了对旋转的要求，从而提高了性能。 红黑树能够以O(lgn)的时间复杂度进行搜索、插入、删除操作。此外，由于它的设计，任何不平衡都会在三次旋转之内解决。当然，还有一些更好的，但实现起来更复杂的数据结构,能够做到一步旋转之内达到平衡，但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同，但统计性能比AVL树更高。 当然，红黑树并不适应所有应用树的领域。如果数据基本上是静态的，那么让他们待在他们能够插入，并且不影响平衡的地方会具有更好的性能。如果数据完全是静态的，例如，做一个哈希表，性能可能会更好一些。 在实际的系统中，例如，需要使用动态规则的防火墙系统，使用红黑树而不是散列表被实践证明具有更好的伸缩性，典型的用途是实现关联数组。 二、AVL树 AVL树是最先发明的自平衡二叉查找树。在AVL树中任何节点的两个儿子子树的高度最大差别为一，所以它也被称为高度平衡树。查 找、插入和删除在平均和最坏情况下都是O(lg n)。增加和删除可能需要通过一次或多次树旋转来重新平衡这个树。AVL树得名于 它的发明者 G.M. Adelson-Velsky 和 E.M. Landis，他们在 1962 年的论文 “An algorithm for the organization of information” 中发表了它。引入二叉树的目的是为了提高二叉树的搜索的效率,减少树的平均搜索长度.为此,就必须每向二叉树插入一个结点时调整树的结构,使得二叉树搜索保持平衡,从而可能降低树的高度,减少的平均树的搜索长度。 AVL树的定义: 一棵AVL树满足以下的条件: 1&#62;它的左子树和右子树都是AVL树； 2&#62;左子树和右子树的高度差不能超过1； 从条件1可能看出是个递归定义,如GNU一样。 AVL树的性质: 1&#62;一棵n个结点的AVL树的其高度保持在0(log2(n)),不会超过3/2log2(n+1)； 2&#62;一棵n个结点的AVL树的平均搜索长度保持在0(log2(n))； 3&#62;一棵n个结点的AVL树删除一个结点做平衡化旋转所需要的时间为0(log2(n))。 从1&#62;这点来看红黑树是牺牲了严格的高度平衡的优越条件为代价，才能够以O(log2 n)的时间复杂度进行搜索、插入、删除操作。 此外，由于它的设计，任何不平衡都会在三次旋转之内解决。当然，还有一些更好的，但实现起来更复杂的数据结构能够做到一步旋转之内达到平衡，但红黑树能够给我们一个比较“便宜”的解决方案。红黑树的算法时间复杂度和AVL相同，但统计性能比AVL树更高。 注：看看人家怎么评价的: AVL trees are actually easier to implement than RB trees because there are fewer cases. And AVL <a href='http://www.yongblog.com/archives/392.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/392.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux下memcached的安装与使用</title>
		<link>http://www.yongblog.com/archives/386.html</link>
		<comments>http://www.yongblog.com/archives/386.html#comments</comments>
		<pubDate>Sat, 05 May 2012 02:50:40 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[Web技术]]></category>
		<category><![CDATA[libmemcached]]></category>
		<category><![CDATA[Memcached]]></category>
		<category><![CDATA[testmemcached]]></category>
		<category><![CDATA[内存对象缓存]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=386</guid>
		<description><![CDATA[许多Web应用都将数据保存到RDBMS中，应用服务器从中读取数据并在浏览器中显示。但随着数据量的增大、访问的集中，就会出现RDBMS的负担加重、数据库响应恶化、网站显示延迟等重大影响。这时就该memcached大显身手了。memcached是高性能的分布式内存缓存服务器。一般的使用目的是，通过缓存数据库查询结果，减少数据库访问次数，以提高动态Web应用的速度、提高可扩展性。关于memcached的详情及原理请参考《Memcached深度剖析(转)》，下面就Linux下对memcached的安装与使用进行简单介绍。 安装环境：Ubuntu11.04 + libevent-2.0.18 + memcached-1.4.13 + libmemcached-1.0.4 一、安装libevent 由于memcached用到了libevent这个库中关于Socket的处理，所以安装memcached之前需安装libevent，目前（2012.5.2）最近版本是libevent-2.0.18-stable.tar.gz，安装方法如下： #tar zxvf libevent-2.0.18-stable.tar.gz #cd libevent-2.0.18-stable #./configure &#8211;prefix=/usr/local/libevent #make #make intsall 二、安装memcached服务器 安装memcached时需要指定libevent的安装路径，目前（2012.5.2）最新版本是memcached-1.4.13.tar.gz，安装方法如下： #tar zxvf memcached-1.4.13.tar.gz #cd memcached-1.4.13 #./configure &#8211;prefix=/usr/local/memcached &#8211;with-libevent=/usr/local/libevent #make #make intsall 三、安装libmemcached客户端 libmemcached是一个用C/C++语言编写的客户端开发包，其主要用途是用来链接到memcached缓存服务器。目前（2012.5.2）最新版本是libmemcached-1.0.7.tar.gz，但笔者在编译安装过程中，出现找不到event.h的错误，所以采用较早的版本libmemcached-1.0.4.tar.gz，安装方法如下： #tar zxvf libmemcached-1.0.4.tar.gz #cd libmemcached-1.0.4 #./configure &#8211;prefix=/usr/local/libmemcached #make #make intsall 经过上面三个步骤，memcached的服务程序及客户端的安装就算完成了&#8230; 四、启动memcached服务器 启动Memcache的服务器端的命令为： #/usr/local/memcached/bin/memcached -d -m 10 -u root -l <a href='http://www.yongblog.com/archives/386.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/386.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>C++对象内存布局测试总结</title>
		<link>http://www.yongblog.com/archives/354.html</link>
		<comments>http://www.yongblog.com/archives/354.html#comments</comments>
		<pubDate>Wed, 02 May 2012 03:14:48 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[内存布局]]></category>
		<category><![CDATA[虚函数继承]]></category>
		<category><![CDATA[虚拟继承]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=354</guid>
		<description><![CDATA[对于普通的C++对象内存布局，比较简单，就不做总结了。这里只总结涉及到虚拟继承的情况。 因为不同编译器对虚拟继承的实现采用不同的方式，所以要完整的分析是不可能的。这里只考虑VS2005/2008，还有简单涉及GCC编译器。 1、单个虚拟继承 只是为了分析而已，实际中并没有太大的作用。跟虚拟继承相关的派生类对象的内存布局跟具体的编译器相关。 （1）VS编译器：无论有无虚函数，必然含有虚基类表指针。虚基类表中的内容为本类实例的偏移和基类实例的相对偏移值。如果有虚函数，那么基类的虚函数表跟派生类的虚函数表是分开的。 在内存布局上，地址从低到高，顺序如下：派生类的虚函数表指针+虚基类表指针+派生类的成员变量+“间隔”（4个字节）+基类的虚函数表指针+基类的成员变量。派生类跟基类实例的位置关系跟普通继承正好相反。 说明：“间隔”产生的原因是派生类重写了基类的虚函数。如果没重写，则这一项没有。”本类地址”指的是包含有虚基类的对象（或部分对象），也就是继承链上的直接子类对象的地址，本例比较简单，就是派生类对象地址。“本类地址跟虚基类表指针地址只差”，这个值经常是-4、0，-4表明“本类”还有一个虚函数表指针；0则表明“本类”的第一个4字节保存的就是虚基类表指针，没有虚函数表指针。                                        图 1 VS编译器—单个虚拟继承 （2）GNU的GCC编译器：跟VS的编译器类似，有不同的地方是，虚基类表跟派生类的虚函数表合并。另外通过虚基类表指针往正负两个方向寻址，可以获得不同偏移值，也就是说有两个功能一样的虚函数表。不过在实际应用的时候，不知道虚基类表是否真的有用，测试了简单的情况发现编译器做了优化，根本就没有用虚基类表来寻址虚基类实例。                                    图 2 GCC编译器—单个虚拟继承 2、虚拟继承多个基类 虚基类表要增加内容，有N个虚基类就有N项基类实例偏移值，再加上1项本类实例的偏移值，也就是N+1。 假设C虚拟继承了A类和B类，考虑最复杂的情况（都有虚函数），那么C类对象的内存布局如下 （VS编译器）： C类虚函数表指针+虚基类表指针+C类成员变量+A类间隔（4个字节） <a href='http://www.yongblog.com/archives/354.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/354.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>从为IBM招聘实习生中学到的经验</title>
		<link>http://www.yongblog.com/archives/349.html</link>
		<comments>http://www.yongblog.com/archives/349.html#comments</comments>
		<pubDate>Wed, 25 Apr 2012 14:50:05 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[写在路上]]></category>
		<category><![CDATA[IBM]]></category>
		<category><![CDATA[工作]]></category>
		<category><![CDATA[招聘]]></category>
		<category><![CDATA[求职]]></category>
		<category><![CDATA[简历]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=349</guid>
		<description><![CDATA[几个月前我曾在博客中公布了IBM要招聘两个实习生来填补它的长期(带薪)实习职位空缺。现在好消息出来了，经过广泛的筛选和一系列繁琐的手续(跨国事务总是这样)，最终有两个学生成功的加入到了我们实验室的DB2团队。 如果你想知道这两个学生是谁，他们是罗马尼亚的Marius Butuc和来自巴西的Henrique Zambon。他们都是很棒的小伙，你们可以在Twitter上关注他们(如果你是说葡萄牙语的，你也许会觉得Henrique的信息会更有趣些)。 选拔过程 我们从世界各地收到了想申请这个实习职位的100位学生的简历。我们邀请了其中50位最有潜力的申请者进行了首次电话交谈，我就是想给每个人一次公平的机会(当然了，我也不想让那些很显然不能得到面试机会的人还抱有任何幻想，对于剩下的申请人我们都通知了他们在初选时没过关)。 在初次面试进行之前，我给这50位预选通过的候选人布置了编程作业。他们可以开发一个CSV到HTML的转换器，或者一个使用Twitter API的客户端搜索工具，或一个S3上传工具。 很显然没有一道习题是关于火箭科学的，我们只是想用一种途径来证明这些学生的编程能力。大部分的候选人选择了CSV到HTML的转换器。一部分人选择了Twiter客户端，很少人选择S3上传工具(有个野心勃勃的候选人竟然把3道题全做了)。 在认真查看了他们的编码后，我对所有交了作业的候选人进行了技术面试。在这首次的面试中我问了他们每个人一系列非常技术性的问题，某些时候我们也会讨论他们的作业。大多数的面试都持续了一个小时左右。 首轮面试结束之后，我选出了10个最有潜力的候选人给了他们第二次的电话通知，我也通知了余下的人将不会再进行面试。 第二轮面试时我的经理加入了进来，一起对每个候选人进行电话交谈，谈话不大牵涉候选人的个人技能。这第二次的面试是要看看他们的软实力，了解一下他们的兴趣爱好，看看他们的综合心理状况。 这种面试很重要，它能让我们更进一步的了解候选者。我们的目的是想知道这些充满渴望的候选人对什么感兴趣，看看他们对编程的热情有多少，发现一些他们的跟编程并不十分相关的其它技能。我们也会跟他们讨论一下如果他们被选中后将会参与的项目、我们的团队合作方式(我们更像一个敏捷开发的新团队，而不是人们对IBM的老旧印象)，我们还和这10位候选人都详细讨论了下一步我们将做些什么。 至此Leon(我的经理)和我最终讨论了哪两位申请人应该被选中。十位候选人都很优秀，我们要做出选择并不是很容易。我们仔细研究了整个过程中的细枝末节，从他们的简历、过往经历，到他们的作业上的表现，他们知道的(人类的和编程的)语言，他们对这几次面试的看法。 经过反复的考虑，我们最终选择了Marius和Henrique。(也许你会奇怪，那个把三道题全做了的学生也是来自罗马尼亚呀，如果能保证Marius和Henrique成功的获得实习资格的话，他将是我们的第三选择。) 从面试了这么多候选人中学到的东西 当你突然从世界各地收到100个非常优秀的学生的简历时，你会马上发现，要想去判断一个人的真实能力是异常的困难。光从纸上看每个人都优秀的不得了！这就是我为什么必须用一些特殊的东西显示出他们之间的区别，而不能只依据他们的课题表现和学习成绩(下面我还要更详细的说这个问题)。 编程作业对确定一个人的真实能力有巨大的帮助。有些做的最好的作业是来自理论表达能力很弱的人。你可以很清楚的看出谁才是程序员或有潜质将来成为计算机科学家的人。如果没有这个作业任务，选拔工作会困难的多，所以我很愿意找出一点东西让申请人去做做。 有一点很意外，即使是非常好的学生，看起来对一些相对直接的算法问题也会感到困难，不如其它类型的问题感到轻松。一些问题就像：红-黑树是什么？有什么用处？你能向我解释一下P vs NP的问题吗？(请注意，这些都是相对开放的问题，通常我会接着问一些特定的问题来评估候选人的理论知识背景 — 也就是他们对这些问题的思考方式。) 大多数的学生并不了解现实生活中的编程活动。特别的，他们似乎并不是十分关注时事，大多数人从来没听说过例如SVN, GIT, MVC, ORM, Agile programming, 或 NoSQL等东西。 通常，质量偏差的候选人的简历上列出的品质我们看起来都有些夸张，而对于优秀的人的反而显得有些低估了。(这有点像某种形式的达克效应(Dunning–Kruger effect)在起作用。) 有些候选人，利用远程电话面试的便利，试图使用Google来搜索答案，当我问到了他们不太熟悉的知识时，我确实听到了他们敲击键盘的声音，嘴里回答，“嗯…这个…”，跟着一个20秒的停顿，然后把从维基百科上找到的东西全都粘贴出来。很容易就能看出里面的猫腻，这种不诚实的表现最终会给候选人带来不好的印象。 招募人是件难事。需要花费大量的时间和精力；要做出理性的决定是件很有挑战性的事，因为大多数情况下真的需要你拿苹果和橘子做比较。 什么样的简历能打动我 开源软件的参与者(一个GitHub的链接立即能引起我对这个候选人的兴趣)。 简要但明了的描述在学校课程之外为外界公司曾实现过的项目(在业余时间或实习期间)。 对编程社区类的社会媒体的参与。是否有StackOverflow身份？跟编程相关的Twitter账户？或者跟这个主题相关的博客？虽然这些事情单独看起来并不能说明某人是个好程序员，但这些却是一个适当的指标来说明一个人至少热衷于这个学科。是否出席行业相关会议也是一个很重要能说明对这个领域的兴趣的指示。 知道不常见的编程语言。基本上每个人都在简历上写了Java，然而，只是这些还不最够吸引我这个面试官的眼球。(该死，连Python也开始变得很平常了。)如果候选人声称自己会Haskell, Scala, Clojure, OCaml, Scheme, Factor, Io, J, 等等… 这绝对能吸引我。同样，这也并不能保证其人就是个好的程序员，但这很可能就说明了他们对这个职业有高于常人的兴趣，或者在大学里这些语言都学过(这也许是个不好的信号)。 我不确定你能从这篇文章里得到些什么，但是把上面描述的整个招聘过程当成一个有趣的事情分享给大家是有价值的。如果你是一个正处在相同情形下的学生，如果正打算向一个类似IBM这样的公司申请实习，读了这篇文章你就会知道该怎么做了。如果你发现自己是一个处在相似情况下的面试官，你会在这篇文章里发现很多相关的观点。 最后一点提示：对于好奇的人，下面的是在我们团队第一次Party上的Henrique 和 Marius(有点喝多了)： 本文转自: http://www.aqee.net/things-i%E2%80%99ve-learned-from-hiring-interns-for-ibm/ <a href='http://www.yongblog.com/archives/349.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/349.html/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Java中栈(Stack)和堆(Heap)的区别</title>
		<link>http://www.yongblog.com/archives/381.html</link>
		<comments>http://www.yongblog.com/archives/381.html#comments</comments>
		<pubDate>Sun, 08 Apr 2012 13:09:57 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[内存指令]]></category>
		<category><![CDATA[堆存储]]></category>
		<category><![CDATA[对象实例]]></category>
		<category><![CDATA[栈存储]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=381</guid>
		<description><![CDATA[首先分清楚Stack，Heap的中文翻译：Stack——栈，Heap——堆。 在中文里，Stack可以翻译为“堆栈”，所以查找了计算机术语里面堆和栈开头的词语： 堆存储: heapstorage；   堆存储分配: heapstorage allocation；   堆存储管理: heap storage management； 栈编址: stack addressing；   栈变换: stack transformation；  栈存储器: stack memory；   栈单元:  stack cell. 接着，总结在Java里面Stack和Heap分别存储数据的不同。 关于Stack和Heap更多具体的存储原理及区别，参考《栈(Stack)和堆(Heap)的区别》 1. 保存对象实例，实际上是保存对象实例的属性值，属性的类型和对象本身的类型标记等，并不保存对象的方法（方法是指令，保存在stack中），对象实例在heap中分配好以后，需要在stack中保存一个4字节的heap内存地址，用来定位该对象实例在heap中的位置，便于找到该对象实例； 2. 基本数据类型包括byte、int、char、long、float、double、boolean和short，函数方法属于指令。 ==================================== 引用网上广泛流传的“Java堆和栈的区别”里面对堆和栈的介绍： “Java 的堆是一个运行时数据区,类的(对象从中分配空间。这些对象通过new、newarray、anewarray和multianewarray等指令建立，它们不需要程序代码来显式的释放。堆是由垃圾回收来负责的，堆的优势是可以动态地分配内存大小，生存期也不必事先告诉编译器，因为它是在运行时动态分配内存的，Java的垃圾收集器会自动收走这些不再使用的数据。但缺点是，由于要在运行时动态分配内存，存取速度较慢。” “栈”的优势是，存取速度比堆要快，仅次于寄存器，栈数据可以共享。但缺点是，存在栈中的数据大小与生存期必须是确定的，缺乏灵活性。栈中主要存放一些基本类型的变量（int, short, long, byte, float, double, boolean, char）和对象句柄。” 可见，垃圾回收GC是针对堆Heap的，而栈因为本身是FILO &#8211; first in, last out. 先进后出，能够自动释放。 这样就能明白到new创建的对象，都是放到堆Heap中的. 本文转自：http://android.blog.51cto.com/268543/50100 转载请注明出处。]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/381.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>栈(Stack)和堆(Heap)的区别</title>
		<link>http://www.yongblog.com/archives/379.html</link>
		<comments>http://www.yongblog.com/archives/379.html#comments</comments>
		<pubDate>Thu, 05 Apr 2012 09:27:16 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[Heap]]></category>
		<category><![CDATA[new]]></category>
		<category><![CDATA[Stack]]></category>
		<category><![CDATA[static]]></category>
		<category><![CDATA[动态内存分配]]></category>
		<category><![CDATA[堆]]></category>
		<category><![CDATA[栈]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=379</guid>
		<description><![CDATA[一、关于栈(Stack)和堆(Heap)的问题: 栈(Stack）：由操作系统分配和回收，函数调用的参数及其内部局部变量就是从这分配。其特点是：分配容量有限且连续比较固定，但不容易引起内存泄露。 堆(Heap）：易称动态分配，是由程序员自己分配和回收的，如程序员用new, malloc分配内存，用delete, free来释放内存。若在程序结束时，未回收则由操作系统来完成回收工作。其特点是：分配容量较大且比较灵活，且内存不要求连续，但容易造成内存泄露； 注：它们都不同于数据结构中的堆栈结构，需要区分理解。补充解释： 操作系统里的堆和栈是指对内存进行操作和管理的一些方式. 数据结构里面的堆实际上指的就是（满足堆性质的）优先Queue的一种数据结构,第1个元素有最高的优先权;栈实际上就是满足先进后出的性质的数学或数据结构. 堆栈的说法是连起来叫,但是他们还是有很大不同的,连着叫只是由于历史的原因。 简单地讲“堆栈”（栈）就是一个序列,这个序列按照后进先出(POP/PUSH)的规则组织。 “栈”就是整齐的货物一个挨一个地码在一起.整齐的货物就是同样的数据类型.最后码上去的肯定在最上边,最上边的也肯定是最先搬下来. “堆”应该是”堆栈”的一种推广.按照某种优先原则组织的一组数据. “堆”就是一些货物看似杂乱无章地堆在一起,但是可以按某种原则每次取一个出来.”二叉堆”像不像一个堆成金字塔的货堆? “堆栈”（栈）是”堆”的优先原则的一种特例。 百科全书对数据结构中的“堆”的解释：在计算机科学中，堆是一种经过排序的树形数据结构，每个结点都有一个值。通常我们所说的堆的数据结构，是指二叉堆。堆的特点是根结点的值最小（或最大），且根结点的两个子树也是一个堆。由于堆的这个特性，常用来实现优先队列，并用于一些图论算法中。堆也用于排序算法，如堆排序。一般我们平时所说的“堆栈”就是”栈”,千万别跟”堆”混淆了,在英语中很容易将他们区分开来,一个是stack，另一个是heap。堆为heap,堆栈为stack.用new分配（c++中的）的动态内存在heap中，局部变量在stack中。 栈这种机制是受到处理器支持的，有指令对它进行操作的，例如你熟悉的push和pop。但是堆（Heap）是一种比较高级的数据结构，之所以说高级，是因为它需要操作系统支持！也就是说，不同的操作系统有不同的堆管理算法。处理器根本不知道什么是堆，所以你看到没有指令是对堆直接操作的。汇编中没有堆的概念, 要动态内存分配的话, 其实要通过操作系统的支持。堆（Heap）是操作系统建立起来的动态内存管理的逻辑结构，不同的操作系统有不同的实现。与具体的语言没有关系，new只是c++为了可移植性而添加的关键字，不同平台下的c\c++运行库new有不同的实现。 汇编中的栈段相对于其他的段有特别的要求(比如在特权级的要求上)，C语言中的栈则比较广义,只要是先进后出的都可以叫栈,而不一定要由SS:ESP或SS:EBP寻址。内存的物理结构都是一样的。无论是堆（Heap）还是栈（Stack）都是逻辑结构，而这些逻辑结构是在不同的层次上划分的，比如在汇编中它分为三个区data area, code area, Stack area这三个区域是由汇编器（assembler）来实现的，而c语言它的编译器（编译器是根据c语言的语法标准来编的，如果你有机会可以看看编译原理）把内存分成了四块除了上面的三块之外还有堆（Heap）（这里堆的管理是由所在的操作系统决定的，与是那种语言无关）。这就好比一个鸡蛋，从不同的角度看，它是不一样的，在不同的层面上看它也是不一样的。 二、预备知识（程序员面试宝典第三版-p179） 2.1、程序的内存分配 一个由C/C++编译的程序占用的内存分为以下几个部分： 1、栈区（Stack）：由编译器自动分配释放，存放函数的参数值，局部变量的值等，其操作方式类似于数据结构中的栈； 2、堆区（Heap）：一般由程序员分配释放，若程序员不释放，程序结束时可能由OS回收(注意它与数据结构中的堆是两回事，分配方式倒是类似于链表)； 3、全局区（静态区）（Static）：全局变量和静态变量的存储是放在一块的，初始化的全局变量和静态变量在一块区域， 未初始化的全局变量和未初始化的静态变量在相邻的另一块区域，程序结束后由系统释放； 4、常量存储区：常量字符串就是放在这里的，程序结束后由系统释放； 5、程序代码区：存放函数体的二进制代码。 6、补充： static全局变量与普通的全局变量有什么区别： static全局变量只初使化一次，防止在其他文件单元中被引用; static局部变量和普通局部变量有什么区别： static局部变量只被初始化一次，下一次依据上一次结果值； 全局变量(外部变量)的说明之前再冠以static 就构成了静态的全局变量。全局变量本身就是静态存储方式， 静态全局变量当然也是静态存储方式。 这两者在存储方式上并无不同。这两者的区别在于非静态全局变量的作用域是整个源程序， 当一个源程序由多个源文件组成时，非静态的全局变量在各个源文件中都是有效的。 而静态全局变量则限制了其作用域， 即只在定义该变量的源文件内有效， 在同一源程序的其它源文件中不能使用它。由于静态全局变量的作用域局限于一个源文件内，只能为该源文件内的函数公用， 因此可以避免在其它源文件中引起错误。 把局部变量改变为静态变量后是改变了它的存储方式即改变了它的生存期。把全局变量改变为静态变量后是改变了它的作用域，限制了它的使用范围。 例子程序 //main.cpp int a = 0; //全局初始化区 <a href='http://www.yongblog.com/archives/379.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/379.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>云计算、社交网络和移动互联网</title>
		<link>http://www.yongblog.com/archives/331.html</link>
		<comments>http://www.yongblog.com/archives/331.html#comments</comments>
		<pubDate>Sat, 24 Mar 2012 06:12:06 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[专业生活]]></category>
		<category><![CDATA[云计算]]></category>
		<category><![CDATA[社交网络]]></category>
		<category><![CDATA[移动互联网]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=331</guid>
		<description><![CDATA[本文的目的是用简明扼要的语言向你解释这三个时下最流行的IT术语（云计算、社交网络和移动互联网）的实质，分析它们的问题，并预测未来趋势。 什么是云计算 　　首先是云计算。时至今日，我的身边还常有朋友问起，这个喊得震天响的云计算，到底是什么东西？开始时我也会解释一大堆话，后来发现，简单记得住最管用。于是概括为一句：云计算就是互联网，互联网就是云计算。而云计算的用处，或者说目的，是要将个人电脑（台式机也好笔记本也好）放到互联网中。 　　什么叫个人电脑放到互联网中？举例来说，你能直接在网络上看电视剧，并且可以在任何能上网的地方接着看同一部电视剧。而在几年前，你可能得先把电视剧一集集下载到你的个人电脑里，还得先安装好暴风影音这样的播放软件。换句话说，原本属于个人电脑的功能，现在被互联网替代了。 　　云计算的最终目的，就是要取代个人电脑的全部功能，这就叫把个人电脑放到网络里。云计算将最终让你能够在任何时间任何地点做任何与电脑相关的事，还不用随身带着笔记本或者U盘，因为你需要的所有数据、软件都在云中，在你的网络账户里。 　　对IT圈外的朋友来说，“把个人电脑放到网络里”这句话听起来可能还不够刺激。充其量，它不过能让我们的信息生活更方便而已。但如果我告诉你这一变化将造成曾经只手遮天的微软帝国的消失，那么你可能精神为之一振。有那么厉害吗？不过细想想也不奇怪，如果个人电脑都消失了，那么Windows还有什么用呢？ 　　回顾一下我们如今的电脑操作，那种软件使用的最为频繁？没错，是浏览器。当云计算的终极目的成真，我们将只需要在本地电脑中留下一个浏览器，而不再需要Windows的其它复杂功能。到那时，我们甚至希望开机就直接看到一个运行之中的浏览器，而不再需要Windows本身（这正是Google的chrome os项目的目标）。 　　对于IT从业人士来说，个人电脑向互联网的迁移意味着无穷无尽的机会和可能。以往我们熟悉的各种桌面软件，大到Office，小到记事本，在云时代都需要改写为互联网中的网页。仅这一条就意味着数以亿计的潜在财富价值。更不用说个人电脑向互联网迁移过程所伴随的另一个实质性变化——社交。 　　社交的本质是人与人之间的交流，而个人电脑向互联网的迁移正好将为社交舞台提供远远超过今天的空前庞大的用户群体基础。我们知道，即使是在Windows和互联网共存的今天，社交网络服务都已经产生了如Facebook般市值估价超过千亿的超级大公司。换句话说，云计算孕育的不仅是再造一个微软帝国的潜力，更意味着一个史无前例的巨大影响力的信息时代的真正来临。 云计算分析与预测 　　 　　对于业内人士来说，即使所有人都知道云计算的好处，也不见得有多少人能真真切切地将它落到实处。表面轰轰烈烈的云计算产业建设，到如今看来也不过是为多搞一些机房拉资金的噱头。落到实处的云计算就只是铺宽带、上机器？前车之鉴是，电信运营商们投入大笔资金砸向3G，等到管道铺好才最终发现自己更像是在为互联网公司们做嫁裳。 　　硬件投资是必须的也是赚钱的，但它只是行业生态系统中最低端的部分。这种技术门槛极低的基础建设就不要再拉上云计算的幌子了。 　　云计算的真正精彩在于软件行业。虽然以“互联网即云计算”的角度来讲，所有互联网公司都与云计算相关，但却并非所有的互联网公司都在真实地参与云计算的发展进程。不是不想参与，是不知如何参与。 　　应该怎样将云计算落到实处？紧紧把握“个人电脑向互联网迁移”这一本质正是关键。遵循这一思路，网络操作系统，或者说online windows，也许正是云计算领域的头等发展大事。如果做不了OS，那么退而求其次，发展云时代的应用软件，或者说互联网服务，也是正解。 　　先来看操作系统。网络操作系统将是什么样的？有人认为浏览器即使未来云时代的操作系统。不对！请记住，云时代的特点是“一切皆在云中”。因此，浏览器这种本地软件注定了它与云无缘。在它身上下功夫，势必走本地化的老路，离云越来越远。归根结底，浏览器只是一个客户端，一个云的终端显示驱动，不可能成为网络操作系统。浏览器在当下仍是各大公司们抢得死去活来的网络入口，但那只是云中的世界还不够成熟时的假象。随着更多个人电脑功能迁移至云中，浏览器将最终成为一个不需要附加功能的躯壳，使用哪种浏览器接入云中将变得不再重要。 　　也有一些聪明的公司看懂了云的未来。就国内而言，腾讯在这方面的动作可谓领先一步。打开web2.qq.com，呈现在眼前的与其说是网页，不如说是在线的windows桌面。这种数据、软件、操作皆在云中的网络桌面，正是网络操作系统的雏形。随着越来越丰富的第三方应用被加入其中，企鹅帝国的野心也昭然若揭。 　　辛运的是，云计算并非复制一个online windows那么简单。这才使云计算不至于被大公司们垄断，从而给我们留下了参与的机会。问题在于，即使腾讯们把页面做得再像Windows，互联网的生态也不会遭到个人电脑时代的垄断之灾。门户主页、电子邮箱还是可以照常打开，丝毫不受所谓网络操作系统的约束。要知道，在个人电脑时代，任何软件没有Windows都是不可能存在的。这种截然不同的本质区别表明：看起来很像Windows的网络桌面只是一个桌面。你甚至可以将它理解为网络硬盘。无论如何，它绝对不是真正意义上的操作系统。 　　尽管如此，网络桌面仍然是云时代生态系统中最接近操作系统的一环。只是，当年Windows的荣光再也无法复制，绝对垄断的可能也将连同这种并不光彩的荣耀一同褪去。某个优秀的网络桌面（比如Facebook）可能长期被大多数人设为主页，但这并不妨碍长尾用户群中的少数人按照自己的偏好选择其它网络桌面。不同公司的网络桌面产品将共存于云中，而所有互联网服务都可以很好地在它们中运行，不受兼容性的困扰。因为，云时代的决定性标准不是由某一家制定，而是植根于已经深入人心的公共网络协议。 　　换句话说，云时代将不再存在真正意义上的操作系统。网络桌面与其说是操作系统，不如说是另一种云中的应用软件。也可以认为，云时代的操作系统，由互联网中的所有服务共同组成。 　　因此，落实云时代的关键，最终归结为开发互联网服务。但是，互联网服务并不等于传统的互联网网站。最大区别，在于互联网服务于用户及其它服务交互的软件特性，而传统网站只是一段段静止的文字和图片，只相当于个人电脑中的一个个数据文件。 　　这就是为什么互联网中为数众多的网站中，只有少数算是真正参与到了云计算的进程之中。即使是Web2.0的兴起让许多网站开始重视与用户的互动，也很少有网站能够像Windows时代的软件一样，与外部数据一起与系统共生。换到互联网语境之中，这也可以理解为网站的开放性。在这方面，不仅需要胆略，更需要想象力。Facebook与Myspace的不同，正是因为前者将自己的社交资源向外界开放，才获得了决定性的质的飞跃。 　　简而言之，喧嚣的云计算其实很简单。无需长篇累牍的论文，无需盲目的政府投资。未来和机遇在于互联网服务的创新和细化。中小互联网内容提供商将扮演越来越重要的角色。平台和系统将不再重要，绝对性的垄断将分流到一些优秀的互联网服务之中。随着云计算的深入，优秀的互联网服务将越来越多，信息世界的秩序则将最终趋于平等和自由。 社交网络 　　相较于云计算，社交网络的概念容易理解一些。毕竟，人们对社交并不陌生。社交网络嘛，就是在网络上社交呗。用更广义也更简单的话来概括，社交网络就是多用户参与的网络。 　　从这个意义上讲，Web2.0热潮的核心概念社交网络并不是什么新鲜事物。为人熟知的即时通讯软件如QQ，多人网络游戏如传奇，都是早在Web2.0之前就已经大获成功的社交网络服务。 　　今天，我们已经有了Facebook、腾讯等巨无霸级的大型社交网站。这是否意味着社交网站已经发展到了熟透的阶段？是否意味着后人已经没有进入该领域的机会？ 　　结论恰恰相反。随着以“个人电脑向互联网迁移”为核心的云计算进程的深入，使用网络的人群基数将远远超过今天的数量。同时，未来人们的每一次电脑操作都将与网络相关。云计算的模式结构与其用户总量的叠加结果，将是前所未有的新的社交需求。我们所需要的，只是更多的想象力，去挖掘这些潜在的可能性，而完全无须担心今天看起来庞大的Facebook们。社交，依然前景无限。 第三方登录的深意 　　更令人欣喜的是，大多数大型社交网站都已经陆续开放了第三方登录功能。今天，我们已经可以在很多中小网站中见到“用QQ账号登录”的选项。用户可以直接通过已有的QQ账户登录，而无需另外注册。这既是所谓的第三方登录。对中小网站来说，这绝对是有效吸引用户流量的天大喜事。 　　为什么社交网站巨头们要做这样的慈善事业？要知道，今天名不见经传的小网站，明天就可能成长为可怕的竞争对手？究竟其中有何玄机？ 　　这个问题有很多不同的解答，但深层的答案还是要从云计算之中寻找。我们之前讲过，云计算的生态将最终由许多互联网服务共同构成，这些互联网服务将呈现出一种开放可交互的状态，就如同个人电脑中软件与软件，软件与数据文件的关系一般。云中的“个人电脑”要求云中的“软件”们互通而不是各自为政，而互通的关键则是统一的用户身份认证。 　　换句话说，用一个账户通行互联网是云计算的天然需求，而现行互联网中一个网站一套用户账户的格局已然成为了云计算发展道路上的绊脚石，破除它势在必行。 　　这种技术发展所蕴含的自发动力才是巨头们开放用户资料行为的幕后推手。早在Facebook率先开放用户资料之前，用于账户互通目的的网络通行证技术OpenID就已经如暗流涌动，随时可能破冰而出。即使Facebook自己不开放，迟早也会有别的网站这么做。与其守住既得利益等到人老珠黄，不如顺势而为与世界共同前进。这也正是一流公司是否能够持续优秀的基因所在。 　　从长远看来，开放账户资料的确会逐渐削弱Facebook这样的巨头原先拥有的平台垄断优势，甚至有沦为账号提供商的风险。但这是大势所趋。互联网从诞生之日其就担负着自由与平等的使命，任谁也改变不了。顺势而为，秉持开放的态度，反而能够在现有的优势基础上，集中精力做强做深具体的内容服务，从而在新的阶段持续保持优势。例如，在社交空间这项服务上，相信Facebook将长期保有优势（所谓社交空间，即用户进行经常性社交活动的场合。并非所有的社交活动都在社交空间完成，但社交空间却是社交活动最多的场合）。 　　对于广大IT从业人员来说，开放的互联网当然更意味着福音，这是一个多赢的局面。伴随着云时代的深入，社交这块大蛋糕将愈发显露出活力。 移动互联网 　　移动互联网也许是时下最热的IT领域，连圈外的朋友们也很乐意将它作为时髦词挂在嘴边。毕竟，不懂云计算，不懂SNS，还不懂天天把玩的小手机吗？ 　　然而，笔者要说的是，移动互联网恰恰是笔者最不看好的方向。一旦IT再次出现泡沫（但愿不会），其源头必然是今天投资人竞相追捧的所谓移动互联网。 手机≠移动互联网 　　最大的问题也是最容易搞错的一点是：手机不等于移动互联网！如果你仔细读过本系列文章之前的部分，你应该明白，未来的互联网将成为每个人的“个人电脑”，而任何一种具备显示屏的终端，无论是台式机、笔记本、手机、腕表、相机，又或是公共查询机甚至是ATM机，都将成为云中“个人电脑”的显示终端。换句话说，互联网的未来形态天生就是移动的，而与是否使用手机无关。我们将会在不同的地方以不同的设备接入云中的“个人电脑”，这才是移动的真实含义。 　　那么手机将会是移动互联网的最重要组成部分吗？是，又不是。我们的确将经常使用手机来接入互联网，但同时大部分的工作仍然是通过其它设备，尤其是传统的配备有大屏幕的台式机或者笔记本来完成。 　　原因在于，手机归根结底受制于屏幕大小和输入的流畅性，因而不可能成为大部分电脑操作的适用设备。你可以用手机编短信发微博，但你不会用它来编辑word或excel，甚至长一点的email也不会用它。同样的，你用手机来弹小鸟打僵尸，但你会长时间用它来玩魔兽或是使命召唤吗？甚至赛车游戏你也会觉得还是台式机来的爽快。 　　把手机屏幕做大点能不能有所帮助？君不见今天清一色苹果长相的智能手机们比拼的正是面子大小。只是实在怀疑，这种令广大MM们不爽的砖头风到底能持续多久？莫非我们真的想要吧笔记本揣到裤兜里逛街？NO！那还是手机吗？ 　　手机的定义决定了它的体积不可能无限增长。它的输入方式从键盘、触摸再到语音、图像识别也就达到了想象力的上限。最顶级的设备也无法改变手机不利于阅读和输入的特性，因此已经和正在烧钱的朋友们请接受这个现实：手机≠移动互联网，手机只适合简单应用，最多是正常应用的简化版。 　　给手机设计开发者如下建议。你们开发的应用应该： 　　1.不需要总是看屏幕 　　2.不需要仔细看屏幕 　　3.如果你的应用必须随时看屏幕，仔细看屏幕，那就不用煞费苦心在手机上牵强附会了。配备有鼠标键盘和正常尺寸屏幕的传统电脑才是你应该考虑的目标。手机取代不了传统电脑。 第二个问题 　　笔者不看好移动互联网的第二个根本原因在于基础设施的不成熟。即使已经到了3G审美疲劳4G才是王道的21世纪，我们最缺的依然是基础设施建设。今天的移动互联网硬件环境，和我们刚跨入新世纪互联网刚抬起全民普及苗头时的那个年代极其相似。从业者一片热血沸腾，用户们却还在盘算30块钱包20小时还是80块钱包60小时划算。 　　历史的惊人相似实在无法不让人联想到曾经的泡沫危机。君不见，上一次的互联网喧嚣散尽之后，多少互联网先驱们被拍在岸边，死在明天。足足七八年之后互联网才盼到了复苏，结果是毛头小子开心网们捡了大便宜，而从之前的阴影中活下来的就只有利用互联网却不采用互联网思路的QQ而已。 <a href='http://www.yongblog.com/archives/331.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/331.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux gedit文本编辑器“准IDE”配置</title>
		<link>http://www.yongblog.com/archives/335.html</link>
		<comments>http://www.yongblog.com/archives/335.html#comments</comments>
		<pubDate>Sun, 26 Feb 2012 13:03:18 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[Unix/Linux]]></category>
		<category><![CDATA[gedit文本编辑器]]></category>
		<category><![CDATA[makefile]]></category>
		<category><![CDATA[准IDE]]></category>
		<category><![CDATA[插件]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=335</guid>
		<description><![CDATA[可能不少人会问，Linux下什么类型的可用软件最多？答案是文本处理程序。除了常见的Grep、more、less、cat、awk等文本显示和处理程序外，更多的，就是文本编辑器了。在新立得下试着搜索一下，能够找到的文本编辑器简直可以按“堆”来计算。这里，简单介绍一下Linux下常用的gedit文本编辑器配置方法，以方便初学者能够较快地适应Linux的使用环境。其实对于Linux下将文本编辑器配置成IED还有其他文本编辑器，比如Emacs、Editra，Geany，有些其功能远比gedit文本编辑器强大。由于个人精力和知识有限，难免有些介绍会有遗漏，如哪位朋友发现相关错误，请在评论中告知。]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/335.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>归——写给本命年的自己(下)</title>
		<link>http://www.yongblog.com/archives/328.html</link>
		<comments>http://www.yongblog.com/archives/328.html#comments</comments>
		<pubDate>Sat, 14 Jan 2012 12:09:08 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[写在路上]]></category>
		<category><![CDATA[写给自己]]></category>
		<category><![CDATA[愿望]]></category>
		<category><![CDATA[本命年]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=328</guid>
		<description><![CDATA[       2011年，本命年。这一年，经历了风风雨雨，无需太多的语言去总结，简简单单两个字，那就是：给力！！！          新的一年快要到来了，在这新春之际，默默的许下三个愿望；深深地祝福所有爱我和我爱的人&#8230;                                                                                             <a href='http://www.yongblog.com/archives/328.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/328.html/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Java内存泄露的理解与解决</title>
		<link>http://www.yongblog.com/archives/345.html</link>
		<comments>http://www.yongblog.com/archives/345.html#comments</comments>
		<pubDate>Sun, 18 Dec 2011 09:23:14 +0000</pubDate>
		<dc:creator>yong</dc:creator>
				<category><![CDATA[Java]]></category>
		<category><![CDATA[内存泄漏]]></category>
		<category><![CDATA[垃圾回收机制（GC）]]></category>
		<category><![CDATA[引用]]></category>

		<guid isPermaLink="false">http://www.yongblog.com/?p=345</guid>
		<description><![CDATA[一、Java内存管理机制      在C++语言中，如果需要动态分配一块内存，程序员需要负责这块内存的整个生命周期。从申请分配、到使用、再到最后的释放。这样的过程非常灵活，但是却十分繁琐，程序员很容易由于疏忽而忘记释放内存，从而导致内存的泄露。Java语言对内存管理做了自己的优化，这就是垃圾回收机制。Java的几乎所有内存对象都是在堆内存上分配（基本数据类型除外），然后由GC（garbage collection）负责自动回收不再使用的内存。     上面是Java内存管理机制的基本情况。但是如果仅仅理解到这里，我们在实际的项目开发中仍然会遇到内存泄漏的问题。也许有人表示怀疑，既然Java的垃圾回收机制能够自动的回收内存，怎么还会出现内存泄漏的情况呢？这个问题，我们需要知道GC在什么时候回收内存对象，什么样的内存对象会被GC认为是“不再使用”的。      Java中对内存对象的访问，使用的是引用的方式。在Java代码中我们维护一个内存对象的引用变量，通过这个引用变量的值，我们可以访问到对应的内存地址中的内存对象空间。在Java程序中，这个引用变量本身既可以存放堆内存中，又可以放在代码栈的内存中（与基本数据类型相同）。GC线程会从代码栈中的引用变量开始跟踪，从而判定哪些内存是正在使用的。如果GC线程通过这种方式，无法跟踪到某一块堆内存，那么GC就认为这块内存将不再使用了（因为代码中已经无法访问这块内存了）。      通过这种有向图的内存管理方式，当一个内存对象失去了所有的引用之后，GC就可以将其回收。反过来说，如果这个对象还存在引用，那么它将不会被GC回收，哪怕是Java虚拟机抛出OutOfMemoryError。 二、Java内存泄露 一般般来说内存泄漏有两种情况。一种情况如在C/C++语言中的，在堆中的分配的内存，在没有将其释放掉的时候，就将所有能访问这块内存的方式都删掉（如指针重新赋值）；另一种情况则是在内存对象明明已经不需要的时候，还仍然保留着这块内存和它的访问方式（引用）。第一种情况，在Java中已经由于垃圾回收机制的引入，得到了很好的解决。所以，Java中的内存泄漏，主要指的是第二种情况。 可能光说概念太抽象了，大家可以看一下这样的例子： Vector v = new Vector(10);         for (int i = 1; i &#60; 100; i++){         Object o = new Object();         v.add(o);         o=null; } <a href='http://www.yongblog.com/archives/345.html' class='excerpt-more'>[...]</a>]]></description>
		<wfw:commentRss>http://www.yongblog.com/archives/345.html/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

