<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearch/1.1/" xmlns:georss="http://www.georss.org/georss" xmlns:gd="http://schemas.google.com/g/2005" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" gd:etag="W/&quot;C0IFRX8_fSp7ImA9WxNVEkQ.&quot;"><id>tag:blogger.com,1999:blog-7253982</id><updated>2009-10-23T02:51:54.145-07:00</updated><title>Gan, Zhi</title><subtitle type="html">My current interests:
1. Multi-threaded programming
2. Performance tuning
3. Programming language and tools.</subtitle><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/posts/default" /><link rel="alternate" type="text/html" href="http://ganzhi.blogspot.com/" /><link rel="hub" href="http://pubsubhubbub.appspot.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default?start-index=26&amp;max-results=25&amp;redirect=false&amp;v=2" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>141</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><link rel="self" href="http://feeds.feedburner.com/GanZhi" type="application/atom+xml" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry gd:etag="W/&quot;Dk4CQ3syeip7ImA9WxNQFkQ.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-208825045116710271</id><published>2009-09-23T01:29:00.001-07:00</published><updated>2009-09-23T01:36:02.592-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-09-23T01:36:02.592-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>回龙观的彩虹</title><content type="html">在回龙观公园春游时拍的，今天翻照片的时候看到了，非常赞！&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SrnctOAYM6I/AAAAAAAAB9w/O1ALCNbtWP8/s1600-h/100_0047.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SrnctOAYM6I/AAAAAAAAB9w/O1ALCNbtWP8/s400/100_0047.JPG" alt="" id="BLOGGER_PHOTO_ID_5384577498910045090" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-208825045116710271?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/208825045116710271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=208825045116710271" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/208825045116710271?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/208825045116710271?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/7p6ti-1AcAQ/blog-post.html" title="回龙观的彩虹" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_BswWlutyN3g/SrnctOAYM6I/AAAAAAAAB9w/O1ALCNbtWP8/s72-c/100_0047.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/09/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkcAR30zfip7ImA9WxNSEk0.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7039480939846952671</id><published>2009-08-25T05:35:00.000-07:00</published><updated>2009-08-25T05:40:46.386-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-25T05:40:46.386-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="life" /><title>又一个乐高玩具</title><content type="html">儿子的生日礼物，胜利完成：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BswWlutyN3g/SpPbhv6vgNI/AAAAAAAAB7k/coEr4nj5hsc/s1600-h/DSC_5605.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_BswWlutyN3g/SpPbhv6vgNI/AAAAAAAAB7k/coEr4nj5hsc/s400/DSC_5605.JPG" alt="" id="BLOGGER_PHOTO_ID_5373880153228148946" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_BswWlutyN3g/SpPbg-gurrI/AAAAAAAAB7c/j0n_Qx1BSEc/s1600-h/DSC_5604.JPG"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://3.bp.blogspot.com/_BswWlutyN3g/SpPbg-gurrI/AAAAAAAAB7c/j0n_Qx1BSEc/s400/DSC_5604.JPG" alt="" id="BLOGGER_PHOTO_ID_5373880139965705906" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7039480939846952671?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7039480939846952671/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7039480939846952671" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7039480939846952671?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7039480939846952671?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/LLfl5r8a7xY/blog-post.html" title="又一个乐高玩具" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://3.bp.blogspot.com/_BswWlutyN3g/SpPbhv6vgNI/AAAAAAAAB7k/coEr4nj5hsc/s72-c/DSC_5605.JPG" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/08/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IGQ3k9fip7ImA9WxNTEEo.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-5418645330674355897</id><published>2009-08-12T04:08:00.000-07:00</published><updated>2009-08-12T04:12:02.766-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-08-12T04:12:02.766-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>外接显示器的分辨率在Ubuntu 9.04下终于正常了</title><content type="html">自从升级到Ubuntu 9.04之后，外接显示器一直都只能运行在1280x1024下，尽管实际的最高分辨率是1680x1050。上网搜了一下并尝试了如下命令：&lt;br /&gt;&lt;blockquote&gt;sudo dpkg-reconfigure -phigh xserver-xorg&lt;/blockquote&gt;&lt;br /&gt;重启动X之后，一切正常!终于不用看模糊的屏幕了，感动！&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-5418645330674355897?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/5418645330674355897/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=5418645330674355897" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5418645330674355897?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5418645330674355897?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/VPheLjV1W6I/ubuntu-904.html" title="外接显示器的分辨率在Ubuntu 9.04下终于正常了" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/08/ubuntu-904.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUcGRnw7fyp7ImA9WxJXEks.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-8148415413210543027</id><published>2009-06-05T22:35:00.000-07:00</published><updated>2009-06-05T22:43:47.207-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-06-05T22:43:47.207-07:00</app:edited><title>搭积木：一个乐高的汽车</title><content type="html">乐高的积木挺好玩的，跟儿子一起玩了一个小时才搞定：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BswWlutyN3g/SioB0e9DAfI/AAAAAAAABuM/TzR9rh-U6Tc/s1600-h/DSC_4646.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 266px;" src="http://1.bp.blogspot.com/_BswWlutyN3g/SioB0e9DAfI/AAAAAAAABuM/TzR9rh-U6Tc/s400/DSC_4646.jpg" alt="" id="BLOGGER_PHOTO_ID_5344085909002453490" border="0" /&gt;&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-8148415413210543027?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/8148415413210543027/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=8148415413210543027" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8148415413210543027?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8148415413210543027?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/oNzdqILu9tM/blog-post.html" title="搭积木：一个乐高的汽车" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_BswWlutyN3g/SioB0e9DAfI/AAAAAAAABuM/TzR9rh-U6Tc/s72-c/DSC_4646.jpg" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/06/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkIDSH89eip7ImA9WxJTGUo.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-8967906848356378877</id><published>2009-04-28T20:01:00.000-07:00</published><updated>2009-04-28T20:09:39.162-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-28T20:09:39.162-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><title>在Eclipse下导入已有的git仓库中的项目</title><content type="html">让Eclipse和Git一起工作是一件容易的事情。首先，从http://git.or.cz/gitwiki/EclipsePlugin下载Eclipse的插件。这个插件能够让Eclipse和Git一起工作，其结构非常简单。插件的作者并未遵循Eclipse的规范，相反，Git对应的菜单被生硬的插入到了Eclipse的UI中。估摸插件的作者对于Eclipse插件的高度灵活性和可配置性不感冒吧，不管怎么样，够用就行了。&lt;br /&gt;&lt;br /&gt;这个插件自动华程度不高。首先，我们需要用git clone将远端的git仓库复制到本地。然后在Eclipse中，通过菜单File| Import... | Existing Projects into Workspace来导入本地仓库中的Eclipse项目。注意不要勾选“Copy projects into workspace”。当项目导入之后，在项目的上下文菜单中选择Team| Share...| Git项，然后一路Next即可。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-8967906848356378877?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/8967906848356378877/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=8967906848356378877" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8967906848356378877?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8967906848356378877?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/N-Bnn4PtdEU/eclipsegit.html" title="在Eclipse下导入已有的git仓库中的项目" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/04/eclipsegit.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkMGQ3k6eSp7ImA9WxVaF0Q.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7368576457238944490</id><published>2009-04-15T03:50:00.000-07:00</published><updated>2009-04-15T04:20:22.711-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-04-15T04:20:22.711-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><title>细粒度的并行对企业应用重要吗？</title><content type="html">对于科学计算来说，它无疑是重要的。对于企业应用而言，目前我个人还没遇到此类需求。目前的应用服务器用单个线程来处理一个request，这对于大多数应用都是合适的，只要响应时间在容许范围之内就没有问题。这种情况下用细粒度的并行并不经济，细粒度的并行需用更多的线程间同步，在系统负载较大时反而会降低吞吐量。&lt;br /&gt;而对于耗时特别长的处理，有时可以用long run的方式解决问题。即用户先提交请求后就直接返回，等计算执行完再通知用户或直接发送结果给用户。&lt;br /&gt;&lt;br /&gt;那么如果计算量大，又不能等待呢？Google的搜索是一个很好的例子。把大计算量的任务并行，响应时间自然就短了。不过这样的工作负载也许没有应用服务器什么事。应用服务器把计算任务交给类似&lt;a href="http://www.ibm.com/developerworks/power/cell/"&gt;Cell Broadband Engine&lt;/a&gt;这样的特殊机器也许更合适。&lt;br /&gt;&lt;br /&gt;如果单个线程确实需要在本地进行细粒度的并行处理，J2EE规范和WebSphere Application Server 7也提供了相应的支持，参见&lt;br /&gt;1. &lt;a href="http://www.ibm.com/developerworks/library/specification/j-commonj-sdowmt/index.html"&gt;Service Data Objects, WorkManager, and Timers&lt;/a&gt;&lt;br /&gt;2. &lt;a href="http://www.devx.com/Java/Article/28815"&gt;The Work Manager API: Parallel Processing Within a J2EE Container&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;最后，不要自己创建线程，那样会干扰应用服务器的运行。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7368576457238944490?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7368576457238944490/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7368576457238944490" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7368576457238944490?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7368576457238944490?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/_jqDCANLeb0/blog-post.html" title="细粒度的并行对企业应用重要吗？" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/04/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DkAHRXk6eSp7ImA9WxVbFE8.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-6799517687530911694</id><published>2009-03-30T07:27:00.000-07:00</published><updated>2009-03-30T07:52:14.711-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-30T07:52:14.711-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><title>为什么Java的每个对象都有wait()/notify()方法？</title><content type="html">Java对多线程程序的支持可以说是现存语言中最为完美的，即使C++0X今年真的能出来，也无法改变这一点。我们知道，每个Java对象都可以当成一个锁来使用，synchronize关键字会帮我们搞定一切的。那么为什么每个Java对象都有wait()/notify()方法呢？&lt;br /&gt;&lt;br /&gt;答案很简单，synchronize关键字能同步对共享资源的访问。只要正确的使用了synchronize关键字，程序就可以保证任意时刻都只有一个线程能访问共享资源。这解决了一部分问题。更进一步，我们还需要考虑到资源通常不是无限的。假如一个共享的队列中没有任何元素，那么所有尝试从队列中获取元素的线程就无法成功。那么这些线程怎么办呢？“忙等”显然不是一个好方法。这时我们就用得到wait()/notify()方法了。当线程检测到队列为空时，他们调用队列对象的wait()方法从而进入暂停执行状态，而当某个线程成功的向队列中放入元素之后，它调用notify()方法唤醒一个等待的线程。这样，整个流程就完美的建立起来了。&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SdDYe_HyYJI/AAAAAAAABr0/yn-wBu_ggpc/s1600-h/waitnotify.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 194px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SdDYe_HyYJI/AAAAAAAABr0/yn-wBu_ggpc/s400/waitnotify.png" alt="" id="BLOGGER_PHOTO_ID_5318989186776326290" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;另外，我们需要注意wait()和notify()方法只有在获取了队列对象的锁之后才能被调用，这是必要的。如果不这么做，就有可能出现队列中有元素，而某些线程却处于等待状态的现象。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-6799517687530911694?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/6799517687530911694/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=6799517687530911694" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/6799517687530911694?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/6799517687530911694?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/gjm5cFsBA6s/javawaitnotify.html" title="为什么Java的每个对象都有wait()/notify()方法？" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_BswWlutyN3g/SdDYe_HyYJI/AAAAAAAABr0/yn-wBu_ggpc/s72-c/waitnotify.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/03/javawaitnotify.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0UARXY6cSp7ImA9WxVUE0o.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7237669390509510032</id><published>2009-03-18T04:04:00.000-07:00</published><updated>2009-03-18T04:20:44.819-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-18T04:20:44.819-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Awesome window manager is awesome!</title><content type="html">I begin to seriously use "awesome window manager" for several days. Until now, almost everything seems OK. As a performance tuning fan, it's glad to see my screen is fully utilized. First of all, it can help me concentrate work in my hand, and there is less things which can interrupt me now.&lt;br /&gt;&lt;br /&gt;When I'm writing this, I realized this feeling of "flow" might comes from lacking of a &lt;span style="font-weight: bold;"&gt;global taskbar&lt;/span&gt; in awesome. For example, since I didn't see icon of Lotus Notes while I was coding and thinking, I took much less time to check new email. If someday I switched back to Gnome or KDE, I'll config taskbar to show tasks only in current workspace.&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/ScDVdg2jK0I/AAAAAAAABrM/4h5WdCcL3dk/s1600-h/awesome.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 300px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/ScDVdg2jK0I/AAAAAAAABrM/4h5WdCcL3dk/s400/awesome.png" alt="" id="BLOGGER_PHOTO_ID_5314482263308839746" border="0" /&gt;&lt;/a&gt;For above diagram, it's not a typical scenario for me to have so many windows at the same time. But if I show a screenshot which has nothing but Eclipse, people won't know what I'm showing.&lt;br /&gt;&lt;br /&gt;Note: "Mod4+M" is the most important key for me. It can maximize one window so that it can occupy every bit of my screen.&lt;br /&gt;&lt;br /&gt;Finally, I'd like to try awesome 3 when it becomes available as a standard package of Ubuntu. Well done, awesome!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7237669390509510032?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7237669390509510032/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7237669390509510032" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7237669390509510032?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7237669390509510032?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/dQvtvzL79O4/awesome-window-manager-is-awesome.html" title="Awesome window manager is awesome!" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_BswWlutyN3g/ScDVdg2jK0I/AAAAAAAABrM/4h5WdCcL3dk/s72-c/awesome.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/03/awesome-window-manager-is-awesome.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEMEQHw9fyp7ImA9WxVbFUw.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-4280859323966595999</id><published>2009-03-05T20:24:00.000-08:00</published><updated>2009-03-31T08:13:21.267-07:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-31T08:13:21.267-07:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>Add a new shortcut for VIM to switch buffer</title><content type="html">We can use F5 to show a list of buffer and switch buffer by inputting a buffer number. Just need to add following configuration into .vimrc&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;nnoremap &amp;lt;f5&amp;gt; :buffers&amp;lt;cr&amp;gt;:buffer&amp;lt;space&amp;gt;&lt;br /&gt;&lt;br /&gt;                   ----From VIM Tips wiki&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-4280859323966595999?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/4280859323966595999/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=4280859323966595999" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/4280859323966595999?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/4280859323966595999?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/27DddUPBvIA/add-new-shortcut-for-vim-to-switch.html" title="Add a new shortcut for VIM to switch buffer" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/03/add-new-shortcut-for-vim-to-switch.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0cASX48fSp7ImA9WxVVEUk.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-8228926881078756253</id><published>2009-03-03T20:28:00.000-08:00</published><updated>2009-03-03T20:30:48.075-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-03-03T20:30:48.075-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="x86" /><category scheme="http://www.blogger.com/atom/ns#" term="asm" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>Lock is NOT the superset of mfence</title><content type="html">From a recent post of Dmitriy at com.programming.threads. I keep this here as a memo.&lt;br /&gt;&lt;blockquote&gt;&lt;br /&gt;I was always thinking that LOCK is a kind of superset of MFENCE. It turns out that this is architecture dependent:&lt;br /&gt;&lt;br /&gt;------------------------------&lt;br /&gt;For the P6 family processors, locked operations serialize all outstanding load and store operations (that is, wait for them to complete). This rule is also true for the Pentium 4 and Intel Xeon processors, with one exception. Load operations that reference weakly ordered memory types (such as the WC memory type) may not be&lt;br /&gt;serialized.&lt;br /&gt;--------------------------------&lt;br /&gt;Dmitriy V'jukov&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Thanks, Dmitriy!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-8228926881078756253?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/8228926881078756253/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=8228926881078756253" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8228926881078756253?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8228926881078756253?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/1Zpm6kUFN1Y/lock-is-not-superset-of-mfence.html" title="Lock is NOT the superset of mfence" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/03/lock-is-not-superset-of-mfence.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C0ICR3o-fSp7ImA9WxVWF08.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-6136822950061338956</id><published>2009-02-26T23:56:00.000-08:00</published><updated>2009-02-26T23:59:26.455-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-26T23:59:26.455-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>似乎发现了JDK的一个bug</title><content type="html">在指出的bug中,多个线程的运行结果违反了Linearizability的要求. 无锁编程, 难...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;http://cs.oswego.edu/pipermail/concurrency-interest/2009-February/005882.html&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-6136822950061338956?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/6136822950061338956/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=6136822950061338956" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/6136822950061338956?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/6136822950061338956?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/hoVx0gXFBNA/jdkbug.html" title="似乎发现了JDK的一个bug" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/02/jdkbug.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D04FQn4-fCp7ImA9WxVWEEg.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-855087259327929327</id><published>2009-02-19T06:43:00.001-08:00</published><updated>2009-02-19T07:05:13.054-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-19T07:05:13.054-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>Install basic development document under ubuntu</title><content type="html">In order to query usage document of C library, it's convenient to install following two packages:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;    sudo apt-get install glibc-doc&lt;br /&gt;    sudo apt-get install manpages-dev&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Then, we can use 'K' in vim to query the document. It needs a little configuration.&lt;br /&gt;&lt;ol&gt;&lt;li&gt;At first,  add following configuration to .vimrc&lt;br /&gt;&lt;/li&gt;&lt;br /&gt;&lt;p&gt;set keywordprg=manall&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;li&gt;Secondly, create a script named "manall"&lt;/li&gt;&lt;pre&gt;#!/bin/sh&lt;br /&gt;&lt;br /&gt;man -a $1&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;/ol&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-855087259327929327?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/855087259327929327/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=855087259327929327" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/855087259327929327?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/855087259327929327?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/nsT0E1C0tfI/install-basic-development-document.html" title="Install basic development document under ubuntu" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/02/install-basic-development-document.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0YDSXs8fCp7ImA9WxVXF0g.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-8494643716108588224</id><published>2009-02-15T20:01:00.001-08:00</published><updated>2009-02-15T20:39:38.574-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-15T20:39:38.574-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="git" /><title>Git Configuration</title><content type="html">GIT的配置&lt;br /&gt;&lt;br /&gt;彩色高亮以及命令缩写，将下面的内容放入到~/.gitconfig中&lt;br /&gt;[user]&lt;br /&gt;    name = Zhi Gan&lt;br /&gt;    email = ganzhi@gmail.com&lt;br /&gt;[alias]&lt;br /&gt;    co = checkout&lt;br /&gt;    ci = commit -a&lt;br /&gt;    st = status&lt;br /&gt;    br = branch&lt;br /&gt;[color]&lt;br /&gt;    status = auto&lt;br /&gt;    branch = auto&lt;br /&gt;    ui = auto&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-8494643716108588224?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/8494643716108588224/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=8494643716108588224" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8494643716108588224?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8494643716108588224?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/NAs_k_pCifk/git-configuration.html" title="Git Configuration" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/02/git-configuration.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EHSHc8fSp7ImA9WxVXFEk.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-5412117256584047601</id><published>2009-02-12T06:24:00.000-08:00</published><updated>2009-02-12T06:40:39.975-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-02-12T06:40:39.975-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>常用的实用工具</title><content type="html">看了&lt;a href="http://www.yeeyan.com/articles/view/%E5%8D%9A%E8%B4%A4/27341?orgin=index"&gt;译言的一篇口水文章&lt;/a&gt;之后，没忍住掉坑里面了：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;VIM/Eclipse&lt;/li&gt;&lt;li&gt;BASH&lt;br /&gt;&lt;/li&gt;&lt;li&gt;SSH/SCP&lt;/li&gt;&lt;li&gt;JDK/ANT&lt;br /&gt;&lt;/li&gt;&lt;li&gt;MAKE/GCC/GDB&lt;/li&gt;&lt;li&gt;Python&lt;/li&gt;&lt;li&gt;SVN&lt;br /&gt;&lt;/li&gt;&lt;li&gt;GIMP&lt;/li&gt;&lt;li&gt;OpenOffice&lt;/li&gt;&lt;li&gt;KDE 4，Dolphin和Plasma实在是太酷了，所以我最近从Gnome转到KDE了，巧合的是，我总是和Linus用相反的桌面软件。&lt;/li&gt;&lt;/ol&gt;前9个是老早就开始用了，最近开始喜欢KDE4了。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-5412117256584047601?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/5412117256584047601/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=5412117256584047601" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5412117256584047601?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5412117256584047601?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/DKMPeANgTC0/blog-post.html" title="常用的实用工具" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/02/blog-post.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0AGQn08cSp7ImA9WxVSF08.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7909472479088741978</id><published>2009-01-11T19:02:00.000-08:00</published><updated>2009-01-11T19:08:43.379-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-11T19:08:43.379-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>C++0x中Memory Order的解释</title><content type="html">来自&lt;a href="http://www.open-std.org/jtc1/sc22/wg21/docs/papers/2007/n2153.pdf"&gt;N2153&lt;/a&gt;的非常好的解释：&lt;br /&gt;&lt;br /&gt;Each atomic operation defines three sets of memory operations:&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt;: Memory operations preceding the atomic operation in program order 2 , plus any memory     operations from other threads performed with respect to this thread before the atomic operation.&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt;: Memory operations implied by the atomic operation.&lt;br /&gt;    &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;: Memory operations following the atomic operation in program order, plus any memory operations performed by other threads that have observed the result of a store in &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;An atomic operation with acquire semantics ensures that all memory operations in set &lt;span style="font-weight: bold;"&gt;B &lt;/span&gt;are performed before any memory operation in set &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;An atomic operation with release semantics ensures that all memory operations in set &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; are performed before any memory operation in set &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt;.&lt;/li&gt;&lt;li&gt;An atomic operation with ordered semantics has both acquire and release semantics. That is, all memory operations in set &lt;span style="font-weight: bold;"&gt;A&lt;/span&gt; are performed before any memory operation in set &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt;, and all memory operations in set &lt;span style="font-weight: bold;"&gt;B&lt;/span&gt; are performed before any memory operation in set &lt;span style="font-weight: bold;"&gt;C&lt;/span&gt;.&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7909472479088741978?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7909472479088741978/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7909472479088741978" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7909472479088741978?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7909472479088741978?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/RLuZDDOt1z0/c0xmemory-order.html" title="C++0x中Memory Order的解释" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/01/c0xmemory-order.html</feedburner:origLink></entry><entry gd:etag="W/&quot;C08NQnc5fCp7ImA9WxVSEUg.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-8732439450643408755</id><published>2009-01-04T23:48:00.000-08:00</published><updated>2009-01-05T02:38:13.924-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-05T02:38:13.924-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="git" /><category scheme="http://www.blogger.com/atom/ns#" term="eclipse" /><title>Eclipse Git plugin is not matured yet</title><content type="html">I tried to download and install &lt;a href="http://git.or.cz/gitwiki/EclipsePlugin"&gt;Eclipse Git Plugin&lt;/a&gt; today, which combines my two favorite open source projects together. After some clicks, it works for me now. And I like the neat History view as shown below:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SWG75WP7fNI/AAAAAAAABoc/Iog4szi90l4/s1600-h/git_ec.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 400px; height: 112px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SWG75WP7fNI/AAAAAAAABoc/Iog4szi90l4/s400/git_ec.png" alt="" id="BLOGGER_PHOTO_ID_5287714031409003730" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;It works well although not perfect yet. In my mind, following defects should be fixed at first:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;I haven't found the method to place several Eclipse projects inside one git repository.  I just know using "Team| Share Project..." to create a new git repository. It's my hope that I can navigate in a git repository and checkout only a subtree into Eclipse.&lt;/li&gt;&lt;li&gt;It doesn't fit into the "Team" feature of Eclipse smoothly. When I'm using the CVS and SVN plugins, the GUI and operation methods are mostly the same, no matter what kind of repository is used. EGit seems invented a new approach, instead of reusing existing framework.&lt;/li&gt;&lt;li&gt;I don't know how to merge branch with EGit yet :)&lt;/li&gt;&lt;li&gt;For every commit, I need to input my name and email address.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;Now the conclusion: I'll roll back and use command line version of git again. But I'll keep my eyes open for EGit's future release.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-8732439450643408755?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/8732439450643408755/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=8732439450643408755" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8732439450643408755?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/8732439450643408755?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/vYa2vr4oxP4/eclipse-git-plugin-is-not-matured-yet.html" title="Eclipse Git plugin is not matured yet" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_BswWlutyN3g/SWG75WP7fNI/AAAAAAAABoc/Iog4szi90l4/s72-c/git_ec.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/01/eclipse-git-plugin-is-not-matured-yet.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CkQFRXs8fip7ImA9WxVSEEU.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-4296240787228156778</id><published>2009-01-04T06:40:00.000-08:00</published><updated>2009-01-04T06:45:14.576-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-04T06:45:14.576-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="ubuntu" /><title>使用mencoder转换格式</title><content type="html">为了往iPod上导入一个rmvb的格式，今天用到了mencoder来转换成mp3。&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;首先，安装mplayer并且&lt;a href="https://help.ubuntu.com/community/Medibuntu"&gt;安装w32codecs.&lt;/a&gt;&lt;/li&gt;&lt;li&gt;然后执行如下命令：&lt;/li&gt;&lt;/ol&gt;&lt;blockquote&gt;mencoder some.rmvb -of rawaudio -oac mp3lame -ovc copy -o 05.mp3&lt;/blockquote&gt;&lt;br /&gt;Done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-4296240787228156778?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/4296240787228156778/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=4296240787228156778" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/4296240787228156778?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/4296240787228156778?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/zb0Vplz0PDk/mencoder.html" title="使用mencoder转换格式" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/01/mencoder.html</feedburner:origLink></entry><entry gd:etag="W/&quot;A0EDRno9eyp7ImA9WxVSEEo.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-583470383745633492</id><published>2009-01-04T06:30:00.000-08:00</published><updated>2009-01-04T06:34:37.463-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2009-01-04T06:34:37.463-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="linux" /><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>使用ffmpeg从电影中截图</title><content type="html">Linux下干这些非常方便。下面的python代码从2019秒开始截15幅图，间隔1/4秒.&lt;br /&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#aaaaaa;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#aaaaaa;"&gt;#!/usr/bin/python&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#46aa64;"&gt;import&lt;/span&gt;&lt;/span&gt; os&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#46aa64;"&gt;import&lt;/span&gt;&lt;/span&gt; sys&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#2a5db0;"&gt;&lt;b&gt;&lt;u&gt;for&lt;/u&gt;&lt;/b&gt;&lt;/span&gt;&lt;/span&gt; i &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#7799bb;"&gt;in&lt;/span&gt;&lt;/span&gt; range(60):&lt;br /&gt;&lt;br /&gt;    second = i/4.0;&lt;br /&gt;&lt;br /&gt;    command = &lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#6694e3;"&gt;ffmpeg  -itsoffset -%f -i "some.avi" -vcodec png -vframes 1 -an -f rawvideo second%d.png&lt;/span&gt;&lt;/span&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;span style="color:#000000;"&gt;'&lt;/span&gt;&lt;/span&gt; % (second+2019, i+1)&lt;br /&gt;&lt;br /&gt;    os.system(command)&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-583470383745633492?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/583470383745633492/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=583470383745633492" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/583470383745633492?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/583470383745633492?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/paOyXneykAA/ffmpeg.html" title="使用ffmpeg从电影中截图" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2009/01/ffmpeg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;D0IAQHk-fyp7ImA9WxVTFkw.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-3975790379329836604</id><published>2008-12-29T07:32:00.000-08:00</published><updated>2008-12-29T21:39:01.757-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-29T21:39:01.757-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="aix" /><title>使用AIX自带的tprof进行性能剖析</title><content type="html">AIX上自带一个很好的性能调优工具&lt;a href="http://publib.boulder.ibm.com/infocenter/systems/index.jsp?topic=/com.ibm.aix.cmds/doc/aixcmds5/tprof.htm"&gt;tprof&lt;/a&gt;，这个和&lt;a href="http://perfinsp.sourceforge.net/"&gt;Performance Inspector&lt;/a&gt;里面的run.tprof功能完全一样。不过在AIX上我们使用系统自带的更为方便，何况&lt;a href="http://perfinsp.sourceforge.net/"&gt;Performance Inspector&lt;/a&gt;的AIX剖析工具已经处于deprecated状态了。&lt;br /&gt;&lt;br /&gt;使用AIX的tprof分析Java应用程序的过程非常简单：&lt;br /&gt;&lt;blockquote&gt;tprof -j -A -X -I -r trace3 -x java -agentlib:jpa64=instructions=1 MyClass&lt;/blockquote&gt;在上面的例子中，我们使用了几个tprof的几个参数:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;-j: 指明要分析Java程序&lt;/li&gt;&lt;li&gt;-A: 打开自动离线模式，在这种模式下，程序运行时仅进行trace而不进行分析。&lt;/li&gt;&lt;li&gt;-X: 用XML格式输出&lt;/li&gt;&lt;li&gt;-I: 开启二进制指令级别剖析&lt;br /&gt;&lt;/li&gt;&lt;li&gt;-r:  指定输出文件的名称&lt;/li&gt;&lt;li&gt;-x: 指定要执行的程序，必须是最后一个参数&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;然后，在运行Java程序时，我们需要加上-agentlib:jpa或者-agentlib:jpa64选项。选择哪个要看JDK是32位还是64位的。最后的结果可以方便的用VPA观看汇编指令对性能的影响了。&lt;br /&gt;&lt;br /&gt;最后，在我测试的时候，似乎不能使用tprof的-N选项（用于打开源代码级别的调优)。否则tprof会在生成结果之前僵死。目前还不知道原因。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-3975790379329836604?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/3975790379329836604/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=3975790379329836604" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/3975790379329836604?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/3975790379329836604?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/pXqBcnH7_d4/aixtprof.html" title="使用AIX自带的tprof进行性能剖析" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/12/aixtprof.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEINSX0yeCp7ImA9WxVTEEk.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-5800686032934751493</id><published>2008-12-23T06:14:00.000-08:00</published><updated>2008-12-23T06:29:58.390-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-23T06:29:58.390-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="asm" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>PowerPC上的原子操作</title><content type="html">众所周知，PowerPC上没有直接的&lt;a href="http://en.wikipedia.org/wiki/Compare-and-swap"&gt;CAS&lt;/a&gt;指令。替代的，我们有linked load和store conditional指令提供。Linked load和Store conditional指令完全可以达到和CAS(addr, exp, new)一样的效果。&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;do{&lt;br /&gt;    if (LL(addr)!=exp) return false;&lt;br /&gt;}&lt;br /&gt;until SC(addr, new); return true;&lt;/blockquote&gt;性能上，我们照例可以用&lt;a href="http://perfinsp.sourceforge.net/"&gt;Performance Inspector&lt;/a&gt;测试，结果如下所示：&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_BswWlutyN3g/SVDytN2C55I/AAAAAAAABkg/ehFFedX26NI/s1600-h/llsc.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://1.bp.blogspot.com/_BswWlutyN3g/SVDytN2C55I/AAAAAAAABkg/ehFFedX26NI/s400/llsc.png" alt="" id="BLOGGER_PHOTO_ID_5282989221529970578" border="0" /&gt;&lt;/a&gt;图中用到的指令可以参考&lt;a href="http://publib.boulder.ibm.com/infocenter/pseries/v5r3/index.jsp?topic=/com.ibm.aix.aixassem/doc/alangref/ldarx.htm"&gt;PPC 5.3指令集&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-5800686032934751493?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/5800686032934751493/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=5800686032934751493" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5800686032934751493?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/5800686032934751493?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/-7X8yXRxMOs/powerpc.html" title="PowerPC上的原子操作" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://1.bp.blogspot.com/_BswWlutyN3g/SVDytN2C55I/AAAAAAAABkg/ehFFedX26NI/s72-c/llsc.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/12/powerpc.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CU4HRnc4eCp7ImA9WxRaEUU.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-1807901230961463233</id><published>2008-12-13T07:50:00.000-08:00</published><updated>2008-12-13T07:58:57.930-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-13T07:58:57.930-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="python" /><title>使用Matplotlib绘图时获得半透明的Legend</title><content type="html">下面代码给出了做法。很简单，不过解决了绘制&lt;a href="http://amino-cbbs.sourceforge.net/"&gt;Amino&lt;/a&gt;中的性能曲线的一个小问题。&lt;br /&gt;&lt;br /&gt;&lt;font face="monospace"&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;import&lt;/font&gt;&lt;/span&gt;&amp;nbsp;matplotlib.pyplot &lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;as&lt;/font&gt;&lt;/span&gt;&amp;nbsp;plt&lt;br&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;import&lt;/font&gt;&lt;/span&gt;&amp;nbsp;numpy &lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;as&lt;/font&gt;&lt;/span&gt;&amp;nbsp;np&lt;br&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;import&lt;/font&gt;&lt;/span&gt;&amp;nbsp;matplotlib.pyplot &lt;span style="background-color: #ffffff"&gt;&lt;font color="#46aa64"&gt;as&lt;/font&gt;&lt;/span&gt;&amp;nbsp;plt&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;ax = plt.subplot(111)&lt;br&gt;&lt;br /&gt;t1 = np.arange(0.0, 1.0, 0.01)&lt;br&gt;&lt;br /&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#2a5db0"&gt;&lt;b&gt;&lt;u&gt;for&lt;/u&gt;&lt;/b&gt;&lt;/font&gt;&lt;/span&gt;&amp;nbsp;n &lt;span style="background-color: #ffffff"&gt;&lt;font color="#7799bb"&gt;in&lt;/font&gt;&lt;/span&gt;&amp;nbsp;[1, 2, 3, 4]:&lt;br&gt;&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;plt.plot(t1, t1**n, label=&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#6694e3"&gt;n=%d&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;%(n,))&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;leg = plt.legend(loc=&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#6694e3"&gt;best&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;'&lt;/font&gt;&lt;/span&gt;, ncol=2, mode=&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#6694e3"&gt;expand&lt;/font&gt;&lt;/span&gt;&lt;span style="background-color: #ffffff"&gt;&lt;font color="#000000"&gt;&amp;quot;&lt;/font&gt;&lt;/span&gt;, shadow=True, fancybox=True)&lt;br&gt;&lt;br /&gt;leg.get_frame().set_alpha(0.5)&lt;br&gt;&lt;br /&gt;&lt;br&gt;&lt;br /&gt;plt.show()&lt;br&gt;&lt;br /&gt;&lt;/font&gt;&lt;br /&gt;&lt;br /&gt;代码来自Matplotlib的&lt;a href="http://matplotlib.sourceforge.net/users/whats_new.html"&gt;What's New&lt;/a&gt;，效果图也在那里&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-1807901230961463233?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/1807901230961463233/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=1807901230961463233" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/1807901230961463233?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/1807901230961463233?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/pdR_7Vj84RM/matplotliblegend.html" title="使用Matplotlib绘图时获得半透明的Legend" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/12/matplotliblegend.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEEBRnszeyp7ImA9WxRbGE4.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7151523375406499355</id><published>2008-12-09T04:52:00.000-08:00</published><updated>2008-12-09T06:24:17.583-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-12-09T06:24:17.583-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="java" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>什么时候应该避免使用Java中的AtomicInteger类</title><content type="html">对于多线程中的计数器，我们通常推荐使用j.u.c中的AtomicInteger来替代一个用锁保护的int类型的变量。例如从：&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:drawinggridverticalspacing&gt;7.8 pt&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:displayverticaldrawinggridevery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:spaceforul/&gt;    &lt;w:balancesinglebytedoublebytewidth/&gt;    &lt;w:donotleavebackslashalone/&gt;    &lt;w:ultrailspace/&gt;    &lt;w:donotexpandshiftreturn/&gt;    &lt;w:adjustlineheightintable/&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"\@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0in;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;}  /* Page Definitions */  @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.25in 1.0in 1.25in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin:0in;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;private&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;int&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;value&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt; &lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;synchronized&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; increment() {&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;value&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;++;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;变动到：&lt;br /&gt;&lt;br /&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:worddocument&gt;   &lt;w:view&gt;Normal&lt;/w:View&gt;   &lt;w:zoom&gt;0&lt;/w:Zoom&gt;   &lt;w:punctuationkerning/&gt;   &lt;w:drawinggridverticalspacing&gt;7.8 pt&lt;/w:DrawingGridVerticalSpacing&gt;   &lt;w:displayhorizontaldrawinggridevery&gt;0&lt;/w:DisplayHorizontalDrawingGridEvery&gt;   &lt;w:displayverticaldrawinggridevery&gt;2&lt;/w:DisplayVerticalDrawingGridEvery&gt;   &lt;w:validateagainstschemas/&gt;   &lt;w:saveifxmlinvalid&gt;false&lt;/w:SaveIfXMLInvalid&gt;   &lt;w:ignoremixedcontent&gt;false&lt;/w:IgnoreMixedContent&gt;   &lt;w:alwaysshowplaceholdertext&gt;false&lt;/w:AlwaysShowPlaceholderText&gt;   &lt;w:compatibility&gt;    &lt;w:spaceforul/&gt;    &lt;w:balancesinglebytedoublebytewidth/&gt;    &lt;w:donotleavebackslashalone/&gt;    &lt;w:ultrailspace/&gt;    &lt;w:donotexpandshiftreturn/&gt;    &lt;w:adjustlineheightintable/&gt;    &lt;w:breakwrappedtables/&gt;    &lt;w:snaptogridincell/&gt;    &lt;w:wraptextwithpunct/&gt;    &lt;w:useasianbreakrules/&gt;    &lt;w:dontgrowautofit/&gt;    &lt;w:usefelayout/&gt;   &lt;/w:Compatibility&gt;   &lt;w:browserlevel&gt;MicrosoftInternetExplorer4&lt;/w:BrowserLevel&gt;  &lt;/w:WordDocument&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;!--[if gte mso 9]&gt;&lt;xml&gt;  &lt;w:latentstyles deflockedstate="false" latentstylecount="156"&gt;  &lt;/w:LatentStyles&gt; &lt;/xml&gt;&lt;![endif]--&gt;&lt;style&gt; &lt;!--  /* Font Definitions */  @font-face  {font-family:宋体;  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-alt:SimSun;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;} @font-face  {font-family:"\@宋体";  panose-1:2 1 6 0 3 1 1 1 1 1;  mso-font-charset:134;  mso-generic-font-family:auto;  mso-font-pitch:variable;  mso-font-signature:3 135135232 16 0 262145 0;}  /* Style Definitions */  p.MsoNormal, li.MsoNormal, div.MsoNormal  {mso-style-parent:"";  margin:0in;  margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:12.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:宋体;}  /* Page Definitions */  @page  {mso-page-border-surround-header:no;  mso-page-border-surround-footer:no;} @page Section1  {size:8.5in 11.0in;  margin:1.0in 1.25in 1.0in 1.25in;  mso-header-margin:.5in;  mso-footer-margin:.5in;  mso-paper-source:0;} div.Section1  {page:Section1;} --&gt; &lt;/style&gt;&lt;!--[if gte mso 10]&gt; &lt;style&gt;  /* Style Definitions */  table.MsoNormalTable  {mso-style-name:"Table Normal";  mso-tstyle-rowband-size:0;  mso-tstyle-colband-size:0;  mso-style-noshow:yes;  mso-style-parent:"";  mso-padding-alt:0in 5.4pt 0in 5.4pt;  mso-para-margin:0in;  mso-para-margin-bottom:.0001pt;  mso-pagination:widow-orphan;  font-size:10.0pt;  font-family:"Times New Roman";  mso-fareast-font-family:"Times New Roman";  mso-ansi-language:#0400;  mso-fareast-language:#0400;  mso-bidi-language:#0400;} &lt;/style&gt; &lt;![endif]--&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;AtomicInteger &lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;ai&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; = &lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;new&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; AtomicInteger();&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;&lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;public&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; &lt;/span&gt;&lt;b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;void&lt;/span&gt;&lt;/b&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt; increment1(){&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal" style=""&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;       &lt;/span&gt;&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;ai&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;.incrementAndGet();&lt;/span&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;"   lang="EN-US"&gt;&lt;o:p&gt;&lt;/o:p&gt;&lt;/span&gt;&lt;/p&gt;  &lt;p class="MsoNormal"&gt;&lt;span style=";font-family:&amp;quot;;font-size:10;color:black;"    lang="EN-US"&gt;&lt;span style=""&gt;    &lt;/span&gt;}&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;由于synchronized关键字利用this对象同步，而this对象可能还被用于其他同步目的，因此相对AtomicInteger有较多的机会造成线程之间的相互等待。而AtomicInteger本身有一个小的同步块，因而不和其他利用this对象同步的线程竞争，通常会更好一些。而且AtomicInteger的很多方法都是lock-free的，对Scalability有较大的好处。&lt;br /&gt;&lt;br /&gt;不过在一些情况，我们还是应该利用synchronized而不是Atomic包。首先，如果我们程序中线程数目较少，或者该计数器不是一个热点时，用锁的程序和AtomicInteger的程序性能没有什么差别。为了节约内存，我们可以采用基于synchronized的版本或者AtomicIntegerFieldUpdater。其次，如果有多个计数器需要操作，那么在一个synchronized块中进行所有的操作比采用多个Atomic对象要好。这点从代码路径上就可以看出。如果线程之间不发生冲突，那么一个synchronized块和一个atomic对象一个&lt;a href="http://en.wikipedia.org/wiki/Compare_and_swap"&gt;CAS&lt;/a&gt;操作。如果一个synchronized块处理了多个需要保护的操作，那么就节约了&lt;a href="http://en.wikipedia.org/wiki/Compare_and_swap"&gt;CAS&lt;/a&gt;操作的数目，因而具有较高的性能。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7151523375406499355?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7151523375406499355/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7151523375406499355" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7151523375406499355?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7151523375406499355?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/dOC8qo3yk1g/javaatomicinteger.html" title="什么时候应该避免使用Java中的AtomicInteger类" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/12/javaatomicinteger.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DUAAQXczfCp7ImA9WxRUF0s.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-82823688946103155</id><published>2008-11-26T22:27:00.001-08:00</published><updated>2008-11-26T22:35:40.984-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-26T22:35:40.984-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="performance" /><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>How slow is CMPXCHG?</title><content type="html">In order to understand this, I profile one of the &lt;a href="http://amino-cbbs.sourceforge.net/"&gt;amino&lt;/a&gt; lock-free data structure and get following result:&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://4.bp.blogspot.com/_BswWlutyN3g/SS4-muXZXjI/AAAAAAAABic/-cs4IRj04zQ/s1600-h/cmpx.png"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer; width: 392px; height: 144px;" src="http://4.bp.blogspot.com/_BswWlutyN3g/SS4-muXZXjI/AAAAAAAABic/-cs4IRj04zQ/s400/cmpx.png" alt="" id="BLOGGER_PHOTO_ID_5273221048699543090" border="0" /&gt;&lt;/a&gt;Synchronization is expensive!&lt;br /&gt;&lt;br /&gt;Data is collected with &lt;a href="http://perfinsp.sourceforge.net/tprof.html"&gt;run.tprof&lt;/a&gt; and visualized by&lt;a href="http://www.alphaworks.ibm.com/tech/vpa"&gt; VPA&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-82823688946103155?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/82823688946103155/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=82823688946103155" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/82823688946103155?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/82823688946103155?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/MVWQgBwyUKY/how-slow-is-cmpxchg.html" title="How slow is CMPXCHG?" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><media:thumbnail xmlns:media="http://search.yahoo.com/mrss/" url="http://4.bp.blogspot.com/_BswWlutyN3g/SS4-muXZXjI/AAAAAAAABic/-cs4IRj04zQ/s72-c/cmpx.png" height="72" width="72" /><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/11/how-slow-is-cmpxchg.html</feedburner:origLink></entry><entry gd:etag="W/&quot;CEYFQHk4eCp7ImA9WxRUFUk.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-2958363314047640980</id><published>2008-11-24T07:12:00.000-08:00</published><updated>2008-11-24T07:55:11.730-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-24T07:55:11.730-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="vim" /><title>一些移动光标和命令行编辑的VIM快捷键</title><content type="html">最近在用VIM写一些超文本格式的文档，然后开始学习一些没用过的VIM命令和快捷键。之前没感觉有需要，所以没有仔细看过，现在编辑文档，正好学以致用。这样编辑文档的过程同时也变成了学习VIM的过程，一举两得了 :)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;命令行编辑。&lt;/h4&gt;&lt;br /&gt;之前有一段时间认为不重要，现在看来用到命令行的机会太多了，对于使用频率中等的命令，定义太多快捷键也挺绕的，还是直接敲吧。&lt;br /&gt;&lt;br /&gt;首先，是粘贴：&lt;br /&gt;Ctrl-R 用于在命令行模式和插入模式下粘贴，按下这个快捷键之后，会提示用户输入粘贴的来源。常用的几个选择如下：&lt;br /&gt;         &lt;blockquote&gt;C-W current word under cursor&lt;br /&gt;         %  the current filename&lt;br /&gt;         +   the clipboard&lt;br /&gt;         "    the default register&lt;/blockquote&gt;&lt;br /&gt;Shift-Left/Right 用于在命令行模式和插入模式下以单词为单位左右移动&lt;br /&gt;C-W: 删除光标前的单词&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;可视模式下的特殊光标移动&lt;/h4&gt;&lt;br /&gt;在按下v键入可视模式之后，用 a}, a], a), a&gt;, ap, aw 等来选择一个块，而且包含边界字符。如果用i}, i], i), i&gt;, ip，则选择不会包含边界。除了可视模式之外，y命令，d命令和gq命令后的motion也可以用类似的方式指定，例如gqap 可以完成一个段的换行。&lt;br /&gt;&lt;br /&gt;说的gq，gqgq或者gqq可以用来格式化一行文本。另外，:helpg 用正则表达式查找所有的帮助，结果存放在quickfix里(使用:cn, :cp访问)&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;改变文件格式&lt;/h4&gt;&lt;br /&gt;&lt;blockquote&gt;To change from &lt;cr&gt;&lt;lf&gt; (DOS) to just &lt;lf&gt; (Unix):&lt;br /&gt;:set fileformat=unix&lt;br /&gt;:w&lt;/lf&gt;&lt;/lf&gt;&lt;/cr&gt;&lt;/blockquote&gt;&lt;cr&gt;&lt;lf&gt;&lt;lf&gt;&lt;/lf&gt;&lt;/lf&gt;&lt;/cr&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-2958363314047640980?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/2958363314047640980/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=2958363314047640980" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/2958363314047640980?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/2958363314047640980?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/xHTbfNGTA2A/vim.html" title="一些移动光标和命令行编辑的VIM快捷键" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/11/vim.html</feedburner:origLink></entry><entry gd:etag="W/&quot;DE8GQn84eSp7ImA9WxRUEUg.&quot;"><id>tag:blogger.com,1999:blog-7253982.post-7060925944207557955</id><published>2008-11-19T20:34:00.000-08:00</published><updated>2008-11-19T20:53:43.131-08:00</updated><app:edited xmlns:app="http://www.w3.org/2007/app">2008-11-19T20:53:43.131-08:00</app:edited><category scheme="http://www.blogger.com/atom/ns#" term="parallel" /><category scheme="http://www.blogger.com/atom/ns#" term="C++" /><category scheme="http://www.blogger.com/atom/ns#" term="multi-core" /><title>并行STL类需要有不同的API</title><content type="html">一个组件是否支持并发访问，这在API设计之初就需要考虑到。在&lt;a href="http://amino-cbbs.sourceforge.net/"&gt;Amino&lt;/a&gt;项目中，我们最初试图完全兼容STL的interface，但最终无法这么做。其原因不在于实现上有困难，而是STL的一些interface不适合并行程序访问。举一个例子：&lt;br /&gt;STL中的模板类有这样两个方法：&lt;br /&gt;    bool empty();&lt;br /&gt;    void pop_back();&lt;br /&gt;&lt;br /&gt;它们可以被这么用：&lt;br /&gt;     if(! list1.empty()){&lt;br /&gt;              int tmp = *list1.begin();&lt;br /&gt;         list1.pop_front();&lt;br /&gt;     }&lt;br /&gt;&lt;br /&gt;而在多线程程序中，上面的用法会带来灾难。如果线程A和B同时对长度为1的list1执行上面的程序，那么会发生如下错误：&lt;br /&gt;&lt;ol&gt;&lt;li&gt;两个线程都检测到list1非空，然后试图获得其第一个元素，这样一个元素可能被拿出来两次&lt;/li&gt;&lt;li&gt;当两个线程试图删除这个元素时，将发生两次删除，这样一个单线程的程序中不可能出现的exception就产生了。&lt;/li&gt;&lt;/ol&gt;因此，对于&lt;a href="http://amino-cbbs.sourceforge.net/"&gt;Amino&lt;/a&gt;中的lock-free控件，我们通常实现如下的函数：&lt;br /&gt;    bool succ;&lt;br /&gt;    do{&lt;br /&gt;        int tmp;&lt;br /&gt;        succ = list1.pop_front(&amp;amp;tmp);&lt;br /&gt;     }while(succ);&lt;br /&gt;&lt;br /&gt;这样能保证多个线程之间能协作的对一个list中的元素进行处理。程序运行过程中，程序既不会出现重复处理的现象，也不会有影响性能的异常发生。&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/7253982-7060925944207557955?l=ganzhi.blogspot.com'/&gt;&lt;/div&gt;</content><link rel="replies" type="application/atom+xml" href="http://ganzhi.blogspot.com/feeds/7060925944207557955/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=7253982&amp;postID=7060925944207557955" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7060925944207557955?v=2" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/7253982/posts/default/7060925944207557955?v=2" /><link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/GanZhi/~3/14z12R5IlIU/stlapi.html" title="并行STL类需要有不同的API" /><author><name>James Gan</name><uri>http://www.blogger.com/profile/06859655949613454269</uri><email>ganzhi@gmail.com</email><gd:extendedProperty name="OpenSocialUserId" value="13570499073691122033" /></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://ganzhi.blogspot.com/2008/11/stlapi.html</feedburner:origLink></entry></feed>
