<?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>Rest Valley &#187; Script</title> <atom:link href="http://lihdd.net/category/script/feed/" rel="self" type="application/rss+xml" /><link>http://lihdd.net</link> <description>The scratchpad of quark</description> <lastBuildDate>Sat, 09 Oct 2010 13:56:19 +0000</lastBuildDate> <language>en</language> <sy:updatePeriod>hourly</sy:updatePeriod> <sy:updateFrequency>1</sy:updateFrequency> <generator>http://wordpress.org/?v=</generator> <item><title>关于 ibus-sogoupycc 的扩展</title><link>http://lihdd.net/ibus-sogoupycc-extensions/</link> <comments>http://lihdd.net/ibus-sogoupycc-extensions/#comments</comments> <pubDate>Thu, 18 Mar 2010 12:06:19 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Config]]></category> <category><![CDATA[Script]]></category> <category><![CDATA[extension]]></category> <category><![CDATA[ibus]]></category> <category><![CDATA[ibus-sogoupycc]]></category> <category><![CDATA[lua]]></category><guid
isPermaLink="false">http://lihdd.net/?p=340</guid> <description><![CDATA[本来想把一些示例放在项目的 wiki 页上的，但是我还想说一些其他的闲话，而且目前扩展虽然有一些实用性了，却缺乏执行保护，可以把输入法弄得不稳定，所以这些内容就放到这里好了。如果你只想看看如何使用输入法的扩展，请向下找到 表情后从那里开始看。 似乎扩展是很流行的样子，各种浏览器，foobar2000，谷歌拼音，WPS，都可以用扩展。 其中，有的软件成功了，令人爱不释手，比如像 Firefox，foobar2000。有的软件却没有因为扩展成功，比如谷歌拼音。或者说扩展没有给人带来好感，比如 IE 浏览器。 我觉得作为一个支持扩展的软件，最重要的就是扩展要比较有用，可以做一些事情，这一点上谷歌拼音做得就不好，由于扩展而变得比较成功的软件在这方面做得都比较好。其次，扩展要容易开发，再往后，出于安全的考虑，扩展的能力要受到约束。这两点 IE 相比 Firefox 就弱了一些，不过 Firefox 的扩展写起来还是挺麻烦的，比如其中的多国语言化就非常麻烦，对于不同的地方要使用不同的方法，总共有三种。而由于 Firefox 的灵活性，出现了 Mozilla Jetpack 和 GreaseMonkey 等，都可以让扩展写起来方便一些。 在很长的一段时间内，我觉得编写软件，技术含量是最重要的， 一个更好的算法可以带来更快的速度，或者更好的结果，当然用户体验就会好。但是现在看法有些改变，因为目前，很多东西不是需要从头做起的，除非出于学习、版权目的，或者是原先的项目代码烂到不能看而没法维护，没有必要重新实现别人已经实现的东西。大部分软件应该在乎实用性，在不违反版权的情况下，尽量使用已有的东西。 从一开始，我觉得 ibus-sogoupycc 这样一个输入法的技术含量肯定不如 sunpinyin，Linux 下的输入法用 sunpinyin 就不错了，一度怀疑是否要有将 ibus-sogoupycc 写下去的必要。但是现在，我觉得是有必要的，因为在中国大部分有网络的地方，这样一个输入法用起来是更舒服的，至少对我自己来说。 出于同样的实用性的考虑，我提供了输入法扩展能力。本来我想提供一个完全兼容谷歌拼音的接口，但是后来觉得谷歌拼音的扩展接口设计得并不好，和目前输入法的无需选词流畅输入有冲突，没有遵循的必要。 开头提到的这个表情在这里： ，不难找吧。 扩展的设置应该放在用户配置文件中，目前添加一个扩展的方法是： ime.register_command&#40;key, modifiers, caption, script&#41; 这里，key 和 modifiers 都是数字类型，后两者是字符串类型。 修改用户配置文件后一般要重新启动输入法才能生效，可以右击任务栏上的 ibus 图标，选择重新启动。 Hello world 下面的代码注册了一个用 Alt + H [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://lihdd.net/wp-content/uploads/2010/03/extensions.png" alt="" title="extensions" width="100" height="125" class="alignright size-full wp-image-344" />本来想把一些示例放在项目的 wiki 页上的，但是我还想说一些其他的闲话，而且目前扩展虽然有一些实用性了，却缺乏执行保护，可以把输入法弄得不稳定，所以这些内容就放到这里好了。如果你只想看看如何使用输入法的扩展，请向下找到 <img
src='http://lihdd.net/wp-includes/images/smilies/wink.png' alt='^_.' class='wp-smiley' /> 表情后从那里开始看。</p><p>似乎扩展是很流行的样子，各种浏览器，foobar2000，谷歌拼音，WPS，都可以用扩展。</p><p>其中，有的软件成功了，令人爱不释手，比如像 Firefox，foobar2000。有的软件却没有因为扩展成功，比如谷歌拼音。或者说扩展没有给人带来好感，比如 IE 浏览器。<span
id="more-340"></span></p><p>我觉得作为一个支持扩展的软件，最重要的就是扩展要比较有用，可以做一些事情，这一点上谷歌拼音做得就不好，由于扩展而变得比较成功的软件在这方面做得都比较好。其次，扩展要容易开发，再往后，出于安全的考虑，扩展的能力要受到约束。这两点 IE 相比 Firefox 就弱了一些，不过 Firefox 的扩展写起来还是挺麻烦的，比如其中的多国语言化就非常麻烦，对于不同的地方要使用不同的方法，总共有三种。而由于 Firefox 的灵活性，出现了 <a
href="https://jetpack.mozillalabs.com/">Mozilla Jetpack</a> 和 <a
href="https://addons.mozilla.org/firefox/addon/748">GreaseMonkey</a> 等，都可以让扩展写起来方便一些。</p><p>在很长的一段时间内，我觉得编写软件，技术含量是最重要的， 一个更好的算法可以带来更快的速度，或者更好的结果，当然用户体验就会好。但是现在看法有些改变，因为目前，很多东西不是需要从头做起的，除非出于学习、版权目的，或者是原先的项目代码烂到不能看而没法维护，没有必要重新实现别人已经实现的东西。大部分软件应该在乎实用性，在不违反版权的情况下，尽量使用已有的东西。</p><p>从一开始，我觉得 ibus-sogoupycc 这样一个输入法的技术含量肯定不如 <a
href="http://code.google.com/p/sunpinyin/">sunpinyin</a>，Linux 下的输入法用 sunpinyin 就不错了，一度怀疑是否要有将 ibus-sogoupycc 写下去的必要。但是现在，我觉得是有必要的，因为在中国大部分有网络的地方，这样一个输入法用起来是更舒服的，至少对我自己来说。<br
/><div
id="attachment_347" class="wp-caption aligncenter" style="width: 266px"><img
src="http://lihdd.net/wp-content/uploads/2010/03/ibus-sogoupycc-0.2.0_demo.gif" alt="" title="ibus-sogoupycc-0.2.0_demo" width="256" height="179" class="size-full wp-image-347" /><p
class="wp-caption-text">使用信号很弱的无线网，输入起来感觉也不错</p></div></p><p>出于同样的实用性的考虑，我提供了输入法扩展能力。本来我想提供一个完全兼容谷歌拼音的接口，但是后来觉得谷歌拼音的扩展接口设计得并不好，和目前输入法的无需选词流畅输入有冲突，没有遵循的必要。</p><p><em>开头提到的这个表情在这里： <img
src='http://lihdd.net/wp-includes/images/smilies/wink.png' alt='^_.' class='wp-smiley' /> ，不难找吧。</em></p><p>扩展的设置应该放在用户配置文件中，目前添加一个扩展的方法是：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span>key, modifiers, caption, script<span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里，key 和 modifiers 都是数字类型，后两者是字符串类型。</p><p>修改用户配置文件后一般要重新启动输入法才能生效，可以右击任务栏上的 ibus 图标，选择重新启动。</p><p><strong>Hello world</strong><br
/> 下面的代码注册了一个用 Alt + H 可以激活的扩展，只要输入法被激活，无论处于中英文状态，都可以用这个热键运行这个扩展。</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">&quot;h&quot;</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.MOD1_MASK, <span style="color: #ff0000;">&quot;hello&quot;</span>, <span style="color: #ff0000;">&quot;ime.notify('hello world')&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>重新启动 ibus 之后，按下方形的扩展按钮(ibus-1.2.0.20090927 版本下，方形按钮会消失，这是 ibus 的已知问题，此时通过热键仍然可以运行扩展)，可以看到一个标题为 hello 的菜单项，单击它，就可以运行扩展。<br
/><div
id="attachment_343" class="wp-caption aligncenter" style="width: 197px"><img
src="http://lihdd.net/wp-content/uploads/2010/03/ime_extension_menu.png" alt="" title="ime_extension_menu" width="187" height="301" class="size-full wp-image-343" /><p
class="wp-caption-text">输入法扩展菜单</p></div><br
/> 这里，第一个参数是按键，<code>("h"):byte()</code> 表示 h 的 ASCII 码，<code>"ime.notify('hello world')"</code> 是一段字符串表示的 lua 代码，它利用输入法提供的 <code>ime.notify</code> 方法显示了一些内容。</p><p><strong>插入系统时间</strong></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span>key.Shift_R, <span style="color: #cc66cc;">0</span>, <span style="color: #ff0000;">&quot;插入系统时间&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(os.date())&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里的 <code>ime.commit</code> 也是输入法提供的方法，用来直接向客户端程序输入文字，<code>os.date</code> 是 Lua 标准库函数。这段代码注册了一个用 右Shift 激活的插入系统时间的功能。</p><p>Lua 的标准库函数在扩展中都是可以用的，比如可以用 <code>os.execute('mousepad &#038;')</code> 在后台运行一个 mousepad。</p><p><strong>执行 Lua 代码</strong></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'L'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.SHIFT_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;执行 Lua 代码&quot;</span>, <span style="color: #ff0000;">&quot;ime.execute('ime.notify('..ime.get_selection()..')')&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这段代码注册了一个用 Shift + Alt + L 热键，把选中内容当做 Lua 脚本执行，并用桌面提示显示结果的扩展，这里因为有了 Shift 辅助键，所以要取大写字母 L 的 ASCII 码。其中使用方法 <code>ime.get_selection</code> 获得选定文字的内容，<code>ime.execute</code> 用来把一个字符串当做 Lua 脚本运行，双点号是字符串连接操作。</p><p>这个扩展可以比较有用，比如当选定 <code>315+23*6145</code> 这样的表达式之后，运行一下扩展就可以知道计算结果，也可以选定 <code>ime.VERSION</code> 这样的内部变量，查看其内容。甚至可以选定一段 <code>ime.register_command</code> 代码，动态添加扩展 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><p><strong>“回音”效果</strong><br
/> 不知道从什么地方开始流行这种效果，我想说明的是，声明一个函数并且在扩展中调用是可以的：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> echo_effect<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">local</span> s <span style="color: #66cc66;">=</span> ime.get_selection<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">for</span> i <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>, #s, <span style="color: #cc66cc;">3</span> <span style="color: #b1b100;">do</span> ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span>i <span style="color: #66cc66;">==</span> <span style="color: #cc66cc;">1</span> <span style="color: #b1b100;">and</span> <span style="color: #ff0000;">''</span> <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'，'</span><span style="color: #66cc66;">&#41;</span>..s:sub<span style="color: #66cc66;">&#40;</span>i<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'E'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.SHIFT_MASK + key.CONTROL_MASK,
  <span style="color: #ff0000;">&quot;产生回音&quot;</span>, <span style="color: #ff0000;">&quot;echo_effect()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>这里简单地使用了 3 个字节 作为步长，所以只能处理纯中文。对文字 &#8220;这是回音你懂吗&#8221; 使用这个扩展会得到：&#8221;这是回音你懂吗，是回音你懂吗，回音你懂吗，音你懂吗，你懂吗，懂吗，吗&#8221; <img
src='http://lihdd.net/wp-includes/images/smilies/sigh.png' alt=':sigh:' class='wp-smiley' /></p><p><strong>全半角切换</strong><br
/> 输入法本身没有提供全半角切换功能，但是通过扩展可以实现类似功能：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.second_punc_map <span style="color: #66cc66;">=</span> <span style="color: #66cc66;">&#123;</span><span style="color: #66cc66;">&#125;</span>
<span style="color: #b1b100;">function</span> toggle_punc_map<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	ime.second_punc_map, ime.punc_map <span style="color: #66cc66;">=</span> ime.punc_map, ime.second_punc_map
	ime.apply_settings<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	ime.notify<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'已切换到'</span> .. <span style="color: #66cc66;">&#40;</span>ime.punc_map<span style="color: #66cc66;">&#91;</span><span style="color: #ff0000;">'.'</span><span style="color: #66cc66;">&#93;</span> <span style="color: #b1b100;">and</span> <span style="color: #ff0000;">'全'</span> <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'半'</span><span style="color: #66cc66;">&#41;</span> ..<span style="color: #ff0000;">'角'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">','</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK , <span style="color: #ff0000;">&quot;全半角切换&quot;</span>, <span style="color: #ff0000;">&quot;toggle_punc_map()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>注册了 Ctrl + 逗号 作为切换热键，并会用桌面提示显示切换结果。</p><p><strong>全双拼切换</strong><br
/> 可以仿造上例写出：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;">ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span>, <span style="color: #ff0000;">&quot;全双拼切换&quot;</span>,
  <span style="color: #ff0000;">&quot;ime.use_double_pinyin = not ime.use_double_pinyin ime.apply_settings()&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>前面填写的两个 0 表示这个扩展没有热键，你也可以再加上一句 <code>ime.notify</code>，使得切换的时候有桌面提示。</p><p><strong>对缓存的操作</strong><br
/> 缓存是存在全局的 <code>request_cache</code> 中的，可以直接对其操作：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> show_request_cache<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">for</span> i,v <span style="color: #b1b100;">in</span> <span style="color: #b1b100;">pairs</span><span style="color: #66cc66;">&#40;</span>request_cache<span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">do</span>
		ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&quot;'</span>..i..<span style="color: #ff0000;">'&quot; =&gt; &quot;'</span>..v..<span style="color: #ff0000;">'&quot;<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">end</span>
<span style="color: #b1b100;">end</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span> , <span style="color: #ff0000;">&quot;查看缓存&quot;</span>, <span style="color: #ff0000;">&quot;show_request_cache()&quot;</span><span style="color: #66cc66;">&#41;</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #cc66cc;">0</span>, <span style="color: #cc66cc;">0</span> , <span style="color: #ff0000;">&quot;清空缓存&quot;</span>, <span style="color: #ff0000;">&quot;request_cache = {}&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>其中的 <code>ime.commit</code> 方法用来向客户端插入文本，还有一个方法是 <code>ime.request</code>，用来向输入法提交一个拼音请求，比如下面这段代码片段将向输入法提交《春晓》的拼音：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">for</span> _, v <span style="color: #b1b100;">in</span> <span style="color: #b1b100;">pairs</span>
<span style="color: #66cc66;">&#123;</span><span style="color: #ff0000;">'chun mian bu jue xiao'</span>, <span style="color: #ff0000;">'chu chu wen ti niao'</span>,
 <span style="color: #ff0000;">'ye lai feng yu sheng'</span>, <span style="color: #ff0000;">'hua luo zhi duo shao'</span><span style="color: #66cc66;">&#125;</span> <span style="color: #b1b100;">do</span>
	ime.request<span style="color: #66cc66;">&#40;</span>v<span style="color: #66cc66;">&#41;</span>
	ime.commit<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'<span style="color: #000099; font-weight: bold;">\n</span>'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span></pre></div></div><p><strong>给自己发送飞信</strong><br
/> 输入法全局配置文件默认加载了 <code>socket.http</code> 和 <code>socket.url</code> 模块，可以用它们来访问网络。</p><p>比如，下面的代码通过 <a
href="http://api.bz/">api.bz</a> 这个在线接口把选定文字内容通过飞信发送给自己：</p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> send_sms<span style="color: #66cc66;">&#40;</span>content<span style="color: #66cc66;">&#41;</span>
	http.TIMEOUT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">2</span>
	<span style="color: #b1b100;">local</span> res <span style="color: #66cc66;">=</span> http.request<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'https://sms.api.bz/fetion.php?username=15566119320&amp;password=nevermind&amp;sendto=15566119320&amp;message='</span>..url.escape<span style="color: #66cc66;">&#40;</span>content<span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>
	ime.notify<span style="color: #66cc66;">&#40;</span>res <span style="color: #b1b100;">or</span> <span style="color: #ff0000;">'飞信发送失败'</span>, content, <span style="color: #ff0000;">'info'</span><span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
&nbsp;
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'m'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK, <span style="color: #ff0000;">&quot;飞信发送&quot;</span>, <span style="color: #ff0000;">&quot;send_sms(ime.get_selection())&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p>以上填写的飞信用户名和密码皆为虚构，实际用的时候需要改一下。</p><p><strong>简繁体转换和翻译</strong><br
/> 使用 Google API 来翻译文字，从简体中文翻译成繁体中文就实现了转换成繁体 <img
src='http://lihdd.net/wp-includes/images/smilies/happy.png' alt='(:' class='wp-smiley' /></p><div
class="wp_syntax"><div
class="code"><pre class="lua" style="font-family:monospace;"><span style="color: #b1b100;">function</span> google_translate<span style="color: #66cc66;">&#40;</span>text, langpair<span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">local</span> url <span style="color: #66cc66;">=</span> <span style="color: #ff0000;">'http://ajax.googleapis.com/ajax/services/language/translate?v=1.0&amp;q='</span>..url.escape<span style="color: #66cc66;">&#40;</span>text<span style="color: #66cc66;">&#41;</span>..<span style="color: #ff0000;">'&amp;langpair='</span>..url.escape<span style="color: #66cc66;">&#40;</span>langpair<span style="color: #66cc66;">&#41;</span>
	http.TIMEOUT <span style="color: #66cc66;">=</span> <span style="color: #cc66cc;">1</span>
	<span style="color: #b1b100;">local</span> res <span style="color: #66cc66;">=</span> http.request<span style="color: #66cc66;">&#40;</span>url<span style="color: #66cc66;">&#41;</span>
	<span style="color: #b1b100;">if</span> res <span style="color: #b1b100;">then</span> res <span style="color: #66cc66;">=</span> res:match<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'&quot;translatedText&quot;:&quot;(.-)&quot;}'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #b1b100;">end</span>
	<span style="color: #b1b100;">return</span> <span style="color: #b1b100;">tostring</span><span style="color: #66cc66;">&#40;</span>res <span style="color: #b1b100;">or</span> text<span style="color: #66cc66;">&#41;</span>
<span style="color: #b1b100;">end</span>
&nbsp;
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'t'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;转换成繁体&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(google_translate(ime.get_selection(), 'zh-CN|zh-TW'))&quot;</span><span style="color: #66cc66;">&#41;</span>
ime.register_command<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'e'</span><span style="color: #66cc66;">&#41;</span>:byte<span style="color: #66cc66;">&#40;</span><span style="color: #66cc66;">&#41;</span>, key.CONTROL_MASK + key.MOD1_MASK ,
  <span style="color: #ff0000;">&quot;翻译成英文&quot;</span>, <span style="color: #ff0000;">&quot;ime.commit(google_translate(ime.get_selection(), 'zh-CN|en'))&quot;</span><span style="color: #66cc66;">&#41;</span></pre></div></div><p><strong>写在最后</strong></p><p>这是一个悲剧。</p><p>Lua 作者根本不相信多线程，原因是现在的主流语言中连 <code>a = a + 1</code> 都不是原子的，谈什么多线程呢？</p><p>我曾经做过一些尝试，确实让程序多线程地执行 Lua 代码，又共享一些全局数据，不是轻松的事情。我也想到一些解决办法，但是都太麻烦了，于是就偷懒不管那么多了。</p><p>这有什么影响呢？影响就是目前输入法执行 Lua 代码是单线程的，扩展中的 Lua 代码会造成阻塞。在有网络请求等操作的时候，要注意控制超时，否则程序可能被认为没有响应了，各种死法都有可能出现 <img
src='http://lihdd.net/wp-includes/images/smilies/hmm.png' alt='.~.' class='wp-smiley' /></p><p>目前输入法的自由程度到了可以随意 AOE，比如用 <code>os.execute('pkill Xorg')</code>，就可以干掉许多无辜者。正所谓权力越大，责任越大。到底安全与否，就看扩展中的代码自我约束得如何了 <img
src='http://lihdd.net/wp-includes/images/smilies/meeh.png' alt='._.' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/ibus-sogoupycc-extensions/feed/</wfw:commentRss> <slash:comments>15</slash:comments> </item> <item><title>防止Google对搜索结果重定向</title><link>http://lihdd.net/stop-google-relink/</link> <comments>http://lihdd.net/stop-google-relink/#comments</comments> <pubDate>Fri, 30 Oct 2009 06:46:44 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Script]]></category> <category><![CDATA[Google]]></category> <category><![CDATA[GreaseMonkey]]></category><guid
isPermaLink="false">http://lihdd.net/?p=256</guid> <description><![CDATA[最近，hzqtc 推荐了一个GreaseMonkey脚本，可以把Google搜索的结果分两栏显示，自动加载后一页的内容，防止结果经过重定向，还可以为结果编号，加载favicon等等。 这个脚本目前在我这里会有一个问题，会导致Google的“Show more results from xxxx”失效。我会用到这个功能，于是只好不用这个“神一样的GM脚本”了 那么还是有其它做法达到一些关键功能的，比如自动加载后一页可以用Firefox的AutoPager扩展完成，在支持CSS3的Firefox中用Stylish扩展，为搜索结果页应用 .med { -moz-column-count: 2;} 这样的样式就有两栏了。 关于Google把搜索结果重定向，跟踪用户点击这一点，确实令人很不爽。hzqtc曾经介绍的方法现在由于Google使用AJAX加载搜索结果，变得不能用了。那么再做一个可以用的吧 Google搜索结果的链接都写有onmousedown="rwt(....)"，这个rwt函数会改写用户单击的链接： window.rwt=function&#40;a,d,e,i,j,f,k,l&#41;&#123; try&#123; if&#40;a===window&#41;&#123; a=window.event.srcElement; while&#40;a&#41;&#123; if&#40;a.href&#41;break; a=a.parentNode &#125; &#125; var b=encodeURIComponent&#124;&#124;escape; var m=&#91;&#34;/url?sa=t&#34;,&#34;\x26source\x3dweb&#34;,d?&#34;&#38;oi=&#34;+b&#40;d&#41;:&#34;&#34;,e?&#34;&#38;cad=&#34;+b&#40;e&#41;:&#34;&#34;,&#34;&#38;ct=&#34;,b&#40;i&#124;&#124;&#34;res&#34;&#41;,&#34;&#38;cd=&#34;,b&#40;j&#41;,&#34;&#38;ved=&#34;,b&#40;l&#41;,&#34;&#38;url=&#34;,b&#40;a.href&#41;.replace&#40;/\+/g,&#34;%2B&#34;&#41;,&#34;&#38;ei=&#34;,&#34;dIHqSoSTDsOXkAX9huGPDw&#34;,f?&#34;&#38;usg=&#34;+f:&#34;&#34;,k&#93;.join&#40;&#34;&#34;&#41;; a.href=m;a.onmousedown=&#34;&#34; &#125; catch&#40;n&#41;&#123;&#125; return true &#125;; 那么不同的对策也有了 :-) 消灭（带有rwt函数的）onmousedown 由于Google使用AJAX加载搜索结果，要在其加载完成后才去做这个事情 替换掉rwt函数 这里我使用第二种方法，比较简单一些，如何用GreaseMonkey脚本替换一个js函数在GreaseMonkey的Wiki有说明。 最后的脚本就是这样的，可以在这里找到： function rwt&#40;&#41; &#123; return true; &#125; &#160; function embedFunction&#40;s&#41; &#123; document.body.appendChild&#40;document.createElement&#40;'script'&#41;&#41;.innerHTML=s.toString&#40;&#41;.replace&#40;/([\s\S]*?return;){2}([\s\S]*)}/,'$2'&#41;; &#125; &#160; embedFunction&#40;rwt&#41;;]]></description> <content:encoded><![CDATA[<p>最近，<a
href="http://hzqtcblog.appspot.com/">hzqtc</a> <a
href="http://hzqtcblog.appspot.com/article.jsp?articleid=lmshcyirks">推荐了一个GreaseMonkey脚本</a>，可以把Google搜索的结果分两栏显示，自动加载后一页的内容，防止结果经过重定向，还可以为结果编号，加载favicon等等。</p><p>这个脚本目前在我这里会有一个问题，会导致Google的“Show more results from xxxx”失效。我会用到这个功能，于是只好不用这个“神一样的GM脚本”了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_redface.gif' alt=':oops:' class='wp-smiley' /></p><p>那么还是有其它做法达到一些关键功能的，比如自动加载后一页可以用Firefox的AutoPager扩展完成，在支持CSS3的Firefox中用Stylish扩展，为搜索结果页应用 <code>.med { -moz-column-count: 2;}</code> 这样的样式就有两栏了。</p><p>关于Google把搜索结果重定向，跟踪用户点击这一点，确实令人很不爽。<a
href="http://hzqtcblog.appspot.com/article.jsp?articleid=owbecsnjch">hzqtc曾经介绍的方法</a>现在由于Google使用AJAX加载搜索结果，变得不能用了。那么再做一个可以用的吧 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' /> <span
id="more-256"></span></p><p>Google搜索结果的链接都写有<code>onmousedown="rwt(....)"</code>，这个rwt函数会改写用户单击的链接：</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;">window.<span style="color: #660066;">rwt</span><span style="color: #339933;">=</span><span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">,</span>d<span style="color: #339933;">,</span>e<span style="color: #339933;">,</span>i<span style="color: #339933;">,</span>j<span style="color: #339933;">,</span>f<span style="color: #339933;">,</span>k<span style="color: #339933;">,</span>l<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">try</span><span style="color: #009900;">&#123;</span>
		<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>a<span style="color: #339933;">===</span>window<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
			a<span style="color: #339933;">=</span>window.<span style="color: #660066;">event</span>.<span style="color: #660066;">srcElement</span><span style="color: #339933;">;</span>
			<span style="color: #000066; font-weight: bold;">while</span><span style="color: #009900;">&#40;</span>a<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span>
				<span style="color: #000066; font-weight: bold;">if</span><span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">href</span><span style="color: #009900;">&#41;</span><span style="color: #000066; font-weight: bold;">break</span><span style="color: #339933;">;</span>
				a<span style="color: #339933;">=</span>a.<span style="color: #660066;">parentNode</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
		<span style="color: #003366; font-weight: bold;">var</span> b<span style="color: #339933;">=</span>encodeURIComponent<span style="color: #339933;">||</span>escape<span style="color: #339933;">;</span>
		<span style="color: #003366; font-weight: bold;">var</span> m<span style="color: #339933;">=</span><span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;/url?sa=t&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;<span style="color: #000099; font-weight: bold;">\x</span>26source<span style="color: #000099; font-weight: bold;">\x</span>3dweb&quot;</span><span style="color: #339933;">,</span>d<span style="color: #339933;">?</span><span style="color: #3366CC;">&quot;&amp;oi=&quot;</span><span style="color: #339933;">+</span>b<span style="color: #009900;">&#40;</span>d<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span>e<span style="color: #339933;">?</span><span style="color: #3366CC;">&quot;&amp;cad=&quot;</span><span style="color: #339933;">+</span>b<span style="color: #009900;">&#40;</span>e<span style="color: #009900;">&#41;</span><span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;&amp;ct=&quot;</span><span style="color: #339933;">,</span>b<span style="color: #009900;">&#40;</span>i<span style="color: #339933;">||</span><span style="color: #3366CC;">&quot;res&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;&amp;cd=&quot;</span><span style="color: #339933;">,</span>b<span style="color: #009900;">&#40;</span>j<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;&amp;ved=&quot;</span><span style="color: #339933;">,</span>b<span style="color: #009900;">&#40;</span>l<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;&amp;url=&quot;</span><span style="color: #339933;">,</span>b<span style="color: #009900;">&#40;</span>a.<span style="color: #660066;">href</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\+/g</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;%2B&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;&amp;ei=&quot;</span><span style="color: #339933;">,</span><span style="color: #3366CC;">&quot;dIHqSoSTDsOXkAX9huGPDw&quot;</span><span style="color: #339933;">,</span>f<span style="color: #339933;">?</span><span style="color: #3366CC;">&quot;&amp;usg=&quot;</span><span style="color: #339933;">+</span>f<span style="color: #339933;">:</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #339933;">,</span>k<span style="color: #009900;">&#93;</span>.<span style="color: #660066;">join</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		a.<span style="color: #660066;">href</span><span style="color: #339933;">=</span>m<span style="color: #339933;">;</span>a.<span style="color: #660066;">onmousedown</span><span style="color: #339933;">=</span><span style="color: #3366CC;">&quot;&quot;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">catch</span><span style="color: #009900;">&#40;</span>n<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#123;</span><span style="color: #009900;">&#125;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span>
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span></pre></div></div><p>那么不同的对策也有了 :-)</p><ul><li>消灭（带有rwt函数的）onmousedown<br
/> 由于Google使用AJAX加载搜索结果，要在其加载完成后才去做这个事情</li><li>替换掉rwt函数</li></ul><p>这里我使用第二种方法，比较简单一些，如何用GreaseMonkey脚本替换一个js函数在<a
href="http://wiki.greasespot.net/Code_snippets#Embed_a_function_in_the_current_page">GreaseMonkey的Wiki</a>有说明。</p><p>最后的脚本就是这样的，可以在<a
href="http://userscripts.org/scripts/show/60856">这里</a>找到：</p><div
class="wp_syntax"><div
class="code"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">function</span> rwt<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000066; font-weight: bold;">return</span> <span style="color: #003366; font-weight: bold;">true</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">function</span> embedFunction<span style="color: #009900;">&#40;</span>s<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	document.<span style="color: #660066;">body</span>.<span style="color: #660066;">appendChild</span><span style="color: #009900;">&#40;</span>document.<span style="color: #660066;">createElement</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'script'</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">innerHTML</span><span style="color: #339933;">=</span>s.<span style="color: #660066;">toString</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span>.<span style="color: #660066;">replace</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/([\s\S]*?return;){2}([\s\S]*)}/</span><span style="color: #339933;">,</span><span style="color: #3366CC;">'$2'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
embedFunction<span style="color: #009900;">&#40;</span>rwt<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></div></div>]]></content:encoded> <wfw:commentRss>http://lihdd.net/stop-google-relink/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>Limited HDD</title><link>http://lihdd.net/limited-hdd/</link> <comments>http://lihdd.net/limited-hdd/#comments</comments> <pubDate>Tue, 06 Oct 2009 13:43:13 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Script]]></category> <category><![CDATA[archlinux]]></category> <category><![CDATA[Shell]]></category><guid
isPermaLink="false">http://lihdd.net/?p=207</guid> <description><![CDATA[今天使用本本的时候突然发现许多程序不能运行，报出各种奇妙的错误。本来我以为是遭到火星人入侵了，结果没发现什么异常。升级系统时才发现原来是系统分区没空间了 这样的话删除些东西就可以了吧。好久没有使用KDE了，对它的新版本印象很不好，平时也只可能用到k3b或者是kolourpaint，前者有许多替代品，后者可以用mspaint替代。Archlinux的KDE组件纷纷扰扰很复杂，删了好几次总算全部删光了，但是并没有腾出来多少磁盘空间 于是就想把所有已经安装的软件包按照占用空间大小列出来，再酌情删除，Archlinux下可以通过pacman列出已经安装的软件包，或者查看一个指定已安装软件包的详细信息（包括占用空间）。配合GNU的命令行工具，一下子就能得到我想要的结果： pacman -Qq &#124; while read i; do printf '%s\t%s\n' &#34;`pacman -Qi $i &#124; grep 'Installed Size' &#124; sed 's/.*: //'`&#34; &#34;$i&#34;; done &#124; sort -gr 189460.00 K eclipse 132204.00 K jdk 131525.00 K ocaml 116960.00 K erlang 112964.00 K jre 103615.00 K boost 102474.00 K kernel26 95409.00 K wine 91472.00 K mono [...]]]></description> <content:encoded><![CDATA[<p>今天使用本本的时候突然发现许多程序不能运行，报出各种奇妙的错误。本来我以为是遭到火星人入侵了，结果没发现什么异常。<span
id="more-207"></span>升级系统时才发现原来是系统分区没空间了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_redface.gif' alt=':oops:' class='wp-smiley' /></p><p>这样的话删除些东西就可以了吧。好久没有使用KDE了，对它的新版本印象很不好，平时也只可能用到k3b或者是kolourpaint，前者有许多替代品，后者可以用mspaint替代。Archlinux的KDE组件纷纷扰扰很复杂，删了好几次总算全部删光了，但是并没有腾出来多少磁盘空间 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_eek.gif' alt='8-O' class='wp-smiley' /></p><p>于是就想把所有已经安装的软件包按照占用空间大小列出来，再酌情删除，Archlinux下可以通过pacman列出已经安装的软件包，或者查看一个指定已安装软件包的详细信息（包括占用空间）。配合GNU的命令行工具，一下子就能得到我想要的结果：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">pacman <span style="color: #660033;">-Qq</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i; <span style="color: #000000; font-weight: bold;">do</span> <span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">'%s\t%s\n'</span> <span style="color: #ff0000;">&quot;<span style="color: #780078;">`pacman -Qi $i | grep 'Installed Size' | sed 's/.*: //'`</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span>; <span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sort</span> <span style="color: #660033;">-gr</span></pre></div></div><pre>189460.00 K	eclipse
132204.00 K	jdk
131525.00 K	ocaml
116960.00 K	erlang
112964.00 K	jre
103615.00 K	boost
102474.00 K	kernel26
95409.00 K	wine
91472.00 K	mono
87532.00 K	emacs-cvs
85696.00 K	qt
74732.00 K	evolution
71972.00 K	ibus-pinyin
67208.00 K	gcc
65556.00 K	xulrunner
64488.00 K	python3
62856.00 K	python
59772.00 K	samba
58468.00 K	gtkmm
57265.00 K	mysql
57128.00 K	gimp
56400.00 K	cuneiform
56228.00 K	wireshark
55852.00 K	ghostscript
54624.00 K	perl
53024.00 K	gnome2-user-docs
52024.00 K	ntop
50016.00 K	chromium-snapshot
48453.00 K	eclipse-cdt
46284.00 K	smbclient
46232.00 K	adobe-air
......</pre><p>排在第一的eclipse基本用不到，一些编程语言是一时试试看才装上的，samba不知道是谁依赖它才被装上的，emacs用不好，adobe-air用不到，qt3 tooooold…… 爽快地都删掉了，腾出空间效果很明显。 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_rolleyes.gif' alt=':roll:' class='wp-smiley' /></p><p>上面那一行命令很方便，这种方便是我还在把Linux当作主要操作系统的原因之一，现在的Windows 7也十分有诱惑力，我也即将获得<a
title="MSDN Academic Alliance" href="http://msdn.microsoft.com/en-us/academic/default.aspx" target="_blank">MSDNAA</a>订阅，这会带来一份免费正版Windows 7的序列号，必须做出选择了啊……</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/limited-hdd/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>小心bash的管道</title><link>http://lihdd.net/bash-pipe-pitfall/</link> <comments>http://lihdd.net/bash-pipe-pitfall/#comments</comments> <pubDate>Thu, 16 Jul 2009 07:32:56 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Script]]></category> <category><![CDATA[Note]]></category> <category><![CDATA[Shell]]></category><guid
isPermaLink="false">http://lihdd.net/?p=193</guid> <description><![CDATA[管道是Shell中非常常用的东西，*nix的神奇，一大部分要归功于各式各样全能的小工具和管道。 简而言之，管道就是把若干个程序连接起来，一个管道符号的前一个程序的输出作为后一个程序的输入，比如，统计hello.c里面有多少行带有双斜杠可以这样写: cat hello.c &#124; grep '//' &#124; wc -l 这篇日志不是普及管道的，而是因为今天自己写Shell脚本时遇到了一个问题，记在这里作为提醒。 Shell中可以打开另外一个Shell，新打开的Shell就是Subshell，对于这个Subshell，打开它的Shell叫做Parent Shell。这两个Shell的最大区别在于环境变量，Parent Shell中所有被export过的环境变量会被Subshell继承，而Subshell对环境变量做的任何修改都不会影响Parent Shell中的环境变量。 在圆括号括起来的命令会在Subshell中执行： export a=1; &#40; echo 'Sub 1: '$a; a=2; echo 'Sub 2: '$a; unset a; &#41;; echo 'Parent: '$a 会得到这样的结果 Sub 1: 1 Sub 2: 2 Parent: 1 今天，我写了一个脚本对一个ZOJ比赛的Runs页面进行不停地监视，一旦有新的状态产生，就用libnotify把它显示出来，这个脚本大致是这样的： #!/bin/bash &#160; c=0 while true; do wget --load-cookies cookies.txt &#34;http://xxxxxx&#34; -qO [...]]]></description> <content:encoded><![CDATA[<p><img
src="http://lihdd.net/wp-content/uploads/2009/04/standard.png" alt="standard" title="standard" width="96" height="90" class="alignright size-full wp-image-135 frame" align="right" />管道是Shell中非常常用的东西，*nix的神奇，一大部分要归功于各式各样全能的小工具和管道。</p><p>简而言之，管道就是把若干个程序连接起来，一个管道符号的前一个程序的输出作为后一个程序的输入，比如，统计hello.c里面有多少行带有双斜杠可以这样写:</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> hello.c <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'//'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> <span style="color: #660033;">-l</span></pre></div></div><p>这篇日志不是普及管道的，而是因为今天自己写Shell脚本时遇到了一个问题，记在这里作为提醒。<br
/> <span
id="more-193"></span><br
/> Shell中可以打开另外一个Shell，新打开的Shell就是Subshell，对于这个Subshell，打开它的Shell叫做Parent Shell。这两个Shell的最大区别在于环境变量，Parent Shell中所有被export过的环境变量会被Subshell继承，而Subshell对环境变量做的任何修改都不会影响Parent Shell中的环境变量。</p><p>在圆括号括起来的命令会在Subshell中执行：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">a</span>=<span style="color: #000000;">1</span>; <span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Sub 1: '</span><span style="color: #007800;">$a</span>; <span style="color: #007800;">a</span>=<span style="color: #000000;">2</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Sub 2: '</span><span style="color: #007800;">$a</span>; <span style="color: #7a0874; font-weight: bold;">unset</span> a; <span style="color: #7a0874; font-weight: bold;">&#41;</span>; <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Parent: '</span><span style="color: #007800;">$a</span></pre></div></div><p>会得到这样的结果</p><pre>Sub 1: 1
Sub 2: 2
Parent: 1</pre><p>今天，我写了一个脚本对一个<a
href="http://acm.zju.edu.cn">ZOJ</a>比赛的Runs页面进行不停地监视，一旦有新的状态产生，就用libnotify把它显示出来，这个脚本大致是这样的：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">c</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">true</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">--load-cookies</span> cookies.txt <span style="color: #ff0000;">&quot;http://xxxxxx&quot;</span> <span style="color: #660033;">-qO</span> a.html
	<span style="color: #c20cb9; font-weight: bold;">cat</span> a.html <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'runId&quot;&gt;[0-9]'</span> <span style="color: #660033;">-A</span>  <span style="color: #000000;">13</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/&lt;[^&gt;]*&gt;//g;s/  //g'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">uniq</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span> i; <span style="color: #000000; font-weight: bold;">do</span>
		<span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #007800;">i</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">printf</span> <span style="color: #ff0000;">'%s'</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">tr</span> <span style="color: #660033;">-d</span> <span style="color: #ff0000;">'\r'</span><span style="color: #000000; font-weight: bold;">`</span>
		<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> = <span style="color: #ff0000;">'--'</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #007800;">c</span>=<span style="color: #000000;">0</span>
		<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-n</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
			<span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$c</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'1'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">id</span>=<span style="color: #007800;">$i</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'2'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">time</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'3'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">result</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'4'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">prob</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'5'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">lang</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'6'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">during</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'7'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">mem</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span><span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #ff0000;">'8'</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
				<span style="color: #007800;">user</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$i</span>&quot;</span>;
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-z</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${a[$id]}</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$result</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-v</span> <span style="color: #ff0000;">'ing'</span> <span style="color: #000000; font-weight: bold;">&amp;&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null; <span style="color: #000000; font-weight: bold;">then</span>
					a<span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #007800;">$id</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>=<span style="color: #000000;">1</span>
					notify-send <span style="color: #ff0000;">&quot;<span style="color: #007800;">$prob</span> - <span style="color: #007800;">$user</span>&quot;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$result</span>, <span style="color: #007800;">${during}</span>ms <span style="color: #007800;">${mem}</span>KB&quot;</span>
				<span style="color: #000000; font-weight: bold;">fi</span>
				<span style="color: #000000; font-weight: bold;">;;</span>
			<span style="color: #000000; font-weight: bold;">esac</span>
		<span style="color: #000000; font-weight: bold;">fi</span>
	<span style="color: #000000; font-weight: bold;">done</span>
	<span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">10</span>;
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div><p>这个脚本运行起来会反复地显示获得的内容，也就是说if [ -z "${a[$id]}&#8221; ]检测被无视了。</p><p>为什么会这样子呢？经过调试，我发现<strong>bash遇到管道会创建一个Subshell，而zsh不会</strong>。</p><p>考虑一个简单的脚本，统计输入的行数：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">c</span>=<span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Line count: '</span><span style="color: #007800;">$c</span></pre></div></div><p>这是可以工作的，稍微修改一下：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #007800;">c</span>=<span style="color: #000000;">0</span>
<span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">done</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Line count: '</span><span style="color: #007800;">$c</span></pre></div></div><p>在bash下就不能正常工作了，其中的c++会在Subshell中执行，导致最终结果是0，如果用zsh执行这段脚本仍然可以得到期待的结果。</p><p>那如何解决这个问题呢？把管道拆成两个重定向就可以啦 :-)</p><p>对于上面这段</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">done</span></pre></div></div><p>的写法，可以改成：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #c20cb9; font-weight: bold;">tempfile</span>
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #c20cb9; font-weight: bold;">read</span>; <span style="color: #000000; font-weight: bold;">do</span>
	<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#40;</span> <span style="color: #c20cb9; font-weight: bold;">c++</span> <span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">&lt;</span> <span style="color: #c20cb9; font-weight: bold;">tempfile</span></pre></div></div><p>第一个脚本也可以类似地修改。</p><p>虽然直接使用zsh可以解决问题，但是由于zsh并不是每个地方都有的，而zsh也不是便于携带的，安装起来需要管理员权限往往自己没有，在这种情况下，对于类似这样的“有歧义”的写法，还是使用比较有“兼容性”的做法比较好。</p><p>当然，一味地追求“兼容性”也不是好事情。比如目前的Ubuntu/Debian发行版中，/bin/sh是链接到dash的。dash是一个极其轻量的Shell，一般zsh或者bash需要占用1到3MB的内存，而dash往往只需要几十KB的内存就可以工作了，没有自动补全，适合脚本使用。但是dash有严重问题，即便用它执行很简单的脚本。比如对于中文文件名，dash可能会在参数传递时出现编码问题，一个具体表现是使用for filename in *遍历时，把$filename当作参数传入cp这样的程序后，会说文件找不到 -.-b。</p><p>不追求“兼容性”，也不要迷信某一个程序会很“标准”，或者周围的人都在按照“标准”做事情。Ubuntu的Wiki上面说第一行是#!/bin/sh的脚本都应该兼容dash，这是个符合POSIX标准的Shell，但是实际情况绝对不是这样的。我使用Archlinux，把/bin/sh改成dash后，升级系统就发现系统无法启动了，折腾了好长时间才发现是这个原因导致的，Archlinux的kernel软件包的安装后执行脚本不兼容dash。</p><p>《三国演义》中第一句话就是“话说天下大势，分久必合，合久必分。”，期待一下zsh把Shell天下“合”的那一天 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /></p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/bash-pipe-pitfall/feed/</wfw:commentRss> <slash:comments>6</slash:comments> </item> <item><title>动态限制VirtualBox的CPU使用</title><link>http://lihdd.net/limit-virtualbox-cpu-resource-dynamically/</link> <comments>http://lihdd.net/limit-virtualbox-cpu-resource-dynamically/#comments</comments> <pubDate>Tue, 16 Jun 2009 14:20:08 +0000</pubDate> <dc:creator>quark</dc:creator> <category><![CDATA[Script]]></category> <category><![CDATA[Shell]]></category> <category><![CDATA[VirtualBox]]></category><guid
isPermaLink="false">http://lihdd.net/?p=168</guid> <description><![CDATA[夏天，除了蚊子产生的嗡嗡声，可能就是本本风扇产生的噪声最令人反感了。 我习惯于在Linux下面运行一个用VirtualBox虚拟的Windows，VirtualBox会占用很多很多CPU资源，把本本双核的一个核占满是经常的事情，弄得风扇非常可怜 虽然VirtualBox有暂停功能，不过暂停之后在虚拟机下面运行的程序也被暂停了，并不方便。终于，我决定要只分给VirutalBox可怜的CPU资源 Linux下有一个叫做cpulimit(Link)的工具，可以很方便地限制指定进程的CPU使用率，效果很好。不过，简单地用它限制VirtualBox的CPU使用率之后，虚拟机会工作会很迟钝，甚至播放一段音乐都会断断续续。 Windows下面有一个选项，可以选择把系统资源优先分配给前台程序或者是后台服务，默认是前台程序。这个设置效果明显，比如同时运行两个7-Zip的Benchmark的话，处于前台的程序会有更好的结果： 在Linux下就不一样了，并没有这样根据前台和后台而做的动态调整，尤其在图形界面下。不过既然Linux rocks，没有什么不可以 ;-) 。我决定设置成使用VirtualBox的时候不限制它的CPU使用率，只在我不使用VirtualBox的时候加以限制。 做到这些首先要解决的问题是，在Linux图形界面下如何知道我是不是正在使用VirtualBox。这个问题又涉及到如何得知目前处于前台的窗口是什么。对于后者，比较好的做法是： xprop -root _NET_ACTIVE_WINDOW 这条命令会返回当前处于前台的窗口的Window ID，接着可以使用xprop -id &#60;id&#62;查询该窗口的详细信息，通过检查Window Class或者标题就可以知道这个窗口是不是VirtualBox了。 知道这些其实已经可以很容易做出来一个针对VirtualBox的动态CPU限制脚本了，可是我还想把它扩展到其他程序。对于一个运行的程序，有唯一的一个Process ID，如果可以知道一个窗口是属于哪一个进程的就比较好办了，幸运的是这也是很容易的： xprop -id ${window_id} _NET_WM_PID 会返回指定Windows ID窗口所属的Process ID。 剩下的工作就很容易了～ 下面是我正在使用的脚本，传入Process ID和一个CPU使用率数值（0到100）就可以对指定进程动态进行限制了 这段脚本考虑到了被重复执行以及待监视进程中途退出的情况，都可以正确地处理： #!/bin/sh if &#91; $# -lt 2 &#93;; then echo &#34;Usage: ${0} process_id cpu_limit_value&#34; else if &#91; $&#40;ps -o args -C `basename ${0}` &#124; fgrep [...]]]></description> <content:encoded><![CDATA[<p><img
class="alignright size-full wp-image-169 frame" title="vbox_cpulimit" src="http://lihdd.net/wp-content/uploads/2009/06/vbox_cpulimit.png" alt="vbox_cpulimit" width="96" height="96" />夏天，除了蚊子产生的嗡嗡声，可能就是本本风扇产生的噪声最令人反感了。</p><p>我习惯于在Linux下面运行一个用VirtualBox虚拟的Windows，VirtualBox会占用很多很多CPU资源，把本本双核的一个核占满是经常的事情，弄得风扇非常可怜 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_neutral.gif' alt=':-|' class='wp-smiley' /> 虽然VirtualBox有暂停功能，不过暂停之后在虚拟机下面运行的程序也被暂停了，并不方便。终于，我决定要只分给VirutalBox可怜的CPU资源 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_evil.gif' alt=':evil:' class='wp-smiley' /> <span
id="more-168"></span></p><p>Linux下有一个叫做cpulimit(<a
title="CPU limit" href="http://cpulimit.sourceforge.net/" target="_blank">Link</a>)的工具，可以很方便地限制指定进程的CPU使用率，效果很好。不过，简单地用它限制VirtualBox的CPU使用率之后，虚拟机会工作会很迟钝，甚至播放一段音乐都会断断续续。</p><p>Windows下面有一个选项，可以选择把系统资源优先分配给前台程序或者是后台服务，默认是前台程序。这个设置效果明显，比如同时运行两个7-Zip的Benchmark的话，处于前台的程序会有更好的结果：</p><div
id="attachment_170" class="wp-caption aligncenter" style="width: 480px"><img
class="size-full wp-image-170" title="7zip_benchmarks" src="http://lihdd.net/wp-content/uploads/2009/06/7zip_benchmarks.PNG" alt="7-Zip Benchmarks" width="470" height="355" /><p
class="wp-caption-text">7-Zip Benchmarks</p></div><p>在Linux下就不一样了，并没有这样根据前台和后台而做的动态调整，尤其在图形界面下。不过既然Linux rocks，没有什么不可以 ;-) 。我决定设置成使用VirtualBox的时候不限制它的CPU使用率，只在我不使用VirtualBox的时候加以限制。</p><p>做到这些首先要解决的问题是，在Linux图形界面下如何知道我是不是正在使用VirtualBox。这个问题又涉及到如何得知目前处于前台的窗口是什么。对于后者，比较好的做法是：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">xprop <span style="color: #660033;">-root</span> _NET_ACTIVE_WINDOW</pre></div></div><p>这条命令会返回当前处于前台的窗口的Window ID，接着可以使用xprop -id <em>&lt;id&gt;</em>查询该窗口的详细信息，通过检查Window Class或者标题就可以知道这个窗口是不是VirtualBox了。</p><p>知道这些其实已经可以很容易做出来一个针对VirtualBox的动态CPU限制脚本了，可是我还想把它扩展到其他程序。对于一个运行的程序，有唯一的一个Process ID，如果可以知道一个窗口是属于哪一个进程的就比较好办了，幸运的是这也是很容易的：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;">xprop <span style="color: #660033;">-id</span> <span style="color: #800000;">${window_id}</span> _NET_WM_PID</pre></div></div><p>会返回指定Windows ID窗口所属的Process ID。</p><p>剩下的工作就很容易了～<br
/> 下面是我正在使用的脚本，传入Process ID和一个CPU使用率数值（0到100）就可以对指定进程动态进行限制了 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /><br
/> 这段脚本考虑到了被重复执行以及待监视进程中途退出的情况，都可以正确地处理：</p><div
class="wp_syntax"><div
class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/sh</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$#</span> <span style="color: #660033;">-lt</span> <span style="color: #000000;">2</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Usage: <span style="color: #007800;">${0}</span> process_id cpu_limit_value&quot;</span>
<span style="color: #000000; font-weight: bold;">else</span>
	<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> $<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #c20cb9; font-weight: bold;">ps</span> <span style="color: #660033;">-o</span> args <span style="color: #660033;">-C</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">basename</span> <span style="color: #800000;">${0}</span><span style="color: #000000; font-weight: bold;">`</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">fgrep</span> <span style="color: #800000;">${1}</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> -l<span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #660033;">-gt</span> <span style="color: #000000;">2</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">&amp;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null; <span style="color: #000000; font-weight: bold;">then</span>
		<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Process &quot;</span><span style="color: #800000;">${1}</span><span style="color: #ff0000;">&quot; is already under control.&quot;</span>
		<span style="color: #c20cb9; font-weight: bold;">false</span>
	<span style="color: #000000; font-weight: bold;">else</span>
		<span style="color: #666666; font-style: italic;"># limit = 1 when cpulimit is running, otherwise 0</span>
		<span style="color: #007800;">limit</span>=<span style="color: #000000;">0</span>
		<span style="color: #666666; font-style: italic;"># only perform checking when target process is running</span>
		<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-d</span> <span style="color: #000000; font-weight: bold;">/</span>proc<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${1}</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">do</span>
			<span style="color: #007800;">wid</span>=<span style="color: #000000; font-weight: bold;">`</span>xprop <span style="color: #660033;">-root</span> _NET_ACTIVE_WINDOW <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/.* # //'</span><span style="color: #000000; font-weight: bold;">`</span>
			<span style="color: #007800;">pid</span>=<span style="color: #000000; font-weight: bold;">`</span>xprop <span style="color: #660033;">-id</span> <span style="color: #800000;">${wid}</span> _NET_WM_PID <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #ff0000;">'s/.* = //'</span><span style="color: #000000; font-weight: bold;">`</span>
			<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">${pid}</span>&quot;</span> = <span style="color: #ff0000;">&quot;<span style="color: #007800;">${1}</span>&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
				<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$limit</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
					<span style="color: #666666; font-style: italic;"># target process window is actived, stop cpulimit</span>
					<span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #7a0874; font-weight: bold;">jobs</span> -p<span style="color: #000000; font-weight: bold;">`</span>
					<span style="color: #007800;">limit</span>=<span style="color: #000000;">0</span>
				<span style="color: #000000; font-weight: bold;">fi</span>
			<span style="color: #000000; font-weight: bold;">elif</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$limit</span> <span style="color: #660033;">-eq</span> <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
				<span style="color: #666666; font-style: italic;"># target process window is unactived, start cpulimit</span>
				cpulimit <span style="color: #660033;">-p</span> <span style="color: #800000;">${1}</span> <span style="color: #660033;">-l</span> <span style="color: #800000;">${2}</span> <span style="color: #660033;">-z</span> <span style="color: #000000; font-weight: bold;">&amp;&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">&amp;</span>
				<span style="color: #007800;">limit</span>=<span style="color: #000000;">1</span>
			<span style="color: #000000; font-weight: bold;">fi</span>
			<span style="color: #c20cb9; font-weight: bold;">sleep</span> <span style="color: #000000;">5</span>
		<span style="color: #000000; font-weight: bold;">done</span>
	<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></div></div><p>被这个脚本监视VirtualBox运行之后，我很高兴地听到了断断续续的Windows启动声 <img
src='http://lihdd.net/wp-includes/images/smilies/icon_razz.gif' alt=':-P' class='wp-smiley' /> 。经过这样处理后效果比较明显，风扇转得再也不如以前那样疯狂了 :-)</p> ]]></content:encoded> <wfw:commentRss>http://lihdd.net/limit-virtualbox-cpu-resource-dynamically/feed/</wfw:commentRss> <slash:comments>5</slash:comments> </item> </channel> </rss>
<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Minified using disk: basic
Page Caching using disk: enhanced

Served from: lihdd.net @ 2012-05-19 14:15:06 -->
