<?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>Robot Shell</title>
	<atom:link href="http://blog.robotshell.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.robotshell.org</link>
	<description>Live in the shell.</description>
	<lastBuildDate>Thu, 26 Jan 2012 09:21:45 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>禁用libata的acpi功能以解决Linux硬盘假死问题</title>
		<link>http://blog.robotshell.org/2012/disable-libata-acpi/</link>
		<comments>http://blog.robotshell.org/2012/disable-libata-acpi/#comments</comments>
		<pubDate>Thu, 26 Jan 2012 09:21:45 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[acpi]]></category>
		<category><![CDATA[libata]]></category>
		<category><![CDATA[Linux]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=226</guid>
		<description><![CDATA[这两天我把系统换成了Archlinux，在用livecd引导启动准备安装时就遇到了问题——启动过程极其漫长；而在安装软件包、高强度读写硬盘时，也出现了假死问题。 类似的问题在进行了系统升级后仍然存在，具体表现为：启动、编译软件、使用hdparm等高强度I/O时，系统假死，在/var/log/errors.log中可以看到以下记录： 12345Jan 20 15:41:01 localhost kernel: [ &#160; 34.400019] ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6 frozen Jan 20 15:41:01 localhost kernel: [ &#160; 34.400044] ata1.00: failed command: READ FPDMA QUEUED Jan 20 15:41:01 localhost kernel: [ &#160; 34.400064] ata1.00: cmd 60/08:00:a0:5e:38/00:00:3a:00:00/40 tag 0 ncq 4096 in Jan 20 15:41:01 localhost [...]]]></description>
			<content:encoded><![CDATA[<p>这两天我把系统换成了Archlinux，在用livecd引导启动准备安装时就遇到了问题——启动过程极其漫长；而在安装软件包、高强度读写硬盘时，也出现了假死问题。</p>
<p>类似的问题在进行了系统升级后仍然存在，具体表现为：启动、编译软件、使用hdparm等高强度I/O时，系统假死，在<code class="codecolorer text geshi"><span class="text">/var/log/errors.log</span></code>中可以看到以下记录：</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Jan 20 15:41:01 localhost kernel: [ &nbsp; 34.400019] ata1.00: exception Emask 0x0 SAct 0x1 SErr 0x0 action 0x6 frozen<br />
Jan 20 15:41:01 localhost kernel: [ &nbsp; 34.400044] ata1.00: failed command: READ FPDMA QUEUED<br />
Jan 20 15:41:01 localhost kernel: [ &nbsp; 34.400064] ata1.00: cmd 60/08:00:a0:5e:38/00:00:3a:00:00/40 tag 0 ncq 4096 in<br />
Jan 20 15:41:01 localhost kernel: [ &nbsp; 34.400066] &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;res 40/00:01:00:00:00/00:00:00:00:00/00 Emask 0x4 (timeout)<br />
Jan 20 15:41:01 localhost kernel: [ &nbsp; 34.400103] ata1.00: status: { DRDY }</div></td></tr></tbody></table></div>
<p>（另外几次假死有的是WRITE FPDMA QUEUED。）</p>
<p>可以看到在假死的时候出现了ata frozen，ncq错误，无法完成读/写队列。上网查询，发现论坛、bug tracker、Q&#038;A上有大量相关的信息，错误日志与此类似，可是大都没法彻底解决——归根究底是以上的日志信息太少，只说明了是ata错误，读取超时。通过其他多方面测试、尝试最终可以知道，这些大都是硬件软件配合问题造成的——对于某些控制器、驱动器，内核ata模块的acpi、ncq等功能无法正常工作，导致I/O错误。解决方法有的需要更换硬件，有的需要更新固件，还有的需要使用内核参数，禁用某些功能或是限制SATA速度。</p>
<p>其中数量比较多的一种就是libata的acpi节能功能有问题，导致硬盘供电不足。根据网络上的说法，在大容量硬盘上这个bug也更容易出现。我的这个硬盘就是新买的500GB 7200转，功率比较大，经过尝试，确实是这个bug导致的。</p>
<p>截止发文之时，没有找到相关补丁，只有一个简单直接的workaround：禁用libata的acpi功能。方法很简单，也没有太多副作用，只要添加内核参数（写入GRUB的启动参数即可）：</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">libata.noacpi=1</div></td></tr></tbody></table></div>
<p><b>PS1:</b>不建议直接禁用全部的acpi功能（即使用 noacpi 参数），此将禁用所有的高级电源管理功能，可能导致休眠、挂起以及笔记本亮度调节失效等等副作用。</p>
<p><b>PS2:</b>ACPI是Advanced Configuration and Power Interface（高级配置与电源接口）的缩写。而与之相似的APIC是Advanced Programmable Interrupt Controller（高级可编程中断控制器）的缩写，与扩充硬件中断有关，与引起Linux诸多问题的ACPI基本毫无关系，请不要混为一谈，随意禁用APIC。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2012/disable-libata-acpi/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Fedora中的kmod与akmod</title>
		<link>http://blog.robotshell.org/2011/fedora-kmod-and-akmod/</link>
		<comments>http://blog.robotshell.org/2011/fedora-kmod-and-akmod/#comments</comments>
		<pubDate>Sat, 11 Jun 2011 10:57:00 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[akmod]]></category>
		<category><![CDATA[Fedora]]></category>
		<category><![CDATA[kmod]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=210</guid>
		<description><![CDATA[Linux Kernel有一大特性就是模块化，通过kernel module（内核模块，Fedora中缩写作kmod）来扩展内核功能（cf. what is a kernel module?）。最常见的一类内核模块就是驱动程序（driver）。由于许可证或使用规模等原因，一些硬件的驱动无法进入kernel，只能通过内核模块的形式来加载使用。在Fedora中如果你启用了rpmfusion-nonfree源，你会看到大量kmod-打头的软件包，大多都是rpmfusion帮我们编译、打包好的各类私有驱动（比如nvidia、ati的显卡驱动，broadcom的网卡驱动等等）。但是，你也许会注意到，几乎每一个kmod-*软件包都有一个对应的akmod-*软件包，而很多“私有驱动安装教程”都是直接让你把两个都装上。那么，这两个到底有什么区别呢？ 让我们以(a)kmod-wl（broadcom无线网卡驱动）为例，看看两个包的summary： kmod-wl: Metapackage which tracks in wl kernel module for newest kernel akmod-wl: Akmod package for wl kernel module(s) 再看一下子包，akmod-wl没有子包，而kmod-wl则有大量的子包，和不同版本的内核一一对应（e.g. kmod-wl-2.6.38.7-30.fc15.i686.PAE.i686）。另外，akmod-*依赖akmods软件包，而这个软件包的用途则是：“Automatic kmods build and install tool”。 这下明白了吧？akmod是能够自动编译、安装的kmod。事实上，akmod-foo的rpm包中只包含了一个src包和一个平台spec文件，并没有任何编译好的二进制文件。akmod-foo通过内核安装后脚本（postinst），在每次安装了新内核后检查新内核是否有foo模块，如果没有则调用akmods从src里编译并安装foo模块，以此来及时为新内核提供相应的模块。这和debian系的dkms是一样的（Ubuntu下的私有驱动都是通过dkms来安装的）。 由于内核模块是安装在某个特定的内核上的，当更新内核后必须重新给新内核安装内核模块，因而如何实现自动化的模块安装、管理一直是一个令人头痛的问题。老方法是通过kmod-*这样的metapack来解决，每当出现新内核后，志愿者们为其编译、打包新的kmod，并把这个新的kmod作为kmod-* metapack的子包添加到源中，利用yum update的过程自动将新的kmod下载安装。不过这样的方法有两个问题：一是志愿者们打包新包总是需要一些时间，会有一些延迟；二是如果新内核是用户自定义的而非官方源提供的，就没有相应的kmod了。 解决这些问题的银弹就是akmods系统，通过上文所述的方法来实现自动安装，可以做到自动、及时为所有新内核装上模块。akmods系统从Fedora 9之后开始使用，akmod替代kmod是大势所趋，所以我们在安装私有驱动的时候其实只需要装上相应的akmod包即可了，而不再需要kmod。 参考资料： http://fedorasolved.org/Members/zcat/akmods http://forums.fedoraforum.org/showthread.php?t=193301]]></description>
			<content:encoded><![CDATA[<p>Linux Kernel有一大特性就是模块化，通过kernel module（内核模块，Fedora中缩写作kmod）来扩展内核功能（cf. <a href="http://tldp.org/LDP/lkmpg/2.6/html/x40.html">what is a kernel module?</a>）。最常见的一类内核模块就是驱动程序（driver）。由于许可证或使用规模等原因，一些硬件的驱动无法进入kernel，只能通过内核模块的形式来加载使用。在Fedora中如果你启用了rpmfusion-nonfree源，你会看到大量kmod-打头的软件包，大多都是rpmfusion帮我们编译、打包好的各类私有驱动（比如nvidia、ati的显卡驱动，broadcom的网卡驱动等等）。但是，你也许会注意到，几乎每一个kmod-*软件包都有一个对应的akmod-*软件包，而很多“私有驱动安装教程”都是直接让你把两个都装上。那么，这两个到底有什么区别呢？<br />
<span id="more-210"></span><br />
让我们以(a)kmod-wl（broadcom无线网卡驱动）为例，看看两个包的summary：</p>
<blockquote><p>
kmod-wl: Metapackage which tracks in wl kernel module for newest kernel<br />
akmod-wl: Akmod package for wl kernel module(s)</p></blockquote>
<p>再看一下子包，akmod-wl没有子包，而kmod-wl则有大量的子包，和不同版本的内核一一对应（e.g. kmod-wl-2.6.38.7-30.fc15.i686.PAE.i686）。另外，akmod-*依赖akmods软件包，而这个软件包的用途则是：“Automatic kmods build and install tool”。</p>
<p>这下明白了吧？akmod是能够自动编译、安装的kmod。事实上，akmod-foo的rpm包中只包含了一个src包和一个平台spec文件，并没有任何编译好的二进制文件。akmod-foo通过内核安装后脚本（postinst），在每次安装了新内核后检查新内核是否有foo模块，如果没有则调用akmods从src里编译并安装foo模块，以此来及时为新内核提供相应的模块。这和debian系的dkms是一样的（Ubuntu下的私有驱动都是通过dkms来安装的）。</p>
<p>由于内核模块是安装在某个特定的内核上的，当更新内核后必须重新给新内核安装内核模块，因而如何实现自动化的模块安装、管理一直是一个令人头痛的问题。老方法是通过kmod-*这样的metapack来解决，每当出现新内核后，志愿者们为其编译、打包新的kmod，并把这个新的kmod作为kmod-* metapack的子包添加到源中，利用yum update的过程自动将新的kmod下载安装。不过这样的方法有两个问题：一是志愿者们打包新包总是需要一些时间，会有一些延迟；二是如果新内核是用户自定义的而非官方源提供的，就没有相应的kmod了。</p>
<p>解决这些问题的银弹就是akmods系统，通过上文所述的方法来实现自动安装，可以做到自动、及时为所有新内核装上模块。akmods系统从Fedora 9之后开始使用，akmod替代kmod是大势所趋，所以我们在安装私有驱动的时候其实只需要装上相应的akmod包即可了，而不再需要kmod。</p>
<p>参考资料：<br />
<a href="http://fedorasolved.org/Members/zcat/akmods">http://fedorasolved.org/Members/zcat/akmods</a><br />
<a href="http://forums.fedoraforum.org/showthread.php?t=193301">http://forums.fedoraforum.org/showthread.php?t=193301</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/fedora-kmod-and-akmod/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Fedora 15下Adobe Air无法安装程序</title>
		<link>http://blog.robotshell.org/2011/adobeair-broken-under-fedora15/</link>
		<comments>http://blog.robotshell.org/2011/adobeair-broken-under-fedora15/#comments</comments>
		<pubDate>Tue, 07 Jun 2011 15:57:14 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Adobe AIR]]></category>
		<category><![CDATA[Fedora]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=207</guid>
		<description><![CDATA[UPDATE: ADOBE已经正式宣布停止更新AIR FOR LINUX（难怪之前对BUG汇报视而不见），看来之后LINUX用户就要和AIR说再见了，什么用AIR实现跨平台最终还是成为了一场梦，还是拥抱WEB吧。 上周冲着GNOME3装了Fedora 15 Lovelock，放弃了从接触LINUX以来就一直在使用的Ubuntu（准确的说，是删掉了Ubuntu 11.04，实在受不了Unity了）。从安装到后来的配置确实都让我不大不小地折腾了一番，这些等到以后有空的时候再细细说吧。今天我就想说说发现的一个BUG——Adobe Air在Fedora 15下无法使用，准确说是无法安装Air程序包。 系统配置得差不多后，我想稍微娱乐一下，装个AIR三国杀来玩玩（当然，之前已经从ADOBE的官方源里装了adobeair了，那个源里还有flash-plugin），可是安装过程中却弹出错误提示：“无法安装应用程序，因为安装程序已损坏。请尝试从应用程序作者处获取新的安装程序文件。” 重新下载尝试以后仍旧不行，上网搜索多半是说彻底删除干净重新安装就可以了，尝试后依旧不行。为了排除是三国杀的问题，我又下载了其他几个AIR程序，安装过程中均遇到了相同的提示，于是我把问题锁定在了AIR本身。 根据ADOBE官网的文档，我找到了AIR的LOG：~/.appdata/Adobe/AIR/Logs/Install.log（果然是私有软件，这大小写风格令我蛋疼）。打开一看LOG格式惨不忍睹，诶，只能将就一下了。找到了这样几句： 123Native installation package creation failed: Error creating the package /opt/Adobe AIR/Versions/1.0/Resources/rpmbuilder error : Could not load the library: librpmbuild.so symbol not found: parseSpec, /usr/lib/librpmbuild.so.2: undefined symbol: parseSpec librpmbuild.so在系统里是存在的，但是载入的时候发生了错误（找不到parseSpec这个符号资源）。根据新的线索更仔细地搜索了一下，终于找到了问题的原因： Adobe Air在LINUX上安装AIR程序时会自动生成相应的软件包（rpm、deb）然后用系统自带的包管理器来安装。但是对于构建rpm它使用了不推荐的方法，直接调用librpmbuild中的函数而非使用rpmbuild命令。更可怕的是，它使用了版本相关的特性（比如这里的parseSpec）而又没有正确指定库的版本。结果由于Fedora 15使用了最新版的rpm 4.9.x，不再提供这个函数，于是便发生了错误。 参考信息：Adobe Forum相关帖子、Red Hat Bugzilla。 从Adobe Forum可知，Adobe工程师们已经获悉了这一BUG，但却似乎没有什么进一步的动作。而Red Hat更是直指这是Adobe等私有软件的问题，将这个报告标记成了NOTABUG。如此一来，对于AIR这样一个私有软件，除了继续低三下四地催促ADOBE快点修复以外，也没有别的解决方案了（当然，downgrade rpm也可以，如果你愿意）。诶，这一点上就能体现出开源软件的优势啊！ 总结一下ADOBE的几个问题： 与开源软件的规范格格不入（小到文件命名方式、LOG格式，大到调用库的方式） [...]]]></description>
			<content:encoded><![CDATA[<p><strong>UPDATE: ADOBE已经正式宣布<a href="http://linuxtoy.org/archives/adobe-stops-releasing-air-for-desktop-linux.html">停止更新AIR FOR LINUX</a>（难怪之前对BUG汇报视而不见），看来之后LINUX用户就要和AIR说再见了，什么用AIR实现跨平台最终还是成为了一场梦，还是拥抱WEB吧。</strong></p>
<p>上周冲着GNOME3装了Fedora 15 Lovelock，放弃了从接触LINUX以来就一直在使用的Ubuntu（准确的说，是删掉了Ubuntu 11.04，实在受不了Unity了）。从安装到后来的配置确实都让我不大不小地折腾了一番，这些等到以后有空的时候再细细说吧。今天我就想说说发现的一个BUG——Adobe Air在Fedora 15下无法使用，准确说是无法安装Air程序包。<br />
<span id="more-207"></span><br />
系统配置得差不多后，我想稍微娱乐一下，装个AIR三国杀来玩玩（当然，之前已经从ADOBE的官方源里装了adobeair了，那个源里还有flash-plugin），可是安装过程中却弹出错误提示：<strong>“无法安装应用程序，因为安装程序已损坏。请尝试从应用程序作者处获取新的安装程序文件。”</strong></p>
<p>重新下载尝试以后仍旧不行，上网搜索多半是说彻底删除干净重新安装就可以了，尝试后依旧不行。为了排除是三国杀的问题，我又下载了其他几个AIR程序，安装过程中均遇到了相同的提示，于是我把问题锁定在了AIR本身。</p>
<p>根据ADOBE官网的文档，我找到了AIR的LOG：<code class="codecolorer text geshi"><span class="text">~/.appdata/Adobe/AIR/Logs/Install.log</span></code>（果然是私有软件，这大小写风格令我蛋疼）。打开一看LOG格式惨不忍睹，诶，只能将就一下了。找到了这样几句：</p>
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">Native installation package creation failed:<br />
Error creating the package /opt/Adobe AIR/Versions/1.0/Resources/rpmbuilder error : Could not load the library: librpmbuild.so<br />
symbol not found: parseSpec, /usr/lib/librpmbuild.so.2: undefined symbol: parseSpec</div></td></tr></tbody></table></div>
<p>librpmbuild.so在系统里是存在的，但是载入的时候发生了错误（找不到parseSpec这个符号资源）。根据新的线索更仔细地搜索了一下，终于找到了问题的原因：</p>
<p>Adobe Air在LINUX上安装AIR程序时会自动生成相应的软件包（rpm、deb）然后用系统自带的包管理器来安装。但是对于构建rpm它使用了不推荐的方法，直接调用librpmbuild中的函数而非使用rpmbuild命令。更可怕的是，它使用了版本相关的特性（比如这里的parseSpec）而又没有正确指定库的版本。结果由于Fedora 15使用了最新版的rpm 4.9.x，不再提供这个函数，于是便发生了错误。</p>
<p>参考信息：<a href="http://forums.adobe.com/thread/831831">Adobe Forum相关帖子</a>、<a href="https://bugzilla.redhat.com/show_bug.cgi?id=692381">Red Hat Bugzilla</a>。</p>
<p>从Adobe Forum可知，Adobe工程师们已经获悉了这一BUG，但却似乎没有什么进一步的动作。而Red Hat更是直指这是Adobe等私有软件的问题，将这个报告标记成了NOTABUG。如此一来，对于AIR这样一个私有软件，除了继续低三下四地催促ADOBE快点修复以外，也没有别的解决方案了（当然，downgrade rpm也可以，如果你愿意）。诶，这一点上就能体现出开源软件的优势啊！</p>
<p>总结一下ADOBE的几个问题：</p>
<ol>
<li>与开源软件的规范格格不入（小到文件命名方式、LOG格式，大到调用库的方式）</li>
<li>对于BUG报告响应缓慢。</li>
<li>对于放入官方源的软件居然没有经过最起码的测试。</li>
</ol>
<p>总之，一派私有软件的一贯作风。最后，我没有卸载adobeair，等着看什么时候会有update，解决这个问题，到时候我也会及时更新的。在此之前，如果不是闲得蛋疼的话还是不要在Fedora 15下折腾AIR了。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/adobeair-broken-under-fedora15/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>在博客里启用社会化分享按钮</title>
		<link>http://blog.robotshell.org/2011/social-share-button/</link>
		<comments>http://blog.robotshell.org/2011/social-share-button/#comments</comments>
		<pubDate>Mon, 02 May 2011 05:06:30 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[Log]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[SNS]]></category>
		<category><![CDATA[WordPress]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=201</guid>
		<description><![CDATA[最近突然想起来，我的博客居然一直都没有放置社会化分享按钮，很不合社交网络化和网络社交化的潮流。于是决定在博客文章下方放置分享链接。本以为是个容易的事儿，去各个社交网站找一下分享按钮的代码放上去就是了，就像上次做那个快捷订阅侧边栏一样。可实际做起来才发现不是那么容易——社交网站实在是太多了！一个个手工去找实在麻烦。就想去弄一个插件来解决。 然而去wordpress.org上找了好久，大多数插件都是国外的（比如什么ShareThis、AddToAny），几乎不支持国内的社交网站。唯一比较合适的就是wp-share-list，中国人开发的，不过jQuery动画效果有些花哨，而支持的网站也太少（虽然可以自定义，不过这又违背了我偷懒的初衷~），不怎么实用。 最后只得用下下策——国内的分享服务提供商。比较有名的有jiathis、bshare、passit（按照Alexa排名和使用量排序）。前两个使用人数比较多，但是点击分享后都要通过它们的网站来中转，让我很不爽（尤其是bshare，甚至还隐藏分享的真实网址！不过bshare的统计功能因此也比较强大就是了）。passit非常快捷、朴素，几乎没有什么多余的功能，支持的网站也很广泛，于是我就自定义了一个分享栏，正式放到了博客上。大家可以看看下方的效果~]]></description>
			<content:encoded><![CDATA[<p>最近突然想起来，我的博客居然一直都没有放置社会化分享按钮，很不合社交网络化和网络社交化的潮流。于是决定在博客文章下方放置分享链接。本以为是个容易的事儿，去各个社交网站找一下分享按钮的代码放上去就是了，就像上次做那个<a href="http://blog.robotshell.org/2010/add-some-subscribe-links/">快捷订阅侧边栏</a>一样。可实际做起来才发现不是那么容易——社交网站实在是太多了！一个个手工去找实在麻烦。就想去弄一个插件来解决。</p>
<p><span id="more-201"></span></p>
<p>然而去<a href="http://wordpress.org">wordpress.org</a>上找了好久，大多数插件都是国外的（比如什么ShareThis、AddToAny），几乎不支持国内的社交网站。唯一比较合适的就是<a href="http://wordpress.org/extend/plugins/wp-share-list/">wp-share-list</a>，中国人开发的，不过jQuery动画效果有些花哨，而支持的网站也太少（虽然可以自定义，不过这又违背了我偷懒的初衷~），不怎么实用。</p>
<p>最后只得用下下策——国内的分享服务提供商。比较有名的有<a href="http://www.jiathis.com/">jiathis</a>、<a href="http://www.bshare.cn/">bshare</a>、<a href="http://www.passit.cn/">passit</a>（按照Alexa排名和使用量排序）。前两个使用人数比较多，但是点击分享后都要通过它们的网站来中转，让我很不爽（尤其是bshare，甚至还隐藏分享的真实网址！不过bshare的统计功能因此也比较强大就是了）。passit非常快捷、朴素，几乎没有什么多余的功能，支持的网站也很广泛，于是我就自定义了一个分享栏，正式放到了博客上。大家可以看看下方的效果~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/social-share-button/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>小修博客主题 &#8211; 以及暂别</title>
		<link>http://blog.robotshell.org/2011/modify-blog-theme/</link>
		<comments>http://blog.robotshell.org/2011/modify-blog-theme/#comments</comments>
		<pubDate>Mon, 07 Feb 2011 09:46:23 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[Log]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=178</guid>
		<description><![CDATA[唔，其实本来是想换个主题的，但是最后懒得折腾，就作罢了。翻出在用的notepad主题的设计说明，看了一会以后决定弄一下header，加一个banner上去。 Windows已经被干掉了，自然也就没有了Photoshop。这次完全是用Gimp做出来的。图片素材来自很早以前蛋疼做的宣传画（摊手~鄙人设计水平也就这样了……）。 顺便也改了主题的CSS，一些小地方，大家应该注意不到……T.T只是为了看着更顺眼而已~ 算上前两天整理的侧边栏，这次博客主题应该差不多折腾好了，会固定一阵子。 最后，明天就要去参加省选冬令营了，然后是省队选拔赛——决定我日后走向的比赛。因此这段时间肯定不会再更新博客了。至于比赛以后，如果成绩好就要更加努力准备二试，成绩不好估计就要和信息组say goodbye了——总之闲工夫是越来越少了。各位，后会有期吧！ P.S.其实这段时间挺颓废的，生病的时候尽在折腾东西了，本来也想写一些来记录的，现在也只好作罢。有机会再说吧~]]></description>
			<content:encoded><![CDATA[<p>唔，其实本来是想换个主题的，但是最后懒得折腾，就作罢了。翻出在用的notepad主题的设计说明，看了一会以后决定弄一下header，加一个banner上去。</p>
<p>Windows已经被干掉了，自然也就没有了Photoshop。这次完全是用Gimp做出来的。图片素材来自很早以前蛋疼做的<a href="http://blog.robotshell.org/2010/robot-shell-ad/">宣传画</a>（摊手~鄙人设计水平也就这样了……）。</p>
<p>顺便也改了主题的CSS，一些小地方，大家应该注意不到……T.T只是为了看着更顺眼而已~</p>
<p>算上前两天整理的侧边栏，这次博客主题应该差不多折腾好了，会固定一阵子。</p>
<p>最后，明天就要去参加省选冬令营了，然后是省队选拔赛——决定我日后走向的比赛。因此这段时间肯定不会再更新博客了。至于比赛以后，如果成绩好就要更加努力准备二试，成绩不好估计就要和信息组say goodbye了——总之闲工夫是越来越少了。各位，后会有期吧！</p>
<p>P.S.其实这段时间挺颓废的，生病的时候尽在折腾东西了，本来也想写一些来记录的，现在也只好作罢。有机会再说吧~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/modify-blog-theme/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>在博客上放置饭否状态模块</title>
		<link>http://blog.robotshell.org/2011/fanfou-widget-on-wordpress/</link>
		<comments>http://blog.robotshell.org/2011/fanfou-widget-on-wordpress/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 13:36:17 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[Log]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[WordPress]]></category>
		<category><![CDATA[饭否]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=176</guid>
		<description><![CDATA[最近饭否用的越来越频繁，逐渐融入到饭否圈子里了。相比Twitter、人人，饭否成为我真正意义上的“微博”。于是就打算着把饭否放到我的博客上。首先想到的自然是和Twitter类似，找一个plugin装上就是了。可是去搜了一下发现只有一款很久未更新的fanfou-tools（上次更新是在饭否宕掉前，现在API都变了），只好作罢。 后来又想直接在首页上放一个RSS模块，订阅我的饭否timeline的RSS。这确实可行，而且也在我的博客上呆了10分钟。可是我突然想到——这RSS模块输出的是HTML代码，而我的饭否timeline更新极频繁，这样在我博客的缓存机制下，首页的RSS信息就严重滞后了…… 这时在饭否首页右下角瞟到了 » 试试饭否插件 这个东西，果断点进去，（BSP页面随便选一个，比如blogger），发现了一段JS代码……这下解决了，直接贴进WP的文本widget里了事~ P.S. 代码里有一个count是定义显示数量的，可以自行修改。]]></description>
			<content:encoded><![CDATA[<p>最近饭否用的越来越频繁，逐渐融入到饭否圈子里了。相比Twitter、人人，饭否成为我真正意义上的“微博”。于是就打算着把饭否放到我的博客上。首先想到的自然是和Twitter类似，找一个plugin装上就是了。可是去搜了一下发现只有一款很久未更新的fanfou-tools（上次更新是在饭否宕掉前，现在API都变了），只好作罢。</p>
<p>后来又想直接在首页上放一个RSS模块，订阅我的饭否timeline的RSS。这确实可行，而且也在我的博客上呆了10分钟。可是我突然想到——这RSS模块输出的是HTML代码，而我的饭否timeline更新极频繁，这样在我博客的缓存机制下，首页的RSS信息就严重滞后了……</p>
<p>这时在饭否首页右下角瞟到了 <a href="http://fanfou.com/badge">» 试试饭否插件</a> 这个东西，果断点进去，（BSP页面随便选一个，比如blogger），发现了一段JS代码……这下解决了，直接贴进WP的文本widget里了事~</p>
<p>P.S. 代码里有一个count是定义显示数量的，可以自行修改。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/fanfou-widget-on-wordpress/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>纠结的Go Daddy域名续费过程</title>
		<link>http://blog.robotshell.org/2011/godaddy-domain-renewal/</link>
		<comments>http://blog.robotshell.org/2011/godaddy-domain-renewal/#comments</comments>
		<pubDate>Mon, 31 Jan 2011 05:43:48 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[Log]]></category>
		<category><![CDATA[GoDaddy]]></category>
		<category><![CDATA[支付宝]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=173</guid>
		<description><![CDATA[去年三月份，我买下了这个域名，正式开始使用独立博客。当时是在Go Daddy上用新用户优惠购买了这个.org域名一年。现在时间快到了，我就去续费（renew）了一下。不过这个续费过程可真是一波三折…… 我打算续费三年，总共45刀，又去网络上搜罗了好久的promo code，最后找到一个任意订单满40刀减10刀的（算是很不错的优惠了）。35刀三年.org，比大部分域名商要便宜了（不过其实我也没多少选择余地，转换域名商挺麻烦的，要不就要另外交transfer fee，要不就是等到域名过期重新注册）。 Go Daddy支持支付宝支付，并且可以自动兑换外币（这也是我最初选择它的重要原因）。在一堆复杂的跳转之后，来到了支付宝页面，可这时我发现余额不足，只好用招行网银支付，然而我的招行卡还没有开启手机支付功能，只能使用悲剧的“卡号密码支付”，是IE ONLY的……开启virtualbox里的XP，用那个“可爱”的IE6（= =）来到了招行网银页面。点下确定后又有意外发生——要求手机身份验证（貌似是最近才开始的新措施）……而我的卡没有绑定验证手机，只好用电话银行设置一下……好不容易完成后，又是一堆复杂的jump back，迎接我的是——Invalid Session……其实我早该想到的，因为我的支付过程一半在Ubuntu实体机的Firefox上，另一半在XP虚拟机的IE上……重新登陆Go Daddy，我震惊地发现那个订单还躺在购物车里，我的35刀似乎就这样不翼而飞了…… 心急如焚的我开始寻求support，找了半天没看到在线客户帮助（倒是有在线导购……T.T），只好交ticket上去，7小时答复。不过就在我交了ticket两小时后，我收到Go Daddy的邮件“Your order has been processed”，长舒了一口气。后来又收到ticket答复，说这是正常情况，支付宝最多可能延迟24小时…… ===============我是分割线=============== 给大家一些进行这样复杂支付的忠告（毕竟那样的情景还是挺惊险的）： 最好提前确保资金充足，确保网银可用（申请了必要的验证，安装了必要的插件），避免意外发生； 保证网络顺畅，尽快完成支付，避免session过期； 如果发觉支付过程可能有问题，最好撤销订单重新支付； 如果支付后出现意外，不要慌张，及时联系客服，不要重新下单、支付； 目前比如Go Daddy、支付宝、网银等对IE的支持还是更好的，如果可以，尽量用IE吧…… 最后给大家几个本文撰写时可用的Go Daddy优惠码： SCENE40   订单满$40减$10 gdbb687   订单满$65减20%]]></description>
			<content:encoded><![CDATA[<p>去年三月份，我买下了这个域名，正式开始使用独立博客。当时是在Go Daddy上用新用户优惠购买了这个.org域名一年。现在时间快到了，我就去续费（renew）了一下。不过这个续费过程可真是一波三折……</p>
<p>我打算续费三年，总共45刀，又去网络上搜罗了好久的promo code，最后找到一个任意订单满40刀减10刀的（算是很不错的优惠了）。35刀三年.org，比大部分域名商要便宜了（不过其实我也没多少选择余地，转换域名商挺麻烦的，要不就要另外交transfer fee，要不就是等到域名过期重新注册）。</p>
<p><span id="more-173"></span></p>
<p>Go Daddy支持支付宝支付，并且可以自动兑换外币（这也是我最初选择它的重要原因）。在一堆复杂的跳转之后，来到了支付宝页面，可这时我发现余额不足，只好用招行网银支付，然而我的招行卡还没有开启手机支付功能，只能使用悲剧的“卡号密码支付”，是IE ONLY的……开启virtualbox里的XP，用那个“可爱”的IE6（= =）来到了招行网银页面。点下确定后又有意外发生——要求手机身份验证（貌似是最近才开始的新措施）……而我的卡没有绑定验证手机，只好用电话银行设置一下……好不容易完成后，又是一堆复杂的jump back，迎接我的是——Invalid Session……其实我早该想到的，因为我的支付过程一半在Ubuntu实体机的Firefox上，另一半在XP虚拟机的IE上……重新登陆Go Daddy，我震惊地发现那个订单还躺在购物车里，我的35刀似乎就这样不翼而飞了……</p>
<p>心急如焚的我开始寻求support，找了半天没看到在线客户帮助（倒是有在线导购……T.T），只好交ticket上去，7小时答复。不过就在我交了ticket两小时后，我收到Go Daddy的邮件“Your order has been processed”，长舒了一口气。后来又收到ticket答复，说这是正常情况，支付宝最多可能延迟24小时……</p>
<p>===============我是分割线===============</p>
<p>给大家一些进行这样复杂支付的忠告（毕竟那样的情景还是挺惊险的）：</p>
<ol>
<li>最好提前确保资金充足，确保网银可用（申请了必要的验证，安装了必要的插件），避免意外发生；</li>
<li>保证网络顺畅，尽快完成支付，避免session过期；</li>
<li>如果发觉支付过程可能有问题，最好撤销订单重新支付；</li>
<li>如果支付后出现意外，不要慌张，及时联系客服，不要重新下单、支付；</li>
<li>目前比如Go Daddy、支付宝、网银等对IE的支持还是更好的，如果可以，尽量用IE吧……</li>
</ol>
<p>最后给大家几个本文撰写时可用的Go Daddy优惠码：</p>
<p>SCENE40   订单满$40减$10<br />
gdbb687   订单满$65减20%</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/godaddy-domain-renewal/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Sunpinyin加速脚本 &#8211; 内存缓存词库</title>
		<link>http://blog.robotshell.org/2011/sunpinyin-speed-up-memcache/</link>
		<comments>http://blog.robotshell.org/2011/sunpinyin-speed-up-memcache/#comments</comments>
		<pubDate>Tue, 11 Jan 2011 03:56:17 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Fcitx]]></category>
		<category><![CDATA[sunpinyin]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=168</guid>
		<description><![CDATA[UPDATE2：感谢“据说要有”的建议，已修改脚本。 UPDATE1：脚本在异常退出（比如收到KILL信号，系统断电等）后再次运行时会有严重的BUG，导致用户词库丢失。现已修正，强烈推荐各位使用者更新。如果已经有过异常退出的用户，请退出脚本后至~/.sunpinyin/目录下检查（ls -l），若userdict为符号链接，请删除之，sunpinyin将重建新的用户词库。对因此造成的数据损失表示抱歉。 之前在一篇文章里，我提到了在Ubuntu下使用fcitx + sunpinyin配合hubertstar的大词库实现媲美搜狗的流畅输入，但是仍然有一个大问题——当词库过大的时候输入中会出现停顿现象，严重影响用户体验（因此我当时也只推荐使用small版词库）。 这是因为fcitx和sunpinyin的词库都是使用SQLITE，在输入时需要反复查询，由于词库的特殊性（前后两个查询的词经常离得很远），SQLITE的缓存机制很难起效，因而只能反复读硬盘，导致速度很慢。 不过，在大宝的启发下，我参考了Ubuntu中文论坛里hubertstar的帖子，以及大宝的博客，我写了一个供Ubuntu使用的sunpinyin加速脚本，效果非常不错，拿上来和大家分享。 原理非常暴力——直接将整个sunpinyin的userdict放入/dev/shm（即存在于内存中的tmpfs），然后符号链接回来，相当于手动暴力cache整个词库，大幅提高了速度。这样做法的缺点就是内存消耗较大——我现在使用的大词库有100+MB，即需要100+MB的内存，不过，当下基本每个人都有2G+的内存，本来也就很难用完，这样正好提高了内存的利用率。 使用方式：将这个脚本放在方便的地方，通过chmod +x赋予可执行权利，在“系统 -&#62; 首选项 -&#62; 启动应用程序”中添加这个脚本。 相比于hubertstar和大宝的脚本，这个脚本有如下优点： 使用方便，只需要在GNOME会话登陆后自动运行即可； 自动将用户词库变更备份回原目录，不会导致自造词丢失； 卸载方便，脚本在退出时（包括关机或登出）会自动恢复用户词库，因而如果没有启动这个脚本也不影响运行sunpinyin； 完全运行在用户空间，不需要使用服务或者cron。 12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849505152535455#!/bin/bash #sunpinyin_speed_up.sh # Sunpinyin Speed Up Script for Ubuntu (by memory caching, and no data loss) # You can run this script in background on GNOME logging in. # Originally written Hubert Star, modified by [...]]]></description>
			<content:encoded><![CDATA[<p>UPDATE2：感谢“据说要有”的建议，已修改脚本。</p>
<p>UPDATE1：脚本在异常退出（比如收到KILL信号，系统断电等）后再次运行时会有严重的BUG，导致用户词库丢失。现已修正，强烈推荐各位使用者更新。如果已经有过异常退出的用户，请<em>退出脚本后</em>至~/.sunpinyin/目录下检查（<code class="codecolorer bash geshi"><span class="bash"><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span></span></code>），若userdict为符号链接，请删除之，sunpinyin将重建新的用户词库。对因此造成的数据损失表示抱歉。</p>
<p>之前在<a href="http://blog.robotshell.org/2010/fcitx-sunpinyin-fluent-input/" target="_blank">一篇文章</a>里，我提到了在Ubuntu下使用fcitx + sunpinyin配合hubertstar的大词库实现媲美搜狗的流畅输入，但是仍然有一个大问题——当词库过大的时候输入中会出现停顿现象，严重影响用户体验（因此我当时也只推荐使用small版词库）。</p>
<p>这是因为fcitx和sunpinyin的词库都是使用SQLITE，在输入时需要反复查询，由于词库的特殊性（前后两个查询的词经常离得很远），SQLITE的缓存机制很难起效，因而只能反复读硬盘，导致速度很慢。</p>
<p>不过，在大宝的启发下，我参考了Ubuntu中文论坛里<a href="http://forum.ubuntu.org.cn/viewtopic.php?t=305026" target="_blank">hubertstar的帖子</a>，以及<a href="http://michelbond.blog.hexun.com/60476251_d.html" target="_blank">大宝的博客</a>，我写了一个供Ubuntu使用的sunpinyin加速脚本，效果非常不错，拿上来和大家分享。</p>
<p><span id="more-168"></span></p>
<p>原理非常暴力——直接将整个sunpinyin的userdict放入/dev/shm（即存在于内存中的tmpfs），然后符号链接回来，相当于手动暴力cache整个词库，大幅提高了速度。这样做法的缺点就是内存消耗较大——我现在使用的大词库有100+MB，即需要100+MB的内存，不过，当下基本每个人都有2G+的内存，本来也就很难用完，这样正好提高了内存的利用率。</p>
<p>使用方式：将这个脚本放在方便的地方，通过chmod +x赋予可执行权利，在“系统 -&gt; 首选项 -&gt; 启动应用程序”中添加这个脚本。</p>
<p>相比于hubertstar和大宝的脚本，这个脚本有如下优点：</p>
<ol>
<li>使用方便，只需要在GNOME会话登陆后自动运行即可；</li>
<li>自动将用户词库变更备份回原目录，不会导致自造词丢失；</li>
<li>卸载方便，脚本在退出时（包括关机或登出）会自动恢复用户词库，因而如果没有启动这个脚本也不影响运行sunpinyin；</li>
<li>完全运行在用户空间，不需要使用服务或者cron。</li>
</ol>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;height:400px;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br />12<br />13<br />14<br />15<br />16<br />17<br />18<br />19<br />20<br />21<br />22<br />23<br />24<br />25<br />26<br />27<br />28<br />29<br />30<br />31<br />32<br />33<br />34<br />35<br />36<br />37<br />38<br />39<br />40<br />41<br />42<br />43<br />44<br />45<br />46<br />47<br />48<br />49<br />50<br />51<br />52<br />53<br />54<br />55<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #666666; font-style: italic;">#!/bin/bash</span><br />
<span style="color: #666666; font-style: italic;">#sunpinyin_speed_up.sh</span><br />
<span style="color: #666666; font-style: italic;"># Sunpinyin Speed Up Script for Ubuntu (by memory caching, and no data loss)</span><br />
<span style="color: #666666; font-style: italic;"># You can run this script in background on GNOME logging in.</span><br />
<span style="color: #666666; font-style: italic;"># Originally written Hubert Star, modified by Bob Robot (http://robotshell.org/).</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Capture the exit signal, make sure it is the FIRST uncommented line.</span><br />
<span style="color: #7a0874; font-weight: bold;">trap</span> <span style="color: #ff0000;">&quot;do_exit&quot;</span> SIGHUP SIGINT SIGQUIT SIGTERM<br />
<br />
<span style="color: #007800;">SUN_DIR</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">${HOME}</span>/.sunpinyin&quot;</span><br />
<span style="color: #007800;">SHM_USERDICT</span>=<span style="color: #ff0000;">&quot;/dev/shm/sunpinyin_userdict.sh0&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Backup the userdict and restore all changes made by this script on exit.</span><br />
do_exit<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict&quot;</span><br />
&nbsp; <span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span><br />
<span style="color: #7a0874; font-weight: bold;">&#125;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Work around for abnormal quit.</span><br />
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict&quot;</span><br />
<span style="color: #000000; font-weight: bold;">fi</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Rename the real userdict, copy it to RAM and make a symblic link back.</span><br />
<span style="color: #666666; font-style: italic;"># From now on the modification and query on userdict takes place in RAM.</span><br />
<span style="color: #c20cb9; font-weight: bold;">mv</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span><br />
<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span><br />
<span style="color: #c20cb9; font-weight: bold;">ln</span> <span style="color: #660033;">-sf</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict&quot;</span><br />
<br />
<span style="color: #666666; font-style: italic;"># Automatically backup the userdict, make sure not losing the modification.</span><br />
<span style="color: #007800;">p_count</span>=<span style="color: #000000;">0</span><br />
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #c20cb9; font-weight: bold;">true</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
<span style="color: #000000; font-weight: bold;">do</span><br />
&nbsp; <span style="color: #007800;">p_count</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$p_count</span>+<span style="color: #000000;">1</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">1800</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$p_count</span> == <span style="color: #000000;">4</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #007800;">p_count</span>=<span style="color: #000000;">0</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
&nbsp; <br />
&nbsp; <span style="color: #007800;">p_size_shm</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $5}'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #007800;">p_size_real_t</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ls</span> <span style="color: #660033;">-l</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $5}'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <span style="color: #007800;">p_size_real</span>=$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #007800;">$p_size_real_t</span>+<span style="color: #000000;">512</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><br />
&nbsp; <br />
&nbsp; <span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$p_size_shm</span> <span style="color: #660033;">-ge</span> <span style="color: #007800;">$p_size_real</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">then</span><br />
&nbsp; &nbsp; &nbsp;<span style="color: #c20cb9; font-weight: bold;">cp</span> <span style="color: #660033;">-f</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SHM_USERDICT}</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${SUN_DIR}</span>/userdict.real&quot;</span><br />
&nbsp; <span style="color: #000000; font-weight: bold;">fi</span><br />
<span style="color: #000000; font-weight: bold;">done</span></div></td></tr></tbody></table></div>
<p>经测试，不论多大的词库（只要你内存无压力）都可以顺畅输入。赶紧把你的sunpinyin词库换成<a href="http://code.google.com/p/hslinuxextra/downloads/detail?name=sunpinyin-userdict.7z&amp;can=2&amp;q=" target="_blank">超大词库</a>，来体验更流畅的Ubuntu拼音输入吧~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/sunpinyin-speed-up-memcache/feed/</wfw:commentRss>
		<slash:comments>24</slash:comments>
		</item>
		<item>
		<title>解决PulseAudio的爆音问题 &#8211; 大幅提高Ubuntu音质</title>
		<link>http://blog.robotshell.org/2011/improve-ubuntu-acoustic-quality/</link>
		<comments>http://blog.robotshell.org/2011/improve-ubuntu-acoustic-quality/#comments</comments>
		<pubDate>Sun, 09 Jan 2011 13:43:16 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[alsa]]></category>
		<category><![CDATA[pulseaudio]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=165</guid>
		<description><![CDATA[很早就发现Ubuntu下的音量调节范围比Windows要大得多，刚开始还以为是Linux的音频驱动更NB而窃喜，然而后来发现这并非是什么好事——音量条左端10%和右端20%几乎是废的，前者声音小得根本听不见，而后者则大得出现了爆音。有意义的音量条长度变短直接导致了音量调节非常困难，而且，就算是中间音量也经常出现爆音。 作为一个GEEK，遇到问题怎么能这样被难倒？必须得认真研究解决之！ 本文中提到的Ubuntu均指10.04及以后版本。 0.预备知识 在使用LINUX下各种音视频播放软件时，常常可以看到audio/video output device（音频/视频输出设备）选项，我们今天就先来看看音频输出——常见的有alsa、esd、oss、pulseaudio等等，让人眼花缭乱。他们之间到底有什么关系呢？Ubuntu中文论坛上的这篇教学贴很好地解答了这个问题。简而言之，alsa和oss都是类似“音频驱动”的底层内核模块，负责最终控制硬件发出声音；而pulseaudio和esd则是类似“图形服务器”X11一样的“声音服务器”，负责将软件发送的指令经过处理（主要是混音）后发送给驱动。完整的LINUX音频架构应该由两者共同组成。另外，alsa和pulseaudio分别都比oss和esd先进，正在逐渐取代后两者，目前Ubuntu等流行发行版下采用的默认组合就是alsa + pulseaudio（不过，他们四者还是可以共存的）。 前面提到了“混音”，那么，什么是混音呢？简单来说，我们经常能听到多个软件同时发出声音，而发给声卡的音频流只能有一个，解决方法就是将所有声音“混合”起来。如果没有混音器（mixer），那么就会出现“声卡独占”的情况，这在早年的LINUX下经常见到。这也就是pulseaudio这些声音服务器存在的目的了。同时，有了声音服务器的存在，你可以分别控制各个软件的音量（并非指在软件内部调节音量，试试看在Ubuntu中打开“声音首选项”的“应用程序”选项卡就知道了）。 那么，为什么播放器能直接输出给alsa呢？这是因为早年没有比较好的声音服务器，所以alsa自己也实现了一个很简陋的混音器（dmix）。 1.问题的出现 那么，爆音是怎么出现的呢？最常见的原因就是——增益过大，即“音量”放大太大，让声音失真。 那么，就打开Ubuntu的“声音首选项”，看看音量调节，回忆一下与Windows下的有何不同。对，只有一个音量条！正常情况下，应该能够分别调节主音量、扬声器、耳机、波形等等的音量，而Ubuntu下只看到了一个调节条，即“主音量”。因为此处是通过pulseaudio来调节音量，而pulseaudio貌似只提供给用户调节主音量的接口，至于具体怎么处理分配、调节其他音量，是由pulseaudio内部来处理的。 如何才能调节其他音量呢？对了，直接操作底层的alsa。在控制台打开alsamixer（注意，这不是上文提到的混音器，而是音量调节器），你就会看到熟悉的Windows音量调节的LINUX控制台版。让我们试试看把波形（即PCM）调小一些（调至红色区以下，比如75左右）。再听听看，是不是爆音消失了呢？其实，在Windows下，“波形”的最高音量其实只是81，Windows已经考虑到防止爆音这一点了，因而调节范围也比LINUX下小。 大功告成了？且慢，让我们用Ubuntu的音量调节器来调整一下音量，再进入alsamixer看一看——PCM又被调到了最高！pulseaudio在调节音量时蛮横地仅调节主音量，而直接将其他都调到了最高。怎么办？难道我们得抛弃方便的音量小工具，都靠alsamixer来过活了？ 2.问题的解决 办法自然是有的，既然问题是由于pulseaudio的“暴力蛮横”的，那就让我们来试试看更改pulseaudio设置。 进入/usr/share/pulseaudio/alsa-mixer/paths/，ls一下，你会看到很多配置文件。再看一下“声音首选项”中的“输出”，最下方有一个“连接器”，里面的选项与这些文件十分相似。让我们来看看很多output文件都最终引用的“analog-output.conf.common”文件。在其中看到了PCM，其中有一个volume，默认是merge，根据上面的注释，可以知道这是让pulseaudio“智能”地根据主音量来调整PCM音量。试着将其改成ignore，保存退出，重新载入pulseaudio。试试看现在调节音量还会覆盖PCM音量么？ * SIMPLE HOWTO 快速HOWTO &#8211; 在终端中： 1234567891011sudo gedit /usr/share/pulseaudio/alsa-mixer/paths/analog-output.conf.common #在第98行，即[Element PCM]章节的volume选项，改为 volume = ignore，保存退出 sudo pkill pulseaudio start-pulseaudio-x11 alsamixer #按左右键移动至PCM条，按上下键调节至74，ESC推出]]></description>
			<content:encoded><![CDATA[<p>很早就发现Ubuntu下的音量调节范围比Windows要大得多，刚开始还以为是Linux的音频驱动更NB而窃喜，然而后来发现这并非是什么好事——音量条左端10%和右端20%几乎是废的，前者声音小得根本听不见，而后者则大得出现了爆音。有意义的音量条长度变短直接导致了音量调节非常困难，而且，就算是中间音量也经常出现爆音。</p>
<p>作为一个GEEK，遇到问题怎么能这样被难倒？必须得认真研究解决之！</p>
<blockquote><p>本文中提到的Ubuntu均指10.04及以后版本。</p></blockquote>
<p><span id="more-165"></span></p>
<h2>0.预备知识</h2>
<p>在使用LINUX下各种音视频播放软件时，常常可以看到audio/video output device（音频/视频输出设备）选项，我们今天就先来看看音频输出——常见的有alsa、esd、oss、pulseaudio等等，让人眼花缭乱。他们之间到底有什么关系呢？Ubuntu中文论坛上的这篇<a href="http://forum.ubuntu.org.cn/viewtopic.php?t=163776" target="_blank">教学贴</a>很好地解答了这个问题。简而言之，alsa和oss都是类似“<strong>音频驱动</strong>”的底层内核模块，负责最终控制硬件发出声音；而pulseaudio和esd则是类似“图形服务器”X11一样的“<strong>声音服务器</strong>”，负责将软件发送的指令经过处理（主要是<strong>混音</strong>）后发送给驱动。完整的LINUX音频架构应该由两者共同组成。另外，alsa和pulseaudio分别都比oss和esd先进，正在逐渐取代后两者，目前Ubuntu等流行发行版下采用的默认组合就是alsa + pulseaudio（不过，他们四者还是可以共存的）。</p>
<p>前面提到了“混音”，那么，什么是混音呢？简单来说，我们经常能听到多个软件同时发出声音，而发给声卡的音频流只能有一个，解决方法就是将所有声音“混合”起来。如果没有混音器（mixer），那么就会出现“声卡独占”的情况，这在早年的LINUX下经常见到。这也就是pulseaudio这些声音服务器存在的目的了。同时，有了声音服务器的存在，你可以分别控制各个软件的音量（并非指在软件内部调节音量，试试看在Ubuntu中打开“声音首选项”的“应用程序”选项卡就知道了）。</p>
<p>那么，为什么播放器能直接输出给alsa呢？这是因为早年没有比较好的声音服务器，所以alsa自己也实现了一个很简陋的混音器（dmix）。</p>
<h2>1.问题的出现</h2>
<p>那么，爆音是怎么出现的呢？最常见的原因就是——增益过大，即“音量”放大太大，让声音失真。</p>
<p>那么，就打开Ubuntu的“声音首选项”，看看音量调节，回忆一下与Windows下的有何不同。对，只有一个音量条！正常情况下，应该能够分别调节主音量、扬声器、耳机、波形等等的音量，而Ubuntu下只看到了一个调节条，即“主音量”。因为此处是通过pulseaudio来调节音量，而pulseaudio貌似只提供给用户调节主音量的接口，至于具体怎么处理分配、调节其他音量，是由pulseaudio内部来处理的。</p>
<p>如何才能调节其他音量呢？对了，直接操作底层的alsa。在控制台打开alsamixer（注意，这不是上文提到的混音器，而是音量调节器），你就会看到熟悉的Windows音量调节的LINUX控制台版。让我们试试看把波形（即PCM）调小一些（调至红色区以下，比如75左右）。再听听看，是不是爆音消失了呢？其实，在Windows下，“波形”的最高音量其实只是81，Windows已经考虑到防止爆音这一点了，因而调节范围也比LINUX下小。</p>
<p>大功告成了？且慢，让我们用Ubuntu的音量调节器来调整一下音量，再进入alsamixer看一看——PCM又被调到了最高！pulseaudio在调节音量时蛮横地仅调节主音量，而直接将其他都调到了最高。怎么办？难道我们得抛弃方便的音量小工具，都靠alsamixer来过活了？</p>
<h2>2.问题的解决</h2>
<p>办法自然是有的，既然问题是由于pulseaudio的“暴力蛮横”的，那就让我们来试试看更改pulseaudio设置。</p>
<p>进入<code class="codecolorer text geshi"><span class="text">/usr/share/pulseaudio/alsa-mixer/paths/</span></code>，ls一下，你会看到很多配置文件。再看一下“声音首选项”中的“输出”，最下方有一个“连接器”，里面的选项与这些文件十分相似。让我们来看看很多output文件都最终引用的“analog-output.conf.common”文件。在其中看到了PCM，其中有一个volume，默认是merge，根据上面的注释，可以知道这是让pulseaudio“智能”地根据主音量来调整PCM音量。试着将其改成ignore，保存退出，重新载入pulseaudio。试试看现在调节音量还会覆盖PCM音量么？</p>
<h2>* SIMPLE HOWTO</h2>
<p><em>快速HOWTO &#8211; 在终端中：<br />
</em></p>
<div class="codecolorer-container bash dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br />4<br />5<br />6<br />7<br />8<br />9<br />10<br />11<br /></div></td><td><div class="bash codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap"><span style="color: #c20cb9; font-weight: bold;">sudo</span> gedit <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>pulseaudio<span style="color: #000000; font-weight: bold;">/</span>alsa-mixer<span style="color: #000000; font-weight: bold;">/</span>paths<span style="color: #000000; font-weight: bold;">/</span>analog-output.conf.common<br />
<br />
<span style="color: #666666; font-style: italic;">#在第98行，即[Element PCM]章节的volume选项，改为 volume = ignore，保存退出</span><br />
<br />
<span style="color: #c20cb9; font-weight: bold;">sudo</span> pkill pulseaudio<br />
<br />
start-pulseaudio-x11<br />
<br />
alsamixer<br />
<br />
<span style="color: #666666; font-style: italic;">#按左右键移动至PCM条，按上下键调节至74，ESC推出</span></div></td></tr></tbody></table></div>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2011/improve-ubuntu-acoustic-quality/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fcitx Sunpinyin &#8211; Ubuntu下享受输入的快感</title>
		<link>http://blog.robotshell.org/2010/fcitx-sunpinyin-fluent-input/</link>
		<comments>http://blog.robotshell.org/2010/fcitx-sunpinyin-fluent-input/#comments</comments>
		<pubDate>Sun, 19 Dec 2010 13:45:48 +0000</pubDate>
		<dc:creator>Robot 马</dc:creator>
				<category><![CDATA[PC]]></category>
		<category><![CDATA[Fcitx]]></category>
		<category><![CDATA[sunpinyin]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.robotshell.org/?p=157</guid>
		<description><![CDATA[在Ubuntu下的中文输入一直是一件很蛋疼的事情……原先使用多年的scim输入平台已经腐朽不堪，现在默认的ibus虽然是一个优秀的平台，但是缺乏优秀的输入法——常用的ibus pinyin的算法实在是令人无语，只好通过使用更大的词库（100MB+的搜狗词库）来弥补不足，不过效果也只是一般般，而且由于词库变大了许多，响应速度也变慢了。我后来知道了一个基于统计语言模型的优秀输入法——sunpinyin，于是尝试安装了ibus sunpinyin，果然组句能力非常强大，但词库实在是太小了，弄了一个大词库后发现性能又一次出现了大幅度的下降…… 性能低下的主要原因，是因为他们都是运行于一个“输入平台”ibus之上的——越复杂的系统架构会带来越低下的性能，ibus是一个十分灵活的、能够安装各种语言的输入法的平台，十分臃肿，其性能很难好到哪里去。我们需要的，仅仅只是一个简单的——拼音输入法！其实早就有一般人想要这么干了，于是他们写了一个叫做fcitx的轻巧、纯粹的输入法。 我第一次接触fcitx还是v3时代，最大的感受就是——真的是太轻了，甚至连gtk都不依赖，而且只有一个用GBK编码的中文配置文件（蛋疼）……速度果然很快，算法也还行。不过在我试图导入大词库后，发现了一个致命的问题——fcitx会把整个词库读到内存里……最终，fcitx 3.x难用的配置方式、较差的稳定性、难看的界面以及表现平平的算法令我抛弃了它…… 现在，fcitx 4诞生了！开发者最终妥协依赖了gtk，但因而也带来了极大的功能提升——用cairo渲染的精美皮肤，pango渲染的文字等等；而且现在配置文件终于是UTF-8编码了，并且提供了GUI配置工具。另外，新增的插件功能使得sunpinyin能够整合进来，将fcitx的性能优势和sunpinyin的算法优势结合起来~ 词库仍然是整个读入内存的，不过现在的电脑内存也大了不少，鸭梨会小一些；而且这样也许读取词库能更快些~（-_-&#124;&#124;&#124;） 经过几天的试验和调校，我向大家推荐一个优秀的Ubuntu输入工具组合： fcitx 4.x with sunpinyin  并且使用hubert整理的sunpinyin词库 Ubuntu下的安装方法： 添加fcitx的nightly build PPA源（这样才有最新的4.x版）并安装 123sudo apt-add-repository ppa:wengxt/fcitx-nightly sudo apt-get update sudo apt-get install fcitx fcitx-config fcitx-sunpinyin Attention: 如果你之前有使用过ibus-sunpinyin，请将其完全删除。 切换至fcitx，注销后再次登陆你的输入法就将变为fcitx了 1im-switch -s fcitx 右键点击fcitx托盘图表 -&#62; 配置fcitx，会打开fcitx-config进行配置（推荐使用dark皮肤~）；右键点击托盘图表 -&#62; 切换输入法，设置为sunpinyin。 前往hubert的google code页面下载sunpinyin-userdict-small.7z ，并解压到~/.sunpinyin下覆盖userdict文件。（small版足矣，并且small版在首次运行载入时就已经有一些卡的现象了，完整版就更严重了……） Enjoy it~]]></description>
			<content:encoded><![CDATA[<p>在Ubuntu下的中文输入一直是一件很蛋疼的事情……原先使用多年的scim输入平台已经腐朽不堪，现在默认的ibus虽然是一个优秀的平台，但是缺乏优秀的输入法——常用的ibus pinyin的算法实在是令人无语，只好通过使用更大的词库（100MB+的搜狗词库）来弥补不足，不过效果也只是一般般，而且由于词库变大了许多，响应速度也变慢了。我后来知道了一个基于统计语言模型的优秀输入法——sunpinyin，于是尝试安装了ibus sunpinyin，果然组句能力非常强大，但词库实在是太小了，弄了一个大词库后发现性能又一次出现了大幅度的下降……</p>
<p>性能低下的主要原因，是因为他们都是运行于一个“输入平台”ibus之上的——越复杂的系统架构会带来越低下的性能，ibus是一个十分灵活的、能够安装各种语言的输入法的平台，十分臃肿，其性能很难好到哪里去。我们需要的，仅仅只是一个简单的——拼音输入法！其实早就有一般人想要这么干了，于是他们写了一个叫做fcitx的轻巧、纯粹的输入法。</p>
<p>我第一次接触fcitx还是v3时代，最大的感受就是——真的是太轻了，甚至连gtk都不依赖，而且只有一个用GBK编码的中文配置文件（蛋疼）……速度果然很快，算法也还行。不过在我试图导入大词库后，发现了一个致命的问题——fcitx会把整个词库读到内存里……最终，fcitx 3.x难用的配置方式、较差的稳定性、难看的界面以及表现平平的算法令我抛弃了它……</p>
<p><span id="more-157"></span></p>
<p>现在，fcitx 4诞生了！开发者最终妥协依赖了gtk，但因而也带来了极大的功能提升——用cairo渲染的精美皮肤，pango渲染的文字等等；而且现在配置文件终于是UTF-8编码了，并且提供了GUI配置工具。另外，新增的插件功能使得sunpinyin能够整合进来，将fcitx的性能优势和sunpinyin的算法优势结合起来~</p>
<p>词库仍然是整个读入内存的，不过现在的电脑内存也大了不少，鸭梨会小一些；而且这样也许读取词库能更快些~（-_-|||）</p>
<p>经过几天的试验和调校，我向大家推荐一个优秀的Ubuntu输入工具组合：</p>
<blockquote><p>fcitx 4.x with sunpinyin  并且使用hubert整理的sunpinyin词库</p></blockquote>
<p>Ubuntu下的安装方法：</p>
<ol>
<li>添加fcitx的nightly build PPA源（这样才有最新的4.x版）并安装
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br />2<br />3<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">sudo apt-add-repository ppa:wengxt/fcitx-nightly<br />
sudo apt-get update<br />
sudo apt-get install fcitx fcitx-config fcitx-sunpinyin</div></td></tr></tbody></table></div>
<p><strong>Attention: 如果你之前有使用过ibus-sunpinyin，请将其完全删除。</strong></li>
<li>切换至fcitx，注销后再次登陆你的输入法就将变为fcitx了
<div class="codecolorer-container text dawn" style="overflow:auto;white-space:nowrap;border:1px solid #9F9F9F;"><table cellspacing="0" cellpadding="0"><tbody><tr><td style="padding:5px;text-align:center;color:#888888;background-color:#EEEEEE;border-right: 1px solid #9F9F9F;font: normal 12px/1.4em Monaco, Lucida Console, monospace;"><div>1<br /></div></td><td><div class="text codecolorer" style="padding:5px;font:normal 12px/1.4em Monaco, Lucida Console, monospace;white-space:nowrap">im-switch -s fcitx</div></td></tr></tbody></table></div>
</li>
<li>右键点击fcitx托盘图表 -&gt; 配置fcitx，会打开fcitx-config进行配置（推荐使用dark皮肤~）；右键点击托盘图表 -&gt; 切换输入法，设置为sunpinyin。</li>
<li>前往hubert的<a href="http://code.google.com/p/hslinuxextra/downloads/list" target="_blank">google code页面</a>下载<a href="http://code.google.com/p/hslinuxextra/downloads/detail?name=sunpinyin-userdict-small.7z&amp;can=2&amp;q=">sunpinyin-userdict-small.7z </a>，并解压到~/.sunpinyin下覆盖userdict文件。（small版足矣，并且small版在首次运行载入时就已经有一些卡的现象了，完整版就更严重了……）</li>
<li>Enjoy it~</li>
</ol>
]]></content:encoded>
			<wfw:commentRss>http://blog.robotshell.org/2010/fcitx-sunpinyin-fluent-input/feed/</wfw:commentRss>
		<slash:comments>13</slash:comments>
		</item>
	</channel>
</rss>

<!-- Dynamic page generated in 2.293 seconds. -->
<!-- Cached page generated by WP-Super-Cache on 2012-02-07 08:51:49 -->
<!-- Compression = gzip -->
