<?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>Sat, 17 Apr 2010 13:13:02 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<item>
		<title>春・桜</title>
		<link>http://phill84.org/2010/04/%e6%98%a5%e3%83%bb%e6%a1%9c/</link>
		<comments>http://phill84.org/2010/04/%e6%98%a5%e3%83%bb%e6%a1%9c/#comments</comments>
		<pubDate>Sat, 10 Apr 2010 10:40:14 +0000</pubDate>
		<dc:creator>phill84</dc:creator>
				<category><![CDATA[blah]]></category>

		<guid isPermaLink="false">http://phill84.org/?p=624</guid>
		<description><![CDATA[Accidentally saw this cherry tree full of blossoms on the metro, I couldn&#8217;t help but got off the metro right away and took this picture with my iphone, so please pretend that you don&#8217;t notice the poor quality :p]]></description>
			<content:encoded><![CDATA[<p>Accidentally saw this cherry tree full of blossoms on the metro, I couldn&#8217;t help but got off the metro right away and took this picture with my iphone, so please pretend that you don&#8217;t notice the poor quality :p</p>
<div id="attachment_625" class="wp-caption alignnone" style="width: 347px"><a href="http://phill84.org/wp-content/uploads/2010/04/IMG_0052.jpg"><img class="size-medium wp-image-625 colorbox-624" title="桜" src="http://phill84.org/wp-content/uploads/2010/04/IMG_0052-337x450.jpg" alt="IMG 0052 337x450 春・桜" width="337" height="450" /></a><p class="wp-caption-text">桜</p></div>
]]></content:encoded>
			<wfw:commentRss>http://phill84.org/2010/04/%e6%98%a5%e3%83%bb%e6%a1%9c/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<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 [...]]]></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>
<pre class="brush: bash;">
# this example is based on the assumption that
# eth0 is WAN interface and eth1 is LAN interface,
# 192.168.0.2 is the ip address of a computer in LAN,
# 4262 is the tcp port for ed2k network,
# 4272 is the udp port for kad network.

-A PREROUTING -i eth0 -p tcp -m tcp --dport 4262 -j DNAT --to-destination 192.168.0.2:4262
-A PREROUTING -i eth0 -p udp -m udp --dport 4272 -j DNAT --to-destination 192.168.0.2:4272

-A FORWARD -d 192.168.0.2/32 -i eth0 -o eth1 -p tcp --dport 4262 -j ACCEPT
-A FORWARD -d 192.168.0.2/32 -i eth0 -o eth1 -p udp --dport 4272 -j ACCEPT
</pre>
]]></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>10</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 global twitter_username global digu_username global digu_password twitter_username = 'username' digu_username = 'username' digu_password = 'password' def post_to_digu(msg): url = 'http://api.minicloud.com.cn/statuses/update.json' data = urllib.urlencode(msg) req = urllib2.Request(url, data) req.add_header(&#34;Authorization&#34;, &#34;Basic %s&#34; % base64.encodestring('%s:%s' % (digu_username, digu_password))[:-1]) handle = urllib2.urlopen(req) def [...]]]></description>
			<content:encoded><![CDATA[<pre class="brush: python;">#!/usr/bin/env python
import base64
import simplejson as json
import os
import sys
import urllib
import urllib2

global twitter_username
global digu_username
global digu_password
twitter_username = 'username'
digu_username = 'username'
digu_password = 'password'

def post_to_digu(msg):
	url = 'http://api.minicloud.com.cn/statuses/update.json'
	data = urllib.urlencode(msg)
	req = urllib2.Request(url, data)
	req.add_header(&quot;Authorization&quot;, &quot;Basic %s&quot; % base64.encodestring('%s:%s' % (digu_username, digu_password))[:-1])
	handle = urllib2.urlopen(req)

def main():
	path = sys.path[0]
	if (sys.platform[:3] == 'win'):
		path += '\\'
	else:
		path += '/'
	id_file = path + 'last_id'
	last_id = 0
	if os.path.exists(id_file):
		f = open(id_file, 'r')
	        last_id = int(f.read())
        	f.close()
	else:
		f = open(id_file, 'w')
		f.write('0')
		f.close()
	url = 'http://twitter.com/statuses/user_timeline/' + twitter_username + '.json?last_id='
	updates = json.load(urllib.urlopen(url+str(last_id)))
	new_last_id = None
	n = 0
	for update in updates:
		text = update['text']
		id = update['id']
		if (text[0] != '@') and (id &amp;gt; last_id):
			if (new_last_id &amp;lt; id):
				new_last_id = id
			text = urllib.quote(text.encode('utf-8'))
			msg = {'content': text}
                        stack.append(msg)
        while (stack)
                post_to_digu(stack.pop())
	if (new_last_id != None):
		f = open(id_file, 'w')
		f.write(str(new_last_id))

if __name__ == &quot;__main__&quot;:
    main()</pre>
]]></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 colorbox-615" 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 colorbox-615' 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 colorbox-609" 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 colorbox-609" 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>
	</channel>
</rss>
