<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>素心如何天上月</title>
	<atom:link href="http://yongsun.me/feed/" rel="self" type="application/rss+xml" />
	<link>http://yongsun.me</link>
	<description>Yong Sun&#039;s Blog</description>
	<lastBuildDate>Sat, 06 Mar 2010 15:16:37 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>sunpinyin-2.0 beta 2 for mac os (10.5+)</title>
		<link>http://yongsun.me/2010/03/sunpinyin-2-0-beta-2-for-mac-os-10-5/</link>
		<comments>http://yongsun.me/2010/03/sunpinyin-2-0-beta-2-for-mac-os-10-5/#comments</comments>
		<pubDate>Sat, 06 Mar 2010 14:59:56 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Input Method]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[sunpinyin-2.0]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1180</guid>
		<description><![CDATA[Beta 2中更新的内容：

修正了一个导致crash的bug (#36)
修正了无法安装到~/Library/Input\ Methods的bug (#30)
加入了在切换中英文时提交的选项 (#18)
加入了中文的本地化界面
将全角半角切换快捷键从Shift+Space改为Alt+Space，避免和Safari的向上翻页键冲突
提供了安装包，同时支持Mac OS 10.5和10.6，并支持PowerPC系统 （未验证）
将升级检测和数据文件校验等配置文件迁移到sunpinyin.googlecode.com


欢迎下载试用，SunPinyin-MacOS-2.0.zip。已安装beta 1版本的朋友，无需删除已安装的版本，直接运行安装程序即可。首次安装的朋友请注意，当安装程序进行到“下载数据文件”步骤时，请点击“开始&#8230;”按钮下载必要的数据文件（文件较大，可能比较耗时）。
]]></description>
			<content:encoded><![CDATA[<p>Beta 2中更新的内容：</p>
<ol>
<li>修正了一个导致crash的bug (<a href="http://code.google.com/p/sunpinyin/issues/detail?id=36">#36</a>)</li>
<li>修正了无法安装到~/Library/Input\ Methods的bug (<a href="http://code.google.com/p/sunpinyin/issues/detail?id=30">#30</a>)</li>
<li>加入了在切换中英文时提交的选项 (<a href="http://code.google.com/p/sunpinyin/issues/detail?id=18">#18</a>)</li>
<li>加入了中文的本地化界面</li>
<li>将全角半角切换快捷键从Shift+Space改为Alt+Space，避免和Safari的向上翻页键冲突</li>
<li>提供了安装包，同时支持Mac OS 10.5和10.6，并支持PowerPC系统 （未验证）</li>
<li>将升级检测和数据文件校验等配置文件迁移到<a href="http://code.google.com/p/sunpinyin/source/browse?repo=release">sunpinyin.googlecode.com</a></li>
</ol>
<p><a href="http://yongsun.me/wp-content/uploads/2010/03/sunpinyin-2.0-mac-commit-on-switching.png"><img title="sunpinyin-2.0-mac-commit-on-switching" src="http://yongsun.me/wp-content/uploads/2010/03/sunpinyin-2.0-mac-commit-on-switching-300x279.png" alt="" width="300" height="279" /></a></p>
<p>欢迎下载试用，<a href="http://sunpinyin.googlecode.com/files/SunPinyin-MacOS-2.0.zip">SunPinyin-MacOS-2.0.zip</a>。已安装beta 1版本的朋友，无需删除已安装的版本，直接运行安装程序即可。首次安装的朋友请<span style="background-color: #ffff00;"><strong>注意</strong></span>，当安装程序进行到“下载数据文件”步骤时，请点击“开始&#8230;”按钮下载必要的数据文件（文件较大，可能比较耗时）。</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/03/sunpinyin-2-0-beta-2-for-mac-os-10-5/feed/</wfw:commentRss>
		<slash:comments>26</slash:comments>
		</item>
		<item>
		<title>open-gram项目简介</title>
		<link>http://yongsun.me/2010/03/open-gram%e9%a1%b9%e7%9b%ae%e7%ae%80%e4%bb%8b/</link>
		<comments>http://yongsun.me/2010/03/open-gram%e9%a1%b9%e7%9b%ae%e7%ae%80%e4%bb%8b/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 18:03:21 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Input Method]]></category>
		<category><![CDATA[NLP]]></category>
		<category><![CDATA[open-gram]]></category>
		<category><![CDATA[sunpinyin-2.0]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1056</guid>
		<description><![CDATA[open-gram项目是由sunpinyin开发团队发起的一个open-source项目，主要是tchaikov同学在drive，主要目标是为中文输入法在内的NLP类项目，提供开放的词表和n-gram频率数据。项目中的代码将以GPLv3发布，数据文件将以creative-common license发布。
open-phrase对于词表和unigram（词频）数据来说，已经做得很好了。但是对于其词库的原始来源，以及生成数据的发布协议，都不是很清晰。（也许这也是ubuntu至今没有收录ibus-pinyin-data包的原因之一？）其仅在项目页面上提到，采用GPLv2协议。如果的确如此，这个协议对于广大软件开发者来说，无疑是过于严苛了。
open-gram将采用cc-cedict的词库（同样以creative-common license发布）为基础，在处理语料时发现的新词也将采用相同的协议，并希望能贡献回cc-cedict。open-gram不仅仅针对简体中文，我们希望将来也能包括繁体中文、甚至中英混合的统计信息。最终提供给大家的包括词表和n-gram频率数据，都会采用文本文件的方式。
tchaikov同学已经发布了一个适用于sunpinyin-2.0的，基于cc-cedict和zh.wikipedia的词库和语言模型，可以在此下载，用以替换sunpinyin-2.0中原有的数据文件。替换之后，可能有些词条会和您的用户词典中有重叠（我们将尽快加入删除用户自造词的功能），而且建议您清除掉history cache文件。
tchaikov同学做了大量艰苦的工作，训练了用于新词发现的CRF模型，手工校对了许多词条及其注音，等等。我们也热切盼望更多朋友的加入！
Updated by tchaikov:
ibus-pinyin-data 现在叫 ibus-pinyin-db-open-phrase，已经进入了 ubuntu 和  debian。license 是 GPLv2。
]]></description>
			<content:encoded><![CDATA[<p><a href="http://code.google.com/p/open-gram/">open-gram</a>项目是由<a href="http://sunpinyin.org">sunpinyin</a>开发团队发起的一个open-source项目，主要是<a href="http://code.google.com/u/tchaikov/">tchaikov</a>同学在drive，主要目标是为中文输入法在内的NLP类项目，提供开放的词表和n-gram频率数据。项目中的代码将以GPLv3发布，数据文件将以<a href="http://creativecommons.org/licenses/by-sa/3.0/">creative-common license</a>发布。</p>
<p><a href="http://code.google.com/p/open-phrase/">open-phrase</a>对于词表和unigram（词频）数据来说，已经做得很好了。但是对于其词库的原始来源，以及生成数据的发布协议，都不是很清晰。（也许这也是ubuntu<a href="http://packages.ubuntu.com/search?suite=all&amp;section=all&amp;arch=any&amp;searchon=names&amp;keywords=ibus-pinyin-data">至今没有收录ibus-pinyin-data包</a>的原因之一？）其仅在项目页面上提到，采用GPLv2协议。如果的确如此，这个协议对于广大软件开发者来说，无疑是过于严苛了。</p>
<p>open-gram将采用<a href="http://en.wikipedia.org/wiki/CEDICT">cc-cedict</a>的词库（同样以creative-common license发布）为基础，在处理语料时发现的新词也将采用相同的协议，并希望能贡献回cc-cedict。open-gram不仅仅针对简体中文，我们希望将来也能包括繁体中文、甚至中英混合的统计信息。最终提供给大家的包括词表和n-gram频率数据，都会采用文本文件的方式。</p>
<p><a href="http://code.google.com/u/tchaikov/">tchaikov</a>同学已经发布了一个适用于sunpinyin-2.0的，基于cc-cedict和<a href="http://zh.wikipedia.org">zh.wikipedia</a>的词库和语言模型，可以<a href="http://sunpinyin.googlecode.com/files/lm_0.1.1.tar.bz2">在此下载</a>，用以替换sunpinyin-2.0中原有的数据文件。替换之后，可能有些词条会和您的用户词典中有重叠（我们将尽快加入删除用户自造词的功能），而且建议您清除掉history cache文件。</p>
<p>tchaikov同学做了大量艰苦的工作，训练了用于新词发现的CRF模型，手工校对了许多词条及其注音，等等。我们也热切盼望更多朋友的加入！</p>
<p>Updated by tchaikov:</p>
<blockquote><p>ibus-pinyin-data 现在叫 ibus-pinyin-db-open-phrase，已经进入了 ubuntu 和  debian。license 是 GPLv2。</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/03/open-gram%e9%a1%b9%e7%9b%ae%e7%ae%80%e4%bb%8b/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Mini-summit of SunPinyin developers</title>
		<link>http://yongsun.me/2010/02/mini-summit-of-sunpinyin-developers/</link>
		<comments>http://yongsun.me/2010/02/mini-summit-of-sunpinyin-developers/#comments</comments>
		<pubDate>Thu, 25 Feb 2010 16:01:50 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Input Method]]></category>
		<category><![CDATA[sunpinyin-2.0]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1169</guid>
		<description><![CDATA[
（由左到右，分别是我，江疆，薛伟和柴可夫）
柴可夫是SunPinyin项目的主力开发人员之一。这次来京，终于有机会一聚，得以一见Kov同学的真容，让人相见恨晚啊。席间大家相谈甚欢，也讨论了SunPinyin下一步的开发规划，希望我们新的一年做得更好 &#8230; 同时也期待Mike同学回国一聚  
]]></description>
			<content:encoded><![CDATA[<p><a href="http://yongsun.me/wp-content/uploads/2010/02/P2250679.jpg"><img class="alignnone size-medium wp-image-1168" title="P2250679" src="http://yongsun.me/wp-content/uploads/2010/02/P2250679-300x200.jpg" alt="" width="300" height="200" /></a><a href="http://yongsun.me/wp-content/uploads/2010/02/P2250677.jpg"><img class="size-medium wp-image-1167 alignleft" style="margin-left: 10px; margin-right: 10px;" title="P2250677" src="http://yongsun.me/wp-content/uploads/2010/02/P2250677-200x300.jpg" alt="" width="200" height="300" /></a><br />
（由左到右，分别是我，江疆，薛伟和柴可夫）</p>
<p>柴可夫是SunPinyin项目的主力开发人员之一。这次来京，终于有机会一聚，得以一见Kov同学的真容，让人相见恨晚啊。席间大家相谈甚欢，也讨论了SunPinyin下一步的开发规划，希望我们新的一年做得更好 &#8230; 同时也期待Mike同学回国一聚 <img src='http://yongsun.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/02/mini-summit-of-sunpinyin-developers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>sunpinyin-2.0 beta for mac snowleopard</title>
		<link>http://yongsun.me/2010/02/sunpinyin-2-0-beta-for-mac-snowleopard/</link>
		<comments>http://yongsun.me/2010/02/sunpinyin-2-0-beta-for-mac-snowleopard/#comments</comments>
		<pubDate>Fri, 19 Feb 2010 13:08:02 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Input Method]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[sunpinyin-2.0]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1146</guid>
		<description><![CDATA[Beta 2版本已发布安装包，请参考：sunpinyin-2.0 beta 2 for mac os (10.5+)
过年期间把sunpinyin-2.0的mac porting搞了搞，有一个基本可用的版本了。和前一版相比，2.0加入了双拼、易混淆音、拼音自动纠错、用户词典等新特性。欢迎下载试用： SunPinyin-2.0-beta.zip。

下载解压之后，请用下面的步骤进行安装：

$ sudo rm -rf /Library/Input\ Methods/SunPinyin.app
(注意：仅当已安装1.0版本时需要此步骤)
$ sudo mv ~/Downloads/SunPinyin.app  /Library/Input\ Methods/
$ for i in {1..10}; do killall -9 SunPinyin; done
(注意：仅适用于升级旧版本，初次安装请重新登录，并在系统的语言设置中选中SunPinyin)

对leopard（10.5.x）的用户，可先执行上面前2步，然后下载 SunPinyin-2.0-beta-leopard.zip，解压缩之后，覆盖已安装的snow-leopard的版本：

$ sudo cp -r SunPinyin.app /Library/Input\ Methods/

再执行第三步，就可以了。
还有很多易用性的功能还未完善，包括支持用快捷键删除用户自造词、在输入数字后将句点设为英文句点等。希望在下个minor release中加入进来。欢迎大家多提宝贵意见  
]]></description>
			<content:encoded><![CDATA[<p><strong>Beta 2版本已发布安装包，请参考：<a title="Permanent Link to sunpinyin-2.0 beta 2 for mac os (10.5+)" rel="bookmark" href="http://yongsun.me/2010/03/sunpinyin-2-0-beta-2-for-mac-os-10-5/"><span style="color: #0000ff;">sunpinyin-2.0 beta 2 for mac os (10.5+)</span></a></strong></p>
<p><span style="text-decoration: line-through;">过年期间把sunpinyin-2.0的mac porting搞了搞，有一个基本可用的版本了。和前一版相比，2.0加入了双拼、易混淆音、拼音自动纠错、用户词典等新特性。欢迎下载试用： </span><a title="SunPinyin-2.0-beta-snowleopard" href="http://yongsun.me/wp-content/uploads/2010/02/SunPinyin-2.0-beta.zip"><span style="text-decoration: line-through;">SunPinyin-2.0-beta.zip</span></a><span style="text-decoration: line-through;">。</span></p>
<p><a href="http://yongsun.me/wp-content/uploads/2010/02/sunpinyin-2.0-mac-pinyin-scheme-setup.png"><span style="text-decoration: line-through;"><img class="alignnone size-medium wp-image-1154" title="sunpinyin-2.0-mac-pinyin-scheme-setup" src="http://yongsun.me/wp-content/uploads/2010/02/sunpinyin-2.0-mac-pinyin-scheme-setup-300x276.png" alt="" width="300" height="276" /></span></a><a href="http://yongsun.me/wp-content/uploads/2010/02/sunpinyin-2.0-mac-fuzzy-pinyin-setup.png"><span style="text-decoration: line-through;"><img class="alignnone size-medium wp-image-1153" title="sunpinyin-2.0-mac-fuzzy-pinyin-setup" src="http://yongsun.me/wp-content/uploads/2010/02/sunpinyin-2.0-mac-fuzzy-pinyin-setup-300x276.png" alt="" width="300" height="276" /></span></a></p>
<p><span style="text-decoration: line-through;">下载解压之后，请用下面的步骤进行安装：</span></p>
<ol>
<li><span style="text-decoration: line-through;">$ sudo rm -rf /Library/Input\ Methods/SunPinyin.app<br />
(</span><span style="color: #0000ff;"><span style="text-decoration: line-through;">注意：仅当已安装1.0版本时需要此步骤</span></span><span style="text-decoration: line-through;">)</span></li>
<li><span style="text-decoration: line-through;">$ sudo mv ~/Downloads/SunPinyin.app  /Library/Input\ Methods/</span></li>
<li><span style="text-decoration: line-through;">$ for i in {1..10}; do killall -9 SunPinyin; done<br />
(</span><span style="color: #0000ff;"><span style="text-decoration: line-through;">注意：仅适用于升级旧版本，初次安装请重新登录，并在系统的语言设置中选中SunPinyin</span></span><span style="text-decoration: line-through;">)</span></li>
</ol>
<p><span style="text-decoration: line-through;">对</span><span style="background-color: yellow;"><span style="text-decoration: line-through;">leopard（10.5.x）</span></span><span style="text-decoration: line-through;">的用户，可先执行上面前2步，然后下载</span><a title=" SunPinyin-2.0-beta-leopard" href="../wp-content/uploads/2010/02/%C2%A0SunPinyin-2.0-beta-leopard.zip"><span style="text-decoration: line-through;"> SunPinyin-2.0-beta-leopard.zip</span></a><span style="text-decoration: line-through;">，解压缩之后，覆盖已安装的snow-leopard的版本：</span></p>
<ul>
<li><span style="text-decoration: line-through;">$ sudo cp -r SunPinyin.app /Library/Input\ Methods/</span></li>
</ul>
<p><span style="text-decoration: line-through;">再执行第三步，就可以了。</span></p>
<p><span style="text-decoration: line-through;">还有很多易用性的功能还未完善，包括支持用快捷键删除用户自造词、在输入数字后将句点设为英文句点等。希望在下个minor release中加入进来。欢迎大家多提宝贵意见 <img src='http://yongsun.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </span></p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/02/sunpinyin-2-0-beta-for-mac-snowleopard/feed/</wfw:commentRss>
		<slash:comments>20</slash:comments>
		</item>
		<item>
		<title>进入M4/3的世界</title>
		<link>http://yongsun.me/2010/02/%e8%bf%9b%e5%85%a5m43%e7%9a%84%e4%b8%96%e7%95%8c/</link>
		<comments>http://yongsun.me/2010/02/%e8%bf%9b%e5%85%a5m43%e7%9a%84%e4%b8%96%e7%95%8c/#comments</comments>
		<pubDate>Mon, 08 Feb 2010 15:21:39 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[E-P2]]></category>
		<category><![CDATA[Olympus]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1135</guid>
		<description><![CDATA[家里的D700太沉，加上个24-70/F2.8就接近2公斤的重量了，拍些生活中的小品有点over，而且目标太明显，不利于扫街。要是有一台比较轻便的、画质出色的相机，该有多好啊。莱卡的M8/9就算了，那是富人们的奢侈品。Sigma的DP1/2是不错，就是操控性让人诟病良多，且不能更换镜头。一直关注M4/3机型，终于在年底磨到了老婆的批准。
M4/3的机型主要是松下的GF-1和Olympus的E-P1/2系列，性能和价格都相当。Olympus新发布的E-PL1，虽然价格上估计会便宜一些，不过塑料机身和缩水的操控性能，让我对它提不起兴趣。
在网上查了些资料，对比GF-1和E-P1/2三款机型。貌似松下和奥林巴斯也在玩错位竞争的把戏。松下的GF-1，有机身内闪，背面的LCD像素比E-P1/2要高不少，显示画面比较精细，对焦速度快，20/F1.7的光学防抖套头，也受很多M4/3玩家的推崇。相比之下，E-P1/2好像找不出什么优势，也就是机身操控性方面稍好一些，造型比较复古，有机身防抖。不过，E-P2的VF-2电子取景器，是O的一记杀手锏。144万像素的高分辨率、100%取景视野、1.15倍的放大倍率，对于一个习惯用取景器观景拍摄的人来说，这太有吸引力了。相比之下，GF-1 22万像素的电子取景器（DMW-LVF1），就像是个玩具。也正是由于VF-2的缘故，E-P1也被我排除在外了。E-P2 17/2.8套（带VF-2），比E-P1的同等套机贵了接近1500元左右，不过VF-2还是值这个差价的，淘宝上的单价基本都在1800以上。总之，候选的机型就是GF-1和E-P2了。
到中关村转了转，只有GF-1有货，E-P2问了几家都没货，要么就是报E-P1的价来忽悠我。但是我和老婆比较了一下GF-1和E-P1的外观，可能是机身偏短的原因，GF-1显得有点短胖，而且握持的手感也不好。还是O记的外观比较有型、耐看。而且GF-1套机基本报价在6500左右，加上取景器价格比E-P2套机还要贵了。最后，目标锁定E-P2。给五棵松的锐意打了好几通电话，一直没人接。天色也见晚，也不敢贸然跑过去了，只好作罢。第二天早起，给锐意打电话，得知E-P2仅剩一台17/F2.8套机了，连忙让店家帮我预留，中午吃完饭就杀过去提货。

交钱开箱，映入眼帘的是乌黑色的机身，很有质感。开机玩了两下，操控性和对焦性能，比我的D700还是有差距。不过，真的是很轻巧。后来回到家，又研习了一下说明书，调整了一些转盘和按钮的设置，感觉好多了。E-P2的一些艺术滤镜，还挺有意思的，新增的那个3D滤镜，有点移轴的味道。另外，在网上看到，我的SB-800在手动模式下是可以工作的。只是这么小巧的机身，加上硕大的一个闪光灯，有点头重脚轻，呵呵 &#8230;
]]></description>
			<content:encoded><![CDATA[<p><img class="alignleft size-medium wp-image-1134" style="margin-left: 10px; margin-right: 10px;" title="E-P2" src="http://yongsun.me/wp-content/uploads/2010/02/E-P2-300x199.jpg" alt="" width="300" height="199" />家里的D700太沉，加上个24-70/F2.8就接近2公斤的重量了，拍些生活中的小品有点over，而且目标太明显，不利于扫街。要是有一台比较轻便的、画质出色的相机，该有多好啊。莱卡的M8/9就算了，那是富人们的奢侈品。Sigma的DP1/2是不错，就是操控性让人诟病良多，且不能更换镜头。一直关注M4/3机型，终于在年底磨到了老婆的批准。</p>
<p>M4/3的机型主要是松下的GF-1和Olympus的E-P1/2系列，性能和价格都相当。Olympus新发布的E-PL1，虽然价格上估计会便宜一些，不过塑料机身和缩水的操控性能，让我对它提不起兴趣。</p>
<p>在网上查了些资料，对比GF-1和E-P1/2三款机型。貌似松下和奥林巴斯也在玩错位竞争的把戏。松下的GF-1，有机身内闪，背面的LCD像素比E-P1/2要高不少，显示画面比较精细，对焦速度快，20/F1.7的光学防抖套头，也受很多M4/3玩家的推崇。相比之下，E-P1/2好像找不出什么优势，也就是机身操控性方面稍好一些，造型比较复古，有机身防抖。不过，E-P2的VF-2电子取景器，是O的一记杀手锏。144万像素的高分辨率、100%取景视野、1.15倍的放大倍率，对于一个习惯用取景器观景拍摄的人来说，这太有吸引力了。相比之下，GF-1 22万像素的电子取景器（DMW-LVF1），就像是个玩具。也正是由于VF-2的缘故，E-P1也被我排除在外了。E-P2 17/2.8套（带VF-2），比E-P1的同等套机贵了接近1500元左右，不过VF-2还是值这个差价的，淘宝上的单价基本都在1800以上。总之，候选的机型就是GF-1和E-P2了。</p>
<p>到中关村转了转，只有GF-1有货，E-P2问了几家都没货，要么就是报E-P1的价来忽悠我。但是我和老婆比较了一下GF-1和E-P1的外观，可能是机身偏短的原因，GF-1显得有点短胖，而且握持的手感也不好。还是O记的外观比较有型、耐看。而且GF-1套机基本报价在6500左右，加上取景器价格比E-P2套机还要贵了。最后，目标锁定E-P2。给五棵松的锐意打了好几通电话，一直没人接。天色也见晚，也不敢贸然跑过去了，只好作罢。第二天早起，给锐意打电话，得知E-P2仅剩一台17/F2.8套机了，连忙让店家帮我预留，中午吃完饭就杀过去提货。</p>
<p><img class="size-medium wp-image-1136 alignright" style="margin-right: 10px; margin-left: 10px;" title="E-P2-with-SB800" src="http://yongsun.me/wp-content/uploads/2010/02/E-P2-with-SB800-300x199.jpg" alt="" width="300" height="199" /></p>
<p>交钱开箱，映入眼帘的是乌黑色的机身，很有质感。开机玩了两下，操控性和对焦性能，比我的D700还是有差距。不过，真的是很轻巧。后来回到家，又研习了一下说明书，调整了一些转盘和按钮的设置，感觉好多了。E-P2的一些艺术滤镜，还挺有意思的，新增的那个3D滤镜，有点移轴的味道。另外，在网上看到，我的SB-800在手动模式下是可以工作的。只是这么小巧的机身，加上硕大的一个闪光灯，有点头重脚轻，呵呵 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/02/%e8%bf%9b%e5%85%a5m43%e7%9a%84%e4%b8%96%e7%95%8c/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>使用CAS实现lock-free的一个类比</title>
		<link>http://yongsun.me/2010/01/%e4%bd%bf%e7%94%a8cas%e5%ae%9e%e7%8e%b0lock-free%e7%9a%84%e4%b8%80%e4%b8%aa%e7%b1%bb%e6%af%94/</link>
		<comments>http://yongsun.me/2010/01/%e4%bd%bf%e7%94%a8cas%e5%ae%9e%e7%8e%b0lock-free%e7%9a%84%e4%b8%80%e4%b8%aa%e7%b1%bb%e6%af%94/#comments</comments>
		<pubDate>Mon, 25 Jan 2010 16:53:27 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[CAS]]></category>
		<category><![CDATA[concurrency]]></category>
		<category><![CDATA[lock-free]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1101</guid>
		<description><![CDATA[CAS（CompareAndSwap），是用来实现lock-free编程的重要手段之一，多数处理器都支持这一原子操作。其用伪码描述如下，

template bool CAS(T* addr, T expected, T value)
{
   if (*addr == expected) {
      *addr = value;
      return true;
   }
   return false;
}

Herb在其一篇文章中提到，看到类如if(variable.compare_exchange(x,y))这样的表达式时, 你应该去习惯将其解读为，“是否我就是那个要把variable从x改为y的线程？”。
使用CAS实现lock-free的一般过程可描述为：

拷贝目标对象
对拷贝进行修改
用CAS对目标对象进行修改，如果失败跳转到#1

你可能觉得这个过程有些眼熟，和C++里异常安全编码的规则有些类似，都是先得到目标对象的一份拷贝，然后对拷贝进行修改，最后通过一个不会抛出异常的swap()，将拷贝和目标对象进行置换。只不过这里多了一个CAS，判断目标对象是否已经被其他线程修改了。如果没有被修改过，则commit；否则，就要重做并重试。
这个过程有一个很实际的风险，就是人们常说的ABA问题，即在当前线程得到目标对象的拷贝并进行修改时，目标对象可能被另一个线程从A修改到B、进而又从B又修改到A了。解决ABA问题的方法是，为操作的对象加上一个版本号。大部分的处理器都支持CAS2，支持对两个连续的WORD进行比较和交换。对Intel/AMD的x86和x64处理器来说，CAS2分别对应的是8个byte和16个byte。
我一直在想，这个过程有没有一个比较直观、容易让人理解的类比。后来想到，作为程序员的我们，在使用版本管理系统进行合作开发时，其实经常遇到类似的问题。例如，我们可以把团队里的多个成员想象为多个线程，我们可能同时对一个源文件进行修改。作为个人，修改代码并最终提交的过程大概是这个样子的，

从代码仓库中检出或更新某个源代码文件
对本地的文件拷贝进行修改
在提交之前从代码仓库中update一下该文件，如果没有冲突，就可以提交了；否则，就要解决冲突再尝试提交

在步骤iii中，存在冲突的原因是，一定有其他同事（另一个线程）已经对这个文件进行了修改并提交；如果我们把解决冲突的过程描述为，重新拷贝目标源文件，并apply/merge步骤ii中得到的patch，这个过程和前面的那个过程非常接近了。
对于ABA问题，可以想象：另一个同事在我提交之前对文件进行了修改，然后又revert了自己的修改（A-&#62;B-&#62;A），虽然没有冲突，我们依然可以将步骤iii设想为重新拷贝新版本并apply patch的方式（虽然大多数版本管理工具是根据文件的checksum进行相等性比较的）。
如果在这个时间段，某同事快速不停地对该文件进行修改提交的话，我可能就一直处于“redo-retry”的状态而无法提交自己的代码了。这时，索性我就先把这个修改放到一边，去冲杯咖啡，溜达溜达，然后回来继续尝试。这个就是所谓“back-off”操作了，即如果CAS一直失败，就空闲一会儿，甚至将线程切换出去。
似乎基于CAS的lock-free结构和spin-lock也很相像，不都是一直自旋等待么，不也都是基于乐观性假设么？也对，spin-lock也有可能是用CAS来实现的呢。不过，spin-lock毕竟还是一个锁，因此也就沿袭了锁的一些问题，例如优先级反转、死锁等。而基于CAS的lock-free结构，这不会有这样的问题（虽然运行比较慢的、优先级比较低的线程依然可能被饿死），并且有更好的可伸缩性。
使用CAS实现lock-free的一个类比
]]></description>
			<content:encoded><![CDATA[<p>CAS（CompareAndSwap），是用来实现lock-free编程的重要手段之一，多数处理器都支持这一原子操作。其用伪码描述如下，</p>
<blockquote>
<pre>template bool CAS(T* addr, T expected, T value)
{
   if (*addr == expected) {
      *addr = value;
      return true;
   }
   return false;
}</pre>
</blockquote>
<p><a href="http://www.gotw.ca">Herb</a>在其<a href="http://www.ddj.com/cpp/210604448">一篇文章中提到</a>，看到类如<code>if(variable.compare_exchange(x,y))</code>这样的表达式时, 你应该去习惯将其解读为，“是否我就是那个要把variable从x改为y的线程？”。</p>
<p>使用CAS实现lock-free的一般过程可描述为：</p>
<ol>
<li>拷贝目标对象</li>
<li>对拷贝进行修改</li>
<li>用CAS对目标对象进行修改，如果失败跳转到#1</li>
</ol>
<p>你可能觉得这个过程有些眼熟，和C++里异常安全编码的规则有些类似，都是先得到目标对象的一份拷贝，然后对拷贝进行修改，最后通过一个不会抛出异常的swap()，将拷贝和目标对象进行置换。只不过这里多了一个CAS，判断目标对象是否已经被其他线程修改了。如果没有被修改过，则commit；否则，就要<strong>重做</strong>并<strong>重试</strong>。</p>
<p>这个过程有一个很实际的风险，就是人们常说的ABA问题，即在当前线程得到目标对象的拷贝并进行修改时，目标对象可能被另一个线程从A修改到B、进而又从B又修改到A了。解决ABA问题的方法是，为操作的对象加上一个版本号。大部分的处理器都支持CAS2，支持对两个连续的WORD进行比较和交换。对Intel/AMD的x86和x64处理器来说，CAS2分别对应的是8个byte和16个byte。</p>
<p>我一直在想，这个过程有没有一个比较直观、容易让人理解的类比。后来想到，作为程序员的我们，在使用版本管理系统进行合作开发时，其实经常遇到类似的问题。例如，我们可以把团队里的多个成员想象为多个线程，我们可能同时对一个源文件进行修改。作为个人，修改代码并最终提交的过程大概是这个样子的，</p>
<ol type="i">
<li>从代码仓库中检出或更新某个源代码文件</li>
<li>对本地的文件拷贝进行修改</li>
<li>在提交之前从代码仓库中update一下该文件，如果没有冲突，就可以提交了；否则，就要解决冲突再尝试提交</li>
</ol>
<p>在步骤iii中，存在冲突的原因是，一定有其他同事（另一个线程）已经对这个文件进行了修改并提交；如果我们把解决冲突的过程描述为，重新拷贝目标源文件，并apply/merge步骤ii中得到的patch，这个过程和前面的那个过程非常接近了。</p>
<p>对于ABA问题，可以想象：另一个同事在我提交之前对文件进行了修改，然后又revert了自己的修改（A-&gt;B-&gt;A），虽然没有冲突，我们依然可以将步骤iii设想为重新拷贝新版本并apply patch的方式（虽然大多数版本管理工具是根据文件的checksum进行相等性比较的）。</p>
<p>如果在这个时间段，某同事快速不停地对该文件进行修改提交的话，我可能就一直处于“redo-retry”的状态而无法提交自己的代码了。这时，索性我就先把这个修改放到一边，去冲杯咖啡，溜达溜达，然后回来继续尝试。这个就是所谓“back-off”操作了，即如果CAS一直失败，就空闲一会儿，甚至将线程切换出去。</p>
<p>似乎基于CAS的lock-free结构和spin-lock也很相像，不都是一直自旋等待么，不也都是基于乐观性假设么？也对，spin-lock也有可能是用CAS来实现的呢。不过，spin-lock毕竟还是一个锁，因此也就沿袭了锁的一些问题，例如优先级反转、死锁等。而基于CAS的lock-free结构，这不会有这样的问题（虽然运行比较慢的、优先级比较低的线程依然可能被饿死），并且有更好的可伸缩性。</p>
<div id="_mcePaste" style="position: absolute; left: -10000px; top: 0px; width: 1px; height: 1px; overflow: hidden;">使用CAS实现lock-free的一个类比</div>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/01/%e4%bd%bf%e7%94%a8cas%e5%ae%9e%e7%8e%b0lock-free%e7%9a%84%e4%b8%80%e4%b8%aa%e7%b1%bb%e6%af%94/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sunset (1982-2010) &#8230;</title>
		<link>http://yongsun.me/2010/01/sunset-1982-2010/</link>
		<comments>http://yongsun.me/2010/01/sunset-1982-2010/#comments</comments>
		<pubDate>Thu, 21 Jan 2010 15:32:51 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[sunset]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1106</guid>
		<description><![CDATA[
Linked from James&#8217; blog &#8230;
Don&#8217;t understand why it&#8217;s THE Penguin came together with Duke &#8230;
]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone" src="http://blogs.sun.com/jag/resource/SunRIPsmall.jpg" alt="" width="567" height="444" /></p>
<p>Linked from <a href="http://blogs.sun.com/wangwj/entry/sun">James&#8217; blog</a> &#8230;</p>
<p>Don&#8217;t understand why it&#8217;s THE Penguin came together with Duke &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2010/01/sunset-1982-2010/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>2009年的最后一天</title>
		<link>http://yongsun.me/2009/12/2009%e5%b9%b4%e7%9a%84%e6%9c%80%e5%90%8e%e4%b8%80%e5%a4%a9/</link>
		<comments>http://yongsun.me/2009/12/2009%e5%b9%b4%e7%9a%84%e6%9c%80%e5%90%8e%e4%b8%80%e5%a4%a9/#comments</comments>
		<pubDate>Thu, 31 Dec 2009 12:40:15 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Life]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1098</guid>
		<description><![CDATA[今天，终于完成了年底的最后一个build，可以稍稍歇一口气了。
回首2009年，对我影响最大的事，是我离开了工作近6年的Sun公司，加入了汤森.路透。这4个多月来，工作比以前紧张了不少，不过倒也充实。只是对Sunpinyin2开发上的投入是少之又少了，甚感惭愧，希望来年能多贡献些力量。
小小昨天开始发烧，直到今晚还未退烧。虽然去医院诊断是普通感冒，还是很担心他。希望他明天能好起来，给2010年开个好头。:)
最后，祝愿各位朋友，新年快乐 &#8230;
]]></description>
			<content:encoded><![CDATA[<p>今天，终于完成了年底的最后一个build，可以稍稍歇一口气了。</p>
<p>回首2009年，对我影响最大的事，是我离开了工作近6年的Sun公司，加入了汤森.路透。这4个多月来，工作比以前紧张了不少，不过倒也充实。只是对Sunpinyin2开发上的投入是少之又少了，甚感惭愧，希望来年能多贡献些力量。</p>
<p>小小昨天开始发烧，直到今晚还未退烧。虽然去医院诊断是普通感冒，还是很担心他。希望他明天能好起来，给2010年开个好头。:)</p>
<p>最后，祝愿各位朋友，新年快乐 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2009/12/2009%e5%b9%b4%e7%9a%84%e6%9c%80%e5%90%8e%e4%b8%80%e5%a4%a9/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>C++构造函数抛出的异常</title>
		<link>http://yongsun.me/2009/12/c%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0%e6%8a%9b%e5%87%ba%e7%9a%84%e5%bc%82%e5%b8%b8/</link>
		<comments>http://yongsun.me/2009/12/c%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0%e6%8a%9b%e5%87%ba%e7%9a%84%e5%bc%82%e5%b8%b8/#comments</comments>
		<pubDate>Thu, 17 Dec 2009 07:16:34 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[c++]]></category>
		<category><![CDATA[constructor]]></category>
		<category><![CDATA[cpp]]></category>
		<category><![CDATA[exception]]></category>
		<category><![CDATA[lessons learn]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1090</guid>
		<description><![CDATA[要处理好C++构造函数抛出异常，的确是很tricky啊。
如果要分配在堆上，例如 T* p = new T()，则new operator会被异常中断，造成p没有被赋值。在离开构造函数的scope时，首先会析构自己的成员变量，并会递归调用父类的析构函数；不过，自己的析构函数是没有机会执行了，即便它被分配到栈上。唯一值得欣慰的是，为这个对象分配的内存，是会被释放掉的。
因此如果在构造函数中要分配一些资源，并且在执行过程中可能会抛出异常，最好用auto_ptr把它们保护起来。或者干脆不要在构造函数中执行复杂的初始化操作，转而定义一个单独的initialize方法 &#8230;
]]></description>
			<content:encoded><![CDATA[<p>要处理好C++构造函数抛出异常，的确是很tricky啊。</p>
<p>如果要分配在堆上，例如 <code>T* p = new T()</code>，则new operator会被异常中断，造成p没有被赋值。在离开构造函数的scope时，首先会析构自己的成员变量，并会递归调用父类的析构函数；不过，自己的析构函数是没有机会执行了，即便它被分配到栈上。唯一值得欣慰的是，为这个对象分配的内存，是会被释放掉的。</p>
<p>因此如果在构造函数中要分配一些资源，并且在执行过程中可能会抛出异常，最好用<code>auto_ptr</code>把它们保护起来。或者干脆不要在构造函数中执行复杂的初始化操作，转而定义一个单独的<code>initialize</code>方法 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2009/12/c%e6%9e%84%e9%80%a0%e5%87%bd%e6%95%b0%e6%8a%9b%e5%87%ba%e7%9a%84%e5%bc%82%e5%b8%b8/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>iMac 27/i5 入手</title>
		<link>http://yongsun.me/2009/12/imac-27i5-%e5%85%a5%e6%89%8b/</link>
		<comments>http://yongsun.me/2009/12/imac-27i5-%e5%85%a5%e6%89%8b/#comments</comments>
		<pubDate>Wed, 09 Dec 2009 16:38:05 +0000</pubDate>
		<dc:creator>yongsun</dc:creator>
				<category><![CDATA[Life]]></category>
		<category><![CDATA[iMac]]></category>
		<category><![CDATA[Mac]]></category>

		<guid isPermaLink="false">http://yongsun.me/?p=1087</guid>
		<description><![CDATA[今天中午接到三里屯Apple Store的电话，说i5的iMac昨晚已经到货。晚上一下班，就急急忙忙跑过去提了，到快10点才回到家。
iMac的Setup真是相当的简洁，只需要一根电源线，电源模块在机器内部。键盘和鼠标也都是蓝牙的。不过我还是比较喜欢有线的那款键盘，因为键盘的两侧有两个USB接口，可以很方便地接U盘等小设备，而不必跑到机箱后面。鼠标的手感还不错，有点沉，还是觉得前代的那款，握在手里更舒服。
屏幕真是惊人的大啊，刚开始还觉得有点头晕，现在已经基本适应了。
后面几天有得玩了，正在下载Xcode 3.2.1 &#8230; 不过近期工作很忙，估计周末要加班了 &#8230;
]]></description>
			<content:encoded><![CDATA[<p>今天中午接到三里屯Apple Store的电话，说i5的iMac昨晚已经到货。晚上一下班，就急急忙忙跑过去提了，到快10点才回到家。</p>
<p>iMac的Setup真是相当的简洁，只需要一根电源线，电源模块在机器内部。键盘和鼠标也都是蓝牙的。不过我还是比较喜欢有线的那款键盘，因为键盘的两侧有两个USB接口，可以很方便地接U盘等小设备，而不必跑到机箱后面。鼠标的手感还不错，有点沉，还是觉得前代的那款，握在手里更舒服。</p>
<p>屏幕真是惊人的大啊，刚开始还觉得有点头晕，现在已经基本适应了。</p>
<p>后面几天有得玩了，正在下载Xcode 3.2.1 &#8230; 不过近期工作很忙，估计周末要加班了 &#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://yongsun.me/2009/12/imac-27i5-%e5%85%a5%e6%89%8b/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
	</channel>
</rss>
