<?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>素心如何天上月 &#187; sunpinyin</title> <atom:link href="http://yongsun.me/tag/sunpinyin/feed/" rel="self" type="application/rss+xml" /><link>http://yongsun.me</link> <description>Yong Sun&#039;s Blog</description> <lastBuildDate>Sat, 17 Dec 2011 16:17:35 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=3.3</generator> <item><title>用GPU加速拼音输入法？</title><link>http://yongsun.me/2011/11/%e7%94%a8gpu%e5%8a%a0%e9%80%9f%e6%8b%bc%e9%9f%b3%e8%be%93%e5%85%a5%e6%b3%95%ef%bc%9f/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e7%2594%25a8gpu%25e5%258a%25a0%25e9%2580%259f%25e6%258b%25bc%25e9%259f%25b3%25e8%25be%2593%25e5%2585%25a5%25e6%25b3%2595%25ef%25bc%259f</link> <comments>http://yongsun.me/2011/11/%e7%94%a8gpu%e5%8a%a0%e9%80%9f%e6%8b%bc%e9%9f%b3%e8%be%93%e5%85%a5%e6%b3%95%ef%bc%9f/#comments</comments> <pubDate>Fri, 04 Nov 2011 05:08:12 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[GPU]]></category> <category><![CDATA[sunpinyin]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1686</guid> <description><![CDATA[看到IBM申请了用GPU加速数据库的专利，想起来自己之前还有过用GPU来加速拼音输入法的想法，当时写在了twitter上，幸亏当初有在google reader里订阅了twitter中有关sunpinyin的关键字搜索，否则还真翻不出来了呢… Jun/16, 2011: 这几天我一直在想，能否用GPU来加速输入法，我可以把SunPinyin Syllable Graph的所有组合，发到GPU上去开足够多的线程做并行搜索，或者在做viterbi时，栅格间的状态节点转移，也可以放到GPU上来并行运算，可大幅度提高beem宽度… 个人倾向于第一种方式… http://twitter.com/#!/yongsun/statuses/81130853278822400 当时还和熟悉GPU/OpenCL的@reminisce1989同学探讨来着，reminisce1989同学认为用GPU加速Graph算法是很困难的，不过后来reminisce1989同学好像删推了，没有原推可以refer了。 yongsun: @reminisce1989 @jjgod 既然是基础服务，肯定不能随便down掉，应该是可以想办法避免的… 我的想法主要是，现在sunpinyin的搜索规模还很小，不知道能否借助GPU来大幅提高搜索的规模，回头有问题还要向您请教了 reminisce1989: @yongsun @jjgod 最后提醒一下，GPU是不支持指针的（或者说只能模拟指针）。而我不知道你的sunpinyin用的搜索是什么图算法。如果用到任何常规图论算法，不用说难用OpenCL之类的语言实现，实现了效率也提不上去，因为是非顺序化读取，而且还要考虑拷贝数据的时间。 后来，我仔细阅读了OpenGL的一些文章和书籍，觉得应该是有希望的，不过一直没有时间去做实验，先记录在这里吧…]]></description> <content:encoded><![CDATA[<p>看到IBM申请了用GPU加速数据库的专利，想起来自己之前还有过用GPU来加速拼音输入法的想法，当时写在了twitter上，幸亏当初有在google reader里订阅了twitter中有关sunpinyin的关键字搜索，否则还真翻不出来了呢…</p><blockquote><p>Jun/16, 2011:</p><p>这几天我一直在想，能否用GPU来加速输入法，我可以把SunPinyin Syllable Graph的所有组合，发到GPU上去开足够多的线程做并行搜索，或者在做viterbi时，栅格间的状态节点转移，也可以放到GPU上来并行运算，可大幅度提高beem宽度… 个人倾向于第一种方式…</p><p><a
href="http://twitter.com/#!/yongsun/statuses/81130853278822400">http://twitter.com/#!/yongsun/statuses/81130853278822400</a></p></blockquote><p>当时还和熟悉GPU/OpenCL的<a
href="http://twitter.com/reminisce1989">@reminisce1989</a>同学探讨来着，reminisce1989同学认为用GPU加速Graph算法是很困难的，不过后来reminisce1989同学好像删推了，没有原推可以refer了。</p><blockquote><p><span
style="text-decoration: underline;">yongsun</span>: @reminisce1989 @jjgod 既然是基础服务，肯定不能随便down掉，应该是可以想办法避免的… 我的想法主要是，现在sunpinyin的搜索规模还很小，不知道能否借助GPU来大幅提高搜索的规模，回头有问题还要向您请教了 <img
src='http://yongsun.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p><p><span
style="text-decoration: underline;">reminisce1989</span>: @yongsun @jjgod 最后提醒一下，GPU是不支持指针的（或者说只能模拟指针）。而我不知道你的sunpinyin用的搜索是什么图算法。如果用到任何常规图论算法，不用说难用OpenCL之类的语言实现，实现了效率也提不上去，因为是非顺序化读取，而且还要考虑拷贝数据的时间。</p></blockquote><p>后来，我仔细阅读了OpenGL的一些文章和书籍，觉得应该是有希望的，不过一直没有时间去做实验，先记录在这里吧…</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2011/11/%e7%94%a8gpu%e5%8a%a0%e9%80%9f%e6%8b%bc%e9%9f%b3%e8%be%93%e5%85%a5%e6%b3%95%ef%bc%9f/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>open-gram词表协议改为Apache V2.0</title><link>http://yongsun.me/2011/09/%e3%80%90%e5%85%ac%e5%91%8a%e3%80%91open-gram%e8%af%8d%e8%a1%a8%e5%8d%8f%e8%ae%ae%e6%9b%b4%e6%94%b9%e4%b8%baapache-v2-0/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e3%2580%2590%25e5%2585%25ac%25e5%2591%258a%25e3%2580%2591open-gram%25e8%25af%258d%25e8%25a1%25a8%25e5%258d%258f%25e8%25ae%25ae%25e6%259b%25b4%25e6%2594%25b9%25e4%25b8%25baapache-v2-0</link> <comments>http://yongsun.me/2011/09/%e3%80%90%e5%85%ac%e5%91%8a%e3%80%91open-gram%e8%af%8d%e8%a1%a8%e5%8d%8f%e8%ae%ae%e6%9b%b4%e6%94%b9%e4%b8%baapache-v2-0/#comments</comments> <pubDate>Sat, 03 Sep 2011 16:19:24 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[open-gram]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1666</guid> <description><![CDATA[经过社区的讨论，我们一致同意，将open-grame词表的协议改为Apache V2.0。 新的词库将以android-google-pinyin的词库为基础 废弃之前基于cc-cedict的老词库，但是将open-gram自己发现/汇总的一些新词以Apache V2.0协议重新贡献给open-gram词表 libpinyin/novel-pinyin/smart-pinyin 项目lead已同意，将各自项目的词库，以Apache V2.0的协议贡献给open-gram项目 FIT团队同意将FIT输入法的网络热词，定期反馈给open-gram社区 非常感谢大家的支持和帮助！ SunPinyin的词库一直以来为大家所诟病，希望这次能为大家带来质量更好的词库，和更好的输入体验…]]></description> <content:encoded><![CDATA[<p>经过社区的讨论，我们一致同意，将open-grame词表的协议改为<a
href="http://www.apache.org/licenses/LICENSE-2.0.html">Apache V2.0</a>。</p><ul><li>新的词库将以android-google-pinyin的词库为基础</li><li>废弃之前基于cc-cedict的老词库，但是将open-gram自己发现/汇总的一些新词以Apache V2.0协议重新贡献给open-gram词表</li><li>libpinyin/novel-pinyin/smart-pinyin 项目lead已同意，将各自项目的词库，以Apache V2.0的协议贡献给open-gram项目</li><li>FIT团队同意将FIT输入法的网络热词，定期反馈给open-gram社区</li></ul><p>非常感谢大家的支持和帮助！</p><p>SunPinyin的词库一直以来为大家所诟病，希望这次能为大家带来质量更好的词库，和更好的输入体验…</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2011/09/%e3%80%90%e5%85%ac%e5%91%8a%e3%80%91open-gram%e8%af%8d%e8%a1%a8%e5%8d%8f%e8%ae%ae%e6%9b%b4%e6%94%b9%e4%b8%baapache-v2-0/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>SunPinyin Developers on ChinaDaily/Video</title><link>http://yongsun.me/2010/09/sunpinyin-developers-on-chinadailyvideo/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=sunpinyin-developers-on-chinadailyvideo</link> <comments>http://yongsun.me/2010/09/sunpinyin-developers-on-chinadailyvideo/#comments</comments> <pubDate>Thu, 16 Sep 2010 13:28:58 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[chinadaily]]></category> <category><![CDATA[interview]]></category> <category><![CDATA[sunpinyin]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1528</guid> <description><![CDATA[ChinaDaily Video频道的于辰康记者，前几日采访了SunPinyin社区的开发者，非常感谢ChinaDaily以及于先生，给我们这次难得的机会。我们在面对镜头时都变得超紧张，经常NG，耽搁了于先生很多的时间，而于先生对我们则非常耐心。 因为节目时长的原因，我们在介绍社区成员时，没能介绍全部的贡献者，主要介绍了比较活跃的几位成员，而且在介绍时还有一些小瑕疵，希望大家谅解。我们本来邀请了Phill Zhang同学，但是不凑巧他实在抽不出时间，很是遗憾。远在外地的tchaikov, jjgod和mike同学，都只能以照片形式入镜了。mike同学超骨感的，我也是借这个机会，第一次看到mike同学的真容  感谢所有的contributors和用户朋友们，感谢大家对sunpinyin的支持！]]></description> <content:encoded><![CDATA[<p><a
href="http://chinadaily.com.cn/video/2010-09/16/content_11310174.htm"><img
class="size-full wp-image-1530 alignnone" title="sunpinyin_developers_on_chinadaily-video" src="http://yongsun.me/wp-content/uploads/2010/09/sunpinyin_developers_on_chinadaily-video1.png" alt="" width="510" height="354" /></a></p><p>ChinaDaily Video频道的于辰康记者，前几日采访了SunPinyin社区的开发者，非常感谢ChinaDaily以及于先生，给我们这次难得的机会。我们在面对镜头时都变得超紧张，经常NG，耽搁了于先生很多的时间，而于先生对我们则非常耐心。</p><p>因为节目时长的原因，我们在介绍社区成员时，没能介绍全部的贡献者，主要介绍了比较活跃的几位成员，而且在介绍时还有一些小瑕疵，希望大家谅解。我们本来邀请了Phill Zhang同学，但是不凑巧他实在抽不出时间，很是遗憾。远在外地的tchaikov, jjgod和mike同学，都只能以照片形式入镜了。mike同学超骨感的，我也是借这个机会，第一次看到mike同学的真容 <img
src='http://yongsun.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' />  感谢所有的contributors和用户朋友们，感谢大家对sunpinyin的支持！</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2010/09/sunpinyin-developers-on-chinadailyvideo/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>【预告】SunPinyin做客Beta沙龙</title><link>http://yongsun.me/2010/05/%e3%80%90%e9%a2%84%e5%91%8a%e3%80%91sunpinyin%e5%81%9a%e5%ae%a2beta%e6%b2%99%e9%be%99/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=%25e3%2580%2590%25e9%25a2%2584%25e5%2591%258a%25e3%2580%2591sunpinyin%25e5%2581%259a%25e5%25ae%25a2beta%25e6%25b2%2599%25e9%25be%2599</link> <comments>http://yongsun.me/2010/05/%e3%80%90%e9%a2%84%e5%91%8a%e3%80%91sunpinyin%e5%81%9a%e5%ae%a2beta%e6%b2%99%e9%be%99/#comments</comments> <pubDate>Thu, 27 May 2010 13:18:59 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[General]]></category> <category><![CDATA[betasalon]]></category> <category><![CDATA[sunpinyin]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1444</guid> <description><![CDATA[http://club.blogbeta.com/2010/05/13-sunpinyin 时间：2010年6月4日星期五晚上，19: 00开始 地点：奇遇花园咖啡馆（问路电话010-88320741） 地址：西直门北展北街9号华远企业号（华远地产）D座一层（地图） 演讲题目：What’s new of SunPinyin 2.0 内容预览： 演讲人简介： 孙勇，SunPinyin项目的Lead Engineer之一，SunPinyin Mac Porting的主要维护者。 个人blog，http://yongsun.me，twitter: @yongsun 参与说明：无需报名，参加免费，点单AA]]></description> <content:encoded><![CDATA[<p><a
href="http://club.blogbeta.com/2010/05/13-sunpinyin">http://club.blogbeta.com/2010/05/13-sunpinyin</a></p><p>时间：2010年6月4日星期五晚上，19: 00开始<br
/> 地点：奇遇花园咖啡馆（问路电话010-88320741）<br
/> 地址：西直门北展北街9号华远企业号（华远地产）D座一层（<a
href="http://storygarden.me/cafe/map">地图</a>）</p><p>演讲题目：What’s new of SunPinyin 2.0</p><p>内容预览：</p><p><iframe
src="http://docs.google.com/present/embed?id=ahtgvwdt62tk_269hjmtsjgb&#038;size=m" frameborder="0" width="555" height="451"></iframe></p><p>演讲人简介：<br
/> 孙勇，SunPinyin项目的Lead Engineer之一，SunPinyin Mac Porting的主要维护者。<br
/> 个人blog，http://yongsun.me，twitter: @yongsun</p><p>参与说明：无需报名，参加免费，点单AA</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2010/05/%e3%80%90%e9%a2%84%e5%91%8a%e3%80%91sunpinyin%e5%81%9a%e5%ae%a2beta%e6%b2%99%e9%be%99/feed/</wfw:commentRss> <slash:comments>8</slash:comments> </item> <item><title>ibus-sunpinyin2进入gentoo官方库</title><link>http://yongsun.me/2009/11/ibus-sunpinyin2%e8%bf%9b%e5%85%a5gentoo%e5%ae%98%e6%96%b9%e5%ba%93/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ibus-sunpinyin2%25e8%25bf%259b%25e5%2585%25a5gentoo%25e5%25ae%2598%25e6%2596%25b9%25e5%25ba%2593</link> <comments>http://yongsun.me/2009/11/ibus-sunpinyin2%e8%bf%9b%e5%85%a5gentoo%e5%ae%98%e6%96%b9%e5%ba%93/#comments</comments> <pubDate>Sun, 08 Nov 2009 13:02:41 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1064</guid> <description><![CDATA[从朋友那里得知，ibus-sunpinyin2已经进入gentoo官方库，感谢整个开发团队（特别是Kov)，以及所有支持和关心我们的朋友们！:)]]></description> <content:encoded><![CDATA[<p>从朋友那里得知，ibus-sunpinyin2已经进入<a
href="http://packages.gentoo.org/package/app-i18n/ibus-sunpinyin">gentoo官方库</a>，感谢整个开发团队（特别是Kov)，以及所有支持和关心我们的朋友们！:)</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/11/ibus-sunpinyin2%e8%bf%9b%e5%85%a5gentoo%e5%ae%98%e6%96%b9%e5%ba%93/feed/</wfw:commentRss> <slash:comments>2</slash:comments> </item> <item><title>ibus-sunpinyin 2.0 发布 release candidate！</title><link>http://yongsun.me/2009/11/ibus-sunpinyin-2-0-%e5%8f%91%e5%b8%83-release-candidate%ef%bc%81/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=ibus-sunpinyin-2-0-%25e5%258f%2591%25e5%25b8%2583-release-candidate%25ef%25bc%2581</link> <comments>http://yongsun.me/2009/11/ibus-sunpinyin-2-0-%e5%8f%91%e5%b8%83-release-candidate%ef%bc%81/#comments</comments> <pubDate>Tue, 03 Nov 2009 23:42:34 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[iBus]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1060</guid> <description><![CDATA[感谢Kov Chai的超辛苦付出，以及William Xue，Leo Zheng等同学们的共同努力，ibus-sunpinyin 2.0发布了第一个release candidate！详情请参见： http://groups.google.com/group/sunpinyin-developers/...]]></description> <content:encoded><![CDATA[<p>感谢<a
href="http://code.google.com/u/tchaikov/">Kov Chai</a>的超辛苦付出，以及<a
href="http://code.google.com/u/breadson.xue/">William Xue</a>，<a
href="http://code.google.com/u/zym361/">Leo Zheng</a>等同学们的共同努力，ibus-sunpinyin 2.0发布了第一个release candidate！详情请参见：</p><p><a
href="http://groups.google.com/group/sunpinyin-developers/browse_thread/thread/50d3b49c9b45ee20">http://groups.google.com/group/sunpinyin-developers/...</a></p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/11/ibus-sunpinyin-2-0-%e5%8f%91%e5%b8%83-release-candidate%ef%bc%81/feed/</wfw:commentRss> <slash:comments>9</slash:comments> </item> <item><title>setup sunpinyin-developers@googlegroups.com</title><link>http://yongsun.me/2009/09/setup-sunpinyin-developersgooglegroups-com/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=setup-sunpinyin-developersgooglegroups-com</link> <comments>http://yongsun.me/2009/09/setup-sunpinyin-developersgooglegroups-com/#comments</comments> <pubDate>Fri, 11 Sep 2009 16:59:47 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1039</guid> <description><![CDATA[我们刚刚为SunPinyin项目建立了一个google-group。虽然oso-inputmethod项目也有一个mail-list，不过是和其他opensolaris i18n/l10n项目share的。而且似乎国内的开发者或用户，还是更习惯和倾向使用google-group作为交流的途径。因此我们就创建了这个group。 SunPinyin的开发者会使用这个mail group来讨论开发相关的问题，同时用户也可以用这个mail group来报告发现的问题。（觉得再建一个sunpinyin-users的group还不是这么紧迫和必要。）大家也可以直接发邮件到sunpinyin-developers@googlegroups.com。 期待您的加入！]]></description> <content:encoded><![CDATA[<p>我们刚刚为SunPinyin项目建立了一个<a
href="http://groups.google.com/group/sunpinyin-developers">google-group</a>。虽然<a
href="http://opensolaris.org/os/project/input-method/">oso-inputmethod</a>项目也有一个<a
href="mailto: i18n-discuss@opensolaris.org">mail-list</a>，不过是和其他opensolaris i18n/l10n项目share的。而且似乎国内的开发者或用户，还是更习惯和倾向使用google-group作为交流的途径。因此我们就创建了这个group。</p><p>SunPinyin的开发者会使用这个mail group来讨论开发相关的问题，同时用户也可以用这个mail group来报告发现的问题。（觉得再建一个sunpinyin-users的group还不是这么紧迫和必要。）大家也可以直接发邮件到<a
href="mailto:sunpinyin-developers@googlegroups.com">sunpinyin-developers@googlegroups.com</a>。</p><p>期待您的加入！</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/09/setup-sunpinyin-developersgooglegroups-com/feed/</wfw:commentRss> <slash:comments>4</slash:comments> </item> <item><title>A simple event flow of SunPinyin2</title><link>http://yongsun.me/2009/09/a-simple-event-flow-of-sunpinyin2/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=a-simple-event-flow-of-sunpinyin2</link> <comments>http://yongsun.me/2009/09/a-simple-event-flow-of-sunpinyin2/#comments</comments> <pubDate>Mon, 07 Sep 2009 13:28:24 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1035</guid> <description><![CDATA[顺便再补充一句，为了将来能让ime-core编译为一个shared object，SunPinyin2开始使用自己的key mapping。这个文件列出了一些特殊键（function key），它们的keycode和X11 keysym是一致的，因此和scim和ibus的keysym也是一致的。其他的键，例如a-z/A-Z/0-9等和ASCII兼容的，可以直接传入（其实这和X11的keysym还是一致的）。再以外的keycode就不处理直接返回了。因此各位在给SunPinyin2做porting时，还需要编写一个简单的键盘事件的影射。]]></description> <content:encoded><![CDATA[<p><img
class="alignnone size-full wp-image-1034" title="sunpinyin_event_flow" src="http://yongsun.me/wp-content/uploads/2009/09/sunpinyin_event_flow.png" alt="sunpinyin_event_flow" width="594" height="381" /></p><p>顺便再补充一句，为了将来能让ime-core编译为一个shared object，SunPinyin2开始使用自己的<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_keys.h">key mapping</a>。这个文件列出了一些特殊键（function key），它们的keycode和X11 keysym是一致的，因此和scim和ibus的keysym也是一致的。其他的键，例如a-z/A-Z/0-9等和ASCII兼容的，可以直接传入（其实这和X11的keysym还是一致的）。再以外的keycode就不处理直接返回了。因此各位在给SunPinyin2做porting时，还需要编写一个简单的键盘事件的影射。</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/09/a-simple-event-flow-of-sunpinyin2/feed/</wfw:commentRss> <slash:comments>0</slash:comments> </item> <item><title>What’s New in SunPinyin2 — Configuration and Session Factory</title><link>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-configuration-and-session-factory/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what%25e2%2580%2599s-new-in-sunpinyin2-%25e2%2580%2594-configuration-and-session-factory</link> <comments>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-configuration-and-session-factory/#comments</comments> <pubDate>Sun, 06 Sep 2009 13:26:17 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1023</guid> <description><![CDATA[SunPinyin2在设计和实现的过程中，希望能同时支持简体、繁体的词典及语言模型，支持不同的拼音方案，支持不同的输入风格（包括微软拼音和类似sogou或google拼音）。不同的输入风格，对应了不同的view的实现。（虽然目前SunPinyin2还没有重新实现微软拼音的输入风格——CIMIModernView。） 这些选项组合起来数目繁多，不过它们都是正交的，正好可以让我们使用policy based的实现方式。 我们定义了一个CSunpinyinProfile的模板类，它继承了ISunpinyinProfile这个公共接口类（否则我无法声明一个保存其指针的container），和它的三个模板参数，LanguagePolicy，PinyinSchemePolicy，InputStylePolicy。它的createProfile方法，调用policy类中的相关方法，来创建具体的一个view实例。为了避免创建policy的实例，并且更重要的是要共享policy的公共数据，policy类都是单件（singleton）。 LanguagePolicy负责初始化词典、用户词典和语言模型，以及根据这些资源创建CIMIContext类的实例。CSimplifiedChinesePolicy是一个具体的实现。另外还有一些方法，可以让你设置CIMIContext类实例的缺省属性。例如，enableFullPunct和enableFullSymbol，setPunctMapping方法设置s_getFullPunctOp（被所有由该policy类创建的CIMIContext实例所共享）的标点符号影射。我们之前总结为shared &#38; global的用户配置项。可以设想，用户在设置对话框自行定义标点符号的映射关系后，程序员只需要调用CSimplifiedChinesePolicy::setPunctMapping。这个配置项的更改会应用到所有现有的输入上下文（或会话），对输入上下文来说是透明的。 PinyinSchemePolicy负责创建拼音切分器的实例。CQuanpinSchemePolicy和CShuangpinSchemePolicy是两个具体的实现。以CQuanpinSchemePolicy类为例，createPySegmentor方法创建了CQuanpinSegmentor的一个实例并返回。和CSimplifiedChinesePolicy类似，CQuanpinSchemePolicy也有一些shared &#38; global的配置项，例如是否支持易混淆音和自动纠错。 InputStylePolicy负责创建CIMIView的实例。CClassicStylePolicy是一个具体的实现。它只是简单的创建一个CIMIClassicView的实例并返回。CSunPinyinProfile&#60;...&#62;::createProfile方法虽然也是返回一个view的实例，不过这个view是已经设置停当、可以工作的view。 CSunpinyinSessionFactory是一个singleton的工厂类，其createSession方法根据factory中policy的设定，调用某个CSunpinyinProfile实例的createProfile方法，创建一个具体的view。要添加新的语言支持或拼音方案，不仅要完成自己的那部分coding，还要记得编写相应的policy classes，并将支持的所有组合注册到CSunpinyinSessionFactory中（没办法，在这个地方就只能穷举了）。 因为我们最后expose给外部的是一个view的实例，所以如果用户的配置涉及到对policy的切换（我们之前总结为non-shared but global的配置项），以前创建的输入上下文（即view），就面临一个抉择。要么保持不变，继续使用其目前的输入风格；要么要重新创建，discard掉以前上下文的状态信息（例如preedit/candidates）。通常，我们对某个平台的移植，都是创建一个包含view的会话类，这个会话类适配该平台的接口，并将输入事件filter给view。那么我们的这些会话类是如何知道发生了non-shared but global选项的改变呢？ CSunpinyinSessionFactory类提供了一个简单的方法，updateToken/getToken。当平台相关的会话类调用CSunpinyinSessionFactory类创建一个view的实例，同时应该调用getToken得到一个token（口令）。当会话类得到焦点的时候，它可以调用getToken再次得到一个token，比较与自己持有的这个token是否一致。如果不一致，就表明发生了non-shared but global选项的更改。与此相对应地，如果用户对non-shared but global的选项发生了修改，程序员应该要调用updateToken去更新factory当前的token。 这个方式有些丑陋，稍微改观一点的方法可能是，我们再加入一个抽象层次，例如CSunpinyinSession，然后它用signal/slot的方式connect到factory的reset_session信号。另一个问题，配置项还是比较分散，如果要编写一个集中的CSunpinyinOption类的话，就会有很多duplicated的代码。我对上面这些问题，还没有想得很清楚，也非常欢迎大家多提宝贵意见！:) 行文至此，我的“What's new in SunPinyin2”系列也就暂时告一段落了。希望对William、以及SunPinyin2的移植工作有所帮助。我还会继续竭尽全力，投入到SunPinyin2的开发和移植工作中]]></description> <content:encoded><![CDATA[<p>SunPinyin2在设计和实现的过程中，希望能同时支持简体、繁体的词典及语言模型，支持不同的拼音方案，支持不同的输入风格（包括微软拼音和类似sogou或google拼音）。不同的输入风格，对应了不同的view的实现。（虽然目前SunPinyin2还没有重新实现微软拼音的输入风格——CIMIModernView。）</p><p>这些选项组合起来数目繁多，不过它们都是正交的，正好可以让我们使用<a
href="http://en.wikipedia.org/wiki/Policy-based_design">policy based</a>的实现方式。</p><p>我们定义了一个<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#175">CSunpinyinProfile</a>的模板类，它继承了<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#168">ISunpinyinProfile</a>这个公共接口类（否则我无法声明一个保存其指针的container），和它的三个模板参数，LanguagePolicy，PinyinSchemePolicy，InputStylePolicy。它的<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#180">createProfile</a>方法，调用policy类中的相关方法，来创建具体的一个view实例。为了避免创建policy的实例，并且更重要的是要共享policy的公共数据，policy类都是单件（singleton）。</p><p>LanguagePolicy负责初始化词典、用户词典和语言模型，以及根据这些资源创建CIMIContext类的实例。<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#51">CSimplifiedChinesePolicy</a>是一个具体的实现。另外还有一些方法，可以让你设置CIMIContext类实例的缺省属性。例如，<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#95">enableFullPunct</a>和<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#94">enableFullSymbol</a>，<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#90">setPunctMapping</a>方法设置<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#109">s_getFullPunctOp</a>（被所有由该policy类创建的CIMIContext实例所共享）的标点符号影射。我们之前总结为shared &amp; global的用户配置项。可以设想，用户在设置对话框自行定义标点符号的映射关系后，程序员只需要调用<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#90">CSimplifiedChinesePolicy::setPunctMapping</a>。这个配置项的更改会应用到所有现有的输入上下文（或会话），对输入上下文来说是透明的。</p><p>PinyinSchemePolicy负责创建拼音切分器的实例。<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#113">CQuanpinSchemePolicy</a>和<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#143">CShuangpinSchemePolicy</a>是两个具体的实现。以CQuanpinSchemePolicy类为例，<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#116">createPySegmentor</a>方法创建了CQuanpinSegmentor的一个实例并返回。和CSimplifiedChinesePolicy类似，CQuanpinSchemePolicy也有一些shared &amp; global的配置项，例如是否支持易混淆音和自动纠错。</p><p>InputStylePolicy负责创建CIMIView的实例。<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h">CClassicStylePolicy</a>是一个具体的实现。它只是简单的创建一个CIMIClassicView的实例并返回。CSunPinyinProfile&lt;...&gt;::createProfile方法虽然也是返回一个view的实例，不过这个view是已经设置停当、可以工作的view。</p><p><a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#197">CSunpinyinSessionFactory</a>是一个singleton的工厂类，其<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#229">createSession</a>方法根据factory中policy的设定，调用某个CSunpinyinProfile实例的createProfile方法，创建一个具体的view。要添加新的语言支持或拼音方案，不仅要完成自己的那部分coding，还要记得编写相应的policy classes，<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#262">并将支持的所有组合注册到CSunpinyinSessionFactory中</a>（没办法，在这个地方就只能穷举了）。</p><p>因为我们最后expose给外部的是一个view的实例，所以如果用户的配置涉及到对policy的切换（我们之前总结为non-shared but global的配置项），以前创建的输入上下文（即view），就面临一个抉择。要么保持不变，继续使用其目前的输入风格；要么要重新创建，discard掉以前上下文的状态信息（例如preedit/candidates）。通常，我们对某个平台的移植，都是创建一个包含view的会话类，这个会话类适配该平台的接口，并将输入事件filter给view。那么我们的这些会话类是如何知道发生了non-shared but global选项的改变呢？</p><p>CSunpinyinSessionFactory类提供了一个简单的方法，<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#254">updateToken</a>/<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h#255">getToken</a>。当平台相关的会话类调用CSunpinyinSessionFactory类创建一个view的实例，同时应该调用getToken得到一个token（口令）。当会话类得到焦点的时候，它可以调用getToken再次得到一个token，比较与自己持有的这个token是否一致。如果不一致，就表明发生了non-shared but global选项的更改。与此相对应地，如果用户对non-shared but global的选项发生了修改，程序员应该要调用updateToken去更新factory当前的token。</p><p>这个方式有些丑陋，稍微改观一点的方法可能是，我们再加入一个抽象层次，例如CSunpinyinSession，然后它用signal/slot的方式connect到factory的reset_session信号。另一个问题，配置项还是比较分散，如果要编写一个集中的CSunpinyinOption类的话，就会有很多duplicated的代码。我对上面这些问题，还没有想得很清楚，也非常欢迎大家多提宝贵意见！:)</p><p>行文至此，我的“What's new in SunPinyin2”系列也就暂时告一段落了。希望对<a
href="http://blogs.sun.com/weixue">William</a>、以及SunPinyin2的移植工作有所帮助。我还会继续竭尽全力，投入到SunPinyin2的开发和移植工作中 <img
src='http://yongsun.me/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-configuration-and-session-factory/feed/</wfw:commentRss> <slash:comments>7</slash:comments> </item> <item><title>What’s New in SunPinyin2 — User Dictionary</title><link>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-user-dictionary/?utm_source=rss&#038;utm_medium=rss&#038;utm_campaign=what%25e2%2580%2599s-new-in-sunpinyin2-%25e2%2580%2594-user-dictionary</link> <comments>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-user-dictionary/#comments</comments> <pubDate>Fri, 04 Sep 2009 16:09:07 +0000</pubDate> <dc:creator>yongsun</dc:creator> <category><![CDATA[Input Method]]></category> <category><![CDATA[sunpinyin]]></category> <category><![CDATA[sunpinyin-2.0]]></category> <guid
isPermaLink="false">http://yongsun.me/?p=1014</guid> <description><![CDATA[原先的SunPinyin没有用户词典，只是通过User History Cache纪录了用户近期输入的bi-gram信息。如果一个bi-gram，其概率比系统词典的某个uni-gram要低，这个bi-gram的组合就不会出现在用户的候选列表中。例如，虽然用户频繁的输入钥匙，但是它依然很难出现在候选列表中，因为“要是”这个unigram的概率要更高。如果“钥匙”出现在候选中，一定是第一候选，因为它是作为一个最佳候选句子来呈现给用户的。如果用户选择了“要是”，那么“钥匙”又不知道要过多久才能出现了。这个缺陷也是广受大家诟病的地方。其实，SunPinyin原先的架构是支持将用户自定义词放到lattice上进行搜索的。 我们在SunPinyin2中，通过sqlite3来实现用户词典，目前我们的用户词典支持记录&#60;=6个的字符。 CUserDict::_createTable/_createIndexes: 这两个私有方法尝试创建一个table和index。这个表的结构是，首先词的ID（从1开始的）和长度，接下来是6个声母，然后是6个韵母，再其次是6个声调。然后我们为长度＋6个声母建立了一个索引。sqlite的query对搜索条件和index有一些限制，要求条件的次序和index的次序相同，并且一旦某个条件是非相等性的（例如&#62;），则该条件及其之后的条件都无法用index来加速。另外，每个from子句只能使用一个index。 因为我们经常会有不完整拼音的查询，或者换句话说用户经常会输入不完整拼音，所以table和index就被设计成了这个样子。 CUserDict::addWord (syllables, word): 使用了sqlite中的prepared statement来进行插入。最后，在插入成功的情况下，调用sqlite3_last_insert_rowid得到上一次插入记录的row id，加上一个offset并返回。如果失败，就返回0。 CUserDict::removeWord (wid): 这个相对简单，按照wid将记录从数据库中删除。 CUserDict::getWords (syllables, result): 这个方法将syllables在数据库中对应的记录，放到result中。我们返回的词id类型，和系统词典的保持一致，都是CPinyinTrie::TWordIdInfo。这里再解释一下，用户词典的最大容量为什么是6万多个。这个就是由于CPinyinTrie::TWordIdInfo的m_id的长度决定的，是2^18-1。 我们按照sqlite的限制，小心翼翼地组织好查询的where子句，查询，然后迭代结果，填充results，最后返回。 CUserDict::operator [] (wid): 这个方法也相对简单，就是返回wid对应的字符串。因为sqlite只支持utf8和utf16，而且utf16还要使用一套不同的接口，所以我们还是使用utf8作为数据库内的字符串编码。而sunpinyin-ime要求的是ucs-4编码的字符串，所以还要进行一个编码转换。同时把(wid, wstr)这个pair加入到m_dict中。wstr是动态分配的，由m_dict在析构时释放。这里还利用了这样一个事实，std::basic_string是COW的。我们在m_dict中保存的其实是wstr的拷贝，不过这个拷贝和wstr共享同一个C string的buffer。 接下来，我会介绍SunPinyin2中另一个比较复杂和tricky的部分——用户配置（imi_options.h），这一部分到目前还没有完全定型，非常欢迎大家多提宝贵意见。]]></description> <content:encoded><![CDATA[<p>原先的SunPinyin没有用户词典，只是通过User History Cache纪录了用户近期输入的bi-gram信息。如果一个bi-gram，其概率比系统词典的某个uni-gram要低，这个bi-gram的组合就不会出现在用户的候选列表中。例如，虽然用户频繁的输入钥匙，但是它依然很难出现在候选列表中，因为“要是”这个unigram的概率要更高。如果“钥匙”出现在候选中，一定是第一候选，因为它是作为一个最佳候选句子来呈现给用户的。如果用户选择了“要是”，那么“钥匙”又不知道要过多久才能出现了。这个缺陷也是广受大家诟病的地方。其实，SunPinyin原先的架构是<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/slm/slm.cpp#265">支持将用户自定义词放到lattice上进行搜索的</a>。</p><p>我们在SunPinyin2中，通过sqlite3来实现用户词典，目前我们的用户词典支持记录&lt;=6个的字符。</p><p>CUserDict::<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#230">_createTable</a>/<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#256">_createIndexes</a>:</p><blockquote><p>这两个私有方法尝试创建一个table和index。这个表的结构是，首先词的ID（从1开始的）和长度，接下来是6个声母，然后是6个韵母，再其次是6个声调。然后我们为长度＋6个声母建立了一个索引。sqlite的<a
href="http://www.sqlite.org/optoverview.html">query对搜索条件和index有一些限制</a>，要求条件的次序和index的次序相同，并且一旦某个条件是非相等性的（例如&gt;），则该条件及其之后的条件都无法用index来加速。另外，每个from子句只能使用一个index。</p><p>因为我们经常会有不完整拼音的查询，或者换句话说用户经常会输入不完整拼音，所以table和index就被设计成了这个样子。</p></blockquote><p>CUserDict::<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#64">addWord</a> (syllables, word):</p><blockquote><p>使用了sqlite中的prepared statement来进行插入。最后，在插入成功的情况下，调用sqlite3_last_insert_rowid得到上一次插入记录的row id，加上一个offset并返回。如果失败，就返回0。</p></blockquote><p>CUserDict::<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#104">removeWord</a> (wid):</p><blockquote><p>这个相对简单，按照wid将记录从数据库中删除。</p></blockquote><p>CUserDict::<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#117">getWords</a> (syllables, result):</p><blockquote><p>这个方法将syllables在数据库中对应的记录，放到result中。我们返回的词id类型，和系统词典的保持一致，都是CPinyinTrie::TWordIdInfo。这里再解释一下，用户词典的最大容量为什么是6万多个。这个就是由于CPinyinTrie::TWordIdInfo的<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/lexicon/pytrie.h#29">m_id</a>的长度决定的，是2^18-1。</p><p>我们按照sqlite的限制，小心翼翼地组织好查询的where子句，查询，然后迭代结果，填充results，最后返回。</p></blockquote><p>CUserDict::<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#188">operator []</a> (wid):</p><blockquote><p>这个方法也相对简单，就是返回wid对应的字符串。因为sqlite只支持utf8和utf16，而且utf16还要使用一套不同的接口，所以我们还是使用utf8作为数据库内的字符串编码。而sunpinyin-ime要求的是ucs-4编码的字符串，所以还要进行一个编码转换。同时把(wid, wstr)这个pair加入到m_dict中。wstr是动态分配的，由m_dict在析构时释放。这里还利用了这样一个事实，std::basic_string是COW的。<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/userdict.cpp#221">我们在m_dict中保存的其实是wstr的拷贝</a>，不过这个拷贝和wstr共享同一个C string的buffer。</p></blockquote><p>接下来，我会介绍SunPinyin2中另一个比较复杂和tricky的部分——用户配置（<a
href="http://src.opensolaris.org/source/xref/nv-g11n/inputmethod/sunpinyin2/src/ime-core/imi_options.h">imi_options.h</a>），这一部分到目前还没有完全定型，非常欢迎大家多提宝贵意见。</p> ]]></content:encoded> <wfw:commentRss>http://yongsun.me/2009/09/what%e2%80%99s-new-in-sunpinyin2-%e2%80%94-user-dictionary/feed/</wfw:commentRss> <slash:comments>1</slash:comments> </item> </channel> </rss>
