<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet href='http://feed.feedsky.com/styles/feedsky1.xsl' type='text/xsl' ?><!--这是一个由Feedsy提供技术支持的Feed，为了提高读者阅读的体验，以及满足用户美化自己Feed的需要，我们设计了多种精美的Feed模板，提供给大家选择，所有最终呈现出来的样式，皆由用户自愿选择使用，未经许可，任何团体和个人，请不要擅自修改样式或者盗用，这是对于用户选择权的尊重。--><rss xmlns:atom="http://www.w3.org/2005/Atom" xmlns:fs="http://www.feedsky.com/namespace/feed" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:xhtml="http://www.w3.org/1999/xhtml" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:dc="http://purl.org/dc/elements/1.1/" version="2.0"><channel><atom:link href="http://feed.upsuper.org.cn" type="application/rss+xml" rel="self"></atom:link><fs:self_link href="http://feed.feedsky.com/upsuper" type="application/rss+xml"></fs:self_link><lastBuildDate>Wed, 19 Oct 2011 06:03:36 GMT</lastBuildDate><title>鬼の领地</title><description>the place where there are some ghost appearing...</description><image><url>http://www.feedsky.com/feed/upsuper/sc/gif</url><title>鬼の领地</title><link>http://blog.upsuper.org</link></image><link>http://blog.upsuper.org</link><sy:updatePeriod>hourly</sy:updatePeriod><sy:updateFrequency>1</sy:updateFrequency><xhtml:meta name="robots" content="noindex"></xhtml:meta><language>en</language><pubDate>Wed, 19 Oct 2011 13:21:47 GMT</pubDate><item><title>动态切换 Linux 使用的 CPU 数量</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679121/5141978/1/item.html</link><content:encoded>&lt;p&gt;由于要测试一些代码，其运行结果会受到多核并行的影响，所以希望能够调整使用的 CPU 数量。网络上之前看到的方法是在内核的启动参数上添加一个 maxcpus，但是如果这样的话每切换一次都要重启一次，是在太麻烦了。想想 Linux 应该是很强大的，所以可以动态修改 CPU 数量才对。&lt;/p&gt;
&lt;p&gt;无意中看到 Linux 代码的 Documentation 文件夹下有个文件叫做 cpu-hotplug.txt，于是就看了一下，发现可以在 /sys/devices/system/cpu 看到代表各 CPU 的文件夹按照 cpuX 的命名方式，如 cpu0、cpu1、cpu2 等。这些文件夹里面有一个 online 文件，如果其值为0则禁用该 CPU，如果为1则启用该 CPU。注意，这里需要 root 权限哦。&lt;/p&gt;
&lt;p&gt;因为我只要在单核和多核之间切换，所以我写了两个脚本放在 /usr/local/sbin 里面：&lt;/p&gt;
&lt;p&gt;singlecore&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p12203&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1220code3&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #007800;&quot;&gt;cpus_dir&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;/sys/devices/system/cpu&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt; cpu &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;in&lt;/span&gt; $&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;ls&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpus_dir&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;grep&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'cpu[0-9]\+'&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;do&lt;/span&gt;
	&lt;span style=&quot;color: #007800;&quot;&gt;cpu_online&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpus_dir&lt;/span&gt;/&lt;span style=&quot;color: #007800;&quot;&gt;$cpu&lt;/span&gt;/online&amp;quot;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; $&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;cat&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt; = &lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;then&lt;/span&gt;
		&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&amp;quot;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;fi&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;multicore&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p12204&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
6
7
8
9
10
11
12
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1220code4&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #007800;&quot;&gt;cpus_dir&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;/sys/devices/system/cpu&amp;quot;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt; cpu &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;in&lt;/span&gt; $&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;ls&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpus_dir&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;|&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;grep&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'cpu[0-9]\+'&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;do&lt;/span&gt;
	&lt;span style=&quot;color: #007800;&quot;&gt;cpu_online&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpus_dir&lt;/span&gt;/&lt;span style=&quot;color: #007800;&quot;&gt;$cpu&lt;/span&gt;/online&amp;quot;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;amp;&amp;amp;&lt;/span&gt; $&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;cat&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt; = &lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;then&lt;/span&gt;
		&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&lt;span style=&quot;color: #007800;&quot;&gt;$cpu_online&lt;/span&gt;&amp;quot;&lt;/span&gt;
	&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;fi&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;之后需要切换的时候，只要运行 sudo singlecore 或者 sudo multicore 就可以了~&lt;/p&gt;
&lt;p&gt;顺便说一句，我当时在想，如果我禁用了所有的 CPU 会怎么样呢？结果发现 cpu0 是没有 online 文件的，也就是 Linux 至少保证一个 CPU 处于可用状态。&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679121/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679121/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/dynamic-modify-cpu-number/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>由于要测试一些代码，其运行结果会受到多核并行的影响，所以希望能够调整使用的 CPU 数量。网络上之前看到的方法是在内核的启动参数上添加一个 maxcpus，但是如果这样的话每切换一次都要重启一次，是在太麻烦了。想想 Linux 应该是很强大的，所以可以动态修改 CPU 数量才对。 无意中看到 Linux 代码的 Documentation 文件夹下有个文件叫做 cpu-hotplug.txt，于是就看了一下，发现可以在 /sys/devices/system/cpu 看到代表各 CPU 的文件夹按照 cpuX 的命名方式，如 cpu0、cpu1、cpu2 等。这些文件夹里面有一个 online 文件，如果其值为0则禁用该 CPU，如果为1则启用该 CPU。注意，这里需要 root 权限哦。 因为我只要在单核和多核之间切换，所以我写了两个脚本放在 /usr/local/sbin 里面： singlecore 1 2 3 4 5 6 7 8 9 10 11 12 #!/bin/bash &amp;#160; cpus_dir=&amp;#34;/sys/devices/system/cpu&amp;#34; &amp;#160; for cpu in $&amp;#40;ls &amp;#34;$cpus_dir&amp;#34; &amp;#124; grep [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679121/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679121/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>探究学习</category><category>Linux</category><category>CPU</category><category>多核</category><pubDate>Wed, 19 Oct 2011 14:03:36 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/dynamic-modify-cpu-number/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1220</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/dynamic-modify-cpu-number/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679121/5141978</fs:itemid></item><item><title>安装配置 LXR</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679122/5141978/1/item.html</link><content:encoded>&lt;p&gt;专业课学习操作系统，满心欢喜地以为可以是 Linux 代码导读，结果选用了一本八十年代的教材，介绍 UNIX v6 的。于是自己从图书馆借来了内核开发的入门读物《Linux 内核设计与实现》。既然是介绍内核的书，自然少不了代码，但是书中又不可能将每个提到的代码的相关信息全部写出来，这时就得自己去查看代码。查看代码的话，虽然 Linux 的代码可以很容易地得到，但那来看终归有些麻烦，各种调用需要查找半天。于是想起了很有名的一个网站 LXR：&lt;a href=&quot;http://lxr.linux.no&quot;&gt;http://lxr.linux.no&lt;/a&gt;，Linux 交叉引用。这个网站好是好，就是网络原因速度太慢，于是就想自己装一个。&lt;/p&gt;
&lt;p&gt;先说一句，下面的安装环境都是64位 Gentoo。&lt;/p&gt;
&lt;p&gt;最开始找到了 &lt;a href=&quot;http://sourceforge.net/projects/lxr/&quot;&gt;LXR Cross Referencer&lt;/a&gt; 这个项目，一看最后更新时间还挺新，看起来是一直都还在维护的。然后在 Gentoo 的网站上查到 LXR 是可以直接用 portage 安装的，于是安装，安装相关的包，最后放弃了。出于什么原因我也不记得了，最后一个原因肯定是不好看，肯定达不到上面那个网站的效果，所以就放弃了，到那个网站上去下载 LXR 分出来的版本 LXRng。（话说这个 ng 不会是表示 next generation 吧？）&lt;br /&gt;
&lt;span id=&quot;more-1215&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;安装支持库&lt;/h3&gt;
&lt;p&gt;首先从 LXR 的网站上用 git 把代码下载下来，&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121523&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code23&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;git&lt;/span&gt; clone &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;git&lt;/span&gt;:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;lxr.linux.no&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;git&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;lxrng.git&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;然后我打开了里面的 INSTALL 文件，里面写着好多好多库。先说结论吧，在 Gentoo 的官方源里面，有两个库是没有的，分别是 Search-Xapian 和 CGI-Ajax，这两个最后安装。&lt;/p&gt;
&lt;p&gt;最首要的是先安装 PostgreSQL，由于 LXR 是用 Perl 写成的，所以在 USE 里面加入了 Perl，然后安装。安装完成以后，安装 PostgreSQL 的 Perl 库 DBD-Pg。接下去安装 Cgi-Simple、HTML-Parser、HTML-Entities、Term-ProgressBar、Devel-Size、Template-Toolkit，这些都很容易，直接安装就可以了。（虽然我确定这些包的名称还费了些时间）&lt;/p&gt;
&lt;p&gt;然后是 Apache 和它的 mod_perl，因为之前安装了，并没有太大困难，这里也不详述了。&lt;/p&gt;
&lt;p&gt;最麻烦的问题来了，对于源里没有的 Search-Xapian 和 CGI-Ajax 怎么办呢？先把 Xapian 的主要部分给安装了吧。&lt;/p&gt;
&lt;p&gt;安装 xapian 和 xapian-bindings 这两个包。因为这两个包的最新版本对 amd64 平台都是 unstable 的，所以要在 /etc/portage/package.keywords 里面加入&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121524&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code24&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;=dev-libs/xapian-1.2.7-r1 ~amd64
=dev-libs/xapian-bindings-1.2.7-r2 ~amd64&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;（是的，在 Gentoo 的查询系统上显示，xapian 的 1.2.5 是稳定版本，我也曾经试图安装那个版本，然后仅安装非稳定版的 -bindings，但是之后安装的 Search-Xapian 还是会要求新的 1.2.7，所以就这样吧。另外一般状况下，最前面是写 &gt;= 的，但是我出于个人喜好和完美主义，写了 =。）接下去直接安装这两个包即可。记得检查已经在 USE 里面加入了 perl。&lt;/p&gt;
&lt;p&gt;接下去安装那两个包。&lt;/p&gt;
&lt;p&gt;Gentoo 有个很神奇的工具，也是我这次才发现的，叫做 g-cpan，可以把 CPAN 上面的包自动打包安装为 portage 的包。不过如果是第一次使用必须要先配置一下，在 /etc/make.conf 最后加上&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121525&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code25&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;ACCEPT_KEYWORDS=&amp;quot;amd64&amp;quot;
PORTDIR_OVERLAY=&amp;quot;/usr/local/portage&amp;quot;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;（虽然这个配置看过去很简单，不过因为一开始忽略了这件事情，所以纠结了很长时间……）&lt;/p&gt;
&lt;p&gt;接下去用 g-cpan 安装就可以了&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121526&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code26&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; g-cpan &lt;span style=&quot;color: #660033;&quot;&gt;-g&lt;/span&gt; CGI::Ajax Search::Xapian
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; emerge CGI-Ajax Search-Xapian&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;至此需要安装的东西就已经全部装完了，下面进入第二阶段~&lt;/p&gt;
&lt;h3&gt;配置数据库&lt;/h3&gt;
&lt;p&gt;这个很简单了，不过在配置之前要先把自己将会用到的用户加入到 postgres 组里以保证可以访问。最重要的是要把之后的 apache 用户加入到 postgres 组里，否则后面会出现一些状况。&lt;/p&gt;
&lt;p&gt;然后 su 到 postgres 用户里，添加用户 root，并把 root 设置为管理员（因为之后生成的时候需要用到）&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121527&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code27&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;createuser root&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;然后创建 LXR 的数据库&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121528&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code28&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;createdb lxrng&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;大体上这样就没问题了。&lt;/p&gt;
&lt;h3&gt;调整配置文件并建立工作目录&lt;/h3&gt;
&lt;p&gt;我出于完美主义的原因，将 LXR 的工作目录放在了 /var/lib/lxrng 里面，如果你没有那些奇怪的癖好，完全可以直接在自己的文件夹下面放置这些东西。&lt;/p&gt;
&lt;p&gt;首先要设置配置文件，将 LXR 根目录下的 lxrng.conf-dist 复制为 lxrng.conf，然后打开修改。里面大体上还是比较清晰的，如果只是要做一个 Linux 代码的交叉引用的话，大体上按照里面的配置，修改第10行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121529&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;10
11
12
13
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code29&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$gitrepo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Git&lt;/span&gt;
    &lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/repos/linux-2.6/.git'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	  release_re &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009966; font-style: italic;&quot;&gt;qr/^v[^-]*$/&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	  author_timestamp &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;里面的那个路径，使其指向你放置代码的 git 源（一般是代码文件夹下的 .git）。&lt;/p&gt;
&lt;p&gt;如果你没有使用 git 来抓取代码，而是直接下载某个版本的代码，如 v3.1，可以放置到比如 /var/lib/lxrng/repos/linux/v3.1，那么这个部分就修改为&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121530&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;10
11
12
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code30&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Plain&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #0000ff;&quot;&gt;$plainrepo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Plain&lt;/span&gt;
    &lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/repos/linux'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;即可。（注意上面的 $gitrepo 在下面还有使用过一次，如果修改的话需要一并修改）&lt;/p&gt;
&lt;p&gt;接下去是第19行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121531&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;19
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code31&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$search&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Search&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Xapian&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/text-db/linux-2.6'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;需要在某个位置建立一个 text-db 文件夹，然后将上面的路径修改为你建立的那个文件夹的路径即可。同样的操作也发生在第29行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121532&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;28
29
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code32&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Must be writable by httpd user:&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'cache'&lt;/span&gt;	      &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/cache'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;注意这个文件夹需要对 apache:apache 可写。我的做法是把这个文件夹的组设置为 apache，然后设置权限为0775，当然也可以直接把所有者设置为 apache 然后保留原来权限。&lt;/p&gt;
&lt;p&gt;注释掉下面这行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121533&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;36
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code33&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;	&lt;span style=&quot;color: #ff0000;&quot;&gt;'ctags_flags'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;-I&lt;span style=&quot;color: #000099; font-weight: bold;&quot;&gt;\@&lt;/span&gt;$LXRng::ROOT/lxr-ctags-quirks&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;不要问我为什么，这个我真不知道，总之如果部注释掉一会儿会出错。&lt;/p&gt;
&lt;p&gt;最后是要生成引用的版本和默认显示的版本：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121534&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;37
38
39
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code34&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_list'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #0000ff;&quot;&gt;$gitrepo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;allversions&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_default'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'v2.6.20.3'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;我强烈建议你将 $gitrepo-&gt;allversions 修改为你想看的几个版本，甚至于只有一个版本也是没有问题的即使你有完整的历史记录，因为每个版本都需要生成很长时间，而且似乎过程很不稳定，如果没有特别的原因，最好不要生成太多版本。如果是不用 git 源的话，只要把你放在那个文件夹里的对应版本号填进去就可以了，最后修改默认显示的版本。&lt;/p&gt;
&lt;p&gt;如果还想添加其他的代码，只要把代码最后 return 的大括号里面的部分复制一遍，根据需要修改就可以了。&lt;/p&gt;
&lt;h3&gt;初始化数据库及生成交叉引用&lt;/h3&gt;
&lt;p&gt;首先要添加一个符号链接&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121535&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code35&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;ln&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-s&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;usr&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;bin&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;exuberants-ctags &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;usr&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;bin&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;ctags-exuberants&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;接下去没什么太大的差别，就是进入程序所在目录，然后&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121536&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code36&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;lxr-db-admin linux &lt;span style=&quot;color: #660033;&quot;&gt;--init&lt;/span&gt;
.&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;lxr-genref linux&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;值得一说的是，这个过程非常非常非常漫长，在我的 i7 本上的虚拟机里，一跑至少三四个小时，而且看起来还很不稳定，不时会自动强制退出，而且退出以后可能会出现一些问题导致无法继续。这个问题比较严重，遇到这个问题如何解决放到之后的部分再来说吧。&lt;/p&gt;
&lt;h3&gt;配置 Apache &lt;/h3&gt;
&lt;p&gt;最后来配置 Apache。直接把文件夹下的 apache2-site.conf-dist-mod_perl 复制到 /etc/apache/vhosts.d/10_lxrng.con，然后打开这个文件，将里面的所有 @@LXRROOT@@ 和 @@LXRURL@@ 根据自己的情况替换为相应的路径就可以了。然后重新启动 Apache&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121537&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code37&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;etc&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;rc.d&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;apache restart&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;h3&gt;问题解决&lt;/h3&gt;
&lt;p&gt;由于原来的版本在我这里基本上没什么希望能生成结束，所以我对这个程序做了一些修改，这个修改后的版本可以直接在我的 GitHub 上面找到：&lt;a href=&quot;https://github.com/upsuper/lxrng&quot; title=&quot;upsuper/lxrng - GitHub&quot; target=&quot;_blank&quot;&gt;upsuper/lxrng&lt;/a&gt;。如果需要的话，可以不使用原来官方的代码而直接使用我修改过的代码。主要的差别有几点：一是消除了生成交叉引用时过大量的输出信息；二是增加了交叉引用生成时刷写 Xapian 索引的频率，以减少退出重做时可能出现的错误；三是修正了一些最后浏览时可能遇到的问题。&lt;/p&gt;
&lt;p&gt;当然生成的时候还是可能会出错，这我也没办法。如果生成时被意外中断，重新执行又出现错误，可以将我修改的那个程序里面的 lxr-genref 第336行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121538&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;336
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code38&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#warn(&amp;quot;here $docid\n&amp;quot;);&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;的注释符去掉，重新运行 lxr-genref，然后查看当程序报错时停止的那个编号，比如 12345。然后执行 psql lxrng 进入 lxrng 数据库，执行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121539&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code39&quot;&gt;&lt;pre class=&quot;sql&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #993333; font-weight: bold;&quot;&gt;DELETE&lt;/span&gt; &lt;span style=&quot;color: #993333; font-weight: bold;&quot;&gt;FROM&lt;/span&gt; hashed_documents &lt;span style=&quot;color: #993333; font-weight: bold;&quot;&gt;WHERE&lt;/span&gt; doc_id&lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;=&lt;/span&gt;&lt;span style=&quot;color: #cc66cc;&quot;&gt;12345&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;然后再次执行 lxr-genref。这个过程可能反复一两次，直到不会报错位置。&lt;/p&gt;
&lt;p&gt;如果用原始版本的话，最后在浏览的时候使用搜索，有可能会出现500错误以及无法显示出来的情况，如果出现，可以参考我做的修改。&lt;/p&gt;
&lt;h3&gt;后记&lt;/h3&gt;
&lt;p&gt;配置这个 LXR 真是折腾死我了，费了好大功夫，最后也总算是成功了。&lt;/p&gt;
&lt;p&gt;另外真是很久很久没有在这里写东西了。也正因为这个过程实在太麻烦了，所以来写一写，权当一个记录。不过现在有 GitHub 这种东西，倒是好得多了。&lt;/p&gt;
&lt;h3&gt;参考文档&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://mohammadthalif.wordpress.com/2010/07/24/how-to-setup-lxr-%E2%80%93-step-by-step-guide-3/&quot; target=&quot;_blank&quot;&gt;How to setup LXR – Step by Step guide &amp;laquo; Mohamed Thalib&amp;#039;s Blog&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.kernelchina.org/node/241&quot; target=&quot;_blank&quot;&gt;在自己的计算机上建立lxr源代码检索服务器 | kernelchina&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://wenku.baidu.com/view/8150646727d3240c8447ef2d.html&quot; target=&quot;_blank&quot;&gt;lxrng.install-gentoo_百度文库&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.gentoo.org/proj/en/perl/g-cpan.xml&quot; target=&quot;_blank&quot;&gt;Gentoo Linux Documentation &amp;#8212; g-cpan Guide&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;（貌似还有些别的参考资料，不记得是什么了……）&lt;/p&gt;
&lt;h3&gt;参考配置文件&lt;/h3&gt;
&lt;p&gt;最后最后贴一下自己的配置文件吧。配置文件里面声明了两个代码，一个是 Liunx 的，一个是 UNIX v6 的，Linux 是用 git，UNIX 是代码。程序全部放在 /var/lib/lxrng 里面，代码放在 /var/lig/lxrng/repos 里。&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p121540&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1215code40&quot;&gt;&lt;pre class=&quot;perl&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# -*- mode: perl -*-&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Configuration file&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#&lt;/span&gt;
&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# &lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Index&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;PgBatch&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Git&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Plain&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;use&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Search&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Xapian&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$linuxrepo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Git&lt;/span&gt;
    &lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/repos/linux.git'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	  release_re &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009966; font-style: italic;&quot;&gt;qr/^v[^-]*$/&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	  author_timestamp &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #cc66cc;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$unixrepo&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Repo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Plain&lt;/span&gt;
    &lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/repos/unix'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$index&lt;/span&gt;   &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Index&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;PgBatch&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;db_spec &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'dbname=lxrng;port=5432'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; 
					 db_user &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; db_pass &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
					 &lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# table_prefix =&amp;gt; 'lxr'&lt;/span&gt;
					 &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&lt;span style=&quot;color: #b1b100;&quot;&gt;my&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$search&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&lt;/span&gt; LXRng&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Search&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;::&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;Xapian&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;-&amp;gt;&lt;/span&gt;&lt;span style=&quot;color: #006600;&quot;&gt;new&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/text-db'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000066;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;'linux'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'repository'&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$linuxrepo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'index'&lt;/span&gt;       &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$index&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'search'&lt;/span&gt;      &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$search&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'base_url'&lt;/span&gt;    &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'http://upsuper-gentoo/lxr'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Must be writable by httpd user:&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'cache'&lt;/span&gt;	      &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/cache/linux'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'fs_charset'&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'iso-8859-1'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Tried successively&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'content_charset'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'utf-8'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'iso-8859-1'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'languages'&lt;/span&gt;   &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'C'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'GnuAsm'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'Kconfig'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#'ctags_flags' =&amp;gt; [&amp;quot;-I\@$LXRng::ROOT/lxr-ctags-quirks&amp;quot;],&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#'ver_list'    =&amp;gt; [$gitrepo-&amp;gt;allversions],&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_list'&lt;/span&gt;    &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'v2.6.34'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'v3.0'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_default'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'v2.6.34'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'include_maps'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; 
	    &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^&lt;/span&gt;arch&lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*?&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;/|,&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^&lt;/span&gt;asm&lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|,&lt;/span&gt;
	      &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;include/asm-$_[0]/$_[1]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^&lt;/span&gt;include&lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt;asm&lt;span style=&quot;color: #339933;&quot;&gt;-&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*?&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;/|,&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^&lt;/span&gt;asm&lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|,&lt;/span&gt;
	      &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;include/asm-$_[0]/$_[1]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^|,&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^&lt;/span&gt;asm&lt;span style=&quot;color: #339933;&quot;&gt;/&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|,&lt;/span&gt;
	      &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;map&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;include/asm-$_/$_[0]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;
		    &lt;span style=&quot;color: #000066;&quot;&gt;qw&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;i386 x86_64&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^|,&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|,&lt;/span&gt;
	      &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;include/$_[0]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #ff0000;&quot;&gt;'unix'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'repository'&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$unixrepo&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'index'&lt;/span&gt;       &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$index&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'search'&lt;/span&gt;      &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #0000ff;&quot;&gt;$search&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'base_url'&lt;/span&gt;    &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'http://upsuper-gentoo/lxr'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Must be writable by httpd user:&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'cache'&lt;/span&gt;	      &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'/var/lib/lxrng/cache/unix'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'fs_charset'&lt;/span&gt;  &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'iso-8859-1'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;# Tried successively&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'content_charset'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'utf-8'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'iso-8859-1'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'languages'&lt;/span&gt;   &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'C'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'GnuAsm'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#'ctags_flags' =&amp;gt; [&amp;quot;-I\@$LXRng::ROOT/lxr-ctags-quirks&amp;quot;],&lt;/span&gt;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_list'&lt;/span&gt;    &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff0000;&quot;&gt;'v6'&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'ver_default'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;'v6'&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&amp;nbsp;
	&lt;span style=&quot;color: #ff0000;&quot;&gt;'include_maps'&lt;/span&gt; &lt;span style=&quot;color: #339933;&quot;&gt;=&amp;gt;&lt;/span&gt; 
	    &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|^|,&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;qr&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;.*&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;|,&lt;/span&gt;
	      &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;sub&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;sys/$_[0]&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
	     &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
    &lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;,&lt;/span&gt;
&lt;span style=&quot;color: #009900;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: #339933;&quot;&gt;;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679122/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679122/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/setup-lxr/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>专业课学习操作系统，满心欢喜地以为可以是 Linux 代码导读，结果选用了一本八十年代的教材，介绍 UNIX v6 的。于是自己从图书馆借来了内核开发的入门读物《Linux 内核设计与实现》。既然是介绍内核的书，自然少不了代码，但是书中又不可能将每个提到的代码的相关信息全部写出来，这时就得自己去查看代码。查看代码的话，虽然 Linux 的代码可以很容易地得到，但那来看终归有些麻烦，各种调用需要查找半天。于是想起了很有名的一个网站 LXR：http://lxr.linux.no，Linux 交叉引用。这个网站好是好，就是网络原因速度太慢，于是就想自己装一个。 先说一句，下面的安装环境都是64位 Gentoo。 最开始找到了 LXR Cross Referencer 这个项目，一看最后更新时间还挺新，看起来是一直都还在维护的。然后在 Gentoo 的网站上查到 LXR 是可以直接用 portage 安装的，于是安装，安装相关的包，最后放弃了。出于什么原因我也不记得了，最后一个原因肯定是不好看，肯定达不到上面那个网站的效果，所以就放弃了，到那个网站上去下载 LXR 分出来的版本 LXRng。（话说这个 ng 不会是表示 next generation 吧？） 安装支持库 首先从 LXR 的网站上用 git 把代码下载下来， 1 git clone git://lxr.linux.no/git/lxrng.git 然后我打开了里面的 INSTALL 文件，里面写着好多好多库。先说结论吧，在 Gentoo 的官方源里面，有两个库是没有的，分别是 Search-Xapian 和 CGI-Ajax，这两个最后安装。 最首要的是先安装 PostgreSQL，由于 LXR 是用 Perl [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679122/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679122/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>探究学习</category><category>Linux</category><category>LXR</category><pubDate>Mon, 03 Oct 2011 15:07:02 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/setup-lxr/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1215</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/setup-lxr/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679122/5141978</fs:itemid></item><item><title>Gmail的超级子邮箱功能</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679123/5141978/1/item.html</link><content:encoded>&lt;p&gt;如果你也用 Gmail，他可以让你轻易拥有无限多的子邮箱，发给这些邮箱也就等于发给你的邮箱。这有什么意义呢？很简单，你可以在每个地方注册的时候都使用不同的邮箱，这样当你收到垃圾邮件广告邮件，你就可以知道是从哪里来的了~再结合 Gmail 强大的过滤器，你也可以针对性的进行屏蔽~&lt;/p&gt;
&lt;p&gt;Gmail 事实上支持两种方式来扩张你的邮箱，第一种是在你的用户名后面加上“+”和任意字符串，比如我的邮箱 quanxunzhen@gmail.com（我这邮箱无所谓了已经嗯），如果我想要识别不同的网站，比如豆瓣，我可以直接在豆瓣的注册邮箱里填写 quanxunzhen+douban@gmail.com，所有验证邮件都可以发给我，我如果不想申请一个新邮箱却想注册个豆瓣小号，也可以再写 quanxunzhen+douban2@gmail.com。&lt;/p&gt;
&lt;p&gt;当然，支持上面的方式固然是最好的，但遗憾的是很多网站并不支持带加号的邮箱，那就要稍稍麻烦点了。&lt;/p&gt;
&lt;p&gt;根据 @&lt;a href=&quot;http://fanfou.com/fanzeyi&quot;&gt;fanzeyi&lt;/a&gt; 的说法，Gmail 的邮箱是自动忽略点，也就是“.”的，也就是说对于我上面的邮箱，如果写为 quan.xun.zhen@gmail.com，或者 ..quanxunzhen..@gmail.com，我照样可以收到。而且这样写法的邮箱通常不会被屏蔽，因为点毕竟是邮箱必备的部分。&lt;/p&gt;
&lt;p&gt;但是这样加点有一个问题，就是我们无法像第一种方式那样很容易的区分来源，因此我们不得不进行某种编码。&lt;/p&gt;
&lt;h3&gt;顺序编码&lt;/h3&gt;
&lt;p&gt;第一种编码的思想大体上是按照传统的数据库中记录的自增 ID，转为二进制表示，具体的说就是，比如我这个邮箱有11位，那么我们可以以中间有打点或者没有打点作为二进制位中的0和1，比如就可以如下表示：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120945&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1209code45&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;0 quanxunzhen
1 quanxunzhen.
2 quanxunzhe.n
3 quanxunzhe.n.
29 quanxun.z.h.en.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;这样……&lt;/p&gt;
&lt;p&gt;但是这样总编码数也就 2&lt;span style=&quot;display:none&quot;&gt;^&lt;/span&gt;&lt;sup&gt;len(email)+1&lt;/sup&gt; 种，对于我邮箱这么长，也仅仅4096种，总归有点少。（其实也不少了吧喂……）&lt;/p&gt;
&lt;p&gt;于是我们考虑一下扩张的方法。&lt;/p&gt;
&lt;p&gt;其实扩张很简单，因为任意两个字母之间可以插入的点是任意多的，我们可以利用这一点按照一定的协议来编码，比如我们规定第一个字符之前如果有 n 个点，则之后每个字母之间最多可以有 n+1 个点，这样当第一个字符前有 n 个点时，最大可以编码 (n+2)&lt;span style=&quot;display:none&quot;&gt;^&lt;/span&gt;&lt;sup&gt;len(email)&lt;/sup&gt; 种，如果规定这里每次数字都是从上一次结束的数字开始，编码就不会重复了，而且可编码的范围大大增加，却又没有太多的增加点的数量。对于我的邮箱来说，前面一个点也没有时可以有 2048 种，有一个点时可以有 177147+2048 种，有两个点时可以有 4194304+177147+2048 种，我相信是用不完的了……&lt;/p&gt;
&lt;p&gt;事实上基于此还可以延伸出各种各样的编码方式~&lt;/p&gt;
&lt;h3&gt;字符编码&lt;/h3&gt;
&lt;p&gt;不过上面的方法总归不那么直观，而且如果想追踪来源，还要建表，表的同步还是个问题，所以这个问题还是挺大的……于是我有了第二种想法，可以把注册地的名字嵌入到里面~&lt;/p&gt;
&lt;p&gt;最基本的想法是根据字母序，比如在 Arch 论坛注册我们可以把 Arch 变成数字串 0 17 2 7，插入进去变成：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120946&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1209code46&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;qu.................a..n.......xunzhen&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;不过我们可以明显的感觉到很蛋疼……Arch 还算好的，如果是新浪（Sina -&gt; 18 8 13 0）或者淫淫网（Renren -&gt; 17 4 13 17 4 13）就更蛋疼了……&lt;/p&gt;
&lt;p&gt;但是我们感觉到不是这样的，我们完全不需要那么多字母其实也可以认出他们来不是么？比如淫淫网我们可以用 rr，或者原名校内的 xn，新浪就 sn 什么的，这样需要的字母就少了，我们就可以利用变换进制的优势了~26对于二进制位需要5位，对于3进制恰好只要3位，当然算起来如果你的邮箱够长肯定还是用二进制可以增加的更短一些，对于我来说就是如此，比如上面的就可以这样变化了：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120947&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1209code47&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;rr -&amp;gt; 17 17 -&amp;gt; 10001 10001 -&amp;gt; q.uanx.u.nzhe.n
xn -&amp;gt; 23 13 -&amp;gt; 10111 01101 -&amp;gt; q.ua.n.x.un.z.he.n
sn -&amp;gt; 18 13 -&amp;gt; 10010 01101 -&amp;gt; q.uan.xun.z.he.n&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;如果三进制的话，我的 upsuper 也可以容下了：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120948&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1209code48&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;rr -&amp;gt; 17 17 -&amp;gt; 122 122 -&amp;gt; u.p..s..u.p..e..r
xn -&amp;gt; 23 13 -&amp;gt; 212 111 -&amp;gt; u..p.s..u.p.e.r
sn -&amp;gt; 18 13 -&amp;gt; 200 111 -&amp;gt; u..psu.p.e.r&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;看过去好多了~&lt;/p&gt;
&lt;p&gt;我们还可以发挥其它的想象力，比如找寻标识中的字母频率然后构建一个霍夫曼编码树什么的~&lt;/p&gt;
&lt;p&gt;我能想到的暂时只有这么多了，各位还有什么更有意思的想法么？&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679123/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679123/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/gmail-super-sub-mailbox/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>如果你也用 Gmail，他可以让你轻易拥有无限多的子邮箱，发给这些邮箱也就等于发给你的邮箱。这有什么意义呢？很简单，你可以在每个地方注册的时候都使用不同的邮箱，这样当你收到垃圾邮件广告邮件，你就可以知道是从哪里来的了~再结合 Gmail 强大的过滤器，你也可以针对性的进行屏蔽~ Gmail 事实上支持两种方式来扩张你的邮箱，第一种是在你的用户名后面加上“+”和任意字符串，比如我的邮箱 quanxunzhen@gmail.com（我这邮箱无所谓了已经嗯），如果我想要识别不同的网站，比如豆瓣，我可以直接在豆瓣的注册邮箱里填写 quanxunzhen+douban@gmail.com，所有验证邮件都可以发给我，我如果不想申请一个新邮箱却想注册个豆瓣小号，也可以再写 quanxunzhen+douban2@gmail.com。 当然，支持上面的方式固然是最好的，但遗憾的是很多网站并不支持带加号的邮箱，那就要稍稍麻烦点了。 根据 @fanzeyi 的说法，Gmail 的邮箱是自动忽略点，也就是“.”的，也就是说对于我上面的邮箱，如果写为 quan.xun.zhen@gmail.com，或者 ..quanxunzhen..@gmail.com，我照样可以收到。而且这样写法的邮箱通常不会被屏蔽，因为点毕竟是邮箱必备的部分。 但是这样加点有一个问题，就是我们无法像第一种方式那样很容易的区分来源，因此我们不得不进行某种编码。 顺序编码 第一种编码的思想大体上是按照传统的数据库中记录的自增 ID，转为二进制表示，具体的说就是，比如我这个邮箱有11位，那么我们可以以中间有打点或者没有打点作为二进制位中的0和1，比如就可以如下表示： 1 2 3 4 5 0 quanxunzhen 1 quanxunzhen. 2 quanxunzhe.n 3 quanxunzhe.n. 29 quanxun.z.h.en. 这样…… 但是这样总编码数也就 2^len(email)+1 种，对于我邮箱这么长，也仅仅4096种，总归有点少。（其实也不少了吧喂……） 于是我们考虑一下扩张的方法。 其实扩张很简单，因为任意两个字母之间可以插入的点是任意多的，我们可以利用这一点按照一定的协议来编码，比如我们规定第一个字符之前如果有 n 个点，则之后每个字母之间最多可以有 n+1 个点，这样当第一个字符前有 n 个点时，最大可以编码 (n+2)^len(email) 种，如果规定这里每次数字都是从上一次结束的数字开始，编码就不会重复了，而且可编码的范围大大增加，却又没有太多的增加点的数量。对于我的邮箱来说，前面一个点也没有时可以有 2048 种，有一个点时可以有 177147+2048 种，有两个点时可以有 4194304+177147+2048 种，我相信是用不完的了…… [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679123/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679123/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>探究学习</category><pubDate>Sun, 06 Mar 2011 22:11:22 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/gmail-super-sub-mailbox/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1209</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/gmail-super-sub-mailbox/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679123/5141978</fs:itemid></item><item><title>增强版的Bash提示符</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679124/5141978/1/item.html</link><content:encoded>&lt;p&gt;上周六参加了好久没有参加的的 SHLUG 月聚，恰逢 &lt;a href=&quot;http://imtx.me/&quot;&gt;TualatriX&lt;/a&gt; 也带团来上海。自由讨论的时候，我看到 TualatriX 的终端十分色彩斑斓，便询问，他给我们展示了他的 bash 的两个特色功能：1、当上一条命令返回结果不为0时显示返回值并高亮显示提示符；2、自动检测git分支。他说这个在他的博客上都可以找到，今天想起来去找了一下，发现了这篇：&lt;a href=&quot;http://imtx.me/archives/1298.html&quot;&gt;史上最强的PS1 | I&amp;#8217;m TualatriX&lt;/a&gt;，感觉满强大的。&lt;/p&gt;
&lt;p&gt;不过，说实话，我觉的这个还不够完美，原因有二：一是我发觉高亮显示的时候那个配色相当不怎么样，二是我本来就讨厌提示符太长，这样一下就更长了……于是我就想起 ghosTM 的 zsh 里面有一些信息是放在右边的，我想把返回值也扔右边去，并且是右边上移一行。此外，由于很少使用 git，所以检测 git 分支的功能也就不需要了~&lt;/p&gt;
&lt;p&gt;先放一个最终效果图：&lt;br /&gt;
&lt;a href=&quot;http://blog.upsuper.org/wp-content/uploads/2011/02/031-upsuper@upsuper-laptop-.png&quot;&gt;&lt;img src=&quot;http://blog.upsuper.org/wp-content/uploads/2011/02/031-upsuper@upsuper-laptop-.png&quot; alt=&quot;&quot; title=&quot;031-upsuper@upsuper-laptop: ~&quot; width=&quot;644&quot; height=&quot;433&quot; class=&quot;alignnone size-full wp-image-1207&quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后直接写出了我的新的 PS1：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120055&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code55&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #007800;&quot;&gt;PS1&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;'`a=$?;if [ $a -ne 0 ]; then a=&amp;quot;  &amp;quot;$a; echo -ne &amp;quot;\[\e[s\e[1A\e[$((COLUMNS-2))G\e[31m\e[1;41m${a:(-3)}\e[u\]\[\e[0m\e[7m\e[2m\]&amp;quot;; fi`\[\e[1;32m\]\u@\h:\[\e[0m\e[1;34m\]\W\[\e[1;34m\]\$ \[\e[0m\]'&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;非常复杂唉……让我自己再看一次都头晕……&lt;br /&gt;
&lt;span id=&quot;more-1200&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;分解这个提示符&lt;/h3&gt;
&lt;p&gt;上面看到这个 PS1 写的非常之复杂，不过其实拆解开来也没什么了不起的，只不过看起来蛋疼罢了~&lt;/p&gt;
&lt;p&gt;这个 PS1 可以分为两个部分，第一个部分是：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120056&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code56&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #007800;&quot;&gt;$?&lt;/span&gt;;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;then&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;  &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt;; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;\[\e[s\e[1A\e[&lt;span style=&quot;color: #007800;&quot;&gt;$((COLUMNS-2)&lt;/span&gt;)G\e[31m\e[1;41m&lt;span style=&quot;color: #007800;&quot;&gt;${a:(-3)}&lt;/span&gt;\e[u\]\[\e[0m\e[7m\e[2m\]&amp;quot;&lt;/span&gt;; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;fi&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;第二个部分是：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120057&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code57&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;;32m\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;\u&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;@&lt;/span&gt;\h:\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;0m\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;;34m\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;\W\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;;34m\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;\$ \&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;0m\&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;我们先来研究第二部份，这个部分看起来比较简短。其中我们可以看到一个 PS1 里面非常基本的结构：\u@\h:\W\$ ，这个结构在我的电脑里就显示为 upsuper@upsuper-laptop:~$ 大家大概可以猜到里面是什么意思了吧。&lt;/p&gt;
&lt;p&gt;这个基本骨架理出来，剩下的是看过去最蛋疼的那堆莫名其妙的符号了~我们看到很多 \e[ 这样的东西，事实上这个叫做 ANSI 控制码，在 Linux 和 Windows 的命令行里面都是通用的，\e 是 Escape 键的键码，\e[ 是一切 ANSI 控制码的开头。首先来到 \e[1;32m 这个控制码，这表示设置这个符号之后的字符为亮绿色，而 \e[0m 则是清除所有格式，这样看有没有一点清晰了呢？更多用法可以参考维基百科条目&lt;a href=&quot;http://en.wikipedia.org/wiki/ANSI_escape_code#CSI_codes&quot;&gt;ANSI escape code&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;之后还有两个东西不清楚，就是 \[ 和 \]，这两个并不是 ANSI 控制码，而是 Bash 提供的转义符。他们的解释说实话我没看太懂，不过我的理解大概就是，夹在 \[ 和 \] 之间的部分 Bash 假定他们的宽度为0，不正确地标注这两个符号会导致 Bash 的换行错误。总之在所有控制符两侧都加上这两个就对了~&lt;/p&gt;
&lt;p&gt;第二个部分解决了，下面来看蛋疼的第一部份&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120058&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code58&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #007800;&quot;&gt;$?&lt;/span&gt;;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;then&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;  &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt;; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;\[\e[s\e[1A\e[&lt;span style=&quot;color: #007800;&quot;&gt;$((COLUMNS-2)&lt;/span&gt;)G\e[31m\e[1;41m&lt;span style=&quot;color: #007800;&quot;&gt;${a:(-3)}&lt;/span&gt;\e[u\]\[\e[0m\e[7m\e[2m\]&amp;quot;&lt;/span&gt;; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;fi&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;`&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;很明显，整个结构被一个正引号引起来，表示执行并返回其中的结果。这样我们就可以把这个部分分解开来了：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120059&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code59&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #007800;&quot;&gt;$?&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #000000;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#93;&lt;/span&gt;; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;then&lt;/span&gt;
    &lt;span style=&quot;color: #007800;&quot;&gt;a&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;  &amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #007800;&quot;&gt;$a&lt;/span&gt;
    &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-ne&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;\[\e[s\e[1A\e[&lt;span style=&quot;color: #007800;&quot;&gt;$((COLUMNS-2)&lt;/span&gt;)G\e[31m\e[1;41m&lt;span style=&quot;color: #007800;&quot;&gt;${a:(-3)}&lt;/span&gt;\e[u\]\[\e[0m\e[7m\e[2m\]&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;fi&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;稍微懂点编程就会觉得这也没什么技术含量嘛，其中 $? 就是上一个程序运行的返回值，我们获取并判断他，如果不为零就进行下面的操作。a=”  “$a 这句我们待会而再看，先看下面那个 echo -ne 的语句。echo 我们知道是显示字符串，而 -ne 实际上是两个参数 -n 和 -e，-n 表示输出字符串后不输出换行符，-e 表示解析后面的转义符。&lt;/p&gt;
&lt;p&gt;最后就剩分析那个打印的东西了。我们发现主要部分其实和上面是一样的，无非就是一些设置格式的事情，我们去掉格式设置，发现主要是这样的：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p120060&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1200code60&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;s\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;1A\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;$&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#40;&lt;/span&gt;COLUMNS-&lt;span style=&quot;color: #000000;&quot;&gt;2&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#41;&lt;/span&gt;G&lt;span style=&quot;color: #800000;&quot;&gt;${a:(-3)}&lt;/span&gt;\e&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#91;&lt;/span&gt;u&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;这个部分仍然包含许多 ANSI 控制符，第一个是 \e[s，表示保存当前光标位置，与最后一个表示恢复光标位置的控制符 \e[u 遥相呼应，由于我们需要大规模移动光标，所以我们要备份一下位置。然后我们看到 \e[1A，这个控制符表示将光标上移一行。然后之后有一个很复杂的东西 \e[$((COLUMNS-2))G，这个对应的控制符是 \e[*G，表示设置光标到第几列，而 $((COLUMNS-2)) 表示这个列数为当前可显示的最大列数-2。后面有一个 ${a:(-3)}，也就是取前面的后三位显示（返回值的范围是0-255）。&lt;/p&gt;
&lt;p&gt;现在我们回到前面的 a=”  “$a，发现这个的目的其实是和 ${a:(-3)} 对应，让这个部分无论如何保证有三个字符可以出现。事实上最初我并不是这么写的，而是写 $((COLUMNS-${#a}+1))，表示 $a 有多长就显示多长。但这样感觉不美观，就改成了固定3字符长。&lt;/p&gt;
&lt;p&gt;到这里也就结束了，然后我们发现，其实看过去很复杂的东西，拆开来还是挺简单的嘛~&lt;/p&gt;
&lt;h3&gt;参考资料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://imtx.me/archives/1298.html&quot;&gt;史上最强的PS1 | I&amp;#8217;m TualatriX&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://hi.baidu.com/shappen/blog/item/4171f5ef57e6e434adafd5aa.html&quot;&gt;Bash颜色控制_宠辱不惊，看庭前花开花落；去留无意，望天空云卷云舒_百度空间&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/ANSI_escape_code&quot;&gt;ANSI escape code &amp;#8211; Wikipedia, the free encyclopedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.issociate.de/board/post/434218/Mimic_zsh%27s_right_prompt_in_bash.html&quot;&gt;Mimic zsh&amp;#8217;s right prompt in bash&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679124/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679124/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/advanced-prompt-string-of-bash/feed/</wfw:commentRss><slash:comments>5</slash:comments><description>上周六参加了好久没有参加的的 SHLUG 月聚，恰逢 TualatriX 也带团来上海。自由讨论的时候，我看到 TualatriX 的终端十分色彩斑斓，便询问，他给我们展示了他的 bash 的两个特色功能：1、当上一条命令返回结果不为0时显示返回值并高亮显示提示符；2、自动检测git分支。他说这个在他的博客上都可以找到，今天想起来去找了一下，发现了这篇：史上最强的PS1 &amp;#124; I&amp;#8217;m TualatriX，感觉满强大的。 不过，说实话，我觉的这个还不够完美，原因有二：一是我发觉高亮显示的时候那个配色相当不怎么样，二是我本来就讨厌提示符太长，这样一下就更长了……于是我就想起 ghosTM 的 zsh 里面有一些信息是放在右边的，我想把返回值也扔右边去，并且是右边上移一行。此外，由于很少使用 git，所以检测 git 分支的功能也就不需要了~ 先放一个最终效果图： 然后直接写出了我的新的 PS1： 1 PS1='`a=$?;if [ $a -ne 0 ]; then a=&amp;#34; &amp;#34;$a; echo -ne &amp;#34;\[\e[s\e[1A\e[$((COLUMNS-2))G\e[31m\e[1;41m${a:(-3)}\e[u\]\[\e[0m\e[7m\e[2m\]&amp;#34;; fi`\[\e[1;32m\]\u@\h:\[\e[0m\e[1;34m\]\W\[\e[1;34m\]\$ \[\e[0m\]' 非常复杂唉……让我自己再看一次都头晕…… 分解这个提示符 上面看到这个 PS1 写的非常之复杂，不过其实拆解开来也没什么了不起的，只不过看起来蛋疼罢了~ 这个 PS1 可以分为两个部分，第一个部分是： 1 `a=$?;if &amp;#91; $a -ne 0 &amp;#93;; then a=&amp;#34; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679124/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679124/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>探究学习</category><category>bash</category><pubDate>Mon, 28 Feb 2011 14:39:30 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/advanced-prompt-string-of-bash/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1200</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/advanced-prompt-string-of-bash/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679124/5141978</fs:itemid></item><item><title>关于饭否的两个小脚本</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679125/5141978/1/item.html</link><content:encoded>&lt;p&gt;前几天因为某些原因，我把饭否上所有的好友和关注者全部清空了。当然，如果没有程序的帮忙，估计还不等我删完我也就后悔了。&lt;/p&gt;
&lt;p&gt;我没有那么狠心的把饭否的消息给清空，因为消息是不可恢复的（而且也太多了），但好友和关注者是可以的。做事情都给自己留后路显然是我一贯的风格，不然的话，我大概早从我家阳台跳下去了……&lt;br /&gt;
&lt;span id=&quot;more-1197&quot;&gt;&lt;/span&gt;&lt;br /&gt;
两段脚本都不长，第一段是备份饭否的好友列表和关注者列表的，做的毫无泛用性，因为 bash 编程我并不很熟，只知道可以用 wget 来抓取。本来这种事情其实可以直接用 API 抓的，不过我想抓下我能直接看的东西，所以最终还是导出了 Cookie 抓网页。&lt;/p&gt;
&lt;p&gt;第一段代码如下：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p119763&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1197code63&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #666666; font-style: italic;&quot;&gt;#!/bin/bash&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;mkdir&lt;/span&gt; friends
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt; i &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;..11&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;do&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;wget&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-k&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;robots&lt;/span&gt;=off &lt;span style=&quot;color: #660033;&quot;&gt;--load-cookies&lt;/span&gt; cookies.txt &lt;span style=&quot;color: #660033;&quot;&gt;-P&lt;/span&gt; friends&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt; \
        http:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;fanfou.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;friends&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;upsuper&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/friends\/upsuper\///g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;friends/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/friends/p.1/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;friends/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/followers/..\/followers\/p.1/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;friends/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;done&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;mkdir&lt;/span&gt; followers
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt; i &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: #000000;&quot;&gt;1&lt;/span&gt;..8&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;do&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;wget&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-k&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #007800;&quot;&gt;robots&lt;/span&gt;=off &lt;span style=&quot;color: #660033;&quot;&gt;--load-cookies&lt;/span&gt; cookies.txt &lt;span style=&quot;color: #660033;&quot;&gt;-P&lt;/span&gt; followers&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt; \
        http:&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;//&lt;/span&gt;fanfou.com&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;followers&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;upsuper&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/followers\/upsuper\///g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;followers/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/friends/..\/friends\/p.1/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;followers/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/followers/p.1/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;followers/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;done&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;for&lt;/span&gt; f &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;in&lt;/span&gt; friends&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt; followers&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/*&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;do&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/friends/..\/friends/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;followers/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
    &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sed&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-i&lt;/span&gt; &lt;span style=&quot;color: #660033;&quot;&gt;-e&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;s/http:\/\/fanfou\.com\/followers/..\/followers/g&amp;quot;&lt;/span&gt; \
        &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;friends/p.&lt;span style=&quot;color: #007800;&quot;&gt;$i&lt;/span&gt;&amp;quot;&lt;/span&gt;
&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;done&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

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

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p119764&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1197code64&quot;&gt;&lt;pre class=&quot;python&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/env python&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# - * - coding: utf8 - * -&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; json
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;socket&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; timeout
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;urllib&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; urlencode
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;base64&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; b64encode
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;getpass&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;getpass&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;from&lt;/span&gt; httplib2 &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; Http
&amp;nbsp;
username = &lt;span style=&quot;color: #008000;&quot;&gt;raw_input&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Username: '&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
password = &lt;span style=&quot;color: #dc143c;&quot;&gt;getpass&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'Password: '&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
auth = &lt;span style=&quot;color: #483d8b;&quot;&gt;'Basic '&lt;/span&gt; + b64encode&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'%s:%s'&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;%&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;username, password&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
headers = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'Authorization'&lt;/span&gt;: auth &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;
&amp;nbsp;
h = Http&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;timeout=&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stdout&lt;/span&gt; = &lt;span style=&quot;color: #dc143c;&quot;&gt;sys&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;stderr&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Delete friends&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'Delete friends:'&lt;/span&gt;
resp, content = h.&lt;span style=&quot;color: black;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'http://api.fanfou.com/friends/ids.json'&lt;/span&gt;, headers=headers&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
friends = json.&lt;span style=&quot;color: black;&quot;&gt;loads&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;content&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; friend &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; friends:
    query_str = urlencode&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'id'&lt;/span&gt;: friend.&lt;span style=&quot;color: black;&quot;&gt;encode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'utf8'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; friend.&lt;span style=&quot;color: black;&quot;&gt;encode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'utf8'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
        resp, content = h.&lt;span style=&quot;color: black;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'http://api.fanfou.com/friendships/destroy.json?'&lt;/span&gt; + query_str, &lt;span style=&quot;color: #483d8b;&quot;&gt;'POST'&lt;/span&gt;, headers=headers&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; timeout:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'timeout'&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; resp.&lt;span style=&quot;color: black;&quot;&gt;status&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# Delete followers&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'Delete followers:'&lt;/span&gt;
resp, content = h.&lt;span style=&quot;color: black;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'http://api.fanfou.com/followers/ids.json'&lt;/span&gt;, headers=headers&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
followers = json.&lt;span style=&quot;color: black;&quot;&gt;loads&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;content&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; follower &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; followers:
    query_str = urlencode&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'id'&lt;/span&gt;: follower.&lt;span style=&quot;color: black;&quot;&gt;encode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'utf8'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; follower.&lt;span style=&quot;color: black;&quot;&gt;encode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'utf8'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
        resp, content = h.&lt;span style=&quot;color: black;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'http://api.fanfou.com/blocks/create.xml?'&lt;/span&gt; + query_str, &lt;span style=&quot;color: #483d8b;&quot;&gt;'POST'&lt;/span&gt;, headers=headers&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; timeout:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'timeout'&lt;/span&gt;,
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; resp.&lt;span style=&quot;color: black;&quot;&gt;status&lt;/span&gt;,
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
        resp, content = h.&lt;span style=&quot;color: black;&quot;&gt;request&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'http://api.fanfou.com/blocks/destroy.xml?'&lt;/span&gt; + query_str, &lt;span style=&quot;color: #483d8b;&quot;&gt;'POST'&lt;/span&gt;, headers=headers&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; timeout:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'timeout'&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; resp.&lt;span style=&quot;color: black;&quot;&gt;status&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;这段 Python 脚本其实颇具我写饭否应用的风格。这段脚本还是比较有泛用性的，进入的时候会提示输入饭否id和密码，然后他也会自动备份一个 JSON 格式的饭否好友列表和关注者列表。只是处于周全我才做的这一步，其实是完全没有必要的，因为我已经备份过了，而且我也不准备让程序帮我全部还原……&lt;/p&gt;
&lt;p&gt;正好清理一下两个列表……&lt;/p&gt;
&lt;p&gt;原理就不多做介绍了。第二段脚本在运行开始清理好友的时候，可能会连续出现 timeout 的情况不必在意，因为饭否似乎会在这个 API 执行的时候处理 timeline 的缓存。不过据我观察，脚本运行结束后，似乎会有部分好友留下，数量对我来说少于十个，可以快速手动清除……&lt;/p&gt;
&lt;p&gt;出于观察输出的考虑，我没有用多线程。脚本删除关注者的原理是加入黑名单再取消黑名单，如果加入了黑名单在取消的时候没有成功，那就意味着误加了，这是找不到的，因为黑名单的列表似乎无法察看……&lt;/p&gt;
&lt;p&gt;就这样了……我现在已经逐渐的开始恢复饭否活动了……不过还不准备完全回到过去……以上&lt;/p&gt;
&lt;p&gt;突然觉得，第一段脚本可以用 make 实现？&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679125/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679125/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/two-scripts-for-fanfou/feed/</wfw:commentRss><slash:comments>2</slash:comments><description>前几天因为某些原因，我把饭否上所有的好友和关注者全部清空了。当然，如果没有程序的帮忙，估计还不等我删完我也就后悔了。 我没有那么狠心的把饭否的消息给清空，因为消息是不可恢复的（而且也太多了），但好友和关注者是可以的。做事情都给自己留后路显然是我一贯的风格，不然的话，我大概早从我家阳台跳下去了…… 两段脚本都不长，第一段是备份饭否的好友列表和关注者列表的，做的毫无泛用性，因为 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 &amp;#160; mkdir friends for i in &amp;#123;1..11&amp;#125; [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679125/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679125/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>小程序</category><category>bash</category><category>Python</category><category>饭否</category><pubDate>Wed, 02 Feb 2011 12:06:24 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/two-scripts-for-fanfou/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1197</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/two-scripts-for-fanfou/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679125/5141978</fs:itemid></item><item><title>为 Linux 做一把 USB “钥匙”</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679126/5141978/1/item.html</link><content:encoded>&lt;p&gt;我曾经很早以前就在想，能不能将U盘作为登入我系统的验证机制。当时的想法是，这样比较有趣~不过后来发现另外一个重要的用途就是，防止在众目睽睽之下输入密码……&lt;/p&gt;
&lt;p&gt;这个&lt;a href=&quot;https://groups.google.com/group/shlug/browse_thread/thread/d507a796d11df859/15b0bce269c51f7f&quot;&gt;问题提出&lt;/a&gt;后，邮件列表里很快就有人告诉我，Linux 已经有一个现成的机制了，这就是 pam_usb。不过我在网上搜了半晌都没搜到相关的中文资料，前几天弄成了，就写出来供大家参考~&lt;/p&gt;
&lt;p&gt;其实来说，是很简单的。首先，当然，要准备一个U盘~（废话），然后安装 pam_usb。在 Ubuntu 下的话，源里就有，可以输入命令&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118972&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code72&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;apt-get&lt;/span&gt; &lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;install&lt;/span&gt; pamusb-tools&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;直接安装。当然如果你连终端也懒得打开，可以直接点击这里：&lt;a href=&quot;apt:pamusb-tools&quot;&gt;安装 pamusb-tools&lt;/a&gt;。当然，在后面的步骤中你终归还是要打开终端的，所以还是先开了吧~这个东西目前暂时还没什么图形界面的样子（当然做一个相信也不难）。&lt;/p&gt;
&lt;p&gt;另外，Fedora 源里有 pam_usb 包，Arch Linux 似乎在 AUR 里有，在 Gentoo 中似乎是被默认屏蔽的，可以通过下面指令安装：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118973&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code73&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #7a0874; font-weight: bold;&quot;&gt;echo&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;sys-auth/pam_usb&amp;quot;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;etc&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;portage&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;/&lt;/span&gt;package.keywords
emerge &lt;span style=&quot;color: #660033;&quot;&gt;-av&lt;/span&gt; &lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;&amp;gt;=sys-auth/pam_usb-0.4.1&amp;quot;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;其他的发行版也可以直接从他们的&lt;a href=&quot;http://pamusb.org/&quot;&gt;项目主页&lt;/a&gt;下载源码包编译安装~&lt;/p&gt;
&lt;p&gt;安装好了以后，首先插入你作为钥匙的U盘，然后在终端中运行&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118974&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code74&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; pamusb-conf &lt;span style=&quot;color: #660033;&quot;&gt;--add-device&lt;/span&gt; MyUSBDevice&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;其中的 MyUSBDevice 可以任意修改，只是一个标识符而已。接下来根据提示操作即可。如果你的电脑此时连接着超过一个U盘、移动硬盘，或者某个U盘、移动硬盘包含超过一个分区（就像我给U盘分了2个区），就会提示选择安装到哪里。设置完确认保存到配置文件即可。&lt;/p&gt;
&lt;p&gt;下面添加认证用户，下面的命令是添加我为认证用户的：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118975&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code75&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; pamusb-conf &lt;span style=&quot;color: #660033;&quot;&gt;--add-user&lt;/span&gt; upsuper&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;原教程里面写的是添加 root 我认为是没有必要的，添加 sudoer 应该是已经足够了的。这条命令几乎不问什么问题，直接就完成了……这样以后在使用这把钥匙的时候就可以不需要输入相应用户的密码了。&lt;/p&gt;
&lt;p&gt;最后最重要的一步，是编辑认证系统的配置文件。打开 /etc/pam.d/common-auth （对于 Gentoo 来说是 /etc/pam.d/system-auth），将下面这行插入到所有条目的前面：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118976&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code76&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;auth    sufficient      pam_usb.so&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;现在你的 USB 钥匙已经可以用了！现在，另外再打开一个终端，随便 sudo 点什么，然后你应该不会再看到输入密码的画面，取而代之的是下面的东西：&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118977&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
3
4
5
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code77&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;* pam_usb v0.4.2
* Authentication request for user &amp;quot;upsuper&amp;quot; (sudo)
* Device &amp;quot;MyUSBDevice&amp;quot; is connected (good).
* Performing one time pad verification...
* Access granted.&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;然后运行成功了！不仅 sudo 可以验证，包括 gksu 和登入框等等都已经可以使用这把钥匙直接略过不需要输入密码了。&lt;/p&gt;
&lt;p&gt;现在你已经成功的制作了一个属于自己的 USB 钥匙！&lt;br /&gt;
&lt;span id=&quot;more-1189&quot;&gt;&lt;/span&gt;&lt;br /&gt;
现在我们看看还有什么地方可以继续改进的……&lt;/p&gt;
&lt;p&gt;我们注意到，无论我们是否连接了我们的钥匙，以后 sudo 的时候都会出现那些讨厌的提示，怎么办呢……？其实这完全也是可以解决的：打开 /etc/pamusb.conf 文件，我们发现这其实根本就是一个 XML 文件……在里面的 &amp;lt;defaults&amp;gt; 标签中间添加&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p118978&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1189code78&quot;&gt;&lt;pre class=&quot;xml&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;option&lt;/span&gt; &lt;span style=&quot;color: #000066;&quot;&gt;name&lt;/span&gt;=&lt;span style=&quot;color: #ff0000;&quot;&gt;&amp;quot;quiet&amp;quot;&lt;/span&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;true&lt;span style=&quot;color: #009900;&quot;&gt;&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;lt;/option&lt;span style=&quot;color: #000000; font-weight: bold;&quot;&gt;&amp;gt;&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;保存后就直接生效了~&lt;/p&gt;
&lt;p&gt;除此之外，我们发现在这里，我们的钥匙和原来的密码之间是一个替代的关系，如果你希望利用这个钥匙附加上密码提高安全性的话，可以将上面在 /etc/pam.d/common-auth 里面加入的那行中的 sufficient 改成 required，如果你干脆就不想再用密码了，那就把密码的那些删掉，留下一个 required 的 pam_usb~&lt;/p&gt;
&lt;p&gt;话说这还真是强大呐~不过用了这个以后，你这个USB钥匙也得要好好保管鸟~不过其实对我来说最爽的无外乎以后在众目睽睽之下不需要再手动输入密码啦~&lt;/p&gt;
&lt;h3&gt;参考资料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://ubuntuforums.org/showthread.php?t=17571&quot;&gt;HOWTO: pam_usb login with USB memory stick &amp;#8211; Ubuntu Forums&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pamusb.org/doc/quickstart&quot;&gt;doc:quickstart    [pam_usb]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://pamusb.org/doc/configuration&quot;&gt;doc:configuration    [pam_usb]&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679126/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679126/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/make-an-usb-key-for-linux/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>我曾经很早以前就在想，能不能将U盘作为登入我系统的验证机制。当时的想法是，这样比较有趣~不过后来发现另外一个重要的用途就是，防止在众目睽睽之下输入密码…… 这个问题提出后，邮件列表里很快就有人告诉我，Linux 已经有一个现成的机制了，这就是 pam_usb。不过我在网上搜了半晌都没搜到相关的中文资料，前几天弄成了，就写出来供大家参考~ 其实来说，是很简单的。首先，当然，要准备一个U盘~（废话），然后安装 pam_usb。在 Ubuntu 下的话，源里就有，可以输入命令 1 sudo apt-get install pamusb-tools 直接安装。当然如果你连终端也懒得打开，可以直接点击这里：安装 pamusb-tools。当然，在后面的步骤中你终归还是要打开终端的，所以还是先开了吧~这个东西目前暂时还没什么图形界面的样子（当然做一个相信也不难）。 另外，Fedora 源里有 pam_usb 包，Arch Linux 似乎在 AUR 里有，在 Gentoo 中似乎是被默认屏蔽的，可以通过下面指令安装： 1 2 echo &amp;#34;sys-auth/pam_usb&amp;#34; &amp;#62;&amp;#62; /etc/portage/package.keywords emerge -av &amp;#34;&amp;#62;=sys-auth/pam_usb-0.4.1&amp;#34; 其他的发行版也可以直接从他们的项目主页下载源码包编译安装~ 安装好了以后，首先插入你作为钥匙的U盘，然后在终端中运行 1 sudo pamusb-conf --add-device MyUSBDevice 其中的 MyUSBDevice 可以任意修改，只是一个标识符而已。接下来根据提示操作即可。如果你的电脑此时连接着超过一个U盘、移动硬盘，或者某个U盘、移动硬盘包含超过一个分区（就像我给U盘分了2个区），就会提示选择安装到哪里。设置完确认保存到配置文件即可。 下面添加认证用户，下面的命令是添加我为认证用户的： 1 sudo pamusb-conf --add-user upsuper 原教程里面写的是添加 root 我认为是没有必要的，添加 sudoer 应该是已经足够了的。这条命令几乎不问什么问题，直接就完成了……这样以后在使用这把钥匙的时候就可以不需要输入相应用户的密码了。 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679126/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679126/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Linux</category><category>雕虫小技</category><category>U盘</category><category>验证</category><pubDate>Fri, 14 Jan 2011 20:24:39 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/make-an-usb-key-for-linux/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1189</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/make-an-usb-key-for-linux/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679126/5141978</fs:itemid></item><item><title>Rhythmbox 封面艺人插件的中国版</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679127/5141978/1/item.html</link><content:encoded>&lt;p&gt;上一篇日志里面我做了一个从 VeryCD 为 Rhythmbox 提取专辑封面的程序，后来想到豆瓣其实也有这个东西，于是又做了一个豆瓣的。然后想，既然这样我干脆把原来的封面艺人插件 fork 出来，自己开一个新项目，专门做封面艺人插件的 China Mod~&lt;/p&gt;
&lt;p&gt;现在已经开好了，就在 Google Code 上：&lt;a href=&quot;http://code.google.com/p/rhythmbox-artdisplay-cn/&quot;&gt;http://code.google.com/p/rhythmbox-artdisplay-cn/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;其实说 Mod 也不算，就是加了几个扩展进去……主要是考虑到如果不 fork 似乎很单独安装，所以就 fork 出来了……那个插件看过去也很长时间没有更新了呢？&lt;/p&gt;
&lt;p&gt;第一个版本0.1可以点击这里下载：&lt;a href=&quot;http://rhythmbox-artdisplay-cn.googlecode.com/files/rhythmbox-artdisplay-cn-0.1.tar.bz2&quot;&gt;rhythmbox-artdisplay-cn-0.1.tar.bz2&lt;/a&gt;，暂时还没有做任何安装包，deb 包和 arch 的包应该会随后奉上~&lt;/p&gt;
&lt;p&gt;安装很简单，常规的 make 和 make install 就可以了~&lt;/p&gt;
&lt;p&gt;如果各位有什么改进意见，欢迎提出~&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679127/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679127/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>上一篇日志里面我做了一个从 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 就可以了~ 如果各位有什么改进意见，欢迎提出~&lt;img src=&quot;http://www1.feedsky.com/t1/567679127/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679127/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>小程序</category><category>Python</category><category>rhythmbox</category><pubDate>Tue, 19 Oct 2010 13:17:05 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1186</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/china-mod-of-artdisplay-plugin-for-rhythmbox/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679127/5141978</fs:itemid></item><item><title>利用 VeryCD 给 Rhythmbox 添加专辑封面</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679128/5141978/1/item.html</link><content:encoded>&lt;p&gt;我们知道 Rhythmbox 里面有一个插件叫做“封面艺人”，可以通过互联网下载对应专辑的封面图片。可是，那个插件使用的似乎是美国的 Amazon，中文歌曲基本找不到对应封面，怎么办呢……&lt;/p&gt;
&lt;p&gt;想到我的很多专辑都是从 VeryCD 上下载的，那些下载页面通常都会有专辑封面图片，于是我就写了个封面艺人的扩展，让其可以从 VeryCD 上搜索专辑，并下载相应专辑封面。这个扩展可以在这里下载：&lt;a href=&quot;http://down.upsuper.org/verycd-cover.tar.bz2&quot;&gt;verycd-cover.tar.bz2&lt;/a&gt; (5KB)&lt;/p&gt;
&lt;p&gt;下载解压后，运行其中的 compile.py，然后把除了 compile.py 以外的四个文件拷贝到 Rhythmbox 的封面艺人插件的目录就可以了，在 Ubuntu 下，那个目录是 /usr/lib/rhythmbox/plugins/artdisplay。&lt;br /&gt;
&lt;span id=&quot;more-1179&quot;&gt;&lt;/span&gt;&lt;/p&gt;
&lt;h3&gt;已知问题&lt;/h3&gt;
&lt;p&gt;写这个总共没花多少时间，所以也不能指望十分精品。实现的基本方式就是通过 VeryCD 的搜索 API 获得匹配的 ID，然后进去寻找是否有封面图片。&lt;/p&gt;
&lt;p&gt;这种做法有很多局限性，比如可能有的专辑不是独立为一个页面的，这样可能获取的封面是错误的……&lt;/p&gt;
&lt;p&gt;此外，由于 Rhythmbox 对于不写艺术家一项的歌曲，艺术家会返回“未知”，如果直接用“未知”去找，十有八九是找不到的，所以我在代码里着了点特判，不知道有没有更优美的方法……&lt;/p&gt;
&lt;p&gt;话说，我发现豆瓣音乐似乎也有不少资源，这样还可以写一个从豆瓣获取封面的扩展~&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679128/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679128/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/feed/</wfw:commentRss><slash:comments>0</slash:comments><description>我们知道 Rhythmbox 里面有一个插件叫做“封面艺人”，可以通过互联网下载对应专辑的封面图片。可是，那个插件使用的似乎是美国的 Amazon，中文歌曲基本找不到对应封面，怎么办呢…… 想到我的很多专辑都是从 VeryCD 上下载的，那些下载页面通常都会有专辑封面图片，于是我就写了个封面艺人的扩展，让其可以从 VeryCD 上搜索专辑，并下载相应专辑封面。这个扩展可以在这里下载：verycd-cover.tar.bz2 (5KB) 下载解压后，运行其中的 compile.py，然后把除了 compile.py 以外的四个文件拷贝到 Rhythmbox 的封面艺人插件的目录就可以了，在 Ubuntu 下，那个目录是 /usr/lib/rhythmbox/plugins/artdisplay。 已知问题 写这个总共没花多少时间，所以也不能指望十分精品。实现的基本方式就是通过 VeryCD 的搜索 API 获得匹配的 ID，然后进去寻找是否有封面图片。 这种做法有很多局限性，比如可能有的专辑不是独立为一个页面的，这样可能获取的封面是错误的…… 此外，由于 Rhythmbox 对于不写艺术家一项的歌曲，艺术家会返回“未知”，如果直接用“未知”去找，十有八九是找不到的，所以我在代码里着了点特判，不知道有没有更优美的方法…… 话说，我发现豆瓣音乐似乎也有不少资源，这样还可以写一个从豆瓣获取封面的扩展~&lt;img src=&quot;http://www1.feedsky.com/t1/567679128/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679128/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>小程序</category><category>Ubuntu</category><category>VeryCD</category><category>rhythmbox</category><pubDate>Mon, 18 Oct 2010 19:54:14 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1179</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/add-cover-art-for-rhythmbox-using-verycd/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679128/5141978</fs:itemid></item><item><title>当小白鼠还真是一件得耐得住折腾的事情——记装 Ubuntu 10.10 RC</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679129/5141978/1/item.html</link><content:encoded>&lt;p&gt;当小白鼠绝对是一件得耐得住折腾的事情……当然，这看起来和RC不RC似乎并没有太大的关系，作为在普罗大众之前开始接触桌面Linux的一员，绝对可谓是小白鼠了。&lt;/p&gt;
&lt;p&gt;说 Ubuntu 10.10 的安装界面确实是做的不错了，而且还能自动识别需要的私有驱动。不过有一点让我比较无语的是，在我还没有联网的时候，他找到我的无线网卡的私有驱动，但是下载安装不了……所以我不得不接上网线安装。安装过程比较顺利，除了似乎选择硬盘分区的时候十分卡以外，其它的地方还是很满意的，包括一边复制文件一边询问一些详细配置、一边复制文件一边给出 Ubuntu 的特性介绍这样。另外，正如 Canonical 公司之前承诺的那样，中文成为了 Ubuntu 10.10 的官方语言，安装完成后，全部中文界面，并且自动安装好了 ibus-pinyin。不过，Firefox 却意外的成为异类，仍然是英文（先在不知道什么时候已经突然变成中文了）。此外还有一点就是，很希望 ibus-sunpinyin 能尽快成为默认的，因为确实比 ibus-pinyin 好很多的感觉。&lt;/p&gt;
&lt;p&gt;一安装完问题就来了，没法启动！后来几经周折，发现原因是安装的时候莫名其妙的把我的安装U盘识别为 sda 而硬盘识别为 sdb，并且安装程序还把这个写进了 fstab 里面。理论上说 Ubuntu 应该自动写入 fstab 的都是 UUID 才对，这次却写了 /dev/sdXY 进去，着实让人感到奇怪。通过我的修复盘手动修改了 fstab 以后终于成功进入了，后面就改成了使用 UUID 了，保证不会出问题……我去网上一搜，没有发现有人遇到同样的问题，我就到 Launchpad 报告了 bug：&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/partman-target/+bug/653880&quot;&gt;installer identified hard drive as sdb led to the new system unbootablity&lt;/a&gt;。话说我的英文这么差，各位看到有什么语法错误之类的，那也是很正常的了……提交 bug 也算是我对开源的一点贡献了吧……&lt;/p&gt;
&lt;p&gt;然后安装了 nVidia 的私有驱动 256.53，成功开启了各种 Compiz 特效，非常赞，而且效果相当不错。不过问题也随之而来：开机画面惨不忍睹……这是个很纠结的问题，你说那么漂亮的一个开机画面，怎么就被个驱动整成那模样……接着就在 Ubuntu 中文论坛上找到了解决方案。这个方案比较复杂，我就直接给链接好了：&lt;a href=&quot;http://forum.ubuntu.org.cn/viewtopic.php?f=42&amp;#038;t=269452&amp;#038;start=0&quot;&gt;Ubuntu 10.04 安装Nvidia显卡后开机花屏完美解决（图解）&lt;/a&gt;，可以看到这是 10.04 时代遗留下来的问题……不过这个方案解决还算完美，至少开机画面是漂亮了不少的。不过这个事情有一个副作用，就是切入切出 tty 变得格外缓慢。于是在这栋楼的47楼发现了解决方法，这个就简单了。因为那个作者没有写出详细的做法，我就简单说一下。在解决的第一步肯定要用到 hwinfo &amp;#8211;framebuffer 这个命令，先在仍然用这个命令，察看你选择的那个分辨率的编号，比如我选择的模式是“Mode 0&amp;#215;0318: 1024&amp;#215;768 (+4096), 24 bits”，那么我需要的编号就是 0&amp;#215;0318 = 792，就是十六进制和十进制的转换咯。然后修改 /etc/default/grub，把刚才改过的&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117682&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1176code82&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash nomodeset video=uvesafb:mode_option=1024x768-24,mtrr=3,scroll=ywrap&amp;quot;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;修改为&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117683&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1176code83&quot;&gt;&lt;pre class=&quot;text&quot; style=&quot;font-family:monospace;&quot;&gt;GRUB_CMDLINE_LINUX_DEFAULT=&amp;quot;quiet splash nomodeset video=uvesafb:mtrr=3,scroll=ywrap vga=792&amp;quot;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;然后打开 /etc/initramfs-tools/module，同样去掉 mode_option=&amp;#8230;. 的那个部分保存。然后还是&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117684&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;1
2
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1176code84&quot;&gt;&lt;pre class=&quot;bash&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; update-initramfs &lt;span style=&quot;color: #660033;&quot;&gt;-u&lt;/span&gt;
&lt;span style=&quot;color: #c20cb9; font-weight: bold;&quot;&gt;sudo&lt;/span&gt; update-grub&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;就可以了。然后再重启以后，切换 tty 慢的问题也算是初步解决了。&lt;/p&gt;
&lt;p&gt;接下来遇到的问题就更囧了，gVim 和 OpenOffice.org 里面各种花屏，字体混乱。这个问题倒是很多人遇到过了，在 Launchpad 这个 bug 已经被先后3次提交到了不同的软件包，包括 &lt;a href=&quot;https://bugs.launchpad.net/nvidia-drivers-ubuntu/+bug/568492&quot;&gt;nvidia 驱动包&lt;/a&gt;、&lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/openoffice.org/+bug/567719&quot;&gt;openoffice.org 包&lt;/a&gt;和 &lt;a href=&quot;https://bugs.launchpad.net/ubuntu/+source/vim/+bug/572863&quot;&gt;vim 包&lt;/a&gt;……看了一遍里面的各种提示，发现有两种方法可以解决这个问题：第一种是使用 metacity 替换 compiz，具体的做法就是 Alt-F2，输入“metacity &amp;#8211;replace”，替换速度还是挺快的，替换后就解决问题了，缺点是切换过去以后各种桌面效果就没有了。当然，想要切换回 compiz 感受桌面效果的时候，再按 Alt-F2，输入“compiz &amp;#8211;replace”就可以了。第二种是调整字体配置，也就是在 系统/首选项/外观/字体 里，把下面的次像素平滑修改为上面的最佳形状。说实话，最佳形状看过去没有次像素平滑漂亮，不过问题是可以解决的。后来在那个 bug 反馈中有人提出，在选择最佳形状后点击“细节”，在微调内选择“轻微”可以改善显示效果，并且不会导致 gVim 和 OpenOffice.org 花屏了，我试了一下确实如此，不过总觉得是不是可能还有问题……现在暂时使用这个了……&lt;/p&gt;
&lt;p&gt;嗷……现在暂时遇到了这些问题，很纠结的呢……所以说当小白鼠还真是一件得耐得住折腾的事情呢……&lt;/p&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679129/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679129/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/note-for-installing-ubuntu-10-10-rc/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>当小白鼠绝对是一件得耐得住折腾的事情……当然，这看起来和RC不RC似乎并没有太大的关系，作为在普罗大众之前开始接触桌面Linux的一员，绝对可谓是小白鼠了。 说 Ubuntu 10.10 的安装界面确实是做的不错了，而且还能自动识别需要的私有驱动。不过有一点让我比较无语的是，在我还没有联网的时候，他找到我的无线网卡的私有驱动，但是下载安装不了……所以我不得不接上网线安装。安装过程比较顺利，除了似乎选择硬盘分区的时候十分卡以外，其它的地方还是很满意的，包括一边复制文件一边询问一些详细配置、一边复制文件一边给出 Ubuntu 的特性介绍这样。另外，正如 Canonical 公司之前承诺的那样，中文成为了 Ubuntu 10.10 的官方语言，安装完成后，全部中文界面，并且自动安装好了 ibus-pinyin。不过，Firefox 却意外的成为异类，仍然是英文（先在不知道什么时候已经突然变成中文了）。此外还有一点就是，很希望 ibus-sunpinyin 能尽快成为默认的，因为确实比 ibus-pinyin 好很多的感觉。 一安装完问题就来了，没法启动！后来几经周折，发现原因是安装的时候莫名其妙的把我的安装U盘识别为 sda 而硬盘识别为 sdb，并且安装程序还把这个写进了 fstab 里面。理论上说 Ubuntu 应该自动写入 fstab 的都是 UUID 才对，这次却写了 /dev/sdXY 进去，着实让人感到奇怪。通过我的修复盘手动修改了 fstab 以后终于成功进入了，后面就改成了使用 UUID 了，保证不会出问题……我去网上一搜，没有发现有人遇到同样的问题，我就到 Launchpad 报告了 bug：installer identified hard drive as sdb led to the new system unbootablity。话说我的英文这么差，各位看到有什么语法错误之类的，那也是很正常的了……提交 bug 也算是我对开源的一点贡献了吧…… 然后安装了 nVidia 的私有驱动 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679129/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679129/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>Bug</category><category>探究学习</category><category>Ubuntu</category><category>小白鼠</category><pubDate>Tue, 05 Oct 2010 11:08:25 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/note-for-installing-ubuntu-10-10-rc/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1176</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/note-for-installing-ubuntu-10-10-rc/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679129/5141978</fs:itemid></item><item><title>寻找更高仿的 ID 第二季</title><link>http://item.feedsky.com/~feedsky/upsuper/~8088065/567679130/5141978/1/item.html</link><content:encoded>&lt;p&gt;继上一篇文章之后，我又下大力气对这个程序做了许多修改，在精确度和速度方面似乎都有些许提高。在此推出第二季~&lt;/p&gt;
&lt;h3&gt;使用真正的12px宋体&lt;/h3&gt;
&lt;p&gt;在上一次的程序中使用的 PIL 似乎是因为不支持宋体 ttc 文件中对于小字体下优化的点阵形式，才在选择小于 19px 的字号时不能正确渲染汉字。考虑到这一点，我就想到把 ttc 文件里面 12px 的点阵字体单独提取出来使用，毕竟贴吧上面显示 ID 都是用这个字号显示的。&lt;/p&gt;
&lt;p&gt;使用 FontForge 提取出来了 simsun-12.bdf 文件，就是宋体 12px 下的点阵。参考 PIL 的手册，发现 PIL 不能直接使用 .bdf 文件，需要使用一个叫做 pilfont 的脚本转换成专有的 .pil 文件才行。我想转换就转换呗。simsun-12.bdf 一个 2.4MB 的文件，转换完就剩不到 100KB，我就觉得肯定有问题，用 PIL 导入，发现还是不能渲染中文。后来知道，这个 .pil 文件根本不支持非拉丁字母的字符，它的储存空间限定了 256 个字符……&lt;/p&gt;
&lt;p&gt;无奈了，这意味着 PIL 完全无法支持中文点阵了……&lt;/p&gt;
&lt;p&gt;当然，办法总归是有的，那就是——抛弃 PIL！为什么我能有这样的想法呢，因为看到 .bdf 文件是 UNIX 标准的。UNIX 标准意味着什么呢？记不记得 UNIX 有一个非常好的传统叫做，尽量使用纯文本。是的，这虽然让有些文件会变得太大，不过同时也让这些东西更容易被其他程序读取，而 .bdf 恰好即使这么一种文件。&lt;/p&gt;
&lt;p&gt;这样读取 .bdf 点阵字体文件的程序自己写不就好了，什么额外的库都不需要……当然，纠错性极弱就是了~&lt;/p&gt;

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117289&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1172code89&quot;&gt;&lt;pre class=&quot;python&quot; style=&quot;font-family:monospace;&quot;&gt;line_count = &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;global&lt;/span&gt; line_count
    line_count += &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;
    line = f.&lt;span style=&quot;color: #dc143c;&quot;&gt;readline&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; line:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;False&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;:-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;split&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;with&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'simsun-12.bdf'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'r'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;as&lt;/span&gt; f:
    chars = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;
    line = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;''&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 获得字符总数&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;while&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;!&lt;/span&gt;= &lt;span style=&quot;color: #483d8b;&quot;&gt;'CHARS'&lt;/span&gt;:
            line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 读取所有字符&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; i &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'STARTCHAR'&lt;/span&gt;
            line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 编码&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'ENCODING'&lt;/span&gt;
            char = &lt;span style=&quot;color: #008000;&quot;&gt;unichr&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 绘制参数&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'BBX'&lt;/span&gt;
            width, height, x1, y1 = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;x&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;:&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
            x0, y0 = &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt; + x1, &lt;span style=&quot;color: #ff4500;&quot;&gt;12&lt;/span&gt; - y1 - height&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 准备绘制文字&lt;/span&gt;
            base_image = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; y &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
            &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 读取并绘制文字&lt;/span&gt;
            line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'BITMAP'&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; y &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;y0, y0 + height&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
                line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
                bits = &lt;span style=&quot;color: #008000;&quot;&gt;int&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;line, &lt;span style=&quot;color: #ff4500;&quot;&gt;16&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
                bits &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;= &lt;span style=&quot;color: #008000;&quot;&gt;len&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;line&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;*&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt; - width
                &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;x0 + width - &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;, x0 - &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;, -&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
                    base_image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; = bits &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;amp;&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;
                    bits &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&amp;gt;&lt;/span&gt;= &lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;
            chars&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;char&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; = base_image
            &lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# 结束这个文字&lt;/span&gt;
            line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'ENDCHAR'&lt;/span&gt;
        line = read_split&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;f&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;assert&lt;/span&gt; line&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; == &lt;span style=&quot;color: #483d8b;&quot;&gt;'ENDFONT'&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;AssertionError&lt;/span&gt;:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; &lt;span style=&quot;color: #483d8b;&quot;&gt;'line'&lt;/span&gt;, line_count
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;raise&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

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

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

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

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117291&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1172code91&quot;&gt;&lt;pre class=&quot;python&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# - * - coding: utf8 - * -&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;copy&lt;/span&gt;
&amp;nbsp;
base_chars = &lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'base_image'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'rb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
chars = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; char, image &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; base_chars.&lt;span style=&quot;color: black;&quot;&gt;iteritems&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    new_image = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; y &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
        new_row = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; x &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;range&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #ff4500;&quot;&gt;14&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
                value = &lt;span style=&quot;color: #ff4500;&quot;&gt;81&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;else&lt;/span&gt;:
                value = &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; y &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;and&lt;/span&gt; image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
                value += &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; y &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;13&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;and&lt;/span&gt; image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y+&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
                value += &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; x &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;gt;&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;and&lt;/span&gt; image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x-&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
                value += &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; x &lt;span style=&quot;color: #66cc66;&quot;&gt;&amp;lt;&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;13&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;and&lt;/span&gt; image&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;y&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;x+&lt;span style=&quot;color: #ff4500;&quot;&gt;1&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
                value += &lt;span style=&quot;color: #ff4500;&quot;&gt;4&lt;/span&gt;
            new_image.&lt;span style=&quot;color: black;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;value&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    chars&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;char&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; = new_image
&amp;nbsp;
&lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;dump&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;chars, &lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'advanced_data'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'wb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

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

&lt;div class=&quot;wp_codebox&quot;&gt;&lt;table&gt;&lt;tr id=&quot;p117292&quot;&gt;&lt;td class=&quot;line_numbers&quot;&gt;&lt;pre&gt;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
&lt;/pre&gt;&lt;/td&gt;&lt;td class=&quot;code&quot; id=&quot;p1172code92&quot;&gt;&lt;pre class=&quot;python&quot; style=&quot;font-family:monospace;&quot;&gt;&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;#!/usr/bin/python&lt;/span&gt;
&lt;span style=&quot;color: #808080; font-style: italic;&quot;&gt;# - * - coding: utf8 - * -&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;import&lt;/span&gt; &lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;
&amp;nbsp;
chars = &lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'advanced_data'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'rb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;def&lt;/span&gt; image_diff&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;image1, image2&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
    ret = &lt;span style=&quot;color: #ff4500;&quot;&gt;0&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; v1, v2 &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;zip&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;image1, image2&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
        ret += &lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;v1 - v2&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt; &lt;span style=&quot;color: #66cc66;&quot;&gt;**&lt;/span&gt; &lt;span style=&quot;color: #ff4500;&quot;&gt;2&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;return&lt;/span&gt; ret
&amp;nbsp;
remember_number = &lt;span style=&quot;color: #ff4500;&quot;&gt;5&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;try&lt;/span&gt;:
    searched = &lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;load&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'searched_chars'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'rb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;except&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;IOError&lt;/span&gt;:
    searched = &lt;span style=&quot;color: black;&quot;&gt;&amp;#123;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#125;&lt;/span&gt;
&lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;while&lt;/span&gt; &lt;span style=&quot;color: #008000;&quot;&gt;True&lt;/span&gt;:
    input_string = &lt;span style=&quot;color: #008000;&quot;&gt;unicode&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #008000;&quot;&gt;raw_input&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'ID: '&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'utf8'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; input_string:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;break&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; char &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; input_string:
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; char &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; chars:
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;continue&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; char &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;not&lt;/span&gt; &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; searched:
            diff_data = &lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
            image = chars&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;char&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; c, v &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; chars.&lt;span style=&quot;color: black;&quot;&gt;iteritems&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;:
                &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;if&lt;/span&gt; c == char:
                    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;continue&lt;/span&gt;
                diff_data.&lt;span style=&quot;color: black;&quot;&gt;append&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;image_diff&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;v, image&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;, c&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            diff_data.&lt;span style=&quot;color: black;&quot;&gt;sort&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;
            searched&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;char&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt; = diff_data&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;:remember_number&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; char,
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;for&lt;/span&gt; item &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;in&lt;/span&gt; searched&lt;span style=&quot;color: black;&quot;&gt;&amp;#91;&lt;/span&gt;char&lt;span style=&quot;color: black;&quot;&gt;&amp;#93;&lt;/span&gt;:
            &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt; u&lt;span style=&quot;color: #483d8b;&quot;&gt;'({0}, {1})'&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;format&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #66cc66;&quot;&gt;*&lt;/span&gt;item&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;,
        &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt;
    &lt;span style=&quot;color: #ff7700;font-weight:bold;&quot;&gt;print&lt;/span&gt;
&amp;nbsp;
&lt;span style=&quot;color: #dc143c;&quot;&gt;marshal&lt;/span&gt;.&lt;span style=&quot;color: black;&quot;&gt;dump&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;searched, &lt;span style=&quot;color: #008000;&quot;&gt;open&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#40;&lt;/span&gt;&lt;span style=&quot;color: #483d8b;&quot;&gt;'searched_chars'&lt;/span&gt;, &lt;span style=&quot;color: #483d8b;&quot;&gt;'wb'&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;span style=&quot;color: black;&quot;&gt;&amp;#41;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

&lt;p&gt;和上次不同的是查找过的字会被保存下来，效率可以高一些……&lt;/p&gt;
&lt;h3&gt;继续改进&lt;/h3&gt;
&lt;p&gt;现在的主要问题就是如何提高相似度的识别精度了……目前的想法是通过逐像素比对测试两个字的相似度，最多加一些模糊化什么的处理。doggy 提出一个想法是计算连通区域面积的比例，我个人认为不大可行……我的想法是识别文字的笔画，把文字的骨架弄出来，然后对比什么的，可能效果更好吧？&lt;/p&gt;
&lt;p&gt;不知道各位还有没有其他什么想法？&lt;/p&gt;
&lt;h3&gt;下载&lt;/h3&gt;
&lt;p&gt;最后是完整版的目前的程序以及已经生成的数据，各位有兴趣可以直接拿来试用了……&lt;a href=&quot;http://down.upsuper.org/find-similar-character.tar.bz2&quot;&gt;find-similar-character.tar.bz2&lt;/a&gt; (1.7MB)&lt;/p&gt;
&lt;h3&gt;参考资料&lt;/h3&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://www.pkucn.com/viewthread.php?tid=202692&quot;&gt;我想把simsun.ttf里的12号点阵字体单独提取出来做成一个ttf &amp;#8211; 北大中文论坛&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://en.wikipedia.org/wiki/Glyph_Bitmap_Distribution_Format&quot;&gt;Glyph Bitmap Distribution Format &amp;#8211; Wikipedia&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.adobe.com/devnet/font/pdfs/5005.BDF_Spec.pdf&quot;&gt;Glyph Bitmap Distribution Format (BDF) Specification &amp;#8211; Adobe Developer Support&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://docs.python.org/library/marshal.html&quot;&gt;marshal — Internal Python object serialization &amp;#8211; Python documentation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src=&quot;http://www1.feedsky.com/t1/567679130/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679130/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</content:encoded><wfw:commentRss>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/feed/</wfw:commentRss><slash:comments>1</slash:comments><description>继上一篇文章之后，我又下大力气对这个程序做了许多修改，在精确度和速度方面似乎都有些许提高。在此推出第二季~ 使用真正的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 [...]&lt;img src=&quot;http://www1.feedsky.com/t1/567679130/upsuper/feedsky/s.gif?r=http://item.feedsky.com/~feedsky/upsuper/~8088065/567679130/5141978/1/item.html&quot; border=&quot;0&quot; height=&quot;0&quot; width=&quot;0&quot; style=&quot;position:absolute&quot; /&gt;</description><category>小程序</category><category>贴吧</category><category>Python</category><pubDate>Sat, 11 Sep 2010 15:31:17 +0800</pubDate><author>upsuper</author><comments>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/#comments</comments><guid isPermaLink="false">http://blog.upsuper.org/?p=1172</guid><dc:creator>upsuper</dc:creator><fs:srclink>http://blog.upsuper.org/finding-higher-imitation-of-id-second-season/</fs:srclink><fs:srcfeed>http://blog.upsuper.org/feed/</fs:srcfeed><fs:itemid>feedsky/upsuper/~8088065/567679130/5141978</fs:itemid></item></channel></rss>
