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

<channel>
	<title>phill84.org</title>
	<atom:link href="http://phill84.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://phill84.org</link>
	<description>יְהִי אוֹר</description>
	<lastBuildDate>Fri, 22 Jan 2010 10:57:29 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Posting douban saying using python / 用python發送豆瓣廣播</title>
		<link>http://phill84.org/2010/01/posting-douban-saying-using-python-%e7%94%a8python%e7%99%bc%e9%80%81%e8%b1%86%e7%93%a3%e5%bb%a3%e6%92%ad/</link>
		<comments>http://phill84.org/2010/01/posting-douban-saying-using-python-%e7%94%a8python%e7%99%bc%e9%80%81%e8%b1%86%e7%93%a3%e5%bb%a3%e6%92%ad/#comments</comments>
		<pubDate>Fri, 22 Jan 2010 10:48:18 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[douban]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[saying]]></category>
		<category><![CDATA[廣播]]></category>
		<category><![CDATA[豆瓣]]></category>

		<guid isPermaLink="false">http://phill84.org/2010/01/posting-douban-saying-using-python-%e7%94%a8python%e7%99%bc%e9%80%81%e8%b1%86%e7%93%a3%e5%bb%a3%e6%92%ad/</guid>
		<description><![CDATA[Finally I got sometime to work on implementing my own python script for posting douban saying, again. This time I used the library written by Leah Culver, and everything went smoothly. It&#8217;s just that I have no idea why douban chose to use a different signing algorithm(if a thing as stupid as it is can [...]]]></description>
			<content:encoded><![CDATA[<p>Finally I got sometime to work on implementing my own python script for posting douban saying, again. This time I used the <a href="http://oauth.googlecode.com/svn/code/python/oauth/">library</a> written by <a href="http://leahculver.com/">Leah Culver</a>, and everything went smoothly. It&#8217;s just that I have no idea why douban chose to use a different signing algorithm(if a thing as stupid as it is can be called a algorithm) for requesting access token.</p>
<p>終於又有時間再一次捯鼓豆瓣. 這次在 <a href="http://leahculver.com/">Leah Culver</a> 寫的 <a href="http://oauth.googlecode.com/svn/code/python/oauth/">library</a> 的基礎上, 終於把python腳本發送豆瓣廣播終於搞定了. 唯一理解不能的事就是豆瓣在獲取access token的時候用了一個莫名其妙的簽名算法(如果這種也能叫做算法的話 = =).</p>
<p>Click on read more to view the actual code of the script.<br />
查看腳本內容請點擊 read more<br />
<span id="more-619"></span></p>

<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">binascii</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">cgi</span>
<span style="color: #ff7700;font-weight:bold;">import</span> hashlib
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">hmac</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">httplib</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;">random</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">time</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
&nbsp;
SERVER  = <span style="color: #483d8b;">'api.douban.com'</span>
API_KEY = <span style="color: #483d8b;">'your api key'</span>
SECRET  = <span style="color: #483d8b;">'your api secret'</span>
&nbsp;
OAUTH_SERVER            = <span style="color: #483d8b;">'www.douban.com'</span>
REQUEST_TOKEN_URI       = <span style="color: #483d8b;">'/service/auth/request_token'</span>
AUTHORIZATION_URI       = <span style="color: #483d8b;">'/service/auth/authorize'</span>
ACCESS_TOKEN_URI        = <span style="color: #483d8b;">'/service/auth/access_token'</span>
SAYING_URI              = <span style="color: #483d8b;">'/miniblog/saying'</span>
&nbsp;
SIG_METHOD              = <span style="color: #483d8b;">'HMAC-SHA1'</span>
OAUTH_VER               = <span style="color: #483d8b;">'1.0'</span>
SCHEME                  = <span style="color: #483d8b;">'http'</span>
&nbsp;
ACCESS_TOKEN_FILE       = <span style="color: #483d8b;">'douban_access_token'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> escape<span style="color: black;">&#40;</span>s<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">urllib</span>.<span style="color: black;">quote</span><span style="color: black;">&#40;</span>s, safe=<span style="color: #483d8b;">'~'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> generate_timestamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">time</span>.<span style="color: #dc143c;">time</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> generate_nonce<span style="color: black;">&#40;</span>length=<span style="color: #ff4500;">8</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">''</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">random</span>.<span style="color: black;">randint</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">9</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>length<span style="color: black;">&#41;</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> normalize_params<span style="color: black;">&#40;</span>params<span style="color: black;">&#41;</span>:
        key_values = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>escape<span style="color: black;">&#40;</span>k<span style="color: black;">&#41;</span>, escape<span style="color: black;">&#40;</span>v<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> k,v <span style="color: #ff7700;font-weight:bold;">in</span> params.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        key_values.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #483d8b;">'&amp;'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'%s=%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>k, v<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> k, v <span style="color: #ff7700;font-weight:bold;">in</span> key_values<span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> sign<span style="color: black;">&#40;</span>method, url, params, secret, token_secret<span style="color: black;">&#41;</span>:
        sig = <span style="color: black;">&#40;</span>
                        escape<span style="color: black;">&#40;</span>method.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>,
                        escape<span style="color: black;">&#40;</span>SCHEME + <span style="color: #483d8b;">'://'</span> + url<span style="color: black;">&#41;</span>,
                        escape<span style="color: black;">&#40;</span>normalize_params<span style="color: black;">&#40;</span>params<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: black;">&#41;</span>
        key = escape<span style="color: black;">&#40;</span>secret<span style="color: black;">&#41;</span> + <span style="color: #483d8b;">'&amp;'</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> url == OAUTH_SERVER + ACCESS_TOKEN_URI:
                <span style="color: #808080; font-style: italic;">#I have no idea why the fuck douban uses concatenated secrets as signature instead of the computed one</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> secret + <span style="color: #483d8b;">'&amp;'</span> + token_secret
        <span style="color: #ff7700;font-weight:bold;">if</span> token_secret:
                key += escape<span style="color: black;">&#40;</span>token_secret<span style="color: black;">&#41;</span>
        base_string = <span style="color: #483d8b;">'&amp;'</span>.<span style="color: black;">join</span><span style="color: black;">&#40;</span>sig<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">binascii</span>.<span style="color: black;">b2a_base64</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">hmac</span>.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span>key, base_string, hashlib.<span style="color: black;">sha1</span><span style="color: black;">&#41;</span>.<span style="color: black;">digest</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> generate_header<span style="color: black;">&#40;</span>method, url, params, key, <span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>:
        header = <span style="color: #483d8b;">'OAuth realm=&quot;&quot;'</span>
        params<span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_version'</span><span style="color: black;">&#93;</span> = OAUTH_VER
        signature = sign<span style="color: black;">&#40;</span>method, url, params, key, <span style="color: #dc143c;">token</span><span style="color: black;">&#41;</span>
        params<span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_signature'</span><span style="color: black;">&#93;</span> = signature
        key_values = <span style="color: black;">&#91;</span><span style="color: black;">&#40;</span>k, v<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> k,v <span style="color: #ff7700;font-weight:bold;">in</span> params.<span style="color: black;">items</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
        key_values.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> k, v <span style="color: #ff7700;font-weight:bold;">in</span> key_values:
                header += <span style="color: #483d8b;">', %s=&quot;%s&quot;'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>k, escape<span style="color: black;">&#40;</span>v<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: #483d8b;">&quot;Authorization&quot;</span>: header<span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> create_connection<span style="color: black;">&#40;</span>server<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">httplib</span>.<span style="color: black;">HTTPConnection</span><span style="color: black;">&#40;</span>server<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> read_access_token_file<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">access</span><span style="color: black;">&#40;</span>ACCESS_TOKEN_FILE, <span style="color: #dc143c;">os</span>.<span style="color: black;">F_OK</span><span style="color: black;">&#41;</span>:
                token_file = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>ACCESS_TOKEN_FILE, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span>
                data = token_file.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                data = <span style="color: #dc143c;">cgi</span>.<span style="color: black;">parse_qs</span><span style="color: black;">&#40;</span>data, keep_blank_values=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
                <span style="color: #dc143c;">token</span> = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
                <span style="color: #ff7700;font-weight:bold;">for</span> k, v <span style="color: #ff7700;font-weight:bold;">in</span> data.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                        <span style="color: #dc143c;">token</span><span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span> = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">unquote</span><span style="color: black;">&#40;</span>v<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                token_file.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #dc143c;">token</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> write_access_token_file<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">access</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'./'</span>, <span style="color: #dc143c;">os</span>.<span style="color: black;">W_OK</span><span style="color: black;">&#41;</span>:
                token_file = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>ACCESS_TOKEN_FILE, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
                token_file.<span style="color: black;">write</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
                token_file.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Token file successfully updated&quot;</span>
        <span style="color: #ff7700;font-weight:bold;">else</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Cannot write to file, please confirm you have write permission&quot;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> douban<span style="color: black;">&#40;</span><span style="color: #008000;">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><span style="color: black;">&#41;</span>:
                <span style="color: #008000;">self</span>.<span style="color: black;">key</span> = API_KEY
                <span style="color: #008000;">self</span>.<span style="color: black;">secret</span> = SECRET
                <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span> = read_access_token_file<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> update_stored_token<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, data<span style="color: black;">&#41;</span>:
                data = <span style="color: #dc143c;">cgi</span>.<span style="color: black;">parse_qs</span><span style="color: black;">&#40;</span>data, keep_blank_values=<span style="color: #008000;">False</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">for</span> k, v <span style="color: #ff7700;font-weight:bold;">in</span> data.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                        <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span>k<span style="color: black;">&#93;</span> = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">unquote</span><span style="color: black;">&#40;</span>v<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> get_request_token<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
                conn = create_connection<span style="color: black;">&#40;</span>OAUTH_SERVER<span style="color: black;">&#41;</span>
                params = <span style="color: black;">&#123;</span>
                                <span style="color: #483d8b;">'oauth_consumer_key'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">key</span>,
                                <span style="color: #483d8b;">'oauth_signature_method'</span>: SIG_METHOD,
                                <span style="color: #483d8b;">'oauth_timestamp'</span>: generate_timestamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
                                <span style="color: #483d8b;">'oauth_nonce'</span>: generate_nonce<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: black;">&#125;</span>
                header = generate_header<span style="color: black;">&#40;</span><span style="color: #483d8b;">'GET'</span>, OAUTH_SERVER + REQUEST_TOKEN_URI, params, <span style="color: #008000;">self</span>.<span style="color: black;">secret</span>, <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>
                conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, REQUEST_TOKEN_URI, headers=header<span style="color: black;">&#41;</span>
                response = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                data = response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> response.<span style="color: black;">status</span> == <span style="color: #ff4500;">200</span>:
                        <span style="color: #008000;">self</span>.<span style="color: black;">update_stored_token</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
                        <span style="color: #008000;">self</span>.<span style="color: black;">authorize_token</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%s %s<span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>response.<span style="color: black;">status</span>, response.<span style="color: black;">reason</span>, response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> authorize_token<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;Open the link below to authorize the request token:&quot;</span>
                <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;http://%s%s?oauth_token=%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>OAUTH_SERVER, AUTHORIZATION_URI, escape<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_token'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
                <span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Press enter to continue&quot;</span><span style="color: black;">&#41;</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">get_access_token</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> get_access_token<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
                conn = create_connection<span style="color: black;">&#40;</span>OAUTH_SERVER<span style="color: black;">&#41;</span>
                params = <span style="color: black;">&#123;</span>
                                <span style="color: #483d8b;">'oauth_consumer_key'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">key</span>,
                                <span style="color: #483d8b;">'oauth_token'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_token'</span><span style="color: black;">&#93;</span>,
                                <span style="color: #483d8b;">'oauth_sgnature_method'</span>: SIG_METHOD,
                                <span style="color: #483d8b;">'oauth_timestamp'</span>: generate_timestamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
                                <span style="color: #483d8b;">'oauth_nonce'</span>: generate_nonce<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: black;">&#125;</span>
                header = generate_header<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, OAUTH_SERVER + ACCESS_TOKEN_URI, params, <span style="color: #008000;">self</span>.<span style="color: black;">secret</span>, <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_token_secret'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;GET&quot;</span>, ACCESS_TOKEN_URI, headers=header<span style="color: black;">&#41;</span>
                response = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> response.<span style="color: black;">status</span> == <span style="color: #ff4500;">200</span>:
                        data = response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                        write_access_token_file<span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">else</span>:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%s %s<span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>response.<span style="color: black;">status</span>, response.<span style="color: black;">reason</span>, response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> first_run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">'douban_user_id'</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span>:
                        confirm = <span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'token file exists arleady, overwrite? ([y]/n):'</span><span style="color: black;">&#41;</span>
                        <span style="color: #ff7700;font-weight:bold;">if</span> confirm.<span style="color: black;">upper</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'N'</span>:
                                <span style="color: #dc143c;">sys</span>.<span style="color: black;">exit</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>
                <span style="color: #008000;">self</span>.<span style="color: black;">get_request_token</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
        <span style="color: #ff7700;font-weight:bold;">def</span> add_saying<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, content<span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #483d8b;">'douban_user_id'</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span>:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Access token file does not exist'</span>
                        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">None</span>
                entry = <span style="color: #483d8b;">'&lt;?xml version=<span style="color: #000099; font-weight: bold;">\'</span>1.0<span style="color: #000099; font-weight: bold;">\'</span> encoding=<span style="color: #000099; font-weight: bold;">\'</span>UTF-8<span style="color: #000099; font-weight: bold;">\'</span>?&gt;'</span>\
                        + <span style="color: #483d8b;">'&lt;entry xmlns:ns0=&quot;http://www.w3.org/2005/Atom&quot; xmlns:db=&quot;http://www.douban.com/xmlns/&quot;&gt;'</span>\
                        + <span style="color: #483d8b;">'&lt;content&gt;'</span> + content + <span style="color: #483d8b;">'&lt;/content&gt;'</span>\
                        + <span style="color: #483d8b;">'&lt;/entry&gt;'</span>
                conn = create_connection<span style="color: black;">&#40;</span>SERVER<span style="color: black;">&#41;</span>
                params = <span style="color: black;">&#123;</span>
                                <span style="color: #483d8b;">'oauth_consumer_key'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">key</span>,
                                <span style="color: #483d8b;">'oauth_token'</span>: <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_token'</span><span style="color: black;">&#93;</span>,
                                <span style="color: #483d8b;">'oauth_signature_method'</span>: SIG_METHOD,
                                <span style="color: #483d8b;">'oauth_timestamp'</span>: generate_timestamp<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>,
                                <span style="color: #483d8b;">'oauth_nonce'</span>: generate_nonce<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: black;">&#125;</span>
                header = generate_header<span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;POST&quot;</span>, SERVER + SAYING_URI, params, <span style="color: #008000;">self</span>.<span style="color: black;">secret</span>, <span style="color: #008000;">self</span>.<span style="color: black;">stored_token</span><span style="color: black;">&#91;</span><span style="color: #483d8b;">'oauth_token_secret'</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
                header<span style="color: black;">&#91;</span><span style="color: #483d8b;">'Content-Type'</span><span style="color: black;">&#93;</span> = <span style="color: #483d8b;">'application/atom+xml'</span>
                conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;POST&quot;</span>, SAYING_URI, entry, header<span style="color: black;">&#41;</span>
                response = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
                <span style="color: #ff7700;font-weight:bold;">if</span> response.<span style="color: black;">status</span> <span style="color: #66cc66;">!</span>= <span style="color: #ff4500;">201</span>:
                        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">&quot;%s %s<span style="color: #000099; font-weight: bold;">\n</span>%s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>response.<span style="color: black;">status</span>, response.<span style="color: black;">reason</span>, response.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2010/01/posting-douban-saying-using-python-%e7%94%a8python%e7%99%bc%e9%80%81%e8%b1%86%e7%93%a3%e5%bb%a3%e6%92%ad/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>iptables port forwarding for emule</title>
		<link>http://phill84.org/2010/01/iptables-port-forwarding-for-emule/</link>
		<comments>http://phill84.org/2010/01/iptables-port-forwarding-for-emule/#comments</comments>
		<pubDate>Fri, 01 Jan 2010 21:20:56 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[emule]]></category>
		<category><![CDATA[iptables]]></category>
		<category><![CDATA[port forwarding]]></category>

		<guid isPermaLink="false">http://phill84.org/2010/01/iptables-port-forwarding-for-emule/</guid>
		<description><![CDATA[Suppose you wanna have HighID and open KAD network connection for eMule on a computer in a LAN, and the gateway is running iptables. Just add the rules below to your existing iptables rules and you are done.

# this example is based on the assumption that 
# eth0 is WAN interface and eth1 is LAN [...]]]></description>
			<content:encoded><![CDATA[<p>Suppose you wanna have HighID and open KAD network connection for eMule on a computer in a LAN, and the gateway is running iptables. Just add the rules below to your existing iptables rules and you are done.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># this example is based on the assumption that </span>
<span style="color: #666666; font-style: italic;"># eth0 is WAN interface and eth1 is LAN interface,</span>
<span style="color: #666666; font-style: italic;"># 192.168.0.2 is the ip address of a computer in LAN,</span>
<span style="color: #666666; font-style: italic;"># 4262 is the tcp port for ed2k network,</span>
<span style="color: #666666; font-style: italic;"># 4272 is the udp port for kad network.</span>
&nbsp;
<span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-i</span> eth0 <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">-m</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">4262</span> <span style="color: #660033;">-j</span> DNAT <span style="color: #660033;">--to-destination</span> 192.168.0.2:<span style="color: #000000;">4262</span>
<span style="color: #660033;">-A</span> PREROUTING <span style="color: #660033;">-i</span> eth0 <span style="color: #660033;">-p</span> udp <span style="color: #660033;">-m</span> udp <span style="color: #660033;">--dport</span> <span style="color: #000000;">4272</span> <span style="color: #660033;">-j</span> DNAT <span style="color: #660033;">--to-destination</span> 192.168.0.2:<span style="color: #000000;">4272</span>
&nbsp;
<span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-d</span> 192.168.0.2<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">32</span> <span style="color: #660033;">-i</span> eth0 <span style="color: #660033;">-o</span> eth1 <span style="color: #660033;">-p</span> tcp <span style="color: #660033;">--dport</span> <span style="color: #000000;">4262</span> <span style="color: #660033;">-j</span> ACCEPT
<span style="color: #660033;">-A</span> FORWARD <span style="color: #660033;">-d</span> 192.168.0.2<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">32</span> <span style="color: #660033;">-i</span> eth0 <span style="color: #660033;">-o</span> eth1 <span style="color: #660033;">-p</span> udp <span style="color: #660033;">--dport</span> <span style="color: #000000;">4272</span> <span style="color: #660033;">-j</span> ACCEPT</pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2010/01/iptables-port-forwarding-for-emule/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>rtorrent with magnet link support</title>
		<link>http://phill84.org/2009/12/rtorrent-with-magnet-link-support/</link>
		<comments>http://phill84.org/2009/12/rtorrent-with-magnet-link-support/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 07:23:03 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[deb]]></category>
		<category><![CDATA[i386]]></category>
		<category><![CDATA[magnet]]></category>
		<category><![CDATA[rtorrent]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/12/rtorrent-with-magnet-link-support/</guid>
		<description><![CDATA[Yesterday I wanted to download a file but could find only magnet link. Since rtorrent doesn&#8217;t support magnet link yet officially, I did some research on google and came cross this great tutorial on how to patch the source from svn and get magnet link support. So here they are, deb packages for libtorrent and rtorrent. [...]]]></description>
			<content:encoded><![CDATA[<p>Yesterday I wanted to download a file but could find only magnet link. Since rtorrent doesn&#8217;t support magnet link yet officially, I did some research on google and came cross <a href="http://www.howtoforge.com/how-to-compile-rtorrent-from-svn-in-ubuntu-9.10-karmic-koala-debian-5-lenny-with-magnet-link-support">this great tutorial</a> on how to patch the source from svn and get magnet link support. So here they are, deb packages for libtorrent and rtorrent. These packages were built for my debian squeeze, so I&#8217;m not sure if they also work on ubuntu, but if you want you can try.</p>
Note: There is a file embedded within this post, please visit this post to download the file. Note: There is a file embedded within this post, please visit this post to download the file.
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/12/rtorrent-with-magnet-link-support/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Syncing twitter to digu using python / 用python同步twitter到嘀咕</title>
		<link>http://phill84.org/2009/10/syncing-twitter-to-digu-using-python-%e7%94%a8python%e5%90%8c%e6%ad%a5twitter%e5%88%b0%e5%98%80%e5%92%95/</link>
		<comments>http://phill84.org/2009/10/syncing-twitter-to-digu-using-python-%e7%94%a8python%e5%90%8c%e6%ad%a5twitter%e5%88%b0%e5%98%80%e5%92%95/#comments</comments>
		<pubDate>Fri, 30 Oct 2009 19:04:19 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[digu]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[sync]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[同步]]></category>
		<category><![CDATA[嘀咕]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/10/syncing-twitter-to-digu-using-python-%e7%94%a8python%e5%90%8c%e6%ad%a5twitter%e5%88%b0%e5%98%80%e5%92%95/</guid>
		<description><![CDATA[
#!/usr/bin/env python
import base64
import simplejson as json
import os
import sys
import urllib
import urllib2
&#160;
global twitter_username
global digu_username
global digu_password
twitter_username = 'username'
digu_username = 'username'
digu_password = 'password'
&#160;
def post_to_digu&#40;msg&#41;:
	url = 'http://api.minicloud.com.cn/statuses/update.json'
	data = urllib.urlencode&#40;msg&#41;
	req = urllib2.Request&#40;url, data&#41;
	req.add_header&#40;&#34;Authorization&#34;, &#34;Basic %s&#34; % base64.encodestring&#40;'%s:%s' % &#40;digu_username, digu_password&#41;&#41;&#91;:-1&#93;&#41;
	handle = urllib2.urlopen&#40;req&#41;
&#160;
def main&#40;&#41;:
	path = sys.path&#91;0&#93;
	if &#40;sys.platform&#91;:3&#93; == 'win'&#41;:
		path += '\\'
	else:
		path += '/'
	id_file = path + 'last_id'
	last_id = 0
	if os.path.exists&#40;id_file&#41;:
		f = open&#40;id_file, [...]]]></description>
			<content:encoded><![CDATA[
<div class="wp_syntax"><div class="code"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">base64</span>
<span style="color: #ff7700;font-weight:bold;">import</span> simplejson <span style="color: #ff7700;font-weight:bold;">as</span> json
<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>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">urllib2</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">global</span> twitter_username
<span style="color: #ff7700;font-weight:bold;">global</span> digu_username
<span style="color: #ff7700;font-weight:bold;">global</span> digu_password
twitter_username = <span style="color: #483d8b;">'username'</span>
digu_username = <span style="color: #483d8b;">'username'</span>
digu_password = <span style="color: #483d8b;">'password'</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> post_to_digu<span style="color: black;">&#40;</span>msg<span style="color: black;">&#41;</span>:
	url = <span style="color: #483d8b;">'http://api.minicloud.com.cn/statuses/update.json'</span>
	data = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span>msg<span style="color: black;">&#41;</span>
	req = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">Request</span><span style="color: black;">&#40;</span>url, data<span style="color: black;">&#41;</span>
	req.<span style="color: black;">add_header</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">&quot;Authorization&quot;</span>, <span style="color: #483d8b;">&quot;Basic %s&quot;</span> <span style="color: #66cc66;">%</span> <span style="color: #dc143c;">base64</span>.<span style="color: black;">encodestring</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>digu_username, digu_password<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
	handle = <span style="color: #dc143c;">urllib2</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>req<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
	path = <span style="color: #dc143c;">sys</span>.<span style="color: black;">path</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span><span style="color: #dc143c;">sys</span>.<span style="color: #dc143c;">platform</span><span style="color: black;">&#91;</span>:<span style="color: #ff4500;">3</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'win'</span><span style="color: black;">&#41;</span>:
		path += <span style="color: #483d8b;">'<span style="color: #000099; font-weight: bold;">\\</span>'</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		path += <span style="color: #483d8b;">'/'</span>
	id_file = path + <span style="color: #483d8b;">'last_id'</span>
	last_id = <span style="color: #ff4500;">0</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #dc143c;">os</span>.<span style="color: black;">path</span>.<span style="color: black;">exists</span><span style="color: black;">&#40;</span>id_file<span style="color: black;">&#41;</span>:
		f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>id_file, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span>
	        last_id = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>f.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        	f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">else</span>:
		f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>id_file, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
		f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'0'</span><span style="color: black;">&#41;</span>
		f.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
	url = <span style="color: #483d8b;">'http://twitter.com/statuses/user_timeline/'</span> + twitter_username + <span style="color: #483d8b;">'.json?last_id='</span>
	updates = json.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlopen</span><span style="color: black;">&#40;</span>url+<span style="color: #008000;">str</span><span style="color: black;">&#40;</span>last_id<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	new_last_id = <span style="color: #008000;">None</span>
	n = <span style="color: #ff4500;">0</span>
	<span style="color: #ff7700;font-weight:bold;">for</span> update <span style="color: #ff7700;font-weight:bold;">in</span> updates:
		text = update<span style="color: black;">&#91;</span><span style="color: #483d8b;">'text'</span><span style="color: black;">&#93;</span>
		<span style="color: #008000;">id</span> = update<span style="color: black;">&#91;</span><span style="color: #483d8b;">'id'</span><span style="color: black;">&#93;</span>
		<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>text<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> <span style="color: #66cc66;">!</span>= <span style="color: #483d8b;">'@'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">and</span> <span style="color: black;">&#40;</span><span style="color: #008000;">id</span> <span style="color: #66cc66;">&amp;</span>gt<span style="color: #66cc66;">;</span> last_id<span style="color: black;">&#41;</span>:
			<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>new_last_id <span style="color: #66cc66;">&amp;</span>lt<span style="color: #66cc66;">;</span> <span style="color: #008000;">id</span><span style="color: black;">&#41;</span>:
				new_last_id = <span style="color: #008000;">id</span>
			text = <span style="color: #dc143c;">urllib</span>.<span style="color: black;">quote</span><span style="color: black;">&#40;</span>text.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf-8'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
			msg = <span style="color: black;">&#123;</span><span style="color: #483d8b;">'content'</span>: text<span style="color: black;">&#125;</span>
                        stack.<span style="color: black;">append</span><span style="color: black;">&#40;</span>msg<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: black;">&#40;</span>stack<span style="color: black;">&#41;</span>
                post_to_digu<span style="color: black;">&#40;</span>stack.<span style="color: black;">pop</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
	<span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: black;">&#40;</span>new_last_id <span style="color: #66cc66;">!</span>= <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
		f = <span style="color: #008000;">open</span><span style="color: black;">&#40;</span>id_file, <span style="color: #483d8b;">'w'</span><span style="color: black;">&#41;</span>
		f.<span style="color: black;">write</span><span style="color: black;">&#40;</span><span style="color: #008000;">str</span><span style="color: black;">&#40;</span>new_last_id<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">&quot;__main__&quot;</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/10/syncing-twitter-to-digu-using-python-%e7%94%a8python%e5%90%8c%e6%ad%a5twitter%e5%88%b0%e5%98%80%e5%92%95/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Map of Fukien / 福建地圖</title>
		<link>http://phill84.org/2009/10/map-of-fukien-%e7%a6%8f%e5%bb%ba%e5%9c%b0%e5%9c%96/</link>
		<comments>http://phill84.org/2009/10/map-of-fukien-%e7%a6%8f%e5%bb%ba%e5%9c%b0%e5%9c%96/#comments</comments>
		<pubDate>Thu, 22 Oct 2009 16:18:35 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[blah]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/10/map-of-fukien-%e7%a6%8f%e5%bb%ba%e5%9c%b0%e5%9c%96/</guid>
		<description><![CDATA[
very funny, and somehow accurate  
]]></description>
			<content:encoded><![CDATA[<p><a href="http://phill84.org/wp-content/uploads/2009/10/map-of-fukien.jpg"><img class="alignnone size-medium wp-image-614" title="map of fukien" src="http://phill84.org/wp-content/uploads/2009/10/map-of-fukien-346x450.jpg" alt="map of fukien" width="346" height="450" /></a></p>
<p>very funny, and somehow accurate <img src='http://phill84.org/wp-includes/images/smilies/icon_biggrin.gif' alt=':D' class='wp-smiley' title="Map of Fukien / 福建地圖" /> </p>
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/10/map-of-fukien-%e7%a6%8f%e5%bb%ba%e5%9c%b0%e5%9c%96/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>中国政治坐标系测试（北大未名版）</title>
		<link>http://phill84.org/2009/09/%e4%b8%ad%e5%9b%bd%e6%94%bf%e6%b2%bb%e5%9d%90%e6%a0%87%e7%b3%bb%e6%b5%8b%e8%af%95%ef%bc%88%e5%8c%97%e5%a4%a7%e6%9c%aa%e5%90%8d%e7%89%88%ef%bc%89/</link>
		<comments>http://phill84.org/2009/09/%e4%b8%ad%e5%9b%bd%e6%94%bf%e6%b2%bb%e5%9d%90%e6%a0%87%e7%b3%bb%e6%b5%8b%e8%af%95%ef%bc%88%e5%8c%97%e5%a4%a7%e6%9c%aa%e5%90%8d%e7%89%88%ef%bc%89/#comments</comments>
		<pubDate>Fri, 11 Sep 2009 19:20:03 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[blah]]></category>
		<category><![CDATA[中国]]></category>
		<category><![CDATA[北大未名]]></category>
		<category><![CDATA[坐标系]]></category>
		<category><![CDATA[政治]]></category>
		<category><![CDATA[测试]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/09/%e4%b8%ad%e5%9b%bd%e6%94%bf%e6%b2%bb%e5%9d%90%e6%a0%87%e7%b3%bb%e6%b5%8b%e8%af%95%ef%bc%88%e5%8c%97%e5%a4%a7%e6%9c%aa%e5%90%8d%e7%89%88%ef%bc%89/</guid>
		<description><![CDATA[ 您的结果 



政治立场坐标


0.4







文化立场坐标


1







经济立场坐标


0.5



測試題目在這裡
]]></description>
			<content:encoded><![CDATA[<p><span style="font-size: x-small;"> <strong>您的结果</strong></span> <!-- GROUP ASSESSMENT: Score: 67 Min: 66.5 Max: 68.5--></p>
<table border="0" align="center">
<tbody>
<tr>
<th>政治立场坐标</th>
</tr>
<tr>
<td align="center">0.4</td>
</tr>
</tbody>
</table>
<p><!-- GROUP ASSESSMENT: Score: 40 Min: 38.5 Max: 40.5--></p>
<table border="0" align="center">
<tbody>
<tr>
<th>文化立场坐标</th>
</tr>
<tr>
<td align="center">1</td>
</tr>
</tbody>
</table>
<p><!-- GROUP ASSESSMENT: Score: 70 Min: 68.5 Max: 70.5--></p>
<table border="0" align="center">
<tbody>
<tr>
<th>经济立场坐标</th>
</tr>
<tr>
<td align="center">0.5</td>
</tr>
</tbody>
</table>
<p>測試題目在<a href="http://survey.farmostwood.net/index.php?sid=95475">這裡</a></p>
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/09/%e4%b8%ad%e5%9b%bd%e6%94%bf%e6%b2%bb%e5%9d%90%e6%a0%87%e7%b3%bb%e6%b5%8b%e8%af%95%ef%bc%88%e5%8c%97%e5%a4%a7%e6%9c%aa%e5%90%8d%e7%89%88%ef%bc%89/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>eva 0.4.921 svn79</title>
		<link>http://phill84.org/2009/09/eva-0-4-921-svn79/</link>
		<comments>http://phill84.org/2009/09/eva-0-4-921-svn79/#comments</comments>
		<pubDate>Sun, 06 Sep 2009 21:09:58 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[linux]]></category>
		<category><![CDATA[0.4.921]]></category>
		<category><![CDATA[79]]></category>
		<category><![CDATA[deb]]></category>
		<category><![CDATA[download]]></category>
		<category><![CDATA[eva]]></category>
		<category><![CDATA[evaq]]></category>
		<category><![CDATA[svn]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/09/eva-0-4-921-svn79/</guid>
		<description><![CDATA[從 jaunty 的 repository 裡面安裝的 eva 登錄就崩潰了, 自己從 svn 拉回來編譯了一個, 只編譯了 x86 的因為現在沒有 x64 的機器, 目前發現隱身可見的用戶發來消息的時候會崩潰&#8230; 有興趣的同學可以裝上試試
順便 fuck 麻花騰, qq for linux 就這麼停了
]]></description>
			<content:encoded><![CDATA[<p>從 jaunty 的 repository 裡面安裝的 eva 登錄就崩潰了, 自己從 svn 拉回來編譯了一個, 只編譯了 x86 的因為現在沒有 x64 的機器, 目前發現隱身可見的用戶發來消息的時候會崩潰&#8230; 有興趣的同學可以裝上試試</p>
<p>順便 fuck 麻花騰, qq for linux 就這麼停了</p>
Note: There is a file embedded within this post, please visit this post to download the file.
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/09/eva-0-4-921-svn79/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Tweetboard added</title>
		<link>http://phill84.org/2009/09/tweetboard-added/</link>
		<comments>http://phill84.org/2009/09/tweetboard-added/#comments</comments>
		<pubDate>Sat, 05 Sep 2009 11:17:44 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[blah]]></category>
		<category><![CDATA[tweetboard]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/09/tweetboard-added/</guid>
		<description><![CDATA[Tweetboard can be activated by either clicking on the button on the left side of the page or directly opening http://phill84.org/#tboard
The old twitter widget is removed
]]></description>
			<content:encoded><![CDATA[<p>Tweetboard can be activated by either clicking on the button on the left side of the page or directly opening <a href="http://phill84.org/#tboard">http://phill84.org/#tboard</a></p>
<p>The old twitter widget is removed</p>
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/09/tweetboard-added/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>KDE 4.3.1</title>
		<link>http://phill84.org/2009/09/kde-4-3-1/</link>
		<comments>http://phill84.org/2009/09/kde-4-3-1/#comments</comments>
		<pubDate>Thu, 03 Sep 2009 05:47:42 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[blah]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[kde4]]></category>
		<category><![CDATA[kubuntu]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/09/kde-4-3-1/</guid>
		<description><![CDATA[好吧 終於我也投奔到kde了


]]></description>
			<content:encoded><![CDATA[<p>好吧 終於我也投奔到kde了</p>
<p><a href="http://phill84.org/wp-content/uploads/2009/09/snapshot1.png"><img class="alignnone size-medium wp-image-607" title="snapshot1" src="http://phill84.org/wp-content/uploads/2009/09/snapshot1-450x270.png" alt="snapshot1 450x270 KDE 4.3.1" width="450" height="270" /></a></p>
<p><a href="http://phill84.org/wp-content/uploads/2009/09/snapshot2.png"><img class="alignnone size-medium wp-image-608" title="snapshot2" src="http://phill84.org/wp-content/uploads/2009/09/snapshot2-450x270.png" alt="snapshot2 450x270 KDE 4.3.1" width="450" height="270" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/09/kde-4-3-1/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Sysinfo plugin for xchat2 on linux</title>
		<link>http://phill84.org/2009/08/sysinfo-plugin-for-xchat2-on-linux/</link>
		<comments>http://phill84.org/2009/08/sysinfo-plugin-for-xchat2-on-linux/#comments</comments>
		<pubDate>Sun, 30 Aug 2009 19:23:59 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[linux]]></category>
		<category><![CDATA[perl]]></category>
		<category><![CDATA[plugin]]></category>
		<category><![CDATA[sysinfo]]></category>
		<category><![CDATA[xchat]]></category>

		<guid isPermaLink="false">http://phill84.org/2009/08/sysinfo-plugin-for-xchat2-on-linux/</guid>
		<description><![CDATA[It&#8217;s my first time writing something in perl, the code is not very efficient and for now it can only display info of cpu, memory, bandwidth and uptime.

# Configuration
$eth = &#34;eth0&#34;;
&#160;
# Script
Xchat::register&#40;&#34;Sysinfo&#34;, &#34;0.1&#34;, &#34;System Information Displayer&#34;&#41;;
Xchat::print&#40;&#34;Sysinfo 0.1 Loaded.&#34;&#41;;
Xchat::hook_command&#40;&#34;uptime&#34;, &#34;uptime&#34;&#41;;
Xchat::hook_command&#40;&#34;os&#34;, &#34;os&#34;&#41;;
Xchat::hook_command&#40;&#34;bw&#34;, &#34;bw&#34;&#41;;
Xchat::hook_command&#40;&#34;cpu&#34;, &#34;cpu&#34;&#41;;
Xchat::hook_command&#40;&#34;mem&#34;, &#34;mem&#34;&#41;;
&#160;
sub uptime &#123;
	$uptime = `cat /proc/uptime &#124; awk '{printf \$1}'`;
	$_day = 60 * [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s my first time writing something in perl, the code is not very efficient and for now it can only display info of cpu, memory, bandwidth and uptime.</p>

<div class="wp_syntax"><div class="code"><pre class="perl" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Configuration</span>
<span style="color: #0000ff;">$eth</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;eth0&quot;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Script</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">register</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Sysinfo&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;0.1&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;System Information Displayer&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #000066;">print</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Sysinfo 0.1 Loaded.&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">hook_command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;uptime&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;uptime&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">hook_command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;os&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;os&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">hook_command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;bw&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;bw&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">hook_command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;cpu&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;cpu&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
Xchat<span style="color: #339933;">::</span><span style="color: #006600;">hook_command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;mem&quot;</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;mem&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> uptime <span style="color: #009900;">&#123;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`cat /proc/uptime | awk '{printf <span style="color: #000099; font-weight: bold;">\$</span>1}'`</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$_day</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">24</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$_hour</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">60</span> <span style="color: #339933;">*</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$_minute</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">60</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$day</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$uptime</span><span style="color: #339933;">/</span><span style="color: #0000ff;">$_day</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">%=</span> <span style="color: #0000ff;">$_day</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$hour</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$uptime</span><span style="color: #339933;">/</span><span style="color: #0000ff;">$_hour</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">%=</span> <span style="color: #0000ff;">$_hour</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$minute</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$uptime</span><span style="color: #339933;">/</span><span style="color: #0000ff;">$_minute</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">%=</span> <span style="color: #0000ff;">$_minute</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$second</span> <span style="color: #339933;">=</span> <span style="color: #000066;">int</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$uptime</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$day</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$day</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$day</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; day &quot;</span><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: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; days &quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$hour</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$hour</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$hour</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; hour &quot;</span><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: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; hours &quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$minute</span> <span style="color: #339933;">!=</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$minute</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$minute</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; minute &quot;</span><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: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; minutes &quot;</span><span style="color: #339933;">;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$second</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$second</span> <span style="color: #339933;">==</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; second&quot;</span><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: #0000ff;">$uptime</span> <span style="color: #339933;">.=</span> <span style="color: #ff0000;">&quot; seconds&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	Xchat<span style="color: #339933;">::</span><span style="color: #006600;">command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;SAY <span style="color: #000099; font-weight: bold;">\0</span>02[UPTIME]<span style="color: #000099; font-weight: bold;">\0</span>02 $uptime&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	Xchat<span style="color: #339933;">::</span><span style="color: #006600;">EAT_ALL</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> os <span style="color: #009900;">&#123;</span>
	<span style="color: #0000ff;">$_kernel_release</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`uname -r`</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$_operating_system</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`uname -o`</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">chomp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$_kernel_release</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">chomp</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$_operating_system</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$os</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$_operating_system</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot; &quot;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">$_kernel_release</span><span style="color: #339933;">;</span>
	Xchat<span style="color: #339933;">::</span><span style="color: #006600;">command</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;SAY <span style="color: #000099; font-weight: bold;">\0</span>02[OS]<span style="color: #000099; font-weight: bold;">\0</span>02 $os&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	Xchat<span style="color: #339933;">::</span><span style="color: #006600;">EAT_ALL</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">sub</span> bw <span style="color: #009900;">&#123;</span>
	<span style="color: #0000ff;">$old</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`cat /proc/net/dev | grep $eth | cut -d &quot;:&quot; -f 2 | tr -s &quot; &quot;| cut -d &quot; &quot; -f 1,9`</span><span style="color: #339933;">;</span>
	<span style="color: #000066;">sleep</span><span style="color: #009900;">&#40;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$new</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">`cat /proc/net/dev | grep $eth | cut -d &quot;:&quot; -f 2 | tr -s &quot; &quot;| cut -d &quot; &quot; -f 1,9`</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">@ary_old</span> <span style="color: #339933;">=</span> <span style="color: #000066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\s/</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$old</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">@ary_new</span> <span style="color: #339933;">=</span> <span style="color: #000066;">split</span><span style="color: #009900;">&#40;</span><span style="color: #009966; font-style: italic;">/\s/</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$new</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$down</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$ary_new</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$ary_old</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">0</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$up</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">$ary_new</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">-</span> <span style="color: #0000ff;">$ary_old</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
	<span style="color: #0000ff;">$bw</span> <span style="color: #339933;">=</span> <span style="color: #ff0000;">&quot;&quot;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">$down</span> <span style="color: #339933;">&lt;</span> <span style="color: #cc66cc;">1000</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #0000ff;">$bw</span> <span style="color: #339933;">.=</span> <span style="color: #0000ff;">$down</span> <span style="color: #339933;">.</span> <span style="color: #ff0000;">&quot; B/s Down &quot;</span><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: #0000ff;">$bw</span> <span style="color: #339933;">.=</span> <span style="color: #000066;">sprintf</span><span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;%.02f&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">$down</span> <span style="color: #009966; font-style: italic;">/ 1000) . &quot; KB/s</span> Down <span style="color: #ff0000;">&quot;;
	}	
	if($up &lt; 1000) {
		$bw .= $up . &quot;</span> B<span style="color: #339933;">/</span><span style="color: #000066;">s</span> Up<span style="color: #ff0000;">&quot;;
	} else {
		$bw .= sprintf(&quot;</span><span style="color: #339933;">%.</span>02f<span style="color: #ff0000;">&quot;, $up / 1000) . &quot;</span> KB<span style="color: #339933;">/</span><span style="color: #000066;">s</span> Up<span style="color: #ff0000;">&quot;;
	}
	Xchat::command(&quot;</span>SAY \002<span style="color: #009900;">&#91;</span>BW<span style="color: #009900;">&#93;</span>\002 <span style="color: #0000ff;">$bw</span><span style="color: #ff0000;">&quot;);
	Xchat::EAT_ALL;
}
&nbsp;
sub cpu {
	$model_name = `cat /proc/cpuinfo | grep &quot;</span>model name<span style="color: #ff0000;">&quot; | tail -1 | cut -d &quot;</span><span style="color: #339933;">:</span><span style="color: #ff0000;">&quot; -f 2 | tr -s &quot;</span> <span style="color: #ff0000;">&quot;`;
	$number_cores = `cat /proc/cpuinfo | grep &quot;</span>model name<span style="color: #ff0000;">&quot; -c`;
	$freq = `cat /proc/cpuinfo | grep &quot;</span>cpu MHz<span style="color: #ff0000;">&quot; | tail -1 | cut -d &quot;</span><span style="color: #339933;">:</span><span style="color: #ff0000;">&quot; -f 2 | tr -s &quot;</span> <span style="color: #ff0000;">&quot;`;
	$idle = `vmstat | tail -1 | awk '{printf <span style="color: #000099; font-weight: bold;">\$</span>15}'`;
	$load = 100 - $idle;
	chomp($model_name);
	chomp($number_cores);
	chomp($freq);
	$cpuinfo = $number_cores . &quot;</span> CPU<span style="color: #ff0000;">&quot;;
	if($number_cores &gt; 1) {
		$cpuinfo .= &quot;</span><span style="color: #ff0000;">'s&quot;;
	}
	$cpuinfo .= &quot; -&quot; . $model_name;
	$cpuinfo .= &quot; @ &quot; . int($freq) . &quot; MHz&quot; . &quot; (&quot; . $load . &quot;% Load)&quot;;
	Xchat::command(&quot;SAY \002[CPU]\002 $cpuinfo&quot;);
	Xchat:EAT_ALL;
}
&nbsp;
sub mem {
	$mem_total = `free -m | grep Mem | awk '</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">printf</span> \<span style="color: #0000ff;">$2</span><span style="color: #009900;">&#125;</span><span style="color: #ff0000;">'`;
	$mem_used = `free -m | grep - | awk '</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">printf</span> \<span style="color: #0000ff;">$3</span><span style="color: #009900;">&#125;</span><span style="color: #ff0000;">'`;
	$swap_total = `free -m| grep Swap | awk '</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">printf</span> \<span style="color: #0000ff;">$2</span><span style="color: #009900;">&#125;</span><span style="color: #ff0000;">'`;
	$swap_used = `free -m| grep Swap | awk '</span><span style="color: #009900;">&#123;</span><span style="color: #000066;">printf</span> \<span style="color: #0000ff;">$3</span><span style="color: #009900;">&#125;</span><span style="color: #ff0000;">'`;
	$meminfo = &quot;\002[MEM]\002 &quot; . $mem_used . &quot;/&quot; . $mem_total . &quot; MB \002[SWAP]\002 &quot; . $swap_used . &quot;/&quot; . $swap_total . &quot; MB&quot;;
	Xchat::command(&quot;SAY $meminfo&quot;);
	Xchat::EAT_ALL;
}</span></pre></div></div>

]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2009/08/sysinfo-plugin-for-xchat2-on-linux/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
