<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss 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/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>lazyTechnology</title>
	
	<link>http://blog.lazytech.info</link>
	<description>A lazy man's grotto...</description>
	<lastBuildDate>Fri, 11 Jun 2010 08:31:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/Lazytechnology" /><feedburner:info uri="lazytechnology" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>终于把Apache2从我的VPS上停掉了</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/6Hv_J633GBE/</link>
		<comments>http://blog.lazytech.info/2010/02/21/%e7%bb%88%e4%ba%8e%e6%8a%8aapache2%e4%bb%8e%e6%88%91%e7%9a%84vps%e4%b8%8a%e5%81%9c%e6%8e%89%e4%ba%86/#comments</comments>
		<pubDate>Sun, 21 Feb 2010 04:15:34 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Gentoo]]></category>
		<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>
		<category><![CDATA[apache]]></category>
		<category><![CDATA[nginx]]></category>
		<category><![CDATA[php-fpm]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=227</guid>
		<description><![CDATA[折腾了一个上午，终于把我的 VPS 上的 Apache 跑着的相关服务，都切换到 Nginx 上了：
1. Blog 用的是 Wordpress，原先是用 mod_php 跑着的，现在则换成了 php-fpm
2. Wiki 用的是 Trac，原先是用的 mod_python，现在用 tracd 直接起来，然后 Nginx 转发
3. Git 前端用的是 Gitweb，因为懒得再启一个 spawn-fcgi 了，所以干脆换成 GitPHP，同样通过 php-fpm 的方式跑着
4. Zotero 的 WebDAV 存储，由于好久都不用，直接停了，有时间再看看有没有什么轻便的替代方案吧
PS1：关于 Gentoo 上的 php-fpm 配置，见 http://bugs.gentoo.org/show_bug.cgi?id=208155 及 http://bugs.gentoo.org/show_bug.cgi?id=301279
PS2：关于 Nginx 跑 Wordpress 的 Permalink 设置，可以参考 http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/


Related posts:迁移完工～
优化了下自己的博客
升级



Related posts:<ol><li><a href='http://blog.lazytech.info/2008/02/20/moved/' rel='bookmark' title='Permanent Link: 迁移完工～'>迁移完工～</a></li>
<li><a href='http://blog.lazytech.info/2008/02/23/optimized-my-blog/' rel='bookmark' title='Permanent Link: 优化了下自己的博客'>优化了下自己的博客</a></li>
<li><a href='http://blog.lazytech.info/2008/03/31/upgrade/' rel='bookmark' title='Permanent Link: 升级'>升级</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>折腾了一个上午，终于把我的 VPS 上的 Apache 跑着的相关服务，都切换到 Nginx 上了：<br />
1. Blog 用的是 Wordpress，原先是用 mod_php 跑着的，现在则换成了 <a href="http://php-fpm.org/">php-fpm</a><br />
2. Wiki 用的是 Trac，原先是用的 mod_python，现在用 tracd 直接起来，然后 Nginx 转发<br />
3. Git 前端用的是 <a href="http://git.wiki.kernel.org/index.php/Gitweb">Gitweb</a>，因为懒得再启一个 spawn-fcgi 了，所以干脆换成 <a href="http://www.xiphux.com/programming/php/gitphp/">GitPHP</a>，同样通过 <a href="http://php-fpm.org/">php-fpm</a> 的方式跑着<br />
4. <a href="http://www.zotero.org/">Zotero</a> 的 WebDAV 存储，由于好久都不用，直接停了，有时间再看看有没有什么轻便的替代方案吧</p>
<p>PS1：关于 Gentoo 上的 <a href="http://php-fpm.org/">php-fpm</a> 配置，见 <a href="http://bugs.gentoo.org/show_bug.cgi?id=208155">http://bugs.gentoo.org/show_bug.cgi?id=208155</a> 及 <a href="http://bugs.gentoo.org/show_bug.cgi?id=301279">http://bugs.gentoo.org/show_bug.cgi?id=301279</a><br />
PS2：关于 Nginx 跑 Wordpress 的 Permalink 设置，可以参考 <a href="http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/">http://blog.sjinks.pro/wordpress-plugins/nginx-compatibility/</a></p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2008/02/20/moved/' rel='bookmark' title='Permanent Link: 迁移完工～'>迁移完工～</a></li>
<li><a href='http://blog.lazytech.info/2008/02/23/optimized-my-blog/' rel='bookmark' title='Permanent Link: 优化了下自己的博客'>优化了下自己的博客</a></li>
<li><a href='http://blog.lazytech.info/2008/03/31/upgrade/' rel='bookmark' title='Permanent Link: 升级'>升级</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/6Hv_J633GBE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2010/02/21/%e7%bb%88%e4%ba%8e%e6%8a%8aapache2%e4%bb%8e%e6%88%91%e7%9a%84vps%e4%b8%8a%e5%81%9c%e6%8e%89%e4%ba%86/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2010/02/21/%e7%bb%88%e4%ba%8e%e6%8a%8aapache2%e4%bb%8e%e6%88%91%e7%9a%84vps%e4%b8%8a%e5%81%9c%e6%8e%89%e4%ba%86/</feedburner:origLink></item>
		<item>
		<title>果然还是把复杂问题简单化比较爽啊</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/C1kEltHK1TQ/</link>
		<comments>http://blog.lazytech.info/2009/09/16/%e6%9e%9c%e7%84%b6%e8%bf%98%e6%98%af%e6%8a%8a%e5%a4%8d%e6%9d%82%e9%97%ae%e9%a2%98%e7%ae%80%e5%8d%95%e5%8c%96%e6%af%94%e8%be%83%e7%88%bd%e5%95%8a/#comments</comments>
		<pubDate>Wed, 16 Sep 2009 07:17:23 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Python]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=205</guid>
		<description><![CDATA[事情的起因是这样子的，小员在写一个测试工具，主要是管理 Xvfb 和 Selenium Server，启动多个 Server 来并行跑多个测试用例，出错的时候截图生成报告。
然后开发人员的测试代码是这么写的：

?View Code PYTHON1
2
def setUP&#40;self&#41;:
    self.selenium = selenium&#40;host, port, &#34;*firefox&#34;, &#34;http://xxx.yyy.zzz:1234/&#34;&#41;

这里的 host 和 port 在测试用例里是写死的，而在这个测试工具中，由于启动的 Selenium Server 的端口是随机绑定的，所以需要自动的把测试用例里的连接修改成对应的参数。
我俩讨论了下，决定用 decorator 来改掉 selenium 的构造函数，然后有了以下关键部分的代码：

?View Code PYTHON1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
def change_selenium_params&#40;host, port, browser='', baseURL=''&#41;:
    def inner&#40;func&#41;:
        def wrapper&#40;*kargs, **kwargs&#41;:
     [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>事情的起因是这样子的，<a href="http://blog.xupeng.me">小员</a>在写一个测试工具，主要是管理 Xvfb 和 Selenium Server，启动多个 Server 来并行跑多个测试用例，出错的时候截图生成报告。<br />
然后开发人员的测试代码是这么写的：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code9'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p2059"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p205code9"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> setUP<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    <span style="color: #008000;">self</span>.<span style="color: black;">selenium</span> = selenium<span style="color: black;">&#40;</span>host, port, <span style="color: #483d8b;">&quot;*firefox&quot;</span>, <span style="color: #483d8b;">&quot;http://xxx.yyy.zzz:1234/&quot;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这里的 host 和 port 在测试用例里是写死的，而在这个测试工具中，由于启动的 Selenium Server 的端口是随机绑定的，所以需要自动的把测试用例里的连接修改成对应的参数。<br />
我俩讨论了下，决定用 decorator 来改掉 selenium 的构造函数，然后有了以下关键部分的代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code10'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20510"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
</pre></td><td class="code" id="p205code10"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> change_selenium_params<span style="color: black;">&#40;</span>host, port, browser=<span style="color: #483d8b;">''</span>, baseURL=<span style="color: #483d8b;">''</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> inner<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
            kargs = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>kargs<span style="color: black;">&#41;</span>
            kargs<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span> = host, port
            <span style="color: #ff7700;font-weight:bold;">return</span> func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
    <span style="color: #ff7700;font-weight:bold;">return</span> inner
&nbsp;
@stop_servers
<span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    Run testcases
    &quot;&quot;&quot;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">xvfb</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">selenium_server</span> = serverctl.<span style="color: black;">SeleniumServer</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">xvfb</span>.<span style="color: black;">display</span><span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">selenium_server</span>.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">for</span> testcase_file <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">testcases_status</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'waiting'</span><span style="color: black;">&#93;</span>:
        selenium.<span style="color: black;">selenium</span>._init_ = change_selenium_params<span style="color: black;">&#40;</span><span style="color: #483d8b;">'localhost'</span>, <span style="color: #008000;">self</span>.<span style="color: black;">selenium_server</span>.<span style="color: black;">port</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>selenium.<span style="color: black;">selenium</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #808080; font-style: italic;"># Make testsuite and run it here</span>
        ......
&nbsp;
        <span style="color: #008000;">self</span>.<span style="color: black;">selenium_server</span>.<span style="color: black;">restart</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #008000;">self</span>.<span style="color: black;">selenium_server</span>.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">xvfb</span>.<span style="color: black;">stop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>由于 Selenium 关闭 Firefox 有 Bug，所以不得不每跑一个 testsuite 就重启一次 Selenium Server，这时候发现 testsuite 用的还是第一次传过去的端口。结果看起来奇怪，这个问题还和其它混在一起了，而且这玩意比较难跟踪，调试器也不好用，于是乎，我们写了个简化版的原型来分析，代码如下：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code11'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20511"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p205code11"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> Selenium:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, port<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Port:'</span>, port
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> change_port<span style="color: black;">&#40;</span>port<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> inner<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
            kargs = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>kargs<span style="color: black;">&#41;</span>
            kargs<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = port
            <span style="color: #ff7700;font-weight:bold;">return</span> func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
    <span style="color: #ff7700;font-weight:bold;">return</span> inner
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
    Selenium.<span style="color: #0000cd;">__init__</span> = change_port<span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>Selenium.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#41;</span>
    a = Selenium<span style="color: black;">&#40;</span><span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这时候的输出是：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code12'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20512"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p205code12"><pre class="text" style="font-family:monospace;">Port: 0
Port: 0
Port: 0</pre></td></tr></table></div>

<p>然后在 decorator 里加了条输出语句：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code13'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20513"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p205code13"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> change_port<span style="color: black;">&#40;</span>port<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> inner<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
            kargs = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>kargs<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Change port:'</span>, port  <span style="color: #808080; font-style: italic;"># Add a debug output.</span>
            kargs<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = port
            <span style="color: #ff7700;font-weight:bold;">return</span> func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
    <span style="color: #ff7700;font-weight:bold;">return</span> inner</pre></td></tr></table></div>

<p>这时候的输出是：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code14'); return false;">View Code</a> TEXT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20514"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
</pre></td><td class="code" id="p205code14"><pre class="text" style="font-family:monospace;">Change port: 0
Port: 0
Change port: 1
Change port: 0
Port: 0
Change port: 2
Change port: 1
Change port: 0
Port: 0</pre></td></tr></table></div>

<p>这下终于知道问题所在了，可怜的 A.__init__ 函数每次执行都多被套一层 decorator，到了最后就变成了：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code15'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20515"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p205code15"><pre class="python" style="font-family:monospace;">change_port<span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>change_port<span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>change_port<span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>A.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>嗯，用个临时变量先把初始的 A.__init__ 保存起来就 OK 了，比如：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p205code16'); return false;">View Code</a> PYTHON</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p20516"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
</pre></td><td class="code" id="p205code16"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">class</span> A:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, port<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Port:'</span>, port
&nbsp;
orig_func = A.<span style="color: #0000cd;">__init__</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> change_port<span style="color: black;">&#40;</span>port<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> inner<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">def</span> wrapper<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>:
            kargs = <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>kargs<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Change port:'</span>, port  <span style="color: #808080; font-style: italic;"># Add a debug output.</span>
            kargs<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span> = port
            <span style="color: #ff7700;font-weight:bold;">return</span> func<span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>kargs, <span style="color: #66cc66;">**</span>kwargs<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> wrapper
    <span style="color: #ff7700;font-weight:bold;">return</span> inner
&nbsp;
<span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>:
    A.<span style="color: #0000cd;">__init__</span> = orig_func
    A.<span style="color: #0000cd;">__init__</span> = change_port<span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span><span style="color: black;">&#40;</span>A.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#41;</span>
    a = A<span style="color: black;">&#40;</span><span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>



<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/C1kEltHK1TQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/09/16/%e6%9e%9c%e7%84%b6%e8%bf%98%e6%98%af%e6%8a%8a%e5%a4%8d%e6%9d%82%e9%97%ae%e9%a2%98%e7%ae%80%e5%8d%95%e5%8c%96%e6%af%94%e8%be%83%e7%88%bd%e5%95%8a/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/09/16/%e6%9e%9c%e7%84%b6%e8%bf%98%e6%98%af%e6%8a%8a%e5%a4%8d%e6%9d%82%e9%97%ae%e9%a2%98%e7%ae%80%e5%8d%95%e5%8c%96%e6%af%94%e8%be%83%e7%88%bd%e5%95%8a/</feedburner:origLink></item>
		<item>
		<title>发发牢骚…</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/3tAYCpYNiL8/</link>
		<comments>http://blog.lazytech.info/2009/08/23/%e5%8f%91%e5%8f%91%e7%89%a2%e9%aa%9a/#comments</comments>
		<pubDate>Sun, 23 Aug 2009 09:34:02 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Essay]]></category>
		<category><![CDATA[Android]]></category>
		<category><![CDATA[Google]]></category>
		<category><![CDATA[MacOSX]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=201</guid>
		<description><![CDATA[有时候真的怀疑本应是明年的本命年提前过了，毕竟这一年下来，真的是没什么顺心的事情。被妹子发卡就不说了，毕竟感情的事不是努力就能成的，也只能无可奈何的等伤口慢慢恢复了&#8230;
之后过了段时间，由于一些个人原因，辞职宅宿舍了，结果又遇到搞笑的事情。投了家新加坡的创业公司，一开始觉得他们做的东西蛮有意思的，而且还可以异地办公，这样我就可以迁移杭州了。于是和他们作了个 Skype 的面试，说是接下来安排个小项目来试试看。嗯，过了好几天，没动静，发邮件催了下，说是很抱歉，最近比较忙，所以要我再等几天。在这之后就是漫长的等待，IM 上和他们讨论了几次服务器的性能问题，还帮他们弄优化方案的原型，每次聊完总是说让我等那个测试项目。最近更牛掰了，干脆 IM 和 Email 都不回复了&#8230; 我都无语了，哥们，你要是不招直说啊，每次都说再等等啥意思呢，要么像现在这样子干脆不回复也成啊。反正啊，是又被忽悠了，想想自个中途还拒了网易的 offer，真是无愧傻多这称号啊&#8230;
然后最近看到谷歌宣布 Android 谷歌拼音输入法发布，支持用户词典同步功能，觉得挺不错的。翻了下 Android 的代码仓库，有 PinyinIME 的源代码，于是开始动手移植到 Mac 上，想着如果我 Windows 下也用谷歌拼音的话，两边的词库能同步，挺方便的。结果把原型搞出来后，非常沮丧的发现：
1. 目前的 Android 仓库上的 PinyinIME 源代码里没有网络词库同步的实现&#8230;
2. 就算网络词库同步以后加进去了，但是&#8230; Android 版本的词库同步和 PC 版本的是独立的，没法共享&#8230;
3. Android 版本的词库格式和 PC 版本的不兼容，工程里生成的那 1M 大小的词库实在是太寒碜了，还没法拷 PC 版的来用&#8230;
目前的原型继续完善下去感觉也没有必要了，毕竟一开始就是奔着词库同步的优点才动手的，还是老老实实用付费的 QIM 吧&#8230;
顺手放个截图缅怀下这个夭折的原型&#8230;

也许最近唯一还值得欣慰的就是，笑来兄的《TOEFL核心词汇21天突破》还有坚持每天在背，虽然进度很慢就是了&#8230;


No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>有时候真的怀疑本应是明年的本命年提前过了，毕竟这一年下来，真的是没什么顺心的事情。被妹子发卡就不说了，毕竟感情的事不是努力就能成的，也只能无可奈何的等伤口慢慢恢复了&#8230;</p>
<p>之后过了段时间，由于一些个人原因，辞职宅宿舍了，结果又遇到搞笑的事情。投了家新加坡的创业公司，一开始觉得他们做的东西蛮有意思的，而且还可以异地办公，这样我就可以迁移杭州了。于是和他们作了个 Skype 的面试，说是接下来安排个小项目来试试看。嗯，过了好几天，没动静，发邮件催了下，说是很抱歉，最近比较忙，所以要我再等几天。在这之后就是漫长的等待，IM 上和他们讨论了几次服务器的性能问题，还帮他们弄优化方案的原型，每次聊完总是说让我等那个测试项目。最近更牛掰了，干脆 IM 和 Email 都不回复了&#8230; 我都无语了，哥们，你要是不招直说啊，每次都说再等等啥意思呢，要么像现在这样子干脆不回复也成啊。反正啊，是又被忽悠了，想想自个中途还拒了网易的 offer，真是无愧傻多这称号啊&#8230;</p>
<p>然后最近看到谷歌宣布 <a href="http://googlechinablog.com/2009/08/android_14.html">Android 谷歌拼音输入法发布</a>，支持用户词典同步功能，觉得挺不错的。翻了下 Android 的代码仓库，有 <a href="http://android.git.kernel.org/?p=platform/packages/inputmethods/PinyinIME.git;a=summary">PinyinIME</a> 的源代码，于是开始动手移植到 Mac 上，想着如果我 Windows 下也用谷歌拼音的话，两边的词库能同步，挺方便的。结果把原型搞出来后，非常沮丧的发现：<br />
1. 目前的 Android 仓库上的 PinyinIME 源代码里没有网络词库同步的实现&#8230;<br />
2. 就算网络词库同步以后加进去了，但是&#8230; Android 版本的词库同步和 PC 版本的是独立的，没法共享&#8230;<br />
3. Android 版本的词库格式和 PC 版本的不兼容，工程里生成的那 1M 大小的词库实在是太寒碜了，还没法拷 PC 版的来用&#8230;<br />
目前的原型继续完善下去感觉也没有必要了，毕竟一开始就是奔着词库同步的优点才动手的，还是老老实实用付费的 <a href="http://glider.ismac.cn/RegQIME.html">QIM</a> 吧&#8230;<br />
顺手放个截图缅怀下这个夭折的原型&#8230;<br />
<img src='http://blog.lazytech.info/wp-content/gallery/apple/fakegou.png' alt='fakegou' class='ngg-singlepic ngg-none' /></p>
<p>也许最近唯一还值得欣慰的就是，笑来兄的<a href="http://www.douban.com/subject/1243271/">《TOEFL核心词汇21天突破》</a>还有坚持每天在背，虽然进度很慢就是了&#8230;</p>


<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/3tAYCpYNiL8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/08/23/%e5%8f%91%e5%8f%91%e7%89%a2%e9%aa%9a/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/08/23/%e5%8f%91%e5%8f%91%e7%89%a2%e9%aa%9a/</feedburner:origLink></item>
		<item>
		<title>Tweetero 翻墙版</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/AuIxVyiF3WY/</link>
		<comments>http://blog.lazytech.info/2009/08/03/tweetero-fuckgfw-version/#comments</comments>
		<pubDate>Mon, 03 Aug 2009 12:14:22 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPhone]]></category>
		<category><![CDATA[fuckgfw]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=191</guid>
		<description><![CDATA[由于在 iPhone 上没找到比较好用的能支持第三方 API 的 Twitter 客户端，只好自己动手给 Tweetero 加了这么个功能来翻墙&#8230;
源码在：http://git.lazytech.info/?p=tweetero.git
Cydia 源：http://cydia.lazytech.info/
截图：

最后来句广告词，翻墙推，俺用 Tweetero fuckgfw version + tweetr proxy (或者 birdnest)  


Related posts:目前的开发环境



Related posts:<ol><li><a href='http://blog.lazytech.info/2008/02/28/my-development-environment/' rel='bookmark' title='Permanent Link: 目前的开发环境'>目前的开发环境</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>由于在 iPhone 上没找到比较好用的能支持第三方 API 的 <a href="http://twitter.com/">Twitter</a> 客户端，只好自己动手给 <a href="http://code.google.com/p/tweetero/">Tweetero</a> 加了这么个功能来翻墙&#8230;<br />
源码在：<a href="http://git.lazytech.info/?p=tweetero.git">http://git.lazytech.info/?p=tweetero.git</a><br />
Cydia 源：<a href="http://cydia.lazytech.info/">http://cydia.lazytech.info/</a><br />
截图：<br />
<img src='http://blog.lazytech.info/wp-content/gallery/iphone/tweetero.png' alt='tweetero' class='ngg-singlepic ngg-none' /><br />
最后来句广告词，翻墙推，俺用 <a href="http://git.lazytech.info/?p=tweetero.git;a=shortlog;h=refs/heads/fuckgfw">Tweetero fuckgfw version</a> + <a href="http://code.google.com/p/tweetr/">tweetr proxy</a> (或者 <a href="http://nest.onedd.net/">birdnest</a>) <img src='http://blog.lazytech.info/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> </p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2008/02/28/my-development-environment/' rel='bookmark' title='Permanent Link: 目前的开发环境'>目前的开发环境</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/AuIxVyiF3WY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/08/03/tweetero-fuckgfw-version/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/08/03/tweetero-fuckgfw-version/</feedburner:origLink></item>
		<item>
		<title>通过 headless Mozilla 取得 DOM 的 CSS 属性</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/FwABzaLVhaE/</link>
		<comments>http://blog.lazytech.info/2009/07/10/get-dom-css-properties-by-using-headless-mozilla/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 06:46:51 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[headless]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=178</guid>
		<description><![CDATA[项目地址在：http://git.lazytech.info/?p=dom-traversal.git
简单来说，这个程序通过 headless Mozilla back-end，可以不依赖 X 环境运行，输出指定网页的 DOM 节点及其 CSS 属性。
关于 headless Mozilla 的介绍见：http://chrislord.net/files/fosdem-09-slides.odp
如何编译见 Wiki：http://center.lazytech.info/wiki/OffscreenMozilla，http://center.lazytech.info/wiki/DOMTraversal
程序关于 www.google.com 的输出片段：

?View Code CSS1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
&#60;html&#62; Style:
html, div, map, dt, isindex, form &#123; display: block; &#125;
    &#60;head&#62; Style:
    area, base, basefont, head, meta, script, style, title, noembed, param &#123; display: none; &#125;
      [...]


Related posts:<ol><li><a href='http://blog.lazytech.info/2006/02/02/mozilla-%e7%9a%84%e4%b8%80%e4%b8%aa-hello-world-%e7%9a%84%e4%be%8b%e5%ad%90/' rel='bookmark' title='Permanent Link: Mozilla 的一个 hello world 的例子'>Mozilla 的一个 hello world 的例子</a></li>
<li><a href='http://blog.lazytech.info/2008/03/17/python-captcha/' rel='bookmark' title='Permanent Link: Python解析验证码'>Python解析验证码</a></li>
<li><a href='http://blog.lazytech.info/2006/11/04/%e7%9b%ae%e5%89%8d%e7%9a%84%e8%bf%9b%e5%b1%95mozilla-plugin/' rel='bookmark' title='Permanent Link: 目前的进展(Mozilla Plugin)'>目前的进展(Mozilla Plugin)</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>项目地址在：<a href="http://git.lazytech.info/?p=dom-traversal.git">http://git.lazytech.info/?p=dom-traversal.git</a><br />
简单来说，这个程序通过 headless Mozilla back-end，可以不依赖 X 环境运行，输出指定网页的 DOM 节点及其 CSS 属性。</p>
<p>关于 headless Mozilla 的介绍见：<a href="http://chrislord.net/files/fosdem-09-slides.odp">http://chrislord.net/files/fosdem-09-slides.odp</a><br />
如何编译见 Wiki：<a href="http://center.lazytech.info/wiki/OffscreenMozilla">http://center.lazytech.info/wiki/OffscreenMozilla</a>，<a href="http://center.lazytech.info/wiki/DOMTraversal">http://center.lazytech.info/wiki/DOMTraversal</a></p>
<p>程序关于 www.google.com 的输出片段：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p178code18'); return false;">View Code</a> CSS</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p17818"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
</pre></td><td class="code" id="p178code18"><pre class="css" style="font-family:monospace;">&lt;html<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
html<span style="color: #00AA00;">,</span> div<span style="color: #00AA00;">,</span> map<span style="color: #00AA00;">,</span> dt<span style="color: #00AA00;">,</span> isindex<span style="color: #00AA00;">,</span> form <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
    &lt;head<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
    area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;meta<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;title<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;script<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;style<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;script<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;style<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;style<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        area<span style="color: #00AA00;">,</span> base<span style="color: #00AA00;">,</span> basefont<span style="color: #00AA00;">,</span> head<span style="color: #00AA00;">,</span> meta<span style="color: #00AA00;">,</span> script<span style="color: #00AA00;">,</span> style<span style="color: #00AA00;">,</span> title<span style="color: #00AA00;">,</span> noembed<span style="color: #00AA00;">,</span> param <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
    &lt;body<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
    body <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">8px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
    body<span style="color: #00AA00;">,</span> td<span style="color: #00AA00;">,</span> a<span style="color: #00AA00;">,</span> p<span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.h</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-family</span><span style="color: #00AA00;">:</span> arial<span style="color: #00AA00;">,</span><span style="color: #993333;">sans-serif</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;textarea<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
        textarea <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">margin</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> <span style="color: #933;">0pt</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #993333;">inset</span> threedface<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">background-color</span><span style="color: #00AA00;">:</span> -moz-field<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">color</span><span style="color: #00AA00;">:</span> -moz-fieldtext<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">font</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">medium</span> -moz-<span style="color: #993333;">fixed</span><span style="color: #00AA00;">;</span> text-rendering<span style="color: #00AA00;">:</span> optimizelegibility<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">text-align</span><span style="color: #00AA00;">:</span> start<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">text-transform</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">word-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">letter-spacing</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">normal</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> text-<span style="color: #000000; font-weight: bold;">bottom</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">cursor</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">text</span><span style="color: #00AA00;">;</span> -moz-binding<span style="color: #00AA00;">:</span> <span style="color: #993333;">url</span><span style="color: #00AA00;">&#40;</span><span style="color: #ff0000;">&quot;chrome://global/content/platformHTMLBindings.xml#textAreas&quot;</span><span style="color: #00AA00;">&#41;</span><span style="color: #00AA00;">;</span> -moz-appearance<span style="color: #00AA00;">:</span> textfield-multiline<span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">text-indent</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0pt</span><span style="color: #00AA00;">;</span> -moz-user-select<span style="color: #00AA00;">:</span> <span style="color: #993333;">text</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">text-shadow</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span> word-wrap<span style="color: #00AA00;">:</span> break-word<span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        input<span style="color: #3333ff;">:-moz-read-write</span><span style="color: #00AA00;">,</span> textarea<span style="color: #3333ff;">:-moz-read-write </span><span style="color: #00AA00;">&#123;</span> -moz-user-modify<span style="color: #00AA00;">:</span> read-write ! important<span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;iframe<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">none</span><span style="color: #00AA00;">;</span>
        iframe <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">border</span><span style="color: #00AA00;">:</span> <span style="color: #933;">2px</span> <span style="color: #993333;">inset</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        &lt;div<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
        html<span style="color: #00AA00;">,</span> div<span style="color: #00AA00;">,</span> map<span style="color: #00AA00;">,</span> dt<span style="color: #00AA00;">,</span> isindex<span style="color: #00AA00;">,</span> form <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">display</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">block</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#gbar</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">22px</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#gbar</span><span style="color: #00AA00;">,</span> <span style="color: #cc00cc;">#guser</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-size</span><span style="color: #00AA00;">:</span> <span style="color: #933;">13px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">padding-top</span><span style="color: #00AA00;">:</span> <span style="color: #933;">1px</span> ! important<span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
        <span style="color: #cc00cc;">#gbar</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">float</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">left</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
            &lt;nobr<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
            nobr <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">white-space</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">nowrap</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
                &lt;b<span style="color: #00AA00;">&gt;</span> Style<span style="color: #00AA00;">:</span>
                b<span style="color: #00AA00;">,</span> strong <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">font-weight</span><span style="color: #00AA00;">:</span> <span style="color: #993333;">bolder</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
                <span style="color: #6666ff;">.gb1</span><span style="color: #00AA00;">,</span> <span style="color: #6666ff;">.gb3</span> <span style="color: #00AA00;">&#123;</span> <span style="color: #000000; font-weight: bold;">height</span><span style="color: #00AA00;">:</span> <span style="color: #933;">22px</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">margin-right</span><span style="color: #00AA00;">:</span> <span style="color: #933;">0.5em</span><span style="color: #00AA00;">;</span> <span style="color: #000000; font-weight: bold;">vertical-align</span><span style="color: #00AA00;">:</span> <span style="color: #000000; font-weight: bold;">top</span><span style="color: #00AA00;">;</span> <span style="color: #00AA00;">&#125;</span>
&nbsp;
......</pre></td></tr></table></div>

<p>跑起来的内存占用大概是 20M 左右，要想降低内存使用量的话，估计只能单独把 Mozilla 的 DOM 和 Layout 部分抽出来重新实现才行了&#8230;</p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2006/02/02/mozilla-%e7%9a%84%e4%b8%80%e4%b8%aa-hello-world-%e7%9a%84%e4%be%8b%e5%ad%90/' rel='bookmark' title='Permanent Link: Mozilla 的一个 hello world 的例子'>Mozilla 的一个 hello world 的例子</a></li>
<li><a href='http://blog.lazytech.info/2008/03/17/python-captcha/' rel='bookmark' title='Permanent Link: Python解析验证码'>Python解析验证码</a></li>
<li><a href='http://blog.lazytech.info/2006/11/04/%e7%9b%ae%e5%89%8d%e7%9a%84%e8%bf%9b%e5%b1%95mozilla-plugin/' rel='bookmark' title='Permanent Link: 目前的进展(Mozilla Plugin)'>目前的进展(Mozilla Plugin)</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/FwABzaLVhaE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/07/10/get-dom-css-properties-by-using-headless-mozilla/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/07/10/get-dom-css-properties-by-using-headless-mozilla/</feedburner:origLink></item>
		<item>
		<title>我日 GFW</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/TkygVJ7bXHs/</link>
		<comments>http://blog.lazytech.info/2009/06/25/fuck-gfw/#comments</comments>
		<pubDate>Thu, 25 Jun 2009 07:25:43 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[GFW]]></category>
		<category><![CDATA[OpenVPN]]></category>
		<category><![CDATA[VPN]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=167</guid>
		<description><![CDATA[对于昨晚发生的事件，实在是出离的愤怒了，在这要送出我最真诚的诅咒：做GFW者，其无后乎？
当时 @belltoy 提到 SSH 通道也没法访问 Gmail 了，虽然我这访问没问题，但还是给我提了个醒，必须得多准备一条翻墙的渠道了&#8230;
早上在小员的帮助下，在自己的 VPS 上把 OpenVPN 搭起来了，然后用 TinyProxy 在 VPN 的网段开了个代理，不想改路由的时候就通过内部代理来穿墙。
目前通过 VPN + TinyProxy + Firefox + FoxyProxy 开心翻墙，很好很强大~
PS: OpenVPN 在 Gentoo 系统上的配置见俺的 Wiki：http://center.lazytech.info/wiki/OpenVPNConfiguration


No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<p>对于昨晚发生的事件，实在是出离的愤怒了，在这要送出我最真诚的诅咒：做<a href="http://zh.wikipedia.org/w/index.php?title=GFW">GFW</a>者，其无后乎？<br />
当时 <a href="http://twitter.com/belltoy">@belltoy</a> 提到 SSH 通道也没法访问 Gmail 了，虽然我这访问没问题，但还是给我提了个醒，必须得多准备一条翻墙的渠道了&#8230;<br />
早上在<a href="http://blog.xupeng.me/">小员</a>的帮助下，在自己的 <a href="http://en.wikipedia.org/wiki/Virtual_private_serve">VPS</a> 上把 <a href="http://openvpn.net/">OpenVPN</a> 搭起来了，然后用 <a href="https://www.banu.com/tinyproxy/">TinyProxy</a> 在 <a href="http://en.wikipedia.org/wiki/Virtual_private_network">VPN</a> 的网段开了个代理，不想改路由的时候就通过内部代理来穿墙。<br />
目前通过 <a href="http://en.wikipedia.org/wiki/Virtual_private_network">VPN</a> + <a href="https://www.banu.com/tinyproxy/">TinyProxy</a> + <a href="http://www.mozillaonline.com/">Firefox</a> +<a href="http://foxyproxy.mozdev.org/"> FoxyProxy</a> 开心翻墙，很好很强大~</p>
<p>PS: OpenVPN 在 Gentoo 系统上的配置见俺的 Wiki：<a href="http://center.lazytech.info/wiki/OpenVPNConfiguration">http://center.lazytech.info/wiki/OpenVPNConfiguration</a></p>


<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/TkygVJ7bXHs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/06/25/fuck-gfw/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/06/25/fuck-gfw/</feedburner:origLink></item>
		<item>
		<title>Daily Scripts: djangoat.py (for Linux)</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/8wp00ZnIJ7I/</link>
		<comments>http://blog.lazytech.info/2009/06/19/daily-scripts-djangoat-py-for-linux/#comments</comments>
		<pubDate>Fri, 19 Jun 2009 08:49:57 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Django]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[inotify]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=158</guid>
		<description><![CDATA[Djangoat 其实是 Django Auto Tester 的缩写，不过我更喜欢读作 &#8220;djan-goat&#8221;&#8230; 这个脚本是通过 inotify 来监控 Django 项目目录，当发现文件变化时自动执行单元测试，出错则通过 Mumbles 来提示相关错误。由于用到了 inotify 和 Mumbles，所以目前只能在 Linux 运行，Mac 版的稍后再写个&#8230;
下面是程序代码：

?Download djangoat.py1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
#!/usr/bin/env python
# -*- coding: utf-8 -*-
&#160;
import commands
import datetime
import dbus
import dbus.service
import os
import sys 
&#160;
from dbus.mainloop.glib import DBusGMainLoop
&#160;
from pyinotify import WatchManager, ThreadedNotifier, \
               [...]


Related posts:<ol><li><a href='http://blog.lazytech.info/2009/09/16/%e6%9e%9c%e7%84%b6%e8%bf%98%e6%98%af%e6%8a%8a%e5%a4%8d%e6%9d%82%e9%97%ae%e9%a2%98%e7%ae%80%e5%8d%95%e5%8c%96%e6%af%94%e8%be%83%e7%88%bd%e5%95%8a/' rel='bookmark' title='Permanent Link: 果然还是把复杂问题简单化比较爽啊'>果然还是把复杂问题简单化比较爽啊</a></li>
<li><a href='http://blog.lazytech.info/2008/09/05/monitoring-directory/' rel='bookmark' title='Permanent Link: 监控目录'>监控目录</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>Djangoat 其实是 <a href="http://www.djangoproject.com/">Django</a> Auto Tester 的缩写，不过我更喜欢读作 &#8220;djan-goat&#8221;&#8230; 这个脚本是通过 <a href="http://en.wikipedia.org/wiki/Inotify">inotify</a> 来监控 <a href="http://www.djangoproject.com/">Django</a> 项目目录，当发现文件变化时自动执行单元测试，出错则通过 <a href="http://www.mumbles-project.org/">Mumbles</a> 来提示相关错误。由于用到了 <a href="http://en.wikipedia.org/wiki/Inotify">inotify</a> 和 <a href="http://www.mumbles-project.org/">Mumbles</a>，所以目前只能在 Linux 运行，Mac 版的稍后再写个&#8230;</p>
<p>下面是程序代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://blog.lazytech.info/wp-content/plugins/wp-codebox/wp-codebox.php?p=158&amp;download=djangoat.py">djangoat.py</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15821"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
</pre></td><td class="code" id="p158code21"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">commands</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">datetime</span>
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
<span style="color: #ff7700;font-weight:bold;">import</span> dbus.<span style="color: black;">service</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">os</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span> 
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> dbus.<span style="color: black;">mainloop</span>.<span style="color: black;">glib</span> <span style="color: #ff7700;font-weight:bold;">import</span> DBusGMainLoop
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> pyinotify <span style="color: #ff7700;font-weight:bold;">import</span> WatchManager, ThreadedNotifier, \
                      ProcessEvent, IN_CLOSE_WRITE, \
                      ExcludeFilter
&nbsp;
FIREFOX_DBUS_INTERFACE = <span style="color: #483d8b;">'org.mozilla.firefox.DBus'</span>
FIREFOX_DBUS_PATH = <span style="color: #483d8b;">'/org/mozilla/firefox/DBus'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> FireFoxDBus<span style="color: black;">&#40;</span>dbus.<span style="color: black;">service</span>.<span style="color: black;">Object</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, bus_name<span style="color: black;">&#41;</span>:
        dbus.<span style="color: black;">service</span>.<span style="color: black;">Object</span>.<span style="color: #0000cd;">__init__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, bus_name, FIREFOX_DBUS_PATH<span style="color: black;">&#41;</span>
&nbsp;
    @dbus.<span style="color: black;">service</span>.<span style="color: #dc143c;">signal</span><span style="color: black;">&#40;</span>dbus_interface=FIREFOX_DBUS_INTERFACE, signature=<span style="color: #483d8b;">'ss'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">def</span> DownloadComplete<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, title, subject<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Which type of files' change should be monitor</span>
MONITOR_EXTENSIONS = <span style="color: black;">&#40;</span><span style="color: #483d8b;">'.py'</span>, <span style="color: #483d8b;">'.html'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> Watcher<span style="color: black;">&#40;</span>ProcessEvent<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">def</span> process_IN_CLOSE_WRITE<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">global</span> <span style="color: #dc143c;">cmd</span>
        <span style="color: #ff7700;font-weight:bold;">global</span> firefox_dbus
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">for</span> extension <span style="color: #ff7700;font-weight:bold;">in</span> MONITOR_EXTENSIONS:
            <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">pathname</span>.<span style="color: black;">endswith</span><span style="color: black;">&#40;</span>extension<span style="color: black;">&#41;</span>:
                start_time = <span style="color: #dc143c;">datetime</span>.<span style="color: #dc143c;">datetime</span>.<span style="color: black;">now</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> start_time
                output = <span style="color: #dc143c;">commands</span>.<span style="color: black;">getoutput</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">cmd</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> output
                <span style="color: #808080; font-style: italic;"># If test failed, call mumbles for notification</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> output.<span style="color: black;">endswith</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'OK'</span><span style="color: black;">&#41;</span>:
                    firefox_dbus.<span style="color: black;">DownloadComplete</span><span style="color: black;">&#40;</span>start_time.<span style="color: black;">isoformat</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, output<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">def</span> process_default<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, event<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">pass</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">2</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Please specify a path for monitoring...'</span>
        <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
    path = <span style="color: #dc143c;">sys</span>.<span style="color: black;">argv</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
    <span style="color: #dc143c;">cmd</span> = <span style="color: #483d8b;">&quot;python %s/manage.py test -v 0&quot;</span> <span style="color: #66cc66;">%</span> path
&nbsp;
    <span style="color: #808080; font-style: italic;"># Exclude filter object</span>
    excl_file = <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">os</span>.<span style="color: black;">getcwd</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'exclude.patterns'</span><span style="color: black;">&#41;</span>
    excl = ExcludeFilter<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span>excl_file: <span style="color: black;">&#40;</span><span style="color: #483d8b;">'excl_lst'</span>,<span style="color: black;">&#41;</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Add watch</span>
    wm = WatchManager<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    notifier = ThreadedNotifier<span style="color: black;">&#40;</span>wm, Watcher<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    wm.<span style="color: black;">add_watch</span><span style="color: black;">&#40;</span>path, IN_CLOSE_WRITE, rec=<span style="color: #008000;">True</span>, \
                 auto_add=<span style="color: #008000;">True</span>, exclude_filter=excl<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #808080; font-style: italic;"># Set up an event loop</span>
    dbus_loop = DBusGMainLoop<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    name = dbus.<span style="color: black;">service</span>.<span style="color: black;">BusName</span><span style="color: black;">&#40;</span>FIREFOX_DBUS_INTERFACE,
                                bus=dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span>mainloop=dbus_loop<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    firefox_dbus = FireFoxDBus<span style="color: black;">&#40;</span>name<span style="color: black;">&#41;</span>
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        notifier.<span style="color: black;">loop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">KeyboardInterrupt</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Djangoat shut down...'</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">Exception</span>, ex:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Exception in Djangoat: %s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>ex<span style="color: black;">&#41;</span></pre></td></tr></table></div>


<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left2">Download <a href="http://blog.lazytech.info/wp-content/plugins/wp-codebox/wp-codebox.php?p=158&amp;download=exclude.patterns">exclude.patterns</a></span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p15822"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p158code22"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#  -*- mode: python; -*-</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Exclude pattens</span>
excl_lst = <span style="color: black;">&#91;</span><span style="color: #483d8b;">'^<span style="color: #000099; font-weight: bold;">\.</span>git/'</span>,
            <span style="color: #483d8b;">'^<span style="color: #000099; font-weight: bold;">\.</span>svn/'</span>,
           <span style="color: black;">&#93;</span></pre></td></tr></table></div>

<p>然后是截图：<br />
<a class="thickbox" rel="" href='http://blog.lazytech.info/wp-content/gallery/linux/djangoat.png' title=''><img src='http://blog.lazytech.info/wp-content/gallery/linux/thumbs/thumbs_djangoat.png' alt='djangoat' class='ngg-singlepic ngg-none' /></a><br />
代码仓库：<br />
<a href="http://git.lazytech.info/?p=daily-scripts.git">http://git.lazytech.info/?p=daily-scripts.git</a></p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2009/09/16/%e6%9e%9c%e7%84%b6%e8%bf%98%e6%98%af%e6%8a%8a%e5%a4%8d%e6%9d%82%e9%97%ae%e9%a2%98%e7%ae%80%e5%8d%95%e5%8c%96%e6%af%94%e8%be%83%e7%88%bd%e5%95%8a/' rel='bookmark' title='Permanent Link: 果然还是把复杂问题简单化比较爽啊'>果然还是把复杂问题简单化比较爽啊</a></li>
<li><a href='http://blog.lazytech.info/2008/09/05/monitoring-directory/' rel='bookmark' title='Permanent Link: 监控目录'>监控目录</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/8wp00ZnIJ7I" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/06/19/daily-scripts-djangoat-py-for-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/06/19/daily-scripts-djangoat-py-for-linux/</feedburner:origLink></item>
		<item>
		<title>CHMReader 在 Mac 下的编译问题</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/wHupSGGsozc/</link>
		<comments>http://blog.lazytech.info/2009/06/08/chmreader-compile-issues-on-mac/#comments</comments>
		<pubDate>Mon, 08 Jun 2009 06:46:13 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[Compile]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=147</guid>
		<description><![CDATA[CHM Reader 是一个非常优秀的在 Firefox 下查看 CHM 文件的扩展，项目地址在：http://sourceforge.net/projects/chmreader/
把代码 checkout 回来，在 OSX 10.5.7 上编译时出现了下述问题：

?View Code BASH1
2
3
g++ -o components/mozCHMModule.os -c -fPIC -I/Users/duo/xulrunner-sdk/include -I/Users/duo/xulrunner-sdk/sdk/include components/mozCHMModule.cpp
/Users/duo/xulrunner-sdk/sdk/include/nsStringAPI.h:1053: error: size of array 'arg' is negative
scons: *** &#91;components/mozCHMModule.os&#93; Error 1

nsStringAPI.h 的 1053 行是 PR_STATIC_ASSERT(sizeof(wchar_t) == 2)，不过 mac 的 wide character size 是 4-bytes，编译选项加个 -fshort-wchar 就搞定了。
另一个问题出现在 link 阶段：

?View Code BASH1
2
3
4
g++ -o platform/Darwin_x86-gcc3/components/libchm.dylib -dynamiclib components/chm_lib.os [...]


Related posts:<ol><li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
<li><a href='http://blog.lazytech.info/2006/10/24/%e5%85%b3%e4%ba%8e-mozilla-%e7%9a%84-plugin-%e7%bc%96%e8%af%91/' rel='bookmark' title='Permanent Link: 关于 Mozilla 的 Plugin 编译'>关于 Mozilla 的 Plugin 编译</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="https://addons.mozilla.org/en-US/firefox/addon/3235">CHM Reader</a> 是一个非常优秀的在 Firefox 下查看 CHM 文件的扩展，项目地址在：<a href="http://sourceforge.net/projects/chmreader/">http://sourceforge.net/projects/chmreader/</a></p>
<p>把代码 checkout 回来，在 OSX 10.5.7 上编译时出现了下述问题：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p147code26'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p14726"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p147code26"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-o</span> components<span style="color: #000000; font-weight: bold;">/</span>mozCHMModule.os <span style="color: #660033;">-c</span> <span style="color: #660033;">-fPIC</span> -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>duo<span style="color: #000000; font-weight: bold;">/</span>xulrunner-sdk<span style="color: #000000; font-weight: bold;">/</span>include -I<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>duo<span style="color: #000000; font-weight: bold;">/</span>xulrunner-sdk<span style="color: #000000; font-weight: bold;">/</span>sdk<span style="color: #000000; font-weight: bold;">/</span>include components<span style="color: #000000; font-weight: bold;">/</span>mozCHMModule.cpp
<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>duo<span style="color: #000000; font-weight: bold;">/</span>xulrunner-sdk<span style="color: #000000; font-weight: bold;">/</span>sdk<span style="color: #000000; font-weight: bold;">/</span>include<span style="color: #000000; font-weight: bold;">/</span>nsStringAPI.h:<span style="color: #000000;">1053</span>: error: <span style="color: #c20cb9; font-weight: bold;">size</span> of array <span style="color: #ff0000;">'arg'</span> is negative
scons: <span style="color: #000000; font-weight: bold;">***</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>components<span style="color: #000000; font-weight: bold;">/</span>mozCHMModule.os<span style="color: #7a0874; font-weight: bold;">&#93;</span> Error <span style="color: #000000;">1</span></pre></td></tr></table></div>

<p>nsStringAPI.h 的 1053 行是 <em>PR_STATIC_ASSERT(sizeof(wchar_t) == 2)</em>，不过 mac 的 wide character size 是 4-bytes，编译选项加个 -fshort-wchar 就搞定了。</p>
<p>另一个问题出现在 link 阶段：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p147code27'); return false;">View Code</a> BASH</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p14727"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p147code27"><pre class="bash" style="font-family:monospace;"><span style="color: #c20cb9; font-weight: bold;">g++</span> <span style="color: #660033;">-o</span> platform<span style="color: #000000; font-weight: bold;">/</span>Darwin_x86-gcc3<span style="color: #000000; font-weight: bold;">/</span>components<span style="color: #000000; font-weight: bold;">/</span>libchm.dylib <span style="color: #660033;">-dynamiclib</span> components<span style="color: #000000; font-weight: bold;">/</span>chm_lib.os components<span style="color: #000000; font-weight: bold;">/</span>lzx.os components<span style="color: #000000; font-weight: bold;">/</span>mozCHMModule.os components<span style="color: #000000; font-weight: bold;">/</span>mozCHMFile.os components<span style="color: #000000; font-weight: bold;">/</span>mozCHMUnitInfo.os components<span style="color: #000000; font-weight: bold;">/</span>mozCHMInputStream.os -L<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>duo<span style="color: #000000; font-weight: bold;">/</span>xulrunner-sdk<span style="color: #000000; font-weight: bold;">/</span>lib -L<span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>duo<span style="color: #000000; font-weight: bold;">/</span>xulrunner-sdk<span style="color: #000000; font-weight: bold;">/</span>sdk<span style="color: #000000; font-weight: bold;">/</span>lib <span style="color: #660033;">-lxpcom</span> -lxpcomglue_s <span style="color: #660033;">-lnspr4</span> <span style="color: #660033;">-lplds4</span> <span style="color: #660033;">-lplc4</span>
<span style="color: #c20cb9; font-weight: bold;">ld</span>: <span style="color: #c20cb9; font-weight: bold;">file</span> not found: <span style="color: #000000; font-weight: bold;">@</span>executable_path<span style="color: #000000; font-weight: bold;">/</span>libsmime3.dylib
collect2: <span style="color: #c20cb9; font-weight: bold;">ld</span> returned <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">exit</span> status
scons: <span style="color: #000000; font-weight: bold;">***</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span>platform<span style="color: #000000; font-weight: bold;">/</span>Darwin_x86-gcc3<span style="color: #000000; font-weight: bold;">/</span>components<span style="color: #000000; font-weight: bold;">/</span>libchm.dylib<span style="color: #7a0874; font-weight: bold;">&#93;</span> Error <span style="color: #000000;">1</span></pre></td></tr></table></div>

<p>添加 -Wl,-executable_path -Wl,<em>/path/to/gecko/sdk/</em>bin 这个 link flag 即可</p>
<p>完整的 svn diff：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p147code28'); return false;">View Code</a> DIFF</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p14728"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
</pre></td><td class="code" id="p147code28"><pre class="diff" style="font-family:monospace;">Index: components/SConscript
===================================================================
<span style="color: #888822;">--- components/SConscript       <span style="">&#40;</span>revision 114<span style="">&#41;</span></span>
<span style="color: #888822;">+++ components/SConscript       <span style="">&#40;</span>working copy<span style="">&#41;</span></span>
<span style="color: #440088;">@@ -7,6 +7,8 @@</span>
&nbsp;
 libs = <span style="">&#91;</span>'xpcom', 'xpcomglue_s', 'nspr4', 'plds4', 'plc4'<span style="">&#93;</span>
&nbsp;
<span style="color: #00b000;">+linkflags = ''</span>
<span style="color: #00b000;">+</span>
 # We use firefox development files instead for geckosdk on FreeBSD
 if system<span style="">&#40;</span><span style="">&#41;</span> != 'FreeBSD':
        try:
<span style="color: #440088;">@@ -38,7 +40,8 @@</span>
     cpppath.append<span style="">&#40;</span>'/usr/include/nspr'<span style="">&#41;</span>
&nbsp;
 elif system<span style="">&#40;</span><span style="">&#41;</span> == 'Darwin':
<span style="color: #991111;">-    cxxflags = <span style="">&#91;</span><span style="">&#93;</span></span>
<span style="color: #00b000;">+    cxxflags = <span style="">&#91;</span>'-fshort-wchar'<span style="">&#93;</span></span>
<span style="color: #00b000;">+    linkflags = <span style="">&#91;</span>'-Wl,-executable_path', '-Wl,%s/bin' % geckosdk<span style="">&#93;</span></span>
&nbsp;
 elif system<span style="">&#40;</span><span style="">&#41;</span> == 'Windows':
     cxxflags = <span style="">&#91;</span>'/D', 'WIN32', '/D', 'XP_WIN', '/nologo', '/MT', '/O2'<span style="">&#93;</span>
<span style="color: #440088;">@@ -70,7 +73,7 @@</span>
                '/usr/local/lib/firefox3/sdk/lib'<span style="">&#93;</span>
&nbsp;
 env = Environment<span style="">&#40;</span>CPPPATH = cpppath, LIBPATH = libpath, LIBS = libs,
<span style="color: #991111;">-                  CXXFLAGS= cxxflags<span style="">&#41;</span></span>
<span style="color: #00b000;">+                  CXXFLAGS= cxxflags, LINKFLAGS = linkflags<span style="">&#41;</span></span>
&nbsp;
 bxpt = Builder<span style="">&#40;</span>
     action = 'xpidl -w -m typelib -Icomponents -I%s -I%s -e $TARGET $SOURCE' \</pre></td></tr></table></div>



<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
<li><a href='http://blog.lazytech.info/2006/10/24/%e5%85%b3%e4%ba%8e-mozilla-%e7%9a%84-plugin-%e7%bc%96%e8%af%91/' rel='bookmark' title='Permanent Link: 关于 Mozilla 的 Plugin 编译'>关于 Mozilla 的 Plugin 编译</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/wHupSGGsozc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/06/08/chmreader-compile-issues-on-mac/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/06/08/chmreader-compile-issues-on-mac/</feedburner:origLink></item>
		<item>
		<title>aghttpd: a small C library for creating a HTTP server (based on GLib)</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/MA4Rms2akBc/</link>
		<comments>http://blog.lazytech.info/2009/06/02/aghttpd-a-small-c-library-for-creating-a-http-server-based-on-glib/#comments</comments>
		<pubDate>Tue, 02 Jun 2009 07:02:55 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[C/C++]]></category>
		<category><![CDATA[C++]]></category>
		<category><![CDATA[http]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=139</guid>
		<description><![CDATA[这玩意是从 Ewrt Open-Source firmware 的代码里抽出来，给最近折腾的个人项目用的。
项目仓库在：http://git.lazytech.info/?p=aghttpd.git
样例代码：

?View Code C1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
#include &#60;glib.h&#62;
#include &#60;stdlib.h&#62;
#include &#60;string.h&#62;
#include &#60;netinet/in.h&#62;
#include &#60;signal.h&#62;
&#160;
#include &#34;http.h&#34;
&#160;
static int caught_sigint = 0;
&#160;
void handle_free &#40; GIOChannel *sock, http_request *h &#41; &#123; 
    g_io_channel_unref&#40; sock &#41;;
    http_request_free&#40; h &#41;;
&#125;
&#160;
gboolean handle_write&#40; GIOChannel *sock, GIOCondition cond, http_request *h &#41; &#123; 
    gchar *response = &#34;It [...]


Related posts:<ol><li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>这玩意是从 Ewrt Open-Source firmware 的代码里抽出来，给最近折腾的个人项目用的。<br />
项目仓库在：<a href="http://git.lazytech.info/?p=aghttpd.git">http://git.lazytech.info/?p=aghttpd.git</a></p>
<p>样例代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p139code30'); return false;">View Code</a> C</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13930"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
</pre></td><td class="code" id="p139code30"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;glib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;netinet/in.h&gt;</span>
<span style="color: #339933;">#include &lt;signal.h&gt;</span>
&nbsp;
<span style="color: #339933;">#include &quot;http.h&quot;</span>
&nbsp;
<span style="color: #993333;">static</span> <span style="color: #993333;">int</span> caught_sigint <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #993333;">void</span> handle_free <span style="color: #009900;">&#40;</span> GIOChannel <span style="color: #339933;">*</span>sock<span style="color: #339933;">,</span> http_request <span style="color: #339933;">*</span>h <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    g_io_channel_unref<span style="color: #009900;">&#40;</span> sock <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    http_request_free<span style="color: #009900;">&#40;</span> h <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gboolean handle_write<span style="color: #009900;">&#40;</span> GIOChannel <span style="color: #339933;">*</span>sock<span style="color: #339933;">,</span> GIOCondition cond<span style="color: #339933;">,</span> http_request <span style="color: #339933;">*</span>h <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span> 
    gchar <span style="color: #339933;">*</span>response <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;It Works!&quot;</span><span style="color: #339933;">;</span>
    guint r<span style="color: #339933;">,</span> n<span style="color: #339933;">;</span>
&nbsp;
    n <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span> response <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    http_add_header<span style="color: #009900;">&#40;</span> h<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;Content-Type&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;text/html&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    http_send_header<span style="color: #009900;">&#40;</span> h<span style="color: #339933;">,</span> <span style="color: #0000dd;">200</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;OK&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    r <span style="color: #339933;">=</span> g_io_channel_write<span style="color: #009900;">&#40;</span> h<span style="color: #339933;">-&gt;</span>sock<span style="color: #339933;">,</span> response<span style="color: #339933;">,</span> n<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> r <span style="color: #339933;">!=</span> G_IO_ERROR_NONE <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        g_warning<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;Serving response to %s failed: %m&quot;</span><span style="color: #339933;">,</span> h<span style="color: #339933;">-&gt;</span>peer_ip <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    g_io_channel_close<span style="color: #009900;">&#40;</span> sock <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    handle_free<span style="color: #009900;">&#40;</span>sock<span style="color: #339933;">,</span> h<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gboolean handle_read<span style="color: #009900;">&#40;</span> GIOChannel <span style="color: #339933;">*</span>sock<span style="color: #339933;">,</span> GIOCondition cond<span style="color: #339933;">,</span> http_request <span style="color: #339933;">*</span>h <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    ssize_t n <span style="color: #339933;">=</span> http_request_read<span style="color: #009900;">&#40;</span> h <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> http_request_ok<span style="color: #009900;">&#40;</span> h <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        g_io_add_watch<span style="color: #009900;">&#40;</span> sock<span style="color: #339933;">,</span> G_IO_OUT<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>GIOFunc<span style="color: #009900;">&#41;</span>handle_write<span style="color: #339933;">,</span> h <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">0</span> <span style="color: #339933;">==</span> n <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        handle_free<span style="color: #009900;">&#40;</span> sock<span style="color: #339933;">,</span> h <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">return</span> FALSE<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gboolean handle_accept<span style="color: #009900;">&#40;</span> GIOChannel <span style="color: #339933;">*</span>sock<span style="color: #339933;">,</span> GIOCondition cond<span style="color: #339933;">,</span> gpointer data <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">struct</span> sockaddr_in peer_addr<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> peer_fd<span style="color: #339933;">,</span> n <span style="color: #339933;">=</span> <span style="color: #993333;">sizeof</span><span style="color: #009900;">&#40;</span> peer_addr <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    GIOChannel <span style="color: #339933;">*</span>peer<span style="color: #339933;">;</span>
    http_request <span style="color: #339933;">*</span>req<span style="color: #339933;">;</span>
&nbsp;
    peer_fd <span style="color: #339933;">=</span> accept<span style="color: #009900;">&#40;</span> g_io_channel_unix_get_fd<span style="color: #009900;">&#40;</span>sock<span style="color: #009900;">&#41;</span><span style="color: #339933;">,</span>
                      <span style="color: #009900;">&#40;</span><span style="color: #993333;">struct</span> sockaddr <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">&amp;</span>peer_addr<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>n <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    g_assert<span style="color: #009900;">&#40;</span> peer_fd <span style="color: #339933;">!=</span> <span style="color: #339933;">-</span><span style="color: #0000dd;">1</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    peer <span style="color: #339933;">=</span> g_io_channel_unix_new<span style="color: #009900;">&#40;</span> peer_fd <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    req  <span style="color: #339933;">=</span> http_request_new<span style="color: #009900;">&#40;</span> peer <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    g_io_add_watch<span style="color: #009900;">&#40;</span> peer<span style="color: #339933;">,</span> G_IO_IN<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>GIOFunc<span style="color: #009900;">&#41;</span>handle_read<span style="color: #339933;">,</span> req <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
gboolean check_sigint <span style="color: #009900;">&#40;</span> GMainLoop <span style="color: #339933;">*</span>loop <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span> caught_sigint <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        g_message<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;Caught SIGINT!&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        g_main_quit<span style="color: #009900;">&#40;</span> loop <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    <span style="color: #b1b100;">return</span> TRUE<span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">void</span> handle_sigint <span style="color: #009900;">&#40;</span> <span style="color: #993333;">int</span> sig <span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    caught_sigint<span style="color: #339933;">++;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #993333;">int</span> main <span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    GMainLoop <span style="color: #339933;">*</span>loop<span style="color: #339933;">;</span>
    GIOChannel <span style="color: #339933;">*</span>sock<span style="color: #339933;">;</span>
&nbsp;
    signal<span style="color: #009900;">&#40;</span> SIGPIPE<span style="color: #339933;">,</span> SIG_IGN <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    signal<span style="color: #009900;">&#40;</span> SIGINT<span style="color: #339933;">,</span> handle_sigint <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    loop <span style="color: #339933;">=</span> g_main_new<span style="color: #009900;">&#40;</span> FALSE <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    sock <span style="color: #339933;">=</span> http_bind_socket<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;0.0.0.0&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">12345</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    g_io_add_watch<span style="color: #009900;">&#40;</span> sock<span style="color: #339933;">,</span> G_IO_IN<span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>GIOFunc<span style="color: #009900;">&#41;</span>handle_accept<span style="color: #339933;">,</span> NULL <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    g_timeout_add<span style="color: #009900;">&#40;</span> <span style="color: #0000dd;">1000</span><span style="color: #339933;">,</span> <span style="color: #009900;">&#40;</span>GSourceFunc<span style="color: #009900;">&#41;</span>check_sigint<span style="color: #339933;">,</span> loop <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    g_message<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;starting main loop&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    g_main_run<span style="color: #009900;">&#40;</span> loop <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    g_message<span style="color: #009900;">&#40;</span> <span style="color: #ff0000;">&quot;exiting main loop&quot;</span> <span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>和这个 &#8220;<a href="http://3.rdrail.net/blog/libevent-webserver-in-40-lines-of-c/">libevent webserver in 40 lines of c</a>&#8221; 比起来代码行数是多了不少&#8230;</p>
<p>然后是 Benchmark 的数据：<br />
ab -c 1000 -n 10000 http://localhost:12345/</p>
<p>libevent: Requests per second:    1349.16 [#/sec] (mean)<br />
aghttpd: Requests per second:    2255.85 [#/sec] (mean)</p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/MA4Rms2akBc" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/06/02/aghttpd-a-small-c-library-for-creating-a-http-server-based-on-glib/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/06/02/aghttpd-a-small-c-library-for-creating-a-http-server-based-on-glib/</feedburner:origLink></item>
		<item>
		<title>XPCOM: Javascript function call alternative</title>
		<link>http://feedproxy.google.com/~r/Lazytechnology/~3/2U3H75YKCSw/</link>
		<comments>http://blog.lazytech.info/2009/05/31/xpcom-javascript-function-call-alternative/#comments</comments>
		<pubDate>Sun, 31 May 2009 08:41:07 +0000</pubDate>
		<dc:creator>Duo</dc:creator>
				<category><![CDATA[Mozilla]]></category>
		<category><![CDATA[xpcom]]></category>

		<guid isPermaLink="false">http://blog.lazytech.info/?p=135</guid>
		<description><![CDATA[以前曾经写过关于如何从 C++ XPCOM 调用 JavaScript 函数的文章 (XPCOM: Javascript function call)，最近发现其实可以通过 observer 来达到同样的目的。
C++ XPCOM 的代码：

?View Code CPP1
2
nsCOMPtr&#60;nsIObserverService&#62; observerService = do_GetService&#40;&#34;@mozilla.org/observer-service;1&#34;&#41;;
observerService-&#62;NotifyObservers&#40;NULL, &#34;ping&#34;, ToNewUnicode&#40;NS_ConvertASCIItoUTF16&#40;&#34;www.google.com&#34;&#41;&#41;&#41;;

JavaScript 的代码：

?View Code JAVASCRIPT1
2
3
4
5
6
7
8
9
10
11
12
13
14
const Cc = Components.classes;
const Ci = Components.interfaces;
&#160;
var aObserver = &#123; 
    observe: function&#40;subject, topic, data&#41; &#123;
        if &#40;topic == &#34;ping&#34;&#41; &#123;
  [...]


Related posts:<ol><li><a href='http://blog.lazytech.info/2007/05/26/xpcom-javascript-function-call/' rel='bookmark' title='Permanent Link: XPCOM: Javascript function call'>XPCOM: Javascript function call</a></li>
<li><a href='http://blog.lazytech.info/2006/12/20/xpcom-array-2/' rel='bookmark' title='Permanent Link: XPCOM array'>XPCOM array</a></li>
<li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p>以前曾经写过关于如何从 C++ XPCOM 调用 JavaScript 函数的文章 (<a href="http://blog.lazytech.info/2007/05/26/xpcom-javascript-function-call/">XPCOM: Javascript function call</a>)，最近发现其实可以通过 observer 来达到同样的目的。</p>
<p>C++ XPCOM 的代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p135code33'); return false;">View Code</a> CPP</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13533"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p135code33"><pre class="cpp" style="font-family:monospace;">nsCOMPtr<span style="color: #000080;">&lt;</span>nsIObserverService<span style="color: #000080;">&gt;</span> observerService <span style="color: #000080;">=</span> do_GetService<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;@mozilla.org/observer-service;1&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span>
observerService<span style="color: #000040;">-</span><span style="color: #000080;">&gt;</span>NotifyObservers<span style="color: #008000;">&#40;</span><span style="color: #0000ff;">NULL</span>, <span style="color: #FF0000;">&quot;ping&quot;</span>, ToNewUnicode<span style="color: #008000;">&#40;</span>NS_ConvertASCIItoUTF16<span style="color: #008000;">&#40;</span><span style="color: #FF0000;">&quot;www.google.com&quot;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008080;">;</span></pre></td></tr></table></div>

<p>JavaScript 的代码：</p>

<div class="wp_codebox_msgheader"><span class="right"><sup><a href="http://www.ericbess.com/ericblog/2008/03/03/wp-codebox/#examples" target="_blank" title="WP-CodeBox HowTo?"><span style="color: #99cc00">?</span></a></sup></span><span class="left"><a href="javascript:;" onclick="javascript:showCodeTxt('p135code34'); return false;">View Code</a> JAVASCRIPT</span><div class="codebox_clear"></div></div><div class="wp_codebox"><table><tr id="p13534"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
</pre></td><td class="code" id="p135code34"><pre class="javascript" style="font-family:monospace;"><span style="color: #003366; font-weight: bold;">const</span> Cc <span style="color: #339933;">=</span> Components.<span style="color: #660066;">classes</span><span style="color: #339933;">;</span>
<span style="color: #003366; font-weight: bold;">const</span> Ci <span style="color: #339933;">=</span> Components.<span style="color: #660066;">interfaces</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> aObserver <span style="color: #339933;">=</span> <span style="color: #009900;">&#123;</span> 
    observe<span style="color: #339933;">:</span> <span style="color: #003366; font-weight: bold;">function</span><span style="color: #009900;">&#40;</span>subject<span style="color: #339933;">,</span> topic<span style="color: #339933;">,</span> data<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>topic <span style="color: #339933;">==</span> <span style="color: #3366CC;">&quot;ping&quot;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #000066;">alert</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">&quot;Ping: &quot;</span> <span style="color: #339933;">+</span> data<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>   
    <span style="color: #009900;">&#125;</span>   
<span style="color: #009900;">&#125;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #003366; font-weight: bold;">var</span> observerService <span style="color: #339933;">=</span> Cc<span style="color: #009900;">&#91;</span><span style="color: #3366CC;">&quot;@mozilla.org/observer-service;1&quot;</span><span style="color: #009900;">&#93;</span>.<span style="color: #660066;">getService</span><span style="color: #009900;">&#40;</span>Ci.<span style="color: #660066;">nsIObserverService</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
observerService.<span style="color: #660066;">addObserver</span><span style="color: #009900;">&#40;</span>aObserver<span style="color: #339933;">,</span> <span style="color: #3366CC;">&quot;ping&quot;</span><span style="color: #339933;">,</span> <span style="color: #003366; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>如果是多线程的 XPCOM 的话，有时需要通过 nsIProxyObjectManager 来调用 JavaScript 函数 (JavaScript 和 UI 是在单独的线程，具体见 <a href="https://developer.mozilla.org/en/nsISupports_proxies">nsISupports proxies</a> 和 <a href="http://mxr.mozilla.org/mozilla-central/source/xpcom/proxy/public/nsProxiedService.h">nsProxiedService.h</a>)</p>


<p>Related posts:<ol><li><a href='http://blog.lazytech.info/2007/05/26/xpcom-javascript-function-call/' rel='bookmark' title='Permanent Link: XPCOM: Javascript function call'>XPCOM: Javascript function call</a></li>
<li><a href='http://blog.lazytech.info/2006/12/20/xpcom-array-2/' rel='bookmark' title='Permanent Link: XPCOM array'>XPCOM array</a></li>
<li><a href='http://blog.lazytech.info/2006/10/04/creating-a-simple-c-component/' rel='bookmark' title='Permanent Link: Creating a simple C++ component'>Creating a simple C++ component</a></li>
</ol></p><img src="http://feeds.feedburner.com/~r/Lazytechnology/~4/2U3H75YKCSw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://blog.lazytech.info/2009/05/31/xpcom-javascript-function-call-alternative/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://blog.lazytech.info/2009/05/31/xpcom-javascript-function-call-alternative/</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 1.058 seconds --><!-- Cached page served by WP-Cache -->
