<?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>鬼の领地 &#187; 小程序</title>
	<atom:link href="http://blog.upsuper.org/category/%e5%b0%8f%e7%a8%8b%e5%ba%8f/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.upsuper.org</link>
	<description>the place where there are some ghost appearing...</description>
	<lastBuildDate>Wed, 19 Oct 2011 13:21:47 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
<xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" />
		<item>
		<title>关于饭否的两个小脚本</title>
		<link>http://blog.upsuper.org/two-scripts-for-fanfou/</link>
		<comments>http://blog.upsuper.org/two-scripts-for-fanfou/#comments</comments>
		<pubDate>Wed, 02 Feb 2011 04:06:24 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[饭否]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1197</guid>
		<description><![CDATA[前几天因为某些原因，我把饭否上所有的好友和关注者全部清空了。当然，如果没有程序的帮忙，估计还不等我删完我也就后悔了。 我没有那么狠心的把饭否的消息给清空，因为消息是不可恢复的（而且也太多了），但好友和关注者是可以的。做事情都给自己留后路显然是我一贯的风格，不然的话，我大概早从我家阳台跳下去了…… 两段脚本都不长，第一段是备份饭否的好友列表和关注者列表的，做的毫无泛用性，因为 bash 编程我并不很熟，只知道可以用 wget 来抓取。本来这种事情其实可以直接用 API 抓的，不过我想抓下我能直接看的东西，所以最终还是导出了 Cookie 抓网页。 第一段代码如下： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 #!/bin/bash &#160; mkdir friends for i in &#123;1..11&#125; [...]]]></description>
			<content:encoded><![CDATA[<p>前几天因为某些原因，我把饭否上所有的好友和关注者全部清空了。当然，如果没有程序的帮忙，估计还不等我删完我也就后悔了。</p>
<p>我没有那么狠心的把饭否的消息给清空，因为消息是不可恢复的（而且也太多了），但好友和关注者是可以的。做事情都给自己留后路显然是我一贯的风格，不然的话，我大概早从我家阳台跳下去了……<br />
<span id="more-1197"></span><br />
两段脚本都不长，第一段是备份饭否的好友列表和关注者列表的，做的毫无泛用性，因为 bash 编程我并不很熟，只知道可以用 wget 来抓取。本来这种事情其实可以直接用 API 抓的，不过我想抓下我能直接看的东西，所以最终还是导出了 Cookie 抓网页。</p>
<p>第一段代码如下：</p>

<div class="wp_codebox"><table><tr id="p11973"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
</pre></td><td class="code" id="p1197code3"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> friends
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>..11<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-k</span> <span style="color: #660033;">-e</span> <span style="color: #007800;">robots</span>=off <span style="color: #660033;">--load-cookies</span> cookies.txt <span style="color: #660033;">-P</span> friends<span style="color: #000000; font-weight: bold;">/</span> \
        http:<span style="color: #000000; font-weight: bold;">//</span>fanfou.com<span style="color: #000000; font-weight: bold;">/</span>friends<span style="color: #000000; font-weight: bold;">/</span>upsuper<span style="color: #000000; font-weight: bold;">/</span>p.<span style="color: #007800;">$i</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/friends\/upsuper\///g&quot;</span> \
        <span style="color: #ff0000;">&quot;friends/p.<span style="color: #007800;">$i</span>&quot;</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/friends/p.1/g&quot;</span> \
        <span style="color: #ff0000;">&quot;friends/p.<span style="color: #007800;">$i</span>&quot;</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/followers/..\/followers\/p.1/g&quot;</span> \
        <span style="color: #ff0000;">&quot;friends/p.<span style="color: #007800;">$i</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> followers
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span><span style="color: #000000;">1</span>..8<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #c20cb9; font-weight: bold;">wget</span> <span style="color: #660033;">-k</span> <span style="color: #660033;">-e</span> <span style="color: #007800;">robots</span>=off <span style="color: #660033;">--load-cookies</span> cookies.txt <span style="color: #660033;">-P</span> followers<span style="color: #000000; font-weight: bold;">/</span> \
        http:<span style="color: #000000; font-weight: bold;">//</span>fanfou.com<span style="color: #000000; font-weight: bold;">/</span>followers<span style="color: #000000; font-weight: bold;">/</span>upsuper<span style="color: #000000; font-weight: bold;">/</span>p.<span style="color: #007800;">$i</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/followers\/upsuper\///g&quot;</span> \
        <span style="color: #ff0000;">&quot;followers/p.<span style="color: #007800;">$i</span>&quot;</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/friends/..\/friends\/p.1/g&quot;</span> \
        <span style="color: #ff0000;">&quot;followers/p.<span style="color: #007800;">$i</span>&quot;</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/followers/p.1/g&quot;</span> \
        <span style="color: #ff0000;">&quot;followers/p.<span style="color: #007800;">$i</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> f <span style="color: #000000; font-weight: bold;">in</span> friends<span style="color: #000000; font-weight: bold;">/*</span> followers<span style="color: #000000; font-weight: bold;">/*</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/friends/..\/friends/g&quot;</span> \
        <span style="color: #ff0000;">&quot;followers/p.<span style="color: #007800;">$i</span>&quot;</span>
    <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-i</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;s/http:\/\/fanfou\.com\/followers/..\/followers/g&quot;</span> \
        <span style="color: #ff0000;">&quot;friends/p.<span style="color: #007800;">$i</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">done</span></pre></td></tr></table></div>

<p>想用的话，其中前两个 for 循环的数字必须改成自己的实际情况，里面的 upsuper 也要全数替换为自己的饭否ID，还有一个 cookies.txt 文件，可以用 Firefox 的 Cookie Exporter 插件从浏览器导出。</p>
<p>这个脚本非常值得赞美的一点是自动修复了所有的链接，使得在本地的页面全部可以通过链接进入，不在本地的页面也可以链接到饭否。这也是我调了很长世间的东西……</p>
<p>第二段脚本就是颇具破坏性的了：</p>

<div class="wp_codebox"><table><tr id="p11974"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code" id="p1197code4"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: utf8 - * -</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>
<span style="color: #ff7700;font-weight:bold;">import</span> json
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">socket</span> <span style="color: #ff7700;font-weight:bold;">import</span> timeout
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">urllib</span> <span style="color: #ff7700;font-weight:bold;">import</span> urlencode
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">base64</span> <span style="color: #ff7700;font-weight:bold;">import</span> b64encode
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">getpass</span> <span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">getpass</span>
<span style="color: #ff7700;font-weight:bold;">from</span> httplib2 <span style="color: #ff7700;font-weight:bold;">import</span> Http
&nbsp;
username = <span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Username: '</span><span style="color: black;">&#41;</span>
password = <span style="color: #dc143c;">getpass</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'Password: '</span><span style="color: black;">&#41;</span>
auth = <span style="color: #483d8b;">'Basic '</span> + b64encode<span style="color: black;">&#40;</span><span style="color: #483d8b;">'%s:%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>username, password<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
headers = <span style="color: black;">&#123;</span> <span style="color: #483d8b;">'Authorization'</span>: auth <span style="color: black;">&#125;</span>
&nbsp;
h = Http<span style="color: black;">&#40;</span>timeout=<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
<span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span> = <span style="color: #dc143c;">sys</span>.<span style="color: black;">stderr</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Delete friends</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Delete friends:'</span>
resp, content = h.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://api.fanfou.com/friends/ids.json'</span>, headers=headers<span style="color: black;">&#41;</span>
friends = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>content<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> friend <span style="color: #ff7700;font-weight:bold;">in</span> friends:
    query_str = urlencode<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span> <span style="color: #483d8b;">'id'</span>: friend.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span> <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> friend.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>,
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        resp, content = h.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://api.fanfou.com/friendships/destroy.json?'</span> + query_str, <span style="color: #483d8b;">'POST'</span>, headers=headers<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> timeout:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'timeout'</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> resp.<span style="color: black;">status</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Delete followers</span>
<span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Delete followers:'</span>
resp, content = h.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://api.fanfou.com/followers/ids.json'</span>, headers=headers<span style="color: black;">&#41;</span>
followers = json.<span style="color: black;">loads</span><span style="color: black;">&#40;</span>content<span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> follower <span style="color: #ff7700;font-weight:bold;">in</span> followers:
    query_str = urlencode<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span> <span style="color: #483d8b;">'id'</span>: follower.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span> <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">print</span> follower.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>,
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        resp, content = h.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://api.fanfou.com/blocks/create.xml?'</span> + query_str, <span style="color: #483d8b;">'POST'</span>, headers=headers<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> timeout:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'timeout'</span>,
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> resp.<span style="color: black;">status</span>,
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        resp, content = h.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'http://api.fanfou.com/blocks/destroy.xml?'</span> + query_str, <span style="color: #483d8b;">'POST'</span>, headers=headers<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> timeout:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'timeout'</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> resp.<span style="color: black;">status</span></pre></td></tr></table></div>

<p>这段 Python 脚本其实颇具我写饭否应用的风格。这段脚本还是比较有泛用性的，进入的时候会提示输入饭否id和密码，然后他也会自动备份一个 JSON 格式的饭否好友列表和关注者列表。只是处于周全我才做的这一步，其实是完全没有必要的，因为我已经备份过了，而且我也不准备让程序帮我全部还原……</p>
<p>正好清理一下两个列表……</p>
<p>原理就不多做介绍了。第二段脚本在运行开始清理好友的时候，可能会连续出现 timeout 的情况不必在意，因为饭否似乎会在这个 API 执行的时候处理 timeline 的缓存。不过据我观察，脚本运行结束后，似乎会有部分好友留下，数量对我来说少于十个，可以快速手动清除……</p>
<p>出于观察输出的考虑，我没有用多线程。脚本删除关注者的原理是加入黑名单再取消黑名单，如果加入了黑名单在取消的时候没有成功，那就意味着误加了，这是找不到的，因为黑名单的列表似乎无法察看……</p>
<p>就这样了……我现在已经逐渐的开始恢复饭否活动了……不过还不准备完全回到过去……以上</p>
<p>突然觉得，第一段脚本可以用 make 实现？</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/two-scripts-for-fanfou/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Rhythmbox 封面艺人插件的中国版</title>
		<link>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/</link>
		<comments>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/#comments</comments>
		<pubDate>Tue, 19 Oct 2010 05:17:05 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[rhythmbox]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1186</guid>
		<description><![CDATA[上一篇日志里面我做了一个从 VeryCD 为 Rhythmbox 提取专辑封面的程序，后来想到豆瓣其实也有这个东西，于是又做了一个豆瓣的。然后想，既然这样我干脆把原来的封面艺人插件 fork 出来，自己开一个新项目，专门做封面艺人插件的 China Mod~ 现在已经开好了，就在 Google Code 上：http://code.google.com/p/rhythmbox-artdisplay-cn/ 其实说 Mod 也不算，就是加了几个扩展进去……主要是考虑到如果不 fork 似乎很单独安装，所以就 fork 出来了……那个插件看过去也很长时间没有更新了呢？ 第一个版本0.1可以点击这里下载：rhythmbox-artdisplay-cn-0.1.tar.bz2，暂时还没有做任何安装包，deb 包和 arch 的包应该会随后奉上~ 安装很简单，常规的 make 和 make install 就可以了~ 如果各位有什么改进意见，欢迎提出~]]></description>
			<content:encoded><![CDATA[<p>上一篇日志里面我做了一个从 VeryCD 为 Rhythmbox 提取专辑封面的程序，后来想到豆瓣其实也有这个东西，于是又做了一个豆瓣的。然后想，既然这样我干脆把原来的封面艺人插件 fork 出来，自己开一个新项目，专门做封面艺人插件的 China Mod~</p>
<p>现在已经开好了，就在 Google Code 上：<a href="http://code.google.com/p/rhythmbox-artdisplay-cn/">http://code.google.com/p/rhythmbox-artdisplay-cn/</a></p>
<p>其实说 Mod 也不算，就是加了几个扩展进去……主要是考虑到如果不 fork 似乎很单独安装，所以就 fork 出来了……那个插件看过去也很长时间没有更新了呢？</p>
<p>第一个版本0.1可以点击这里下载：<a href="http://rhythmbox-artdisplay-cn.googlecode.com/files/rhythmbox-artdisplay-cn-0.1.tar.bz2">rhythmbox-artdisplay-cn-0.1.tar.bz2</a>，暂时还没有做任何安装包，deb 包和 arch 的包应该会随后奉上~</p>
<p>安装很简单，常规的 make 和 make install 就可以了~</p>
<p>如果各位有什么改进意见，欢迎提出~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>利用 VeryCD 给 Rhythmbox 添加专辑封面</title>
		<link>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/</link>
		<comments>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/#comments</comments>
		<pubDate>Mon, 18 Oct 2010 11:54:14 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[rhythmbox]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VeryCD]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1179</guid>
		<description><![CDATA[我们知道 Rhythmbox 里面有一个插件叫做“封面艺人”，可以通过互联网下载对应专辑的封面图片。可是，那个插件使用的似乎是美国的 Amazon，中文歌曲基本找不到对应封面，怎么办呢…… 想到我的很多专辑都是从 VeryCD 上下载的，那些下载页面通常都会有专辑封面图片，于是我就写了个封面艺人的扩展，让其可以从 VeryCD 上搜索专辑，并下载相应专辑封面。这个扩展可以在这里下载：verycd-cover.tar.bz2 (5KB) 下载解压后，运行其中的 compile.py，然后把除了 compile.py 以外的四个文件拷贝到 Rhythmbox 的封面艺人插件的目录就可以了，在 Ubuntu 下，那个目录是 /usr/lib/rhythmbox/plugins/artdisplay。 已知问题 写这个总共没花多少时间，所以也不能指望十分精品。实现的基本方式就是通过 VeryCD 的搜索 API 获得匹配的 ID，然后进去寻找是否有封面图片。 这种做法有很多局限性，比如可能有的专辑不是独立为一个页面的，这样可能获取的封面是错误的…… 此外，由于 Rhythmbox 对于不写艺术家一项的歌曲，艺术家会返回“未知”，如果直接用“未知”去找，十有八九是找不到的，所以我在代码里着了点特判，不知道有没有更优美的方法…… 话说，我发现豆瓣音乐似乎也有不少资源，这样还可以写一个从豆瓣获取封面的扩展~]]></description>
			<content:encoded><![CDATA[<p>我们知道 Rhythmbox 里面有一个插件叫做“封面艺人”，可以通过互联网下载对应专辑的封面图片。可是，那个插件使用的似乎是美国的 Amazon，中文歌曲基本找不到对应封面，怎么办呢……</p>
<p>想到我的很多专辑都是从 VeryCD 上下载的，那些下载页面通常都会有专辑封面图片，于是我就写了个封面艺人的扩展，让其可以从 VeryCD 上搜索专辑，并下载相应专辑封面。这个扩展可以在这里下载：<a href="http://down.upsuper.org/verycd-cover.tar.bz2">verycd-cover.tar.bz2</a> (5KB)</p>
<p>下载解压后，运行其中的 compile.py，然后把除了 compile.py 以外的四个文件拷贝到 Rhythmbox 的封面艺人插件的目录就可以了，在 Ubuntu 下，那个目录是 /usr/lib/rhythmbox/plugins/artdisplay。<br />
<span id="more-1179"></span></p>
<h3>已知问题</h3>
<p>写这个总共没花多少时间，所以也不能指望十分精品。实现的基本方式就是通过 VeryCD 的搜索 API 获得匹配的 ID，然后进去寻找是否有封面图片。</p>
<p>这种做法有很多局限性，比如可能有的专辑不是独立为一个页面的，这样可能获取的封面是错误的……</p>
<p>此外，由于 Rhythmbox 对于不写艺术家一项的歌曲，艺术家会返回“未知”，如果直接用“未知”去找，十有八九是找不到的，所以我在代码里着了点特判，不知道有没有更优美的方法……</p>
<p>话说，我发现豆瓣音乐似乎也有不少资源，这样还可以写一个从豆瓣获取封面的扩展~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>寻找更高仿的 ID 第二季</title>
		<link>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/</link>
		<comments>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/#comments</comments>
		<pubDate>Sat, 11 Sep 2010 07:31:17 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[贴吧]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1172</guid>
		<description><![CDATA[继上一篇文章之后，我又下大力气对这个程序做了许多修改，在精确度和速度方面似乎都有些许提高。在此推出第二季~ 使用真正的12px宋体 在上一次的程序中使用的 PIL 似乎是因为不支持宋体 ttc 文件中对于小字体下优化的点阵形式，才在选择小于 19px 的字号时不能正确渲染汉字。考虑到这一点，我就想到把 ttc 文件里面 12px 的点阵字体单独提取出来使用，毕竟贴吧上面显示 ID 都是用这个字号显示的。 使用 FontForge 提取出来了 simsun-12.bdf 文件，就是宋体 12px 下的点阵。参考 PIL 的手册，发现 PIL 不能直接使用 .bdf 文件，需要使用一个叫做 pilfont 的脚本转换成专有的 .pil 文件才行。我想转换就转换呗。simsun-12.bdf 一个 2.4MB 的文件，转换完就剩不到 100KB，我就觉得肯定有问题，用 PIL 导入，发现还是不能渲染中文。后来知道，这个 .pil 文件根本不支持非拉丁字母的字符，它的储存空间限定了 256 个字符…… 无奈了，这意味着 PIL 完全无法支持中文点阵了…… 当然，办法总归是有的，那就是——抛弃 PIL！为什么我能有这样的想法呢，因为看到 .bdf 文件是 UNIX 标准的。UNIX 标准意味着什么呢？记不记得 UNIX 有一个非常好的传统叫做，尽量使用纯文本。是的，这虽然让有些文件会变得太大，不过同时也让这些东西更容易被其他程序读取，而 .bdf [...]]]></description>
			<content:encoded><![CDATA[<p>继上一篇文章之后，我又下大力气对这个程序做了许多修改，在精确度和速度方面似乎都有些许提高。在此推出第二季~</p>
<h3>使用真正的12px宋体</h3>
<p>在上一次的程序中使用的 PIL 似乎是因为不支持宋体 ttc 文件中对于小字体下优化的点阵形式，才在选择小于 19px 的字号时不能正确渲染汉字。考虑到这一点，我就想到把 ttc 文件里面 12px 的点阵字体单独提取出来使用，毕竟贴吧上面显示 ID 都是用这个字号显示的。</p>
<p>使用 FontForge 提取出来了 simsun-12.bdf 文件，就是宋体 12px 下的点阵。参考 PIL 的手册，发现 PIL 不能直接使用 .bdf 文件，需要使用一个叫做 pilfont 的脚本转换成专有的 .pil 文件才行。我想转换就转换呗。simsun-12.bdf 一个 2.4MB 的文件，转换完就剩不到 100KB，我就觉得肯定有问题，用 PIL 导入，发现还是不能渲染中文。后来知道，这个 .pil 文件根本不支持非拉丁字母的字符，它的储存空间限定了 256 个字符……</p>
<p>无奈了，这意味着 PIL 完全无法支持中文点阵了……</p>
<p>当然，办法总归是有的，那就是——抛弃 PIL！为什么我能有这样的想法呢，因为看到 .bdf 文件是 UNIX 标准的。UNIX 标准意味着什么呢？记不记得 UNIX 有一个非常好的传统叫做，尽量使用纯文本。是的，这虽然让有些文件会变得太大，不过同时也让这些东西更容易被其他程序读取，而 .bdf 恰好即使这么一种文件。</p>
<p>这样读取 .bdf 点阵字体文件的程序自己写不就好了，什么额外的库都不需要……当然，纠错性极弱就是了~</p>

<div class="wp_codebox"><table><tr id="p11729"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
</pre></td><td class="code" id="p1172code9"><pre class="python" style="font-family:monospace;">line_count = <span style="color: #ff4500;">0</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">global</span> line_count
    line_count += <span style="color: #ff4500;">1</span>
    line = f.<span style="color: #dc143c;">readline</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> line:
        <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">False</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> line<span style="color: black;">&#91;</span>:-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>.<span style="color: black;">split</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">with</span> <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'simsun-12.bdf'</span>, <span style="color: #483d8b;">'r'</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">as</span> f:
    chars = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
    line = <span style="color: black;">&#91;</span><span style="color: #483d8b;">''</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">try</span>:
        <span style="color: #808080; font-style: italic;"># 获得字符总数</span>
        <span style="color: #ff7700;font-weight:bold;">while</span> line<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;">'CHARS'</span>:
            line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
        <span style="color: #808080; font-style: italic;"># 读取所有字符</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><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">assert</span> read_split<span style="color: black;">&#40;</span>f<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;">'STARTCHAR'</span>
            line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># 编码</span>
            <span style="color: #ff7700;font-weight:bold;">assert</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'ENCODING'</span>
            char = <span style="color: #008000;">unichr</span><span style="color: black;">&#40;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># 绘制参数</span>
            <span style="color: #ff7700;font-weight:bold;">assert</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'BBX'</span>
            width, height, x1, y1 = <span style="color: black;">&#91;</span><span style="color: #008000;">int</span><span style="color: black;">&#40;</span>x<span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span>:<span style="color: black;">&#93;</span><span style="color: black;">&#93;</span>
            x0, y0 = <span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span> + x1, <span style="color: #ff4500;">12</span> - y1 - height<span style="color: black;">&#41;</span>
            <span style="color: #808080; font-style: italic;"># 准备绘制文字</span>
            base_image = <span style="color: black;">&#91;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span> <span style="color: #ff7700;font-weight:bold;">for</span> y <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span><span style="color: black;">&#93;</span>
            <span style="color: #808080; font-style: italic;"># 读取并绘制文字</span>
            line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">assert</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'BITMAP'</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> y <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>y0, y0 + height<span style="color: black;">&#41;</span>:
                line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>
                bits = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>line, <span style="color: #ff4500;">16</span><span style="color: black;">&#41;</span>
                bits <span style="color: #66cc66;">&gt;&gt;</span>= <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>line<span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #ff4500;">4</span> - width
                <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>x0 + width - <span style="color: #ff4500;">1</span>, x0 - <span style="color: #ff4500;">1</span>, -<span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>:
                    base_image<span style="color: black;">&#91;</span>y<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span> = bits <span style="color: #66cc66;">&amp;</span> <span style="color: #ff4500;">1</span>
                    bits <span style="color: #66cc66;">&gt;&gt;</span>= <span style="color: #ff4500;">1</span>
            chars<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span> = base_image
            <span style="color: #808080; font-style: italic;"># 结束这个文字</span>
            line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
            <span style="color: #ff7700;font-weight:bold;">assert</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'ENDCHAR'</span>
        line = read_split<span style="color: black;">&#40;</span>f<span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">assert</span> line<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> == <span style="color: #483d8b;">'ENDFONT'</span>
    <span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">AssertionError</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'line'</span>, line_count
        <span style="color: #ff7700;font-weight:bold;">raise</span></pre></td></tr></table></div>

<p>这样所有的字符就被读入，并变成一个单色像素二位数组了。</p>
<p>当然，这个性能很低，在我的机器上转换读取文件的2W+字符大概需要 18s，这可能也是为什么 PIL 要选择进行转换。事实上，使用纯文本储存一直以来都给 UNIX 风格的这一类软件带来一定性能缺陷。不过其实，这很值得，因为方便。</p>
<p>不过这个时间确实是太长了，更何况我们到目前为止还什么都没处理。怎么办呢？两个想法：一、优化代码；二、保存处理的数据。</p>
<p>第一种，基本上是没什么希望了，而且即使能优化，估计效果也不会太好，可能省个几秒封顶了。第二个显然不是个坏想法。</p>
<p>Python 在数据的持续化方面还是有很多现成的东西的，比如 pickle 什么的。不过那个速度太慢，而且是纯文本！好吧，偶尔我也会不喜欢纯文本，因为在这里意义不大……因此选择了 marshal。marshal 也是一个用于数据持续化的库，不过仅能对 Python 的内部类型进行。我会看中它最重要的原因就是它的应用范围极其有限，只能持续化内部类型。如果一个 Python 标准库，它有很明显的限制，却没有标明不推荐或在新版中被剔除，说明它必然有一个其他库不可及的优势。对于 marshal，我猜它的优势就是效率。</p>
<p>使用 marshal 就很简单了……</p>

<div class="wp_codebox"><table><tr id="p117210"><td class="line_numbers"><pre>62
63
</pre></td><td class="code" id="p1172code10"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">marshal</span>
<span style="color: #dc143c;">marshal</span>.<span style="color: black;">dump</span><span style="color: black;">&#40;</span>chars, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'base_image'</span>, <span style="color: #483d8b;">'wb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这样后面的处理不需要不断重复这个低效的步骤了~</p>
<h3>处理文字图像</h3>
<p>原来是用 PIL 处理文字图像，现在抛弃 PIL 了，就得自己写了……不过这样也很好，自由发挥的空间很大了~</p>
<p>我猜用的是 Matrix67 大牛的那种在附近留阴影的方法，不过似乎我写的不够好就是了，怎么测试效果都不大理想。除此之外，纯 Python 实现的算法效率和 PIL 这种包装还是没得比，很简单的算法却慢的不得了……</p>
<p>下面是目前的处理代码：</p>

<div class="wp_codebox"><table><tr id="p117211"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p1172code11"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: utf8 - * -</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">marshal</span>
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">copy</span>
&nbsp;
base_chars = <span style="color: #dc143c;">marshal</span>.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'base_image'</span>, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
chars = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> char, image <span style="color: #ff7700;font-weight:bold;">in</span> base_chars.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    new_image = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> y <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>:
        new_row = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> x <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> image<span style="color: black;">&#91;</span>y<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span>:
                value = <span style="color: #ff4500;">81</span>
            <span style="color: #ff7700;font-weight:bold;">else</span>:
                value = <span style="color: #ff4500;">0</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> y <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> image<span style="color: black;">&#91;</span>y-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span>:
                value += <span style="color: #ff4500;">4</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> y <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">13</span> <span style="color: #ff7700;font-weight:bold;">and</span> image<span style="color: black;">&#91;</span>y+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x<span style="color: black;">&#93;</span>:
                value += <span style="color: #ff4500;">4</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">&gt;</span> <span style="color: #ff4500;">0</span> <span style="color: #ff7700;font-weight:bold;">and</span> image<span style="color: black;">&#91;</span>y<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x-<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
                value += <span style="color: #ff4500;">4</span>
            <span style="color: #ff7700;font-weight:bold;">if</span> x <span style="color: #66cc66;">&lt;</span> <span style="color: #ff4500;">13</span> <span style="color: #ff7700;font-weight:bold;">and</span> image<span style="color: black;">&#91;</span>y<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span>x+<span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span>:
                value += <span style="color: #ff4500;">4</span>
            new_image.<span style="color: black;">append</span><span style="color: black;">&#40;</span>value<span style="color: black;">&#41;</span>
    chars<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span> = new_image
&nbsp;
<span style="color: #dc143c;">marshal</span>.<span style="color: black;">dump</span><span style="color: black;">&#40;</span>chars, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'advanced_data'</span>, <span style="color: #483d8b;">'wb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>处理效果不是很理想就是了，耗时大概也是 30s+。</p>
<h3>寻找相似字符</h3>
<p>其实这个部分就是一样的了……直接贴代码好了……</p>

<div class="wp_codebox"><table><tr id="p117212"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p1172code12"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: utf8 - * -</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">marshal</span>
&nbsp;
chars = <span style="color: #dc143c;">marshal</span>.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'advanced_data'</span>, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> image_diff<span style="color: black;">&#40;</span>image1, image2<span style="color: black;">&#41;</span>:
    ret = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> v1, v2 <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>image1, image2<span style="color: black;">&#41;</span>:
        ret += <span style="color: black;">&#40;</span>v1 - v2<span style="color: black;">&#41;</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
remember_number = <span style="color: #ff4500;">5</span>
<span style="color: #ff7700;font-weight:bold;">try</span>:
    searched = <span style="color: #dc143c;">marshal</span>.<span style="color: black;">load</span><span style="color: black;">&#40;</span><span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'searched_chars'</span>, <span style="color: #483d8b;">'rb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">except</span> <span style="color: #008000;">IOError</span>:
    searched = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
    input_string = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ID: '</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> input_string:
        <span style="color: #ff7700;font-weight:bold;">break</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> char <span style="color: #ff7700;font-weight:bold;">in</span> input_string:
        <span style="color: #ff7700;font-weight:bold;">if</span> char <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> chars:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        <span style="color: #ff7700;font-weight:bold;">if</span> char <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> searched:
            diff_data = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
            image = chars<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span>
            <span style="color: #ff7700;font-weight:bold;">for</span> c, v <span style="color: #ff7700;font-weight:bold;">in</span> chars.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
                <span style="color: #ff7700;font-weight:bold;">if</span> c == char:
                    <span style="color: #ff7700;font-weight:bold;">continue</span>
                diff_data.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>image_diff<span style="color: black;">&#40;</span>v, image<span style="color: black;">&#41;</span>, c<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
            diff_data.<span style="color: black;">sort</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
            searched<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span> = diff_data<span style="color: black;">&#91;</span>:remember_number<span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> char,
        <span style="color: #ff7700;font-weight:bold;">for</span> item <span style="color: #ff7700;font-weight:bold;">in</span> searched<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'({0}, {1})'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span><span style="color: #66cc66;">*</span>item<span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span>
    <span style="color: #ff7700;font-weight:bold;">print</span>
&nbsp;
<span style="color: #dc143c;">marshal</span>.<span style="color: black;">dump</span><span style="color: black;">&#40;</span>searched, <span style="color: #008000;">open</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'searched_chars'</span>, <span style="color: #483d8b;">'wb'</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>和上次不同的是查找过的字会被保存下来，效率可以高一些……</p>
<h3>继续改进</h3>
<p>现在的主要问题就是如何提高相似度的识别精度了……目前的想法是通过逐像素比对测试两个字的相似度，最多加一些模糊化什么的处理。doggy 提出一个想法是计算连通区域面积的比例，我个人认为不大可行……我的想法是识别文字的笔画，把文字的骨架弄出来，然后对比什么的，可能效果更好吧？</p>
<p>不知道各位还有没有其他什么想法？</p>
<h3>下载</h3>
<p>最后是完整版的目前的程序以及已经生成的数据，各位有兴趣可以直接拿来试用了……<a href="http://down.upsuper.org/find-similar-character.tar.bz2">find-similar-character.tar.bz2</a> (1.7MB)</p>
<h3>参考资料</h3>
<ul>
<li><a href="http://www.pkucn.com/viewthread.php?tid=202692">我想把simsun.ttf里的12号点阵字体单独提取出来做成一个ttf &#8211; 北大中文论坛</a></li>
<li><a href="http://en.wikipedia.org/wiki/Glyph_Bitmap_Distribution_Format">Glyph Bitmap Distribution Format &#8211; Wikipedia</a></li>
<li><a href="http://www.adobe.com/devnet/font/pdfs/5005.BDF_Spec.pdf">Glyph Bitmap Distribution Format (BDF) Specification &#8211; Adobe Developer Support</a></li>
<li><a href="http://docs.python.org/library/marshal.html">marshal — Internal Python object serialization &#8211; Python documentation</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>寻找更高仿的 ID</title>
		<link>http://blog.upsuper.org/finding-higher-imitation-of-id/</link>
		<comments>http://blog.upsuper.org/finding-higher-imitation-of-id/#comments</comments>
		<pubDate>Thu, 09 Sep 2010 10:21:43 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[贴吧]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1169</guid>
		<description><![CDATA[今天大学军训完了，不想做什么正经事，就想到前一段时间想做的寻找相似汉字的程序，用以寻找更高仿的贴吧 ID。用程序来寻找相似汉字，从另一个角度，也是从 Matrix67 大牛的一篇日志里得到的启发。不过 Matrix67 大牛使用的是 Mathematica 来寻找，我不大会 Mathematica，就想用我熟悉的 Python 来解决，毕竟 Python 是一个很强大的东西~ 其实寻找的思路很简单，就是把某个汉字当作图片弄出来，让后对比两个图片的相似程度。因此做这个程序的第一步就是研究如何用 Python 处理图片和文字。Python 有一个非常著名的第三方库，名叫 Python Imaging Library，简称 PIL，就是专门用来处理图片的。 文字 to 图像 PIL 可以很轻松的将文字转换为图像，并且提供了虽然不能说是强大，但暂时够用的图像处理函数。 处理文字生成的图像，显然和彩色没有太大关系，因此可以使用灰度图像节省计算需要的空间和时间。此外我们知道，文字到图像有一个中间媒介，就是字体。因此我们必须先确定我们需要的字体和大小。用 Firebug 考查贴吧用于显示 ID 的字体和大小，发现是宋体 12px。这样参考 PIL 的手册，就有了最基本的文字到图片的代码了： 1 2 3 4 5 6 import Image, ImageDraw, ImageFont image = Image.new&#40;'L', &#91;14, 14&#93;, 255&#41; draw = ImageDraw.Draw&#40;image&#41; font = [...]]]></description>
			<content:encoded><![CDATA[<p>今天大学军训完了，不想做什么正经事，就想到前一段时间想做的寻找相似汉字的程序，用以寻找更高仿的贴吧 ID。用程序来寻找相似汉字，从另一个角度，也是从 Matrix67 大牛的一篇日志里得到的启发。不过 Matrix67 大牛使用的是 Mathematica 来寻找，我不大会 Mathematica，就想用我熟悉的 Python 来解决，毕竟 Python 是一个很强大的东西~<br />
<span id="more-1169"></span><br />
其实寻找的思路很简单，就是把某个汉字当作图片弄出来，让后对比两个图片的相似程度。因此做这个程序的第一步就是研究如何用 Python 处理图片和文字。Python 有一个非常著名的第三方库，名叫 Python Imaging Library，简称 PIL，就是专门用来处理图片的。</p>
<h3>文字 to 图像</h3>
<p>PIL 可以很轻松的将文字转换为图像，并且提供了虽然不能说是强大，但暂时够用的图像处理函数。</p>
<p>处理文字生成的图像，显然和彩色没有太大关系，因此可以使用灰度图像节省计算需要的空间和时间。此外我们知道，文字到图像有一个中间媒介，就是字体。因此我们必须先确定我们需要的字体和大小。用 Firebug 考查贴吧用于显示 ID 的字体和大小，发现是宋体 12px。这样参考 PIL 的手册，就有了最基本的文字到图片的代码了：</p>

<div class="wp_codebox"><table><tr id="p116918"><td class="line_numbers"><pre>1
2
3
4
5
6
</pre></td><td class="code" id="p1169code18"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Image, ImageDraw, ImageFont
image = Image.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'L'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>
font = ImageFont.<span style="color: black;">truetype</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'simsun.ttc'</span>, <span style="color: #ff4500;">12</span><span style="color: black;">&#41;</span>
draw.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span>, <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>, u<span style="color: #483d8b;">'好'</span>, font=font<span style="color: black;">&#41;</span>
image.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hw.png'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>看过去这个代码是正确的，不过在查看 hw.png 后，我发现并没有出现预期的“好”字，而是一堆混乱的东西，不知何故。后经过不断实验，发现只有当初始的文字大小设定为19或以上时，文字才可以被正确地绘制出来，_-b</p>
<p>于是不得不修改这段代码，让它先绘制一个大的，再缩放成需要的大小：</p>

<div class="wp_codebox"><table><tr id="p116919"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1169code19"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> Image, ImageDraw, ImageFont
image = Image.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'L'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">28</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>
font = ImageFont.<span style="color: black;">truetype</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'simsun.ttc'</span>, <span style="color: #ff4500;">24</span><span style="color: black;">&#41;</span>
draw.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, u<span style="color: #483d8b;">'好'</span>, font=font<span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># 抗锯齿方式缩放</span>
image = image.<span style="color: black;">resize</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>, Image.<span style="color: black;">ANTIALIAS</span><span style="color: black;">&#41;</span>
image.<span style="color: black;">save</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'hw.png'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>效果还不错。</p>
<h3>枚举汉字</h3>
<p>然后来找一种方式来枚举汉字。参考维基百科的 GB2312 条目，确定了 GB2312 中汉字区的编码，为第一个字节 0xB0-0xF7，第二个字节 0xA1-0xFE，其中 D7FA-D7FE 是空的，这样共有6763个汉字拿来搞。</p>
<p>其实还是挺少的就是了……</p>
<p>于是枚举汉字的代码：</p>

<div class="wp_codebox"><table><tr id="p116920"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1169code20"><pre class="python" style="font-family:monospace;"><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>0xB0, 0xF8<span style="color: black;">&#41;</span>:
    chr_i = <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>0xA1, 0xFF<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> i == 0xD7 <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&gt;</span>= 0xFA <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&lt;</span>= 0xFE:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        char = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span>chr_i + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'gb18030'</span><span style="color: black;">&#41;</span>
        <span style="color: #ff7700;font-weight:bold;">print</span> char,</pre></td></tr></table></div>

<h3>初步成果</h3>
<p>现在结合上面两段，得到了下面的初步代码：</p>

<div class="wp_codebox"><table><tr id="p116921"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code" id="p1169code21"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> Image, ImageDraw, ImageFont, ImageFilter
&nbsp;
font = ImageFont.<span style="color: black;">truetype</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'simsun.ttc'</span>, <span style="color: #ff4500;">24</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> get_char_data<span style="color: black;">&#40;</span>char<span style="color: black;">&#41;</span>:
    image = Image.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'L'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">28</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
    draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>
    draw.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, char, font=font<span style="color: black;">&#41;</span>
    image = image.<span style="color: black;">resize</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>, Image.<span style="color: black;">ANTIALIAS</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>image.<span style="color: black;">getdata</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> diff_of_data<span style="color: black;">&#40;</span>data1, data2<span style="color: black;">&#41;</span>:
    ret = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>data1, data2<span style="color: black;">&#41;</span>:
        ret += <span style="color: #008000;">abs</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> - i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
chars = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</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>0xB0, 0xF8<span style="color: black;">&#41;</span>:
    chr_i = <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>0xA1, 0xFF<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> i == 0xD7 <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&gt;</span>= 0xFA <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&lt;</span>= 0xFE:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        char = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span>chr_i + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'gb18030'</span><span style="color: black;">&#41;</span>
        chars<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span> = get_char_data<span style="color: black;">&#40;</span>char<span style="color: black;">&#41;</span>
&nbsp;
remember_number = <span style="color: #ff4500;">5</span>
input_string = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ID: '</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">for</span> input_char <span style="color: #ff7700;font-weight:bold;">in</span> input_string:
    <span style="color: #ff7700;font-weight:bold;">if</span> input_char <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> chars:
        <span style="color: #ff7700;font-weight:bold;">print</span> input_char
        <span style="color: #ff7700;font-weight:bold;">continue</span>
    input_data = chars<span style="color: black;">&#91;</span>input_char<span style="color: black;">&#93;</span>
    diff_list = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> char, data <span style="color: #ff7700;font-weight:bold;">in</span> chars.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> char == input_char:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        diff_list.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>diff_of_data<span style="color: black;">&#40;</span>data, input_data<span style="color: black;">&#41;</span>, char<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    diff_list.<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;">print</span> input_char,
    <span style="color: #ff7700;font-weight:bold;">for</span> diff, char <span style="color: #ff7700;font-weight:bold;">in</span> diff_list<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>:
        <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'({0}, {1})'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>diff, char<span style="color: black;">&#41;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>.<span style="color: black;">ljust</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,
    <span style="color: #ff7700;font-weight:bold;">print</span></pre></td></tr></table></div>

<p>发现效果还有待提高，并且每次测试一个新 ID 都要做一次预处理，每次预处理大概需要6s左右。</p>
<h3>目前代码</h3>
<p>对上面的代码做了一些修改，包括对文字图像做一些处理，以使其查找出的相似文字能更接近人的感觉，并且让一次预处理可以做多次比对，得到了下面代码：</p>

<div class="wp_codebox"><table><tr id="p116922"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
</pre></td><td class="code" id="p1169code22"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> Image, ImageDraw, ImageFont, ImageFilter
&nbsp;
font = ImageFont.<span style="color: black;">truetype</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'simsun.ttc'</span>, <span style="color: #ff4500;">24</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> get_char_data<span style="color: black;">&#40;</span>char<span style="color: black;">&#41;</span>:
    image = Image.<span style="color: #dc143c;">new</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'L'</span>, <span style="color: black;">&#91;</span><span style="color: #ff4500;">28</span>, <span style="color: #ff4500;">28</span><span style="color: black;">&#93;</span>, <span style="color: #ff4500;">255</span><span style="color: black;">&#41;</span>
    draw = ImageDraw.<span style="color: black;">Draw</span><span style="color: black;">&#40;</span>image<span style="color: black;">&#41;</span>
    draw.<span style="color: black;">text</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span>, <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>, char, font=font<span style="color: black;">&#41;</span>
    image = image.<span style="color: black;">resize</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">14</span>, <span style="color: #ff4500;">14</span><span style="color: black;">&#41;</span>, Image.<span style="color: black;">ANTIALIAS</span><span style="color: black;">&#41;</span>
    <span style="color: #808080; font-style: italic;"># XXX 期待更好的处理方式</span>
    image = image.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>ImageFilter.<span style="color: black;">SHARPEN</span><span style="color: black;">&#41;</span>.<span style="color: #008000;">filter</span><span style="color: black;">&#40;</span>ImageFilter.<span style="color: black;">SMOOTH</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">list</span><span style="color: black;">&#40;</span>image.<span style="color: black;">getdata</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> diff_of_data<span style="color: black;">&#40;</span>data1, data2<span style="color: black;">&#41;</span>:
    ret = <span style="color: #ff4500;">0</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">zip</span><span style="color: black;">&#40;</span>data1, data2<span style="color: black;">&#41;</span>:
        ret += <span style="color: #008000;">abs</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span> - i<span style="color: black;">&#91;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#93;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ret
&nbsp;
chars = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</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>0xB0, 0xF8<span style="color: black;">&#41;</span>:
    chr_i = <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>i<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> j <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">range</span><span style="color: black;">&#40;</span>0xA1, 0xFF<span style="color: black;">&#41;</span>:
        <span style="color: #ff7700;font-weight:bold;">if</span> i == 0xD7 <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&gt;</span>= 0xFA <span style="color: #ff7700;font-weight:bold;">and</span> j <span style="color: #66cc66;">&lt;</span>= 0xFE:
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        char = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span>chr_i + <span style="color: #008000;">chr</span><span style="color: black;">&#40;</span>j<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'gb18030'</span><span style="color: black;">&#41;</span>
        chars<span style="color: black;">&#91;</span>char<span style="color: black;">&#93;</span> = get_char_data<span style="color: black;">&#40;</span>char<span style="color: black;">&#41;</span>
&nbsp;
remember_number = <span style="color: #ff4500;">5</span>
<span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #008000;">True</span>:
    input_string = <span style="color: #008000;">unicode</span><span style="color: black;">&#40;</span><span style="color: #008000;">raw_input</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'ID: '</span><span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> input_string:
        <span style="color: #ff7700;font-weight:bold;">break</span>
    <span style="color: #ff7700;font-weight:bold;">for</span> input_char <span style="color: #ff7700;font-weight:bold;">in</span> input_string:
        <span style="color: #ff7700;font-weight:bold;">if</span> input_char <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: #ff7700;font-weight:bold;">in</span> chars:
            <span style="color: #ff7700;font-weight:bold;">print</span> input_char
            <span style="color: #ff7700;font-weight:bold;">continue</span>
        input_data = chars<span style="color: black;">&#91;</span>input_char<span style="color: black;">&#93;</span>
        diff_list = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
        <span style="color: #ff7700;font-weight:bold;">for</span> char, data <span style="color: #ff7700;font-weight:bold;">in</span> chars.<span style="color: black;">iteritems</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
            <span style="color: #ff7700;font-weight:bold;">if</span> char == input_char:
                <span style="color: #ff7700;font-weight:bold;">continue</span>
            diff_list.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>diff_of_data<span style="color: black;">&#40;</span>data, input_data<span style="color: black;">&#41;</span>, char<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        diff_list.<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;">print</span> input_char,
        <span style="color: #ff7700;font-weight:bold;">for</span> diff, char <span style="color: #ff7700;font-weight:bold;">in</span> diff_list<span style="color: black;">&#91;</span>:<span style="color: #ff4500;">5</span><span style="color: black;">&#93;</span>:
            <span style="color: #ff7700;font-weight:bold;">print</span> u<span style="color: #483d8b;">'({0}, {1})'</span>.<span style="color: black;">format</span><span style="color: black;">&#40;</span>diff, char<span style="color: black;">&#41;</span>.<span style="color: black;">encode</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'utf8'</span><span style="color: black;">&#41;</span>.<span style="color: black;">ljust</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">11</span><span style="color: black;">&#41;</span>,
        <span style="color: #ff7700;font-weight:bold;">print</span>
    <span style="color: #ff7700;font-weight:bold;">print</span></pre></td></tr></table></div>

<h3>继续改进</h3>
<p>目前这个程序测试的效果还行，不过还有待进一步改进。可改进的地方包括上面标出 XXX 的部分，即对文字图像进行处理的部分，或许可以有更好的处理方式。除此之外，如果能直接绘制出 12px 的字，必然也会有更好的效果。如果增大字库，从 GB2312 增加到 GB18030 的字库，可以用来对比的文字也会更多，也就更可能找到相似的字了~</p>
<p>这个，还有继续改进的余地嗯~有时间就继续努力咯……</p>
<h3>参考资料</h3>
<ul>
<li><a href="http://www.matrix67.com/blog/archives/2907">用Mathematica寻找最相似的汉字 &#8211; Matrix67</a></li>
<li><a href="http://www.pythonware.com/library/pil/handbook/image.htm">The Image Module &#8211; Python Imaging Library Handbook</a></li>
<li><a href="http://www.pythonware.com/library/pil/handbook/imagefont.htm">The ImageFont Module &#8211; Python Imaging Library Handbook</a></li>
<li><a href="http://www.pythonware.com/library/pil/handbook/imagedraw.htm">The ImageDraw Module &#8211; Python Imaging Library Handbook</a></li>
<li><a href="http://www.pythonware.com/library/pil/handbook/imagefilter.htm">The ImageFilter Module &#8211; Python Imaging Library Handbook</a></li>
<li><a href="http://zh.wikipedia.org/zh-cn/GB_2312">GB 2312 &#8211; 维基百科</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/finding-higher-imitation-of-id/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>百度贴吧的世界杯竞猜</title>
		<link>http://blog.upsuper.org/guess-world-cup-in-baidu-tieba/</link>
		<comments>http://blog.upsuper.org/guess-world-cup-in-baidu-tieba/#comments</comments>
		<pubDate>Thu, 17 Jun 2010 08:12:24 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Firefox]]></category>
		<category><![CDATA[Greasemonkey]]></category>
		<category><![CDATA[世界杯]]></category>
		<category><![CDATA[百度]]></category>
		<category><![CDATA[贴吧]]></category>
		<category><![CDATA[赌博]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1160</guid>
		<description><![CDATA[貌似很久没发文章了，无聊冒出来发一个…… 这次发的东西是很无聊的，大家知道最近世界杯在踢。不过呢，作为一个对体育几乎毫不关心的人，这事基本上也跟我没什么关系……不过我要说的呢，是关于世界杯竞猜的“赌博”游戏，貌似不止百度再做，还有网易、校内什么的都在搞。不过鉴于百度这个，比较经常上，我就也来参加了~ 当然，发在这里的东西总归要有一些技术性……这次也不例外的…… 我看到网易的竞猜不仅有各种形式，而且最重要的是有赔率！而百度只显示投注金额，显然不够专业，于是我就拿 Greasemonkey 插件，可以在百度投注金额的下面显示当前赔率~就像下面这样： 安装了 Firefox 的 Greasemonkey 插件的，可以点击这里安装这个脚本：tieba_guess.user.js 哦，有人大概会注意到我在前面那张图里面下注给了韩国。倒不是我多喜欢棒子，只是因为我几乎完全不懂足球，所以就根据赔率压冷门……话说压冷门有的时候其实很划算的，比如昨晚我压瑞士，赔率40！赚翻了~强大吧~]]></description>
			<content:encoded><![CDATA[<p>貌似很久没发文章了，无聊冒出来发一个……</p>
<p>这次发的东西是很无聊的，大家知道最近世界杯在踢。不过呢，作为一个对体育几乎毫不关心的人，这事基本上也跟我没什么关系……不过我要说的呢，是关于世界杯竞猜的“赌博”游戏，貌似不止百度再做，还有网易、校内什么的都在搞。不过鉴于百度这个，比较经常上，我就也来参加了~</p>
<p>当然，发在这里的东西总归要有一些技术性……这次也不例外的……</p>
<p>我看到网易的竞猜不仅有各种形式，而且最重要的是有赔率！而百度只显示投注金额，显然不够专业，于是我就拿 Greasemonkey 插件，可以在百度投注金额的下面显示当前赔率~就像下面这样：<br />
<a href="http://blog.upsuper.org/wp-content/uploads/2010/06/世界杯竞猜_i贴吧_1276762014642.png"><img src="http://blog.upsuper.org/wp-content/uploads/2010/06/世界杯竞猜_i贴吧_1276762014642.png" alt="" title="世界杯竞猜_i贴吧_1276762014642" width="705" height="132" class="alignnone size-full wp-image-1161" /></a></p>
<p>安装了 Firefox 的 Greasemonkey 插件的，可以点击这里安装这个脚本：<a href="http://down.upsuper.org/tieba_guess.user.js">tieba_guess.user.js</a></p>
<p>哦，有人大概会注意到我在前面那张图里面下注给了韩国。倒不是我多喜欢棒子，只是因为我几乎完全不懂足球，所以就根据赔率压冷门……话说压冷门有的时候其实很划算的，比如昨晚我压瑞士，赔率40！赚翻了~强大吧~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/guess-world-cup-in-baidu-tieba/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>QR code 生成器</title>
		<link>http://blog.upsuper.org/qr-code-generator/</link>
		<comments>http://blog.upsuper.org/qr-code-generator/#comments</comments>
		<pubDate>Fri, 30 Apr 2010 15:04:52 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[QR code]]></category>
		<category><![CDATA[实验室]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1145</guid>
		<description><![CDATA[前几天在找 Android 应用的时候，又见到了 QR code。说到 QR code，记得2006年，我还在维基活跃的时候，有一个人在维基的 QQ 群上发了这个的东西，然后大家就觉得很好玩。很早的事情了。寒假回福州的时候，在乌山公园，不少地方也有这个二维码，是移动设置的“物联网试验区”。 二维码着实是一个很有趣的东西。据我去过日本的同学讲，这个东西在日本已经十分普及了。在维基上查了一下，QR code 是开放的，有专利但没有被行使。而且识别算法似乎已经十分稳定成熟了。Android 手机里面安装一个 Barcode Scanner 就可以利用摄像头扫描二维码了，非常方便~ 二维码可以干嘛呢？它可以储存网址、储存电话、储存名片信息，扫描一下就可以读取出来，将人从人工的复制方式中解脱出来~ 于是我便也做了一个 CGI 的 QR code 生成器。 这个生成器用了开源的 libqrencode 和 libmagick 这两个库，都可以直接在 Ubuntu 里面 apt-get 下来，第一个是生成二维码数据，第二个是输出为图片。使用二进制 CGI 还涉及了我可爱的服务器商的支持问题等等…… 生成器源代码 核心程序没什么好说的，其实就是查文档的问题而已。参考了一下 libqrencode 和 libmagick 的文档就可以了。 直接贴代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 [...]]]></description>
			<content:encoded><![CDATA[<p>前几天在找 Android 应用的时候，又见到了 QR code。说到 QR code，记得2006年，我还在维基活跃的时候，有一个人在维基的 QQ 群上发了这个的东西，然后大家就觉得很好玩。很早的事情了。寒假回福州的时候，在乌山公园，不少地方也有这个二维码，是移动设置的“物联网试验区”。</p>
<p>二维码着实是一个很有趣的东西。据我去过日本的同学讲，这个东西在日本已经十分普及了。在维基上查了一下，QR code 是开放的，有专利但没有被行使。而且识别算法似乎已经十分稳定成熟了。Android 手机里面安装一个 Barcode Scanner 就可以利用摄像头扫描二维码了，非常方便~</p>
<p>二维码可以干嘛呢？它可以储存网址、储存电话、储存名片信息，扫描一下就可以读取出来，将人从人工的复制方式中解脱出来~</p>
<p>于是我便也做了一个 CGI 的 QR code 生成器。<br />
<span id="more-1145"></span><br />
这个生成器用了开源的 libqrencode 和 libmagick 这两个库，都可以直接在 Ubuntu 里面 apt-get 下来，第一个是生成二维码数据，第二个是输出为图片。使用二进制 CGI 还涉及了我可爱的服务器商的支持问题等等……</p>
<h3>生成器源代码</h3>
<p>核心程序没什么好说的，其实就是查文档的问题而已。参考了一下 libqrencode 和 libmagick 的文档就可以了。</p>
<p>直接贴代码：</p>

<div class="wp_codebox"><table><tr id="p114532"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
</pre></td><td class="code" id="p1145code32"><pre class="c" style="font-family:monospace;"><span style="color: #339933;">#include &lt;stdio.h&gt;</span>
<span style="color: #339933;">#include &lt;stdlib.h&gt;</span>
<span style="color: #339933;">#include &lt;stdint.h&gt;</span>
<span style="color: #339933;">#include &lt;string.h&gt;</span>
<span style="color: #339933;">#include &lt;qrencode.h&gt;</span>
<span style="color: #339933;">#include &lt;magick/api.h&gt;</span>
&nbsp;
<span style="color: #339933;">#define DEFAULT_TEXT &quot;http:/&quot;&quot;/upsuper.org/&quot;</span>
&nbsp;
<span style="color: #993333;">int</span> main<span style="color: #009900;">&#40;</span><span style="color: #993333;">int</span> argc<span style="color: #339933;">,</span> <span style="color: #993333;">char</span> <span style="color: #339933;">**</span>argv<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
    <span style="color: #993333;">int</span> i<span style="color: #339933;">,</span> j<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> scale<span style="color: #339933;">;</span>
    QRecLevel level<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>text<span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 设置默认参数</span>
    scale <span style="color: #339933;">=</span> <span style="color: #0000dd;">8</span><span style="color: #339933;">;</span>
    level <span style="color: #339933;">=</span> QR_ECLEVEL_Q<span style="color: #339933;">;</span>
    text <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>strlen<span style="color: #009900;">&#40;</span>DEFAULT_TEXT<span style="color: #009900;">&#41;</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>text<span style="color: #339933;">,</span> DEFAULT_TEXT<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 读取参数</span>
    <span style="color: #993333;">const</span> <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>orig<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>query_string<span style="color: #339933;">;</span>
    <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> len<span style="color: #339933;">;</span>
    orig <span style="color: #339933;">=</span> getenv<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;QUERY_STRING&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    len <span style="color: #339933;">=</span> strlen<span style="color: #009900;">&#40;</span>orig<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    query_string <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>malloc<span style="color: #009900;">&#40;</span>len <span style="color: #339933;">+</span> <span style="color: #0000dd;">2</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #339933;">*</span>query_string <span style="color: #339933;">=</span> <span style="color: #ff0000;">'&amp;'</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>query_string <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> orig<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>p <span style="color: #339933;">=</span> query_string<span style="color: #339933;">;</span> <span style="color: #339933;">*</span>p<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>p<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>p <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'&amp;'</span><span style="color: #009900;">&#41;</span>
            <span style="color: #b1b100;">continue</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strncasecmp<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;scale=&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// 读取缩放级</span>
            scale <span style="color: #339933;">=</span> atol<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">+</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strncasecmp<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;text=&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">5</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// 读取文本</span>
            <span style="color: #993333;">char</span> <span style="color: #339933;">*</span>p_last<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p_src<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>p_dest<span style="color: #339933;">;</span>
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>p_last <span style="color: #339933;">=</span> p <span style="color: #339933;">+</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">;</span> <span style="color: #339933;">*</span>p_last <span style="color: #339933;">&amp;&amp;</span> <span style="color: #339933;">*</span>p_last <span style="color: #339933;">!=</span> <span style="color: #ff0000;">'&amp;'</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span>p_last<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            text <span style="color: #339933;">=</span> <span style="color: #009900;">&#40;</span><span style="color: #993333;">char</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>realloc<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span><span style="color: #993333;">void</span> <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>text<span style="color: #339933;">,</span> p_last <span style="color: #339933;">-</span> p <span style="color: #339933;">-</span> <span style="color: #0000dd;">6</span> <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            <span style="color: #666666; font-style: italic;">// urldecode</span>
            <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>p_src <span style="color: #339933;">=</span> p <span style="color: #339933;">+</span> <span style="color: #0000dd;">6</span><span style="color: #339933;">,</span> p_dest <span style="color: #339933;">=</span> text<span style="color: #339933;">;</span>
                    p_src <span style="color: #339933;">&lt;</span> p_last<span style="color: #339933;">;</span>
                    <span style="color: #339933;">++</span>p_src<span style="color: #339933;">,</span> <span style="color: #339933;">++</span>p_dest<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>p_src <span style="color: #339933;">==</span> <span style="color: #ff0000;">'+'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #339933;">*</span>p_dest <span style="color: #339933;">=</span> <span style="color: #ff0000;">' '</span><span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>p_src <span style="color: #339933;">==</span> <span style="color: #ff0000;">'%'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                    <span style="color: #993333;">int</span> code<span style="color: #339933;">;</span>
                    <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>sscanf<span style="color: #009900;">&#40;</span>p_src <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;%2x&quot;</span><span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>code<span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span>
                        code <span style="color: #339933;">=</span> <span style="color: #ff0000;">'?'</span><span style="color: #339933;">;</span>
                    <span style="color: #339933;">*</span>p_dest <span style="color: #339933;">=</span> code<span style="color: #339933;">;</span>
                    p_src <span style="color: #339933;">+=</span> <span style="color: #0000dd;">2</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: #339933;">*</span>p_dest <span style="color: #339933;">=</span> <span style="color: #339933;">*</span>p_src<span style="color: #339933;">;</span>
                <span style="color: #009900;">&#125;</span>
            <span style="color: #009900;">&#125;</span>
            <span style="color: #339933;">*</span>p_dest <span style="color: #339933;">=</span> <span style="color: #ff0000;">'<span style="color: #006699; font-weight: bold;">\0</span>'</span><span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span>strncasecmp<span style="color: #009900;">&#40;</span>p <span style="color: #339933;">+</span> <span style="color: #0000dd;">1</span><span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;level=&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000dd;">6</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">==</span> <span style="color: #0000dd;">0</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            <span style="color: #666666; font-style: italic;">// 读取纠错级别</span>
            <span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span><span style="color: #009900;">&#40;</span>p <span style="color: #339933;">+</span> <span style="color: #0000dd;">7</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
                <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'l'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'L'</span><span style="color: #339933;">:</span> level <span style="color: #339933;">=</span> QR_ECLEVEL_L<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'m'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'M'</span><span style="color: #339933;">:</span> level <span style="color: #339933;">=</span> QR_ECLEVEL_M<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'q'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'Q'</span><span style="color: #339933;">:</span> level <span style="color: #339933;">=</span> QR_ECLEVEL_Q<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
                <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'h'</span><span style="color: #339933;">:</span> <span style="color: #b1b100;">case</span> <span style="color: #ff0000;">'H'</span><span style="color: #339933;">:</span> level <span style="color: #339933;">=</span> QR_ECLEVEL_H<span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
            <span style="color: #009900;">&#125;</span>
        <span style="color: #009900;">&#125;</span>
    <span style="color: #009900;">&#125;</span>
&nbsp;
    <span style="color: #666666; font-style: italic;">// 生成 QR code</span>
    QRcode <span style="color: #339933;">*</span>qrcode<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> width<span style="color: #339933;">;</span>
    qrcode <span style="color: #339933;">=</span> QRcode_encodeString8bit<span style="color: #009900;">&#40;</span>text<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> level<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    width <span style="color: #339933;">=</span> qrcode<span style="color: #339933;">-&gt;</span>width<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 初始化 Image Magick</span>
    ImageInfo <span style="color: #339933;">*</span>image_info<span style="color: #339933;">;</span>
    ExceptionInfo exception<span style="color: #339933;">;</span>
    InitializeMagick<span style="color: #009900;">&#40;</span><span style="color: #339933;">*</span>argv<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    GetExceptionInfo<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>exception<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 初始化图片</span>
    Image <span style="color: #339933;">*</span>image<span style="color: #339933;">,</span> <span style="color: #339933;">*</span>resized_image<span style="color: #339933;">;</span>
    image_info <span style="color: #339933;">=</span> CloneImageInfo<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#40;</span>ImageInfo <span style="color: #339933;">*</span><span style="color: #009900;">&#41;</span>NULL<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    image <span style="color: #339933;">=</span> AllocateImage<span style="color: #009900;">&#40;</span>image_info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    image<span style="color: #339933;">-&gt;</span>columns <span style="color: #339933;">=</span> image<span style="color: #339933;">-&gt;</span>rows <span style="color: #339933;">=</span> width<span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 生成图片</span>
    PixelPacket <span style="color: #339933;">*</span>pixel_packet<span style="color: #339933;">;</span>
    <span style="color: #993333;">int</span> t_bit<span style="color: #339933;">;</span>
    <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>i <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> i <span style="color: #339933;">&lt;</span> width<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>i<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
        pixel_packet <span style="color: #339933;">=</span> SetImagePixels<span style="color: #009900;">&#40;</span>image<span style="color: #339933;">,</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">,</span> i<span style="color: #339933;">,</span> width<span style="color: #339933;">,</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> pixel_packet<span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
        <span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span>j <span style="color: #339933;">=</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span> j <span style="color: #339933;">&lt;</span> width<span style="color: #339933;">;</span> <span style="color: #339933;">++</span>j<span style="color: #339933;">,</span> <span style="color: #339933;">++</span>pixel_packet<span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
            t_bit <span style="color: #339933;">=</span> <span style="color: #339933;">!</span> <span style="color: #009900;">&#40;</span>qrcode<span style="color: #339933;">-&gt;</span>data<span style="color: #009900;">&#91;</span>i <span style="color: #339933;">*</span> width <span style="color: #339933;">+</span> j<span style="color: #009900;">&#93;</span> <span style="color: #339933;">&amp;</span> <span style="color: #0000dd;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
            pixel_packet<span style="color: #339933;">-&gt;</span>red   <span style="color: #339933;">=</span> MaxRGB <span style="color: #339933;">*</span> t_bit<span style="color: #339933;">;</span>
            pixel_packet<span style="color: #339933;">-&gt;</span>green <span style="color: #339933;">=</span> MaxRGB <span style="color: #339933;">*</span> t_bit<span style="color: #339933;">;</span>
            pixel_packet<span style="color: #339933;">-&gt;</span>blue  <span style="color: #339933;">=</span> MaxRGB <span style="color: #339933;">*</span> t_bit<span style="color: #339933;">;</span>
        <span style="color: #009900;">&#125;</span>
        <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> SyncImagePixels<span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span>
            <span style="color: #000000; font-weight: bold;">break</span><span style="color: #339933;">;</span>
    <span style="color: #009900;">&#125;</span>
    QRcode_free<span style="color: #009900;">&#40;</span>qrcode<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 处理图片</span>
    resized_image <span style="color: #339933;">=</span> ScaleImage<span style="color: #009900;">&#40;</span>image<span style="color: #339933;">,</span>
            width <span style="color: #339933;">*</span> scale<span style="color: #339933;">,</span> width <span style="color: #339933;">*</span> scale<span style="color: #339933;">,</span> <span style="color: #339933;">&amp;</span>exception<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    DestroyImage<span style="color: #009900;">&#40;</span>image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    CompressImageColormap<span style="color: #009900;">&#40;</span>resized_image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 输出图片</span>
    puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;Content-Type: image/png&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    puts<span style="color: #009900;">&#40;</span><span style="color: #ff0000;">&quot;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    strcpy<span style="color: #009900;">&#40;</span>resized_image<span style="color: #339933;">-&gt;</span>filename<span style="color: #339933;">,</span> <span style="color: #ff0000;">&quot;png:-&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    WriteImage<span style="color: #009900;">&#40;</span>image_info<span style="color: #339933;">,</span> resized_image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    <span style="color: #666666; font-style: italic;">// 清理</span>
    DestroyImage<span style="color: #009900;">&#40;</span>resized_image<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    DestroyImageInfo<span style="color: #009900;">&#40;</span>image_info<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    DestroyExceptionInfo<span style="color: #009900;">&#40;</span><span style="color: #339933;">&amp;</span>exception<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
    DestroyMagick<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
    <span style="color: #b1b100;">return</span> <span style="color: #0000dd;">0</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span></pre></td></tr></table></div>

<p>话说最近喜欢用 C，C++ 什么的最讨厌了……</p>
<p>另外写了个 Makefile：</p>

<div class="wp_codebox"><table><tr id="p114533"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1145code33"><pre class="makefile" style="font-family:monospace;">LDFLAGS:=-lqrencode `Magick-config --ldflags --libs`
CFLAGS:=`Magick-config --cflags`
&nbsp;
all: qrcodetest
qrcodetest: qrcodetest.c</pre></td></tr></table></div>

<p>下面就是把这个 cgi 部署到服务器的问题了……</p>
<h3>部署到服务器</h3>
<p>我的这个空间商吧，我猜他装了 libmagick 的库，不过肯定没装开发库，也就是 libmagick-dev 这种东西，这样就编译不了了，比较麻烦。探究了一下发现安装了 gcc~很是高兴啊~而且 cgi 支持 bash 的。</p>
<p>这样就好玩了~我在我的访问不到的根目录下建立了一个 usr 文件夹，就已这个作为存在的核心了~</p>
<p>我写了 bash cgi 程序直接从服务器上获取源代码包，在服务器上解压编译 ImageMagick，也就是下面这段代码：</p>

<div class="wp_codebox"><table><tr id="p114534"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
</pre></td><td class="code" id="p1145code34"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CPATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LIBRARY_PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> Content-Type: text<span style="color: #000000; font-weight: bold;">/</span>plain
<span style="color: #7a0874; font-weight: bold;">echo</span>
<span style="color: #c20cb9; font-weight: bold;">wget</span> http:<span style="color: #000000; font-weight: bold;">//</span>downloads.sourceforge.net<span style="color: #000000; font-weight: bold;">/</span>project<span style="color: #000000; font-weight: bold;">/</span>imagemagick<span style="color: #000000; font-weight: bold;">/</span>ImageMagick<span style="color: #000000; font-weight: bold;">/</span>00-6.6.1<span style="color: #000000; font-weight: bold;">/</span>ImageMagick-6.6.1-<span style="color: #000000;">5</span>.tar.bz2
<span style="color: #c20cb9; font-weight: bold;">mkdir</span> imagick
<span style="color: #c20cb9; font-weight: bold;">mv</span> ImageMagick-6.6.1-<span style="color: #000000;">5</span>.tar.bz2 imagick
<span style="color: #7a0874; font-weight: bold;">cd</span> imagick
<span style="color: #c20cb9; font-weight: bold;">tar</span> <span style="color: #660033;">-jxvf</span> ImageMagick-6.6.1-<span style="color: #000000;">5</span>.tar.bz2
<span style="color: #7a0874; font-weight: bold;">cd</span> imagick<span style="color: #000000; font-weight: bold;">/</span>ImageMagick-6.6.1-<span style="color: #000000;">5</span>
.<span style="color: #000000; font-weight: bold;">/</span>configure <span style="color: #660033;">--prefix</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr
<span style="color: #c20cb9; font-weight: bold;">make</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> <span style="color: #c20cb9; font-weight: bold;">install</span>
<span style="color: #c20cb9; font-weight: bold;">make</span> clean
<span style="color: #c20cb9; font-weight: bold;">make</span> distclean</pre></td></tr></table></div>

<p>至于 qrencode，也不过就是把里面的一些东西改动一下就可以了~由于 make 的优美特性，即使中间被中断也可以断点继续，很好很好~</p>
<p>最后编译好以后，再把我的 cgi 代码传上去，编译，通过了。把生成的文件拷贝出来加上 .cgi，却不能运行……</p>
<p>弄了个 bash 脚本上去加 ldd，发现 libqrencode.so 找不到，libmagick 看起来确实是有预装，在 /usr/lib 里面就轻易找到了。不甘心啊，这个东西应该是有办法解决的……</p>
<p>研究了一下，想起那个环境变量 LD_LIBRARY_PATH。我在 bash 的 cgi 里面加上</p>

<div class="wp_codebox"><table><tr id="p114535"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1145code35"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_LIBRARY_PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib</pre></td></tr></table></div>

<p>之后，ldd 里面所有库都可以找到了~真好</p>
<p>然后我就想啊，我们可不可以让他自动设置 LD_LIBRARY_PATH 这个环境变量呢？我就查了一下，发现在 .htaccess 里面加入 SetEnv 是可以的。</p>
<p>于是我就</p>

<div class="wp_codebox"><table><tr id="p114536"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1145code36"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">SetEnv</span> LD_LIBRARY_PATH /xxxx/upsuper.org/usr/lib</pre></td></tr></table></div>

<p>结果不行。弄了个 bash cgi：</p>

<div class="wp_codebox"><table><tr id="p114537"><td class="line_numbers"><pre>1
2
3
4
5
</pre></td><td class="code" id="p1145code37"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">echo</span> Content-Type: text<span style="color: #000000; font-weight: bold;">/</span>plain
<span style="color: #7a0874; font-weight: bold;">echo</span>
<span style="color: #c20cb9; font-weight: bold;">env</span></pre></td></tr></table></div>

<p>发现这个东西没有被加入环境变量当中。郁闷……在网上查了半天，没有发现任何人遇到过这种情况。我就想，不会吧，我这么倒霉？</p>
<p>然后我试了一下网上普遍喜欢用 SetEnv 的样例：</p>

<div class="wp_codebox"><table><tr id="p114538"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p1145code38"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">SetEnv</span> TZ Asia/Chongqing</pre></td></tr></table></div>

<p>再打开刚才的查环境变量专用 cgi，发现出现了！</p>
<p>这就奇怪了。这说明 Apache 的 env 模块非常正常，但设置的东西却是选择性的进入 cgi。我猜一定是有什么白名单之类的东西。</p>
<p>于是我就跑去问服务商的技术客服……（又要用英语……）</p>
<p>话说这个主机商的技术客服看起来十分繁忙，我每次去都要等很久很久才有人应答。不知道是我的英语描述水平的问题，还是对方无法理解这种高深的问题，他直接告诉我这是我自己代码的问题，跟他没关系……然后居然就直接关断了聊天，我靠，这什么态度！我就囧了……又连了一次，我非常耐心的跟那个客服解释了一遍我想要的效果，他终于明白了！而且非常耐心的帮我解决问题。最后他告诉我，因为服务器使用了 suEXEC 这个模块，对进入 cgi 的环境变量做了一个白名单，所以不行……</p>
<p>唉，不行就不行呗，早知这样，我也不是没有办法的……</p>
<p>在 suexec 的代码里查到了环境变量白名单，发现所有 HTTP_ 和 SSL_ 开头的都是白名单范围的。于是我就写下了这样一个 .htaccess：</p>

<div class="wp_codebox"><table><tr id="p114539"><td class="line_numbers"><pre>1
2
3
4
5
6
7
</pre></td><td class="code" id="p1145code39"><pre class="apache" style="font-family:monospace;"><span style="color: #00007f;">RewriteEngine</span> <span style="color: #0000ff;">On</span>
&nbsp;
<span style="color: #00007f;">RewriteCond</span> %{REQUEST_URI} \.cgi$
<span style="color: #00007f;">RewriteRule</span> ^(.*)$ /<span style="color: #00007f;">setenv</span>.sh?cgi=$<span style="color: #ff0000;">1</span> [QSA]
&nbsp;
<span style="color: #00007f;">RewriteCond</span> %{QUERY_STRING} ^cgi=([^&amp;]+)
<span style="color: #00007f;">RewriteRule</span> . - [E=HTTP_CGI:%1]</pre></td></tr></table></div>

<p>与之配套的 setenv.sh：</p>

<div class="wp_codebox"><table><tr id="p114540"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
</pre></td><td class="code" id="p1145code40"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PATH</span>=<span style="color: #007800;">$PATH</span>:<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">CPATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>include
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LIBRARY_PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LD_LIBRARY_PATH</span>=<span style="color: #000000; font-weight: bold;">/</span>xxxx<span style="color: #000000; font-weight: bold;">/</span>upsuper.org<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>lib
&nbsp;
.<span style="color: #000000; font-weight: bold;">/</span><span style="color: #007800;">$HTTP_CGI</span></pre></td></tr></table></div>

<p>终于可以了……</p>
<p>这个论原理也很简单，就是把对 cgi 的请求全部转化到一个专门的设置环境变量的 bash 脚本里，然后让它调用相应的 cgi。对了，这个 setenv.sh 必须有执行权限才行……</p>
<p>这一切终于结束了，然后这个生成器也可以用了~</p>
<p><a href="http://lab.upsuper.org/qrcodetest.cgi"><img src="http://lab.upsuper.org/qrcodetest.cgi" alt="我主页的 QR code" /></a></p>
<p>最后是一个小小的东西：</p>
<h3>QR code 生成器</h3>
<form action="http://lab.upsuper.org/qrcodetest.cgi" method="GET" target="_blank">
<p><label for="scale">大小：</label><br />
<input name="scale" id="scale" value="8" /></p>
<p><label for="level">容错级别：</label><br />
<select name="level" id="level">
<option value="L">低</option>
<option value="Q" selected="selected">默认</option>
<option value="M">中</option>
<option value="H">高</option>
</select>
<p><label for="text">内容：</label><br />
<textarea name="text" id="text" maxlength="200">http://upsuper.org/</textarea></p>
<input type="submit" value="生成" />
</form>
<h3>参考资料</h3>
<ul>
<li><a href="http://en.wikipedia.org/wiki/QR_code">QR Code &#8211; Wikipedia</a></li>
<li><a href="http://www.informatik.uni-hamburg.de/RZ/software/ImageMagick/www/api.html">ImageMagick &#8211; C Application Programming Interface</a></li>
<li><a href="http://megaui.net/fukuchi/works/qrencode/manual/index.html">QRencode: Main Page</a></li>
<li><a href="http://lamp.linux.gov.cn/Apache/ApacheMenu/mod/mod_env.html">mod_env － Apache 2.2 中文版参考手册</a></li>
<li><a href="http://www.google.com/codesearch/p?hl=zh-CN#kYxtXdg84Bg/pub/mirrors/apache/httpd/httpd-2.0.59-win32-src.zip|f8ZBPfoR_-g/httpd-2.0.59/modules/metadata/mod_env.c&#038;q=file:mod_env.c">mod_env.c &#8211; httpd-2.0.59/modules/metadata &#8211; Code Search</a></li>
<li><a href="http://httpd.apache.org/docs/1.3/suexec.html">Apache suEXEC Support</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/qr-code-generator/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Erlang 版 0-1 背包算法</title>
		<link>http://blog.upsuper.org/erlang-implementation-of-0-1-knapsack-algorithm/</link>
		<comments>http://blog.upsuper.org/erlang-implementation-of-0-1-knapsack-algorithm/#comments</comments>
		<pubDate>Sun, 04 Apr 2010 12:30:19 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Erlang]]></category>
		<category><![CDATA[算法]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=1132</guid>
		<description><![CDATA[因为以后可能要用到，于是今天用 Erlang 写了一个 0-1 背包算法，这算是我第一次用 Erlang 写算法，也是我第二次写 Erlang 程序…… 以前都使用正常语言写，各种算法自然不会难写。所谓正常的语言，呃……也就是我们平时用的最多的语言了，像 C++、Python 什么的在我看来都还算正常的语言。那么 Erlang 到底哪里不正常了呢？ 其实 Erlang 只要两个不正常的地方就足够囧死人了……那就是： 没有循环，必须用递归代替 数组不能随机访问，只能从头部读写 其实说数组不能随机访问吧，应该也是能的，只不过时间恐怕就不是 O(1) 了罢了。 首先我们回忆一下一维 0-1 背包算法是怎么写的？ 在这里就不分析这个算法了，不知道 0-1 背包算法的，呃……算导里竟然没有……那就自己 Google 好了…… 先贴一个随手写的伪代码： 1 2 3 4 for i = 1 to n for j = size - s[i] to 0 if b[j] + v[i] &#62; b[j+s[i]] [...]]]></description>
			<content:encoded><![CDATA[<p>因为以后可能要用到，于是今天用 Erlang 写了一个 0-1 背包算法，这算是我第一次用 Erlang 写算法，也是我第二次写 Erlang 程序……</p>
<p>以前都使用正常语言写，各种算法自然不会难写。所谓正常的语言，呃……也就是我们平时用的最多的语言了，像 C++、Python 什么的在我看来都还算正常的语言。那么 Erlang 到底哪里不正常了呢？</p>
<p>其实 Erlang 只要两个不正常的地方就足够囧死人了……那就是：</p>
<ol>
<li>没有循环，必须用递归代替</li>
<li>数组不能随机访问，只能从头部读写</li>
</ol>
<p>其实说数组不能随机访问吧，应该也是能的，只不过时间恐怕就不是 O(1) 了罢了。<br />
<span id="more-1132"></span><br />
首先我们回忆一下一维 0-1 背包算法是怎么写的？</p>
<p>在这里就不分析这个算法了，不知道 0-1 背包算法的，呃……算导里竟然没有……那就自己 Google 好了……</p>
<p>先贴一个随手写的伪代码：</p>

<div class="wp_codebox"><table><tr id="p113243"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p1132code43"><pre class="text" style="font-family:monospace;">for i = 1 to n
    for j = size - s[i] to 0
        if b[j] + v[i] &gt; b[j+s[i]]
            b[j+s[i]] = b[j] + v[i]</pre></td></tr></table></div>

<p>唉……要是 Erlang 能像这个伪码这么简单就好了……</p>
<p>不过考虑到 Erlang 的特性，最后没有使用伪码这种形式，主要的改动有两点，一是把连续的大小数组改成了可能达大的大小的列表，二是使用双列表最后归并。至于记录路径什么的，都是小事……</p>
<p>最后贴代码</p>

<div class="wp_codebox"><table><tr id="p113244"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
</pre></td><td class="code" id="p1132code44"><pre class="erlang" style="font-family:monospace;"><span style="color: #014ea4;">-</span><span style="color: #5400b3;">module</span><span style="color: #109ab8;">&#40;</span>knapsack<span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #014ea4;">-</span><span style="color: #5400b3;">export</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span>calc<span style="color: #014ea4;">/</span><span style="color: #ff9600;">2</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Objs</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">K</span> <span style="color: #014ea4;">=</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Objs</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">Obj</span>|Objs<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #45b3e6;">NewK</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Obj</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #45b3e6;">FinalK</span> <span style="color: #014ea4;">=</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff4e18;">lists</span>:<span style="color: #ff3c00;">reverse</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewK</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">,</span>
    <span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Objs</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">FinalK</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff4e18;">lists</span>:<span style="color: #ff3c00;">reverse</span><span style="color: #109ab8;">&#40;</span><span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NameList</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">NameList</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Val</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">List</span><span style="color: #109ab8;">&#125;</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">MaxVal</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Cur</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">if</span>
        <span style="color: #45b3e6;">Val</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">MaxVal</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">Val</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">List</span><span style="color: #109ab8;">&#125;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        true <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">final</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Cur</span><span style="color: #109ab8;">&#41;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewK</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">NewK</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ObjSize</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">CurSize</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">_</span><span style="color: #109ab8;">&#125;</span>|_<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewK</span><span style="color: #109ab8;">&#41;</span>
        <span style="color: #186895;">when</span> <span style="color: #45b3e6;">CurSize</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">ObjSize</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">Size</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span>nothing<span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #ff9600;">0</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewK</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">ObjName</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ObjSize</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ObjVal</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">Obj</span><span style="color: #6bb810;">,</span>
        <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">CurSize</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">CurVal</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">CurList</span><span style="color: #109ab8;">&#125;</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">NewK</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #ff3c00;">calc</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">Obj</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">Size</span><span style="color: #6bb810;">,</span>
        <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">CurSize</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">ObjSize</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">CurVal</span> <span style="color: #014ea4;">+</span> <span style="color: #45b3e6;">ObjVal</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">ObjName</span>|CurList<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#125;</span>|NewK<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
&nbsp;
<span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">B</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">B</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">.</span>
<span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #45b3e6;">K</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff4e18;">lists</span>:<span style="color: #ff3c00;">reverse</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#93;</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">B</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff4e18;">lists</span>:<span style="color: #ff3c00;">reverse</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">B</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
<span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">SizeA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ValA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ListA</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">TA</span>|LeftA<span style="color: #109ab8;">&#93;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span>
      <span style="color: #109ab8;">&#91;</span><span style="color: #109ab8;">&#123;</span><span style="color: #45b3e6;">SizeB</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ValB</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">ListB</span><span style="color: #109ab8;">&#125;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">TB</span>|LeftB<span style="color: #109ab8;">&#93;</span> <span style="color: #014ea4;">=</span> <span style="color: #45b3e6;">B</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">K</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
    <span style="color: #186895;">if</span>
        <span style="color: #45b3e6;">SizeA</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">SizeB</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LeftA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">B</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TA</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        <span style="color: #45b3e6;">SizeA</span> <span style="color: #014ea4;">&lt;</span> <span style="color: #45b3e6;">SizeB</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">A</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LeftB</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TB</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        <span style="color: #45b3e6;">ValA</span> <span style="color: #014ea4;">&gt;</span> <span style="color: #45b3e6;">ValB</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LeftA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LeftB</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TA</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        <span style="color: #45b3e6;">ValA</span> <span style="color: #014ea4;">&lt;</span> <span style="color: #45b3e6;">ValB</span> <span style="color: #6bb810;">-&gt;</span> <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LeftA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LeftB</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TB</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        <span style="color: #fa6fff;">length</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">ListA</span><span style="color: #109ab8;">&#41;</span> <span style="color: #014ea4;">&lt;</span> <span style="color: #fa6fff;">length</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">ListB</span><span style="color: #109ab8;">&#41;</span> <span style="color: #6bb810;">-&gt;</span>
            <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LeftA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LeftB</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TA</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span><span style="color: #6bb810;">;</span>
        true <span style="color: #6bb810;">-&gt;</span>
            <span style="color: #ff3c00;">merge</span><span style="color: #109ab8;">&#40;</span><span style="color: #45b3e6;">LeftA</span><span style="color: #6bb810;">,</span> <span style="color: #45b3e6;">LeftB</span><span style="color: #6bb810;">,</span> <span style="color: #109ab8;">&#91;</span><span style="color: #45b3e6;">TB</span>|K<span style="color: #109ab8;">&#93;</span><span style="color: #109ab8;">&#41;</span>
    <span style="color: #186895;">end</span><span style="color: #6bb810;">.</span></pre></td></tr></table></div>

<p>用法解释：执行 knapsack:calc(物件列表, 背包大小)，其中物件列表中每个物件以元组 {物件名称, 物件大小, 物件价值} 表示，最终返回物件名称的列表，价值相同情况下这个算法会返回包内物件平均价值最高的一种选法 (数量最少)。此外，这个算法保证输出列表中物件的顺序与输入顺序相同。</p>
<p>我知道代码风格很丑……而且还没有精心调试过……因为终于写出来太高兴了，所以就马上贴了，如果各位觉得不太对，请及时指出！谢谢……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/erlang-implementation-of-0-1-knapsack-algorithm/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>人人网的好友交集小工具</title>
		<link>http://blog.upsuper.org/a-tool-to-get-intersection-of-friends-in-renren/</link>
		<comments>http://blog.upsuper.org/a-tool-to-get-intersection-of-friends-in-renren/#comments</comments>
		<pubDate>Sat, 09 Jan 2010 05:06:30 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[CGI]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[人人网]]></category>
		<category><![CDATA[我的实验室]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=952</guid>
		<description><![CDATA[昨晚花了几个小时写了个计算人人网（其实我还是更喜欢叫他校内）当中，任意两个用户的好友之间交集的在线小工具，可以到我的实验室里看看这个小工具：人人网好友交集。 话说能写出这样的工具，主要有赖于我的空间提供商将系统换为 FreeBSD 后可以解析 Python 了，而且也没有限制 CGI，所以就成功了~ 由于必须从人人网，而非本地，的用户页面，而非接口，获取数据，速度自然不可能快。所以我才有了那个提示：这一过程可能非常缓慢。不过事实上，经过测试，在我的网站的服务器上，速度还是相当了得的，基本上 2s-5s 就能出结果！想我自己的机子上好的时候都要 7s，不好的时候就根本出不来了…… 如果单线程进行获取，那就真可以等死人了……所以用了5线程并发，每个线程维护一个链接……此外还连接的是手机人人网，以换来较小的传输流量，较快的解析速度，和较容易的处理方式…… 最后，看代码之前声明一下，这个是以 AGPLv3 协议发布的，根据这一协议，如果你修改了这个代码并且使用你修改过的代码为他人服务，你所修改的代码也必须公开，并且以 AGPLv3 协议发布。 由于前台界面的东西大家都有办法获取，我就不给了，这里直接给出那个后台处理程序： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 [...]]]></description>
			<content:encoded><![CDATA[<p>昨晚花了几个小时写了个计算人人网（其实我还是更喜欢叫他校内）当中，任意两个用户的好友之间交集的在线小工具，可以到<a href="http://lab.upsuper.org">我的实验室</a>里看看这个小工具：<a href="http://lab.upsuper.org/urenren/">人人网好友交集</a>。</p>
<p>话说能写出这样的工具，主要有赖于我的空间提供商将系统换为 FreeBSD 后可以解析 Python 了，而且也没有限制 CGI，所以就成功了~<br />
<span id="more-952"></span><br />
由于必须从人人网，而非本地，的用户页面，而非接口，获取数据，速度自然不可能快。所以我才有了那个提示：这一过程可能非常缓慢。不过事实上，经过测试，在我的网站的服务器上，速度还是相当了得的，基本上 2s-5s 就能出结果！想我自己的机子上好的时候都要 7s，不好的时候就根本出不来了……</p>
<p>如果单线程进行获取，那就真可以等死人了……所以用了5线程并发，每个线程维护一个链接……此外还连接的是手机人人网，以换来较小的传输流量，较快的解析速度，和较容易的处理方式……</p>
<p>最后，看代码之前声明一下，这个是以 <a href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">AGPLv3</a> 协议发布的，根据这一协议，如果你修改了这个代码并且使用你修改过的代码为他人服务，你所修改的代码也必须公开，并且以 AGPLv3 协议发布。</p>
<p>由于前台界面的东西大家都有办法获取，我就不给了，这里直接给出那个后台处理程序：</p>

<div class="wp_codebox"><table><tr id="p95246"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
</pre></td><td class="code" id="p952code46"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># Copyright (C) 2010 Upsuper &lt;quanxunzhen@gmail.com&gt;</span>
<span style="color: #808080; font-style: italic;"># License: AGPLv3</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">threading</span> <span style="color: #ff7700;font-weight:bold;">import</span> Thread, Lock
<span style="color: #ff7700;font-weight:bold;">from</span> <span style="color: #dc143c;">httplib</span> <span style="color: #ff7700;font-weight:bold;">import</span> HTTPConnection
<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;">cgi</span>, json
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">sys</span>, <span style="color: #dc143c;">re</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># 常数设置</span>
THREADS_NUM = <span style="color: #ff4500;">5</span>             <span style="color: #808080; font-style: italic;"># 最大线程数</span>
RENREN_USER = <span style="color: #483d8b;">''</span>            <span style="color: #808080; font-style: italic;"># 人人网用户名</span>
RENREN_PWD  = <span style="color: #483d8b;">''</span>            <span style="color: #808080; font-style: italic;"># 人人网密码</span>
USER_AGENT  = <span style="color: #483d8b;">'urenren 0.1'</span> <span style="color: #808080; font-style: italic;"># 提交给人人网的 User-Agent</span>
&nbsp;
<span style="color: #808080; font-style: italic;"># JSON 输出函数</span>
json_dump = <span style="color: #ff7700;font-weight:bold;">lambda</span> v: json.<span style="color: black;">dump</span><span style="color: black;">&#40;</span>v, <span style="color: #dc143c;">sys</span>.<span style="color: black;">stdout</span><span style="color: black;">&#41;</span>
<span style="color: #808080; font-style: italic;"># 编译匹配用正则表达式</span>
parse_re = <span style="color: #dc143c;">re</span>.<span style="color: #008000;">compile</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'&lt;td&gt;&lt;p&gt;&lt;a href=&quot;[^<span style="color: #000099; font-weight: bold;">\?</span>]+<span style="color: #000099; font-weight: bold;">\?</span>id=(<span style="color: #000099; font-weight: bold;">\d</span>+)[^&quot;]*&quot;&gt;'</span>
                      r<span style="color: #483d8b;">'&lt;img src=&quot;([^&quot;]+)&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/p&gt;'</span>
                      r<span style="color: #483d8b;">'&lt;a href=&quot;[^&quot;]+&quot;&gt;([^&lt;]+)&lt;/a&gt;&lt;/td&gt;'</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> RequestThread<span style="color: black;">&#40;</span>Thread<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: #008000;">id</span>, sid, friends<span style="color: black;">&#41;</span>:
    Thread.<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>.__page = <span style="color: #483d8b;">'/getfriends.do?curpage=%%d&amp;id=%d&amp;sid=%s'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span><span style="color: #008000;">id</span>, sid<span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.__friends = friends
    <span style="color: #008000;">self</span>.__conn = HTTPConnection<span style="color: black;">&#40;</span><span style="color: #483d8b;">'3g.renren.com'</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> run<span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">global</span> curpage, stop_sign
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">while</span> <span style="color: #ff7700;font-weight:bold;">not</span> stop_sign:
      <span style="color: #808080; font-style: italic;"># 获取当前页面</span>
      curpage_lock.<span style="color: black;">acquire</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
      page = curpage
      curpage += <span style="color: #ff4500;">1</span>
      curpage_lock.<span style="color: black;">release</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
      <span style="color: #808080; font-style: italic;"># 连接获取数据</span>
      conn = <span style="color: #008000;">self</span>.__conn
      conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'GET'</span>, <span style="color: #008000;">self</span>.__page <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>page, <span style="color: black;">&#41;</span>, <span style="color: #008000;">None</span>, <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'User-Agent'</span>: USER_AGENT
      <span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
      data = conn.<span style="color: black;">getresponse</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>.<span style="color: black;">read</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
      <span style="color: #808080; font-style: italic;"># 处理获取的数据</span>
      friend_iter = parse_re.<span style="color: black;">finditer</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
      t_stop_sign = <span style="color: #008000;">True</span>
      <span style="color: #ff7700;font-weight:bold;">for</span> f <span style="color: #ff7700;font-weight:bold;">in</span> friend_iter:
        t_stop_sign = <span style="color: #008000;">False</span>
        <span style="color: #008000;">id</span> = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>f.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
        <span style="color: #008000;">self</span>.__friends<span style="color: black;">&#91;</span><span style="color: #008000;">id</span><span style="color: black;">&#93;</span> = <span style="color: black;">&#40;</span>f.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>, f.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      stop_sign = t_stop_sign
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> readFriends<span style="color: black;">&#40;</span><span style="color: #008000;">id</span><span style="color: black;">&#41;</span>:
  <span style="color: #808080; font-style: italic;"># 初始化多线程</span>
  <span style="color: #ff7700;font-weight:bold;">global</span> curpage, curpage_lock, stop_sign
  curpage = <span style="color: #ff4500;">0</span>
  curpage_lock = Lock<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  stop_sign = <span style="color: #008000;">False</span>
  threads = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
  friends = <span style="color: black;">&#123;</span><span style="color: black;">&#125;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># 创建线程</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> <span style="color: #008000;">xrange</span><span style="color: black;">&#40;</span>THREADS_NUM<span style="color: black;">&#41;</span>:
    threads.<span style="color: black;">append</span><span style="color: black;">&#40;</span>RequestThread<span style="color: black;">&#40;</span><span style="color: #008000;">id</span>, sid, friends<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
  <span style="color: #808080; font-style: italic;"># 开始执行线程</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> threads:
    t.<span style="color: black;">start</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #808080; font-style: italic;"># 等待线程结束</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> t <span style="color: #ff7700;font-weight:bold;">in</span> threads:
    t.<span style="color: black;">join</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">return</span> friends
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
  <span style="color: #808080; font-style: italic;"># 初始化CGI输出</span>
  <span style="color: #ff7700;font-weight:bold;">print</span> <span style="color: #483d8b;">'Content-Type: text/plain'</span>
  <span style="color: #ff7700;font-weight:bold;">print</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># 获取ID信息</span>
  form = <span style="color: #dc143c;">cgi</span>.<span style="color: black;">FieldStorage</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  id1, id2 = <span style="color: #ff4500;">0</span>, <span style="color: #ff4500;">0</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> form.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'id1'</span><span style="color: black;">&#41;</span>: id1 = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>form<span style="color: black;">&#91;</span><span style="color: #483d8b;">'id1'</span><span style="color: black;">&#93;</span>.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> form.<span style="color: black;">has_key</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'id2'</span><span style="color: black;">&#41;</span>: id2 = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span>form<span style="color: black;">&#91;</span><span style="color: #483d8b;">'id2'</span><span style="color: black;">&#93;</span>.<span style="color: black;">value</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #ff7700;font-weight:bold;">not</span> <span style="color: black;">&#40;</span>id1 <span style="color: #ff7700;font-weight:bold;">and</span> id2<span style="color: black;">&#41;</span>:
    json_dump<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'error'</span>: <span style="color: #008000;">True</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># 登入人人网</span>
  conn = HTTPConnection<span style="color: black;">&#40;</span><span style="color: #483d8b;">'3g.renren.com'</span><span style="color: black;">&#41;</span>
  conn.<span style="color: black;">request</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'POST'</span>, <span style="color: #483d8b;">'/login.do'</span>,
      <span style="color: #dc143c;">urllib</span>.<span style="color: black;">urlencode</span><span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'email'</span>: RENREN_USER, <span style="color: #483d8b;">'password'</span>: RENREN_PWD<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>,
      <span style="color: black;">&#123;</span>
        <span style="color: #483d8b;">'Content-Type'</span>: <span style="color: #483d8b;">'application/x-www-form-urlencoded'</span>,
        <span style="color: #483d8b;">'User-Agent'</span>: USER_AGENT,
      <span style="color: black;">&#125;</span><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>
  conn.<span style="color: black;">close</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  match = <span style="color: #dc143c;">re</span>.<span style="color: black;">search</span><span style="color: black;">&#40;</span>r<span style="color: #483d8b;">'sid=([0-9a-f]+)'</span>, data, <span style="color: #dc143c;">re</span>.<span style="color: black;">I</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">global</span> sid
  sid = match.<span style="color: black;">group</span><span style="color: black;">&#40;</span><span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #808080; font-style: italic;"># 读取好友</span>
  friends1 = readFriends<span style="color: black;">&#40;</span>id1<span style="color: black;">&#41;</span>
  friends2 = readFriends<span style="color: black;">&#40;</span>id2<span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>friends1<span style="color: black;">&#41;</span> <span style="color: #66cc66;">&gt;</span> <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>friends2<span style="color: black;">&#41;</span>:
    friends1, friends2 = friends2, friends1
&nbsp;
  <span style="color: #808080; font-style: italic;"># 判断交集</span>
  intersection = <span style="color: black;">&#91;</span><span style="color: black;">&#93;</span>
  <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> friends1.<span style="color: black;">iterkeys</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> i <span style="color: #ff7700;font-weight:bold;">in</span> friends2:
      intersection.<span style="color: black;">append</span><span style="color: black;">&#40;</span><span style="color: black;">&#40;</span>i, friends2<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</span><span style="color: black;">&#91;</span><span style="color: #ff4500;">0</span><span style="color: black;">&#93;</span>, friends2<span style="color: black;">&#91;</span>i<span style="color: black;">&#93;</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><span style="color: black;">&#41;</span>
  json_dump<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'error'</span>: <span style="color: #008000;">False</span>, <span style="color: #483d8b;">'count'</span>: <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>intersection<span style="color: black;">&#41;</span>, <span style="color: #483d8b;">'data'</span>: intersection<span style="color: black;">&#125;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">if</span> __name__ == <span style="color: #483d8b;">'__main__'</span>:
  <span style="color: #ff7700;font-weight:bold;">try</span>:
    main<span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">except</span>:
    json_dump<span style="color: black;">&#40;</span><span style="color: black;">&#123;</span><span style="color: #483d8b;">'error'</span>: <span style="color: #008000;">True</span><span style="color: black;">&#125;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>代码中的配置常数 RENREN_USER 必须是一个已有的人人网账户的帐户名或邮箱地址，反正就是可以用来登入人人网的东西，RENREN_PWD 也必须是前面的账户对应的密码。因为人人网不允许未登入用户查看各种页面（大约是为了防止搜索引擎的人肉吧……不过其实我们有办法让搜索引擎索引到那些内容的~嘿嘿，突然有了一些邪恶的想法~），所以只能弄一个帐号来登入了。</p>
<p>人人网的手机版为了适应部分手机浏览器不支持 Cookies，用了 SID 的策略，这样我也就可以放心大胆地不管 Cookies 了~这个程序还是蛮好写的说~也只有 Python 能提供如此快速的程序构建~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-tool-to-get-intersection-of-friends-in-renren/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>方便使用 VC6 编译器的小脚本</title>
		<link>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/</link>
		<comments>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/#comments</comments>
		<pubDate>Wed, 30 Dec 2009 10:45:56 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[VC]]></category>
		<category><![CDATA[编译器]]></category>
		<category><![CDATA[脚本]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=935</guid>
		<description><![CDATA[昨天的那篇日志跨编译器的 C 语言 NaN 支持当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序，不过总觉得还是有那么些麻烦，要把待编译的文件复制到 VC6 的安装目录，还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~ 于是就有了下面这个小脚本： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 #!/bin/bash # - * - coding: UTF-8 - * - &#160; VC6_DIR=&#34;这里写上VC6的安装地址&#34; &#160; BIN=&#34;$VC6_DIR/VC98/Bin&#34; export [...]]]></description>
			<content:encoded><![CDATA[<p>昨天的那篇日志<a href="http://blog.upsuper.org/nan-support-for-cross-compiler-of-c/">跨编译器的 C 语言 NaN 支持</a>当中讲到了如何在 Linux 下用 wine 执行 VC6 编译器编译程序，不过总觉得还是有那么些麻烦，要把待编译的文件复制到 VC6 的安装目录，还要写那么长一串东西。要是能像调用 GCC 那么方便就好了~</p>
<p>于是就有了下面这个小脚本：</p>

<div class="wp_codebox"><table><tr id="p93549"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
</pre></td><td class="code" id="p935code49"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #666666; font-style: italic;"># - * - coding: UTF-8 - * -</span>
&nbsp;
<span style="color: #007800;">VC6_DIR</span>=<span style="color: #ff0000;">&quot;这里写上VC6的安装地址&quot;</span>
&nbsp;
<span style="color: #007800;">BIN</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Bin&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">INCLUDE</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Include&quot;</span>
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">LIB</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$VC6_DIR</span>/VC98/Lib&quot;</span> 
&nbsp;
<span style="color: #007800;">ARGS</span>=
&nbsp;
<span style="color: #000000; font-weight: bold;">while</span> <span style="color: #7a0874; font-weight: bold;">getopts</span> <span style="color: #ff0000;">&quot;o:c&quot;</span> optname
<span style="color: #000000; font-weight: bold;">do</span>
  <span style="color: #000000; font-weight: bold;">case</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$optname</span>&quot;</span> <span style="color: #000000; font-weight: bold;">in</span>
  <span style="color: #ff0000;">&quot;o&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /o<span style="color: #007800;">$OPTARG</span>&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #ff0000;">&quot;c&quot;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #007800;">ARGS</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$ARGS</span> /c&quot;</span>
    <span style="color: #000000; font-weight: bold;">;;</span>
  <span style="color: #000000; font-weight: bold;">esac</span>
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
wine <span style="color: #ff0000;">&quot;<span style="color: #007800;">$BIN</span>/CL.EXE&quot;</span> <span style="color: #007800;">$ARGS</span> <span style="color: #800000;">${@:$OPTIND}</span></pre></td></tr></table></div>

<p>然后把他放在 PATH 里面的某个目录下 (我放在了用户级的 /home/upsuper/bin 里，这个似乎要自己添加就是了)，然后给这个文件加上可执行属性，最后只要在需要的地方执行：</p>

<div class="wp_codebox"><table><tr id="p93550"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p935code50"><pre class="bash" style="font-family:monospace;">vc6 xxx.cpp</pre></td></tr></table></div>

<p>就解决了~<br />
<span id="more-935"></span><br />
不过从这个脚本中也可以看出，它的功能还不太完善，不对，是很不完善。目前支持设置输出文件名和阻止执行连接。我很想加入很多其他的参数，不过不知道该怎么弄……</p>
<p>参考资料：</p>
<ul>
<li><a href="http://www.ibm.com/developerworks/cn/linux/l-bash-parameters.html">Linux 技巧: Bash 参数和参数扩展</a></li>
<li><a href="http://topic.csdn.net/t/20060903/21/4995578.html">vc6.0的INCLUDE 和LIB路径如何修改?  &#8211; CSDN社区</a></li>
<ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-simple-script-for-using-vc6-compiler-conveniently/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>鼠标控制音乐播放的小程序</title>
		<link>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/</link>
		<comments>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/#comments</comments>
		<pubDate>Tue, 03 Nov 2009 12:06:03 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[D-Bus]]></category>
		<category><![CDATA[gtk]]></category>
		<category><![CDATA[Netbook]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[音乐]]></category>
		<category><![CDATA[鼠标]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=895</guid>
		<description><![CDATA[看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！ 其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。 想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？） 说干就干！ 首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿 接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 MPRIS 的播放器控制接口。为此，我还专门学习了一下 python-dbus 的使用。 插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的…… 连接播放器的代码很简单： 1 2 3 import dbus bus = dbus.SessionBus&#40;&#41; player = bus.get_object&#40;'org.mpris.audacious', '/Player'&#41; 其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下： org.mpris.bmp org.mpris.vlc org.mpris.xmms2 至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象…… [...]]]></description>
			<content:encoded><![CDATA[<p>看这个标题一定很奇怪：难道我以前控制音乐播放不用鼠标么？这个文章的标题看起来像鼠标刚刚发明的推广期的文章……不过，当然不是这样的！</p>
<p>其实只是想：如何把我的小本合上放书架上，当作一个音乐播放器+功放，并用我的无线6键鼠当遥控器遥控控制之。</p>
<p>想想其实还是蛮有意义的功能，这样我做作业的时候可以不用戴耳机，不用用MP3，直接把本当播放器；同时，我不会看到屏幕上的东西，可以安心做作业~再看看我的6键无限鼠，那额外的功能键平时根本不用，也想不出能有什么用……这么好的东西就这样被我浪费了……（话说，拿本当音乐播放器是不是更浪费？）</p>
<p>说干就干！<br />
<span id="more-895"></span><br />
首先提出构想：左键用于暂停和播放，滚轮调节音量，侧边的两个功能键用来切换上一首和下一首。至于右键和中键……再说吧，说不定以后可以扩展更多功能？说不定以后高兴了弄个鼠标手势什么的~嘿嘿</p>
<p>接下来查找资料。印象中我的 Audacious 是可以用 D-Bus 控制的。简单地查阅了一下相关资料，发现了一个叫做 <a href="http://wiki.xmms2.xmms.se/wiki/Media_Player_Interfaces">MPRIS</a> 的播放器控制接口。为此，我还专门学习了一下 <a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">python-dbus</a> 的使用。</p>
<p>插一句话：python-dbus 怎么没有中文教程啊！英文教程看得还是蛮吃力的……</p>
<p>连接播放器的代码很简单：</p>

<div class="wp_codebox"><table><tr id="p89562"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code62"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">import</span> dbus
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>其中 org.mpris.audacious 指的是 audacious，支持 MPRIS 的其他播放器还可以有如下：</p>
<ul>
<li>org.mpris.bmp</li>
<li>org.mpris.vlc</li>
<li>org.mpris.xmms2</li>
</ul>
<p>至于那个 /Player 指的是我们要获取的是一个叫 Player 的对象，用于控制播放器。在 MPRIS 中除了 Player 以外，还有根对象 (&#8216;/&#8217;) 和 TrackList 对象 (&#8216;/TrackList&#8217;) 两个，具体的用法其文档里详细说明。这里我只用到了 Player 对象……</p>
<p>看看 Player 对象的方法还挺多，这里我用了这几个：</p>
<ul>
<li>Next() &#8211; 切换到下一首歌曲</li>
<li>Prev() &#8211; 切换到上一首歌曲</li>
<li>Pause() &#8211; 暂停/继续</li>
<li>Play() &#8211; 播放歌曲</li>
<li>VolumeGet() &#8211; 获取当前音量</li>
<li>VolumeSet() &#8211; 设置音量</li>
</ul>
<p>根据前面写的需求，这些已经足够了~</p>
<p>怎么用这些？很简单嘛！就像平时在 Python 里面调用类的方法一样~类型转换？不，那完全不需要你关心！</p>
<p>Python 程序拥有控制播放器的能力了，可是鼠标呢？如何捕获鼠标的动作呢？</p>
<p>想想……屏幕都关了……你还能指望他为你显示什么呢？干脆建立一个窗口把整个屏幕盖住算了！然后让他截获鼠标事件。</p>
<p>快速学习了一下 pygtk 的用法（其实就是照着 Hello World 打了一遍），差不多就知道怎么用了。窗口的建立代码大约如下：</p>

<div class="wp_codebox"><table><tr id="p89563"><td class="line_numbers"><pre>1
2
3
4
</pre></td><td class="code" id="p895code63"><pre class="python" style="font-family:monospace;">window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>这段代码很好理解了，第一行就是创建窗口对象，第二行令其全屏，第三行设置其显示，第四行开始 GTK 的主循环。</p>
<p>下面就是鼠标事件的问题了~添加事件用的是类似下面的代码：</p>

<div class="wp_codebox"><table><tr id="p89564"><td class="line_numbers"><pre>1
2
</pre></td><td class="code" id="p895code64"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>第一个是注册了键盘按键的事件捕获，将 key-press-event 事件绑定上 key_press 这个函数，而把窗口的销毁事件 destroy 连接到退出 GTK 主循环。说一句废话，连接事件的语句要放在 gtk.main() 之前……key_press 主要用来实现当点击 escape 时退出：</p>

<div class="wp_codebox"><table><tr id="p89565"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code65"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>好了，下面是鼠标点击事件 button-press-event：</p>

<div class="wp_codebox"><table><tr id="p89566"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code66"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>试试？不行的！差了一番后，发现 Window 这个东西默认是不打开鼠标点击的事件捕获的，逼近大家很少会点窗口本身，都是点里面的按钮什么的……下面的代码要求窗口打开鼠标点击事件的捕获：</p>

<div class="wp_codebox"><table><tr id="p89567"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code67"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>接下来就可以了~event.button 表示的是点击的键是哪个。检查了一下，左键是1，右键是3，中键是2，功能键1是8，功能键2是9。滚轮呢？</p>
<p>原来滚轮有自己的事件 scroll。</p>

<div class="wp_codebox"><table><tr id="p89568"><td class="line_numbers"><pre>1
2
3
</pre></td><td class="code" id="p895code68"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">print</span> event
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>直接可以用了。识别滚轮方向的是 event.direction，应该是 gtk.gdk.SCROLL_UP、SCROLL_DOWN、SCROLL_LEFT、SCROLL_RIGHT 其中的一个。</p>
<p>下面根据最初的设想，把他们都拼起来就形成了最初的版本：</p>

<div class="wp_codebox"><table><tr id="p89569"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
</pre></td><td class="code" id="p895code69"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> key_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> gdk.<span style="color: black;">keyval_name</span><span style="color: black;">&#40;</span>event.<span style="color: black;">keyval</span><span style="color: black;">&#41;</span> == <span style="color: #483d8b;">'Escape'</span>:
    window.<span style="color: black;">destroy</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'key-press-event'</span>, key_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>OK 看起来不错了，也能控制了。可是，作为一个程序员，怎么能不考虑各种意外呢？试想，如果我们控制着控制着，突然，一个不明真相的窗口弹了出来怎么办呢？！这是一个问题……</p>
<p>最容易想到的方法：把这个窗口永久置顶！</p>
<p>事实上也确实找到了这么个方法，就是把窗体注册成 dock。我们知道 dock 是需要永久置顶的~</p>
<p>用如下方法可以让窗体变成 Dock：</p>

<div class="wp_codebox"><table><tr id="p89570"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p895code70"><pre class="python" style="font-family:monospace;">window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">gdk</span>.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>但是问题又来了：dock 似乎没法接受键盘输入。因为 dock 只是形式上覆盖，并且可以拦截一切在他上面发生的鼠标事件，可键盘焦点就未必在他那里了~</p>
<p>那么我们就不要键盘事件了吧~于是我就把键盘退出给删了，改成了双击退出~查了下资料，双击事件也通过 button-press-event 发送的，必须根据 event.type 来判断是单击、双击还是三击。此外，双击和三击中的每一次点击都会引发一次单击事件。</p>
<p>OK，于是我们把 button_press 函数改成下面这样：</p>

<div class="wp_codebox"><table><tr id="p89571"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
</pre></td><td class="code" id="p895code71"><pre class="python" style="font-family:monospace;"><span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</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: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>然后删掉键盘处理，最后就成了这样：</p>

<div class="wp_codebox"><table><tr id="p89572"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
</pre></td><td class="code" id="p895code72"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> pygtk
pygtk.<span style="color: black;">require</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'2.0'</span><span style="color: black;">&#41;</span>
<span style="color: #ff7700;font-weight:bold;">import</span> gtk
<span style="color: #ff7700;font-weight:bold;">from</span> gtk <span style="color: #ff7700;font-weight:bold;">import</span> gdk
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> dbus
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> button_press<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: #008000;">type</span> == gdk._2BUTTON_PRESS:
    window.<span style="color: black;">destroy</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: #ff7700;font-weight:bold;">elif</span> event.<span style="color: #008000;">type</span> == gdk._3BUTTON_PRESS:
    <span style="color: #ff7700;font-weight:bold;">return</span>
  button = event.<span style="color: black;">button</span>
  <span style="color: #ff7700;font-weight:bold;">if</span> button == <span style="color: #ff4500;">1</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> player.<span style="color: black;">GetStatus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> == <span style="color: #ff4500;">2</span>:
      player.<span style="color: black;">Play</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      player.<span style="color: black;">Pause</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">9</span>:
    player.<span style="color: black;">Prev</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> button == <span style="color: #ff4500;">8</span>:
    player.<span style="color: black;">Next</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> scroll<span style="color: black;">&#40;</span>widget, event, data = <span style="color: #008000;">None</span><span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_UP</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> + <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
  <span style="color: #ff7700;font-weight:bold;">elif</span> event.<span style="color: black;">direction</span> == gdk.<span style="color: black;">SCROLL_DOWN</span>:
    player.<span style="color: black;">VolumeSet</span><span style="color: black;">&#40;</span>player.<span style="color: black;">VolumeGet</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span> - <span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
&nbsp;
bus = dbus.<span style="color: black;">SessionBus</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
player = bus.<span style="color: black;">get_object</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'org.mpris.audacious'</span>, <span style="color: #483d8b;">'/Player'</span><span style="color: black;">&#41;</span>
&nbsp;
window = gtk.<span style="color: black;">Window</span><span style="color: black;">&#40;</span>gtk.<span style="color: black;">WINDOW_TOPLEVEL</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'destroy'</span>, <span style="color: #ff7700;font-weight:bold;">lambda</span> widget, data = <span style="color: #008000;">None</span>: gtk.<span style="color: black;">main_quit</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">add_events</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">BUTTON_PRESS_MASK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'button-press-event'</span>, button_press<span style="color: black;">&#41;</span>
window.<span style="color: black;">connect</span><span style="color: black;">&#40;</span><span style="color: #483d8b;">'scroll-event'</span>, scroll<span style="color: black;">&#41;</span>
window.<span style="color: black;">set_type_hint</span><span style="color: black;">&#40;</span>gdk.<span style="color: black;">WINDOW_TYPE_HINT_DOCK</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">fullscreen</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
window.<span style="color: black;">show</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span>
gtk.<span style="color: black;">main</span><span style="color: black;">&#40;</span><span style="color: black;">&#41;</span></pre></td></tr></table></div>

<p>完成了！</p>
<p>以后就可以拿我的小本来当音乐播放器+功放啦~</p>
<p>参考资料：</p>
<ul>
<li><a href="http://wiki.xmms2.xmms.se/wiki/MPRIS">MPRIS &#8211; XMMS2</a></li>
<li><a href="http://dbus.freedesktop.org/doc/dbus-python/doc/tutorial.html">dbus-python tutorial</a></li>
<li><a href="http://www.pygtk.org/pygtk2tutorial/index.html">PyGTK 2.0 Tutorial</a></li>
<li><a href="http://library.gnome.org/devel/pygtk/stable/">PyGTK 2.0 Reference Manual</a></li>
<li><a href="http://www.daa.com.au/pipermail/pygtk/2004-January/006832.html">[pygtk] how to generate scroll wheel mouse event.</a></li>
<li><a href="http://topic.csdn.net/t/20030910/11/2243673.html">如何让窗口置顶？ Linux/Unix社区 / 程序开发区 &#8211; CSDN社区 community.csdn.net</a></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/a-little-program-for-music-player-control-by-mouse/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Python 物理实验数据处理类</title>
		<link>http://blog.upsuper.org/python-class-for-physics-experimentation-data-statistics/</link>
		<comments>http://blog.upsuper.org/python-class-for-physics-experimentation-data-statistics/#comments</comments>
		<pubDate>Tue, 20 Oct 2009 09:06:09 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[同济大学]]></category>
		<category><![CDATA[物理]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=866</guid>
		<description><![CDATA[非常无语的，同济大一什么物理理论都没学，需要的高数基础也都没有学过，竟然要我们先学物理实验，而且要处理数据，计算平均值和标准误差什么的，十分麻烦…… 上次处理数据弄了个零碎的小程序来，很麻烦，这次就把他统一编为一个模块，方便以后使用……这个模块里面的说有公式依据是同济大学出版社《物理实验教程》第1版第二章的内容。 如何使用这个模块呢？首先，作为一个 Python 模块，肯定要用 Python…… 然后我用我第一次做实验的部分数据演示一下： 直接输入数据，标准格式输出~ 最后是代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 [...]]]></description>
			<content:encoded><![CDATA[<p>非常无语的，同济大一什么物理理论都没学，需要的高数基础也都没有学过，竟然要我们先学物理实验，而且要处理数据，计算平均值和标准误差什么的，十分麻烦……</p>
<p>上次处理数据弄了个零碎的小程序来，很麻烦，这次就把他统一编为一个模块，方便以后使用……这个模块里面的说有公式依据是同济大学出版社《物理实验教程》第1版第二章的内容。</p>
<p>如何使用这个模块呢？首先，作为一个 Python 模块，肯定要用 Python……</p>
<p>然后我用我第一次做实验的部分数据演示一下：<br />
<a href="http://blog.upsuper.org/wp-content/uploads/2009/10/Screenshot-upsuper@upsuper-netbook-external-tju.png"><img src="http://blog.upsuper.org/wp-content/uploads/2009/10/Screenshot-upsuper@upsuper-netbook-external-tju.png" alt="Screenshot-upsuper@upsuper-netbook: ~-external-tju" title="Screenshot-upsuper@upsuper-netbook: ~-external-tju" width="588" height="303" class="alignnone size-full wp-image-867" /></a></p>
<p>直接输入数据，标准格式输出~</p>
<p>最后是代码：</p>

<div class="wp_codebox"><table><tr id="p86674"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
</pre></td><td class="code" id="p866code74"><pre class="python" style="font-family:monospace;"><span style="color: #808080; font-style: italic;">#!/usr/bin/env python</span>
<span style="color: #808080; font-style: italic;"># -*- coding: utf-8 -*-</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">import</span> <span style="color: #dc143c;">math</span>
sqrt = <span style="color: #dc143c;">math</span>.<span style="color: black;">sqrt</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> gen_imet<span style="color: black;">&#40;</span>func<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">def</span> retfunc<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
    ret = func<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> = ret.<span style="color: black;">ave</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">u</span> = ret.<span style="color: black;">u</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">digs</span> = ret.<span style="color: black;">digs</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span>
  <span style="color: #ff7700;font-weight:bold;">return</span> retfunc
&nbsp;
<span style="color: #ff7700;font-weight:bold;">def</span> get_digs<span style="color: black;">&#40;</span>a, b<span style="color: black;">&#41;</span>:
  <span style="color: #ff7700;font-weight:bold;">if</span> a == <span style="color: #ff4500;">0</span>: <span style="color: #ff7700;font-weight:bold;">return</span> b
  <span style="color: #ff7700;font-weight:bold;">elif</span> b == <span style="color: #ff4500;">0</span>: <span style="color: #ff7700;font-weight:bold;">return</span> a
  <span style="color: #ff7700;font-weight:bold;">else</span>: <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">min</span><span style="color: black;">&#40;</span>a, b<span style="color: black;">&#41;</span>
&nbsp;
<span style="color: #ff7700;font-weight:bold;">class</span> PhyStat:
  <span style="color: #483d8b;">&quot;&quot;&quot;
  物理实验数据
&nbsp;
  PhyStat(ave, u = 0.0, digs = 0)
  ave   表示平均值，如果传入一列数则自动计算平均值及其标准误差
  u     表示标准误差，如果 ave 传入数据列表则此处表示仪器精度
  digs  表示有效数字个数，0 表示不限制
  &quot;&quot;&quot;</span>
&nbsp;
  <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>, ave, u = <span style="color: #ff4500;">0.0</span>, digs = <span style="color: #ff4500;">0</span><span style="color: black;">&#41;</span>:
    <span style="color: #483d8b;">&quot;&quot;&quot;
    对于 ave 为数据列表的情况，使用下面公式计算平均值：
    ave = Σx[i] / n
    根据下面公式计算标准误差：
    S = Sqrt(Σ(x[i]-ave)^2 / (n - 1))
    u = Δinst / Sqrt(3)
    U = Sqrt(S^2 + u^2)
    &quot;&quot;&quot;</span>
    <span style="color: #008000;">self</span>.<span style="color: black;">digs</span> = digs
&nbsp;
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>ave, <span style="color: #008000;">tuple</span><span style="color: black;">&#41;</span> <span style="color: #ff7700;font-weight:bold;">or</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>ave, <span style="color: #008000;">list</span><span style="color: black;">&#41;</span>:
      data = ave
      n = <span style="color: #008000;">len</span><span style="color: black;">&#40;</span>data<span style="color: black;">&#41;</span>
      ave = <span style="color: #dc143c;">math</span>.<span style="color: black;">fsum</span><span style="color: black;">&#40;</span>ave<span style="color: black;">&#41;</span> / n
      <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> = ave
&nbsp;
      s = <span style="color: #ff4500;">0.0</span>
      <span style="color: #ff7700;font-weight:bold;">for</span> i <span style="color: #ff7700;font-weight:bold;">in</span> data:
        s += <span style="color: black;">&#40;</span>i - ave<span style="color: black;">&#41;</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span>
      s = sqrt<span style="color: black;">&#40;</span>s / <span style="color: black;">&#40;</span>n - <span style="color: #ff4500;">1</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
      u /= sqrt<span style="color: black;">&#40;</span><span style="color: #ff4500;">3</span><span style="color: black;">&#41;</span>
      <span style="color: #008000;">self</span>.<span style="color: black;">u</span> = sqrt<span style="color: black;">&#40;</span>s <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span> + u <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> = <span style="color: #008000;">float</span><span style="color: black;">&#40;</span>ave<span style="color: black;">&#41;</span>
      <span style="color: #008000;">self</span>.<span style="color: black;">u</span> = <span style="color: #008000;">abs</span><span style="color: black;">&#40;</span><span style="color: #008000;">float</span><span style="color: black;">&#40;</span>u<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__repr__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span><span style="color: black;">&#41;</span>:
    ave = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span>
    exp = <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">floor</span><span style="color: black;">&#40;</span><span style="color: #dc143c;">math</span>.<span style="color: black;">log10</span><span style="color: black;">&#40;</span>ave<span style="color: black;">&#41;</span><span style="color: black;">&#41;</span><span style="color: black;">&#41;</span>
    exp10 = <span style="color: #ff4500;">10</span> <span style="color: #66cc66;">**</span> exp
    ave = ave / exp10
    u = <span style="color: #008000;">self</span>.<span style="color: black;">u</span> / exp10
    digs = <span style="color: #008000;">self</span>.<span style="color: black;">digs</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> digs == <span style="color: #ff4500;">0</span>:
      ret = <span style="color: #483d8b;">'%f ±%f'</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      ret = <span style="color: #483d8b;">'%%.%df ±%%.%df'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>digs, digs<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">if</span> exp:
      ret = <span style="color: #483d8b;">'(%s) E %d'</span> <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>ret, exp<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> ret <span style="color: #66cc66;">%</span> <span style="color: black;">&#40;</span>ave, u<span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #0000cd;">__neg__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: PhyStat<span style="color: black;">&#40;</span>-<span style="color: #008000;">self</span>.<span style="color: black;">ave</span>, <span style="color: #008000;">self</span>.<span style="color: black;">u</span>, <span style="color: #008000;">self</span>.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__pos__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: <span style="color: #008000;">self</span>
  <span style="color: #0000cd;">__abs__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: PhyStat<span style="color: black;">&#40;</span><span style="color: #008000;">abs</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ave</span><span style="color: black;">&#41;</span>, <span style="color: #008000;">self</span>.<span style="color: black;">u</span>, <span style="color: #008000;">self</span>.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__add__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>other, PhyStat<span style="color: black;">&#41;</span>:
      ave = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> + other.<span style="color: black;">ave</span>
      u = sqrt<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">u</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span> + other.<span style="color: black;">u</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
      digs = get_digs<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">digs</span>, other.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">return</span> PhyStat<span style="color: black;">&#40;</span>ave, u, digs<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      ave = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> + other
      <span style="color: #ff7700;font-weight:bold;">return</span> PhyStat<span style="color: black;">&#40;</span>ave, <span style="color: #008000;">self</span>.<span style="color: black;">u</span>, <span style="color: #008000;">self</span>.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #0000cd;">__radd__</span> = <span style="color: #0000cd;">__add__</span>
  <span style="color: #0000cd;">__sub__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> + <span style="color: black;">&#40;</span>-other<span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__rsub__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: other + <span style="color: black;">&#40;</span>-<span style="color: #008000;">self</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__mul__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>other, PhyStat<span style="color: black;">&#41;</span>:
      a = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span>
      b = other.<span style="color: black;">ave</span>
      ave = a <span style="color: #66cc66;">*</span> b
      u = ave <span style="color: #66cc66;">*</span> sqrt<span style="color: black;">&#40;</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">u</span> / a<span style="color: black;">&#41;</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span> + <span style="color: black;">&#40;</span>other.<span style="color: black;">u</span> / b<span style="color: black;">&#41;</span> <span style="color: #66cc66;">**</span> <span style="color: #ff4500;">2</span><span style="color: black;">&#41;</span>
      digs = get_digs<span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">digs</span>, other.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
      <span style="color: #ff7700;font-weight:bold;">return</span> PhyStat<span style="color: black;">&#40;</span>ave, u, digs<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      ave = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span> <span style="color: #66cc66;">*</span> other
      u = <span style="color: #008000;">self</span>.<span style="color: black;">u</span> <span style="color: #66cc66;">*</span> other
      <span style="color: #ff7700;font-weight:bold;">return</span> PhyStat<span style="color: black;">&#40;</span>ave, u, <span style="color: #008000;">self</span>.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #0000cd;">__rmul__</span> = <span style="color: #0000cd;">__mul__</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__div__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
    <span style="color: #ff7700;font-weight:bold;">if</span> <span style="color: #008000;">isinstance</span><span style="color: black;">&#40;</span>other, PhyStat<span style="color: black;">&#41;</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: #008000;">self</span> <span style="color: #66cc66;">*</span> other <span style="color: #66cc66;">**</span> -<span style="color: #ff4500;">1</span>
    <span style="color: #ff7700;font-weight:bold;">else</span>:
      <span style="color: #ff7700;font-weight:bold;">return</span> <span style="color: black;">&#40;</span><span style="color: #ff4500;">1.0</span> / other<span style="color: black;">&#41;</span> <span style="color: #66cc66;">*</span> <span style="color: #008000;">self</span>
&nbsp;
  <span style="color: #0000cd;">__rdiv__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: other <span style="color: #66cc66;">*</span> <span style="color: #008000;">self</span> <span style="color: #66cc66;">**</span> -<span style="color: #ff4500;">1</span>
&nbsp;
  <span style="color: #ff7700;font-weight:bold;">def</span> <span style="color: #0000cd;">__pow__</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>, other<span style="color: black;">&#41;</span>:
    a = <span style="color: #008000;">self</span>.<span style="color: black;">ave</span>
    ave = a <span style="color: #66cc66;">**</span> other
    u = <span style="color: #008000;">abs</span><span style="color: black;">&#40;</span>other <span style="color: #66cc66;">*</span> <span style="color: #008000;">self</span>.<span style="color: black;">u</span> / a <span style="color: #66cc66;">*</span> ave<span style="color: black;">&#41;</span>
    <span style="color: #ff7700;font-weight:bold;">return</span> PhyStat<span style="color: black;">&#40;</span>ave, u, <span style="color: #008000;">self</span>.<span style="color: black;">digs</span><span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #0000cd;">__iadd__</span> = gen_imet<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> + other<span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__isub__</span> = gen_imet<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> - other<span style="color: black;">&#41;</span>
  __imul__ = gen_imet<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> <span style="color: #66cc66;">*</span> other<span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__idiv__</span> = gen_imet<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> / other<span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__ipow__</span> = gen_imet<span style="color: black;">&#40;</span><span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>, other: <span style="color: #008000;">self</span> <span style="color: #66cc66;">**</span> other<span style="color: black;">&#41;</span>
&nbsp;
  <span style="color: #0000cd;">__int__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: <span style="color: #008000;">int</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ave</span><span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__long__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: <span style="color: #008000;">long</span><span style="color: black;">&#40;</span><span style="color: #008000;">self</span>.<span style="color: black;">ave</span><span style="color: black;">&#41;</span>
  <span style="color: #0000cd;">__float__</span> = <span style="color: #ff7700;font-weight:bold;">lambda</span> <span style="color: #008000;">self</span>: <span style="color: #008000;">self</span>.<span style="color: black;">ave</span></pre></td></tr></table></div>

<p>如果大家发现什么 bug，或者有什么改进建议，欢迎提哈~<span id="more-866"></span></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/python-class-for-physics-experimentation-data-statistics/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>ujudger 0.1 发布</title>
		<link>http://blog.upsuper.org/ujudger-0-1-release/</link>
		<comments>http://blog.upsuper.org/ujudger-0-1-release/#comments</comments>
		<pubDate>Fri, 10 Jul 2009 02:54:48 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[Cena]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[OI]]></category>
		<category><![CDATA[Python]]></category>
		<category><![CDATA[ujudger]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=781</guid>
		<description><![CDATA[曾经的曾经，很早很早以前，我发布了一个叫 ujudger-base 0.1 的东西，是用 C++ 写成的简单测评程序，仅能测试程序运行时间和内存耗用（还不准确）。 这次发布的是一个完整的测评机，支持传统题型、交互题和提交答案题，可导出测评结果。整个程序使用 Python 编写，直接把 ujudger.py 复制到待测目录下并编写 config 文件即可测评。 不过现在这个程序只有一个文字界面，非常简陋，而且安全性不佳。但现在正在撰写的 ujudger 1.0 (版本跨越大，意味着变化之巨大……) 将就这些问题有重大改进，敬请期待。 另外，有人询问是否准备让这个测评机与另一个 Windows 下的开源测评机 Cena 兼容。我的回答是，由于设计差异，可能比较困难。对比 Cena 的自定义校验器，ujudger 的自定义校验器更强大，同时 Cena 的校验器可以通过一点简单的修改或加一个脚本外壳就可以在 ujudger 中使用。在 1.0 中计划兼容 Cena 的校验器。至于配置文件，1.0 中配置文件的格式会有较大变动，不过可能可以通过转换程序将 Cena 的配置文件转为 ujudger 的。 我在 Google Code 上开了一个项目，感兴趣的同学可以关注关注~地址：http://ujudger.googlecode.com/ 最后，ujudger 0.1 的下载地址也在 Google Code 上：ujudger.py]]></description>
			<content:encoded><![CDATA[<p>曾经的曾经，很早很早以前，<a href="http://blog.upsuper.org/ujudger-base-0-1-released/">我发布了一个叫 ujudger-base 0.1 的东西</a>，是用 C++ 写成的简单测评程序，仅能测试程序运行时间和内存耗用（还不准确）。</p>
<p>这次发布的是一个完整的测评机，支持传统题型、交互题和提交答案题，可导出测评结果。整个程序使用 Python 编写，直接把 ujudger.py 复制到待测目录下并编写 config 文件即可测评。</p>
<p>不过现在这个程序只有一个文字界面，非常简陋，而且安全性不佳。但现在正在撰写的 ujudger 1.0 (版本跨越大，意味着变化之巨大……) 将就这些问题有重大改进，敬请期待。</p>
<p>另外，有人询问是否准备让这个测评机与另一个 Windows 下的开源测评机 Cena 兼容。我的回答是，由于设计差异，可能比较困难。对比 Cena 的自定义校验器，ujudger 的自定义校验器更强大，同时 Cena 的校验器可以通过一点简单的修改或加一个脚本外壳就可以在 ujudger 中使用。在 1.0 中计划兼容 Cena 的校验器。至于配置文件，1.0 中配置文件的格式会有较大变动，不过可能可以通过转换程序将 Cena 的配置文件转为 ujudger 的。</p>
<p>我在 Google Code 上开了一个项目，感兴趣的同学可以关注关注~地址：<a href="http://ujudger.googlecode.com/">http://ujudger.googlecode.com/</a></p>
<p>最后，ujudger 0.1 的下载地址也在 Google Code 上：<a href="http://ujudger.googlecode.com/files/ujudger.py">ujudger.py</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/ujudger-0-1-release/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Ubuntu 下直接挂载 iso</title>
		<link>http://blog.upsuper.org/mount-iso-directly-on-ubuntu/</link>
		<comments>http://blog.upsuper.org/mount-iso-directly-on-ubuntu/#comments</comments>
		<pubDate>Tue, 17 Feb 2009 03:11:50 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[bash]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=680</guid>
		<description><![CDATA[感觉挂载 iso 每次要建文件夹、挂载，用完还要删除、删文件夹，很麻烦。在网上找了一个帖子：用于使用 鼠标右键 挂载iso的脚本!，觉得看起来不错，不过好像不能自动卸载。经过一番学习，给出了如下自动挂载/卸载脚本： 1 2 3 4 5 6 7 8 9 10 11 12 13 #!/bin/bash &#91; $UID == 0 &#93; &#124;&#124; cmd=&#34;gksu&#34; if &#91; ! -f $1 &#93;; then exit 2 fi dir=&#34;/media/`basename $1 .iso`&#34; if &#91; ! -d $dir &#93;; then $cmd &#34;mkdir $dir&#34; $cmd &#34;mount -t iso9660 -o loop [...]]]></description>
			<content:encoded><![CDATA[<p>感觉挂载 iso 每次要建文件夹、挂载，用完还要删除、删文件夹，很麻烦。在网上找了一个帖子：<a href="http://forum.ubuntu.org.cn/viewtopic.php?f=21&#038;t=58745">用于使用 鼠标右键 挂载iso的脚本!</a>，觉得看起来不错，不过好像不能自动卸载。经过一番学习，给出了如下自动挂载/卸载脚本：</p>

<div class="wp_codebox"><table><tr id="p68076"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
</pre></td><td class="code" id="p680code76"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
<span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$UID</span> == <span style="color: #000000;">0</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #007800;">cmd</span>=<span style="color: #ff0000;">&quot;gksu&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">2</span>
<span style="color: #000000; font-weight: bold;">fi</span>
<span style="color: #007800;">dir</span>=<span style="color: #ff0000;">&quot;/media/<span style="color: #780078;">`basename $1 .iso`</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-d</span> <span style="color: #007800;">$dir</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #007800;">$cmd</span> <span style="color: #ff0000;">&quot;mkdir <span style="color: #007800;">$dir</span>&quot;</span>
	<span style="color: #007800;">$cmd</span> <span style="color: #ff0000;">&quot;mount -t iso9660 -o loop $1 <span style="color: #007800;">$dir</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">else</span>
	<span style="color: #007800;">$cmd</span> <span style="color: #ff0000;">&quot;umount <span style="color: #007800;">$dir</span>&quot;</span>
	<span style="color: #007800;">$cmd</span> <span style="color: #ff0000;">&quot;rm -r <span style="color: #007800;">$dir</span>&quot;</span>
<span style="color: #000000; font-weight: bold;">fi</span></pre></td></tr></table></div>

<p>写的很短很简陋，如果把 cmd= 后面改成 kdesudo 就可以在 KDE 下用了。</p>
<p><img src="http://blog.upsuper.org/wp-content/uploads/2009/02/e68c82e8bdbde58db8e8bdbdiso-300x227.png" alt="e68c82e8bdbde58db8e8bdbdiso" title="e68c82e8bdbde58db8e8bdbdiso" width="300" height="227" class="alignright size-medium wp-image-681" />我把这个设置为 iso 文件的默认打开方式，这样以后双击 iso 文件，马上挂载，再双击，自动卸载，太方便了！用 Linux 的都可以试试~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/mount-iso-directly-on-ubuntu/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>WAP版百度投票</title>
		<link>http://blog.upsuper.org/wap-version-of-baidu-vote/</link>
		<comments>http://blog.upsuper.org/wap-version-of-baidu-vote/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 02:00:31 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[百度]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=678</guid>
		<description><![CDATA[百度贴吧的投票不支持手机，连 UCWEB 和 Opera Mini 都看不了，于是就自己写了个，不过只能查看，不能投票就是了…… 其实我一直很奇怪，连我当时的音乐投票站点用的全 AJAX 那俩浏览器都能完全支持，为什么百度这个却不行呢？经过研究，我在投票的地方发现如下代码： 1 document.write&#40;'&#60;iframe id=&#34;vote_iframe&#34; id=&#34;vote_iframe&#34; width=&#34;100%&#34; frameborder=&#34;0&#34; height=&#34;0&#34; scrolling=&#34;no&#34; src=&#34;http://toupiao.baidu.com/sys/dtview/1/299ffee9f95d723176f722e6?bu='+r_url+'&#38;t='+Math.random&#40;&#41;+'&#34;&#62;&#60;/iframe&#62;'&#41; 这段代码出现在投票信息出现的地方，很明显，这就是投票信息。所以就打开 http://toupiao.baidu.com/sys/dtview/1/299ffee9f95d723176f722e6 看到了那个投票信息，再研究代码，便写出了下面程序： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 [...]]]></description>
			<content:encoded><![CDATA[<p>百度贴吧的投票不支持手机，连 UCWEB 和 Opera Mini 都看不了，于是就自己写了个，不过只能查看，不能投票就是了……<br />
<span id="more-678"></span><br />
其实我一直很奇怪，连我当时的音乐投票站点用的全 AJAX 那俩浏览器都能完全支持，为什么百度这个却不行呢？经过研究，我在投票的地方发现如下代码：</p>

<div class="wp_codebox"><table><tr id="p67879"><td class="line_numbers"><pre>1
</pre></td><td class="code" id="p678code79"><pre class="javascript" style="font-family:monospace;">document.<span style="color: #000066; font-weight: bold;">write</span><span style="color: #009900;">&#40;</span><span style="color: #3366CC;">'&lt;iframe id=&quot;vote_iframe&quot; id=&quot;vote_iframe&quot; width=&quot;100%&quot; frameborder=&quot;0&quot;  height=&quot;0&quot; scrolling=&quot;no&quot;  src=&quot;http://toupiao.baidu.com/sys/dtview/1/299ffee9f95d723176f722e6?bu='</span><span style="color: #339933;">+</span>r_url<span style="color: #339933;">+</span><span style="color: #3366CC;">'&amp;t='</span><span style="color: #339933;">+</span>Math.<span style="color: #660066;">random</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">+</span><span style="color: #3366CC;">'&quot;&gt;&lt;/iframe&gt;'</span><span style="color: #009900;">&#41;</span></pre></td></tr></table></div>

<p>这段代码出现在投票信息出现的地方，很明显，这就是投票信息。所以就打开 <a href="http://toupiao.baidu.com/sys/dtview/1/299ffee9f95d723176f722e6">http://toupiao.baidu.com/sys/dtview/1/299ffee9f95d723176f722e6</a> 看到了那个投票信息，再研究代码，便写出了下面程序：</p>

<div class="wp_codebox"><table><tr id="p67880"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
</pre></td><td class="code" id="p678code80"><pre class="php" style="font-family:monospace;"><span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Content-Type: text/vnd.wap.wml;charset=UTF-8'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$_GET</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'id'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
<span style="color: #000088;">$id</span> <span style="color: #339933;">=</span> <span style="color: #990000;">preg_replace</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/[^0-9a-f]/i'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">''</span><span style="color: #339933;">,</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'错误的投票 id ！'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #000088;">$file</span> <span style="color: #339933;">=</span> <span style="color: #0000ff;">'./cache/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">;</span>
&nbsp;
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">file_exists</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #b1b100;">include</span> <span style="color: #000088;">$file</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #000088;">$curl</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://toupiao.baidu.com/sys/rsview/1/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'?t='</span><span style="color: #339933;">.</span><span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/vtVoterSum:(\d+),/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'错误！'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{vtVoteNum:(\d+),vtVotePt:(\d+\.\d+)}/'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #339933;">,</span> PREG_SET_ORDER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'错误！'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'%'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #009900;">&#125;</span> <span style="color: #b1b100;">else</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$curl</span> <span style="color: #339933;">=</span> <span style="color: #990000;">curl_init</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_URL<span style="color: #339933;">,</span> <span style="color: #0000ff;">'http://toupiao.baidu.com/sys/dtview/1/'</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'?t='</span><span style="color: #339933;">.</span><span style="color: #990000;">rand</span><span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_HEADER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">0</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_setopt</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #339933;">,</span> CURLOPT_RETURNTRANSFER<span style="color: #339933;">,</span> <span style="color: #cc66cc;">1</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$content</span> <span style="color: #339933;">=</span> <span style="color: #990000;">iconv</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'gb2312'</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'utf-8'</span><span style="color: #339933;">,</span> <span style="color: #990000;">curl_exec</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">curl_close</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$curl</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/vote_desc_array\[\d+\]=new Array\(&quot;(.+?)&quot;,\d+\);/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #339933;">,</span> PREG_SET_ORDER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">exit</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'错误！'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #000088;">$fp</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$file</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'wb'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;&lt;?php<span style="color: #000099; font-weight: bold;">\n</span>&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #990000;">fprintf</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">'$item[%d][0]=%s;'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$i</span><span style="color: #339933;">,</span> <span style="color: #990000;">var_export</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #009900; font-weight: bold;">true</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
	<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;<span style="color: #000099; font-weight: bold;">\n</span>?&gt;&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$fp</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/&lt;span class=&quot;fB&quot;&gt;(\d+)&lt;\/span&gt;/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #666666; font-style: italic;">//if (! $match) exit('错误！');</span>
	<span style="color: #000088;">$total</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">1</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">;</span>
&nbsp;
	<span style="color: #990000;">preg_match_all</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'/{optVoNum:(\d+),vtVotePt:(\d+\.\d+)}/i'</span><span style="color: #339933;">,</span> <span style="color: #000088;">$content</span><span style="color: #339933;">,</span> <span style="color: #000088;">$match</span><span style="color: #339933;">,</span> PREG_SET_ORDER<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #339933;">!</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#41;</span> <span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'Location: index.php?id='</span><span style="color: #339933;">.</span><span style="color: #000088;">$id</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #b1b100;">for</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$i</span> <span style="color: #339933;">=</span> <span style="color: #cc66cc;">0</span><span style="color: #339933;">;</span> <span style="color: #990000;">isset</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span> <span style="color: #339933;">++</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</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: #000088;">$item</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">=</span> <span style="color: #000088;">$match</span><span style="color: #009900;">&#91;</span><span style="color: #000088;">$i</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #cc66cc;">2</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">.</span><span style="color: #0000ff;">'%'</span><span style="color: #339933;">;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
&nbsp;
<span style="color: #b1b100;">include</span> <span style="color: #0000ff;">'./userface.php'</span><span style="color: #339933;">;</span></pre></td></tr></table></div>

<p>至于 userface.php 就自己写 wml 界面就好了~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/wap-version-of-baidu-vote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的 WAP 上传通道</title>
		<link>http://blog.upsuper.org/my-wap-upload-pipe/</link>
		<comments>http://blog.upsuper.org/my-wap-upload-pipe/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 10:07:01 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[WAP]]></category>
		<category><![CDATA[网站]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=605</guid>
		<description><![CDATA[这年头……手机连接线也要大几十块……我穷人买不起……于是就想利用我的空间建一个 WAP 上传通道，记得上一次放了一个下载通道。这样我要让手机和电脑互传就没有障碍了！ 去网上找了一下，很短的时间写了个小程序： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 [...]]]></description>
			<content:encoded><![CDATA[<p>这年头……手机连接线也要大几十块……我穷人买不起……于是就想利用我的空间建一个 WAP 上传通道，记得上一次放了一个下载通道。这样我要让手机和电脑互传就没有障碍了！<br />
<span id="more-605"></span><br />
去网上找了一下，很短的时间写了个小程序：</p>

<div class="wp_codebox"><table><tr id="p60582"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
</pre></td><td class="code" id="p605code82"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #666666; font-style: italic;">// 前面就是 xhtml 的需要了</span>
<span style="color: #990000;">header</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;Content-Type: application/xhtml+xml&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;?xml version='1.0' encoding='utf-8'?&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;!</span>DOCTYPE html
	<span style="color: #000000; font-weight: bold;">PUBLIC</span> <span style="color: #0000ff;">&quot;-//W3C//DTD XHTML 1.0 Transitional//EN&quot;</span>
	<span style="color: #0000ff;">&quot;http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>html xmlns<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;http://www.w3.org/1999/xhtml&quot;</span> xml<span style="color: #339933;">:</span>lang<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;en&quot;</span> lang<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;en&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>meta http<span style="color: #339933;">-</span>equiv<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;content-type&quot;</span> content<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;application/xhtml+xml;charset=UTF-8&quot;</span> <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>title<span style="color: #339933;">&gt;</span>WAP上传通道<span style="color: #339933;">&lt;/</span>title<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>head<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>body<span style="color: #339933;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span>
<span style="color: #009900;">&#123;</span>
	<span style="color: #666666; font-style: italic;">// 验证密码，不想让谁都能随便上传……</span>
	<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">md5</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_POST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'password'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">!=</span> <span style="color: #0000ff;">'********************************'</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
		<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;密码错误！&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: #990000;">define</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'UPLOAD_DIR'</span><span style="color: #339933;">,</span> <span style="color: #990000;">dirname</span><span style="color: #009900;">&#40;</span><span style="color: #009900; font-weight: bold;">__FILE__</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/upload'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #339933;">@</span><span style="color: #990000;">mkdir</span><span style="color: #009900;">&#40;</span>UPLOAD_DIR<span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
		<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #990000;">move_uploaded_file</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'tmp_name'</span><span style="color: #009900;">&#93;</span><span style="color: #339933;">,</span> 
			UPLOAD_DIR <span style="color: #339933;">.</span> <span style="color: #0000ff;">'/'</span> <span style="color: #339933;">.</span> <span style="color: #990000;">basename</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
			<span style="color: #b1b100;">echo</span> <span style="color: #990000;">basename</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'name'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">.</span> 
				<span style="color: #0000ff;">&quot; (<span style="color: #006699; font-weight: bold;">{$_FILES['file']['size']}</span>bytes) 上传成功！&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: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;上传失败！(<span style="color: #006699; font-weight: bold;">{$_FILES['file']['error']}</span>)&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
			<span style="color: #b1b100;">switch</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_FILES</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'file'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'error'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_INI_SIZE<span style="color: #339933;">:</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_FORM_SIZE<span style="color: #339933;">:</span>
					<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;大小超过限制的值&quot;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_PARTIAL<span style="color: #339933;">:</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_NO_FILE<span style="color: #339933;">:</span>
					<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;上传文件不完整&quot;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_NO_TMP_DIR<span style="color: #339933;">:</span>
				<span style="color: #b1b100;">case</span> UPLOAD_ERR_CANT_WRITE<span style="color: #339933;">:</span>
					<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;其他错误&quot;</span><span style="color: #339933;">;</span> <span style="color: #b1b100;">break</span><span style="color: #339933;">;</span>
			<span style="color: #009900;">&#125;</span>
		<span style="color: #009900;">&#125;</span>
	<span style="color: #009900;">&#125;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #b1b100;">echo</span> <span style="color: #0000ff;">&quot;&lt;br /&gt;&quot;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span>form name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;upload&quot;</span> method<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;post&quot;</span> action<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;index.php&quot;</span> enctype<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;multipart/form-data&quot;</span><span style="color: #339933;">&gt;</span>
上传密码：<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;password&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;password&quot;</span> <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;file&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;file&quot;</span> <span style="color: #339933;">/&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;提交&quot;</span> <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;/</span>body<span style="color: #339933;">&gt;</span> 
<span style="color: #339933;">&lt;/</span>html<span style="color: #339933;">&gt;</span></pre></td></tr></table></div>

<p>马上试验了一下，就成功了！</p>
<p>很好很强大！拿来分享一下~</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/my-wap-upload-pipe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>我的 PHP 测试小程序</title>
		<link>http://blog.upsuper.org/my-php-test-applet/</link>
		<comments>http://blog.upsuper.org/my-php-test-applet/#comments</comments>
		<pubDate>Thu, 02 Oct 2008 01:52:11 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=596</guid>
		<description><![CDATA[最近研究 PHP，为了方便，写了个小小的 PHP 页面用来测试简单的 PHP 代码段，为了看了更方便。虽然可能有更好的工具，不过也胡乱贴出来，呵呵~ 首先要先在这个文件的文件夹下建立一个 script_test.php 文件，还要把这个文件设为 0777（这是 Linux 的属性，用 Windows 的不用鸟……Windows 的权限设置过于宽松了……）。 然后是代码： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 &#60;?php $script = stripslashes&#40;$_REQUEST&#91;'script'&#93;&#41;; if &#40;$script !== false&#41; &#123; $ftest [...]]]></description>
			<content:encoded><![CDATA[<p>最近研究 PHP，为了方便，写了个小小的 PHP 页面用来测试简单的 PHP 代码段，为了看了更方便。虽然可能有更好的工具，不过也胡乱贴出来，呵呵~<br />
<span id="more-596"></span><br />
首先要先在这个文件的文件夹下建立一个 script_test.php 文件，还要把这个文件设为 0777（这是 Linux 的属性，用 Windows 的不用鸟……Windows 的权限设置过于宽松了……）。</p>
<p>然后是代码：</p>

<div class="wp_codebox"><table><tr id="p59684"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
</pre></td><td class="code" id="p596code84"><pre class="php" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">&lt;?php</span>
<span style="color: #000088;">$script</span> <span style="color: #339933;">=</span> <span style="color: #990000;">stripslashes</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'script'</span><span style="color: #009900;">&#93;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #009900;">&#123;</span>
	<span style="color: #000088;">$ftest</span> <span style="color: #339933;">=</span> <span style="color: #990000;">fopen</span><span style="color: #009900;">&#40;</span><span style="color: #0000ff;">&quot;script_test.php&quot;</span><span style="color: #339933;">,</span> <span style="color: #0000ff;">&quot;wb&quot;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fwrite</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ftest</span><span style="color: #339933;">,</span> <span style="color: #000088;">$script</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
	<span style="color: #990000;">fclose</span><span style="color: #009900;">&#40;</span><span style="color: #000088;">$ftest</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #009900;">&#125;</span>
<span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$_REQUEST</span><span style="color: #009900;">&#91;</span><span style="color: #0000ff;">'ret'</span><span style="color: #009900;">&#93;</span> <span style="color: #339933;">==</span> <span style="color: #0000ff;">'js'</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;script language</span><span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;javascript&quot;</span><span style="color: #339933;">&gt;</span>
parent<span style="color: #339933;">.</span>document<span style="color: #339933;">.</span>getElementById<span style="color: #009900;">&#40;</span><span style="color: #0000ff;">'show_test'</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">.</span>contentWindow<span style="color: #339933;">.</span>location<span style="color: #339933;">.</span>reload<span style="color: #009900;">&#40;</span><span style="color: #009900;">&#41;</span><span style="color: #339933;">;</span>
<span style="color: #000000; font-weight: bold;">&lt;/script&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">else</span> <span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span>style<span style="color: #339933;">&gt;</span>textarea <span style="color: #009900;">&#123;</span> width<span style="color: #339933;">:</span> <span style="color: #cc66cc;">100</span><span style="color: #339933;">%;</span> height<span style="color: #339933;">:</span> 400px<span style="color: #339933;">;</span> <span style="color: #009900;">&#125;</span><span style="color: #339933;">&lt;/</span>style<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>table width<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;100%&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>tr valign<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;top&quot;</span><span style="color: #339933;">&gt;&lt;</span>td width<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;50%&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>form action<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;?ret=js&quot;</span> method<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;POST&quot;</span> target<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit_iframe&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>textarea id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;script&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;script&quot;</span><span style="color: #339933;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;&lt;?=</span> <span style="color: #000088;">$script</span> <span style="color: #000000; font-weight: bold;">?&gt;&lt;?</span>php <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>textarea<span style="color: #339933;">&gt;&lt;</span>br <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;</span>input type<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit&quot;</span> value<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;Test&quot;</span> <span style="color: #339933;">/&gt;</span>
<span style="color: #339933;">&lt;/</span>form<span style="color: #339933;">&gt;&lt;/</span>td<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>td width<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;50%&quot;</span><span style="color: #339933;">&gt;</span><span style="color: #000000; font-weight: bold;">&lt;?</span>php <span style="color: #b1b100;">if</span> <span style="color: #009900;">&#40;</span><span style="color: #000088;">$script</span> <span style="color: #339933;">!==</span> <span style="color: #009900; font-weight: bold;">false</span><span style="color: #009900;">&#41;</span> <span style="color: #339933;">:</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;</span>iframe id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;show_test&quot;</span> src<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;script_test.php&quot;</span>
 style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;border: 1px black solid; width: 100%; height: 400px;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>iframe<span style="color: #339933;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span>
<span style="color: #339933;">&lt;/</span>td<span style="color: #339933;">&gt;&lt;/</span>tr<span style="color: #339933;">&gt;&lt;/</span>table<span style="color: #339933;">&gt;</span>
<span style="color: #339933;">&lt;</span>iframe id<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit_iframe&quot;</span> name<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;submit_iframe&quot;</span> style<span style="color: #339933;">=</span><span style="color: #0000ff;">&quot;display: none;&quot;</span><span style="color: #339933;">&gt;&lt;/</span>iframe<span style="color: #339933;">&gt;</span>
<span style="color: #000000; font-weight: bold;">&lt;?php</span> <span style="color: #b1b100;">endif</span><span style="color: #339933;">;</span> <span style="color: #000000; font-weight: bold;">?&gt;</span></pre></td></tr></table></div>

<p>其中那些高度对于我的显示器效果是不错的，可以根据自己需要调整……</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/my-php-test-applet/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>真彩色展示</title>
		<link>http://blog.upsuper.org/show-true-color/</link>
		<comments>http://blog.upsuper.org/show-true-color/#comments</comments>
		<pubDate>Fri, 15 Feb 2008 01:21:34 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[API]]></category>
		<category><![CDATA[VB]]></category>
		<category><![CDATA[色彩]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=7</guid>
		<description><![CDATA[比较无聊的我用VB写了一个能生成所有24位真彩色的程序，可以循环播放真彩色。在这个程序中，你开始会觉得看不出来有变化，不知不觉间就完全变掉了。每轮一共512桢，每桢256*256，向右绿色增加，向下蓝色增加，播放为红色的变化。 如果感兴趣可以在这里下载：allTrueColor.exe (28KB) Windows 9x需要有VB6运行库支持。另外运行本程序可能导致CPU占用率极高（我用双核，其中一个核可以达到100%）。这个程序的变化速度取决于电脑的运行速度，但通常是比较快速的，这完全得益于使用Windows API代替VB自带的函数带来的效率。 下面是源代码 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 Option Explicit Dim isBegin As Boolean, isAdd [...]]]></description>
			<content:encoded><![CDATA[<p>比较无聊的我用VB写了一个能生成所有24位真彩色的程序，可以循环播放真彩色。在这个程序中，你开始会觉得看不出来有变化，不知不觉间就完全变掉了。每轮一共512桢，每桢256*256，向右绿色增加，向下蓝色增加，播放为红色的变化。</p>
<p>如果感兴趣可以在这里下载：<a href="http://down.upsuper.org/allTrueColor.exe">allTrueColor.exe</a> (28KB)</p>
<p>Windows 9x需要有VB6运行库支持。另外运行本程序可能导致CPU占用率极高（我用双核，其中一个核可以达到100%）。这个程序的变化速度取决于电脑的运行速度，但通常是比较快速的，这完全得益于使用Windows API代替VB自带的函数带来的效率。</p>
<p><span id="more-7"></span></p>
<p>下面是源代码</p>

<div class="wp_codebox"><table><tr id="p786"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
</pre></td><td class="code" id="p7code86"><pre class="vb" style="font-family:monospace;"><span style="color: #000080;">Option</span> <span style="color: #000080;">Explicit</span>
<span style="color: #000080;">Dim</span> isBegin <span style="color: #000080;">As</span> <span style="color: #000080;">Boolean</span>, isAdd <span style="color: #000080;">As</span> <span style="color: #000080;">Boolean</span>
<span style="color: #000080;">Dim</span> i <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>, j <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>, k <span style="color: #000080;">As</span> <span style="color: #000080;">Integer</span>
<span style="color: #000080;">Private</span> <span style="color: #000080;">Declare</span> <span style="color: #000080;">Function</span> SetPixel <span style="color: #000080;">Lib</span> <span style="color: #800000;">&quot;gdi32&quot;</span> _
    (<span style="color: #000080;">ByVal</span> hdc <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, _
    <span style="color: #000080;">ByVal</span> x <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, <span style="color: #000080;">ByVal</span> y <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>, _
    <span style="color: #000080;">ByVal</span> crColor <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>) <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>
&nbsp;
<span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> cmdStart_Click()
    <span style="color: #000080;">Dim</span> hdc <span style="color: #000080;">As</span> <span style="color: #000080;">Long</span>
    hdc = pic.hdc
    isBegin = <span style="color: #000080;">True</span>
    <span style="color: #000080;">Do</span>
        <span style="color: #000080;">For</span> j = 0 <span style="color: #000080;">To</span> 255
            <span style="color: #000080;">For</span> k = 0 <span style="color: #000080;">To</span> 255
                SetPixel hdc, j, k, RGB(i, j, k)
            <span style="color: #000080;">Next</span> k
            DoEvents
        <span style="color: #000080;">Next</span> j
        <span style="color: #000080;">If</span> <span style="color: #000080;">Not</span> isBegin <span style="color: #000080;">Then</span> <span style="color: #000080;">Exit</span> <span style="color: #000080;">Sub</span>
        <span style="color: #008000;">'SavePicture pic.Image, _
            'App.Path &amp; &quot;\&quot; &amp; CStr(i) &amp; &quot;.bmp&quot;
</span>        pic.Refresh
        DoEvents
        <span style="color: #000080;">If</span> isAdd <span style="color: #000080;">Then</span>
            i = i + 1
            <span style="color: #000080;">If</span> i = 255 <span style="color: #000080;">Then</span> isAdd = <span style="color: #000080;">False</span>
        <span style="color: #000080;">Else</span>
            i = i - 1
            <span style="color: #000080;">If</span> i = 0 <span style="color: #000080;">Then</span> isAdd = <span style="color: #000080;">True</span>
        <span style="color: #000080;">End</span> <span style="color: #000080;">If</span>
    <span style="color: #000080;">Loop</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>
&nbsp;
<span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> cmdStop_Click()
    isBegin = <span style="color: #000080;">False</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span>
&nbsp;
<span style="color: #000080;">Private</span> <span style="color: #000080;">Sub</span> Form_Load()
    isAdd = <span style="color: #000080;">True</span>
<span style="color: #000080;">End</span> <span style="color: #000080;">Sub</span></pre></td></tr></table></div>

<p>整个窗体只有3个控件：一个PictureBox控件pic，长宽256px，记得要把ScaleMode设为Pixel；剩下的就是两个按钮cmdStart和cmdStop了</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/show-true-color/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>自己写的QuickSearch</title>
		<link>http://blog.upsuper.org/quicksearch-by-myself/</link>
		<comments>http://blog.upsuper.org/quicksearch-by-myself/#comments</comments>
		<pubDate>Thu, 14 Feb 2008 05:53:13 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[C/C++/C#]]></category>
		<category><![CDATA[搜索]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=8</guid>
		<description><![CDATA[今天研究Discuz!代码的时候要搜索一个函数在哪里被调用，结果不懂怎么办。 Windows的搜索貌似某个服务被我禁了一直以来都不能用，而Google的Desktop又不收编这些东西…… 花了一点时间写了一个QuickSearch，代码也很短，效率也很高。用法就是“QuickSearch 关键字”。就会遍历当前目录及其子目录下的所有的文件，查找包含关键字的文件。 如果你也喜欢可以在这里下载：QuickSearch.exe (16KB) 由于使用VS2005编译，需要.NET Framework 2.0支持。源代码在下方，可以用VS2003编译。 蛮好用的说，代码也很短： 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 using System; using System.IO; &#160; namespace QuickSearch &#123; class Program &#123; [...]]]></description>
			<content:encoded><![CDATA[<p>今天研究Discuz!代码的时候要搜索一个函数在哪里被调用，结果不懂怎么办。</p>
<p>Windows的搜索貌似某个服务被我禁了一直以来都不能用，而Google的Desktop又不收编这些东西……</p>
<p>花了一点时间写了一个QuickSearch，代码也很短，效率也很高。用法就是“QuickSearch 关键字”。就会遍历当前目录及其子目录下的所有的文件，查找包含关键字的文件。</p>
<p>如果你也喜欢可以在这里下载：<a href="http://down.upsuper.org/QuickSearch.exe">QuickSearch.exe</a> (16KB)</p>
<p>由于使用VS2005编译，需要.NET Framework 2.0支持。源代码在下方，可以用VS2003编译。</p>
<p><span id="more-8"></span></p>
<p>蛮好用的说，代码也很短：</p>

<div class="wp_codebox"><table><tr id="p888"><td class="line_numbers"><pre>1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
</pre></td><td class="code" id="p8code88"><pre class="csharp" style="font-family:monospace;"><span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System</span><span style="color: #008000;">;</span>
<span style="color: #0600FF; font-weight: bold;">using</span> <span style="color: #008080;">System.IO</span><span style="color: #008000;">;</span>
&nbsp;
<span style="color: #0600FF; font-weight: bold;">namespace</span> QuickSearch
<span style="color: #008000;">&#123;</span>
    <span style="color: #6666cc; font-weight: bold;">class</span> Program
    <span style="color: #008000;">&#123;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> curdir <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetCurrentDirectory</span><span style="color: #008000;">&#40;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">int</span> lcurdir <span style="color: #008000;">=</span> curdir<span style="color: #008000;">.</span><span style="color: #0000FF;">Length</span> <span style="color: #008000;">+</span> <span style="color: #FF0000;">1</span><span style="color: #008000;">;</span>
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> searchText<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> Main<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> args<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            searchText <span style="color: #008000;">=</span> args<span style="color: #008000;">&#91;</span><span style="color: #FF0000;">0</span><span style="color: #008000;">&#93;</span><span style="color: #008000;">;</span>
            SearchDir<span style="color: #008000;">&#40;</span>curdir<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">string</span> filecontent<span style="color: #008000;">;</span>
&nbsp;
        <span style="color: #0600FF; font-weight: bold;">static</span> <span style="color: #6666cc; font-weight: bold;">void</span> SearchDir<span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> path<span style="color: #008000;">&#41;</span>
        <span style="color: #008000;">&#123;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> files <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetFiles</span><span style="color: #008000;">&#40;</span>path<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> file <span style="color: #0600FF; font-weight: bold;">in</span> files<span style="color: #008000;">&#41;</span>
            <span style="color: #008000;">&#123;</span>
                filecontent <span style="color: #008000;">=</span> File<span style="color: #008000;">.</span><span style="color: #0000FF;">ReadAllText</span><span style="color: #008000;">&#40;</span>file<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
                <span style="color: #0600FF; font-weight: bold;">if</span> <span style="color: #008000;">&#40;</span>filecontent<span style="color: #008000;">.</span><span style="color: #0000FF;">IndexOf</span><span style="color: #008000;">&#40;</span>searchText<span style="color: #008000;">&#41;</span> <span style="color: #008000;">&gt;</span> <span style="color: #FF0000;">0</span><span style="color: #008000;">&#41;</span>
                    Console<span style="color: #008000;">.</span><span style="color: #0000FF;">WriteLine</span><span style="color: #008000;">&#40;</span>file<span style="color: #008000;">.</span><span style="color: #0000FF;">Substring</span><span style="color: #008000;">&#40;</span>lcurdir<span style="color: #008000;">&#41;</span><span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #008000;">&#125;</span>
            <span style="color: #6666cc; font-weight: bold;">string</span><span style="color: #008000;">&#91;</span><span style="color: #008000;">&#93;</span> dirs <span style="color: #008000;">=</span> Directory<span style="color: #008000;">.</span><span style="color: #0000FF;">GetDirectories</span><span style="color: #008000;">&#40;</span>path<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
            <span style="color: #0600FF; font-weight: bold;">foreach</span> <span style="color: #008000;">&#40;</span><span style="color: #6666cc; font-weight: bold;">string</span> dir <span style="color: #0600FF; font-weight: bold;">in</span> dirs<span style="color: #008000;">&#41;</span>
                SearchDir<span style="color: #008000;">&#40;</span>dir<span style="color: #008000;">&#41;</span><span style="color: #008000;">;</span>
        <span style="color: #008000;">&#125;</span>
    <span style="color: #008000;">&#125;</span>
<span style="color: #008000;">&#125;</span></pre></td></tr></table></div>

]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/quicksearch-by-myself/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>blackflip，Black Flip</title>
		<link>http://blog.upsuper.org/blackflip-black-flip/</link>
		<comments>http://blog.upsuper.org/blackflip-black-flip/#comments</comments>
		<pubDate>Wed, 14 Nov 2007 08:19:50 +0000</pubDate>
		<dc:creator>upsuper</dc:creator>
				<category><![CDATA[小程序]]></category>
		<category><![CDATA[AJAX]]></category>
		<category><![CDATA[Flash]]></category>
		<category><![CDATA[游戏]]></category>

		<guid isPermaLink="false">http://blog.upsuper.org/?p=23</guid>
		<description><![CDATA[有一个很好玩的游戏，是Flash+AJAX的：http://blackflip.org/ 玩法就是一笔划，然后划过的格子都会被反色，我们的目标是，使得每一行的颜色相同~ 于是，经过艰辛的摸索，我编写了一个很好的工具blackflip_helper。 这个工具的原理就是每一行反色其实走法是一样的！只不过这样更容易看出来。 经过思考，发现这个游戏似乎使用搜索是非常麻烦的，而基于状态压缩的动态规划似乎也快不了多少，都是次方级的。所以这个游戏的解法有待继续研究哈。]]></description>
			<content:encoded><![CDATA[<p>有一个很好玩的游戏，是Flash+AJAX的：<a href="http://blackflip.org" target="_blank">http://blackflip.org/</a></p>
<p>玩法就是一笔划，然后划过的格子都会被反色，我们的目标是，使得每一行的颜色相同~</p>
<p>于是，经过艰辛的摸索，我编写了一个很好的工具blackflip_helper。</p>
<p>这个工具的原理就是每一行反色其实走法是一样的！只不过这样更容易看出来。</p>
<p>经过思考，发现这个游戏似乎使用搜索是非常麻烦的，而基于状态压缩的动态规划似乎也快不了多少，都是次方级的。所以这个游戏的解法有待继续研究哈。</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.upsuper.org/blackflip-black-flip/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

