<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom"><title>GumboGumble</title><link href="/" rel="alternate"></link><link href="/feeds/all.atom.xml" rel="self"></link><id>/</id><updated>2018-10-24T22:42:00+08:00</updated><entry><title>如何加快 sort 的排序速度</title><link href="/fast-sort.html" rel="alternate"></link><published>2018-10-24T22:42:00+08:00</published><updated>2018-10-24T22:42:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-10-24:/fast-sort.html</id><summary type="html">&lt;p&gt;GNU sort 工具是我们经常用来对文本文件进行排序或去重的工具。sort 默认的参数可能并不适合排序上 G 的大文件。我们来看一下经常被忽略的 GNU sort 单文件排序优化策略。&lt;/p&gt;
&lt;p&gt;例如，我们有一个 100G 的 data.csv 文件，要按第一列的编号排序。命令如下：&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;env LC_ALL=C sort &lt;span class="pre"&gt;-S&lt;/span&gt; 60% &lt;span class="pre"&gt;-k&lt;/span&gt; 1n,1n &lt;span class="pre"&gt;-t,&lt;/span&gt; &lt;span class="pre"&gt;--parallel=4&lt;/span&gt; &lt;span class="pre"&gt;--compress-program=pzstd&lt;/span&gt; &lt;span class="pre"&gt;-o&lt;/span&gt; data_sorted.csv data.csv&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;env LC_ALL=C&lt;/tt&gt; 指定 sort 按照字节排序，无视内容的语言和编码。在不同的语言环境下，sort 会根据该语言的特点进行字典序的比较 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;GNU sort 工具是我们经常用来对文本文件进行排序或去重的工具。sort 默认的参数可能并不适合排序上 G 的大文件。我们来看一下经常被忽略的 GNU sort 单文件排序优化策略。&lt;/p&gt;
&lt;p&gt;例如，我们有一个 100G 的 data.csv 文件，要按第一列的编号排序。命令如下：&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;env LC_ALL=C sort &lt;span class="pre"&gt;-S&lt;/span&gt; 60% &lt;span class="pre"&gt;-k&lt;/span&gt; 1n,1n &lt;span class="pre"&gt;-t,&lt;/span&gt; &lt;span class="pre"&gt;--parallel=4&lt;/span&gt; &lt;span class="pre"&gt;--compress-program=pzstd&lt;/span&gt; &lt;span class="pre"&gt;-o&lt;/span&gt; data_sorted.csv data.csv&lt;/tt&gt;&lt;/p&gt;
&lt;p&gt;其中：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;env LC_ALL=C&lt;/tt&gt; 指定 sort 按照字节排序，无视内容的语言和编码。在不同的语言环境下，sort 会根据该语言的特点进行字典序的比较，减慢了运行速度，而我们通常不需要这样的比较。如 zh_CN.UTF-8 下，sort 结果会按汉语拼音排序。如果内容是 UTF-8 编码，因为其编码特性，直接按字节排序会得到和 Unicode 码位顺序相同的结果，所以也不必指定 &lt;tt class="docutils literal"&gt;env &lt;span class="pre"&gt;LC_ALL=C.UTF-8&lt;/span&gt;&lt;/tt&gt; 之类的环境。 &lt;a class="footnote-reference" href="#id2" id="id1"&gt;[1]&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-S&lt;/span&gt; 60%&lt;/tt&gt;，--buffer-size，使用 60% 的内存，也可以指定 8G 这样的内存使用量。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-k&lt;/span&gt; 1n,1n&lt;/tt&gt;，--key，使用第一列按数字顺序排序。指定 &lt;tt class="docutils literal"&gt;1n,1n&lt;/tt&gt; 而不是 &lt;tt class="docutils literal"&gt;1n&lt;/tt&gt; 是由于 &lt;tt class="docutils literal"&gt;1n&lt;/tt&gt; 实际上是指第一列到最后一列，&lt;tt class="docutils literal"&gt;1n,1n&lt;/tt&gt; 才是只考虑第一列。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-t,&lt;/span&gt;&lt;/tt&gt;，--field-separator，用逗号分隔。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--parallel=4&lt;/span&gt;&lt;/tt&gt;，用四个 CPU 并行。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;--compress-program=pzstd&lt;/span&gt;&lt;/tt&gt;，用 pzstd 压缩中间结果，以免浪费临时文件写入时间。pzstd 是一个高效的压缩软件，也可以尝试 lz4、lzop、gzip 等较快的压缩工具。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;还可以尝试的选项：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-T&lt;/span&gt;&lt;/tt&gt;，--temporary-directory 选项也可以使用，将临时目录指定在较快的固态硬盘分区，或避免 /tmp 存不下临时数据。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-u&lt;/span&gt;&lt;/tt&gt;，--unique，去除重复行。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;若要不排序去除重复行，安装 &lt;a class="reference external" href="https://www.gnu.org/software/datamash/"&gt;GNU datamash&lt;/a&gt;，使用 &lt;tt class="docutils literal"&gt;datamash rmdup 1&lt;/tt&gt;；如果没有，则可以利用 &lt;tt class="docutils literal"&gt;awk &lt;span class="pre"&gt;'!seen[$0]++'&lt;/span&gt;&lt;/tt&gt; （用 mawk 可提高速度）。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id2" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="http://utf8everywhere.org/zh-cn#facts"&gt;http://utf8everywhere.org/zh-cn#facts&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="电脑技术"></category><category term="GNU工具"></category></entry><entry><title>通用密码字典（第四版）</title><link href="/newdictv4.html" rel="alternate"></link><published>2018-02-14T10:37:00+08:00</published><updated>2018-02-14T10:37:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-02-14:/newdictv4.html</id><content type="html">&lt;p&gt;跟&lt;a class="reference external" href="/newdictv3.html"&gt;之前&lt;/a&gt;一样，使用 zxcvbn 排序。这次采用 &lt;a class="reference external" href="https://github.com/tsyrogit/zxcvbn-c"&gt;zxcvbn-c&lt;/a&gt; 的实现，去除了仅大小写不同的密码，其他做法不变。&lt;/p&gt;
&lt;p&gt;6.9G，700240131 行，ASCII 编码，LF 行尾。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mega.nz/#!txN3kJhb!2XituXIoBtSyRG-ue3B8vlJvhdUTiLrosse_utr2M7c"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：密码字典没有版权。作者不承担因使用造成的任何后果。&lt;/p&gt;
</content><category term="电脑技术"></category><category term="密码"></category></entry><entry><title>SQLite 扩展应用</title><link href="/sqlite-ext.html" rel="alternate"></link><published>2018-02-11T16:05:00+08:00</published><updated>2018-02-11T16:05:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-02-11:/sqlite-ext.html</id><summary type="html">&lt;p&gt;SQLite 根据作者的说法，它不是要跟 PostgreSQL/Oracle/MSSQL/MySQL 比，而是要取代 fopen()，让应用开发者不用自己考虑文件格式的解析和序列化。我们来看看 SQLite 中比较少注意到的功能。&lt;/p&gt;
&lt;div class="section" id="pragma"&gt;
&lt;h2&gt;PRAGMA&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA journal_mode=WAL&lt;/tt&gt;。本地数据库可以用 WAL 模式加快读写速度，减少多进程冲突。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA &lt;span class="pre"&gt;cache_size=-kibibytes&lt;/span&gt;&lt;/tt&gt;，加大你的缓存。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA application_id&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;PRAGMA user_version&lt;/tt&gt;，让程序给自己的数据库标上识别码和版本号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;权限机制&lt;/h2&gt;
&lt;p&gt;SQLite 有一个很简单的权限系统，能对 SQL 虚拟机的操作指令设置回调 &lt;a class="footnote-reference" href="#id5" id="id2"&gt;[1]&lt;/a&gt;，来判断是否允许操作。拿 Python 举例 &lt;a class="footnote-reference" href="#id6" id="id3"&gt;[2]&lt;/a&gt;，例如我们要仅允许只读操作。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;SQLITE_FUNCTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;

&lt;span class="k"&gt;def …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;SQLite 根据作者的说法，它不是要跟 PostgreSQL/Oracle/MSSQL/MySQL 比，而是要取代 fopen()，让应用开发者不用自己考虑文件格式的解析和序列化。我们来看看 SQLite 中比较少注意到的功能。&lt;/p&gt;
&lt;div class="section" id="pragma"&gt;
&lt;h2&gt;PRAGMA&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA journal_mode=WAL&lt;/tt&gt;。本地数据库可以用 WAL 模式加快读写速度，减少多进程冲突。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA &lt;span class="pre"&gt;cache_size=-kibibytes&lt;/span&gt;&lt;/tt&gt;，加大你的缓存。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;PRAGMA application_id&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;PRAGMA user_version&lt;/tt&gt;，让程序给自己的数据库标上识别码和版本号。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;权限机制&lt;/h2&gt;
&lt;p&gt;SQLite 有一个很简单的权限系统，能对 SQL 虚拟机的操作指令设置回调 &lt;a class="footnote-reference" href="#id5" id="id2"&gt;[1]&lt;/a&gt;，来判断是否允许操作。拿 Python 举例 &lt;a class="footnote-reference" href="#id6" id="id3"&gt;[2]&lt;/a&gt;，例如我们要仅允许只读操作。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sqlite3&lt;/span&gt;

&lt;span class="n"&gt;SQLITE_FUNCTION&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;31&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;sql_auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqltype&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;arg2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;dbname&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;source&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;sqltype&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQLITE_READ&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQLITE_SELECT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;SQLITE_FUNCTION&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQLITE_OK&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;SQLITE_DENY&lt;/span&gt;


&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;some.db&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_authorizer&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sql_auth&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="c1"&gt;# ...&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;这里就只允许 READ、SELECT 和 FUNCTION 操作。Python 3.7 及以上版本的标准库才包含了 SQLITE_FUNCTION 等新定义的常数，所以先手动定义。&lt;a class="footnote-reference" href="#id7" id="id4"&gt;[3]&lt;/a&gt; 具体操作代码参见 &lt;a class="reference external" href="https://www.sqlite.org/c3ref/c_alter_table.html"&gt;SQLite 文档&lt;/a&gt;。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id5" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id2"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://www.sqlite.org/c3ref/set_authorizer.html"&gt;https://www.sqlite.org/c3ref/set_authorizer.html&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id6" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.set_authorizer"&gt;https://docs.python.org/3/library/sqlite3.html#sqlite3.Connection.set_authorizer&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id7" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id4"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://bugs.python.org/issue28985"&gt;https://bugs.python.org/issue28985&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id8"&gt;
&lt;h2&gt;自定义函数、集合函数、排序规则&lt;/h2&gt;
&lt;p&gt;这个功能在 SQLite 中可能更有用一点。比如你可以把三角函数、统计函数等引入 SQLite，甚至加入版本比较。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;sqlite3&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;statistics&lt;/span&gt;
&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;distutils.version&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;LooseVersion&lt;/span&gt;

&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;MedianAgg&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="fm"&gt;__init__&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;step&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;value&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;finalize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="n"&gt;statistics&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;median&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;data&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;

&lt;span class="nb"&gt;cmp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="n"&gt;vercomp&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="nb"&gt;cmp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;LooseVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;a&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="n"&gt;LooseVersion&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;b&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;

&lt;span class="n"&gt;conn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;sqlite3&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;connect&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;:memory:&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;sin&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;sin&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;pi&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;math&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;pi&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_aggregate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;median&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;MedianAgg&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;create_collation&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;vercomp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;vercomp&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;conn&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;cursor&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;

&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SELECT sin(pi()/2)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# 1.0&lt;/span&gt;

&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;CREATE TABLE test(i INTEGER PRIMARY KEY, ver TEXT)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;INSERT INTO test VALUES (1, &amp;#39;1.1.3&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;INSERT INTO test VALUES (2, &amp;#39;1.10.1&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;INSERT INTO test VALUES (3, &amp;#39;10.1&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;INSERT INTO test VALUES (5, &amp;#39;2.4&amp;#39;)&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SELECT median(i) FROM test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchone&lt;/span&gt;&lt;span class="p"&gt;()[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
&lt;span class="c1"&gt;# 2.5&lt;/span&gt;

&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;execute&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;SELECT ver FROM test ORDER BY ver COLLATE vercomp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cur&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;fetchall&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="c1"&gt;# [(&amp;#39;1.1.3&amp;#39;,), (&amp;#39;1.10.1&amp;#39;,), (&amp;#39;2.4&amp;#39;,), (&amp;#39;10.1&amp;#39;,)]&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id9"&gt;
&lt;h2&gt;扩展模块&lt;/h2&gt;
&lt;p&gt;扩展模块能把自定义函数、虚表之类的实现封装在一个动态库（.so/.dll）中，灵活地扩展 SQLite 的功能。除了有加载 CSV、Zip 文件的扩展之外，还有像 &lt;a class="reference external" href="https://www.gaia-gis.it/fossil/libspatialite/index"&gt;SpatiaLite&lt;/a&gt; 这种库。它实现了一套地理信息处理工具，能处理坐标系的映射、点线面之间的运算等，使 SQLite 数据库可以作为地理信息交换的一种格式。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id10"&gt;
&lt;h2&gt;其他&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;使劲加索引，索引要尽量能唯一索引到数据。性能问题通常都是索引不足引起的。&lt;tt class="docutils literal"&gt;PRIMARY KEY&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;UNIQUE&lt;/tt&gt; 约束会自动加唯一索引。SQLite 号称能储存 2T 数据，要处理大量数据还是得加索引。&lt;/li&gt;
&lt;li&gt;大事务操作，例如 &lt;tt class="docutils literal"&gt;VACUUM&lt;/tt&gt;，需要很大的临时空间。这个临时空间通常是系统临时空间，例如 /tmp，或 &lt;tt class="docutils literal"&gt;TMPDIR&lt;/tt&gt; 环境变量指定的。临时空间不足可能会导致即使数据库所在的文件系统还有空间却显示磁盘已满。&lt;/li&gt;
&lt;li&gt;用 sqlite3 命令行的 &lt;tt class="docutils literal"&gt;.backup&lt;/tt&gt; 在线备份数据库，不要直接复制。直接复制也要把 -journal、-wal 和 -shm 带上。&lt;/li&gt;
&lt;li&gt;SQLite 不检查数据类型，一列可以储存任意数据类型。&lt;/li&gt;
&lt;li&gt;INTEGER PRIMARY KEY 就是 ROWID。尽量不要使用 AUTOINCREMENT 关键字，会变慢。AUTOINCREMENT 是用于防止删除的行号被重用。&lt;/li&gt;
&lt;li&gt;除了 INTEGER PRIMARY KEY 和 WITHOUT ROWID 表，其他主键都可以为 NULL。&lt;/li&gt;
&lt;li&gt;SQLite 还有 json 支持、fts3/4/5 全文搜索模块。&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id11"&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;SQLite 是用于客户端的数据库系统，可以作为一种程序自定义的数据交换格式。通过加入扩展函数和模块，可以用 SQLite 完成更复杂的数据处理，用 SQL 的高度抽象来减少程序代码。&lt;/p&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="SQLite"></category></entry><entry><title>CSV 转 SQL：又一个轮子</title><link href="/csv2sql.html" rel="alternate"></link><published>2018-02-08T23:54:00+08:00</published><updated>2018-02-08T23:54:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-02-08:/csv2sql.html</id><content type="html">&lt;p&gt;这种轮子多了去了。这次的轮子功能有：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;自动判别类型。你数据里有 NULL 值，某列前几行都是数字后面出现文本，严格区分大小整数和浮点数，这些我们都考虑了。&lt;/li&gt;
&lt;li&gt;生成 &lt;tt class="docutils literal"&gt;CREATE TABLE&lt;/tt&gt;。不对自己改。&lt;/li&gt;
&lt;li&gt;非标准 CSV。这种文件太多了，得给每种格式来个选项。&lt;/li&gt;
&lt;li&gt;几何类型。识别 Well Known Text，通用的地理图形记法。&lt;/li&gt;
&lt;li&gt;没有外部依赖。为啥识别个数字类型还要装 Pandas？&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="https://github.com/The-Orizon/nlputils/blob/master/csvsql.py"&gt;https://github.com/The-Orizon/nlputils/blob/master/csvsql.py&lt;/a&gt;&lt;/p&gt;
</content><category term="作品发布"></category><category term="Python"></category><category term="SQL"></category></entry><entry><title>为什么不用 LaTeX</title><link href="/why-not-latex.html" rel="alternate"></link><published>2018-02-08T22:26:00+08:00</published><updated>2018-02-08T22:26:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-02-08:/why-not-latex.html</id><summary type="html">&lt;p&gt;8102 年了，为什么还要用 LaTeX 呢？LaTeX 没有：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;良好的设计。混乱的宏定义名称、包名称、语法，读不懂的错误信息。你猜不出你要用的命令到底叫什么、在哪个包，也没有命名空间的约定。&lt;/li&gt;
&lt;li&gt;文档。它唯一的官方文档是一本书，没有电子版，也没有多少能用的索引，有些命令还没有提到。常见问题分散在各大论坛、问答网站，而不是加进官方文档。每个包的文档不统一，还得用难用的 PDF 搜索功能。&lt;/li&gt;
&lt;li&gt;更新。没有新增和删减功能，都是靠包来凑。&lt;/li&gt;
&lt;li&gt;国际化支持。别跟我说 Xe/Lua/PdfLaTeX 之类的扩展实现，LaTeX 设计上就是没有的，也常常会遇到外部扩展不支持国际化的问题。它是在 Unicode 标准建立之前设计的，却从来没有官方更新支持国际化和 Unicode。除了拉丁文字，其他文字的特有排版样式，像是中文竖排，也是没有的。&lt;/li&gt;
&lt;li&gt;排版样式。你就只见到过那几种排版 …&lt;/li&gt;&lt;/ul&gt;</summary><content type="html">&lt;p&gt;8102 年了，为什么还要用 LaTeX 呢？LaTeX 没有：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;良好的设计。混乱的宏定义名称、包名称、语法，读不懂的错误信息。你猜不出你要用的命令到底叫什么、在哪个包，也没有命名空间的约定。&lt;/li&gt;
&lt;li&gt;文档。它唯一的官方文档是一本书，没有电子版，也没有多少能用的索引，有些命令还没有提到。常见问题分散在各大论坛、问答网站，而不是加进官方文档。每个包的文档不统一，还得用难用的 PDF 搜索功能。&lt;/li&gt;
&lt;li&gt;更新。没有新增和删减功能，都是靠包来凑。&lt;/li&gt;
&lt;li&gt;国际化支持。别跟我说 Xe/Lua/PdfLaTeX 之类的扩展实现，LaTeX 设计上就是没有的，也常常会遇到外部扩展不支持国际化的问题。它是在 Unicode 标准建立之前设计的，却从来没有官方更新支持国际化和 Unicode。除了拉丁文字，其他文字的特有排版样式，像是中文竖排，也是没有的。&lt;/li&gt;
&lt;li&gt;排版样式。你就只见到过那几种排版，没多少人会写一个新的版式。如果你要稍微调一下什么东西的位置、大小，那对不起，打字五分钟，排版两小时。&lt;/li&gt;
&lt;li&gt;所见即所得。编辑器只是隔多少时间编译一次，并没有增量编译的方法。没有简单的办法检查你写的对不对。&lt;/li&gt;
&lt;li&gt;文字和样式分离。你在写文章的时候，如果预览没有像想像中那样好，你还是得加点奇怪的代码进去调整，更不用说插入表格。最后你的文字飘到天边，文章塞满了各种命令，就会觉得 HTML+CSS 也比这个强。&lt;/li&gt;
&lt;li&gt;结构化文档。文档没有统一的元数据规范，没法简单地解析文档每一部分的语义，更难转成其他标记语言，或者进行索引。有的正文是包含在排版命令中的，无法区分正文和排版标记。那些元数据都是用命令打上去的，实际上不还一样是排版命令吗？&lt;/li&gt;
&lt;li&gt;可读性。当排版命令一多就看得眼花缭乱。其他编程语言和标记语言可以自动给源代码排版，LaTeX 根本没有这种选项。&lt;/li&gt;
&lt;li&gt;效率。有&lt;a class="reference external" href="http://journals.plos.org/plosone/article?id=10.1371/journal.pone.0115069"&gt;研究&lt;/a&gt;表明，用 Word 写文档的人平均比用 LaTeX 的更高效、更少出错。文档需要 &lt;tt class="docutils literal"&gt;\begin{document}&lt;/tt&gt; 这种模板字样才能编译。修正排版错误比起其他标记语言更为低效。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;当然，LaTeX 可以用作公式生成器和 PDF 文档生成器。但写作一般文档，直接用 LaTeX 是浪费时间。要所见即所得，用常用办公软件套装的文字处理。要文字样式分离，用 HTML/XML/Markdown/reStructedText 之类的标记语言，用好办公软件的样式表功能也能做到。要专业排版、设计版面，还是得用专业排版软件。&lt;/p&gt;
</content><category term="电脑技术"></category><category term="LaTeX"></category></entry><entry><title>PostgeSQL 实现相邻分组</title><link href="/postgresql-uniq.html" rel="alternate"></link><published>2018-01-31T15:15:00+08:00</published><updated>2018-01-31T15:15:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-01-31:/postgresql-uniq.html</id><summary type="html">&lt;div class="section" id="id1"&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;比如我们有以下数据：&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="18%" /&gt;
&lt;col width="55%" /&gt;
&lt;col width="27%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;id&lt;/th&gt;
&lt;th class="head"&gt;status&lt;/th&gt;
&lt;th class="head"&gt;num&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;6.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;6.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="id1"&gt;
&lt;h2&gt;问题&lt;/h2&gt;
&lt;p&gt;比如我们有以下数据：&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="18%" /&gt;
&lt;col width="55%" /&gt;
&lt;col width="27%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;id&lt;/th&gt;
&lt;th class="head"&gt;status&lt;/th&gt;
&lt;th class="head"&gt;num&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.1&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;2.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;7.4&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;6.8&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;9.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;td&gt;8.9&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;7.2&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;td&gt;6.6&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;td&gt;3.0&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt; &lt;span class="nb"&gt;DOUBLE PRECISION&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3.1&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;2.6&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;7.4&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;6.8&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;9.2&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;8.9&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;7.2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;6.6&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mf"&gt;3.0&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;假设上表是某种传感器每隔一定时间记录一次状态（&lt;tt class="docutils literal"&gt;status&lt;/tt&gt;）和数值（&lt;tt class="docutils literal"&gt;num&lt;/tt&gt;）。问，每次处于一种状态的时候，这个数值的平均是多少，这段状态对应的 &lt;tt class="docutils literal"&gt;id&lt;/tt&gt; 范围是多少。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;分析&lt;/h2&gt;
&lt;p&gt;这个问题用各种编程语言都很好做。如果只要求每次出现的状态列表，用 &lt;tt class="docutils literal"&gt;uniq&lt;/tt&gt; 命令就能完成。但是，如果用 SQL 的 GROUP BY event，会把 a b c 就分为三组，无法求得每次的状态切换。&lt;/p&gt;
&lt;p&gt;PostgreSQL 以及很多数据库引擎都支持&lt;a class="reference external" href="https://www.postgresql.org/docs/10/static/tutorial-window.html"&gt;窗口函数&lt;/a&gt;，长得像 &lt;tt class="docutils literal"&gt;function(column) OVER (PARTITION BY ... ORDER BY &lt;span class="pre"&gt;...)&lt;/span&gt;&lt;/tt&gt;，可以不把数据合在一起实现类似 GROUP BY 的操作。&lt;/p&gt;
&lt;p&gt;例如，求每种状态的平均数值而不合并结果：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status |  avg
----+--------+-------
  1 | a      | 2.975
  2 | a      | 2.975
  3 | a      | 2.975
  4 | b      |     7
  5 | b      |     7
  6 | c      |  9.05
  7 | c      |  9.05
  8 | b      |     7
  9 | b      |     7
 10 | a      | 2.975
(10 行记录)
&lt;/pre&gt;
&lt;p&gt;例如，把每种状态的数值逐个累加：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status | sum
----+--------+------
  1 | a      |  3.1
  2 | a      |  5.7
  3 | a      |  8.9
  4 | b      |  7.4
  5 | b      | 14.2
  6 | c      |  9.2
  7 | c      | 18.1
  8 | b      | 21.4
  9 | b      |   28
 10 | a      | 11.9
(10 行记录)
&lt;/pre&gt;
&lt;p&gt;所以我们看到，要把每次的相同状态分出组来，需要加一个分组依据，那就给每次的状态编上号。要把每次的状态编上号，先找出切换状态的那几行。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt;
    &lt;span class="n"&gt;lag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_changed&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status | num | status_changed
----+--------+-----+----------------
  1 | a      | 3.1 | t
  2 | a      | 2.6 | f
  3 | a      | 3.2 | f
  4 | b      | 7.4 | t
  5 | b      | 6.8 | f
  6 | c      | 9.2 | t
  7 | c      | 8.9 | f
  8 | b      | 7.2 | t
  9 | b      | 6.6 | f
 10 | a      |   3 | t
(10 行记录)
&lt;/pre&gt;
&lt;p&gt;然后通过 sum 对这个 status_changed 求和（TRUE 就是 1，FALSE 就是 0，PostgreSQL 需要显式类型转换）。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
  &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_changed&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt;
      &lt;span class="n"&gt;lag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_changed&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status | num | status_no
----+--------+-----+-----------
  1 | a      | 3.1 |         1
  2 | a      | 2.6 |         1
  3 | a      | 3.2 |         1
  4 | b      | 7.4 |         2
  5 | b      | 6.8 |         2
  6 | c      | 9.2 |         3
  7 | c      | 8.9 |         3
  8 | b      | 7.2 |         4
  9 | b      | 6.6 |         4
 10 | a      |   3 |         5
(10 行记录)
&lt;/pre&gt;
&lt;p&gt;然后按 &lt;tt class="docutils literal"&gt;status_no&lt;/tt&gt; 分组就可以了。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;min&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;id_first&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;id_last&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;avg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;num_avg&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt;
    &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="n"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status_changed&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="nb"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
    &lt;span class="k"&gt;SELECT&lt;/span&gt;
      &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
      &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="k"&gt;IS&lt;/span&gt; &lt;span class="k"&gt;DISTINCT&lt;/span&gt; &lt;span class="k"&gt;FROM&lt;/span&gt;
        &lt;span class="n"&gt;lag&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_changed&lt;/span&gt;
    &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor&lt;/span&gt;
  &lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q2&lt;/span&gt;
&lt;span class="k"&gt;GROUP&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id_first&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id_first | id_last | status |     num_avg
----------+---------+--------+------------------
        1 |       3 | a      | 2.96666666666667
        4 |       5 | b      |              7.1
        6 |       7 | c      |             9.05
        8 |       9 | b      |              6.9
       10 |      10 | a      |                3
(5 行记录)
&lt;/pre&gt;
&lt;p&gt;当然，如果需要每组中第一个和最后一个其他类型的值，而不是最大和最小，可以用 &lt;tt class="docutils literal"&gt;first_value&lt;/tt&gt; 和
&lt;tt class="docutils literal"&gt;last_value&lt;/tt&gt; 窗口函数。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;扩展应用&lt;/h2&gt;
&lt;p&gt;比如这个表：&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;colgroup&gt;
&lt;col width="25%" /&gt;
&lt;col width="75%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;id&lt;/th&gt;
&lt;th class="head"&gt;status&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;1&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;2&lt;/td&gt;
&lt;td&gt;[NULL]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;3&lt;/td&gt;
&lt;td&gt;[NULL]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;4&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;5&lt;/td&gt;
&lt;td&gt;[NULL]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;6&lt;/td&gt;
&lt;td&gt;c&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;7&lt;/td&gt;
&lt;td&gt;[NULL]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;8&lt;/td&gt;
&lt;td&gt;b&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;9&lt;/td&gt;
&lt;td&gt;[NULL]&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;10&lt;/td&gt;
&lt;td&gt;a&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;CREATE&lt;/span&gt; &lt;span class="k"&gt;TABLE&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;id&lt;/span&gt; &lt;span class="nb"&gt;INTEGER&lt;/span&gt; &lt;span class="k"&gt;PRIMARY&lt;/span&gt; &lt;span class="k"&gt;KEY&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt; &lt;span class="nb"&gt;TEXT&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;2&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;3&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;5&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;6&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;c&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;7&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;8&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;b&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;9&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="k"&gt;NULL&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;span class="k"&gt;INSERT&lt;/span&gt; &lt;span class="k"&gt;INTO&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="k"&gt;VALUES&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mf"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;a&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;我们要拿上一行的数据填充 NULL 值。&lt;/p&gt;
&lt;p&gt;首先对 status 分组编号：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status | status_no
----+--------+-----------
  1 | a      |         1
  2 |        |         1
  3 |        |         1
  4 | b      |         2
  5 |        |         2
  6 | c      |         3
  7 |        |         3
  8 | b      |         4
  9 |        |         4
 10 | a      |         5
(10 行记录)
&lt;/pre&gt;
&lt;p&gt;然后就能给 status 填上之前的值：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="k"&gt;SELECT&lt;/span&gt;
  &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;first_value&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;PARTITION&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt; &lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;
&lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;
  &lt;span class="k"&gt;SELECT&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;count&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;status&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;OVER&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;status_no&lt;/span&gt;
  &lt;span class="k"&gt;FROM&lt;/span&gt; &lt;span class="n"&gt;sensor2&lt;/span&gt;
&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;q1&lt;/span&gt;
&lt;span class="k"&gt;ORDER&lt;/span&gt; &lt;span class="k"&gt;BY&lt;/span&gt; &lt;span class="n"&gt;id&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;pre class="literal-block"&gt;
 id | status
----+--------
  1 | a
  2 | a
  3 | a
  4 | b
  5 | b
  6 | c
  7 | c
  8 | b
  9 | b
 10 | a
(10 行记录)
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;总结&lt;/h2&gt;
&lt;p&gt;通过窗口函数的扩展，我们可以利用 SQL 按顺序分组处理数据，实现类似 &lt;tt class="docutils literal"&gt;sed&lt;/tt&gt;、&lt;tt class="docutils literal"&gt;awk&lt;/tt&gt;、&lt;tt class="docutils literal"&gt;uniq&lt;/tt&gt; 工具的功能，达到更高效地分析数据的目的。&lt;/p&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="PostgeSQL"></category></entry><entry><title>《我喜欢》等5份乐谱</title><link href="/sheet-music.html" rel="alternate"></link><published>2018-01-30T15:30:00+08:00</published><updated>2018-01-30T15:30:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2018-01-30:/sheet-music.html</id><summary type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;《我喜欢》&lt;/h2&gt;
&lt;p&gt;上海彩虹室内合唱团《&lt;a class="reference external" href="https://www.youtube.com/watch?v=npPrO-xLnuE"&gt;我喜欢&lt;/a&gt;》合唱版。根据官方“翻唱套餐”提供的钢琴谱，听记合唱部分。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/我喜欢.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/我喜欢.mscz"&gt;MuseScore&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="nuit-silencieuse"&gt;
&lt;h2&gt;Nuit Silencieuse&lt;/h2&gt;
&lt;p&gt;游戏《高考恋爱100天》背景音乐第 12 首 &lt;em&gt;Nuit Silencieuse&lt;/em&gt;，钢琴曲。根据游戏资源中的背景音乐记谱，不是官方提供的“原声音乐集”，这两者有区别。游戏资源的提取见：&lt;a class="reference external" href="https://github.com/gumblex/extract-gk100d"&gt;https://github.com/gumblex/extract-gk100d&lt;/a&gt;，实现了 data.xp3 的提取。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/Nuit_Silencieuse.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/Nuit_Silencieuse.mscz"&gt;MuseScore&lt;/a&gt;,
&lt;a class="reference external" href="https://musescore.com/user/13296416/scores/4558986"&gt;MuseScore 在线试听&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mare-d-inverno"&gt;
&lt;h2&gt;Mare d'inverno&lt;/h2&gt;
&lt;p&gt;Walter Mazzaccaro 专辑 &lt;a class="reference external" href="https://archive.org/details/jamendo-069247"&gt;Sulla strada del ritorno&lt;/a&gt; 第 6 首 …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;《我喜欢》&lt;/h2&gt;
&lt;p&gt;上海彩虹室内合唱团《&lt;a class="reference external" href="https://www.youtube.com/watch?v=npPrO-xLnuE"&gt;我喜欢&lt;/a&gt;》合唱版。根据官方“翻唱套餐”提供的钢琴谱，听记合唱部分。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/我喜欢.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/我喜欢.mscz"&gt;MuseScore&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="nuit-silencieuse"&gt;
&lt;h2&gt;Nuit Silencieuse&lt;/h2&gt;
&lt;p&gt;游戏《高考恋爱100天》背景音乐第 12 首 &lt;em&gt;Nuit Silencieuse&lt;/em&gt;，钢琴曲。根据游戏资源中的背景音乐记谱，不是官方提供的“原声音乐集”，这两者有区别。游戏资源的提取见：&lt;a class="reference external" href="https://github.com/gumblex/extract-gk100d"&gt;https://github.com/gumblex/extract-gk100d&lt;/a&gt;，实现了 data.xp3 的提取。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/Nuit_Silencieuse.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/Nuit_Silencieuse.mscz"&gt;MuseScore&lt;/a&gt;,
&lt;a class="reference external" href="https://musescore.com/user/13296416/scores/4558986"&gt;MuseScore 在线试听&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="mare-d-inverno"&gt;
&lt;h2&gt;Mare d'inverno&lt;/h2&gt;
&lt;p&gt;Walter Mazzaccaro 专辑 &lt;a class="reference external" href="https://archive.org/details/jamendo-069247"&gt;Sulla strada del ritorno&lt;/a&gt; 第 6 首 &lt;em&gt;Mare d'inverno&lt;/em&gt;，钢琴曲。根据音频记谱。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/Mare_dinverno.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/Mare_dinverno.mscz"&gt;MuseScore&lt;/a&gt;,
&lt;a class="reference external" href="https://musescore.com/user/13296416/scores/4558991"&gt;MuseScore 在线试听&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;《国际歌》&lt;/h2&gt;
&lt;p&gt;中文合唱版，根据网上版本编配。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/国际歌.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/国际歌.mscz"&gt;MuseScore&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;《北京东路的日子》&lt;/h2&gt;
&lt;p&gt;钢琴伴奏，根据网上两个版本的谱子以及原唱钢琴伴奏编配。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/北京东路的日子.pdf"&gt;PDF&lt;/a&gt;, &lt;a class="reference external" href="/static/北京东路的日子.mscz"&gt;MuseScore&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="作品发布"></category><category term="MuseScore"></category></entry><entry><title>用 FUSE 挂载 HTTP 文件目录</title><link href="/rehttpfs.html" rel="alternate"></link><published>2017-03-11T10:34:00+08:00</published><updated>2017-03-11T10:34:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2017-03-11:/rehttpfs.html</id><summary type="html">&lt;p&gt;Apache、nginx 等服务器软件都有生成文件目录的功能。这类目录通常只考虑到人类的可读性，给机读带来很大困难。之前有解析目录列表的一些实现 &lt;a class="footnote-reference" href="#id7" id="id1"&gt;[1]&lt;/a&gt; &lt;a class="footnote-reference" href="#id8" id="id2"&gt;[2]&lt;/a&gt;，但不能覆盖大多数情况。为了之前挖的坑（实现自动获取软件更新信息） &lt;a class="footnote-reference" href="#id9" id="id3"&gt;[3]&lt;/a&gt;，我实现了一个能解析大部分文件目录的程序「&lt;a class="reference external" href="https://github.com/gumblex/htmllisting-parser"&gt;htmllisting-parser&lt;/a&gt;」。&lt;/p&gt;
&lt;p&gt;其能解析用 &lt;tt class="docutils literal"&gt;&amp;lt;pre&amp;gt;&lt;/tt&gt;、&lt;tt class="docutils literal"&gt;&amp;lt;table&amp;gt;&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;&amp;lt;ul&amp;gt;&lt;/tt&gt; 的常见文件目录，包括 Apache、nginx、lighttpd、darkhttpd 和 Python http.server 等服务器的默认样式，生成文件名、修改时间、大小、描述的列表。解析的基本思想就是模式匹配，对 &lt;tt class="docutils literal"&gt;&amp;lt;pre&amp;gt;&lt;/tt&gt; 就先找链接，再在每一栏找修改时间和文件大小；&lt;tt class="docutils literal"&gt;&amp;lt;table&amp;gt;&lt;/tt&gt; 先找表头；&lt;tt class="docutils literal"&gt;&amp;lt;ul&amp;gt;&lt;/tt&gt; 列举链接就可以了。程序写的有点面条，一堆黑科技，有空再整理和模块化。&lt;/p&gt;
&lt;p&gt;以这个解析器为基础，就能写出较为高效的 &lt;a class="reference external" href="https://github.com/gumblex/htmllisting-parser/blob/master/rehttpfs.py"&gt;FUSE 文件系统 …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;Apache、nginx 等服务器软件都有生成文件目录的功能。这类目录通常只考虑到人类的可读性，给机读带来很大困难。之前有解析目录列表的一些实现 &lt;a class="footnote-reference" href="#id7" id="id1"&gt;[1]&lt;/a&gt; &lt;a class="footnote-reference" href="#id8" id="id2"&gt;[2]&lt;/a&gt;，但不能覆盖大多数情况。为了之前挖的坑（实现自动获取软件更新信息） &lt;a class="footnote-reference" href="#id9" id="id3"&gt;[3]&lt;/a&gt;，我实现了一个能解析大部分文件目录的程序「&lt;a class="reference external" href="https://github.com/gumblex/htmllisting-parser"&gt;htmllisting-parser&lt;/a&gt;」。&lt;/p&gt;
&lt;p&gt;其能解析用 &lt;tt class="docutils literal"&gt;&amp;lt;pre&amp;gt;&lt;/tt&gt;、&lt;tt class="docutils literal"&gt;&amp;lt;table&amp;gt;&lt;/tt&gt; 和 &lt;tt class="docutils literal"&gt;&amp;lt;ul&amp;gt;&lt;/tt&gt; 的常见文件目录，包括 Apache、nginx、lighttpd、darkhttpd 和 Python http.server 等服务器的默认样式，生成文件名、修改时间、大小、描述的列表。解析的基本思想就是模式匹配，对 &lt;tt class="docutils literal"&gt;&amp;lt;pre&amp;gt;&lt;/tt&gt; 就先找链接，再在每一栏找修改时间和文件大小；&lt;tt class="docutils literal"&gt;&amp;lt;table&amp;gt;&lt;/tt&gt; 先找表头；&lt;tt class="docutils literal"&gt;&amp;lt;ul&amp;gt;&lt;/tt&gt; 列举链接就可以了。程序写的有点面条，一堆黑科技，有空再整理和模块化。&lt;/p&gt;
&lt;p&gt;以这个解析器为基础，就能写出较为高效的 &lt;a class="reference external" href="https://github.com/gumblex/htmllisting-parser/blob/master/rehttpfs.py"&gt;FUSE 文件系统&lt;/a&gt;，用来挂载 HTTP 目录。目前其他实现只能挂载单文件 &lt;a class="footnote-reference" href="#id10" id="id4"&gt;[4]&lt;/a&gt;，或需要服务端配合 &lt;a class="footnote-reference" href="#id11" id="id5"&gt;[5]&lt;/a&gt;，或需要大量执行 HEAD 请求获取文件信息 &lt;a class="footnote-reference" href="#id12" id="id6"&gt;[6]&lt;/a&gt;。利用 HTTP 文件目录可以避免 FTP 的不安全和不灵活的设置、SFTP 的单连接、WebDAV 缺少好实现的问题，可以配合 HTTPS 和基本认证等实现简单文件共享。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id7" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id1"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/sifmelcara/directory-listing-webpage-parser"&gt;https://github.com/sifmelcara/directory-listing-webpage-parser&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id8" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id2"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/lig/dirlistings-client"&gt;https://github.com/lig/dirlistings-client&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id9" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/AOSC-Dev/piss"&gt;https://github.com/AOSC-Dev/piss&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id10" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id4"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="http://httpfs.sourceforge.net/"&gt;http://httpfs.sourceforge.net/&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id11" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id5"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/cyrus-and/httpfs"&gt;https://github.com/cyrus-and/httpfs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id12" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id6"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/yvesf/fuse-httpfs"&gt;https://github.com/yvesf/fuse-httpfs&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
</content><category term="作品发布"></category><category term="FUSE"></category><category term="Python"></category></entry><entry><title>大数据的社会责任</title><link href="/bigdata-responsibility.html" rel="alternate"></link><published>2016-06-11T10:58:00+08:00</published><updated>2016-06-11T10:58:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2016-06-11:/bigdata-responsibility.html</id><summary type="html">&lt;p&gt;大数据、机器学习、人工智能这些名词人们越来越耳熟能详，好像说这些就是现在和未来信息技术的发展趋势。确实，随着计算机计算和储存能力的提高，以往需要仔细考虑的计算资源分配问题变得不那么重要。例如，现在在资源充裕的情况下，我们通常动不动就上神经网络来解决，不是像以前那样仔细考虑，提取出数据的各种特征、开发对特定问题优化的算法，因为神经网络一般能自己归纳出合理的模型。然而，现在缺乏仔细讨论的不是用哪种方法处理数据，而是我们对待原始数据和处理结果的态度。&lt;/p&gt;
&lt;p&gt;首先，原始数据的收集应该公开透明：数据的提供者，一般是用户，要有知情权。在各大网站上，基本都有「隐私政策」和「服务协议」页面，说明了其收集的用户数据及其用途。即使是这样，有的服务写的详细，并给出了停止收集一些数据的选项；有的服务措辞模糊，一开始就拿了许多权限，其用途无法解释，或者解释与实际行为不符。之前爆出的某些大厂的应用程序偷听或者偷拍用户，至少就没有做到数据收集的公开透明。我们暂时做善意的假定，这些收集的数据确实是「改善用户体验」。如果这些应用在申请权限之前有明确合理的解释，即使是像广告下面的小字，也可以算作是尊重了用户的知情权。后台收集数据的事情被发现后，这些大厂为了防止声誉受损，不对这些行为做出解释或道歉，只是重复「你怎么这样凭空污人清白」，就难免受到人们更多的质疑 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;大数据、机器学习、人工智能这些名词人们越来越耳熟能详，好像说这些就是现在和未来信息技术的发展趋势。确实，随着计算机计算和储存能力的提高，以往需要仔细考虑的计算资源分配问题变得不那么重要。例如，现在在资源充裕的情况下，我们通常动不动就上神经网络来解决，不是像以前那样仔细考虑，提取出数据的各种特征、开发对特定问题优化的算法，因为神经网络一般能自己归纳出合理的模型。然而，现在缺乏仔细讨论的不是用哪种方法处理数据，而是我们对待原始数据和处理结果的态度。&lt;/p&gt;
&lt;p&gt;首先，原始数据的收集应该公开透明：数据的提供者，一般是用户，要有知情权。在各大网站上，基本都有「隐私政策」和「服务协议」页面，说明了其收集的用户数据及其用途。即使是这样，有的服务写的详细，并给出了停止收集一些数据的选项；有的服务措辞模糊，一开始就拿了许多权限，其用途无法解释，或者解释与实际行为不符。之前爆出的某些大厂的应用程序偷听或者偷拍用户，至少就没有做到数据收集的公开透明。我们暂时做善意的假定，这些收集的数据确实是「改善用户体验」。如果这些应用在申请权限之前有明确合理的解释，即使是像广告下面的小字，也可以算作是尊重了用户的知情权。后台收集数据的事情被发现后，这些大厂为了防止声誉受损，不对这些行为做出解释或道歉，只是重复「你怎么这样凭空污人清白」，就难免受到人们更多的质疑。用户反对被收集数据，不仅是因为收集过程不公开透明，更是因为无从得知数据收集者有没有妥善保存和使用收集来的数据。&lt;/p&gt;
&lt;p&gt;因此，服务商收集了多少数据就应该负多少责任。服务提供方通常要求用户提供足够、真实的个人信息，从而建立对用户的信任。即使他们承诺数据不会透露给未授权的第三方，然而几乎每个月都会有各种数据泄漏事件发生，像是用户账户数据库被攻破，数据在传输过程中没有做好充分的安全措施，甚至有服务商主动泄漏用户数据，导致个人资料在网络上随处可得。出现这些问题，一部分在于服务提供商安全意识薄弱，对数据存取权限管理不当，一部分则可以认为他们收集了太多数据。紧跟行业最佳安全做法是服务提供商应尽的责任；减少数据的收集和被收集，则是一种降低风险的手段。例如，一项使用行为数据并没有用来统计分析或「改善用户体验」，那就不应该收集。对于服务商，有些只用于统计分析的数据，可以在传输和储存过程中避免带有可识别个人的标识符，使数据匿名化，这样也能减少一些风险。用户可以尽量阻止程序收集不影响所使用功能的数据，不需要「查找联系人」的，就关掉读取联系人权限；不需要个性化广告推荐的，就关掉这样的选项；在填写表单时只填写确实必要的内容。对收集的数据负责，是服务提供方亟需做到的。&lt;/p&gt;
&lt;p&gt;在分析处理收集来的数据时，我们通常观察全局，归纳出训练集的行为特征。然而，对这些数据的分析结果的一些利用方式，则是一种对少数人、少数行为的歧视。例如，有军事机关通过机器学习归纳出恐怖分子的生活轨迹，从而攻击可能的恐怖分子，然而这样众多无辜民众就不幸受到攻击；执法机关的人脸识别算法不佳，导致不同肤色的人更可能被怀疑；日常在线购买的物品与众不同，使信用等级降低；不尊重用户个人的选择，强制下载并安装更新。这些都是无视每个人的不同，用大部分代替全局的错误策略。像广告推送这样的应用，分类错误没有什么大问题，而一个人的生命、财产、尊严、人身自由，是不能用算法来决定的。根据多数人的行为提高少数人行为的成本，就会引发寒蝉效应，导致变相限制了宪法和法律规定的各种人身自由。还有一种错误的利用方式是根据分析行为数据估计风险，而算法对风险的估计仍不可替代安全措施。有些服务过度信任自己的行为分析模型，使不法分子有机可乘，且提高了少部分用户的使用成本。这就像在门口架摄像头进行人脸识别开门固然可行，其安全性和实用性却远不如一把锁。&lt;/p&gt;
&lt;p&gt;不论是现在还是不久的将来，人工智能对人类最大的威胁一直会是人类自己对这项技术的使用方式。「不是人人都必须懂计算机和网络安全才有资格使用手机电脑互联网」，也不应该让人人都必须阻止了隐私数据的收集才敢使用一个网络服务。大数据的收集和使用必须经得起道德衡量，能负起社会责任：训练数据还是需要按照公开透明的原则去收集，对数据的传输和储存过程做好安全措施，正确使用分析结果，这样才能使每一个人都能从大数据带来的便捷中受益。&lt;/p&gt;
</content><category term="时事评论"></category><category term="机器学习"></category></entry><entry><title>基于 Moses 的文言文统计机器翻译系统</title><link href="/classical-chinese-translation.html" rel="alternate"></link><published>2016-05-26T21:11:00+08:00</published><updated>2016-05-26T21:11:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2016-05-26:/classical-chinese-translation.html</id><summary type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;这是一份参加学校办的科技竞赛写的论文。既然没得奖，就直接放出来供大家参考吧。本文内容参见之前发布的 &lt;a class="reference external" href="/wenyan-translate.html"&gt;《文言文机器翻译》&lt;/a&gt;。点击使用 &lt;a class="reference external" href="https://app.gumble.pw/wenyan/"&gt;在线演示&lt;/a&gt;。&lt;/p&gt;
&lt;p class="last"&gt;为了更清楚地列出所采用的资源和工具，在发布时另外标注了链接和符号角标。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;：本项目制作了一种文言文机器翻译系统，使用了基于词组的统计翻译模型。通过收集整理大量平行语料、训练针对文言文的分词系统并应用统计机器翻译中的先进技术，在控制了模型大小和内存占用的情况下，使本系统的翻译结果质量超过了现有系统的水平。本系统拥有较为友好的用户交互界面，能根据文本特征自动确定翻译方向并在结果中显示原文和译文中词语的对应关系，最终本系统可以为用户提供了一个新的文言文辅助阅读方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键词&lt;/strong&gt;：文言文，统计机器翻译，自然语言处理&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A statistical machine translation system for Classical Chinese based on Moses&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;: This project presents a statistical machine translation system that can translate text between Classical …&lt;/p&gt;</summary><content type="html">&lt;div class="admonition note"&gt;
&lt;p class="first admonition-title"&gt;Note&lt;/p&gt;
&lt;p&gt;这是一份参加学校办的科技竞赛写的论文。既然没得奖，就直接放出来供大家参考吧。本文内容参见之前发布的 &lt;a class="reference external" href="/wenyan-translate.html"&gt;《文言文机器翻译》&lt;/a&gt;。点击使用 &lt;a class="reference external" href="https://app.gumble.pw/wenyan/"&gt;在线演示&lt;/a&gt;。&lt;/p&gt;
&lt;p class="last"&gt;为了更清楚地列出所采用的资源和工具，在发布时另外标注了链接和符号角标。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;摘要&lt;/strong&gt;：本项目制作了一种文言文机器翻译系统，使用了基于词组的统计翻译模型。通过收集整理大量平行语料、训练针对文言文的分词系统并应用统计机器翻译中的先进技术，在控制了模型大小和内存占用的情况下，使本系统的翻译结果质量超过了现有系统的水平。本系统拥有较为友好的用户交互界面，能根据文本特征自动确定翻译方向并在结果中显示原文和译文中词语的对应关系，最终本系统可以为用户提供了一个新的文言文辅助阅读方法。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;关键词&lt;/strong&gt;：文言文，统计机器翻译，自然语言处理&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;A statistical machine translation system for Classical Chinese based on Moses&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Abstract&lt;/strong&gt;: This project presents a statistical machine translation system that can translate text between Classical and Modern Chinese using phrase-based translation models. By collecting a considerable amount of parallel corpora, training a word segmentation system for Classical Chinese and applying state-of-the-art statistical machine translation technologies, the translation result is better than that of current systems despite the model size and memory constraints. This system has a user-friendly graphical user interface, which can detect translation direction based on the source text and show the relationships between source and target words. This system provides users a new kind of assistant for reading Classical Chinese.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Keywords&lt;/strong&gt;: Classical Chinese, Statistical Machine Translation, Natural Language Processing&lt;/p&gt;
&lt;div class="contents topic" id="id1"&gt;
&lt;p class="topic-title"&gt;目录&lt;/p&gt;
&lt;ul class="auto-toc simple"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id2" id="id90"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;概述&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id5" id="id91"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;语料收集与处理&lt;/a&gt;&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id6" id="id92"&gt;2.1&amp;nbsp;&amp;nbsp;&amp;nbsp;平行语料&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id8" id="id93"&gt;2.2&amp;nbsp;&amp;nbsp;&amp;nbsp;单一语言语料&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id19" id="id94"&gt;2.3&amp;nbsp;&amp;nbsp;&amp;nbsp;文字的选择&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id28" id="id95"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;模型训练&lt;/a&gt;&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id29" id="id96"&gt;3.1&amp;nbsp;&amp;nbsp;&amp;nbsp;中文分词&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id37" id="id97"&gt;3.2&amp;nbsp;&amp;nbsp;&amp;nbsp;语言模型&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id40" id="id98"&gt;3.3&amp;nbsp;&amp;nbsp;&amp;nbsp;实验管理系统&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id53" id="id99"&gt;3.4&amp;nbsp;&amp;nbsp;&amp;nbsp;语言判定&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id56" id="id100"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;软件设计 &lt;/a&gt;&lt;ul class="auto-toc"&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id57" id="id101"&gt;4.1&amp;nbsp;&amp;nbsp;&amp;nbsp;软件结构&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id59" id="id102"&gt;4.2&amp;nbsp;&amp;nbsp;&amp;nbsp;用户界面&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id62" id="id103"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;相关研究对比&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id73" id="id104"&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;结论与展望&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference internal" href="#id76" id="id105"&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;参考文献&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id90"&gt;1&amp;nbsp;&amp;nbsp;&amp;nbsp;概述&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;文言文是古汉语的书面语言，具有文字简练的特点，与现代白话文有较大区别。要读懂文言文需要有对应的训练并积累一定的阅读量，这导致大多数人较难读懂古代典籍。为了帮助阅读和理解文言文，本项目实现了一种文言文翻译系统。&lt;/p&gt;
&lt;p&gt;统计机器翻译是广泛采用的一种机器翻译的模式，其通过对大量平行语料进行分析，构造统计模型，从而使用该模型生成翻译。寻找最佳翻译的过程就是找到根据模型的参数产生概率最高的句子。&lt;a class="reference external" href="http://www.statmt.org/moses/"&gt;Moses&lt;/a&gt; &lt;a class="footnote-reference" href="#id77" id="id3"&gt;[1]&lt;/a&gt; 是一套成熟完善的统计机器翻译系统，可以训练产生能够翻译任意语言对的翻译模型，并通过高效的搜索算法找到最有可能的翻译结果。&lt;/p&gt;
&lt;p&gt;本项目采用基于词组的统计翻译模型 &lt;a class="footnote-reference" href="#id78" id="id4"&gt;[2]&lt;/a&gt;，通过收集大量平行语料，并根据文言文和现代汉语的特点进行了相应处理和优化，得到了质量较高的翻译结果。本项目同时设计了一个基于网页的用户交互界面。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id91"&gt;2&amp;nbsp;&amp;nbsp;&amp;nbsp;语料收集与处理&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;语料的收集处理是统计机器翻译的重要组成部分。由于统计机器翻译的原理和特点，需要有大量平行语料并进行相对应的处理，才能训练得到较好的翻译结果。&lt;/p&gt;
&lt;div class="section" id="id6"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id92"&gt;2.1&amp;nbsp;&amp;nbsp;&amp;nbsp;平行语料&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本项目使用了大量网络上可获得的平行语料，包括各个文言文翻译网站以及古代书籍的译注版本。对于这些来源，都分别按照其格式特点进行了半自动半人工的处理，从而丰富了平行语料的来源，减少了大量无效数据。根据处理后平行语料的质量和对齐程度不同，可分为极少量的按句对齐、一些按段落对齐和其他大部分按篇章对齐的语料。Moses 统计机器翻译系统主要针对的是按句翻译，也就需要将平行语料按句对齐。&lt;/p&gt;
&lt;p&gt;已按句对齐的语料无需处理即可直接使用。按段落对齐和按篇章对齐的处理步骤相似，首先都要将其进行断句处理。断句规则为，在分号、句号、感叹号、问号后断句；如果有下引号，则在其之后断句；在冒号和上引号之间断句。在实际翻译时也必须采用相同的断句规则。之后，采用&lt;a class="reference external" href="https://github.com/rsennrich/Bleualign"&gt;机器翻译辅助句对齐&lt;/a&gt;的方法 &lt;a class="footnote-reference" href="#id79" id="id7"&gt;[3]&lt;/a&gt;，使用之前的训练的模型粗略翻译一遍原文，保证原文和机翻译文能按句对齐，以修改后的 BLEU 得分比较机翻译文和参考译文的相似度，最后使原文和参考译文能按句对齐。最后，统一过滤无效句对并去重，得到按句对齐、可供 Moses 直接使用的平行语料，称为训练集，约有八十五万句对；从上述平行语料中另外人工抽取并校对一千对左右翻译质量较高的句子作为调优集和评估集。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id8"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id93"&gt;2.2&amp;nbsp;&amp;nbsp;&amp;nbsp;单一语言语料&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;除了平行语料，单一语言语料的作用在统计机器翻译中也是十分重要的。现代白话文语料除了上述平行语料之外，主要包括新闻 &lt;a class="footnote-reference" href="#id14" id="id9"&gt;[*]&lt;/a&gt;、小说、字幕 &lt;a class="footnote-reference" href="#id15" id="id10"&gt;[†]&lt;/a&gt;和维基媒体项目 &lt;a class="footnote-reference" href="#id16" id="id11"&gt;[‡]&lt;/a&gt; &lt;a class="footnote-reference" href="#id17" id="id12"&gt;[§]&lt;/a&gt; （除中文维基文库）等 &lt;a class="footnote-reference" href="#id18" id="id13"&gt;[¶]&lt;/a&gt;。文言文语料除了平行语料之外，主要包括中文维基文库中筛选出的古代和近代的文献。最终得到的单一语言语料数量较大，约为上述平行语料的二十倍，作为语言模型的训练材料，能更好地保证输出语言的通顺流畅。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id14" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id9"&gt;[*]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;可参考 &lt;a class="reference external" href="https://www.sogou.com/labs/dl/ca.html"&gt;搜狗全网新闻数据&lt;/a&gt;，本项目未使用&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id15" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id10"&gt;[†]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://wit3.fbk.eu/"&gt;Web Inventory of Transcribed and Translated Talks&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id16" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id11"&gt;[‡]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://dumps.wikimedia.org/"&gt;维基媒体项目数据库&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id17" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id12"&gt;[§]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="https://github.com/attardi/wikiextractor"&gt;维基媒体项目导出数据转文本&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id18" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id13"&gt;[¶]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;还有 &lt;a class="reference external" href="http://opus.lingfil.uu.se/"&gt;OPUS: the open parallel corpus&lt;/a&gt;，未标注参考文献&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id19"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id94"&gt;2.3&amp;nbsp;&amp;nbsp;&amp;nbsp;文字的选择&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本项目对于上述所有语料，统一转换成简化字 &lt;a class="footnote-reference" href="#id24" id="id20"&gt;[#]&lt;/a&gt;，即训练的模型使用的文字为简体字。中华人民共和国自 1956 年后施行汉字简化制度，所以在此之前的文献应以传统汉字（繁体字）保存。然而，由于网络上使用繁体中文的平行语料资源严重缺乏；繁体中文语料来源质量参差不齐，有些是使用机器从简体简单转换而来，鱼龙混杂 &lt;a class="footnote-reference" href="#id25" id="id21"&gt;[♠]&lt;/a&gt;；校对原文需要极大的人力；而且无法确保能将用户输入的简体中文输入正确转换为对应繁体，正确处理文言文的简繁转换比对白话文的简繁转换更为困难 &lt;a class="footnote-reference" href="#id26" id="id22"&gt;[♥]&lt;/a&gt;，所以经过考虑，语料和用户输入将统一转换为简化字之后再进行处理。 &lt;a class="footnote-reference" href="#id27" id="id23"&gt;[♦]&lt;/a&gt;&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id24" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id20"&gt;[#]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;这里采用 &lt;a class="reference external" href="https://github.com/BYVoid/OpenCC"&gt;OpenCC&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id25" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id21"&gt;[♠]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;指维基文库。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id26" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id22"&gt;[♥]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;可以尝试再来一份用于简繁转换的统计机器翻译模型。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id27" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id23"&gt;[♦]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;在线上采用「&lt;a class="reference external" href="https://github.com/gumblex/zhconv"&gt;简易中文简繁转换&lt;/a&gt;」&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id28"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id95"&gt;3&amp;nbsp;&amp;nbsp;&amp;nbsp;模型训练&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;这个翻译系统使用的特征包括短语翻译模型、语言模型、调序模型以及一些稀疏特征。翻译模型（短语翻译表）使源语言和目标语言的词汇能互相对应，语言模型确保输出的是通顺的目标语言，调序模型可以适当改变输入语句的顺序，附加的稀疏特征能给输出评分更多参考，可较大程度提高翻译质量。&lt;/p&gt;
&lt;div class="section" id="id29"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id96"&gt;3.1&amp;nbsp;&amp;nbsp;&amp;nbsp;中文分词&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在训练翻译模型和语言模型之前，需要先对文言文和白话文进行针对性的分词处理以提高翻译质量。&lt;a class="footnote-reference" href="#id80" id="id30"&gt;[4]&lt;/a&gt; 对于现代白话文，使用了 &lt;a class="reference external" href="https://github.com/fxsjy/jieba"&gt;“结巴”中文分词软件&lt;/a&gt;，禁用了默认的隐马尔可夫新词发现模型，防止产生模型外词汇。&lt;/p&gt;
&lt;p&gt;对于文言文，不能简单使用白话文的分词模型，所以首先构建了文言文分词所需要使用的词汇表。词汇表来源有“结巴”包含的默认词典（按词性筛选出部分实词），台湾教育部《重编国语词典修订本》（按词汇类别筛选） &lt;a class="footnote-reference" href="#id34" id="id31"&gt;[♣]&lt;/a&gt; 以及各种关于历史人物、地名、朝代、官职等输入法词库 &lt;a class="footnote-reference" href="#id35" id="id32"&gt;[**]&lt;/a&gt;，再加上用程序生成的数字、方位、干支等词汇，共计约三万八千条。 &lt;a class="footnote-reference" href="#id36" id="id33"&gt;[††]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;鉴于文言文大部分为单音节词汇，少有分词歧义，所以在训练分词模型时简单采用了首先进行最大正向匹配，再统计每个词汇出现次数的方法，即最大似然估计，最后筛选掉极低频词汇。在文言文分词时，运用此字典即可获得较好的分词效果。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id34" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id31"&gt;[♣]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;《&lt;a class="reference external" href="https://www.moedict.tw/"&gt;萌典&lt;/a&gt;》 &lt;a class="reference external" href="https://github.com/g0v/moedict-process"&gt;数据&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id35" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id32"&gt;[**]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;主要是搜狗、百度和 QQ 拼音词库。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id36" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id33"&gt;[††]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;下载：&lt;a class="reference external" href="/static/zhcdict-s.txt.gz"&gt;简体&lt;/a&gt;、&lt;a class="reference external" href="/static/zhcdict-t.txt.gz"&gt;繁体&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id37"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id97"&gt;3.2&amp;nbsp;&amp;nbsp;&amp;nbsp;语言模型&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在训练语言模型时采用上述在数量上更多的单一语言语料。语言模型采用 &lt;a class="reference external" href="http://kheafield.com/code/kenlm/"&gt;KenLM&lt;/a&gt; 语言模型工具估算生成四元语言模型，其使用 Modified Kneser-Ney 算法 &lt;a class="footnote-reference" href="#id81" id="id38"&gt;[5]&lt;/a&gt; 平滑 n 元组数据。生成 ARPA 文本格式的语言模型之后，转换成 KenLM &lt;a class="footnote-reference" href="#id82" id="id39"&gt;[6]&lt;/a&gt; 的 Trie 数据结构二进制文件。使用这种数据结构的文件相比其实现的另外一种 Probing（散列表）数据结构，文件更小、占用内存更少，但速度稍慢。因为这些语言模型所用的语料更新次数相对较少且模型生成速度慢，所以不在下述“实验管理系统”中生成。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id40"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id98"&gt;3.3&amp;nbsp;&amp;nbsp;&amp;nbsp;实验管理系统&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;通过使用 Moses 附带的“实验管理系统”&lt;a class="footnote-reference" href="#id83" id="id41"&gt;[7]&lt;/a&gt; &lt;a class="footnote-reference" href="#id50" id="id42"&gt;[‡‡]&lt;/a&gt;，编写一个配置文件，就可自动完成模型训练的各个过程。训练步骤为：分词、过滤、词对齐、建立翻译及调序模型、过滤模型、权重调优、评估。&lt;/p&gt;
&lt;div class="figure align-center"&gt;
&lt;img alt="Experiment Management System" src="/img/lzht-ems.png" style="width: 100%;" /&gt;
&lt;p class="caption"&gt;&lt;strong&gt;图 1&lt;/strong&gt;  实验管理系统生成的模型训练步骤&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;首先系统按照配置，将训练集、调优集和评估集使用上述分词方法进行分词，并筛选掉超过 100 词的句子，因为长句通常可靠性不高，而且会减慢词对齐速度。然后，系统将分词后的平行语料进行预处理，准备进行词对齐。在本项目中，使用基于 IBM Model 2 的 &lt;a class="reference external" href="https://github.com/clab/fast_align"&gt;fast_align&lt;/a&gt; &lt;a class="footnote-reference" href="#id84" id="id43"&gt;[8]&lt;/a&gt; 工具进行词对齐。该工具比常用的基于 IBM Model 4 的词对齐工具约快十倍，且在源语言和目标语言语序相似的情况下质量相当。&lt;/p&gt;
&lt;p&gt;词对齐之后，系统提取词组表，合并预先准备的文言文词典的释义作为附加词组表，限定词组的最大长度为 4，并同时生成词汇调序表。按照对词组在平行语料中共同出现的显著性检验，可以删减掉大部分词组表而不影响、甚至提高翻译得分 &lt;a class="footnote-reference" href="#id85" id="id44"&gt;[9]&lt;/a&gt;，从而节省大量空间。同时，使用压缩词汇表和调序表技术 &lt;a class="footnote-reference" href="#id86" id="id45"&gt;[10]&lt;/a&gt; 能进一步减少磁盘占用而不影响翻译速度。&lt;/p&gt;
&lt;p&gt;在调优时不仅考虑翻译模型、语言模型等特征，还加入了目标词汇插入、源词汇删除、词汇直接翻译、词汇长度四种稀疏特征，这可以使 BLEU 得分提高约 20%。因为特征数目较多，调优采用 k-best MIRA 算法 &lt;a class="footnote-reference" href="#id87" id="id46"&gt;[11]&lt;/a&gt;。得到最佳特征参数后，对模型进行整体评估，计算 BLEU &lt;a class="footnote-reference" href="#id88" id="id47"&gt;[12]&lt;/a&gt; 评分，从而可以对翻译质量进行量化比较。上述过程所产生的最终模型文件较小 &lt;a class="footnote-reference" href="#id51" id="id48"&gt;[§§]&lt;/a&gt;，翻译时内存占用适中 &lt;a class="footnote-reference" href="#id52" id="id49"&gt;[¶¶]&lt;/a&gt;，适合在云端服务部署。&lt;/p&gt;
&lt;p&gt;因为将文言文和白话对调再训练模型即可获得反向翻译功能，所以每次均进行双向训练，得到文言文到白话文和白话文到文言文两个翻译模型。这两个模型互相独立，因此不能保证它们有相同的翻译质量。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id50" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id42"&gt;[‡‡]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;&lt;a class="reference external" href="http://www.statmt.org/moses/?n=FactoredTraining.EMS"&gt;Experiment Management System&lt;/a&gt;. 此部分涉及内容参见 Moses 文档。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id51" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id48"&gt;[§§]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;两个模型总计约 0.5G。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id52" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id49"&gt;[¶¶]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;服务端内存占用总计约 0.5G。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id53"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id99"&gt;3.4&amp;nbsp;&amp;nbsp;&amp;nbsp;语言判定&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;在设计用户界面过程中，自动判定翻译方向可以简化用户操作。通过建立朴素贝叶斯分类器，可以比较准确地判断出源语言。该模型使用 Unicode“中日韩统一表意文字”U+4E00 到 U+9FCC 区段共 20941 个汉字作为识别文本的特征，并认为白话文和文言文出现概率相同。忽略 Unicode 中其他汉字区段是因为其中绝大部分汉字过于生僻，在实际文本中几乎不会出现。&lt;/p&gt;
&lt;p&gt;训练语料采用前述白话文和文言文两个单一语言语料库。在训练模型时使用最大似然估计，并使用 Simple Good-Turing &lt;a class="footnote-reference" href="#id89" id="id54"&gt;[13]&lt;/a&gt; 算法平滑数据，防止有零概率出现。计算之后将概率值取对数储存为 JSON 数据文件。&lt;/p&gt;
&lt;p&gt;该模型的数据文件比较大，为了在网页客户端脚本中使用，将每个值量化，用 ASCII 中的可打印字符表示成字符串。计算时可直接取字符编码相加，比较结果。如果计算结果为零，则说明其中不包含模型中的汉字，无法确定翻译方向。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id56"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id100"&gt;4&amp;nbsp;&amp;nbsp;&amp;nbsp;软件设计 &lt;a class="footnote-reference" href="#id60" id="id55"&gt;[##]&lt;/a&gt;&lt;/a&gt;&lt;/h2&gt;
&lt;div class="section" id="id57"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id101"&gt;4.1&amp;nbsp;&amp;nbsp;&amp;nbsp;软件结构&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;软件获得的用户输入为待翻译字符串和翻译方向。如果前端没有指定翻译方向，则在服务器端由上述朴素贝叶斯分类器进行自动选择。如果无法确定翻译方向，例如输入文本为其他语言，认为该文本无法翻译，所以按原样输出。之后服务端判断，如果用户短时间内请求太多，则生成验证码验证是否为人工操作；如果文本太长，则要求用户切分文本再提交，防止服务过载。&lt;/p&gt;
&lt;p&gt;网页服务器将收到的文本通过 TCP 接口提交给后台翻译服务进程。该服务进程可以响应包括翻译、分词、简繁转换等命令，通过将这些服务集中在一个服务进程，可以提高稳定性，避免网页服务器重复加载词典。该服务进程同时管理两个后台 Moses 进程，分别负责两个方向的翻译。&lt;/p&gt;
&lt;p&gt;在收到翻译请求后，先去除特殊字符，分行并按标点分句。其中在分句时，如果一句太长，则按逗号等标点切分，若还是太长，则直接按字数切分，防止一句翻译产生过多候选，占用内存过多或耗时过长。对于切分后的每一句话，检查是否包含上述“语言判定”中所使用区段范围内的汉字，如果没有则直接进入输出队列；将输入规范标点、统一转换为简体后，如果该句包含在缓存中，也直接输出。之后，程序为待翻译语句进行分词、XML 转义并在标点符号前后添加调序限制，通过标准输入调用 Moses 进程翻译。当 Moses 结束翻译，翻译服务进程解析其标准输出，XML 反向转义、解析词对齐，将结果加入输出队列，并加入缓存。最后，程序收集上述翻译结果，并按照调用参数格式化输出。网页服务器收到其回应后，按照用户浏览器设定中偏好的语言（简体或繁体） &lt;a class="footnote-reference" href="#id61" id="id58"&gt;[♠♠]&lt;/a&gt; 转换输出文字，最后生成网页呈现给用户。&lt;/p&gt;
&lt;div class="figure align-center"&gt;
&lt;img alt="Flow chart" src="/img/lzht-flowchart.png" style="width: 100%;" /&gt;
&lt;p class="caption"&gt;&lt;strong&gt;图 2&lt;/strong&gt;  软件结构和翻译过程&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;在之后的开发中，该服务后端将实现翻译应用程序接口，从而实现即时翻译功能，并为相关开发者提供更简便的服务。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id59"&gt;
&lt;h3&gt;&lt;a class="toc-backref" href="#id102"&gt;4.2&amp;nbsp;&amp;nbsp;&amp;nbsp;用户界面&lt;/a&gt;&lt;/h3&gt;
&lt;p&gt;本项目实现了基于网页的用户界面，使该文言文翻译系统成为一个网络服务。&lt;/p&gt;
&lt;div class="figure align-center"&gt;
&lt;img alt="Web interface" src="/img/lzht-web.png" style="width: 100%;" /&gt;
&lt;p class="caption"&gt;&lt;strong&gt;图 3&lt;/strong&gt;  基于网页的用户界面&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;该界面除实现了基本的输入、输出功能之外，还可以自动判别翻译方向，并可在结果中显示原文和译文中词语的对应关系。翻译方向的判别由上述语言判定模型完成，如果判定错误，用户可按“切换”按钮更正。鼠标移动，或触摸屏触摸到译文上的词汇时，在相应位置会高亮标出词汇的对应关系，用户从而能更好地评估翻译结果。在屏幕小的设备上，网页会自动适配为上下排版，方便用户操作。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id60" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id55"&gt;[##]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;「语言判定」部分以及该部分源码包含在 &lt;a class="reference external" href="https://github.com/gumblex/pywebapps"&gt;https://github.com/gumblex/pywebapps&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id61" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id58"&gt;[♠♠]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;即 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;Accept-Language&lt;/span&gt;&lt;/tt&gt; 头。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id62"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id103"&gt;5&amp;nbsp;&amp;nbsp;&amp;nbsp;相关研究对比&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;在网络上能找到的最早的文言文翻译软件是“文言之星” &lt;a class="footnote-reference" href="#id68" id="id63"&gt;[♥♥]&lt;/a&gt;，更新日期为 2001 年。该软件采用简单按照词汇表替换的方式进行翻译，且只能将文言文翻译为白话文。由于其边翻译边更新图形界面，所以速度较慢。&lt;a class="footnote-reference" href="#id69" id="id64"&gt;[♦♦]&lt;/a&gt; 该软件翻译效果一般，没有考虑到分词和歧义问题，对上下文的处理能力较弱。 &lt;a class="footnote-reference" href="#id70" id="id65"&gt;[♣♣]&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;在 2014 年 4 月百度翻译推出了文言文翻译功能 &lt;a class="footnote-reference" href="#id71" id="id66"&gt;[***]&lt;/a&gt;，能较好地完成文言文和白话文互译任务，对于未知文言文语句，其翻译结果会输出较多原文。通过本项目的几次失败实验，可以推测，百度翻译较本项目不足之处可能在于其模型为二元，或者在文言文分词方面有缺陷。百度翻译会对名句段进行直接匹配，而在匹配后再进行简繁转换，所以繁体和简体输入得到的结果可能略有不同。&lt;/p&gt;
&lt;p&gt;例如：&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;孔子适郑，与弟子相失，孔子独立郭东门。（《史记・孔子世家》）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;文言之星&lt;/strong&gt;：孔你适郑，和弟你相失，孔你单独确定郭东门。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;百度翻译&lt;/strong&gt;：孔子到郑国，与学生相互失去，孔子独自站在郭东门。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本项目&lt;/strong&gt;：孔子到了郑国，与弟子们失散了，孔子独自站在外城的东门。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ol class="arabic simple" start="2"&gt;
&lt;li&gt;少焉，月出于东山之上，徘徊于斗牛之间，白露横江，水光接天；纵一苇之所如，陵万顷之茫然。（《前赤壁赋》）&lt;/li&gt;
&lt;/ol&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;文言之星&lt;/strong&gt;：少呢，月出在东山的向上，徘徊在争胜负牛的参与，白露横江，水光接天；纵一苇的处所象，陵很多一会儿茫然而。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;百度翻译&lt;/strong&gt;（原文为繁体）：少了，月出于东山之上，徘徊在斗宿、牛宿之间，白露横江，水光和天际连结成一片；即使一苇之所如，陵万顷的茫然。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;百度翻译&lt;/strong&gt;（原文为简体）：少了，月亮从东山的上空升起，在斗宿和牛宿两星座之间徘徊，白漾漾的雾气笼罩江面，水光和天际连结成一片；任凭苇叶似的小船飘向何处，陵万顷的茫然。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;本项目&lt;/strong&gt;：不多时，明月从东山后升起的上边，徘徊在斗星与牛的时候，白露横江，水光接上天；即使一叶小舟的地方，而去，李陵万顷的茫然。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;可见上述例文均不同程度地出现在百度翻译和本项目的训练集中。文言之星完全缺乏合适的分词和歧义处理。百度翻译对名句的直接匹配可以在一定程度上弥补机器翻译的不足。本项目没有进行直接匹配，会尽量尝试进行翻译而不是直接输出难以确定的词组，并且能更好地反馈训练集的内容，即召回率较高。&lt;/p&gt;
&lt;p&gt;使用相同的测试集、分词方法和 BLEU 算法对上述系统进行翻译质量评估，得到评分如下表。如表所示，本项目在翻译质量上能可见地超过上述研究。&lt;/p&gt;
&lt;table border="1" class="docutils"&gt;
&lt;caption&gt;&lt;strong&gt;表 1&lt;/strong&gt;  各文言文翻译系统的 BLEU 得分比较&lt;/caption&gt;
&lt;colgroup&gt;
&lt;col width="27%" /&gt;
&lt;col width="38%" /&gt;
&lt;col width="36%" /&gt;
&lt;/colgroup&gt;
&lt;thead valign="bottom"&gt;
&lt;tr&gt;&lt;th class="head"&gt;系统&lt;/th&gt;
&lt;th class="head"&gt;文言文到白话文&lt;/th&gt;
&lt;th class="head"&gt;白话文到文言文&lt;/th&gt;
&lt;/tr&gt;
&lt;/thead&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td&gt;文言之星&lt;/td&gt;
&lt;td&gt;6.12&lt;/td&gt;
&lt;td&gt;N/A&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;百度翻译&lt;/td&gt;
&lt;td&gt;20.41&lt;/td&gt;
&lt;td&gt;34.11&lt;/td&gt;
&lt;/tr&gt;
&lt;tr&gt;&lt;td&gt;本项目&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;30.48&lt;/strong&gt;&lt;/td&gt;
&lt;td&gt;&lt;strong&gt;48.19&lt;/strong&gt;&lt;/td&gt;
&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;本项目为独立项目，与上述研究完全无关。上述例文和评估数据均为测试当时所产生 &lt;a class="footnote-reference" href="#id72" id="id67"&gt;[†††]&lt;/a&gt;，会因各系统模型、参数或算法等更新而变化。&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id68" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id63"&gt;[♥♥]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;自行搜索下载。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id69" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id64"&gt;[♦♦]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;17537 字测试集，文言之星用时约 51 分钟，百度翻译用时约半分钟（包括网络延迟），本项目用时约三分钟。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id70" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id65"&gt;[♣♣]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;在测试中采用了&lt;a class="reference external" href="https://github.com/The-Orizon/nlputils/blob/master/WWStarClone.py"&gt;重新实现的 Python 版本&lt;/a&gt;以提高速度。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id71" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id66"&gt;[***]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;在「百度翻译」 &lt;a class="reference external" href="http://fanyi.baidu.com/#wyw/zh/"&gt;网页&lt;/a&gt;或客户端中选择&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id72" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id67"&gt;[†††]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;测试时使用的模型为 2016 年 3 月生成的模型，代号「陈振栋」。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id73"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id104"&gt;6&amp;nbsp;&amp;nbsp;&amp;nbsp;结论与展望&lt;/a&gt;&lt;/h2&gt;
&lt;p&gt;本项目实现了一个基于统计模型的文言文机器翻译系统。该系统能对文言文和白话文进行较准确的互译，有比现有系统更高的翻译质量。本项目也实现了一个图形用户界面，方便用户进行翻译操作。本项目不仅使用了现有机器翻译框架，还针对文言文分词进行了优化、建立了用于识别文言文和现代文的模型并编写了整合功能较多、更适合中文的 Moses 前端服务，提供了一个新的文言文辅助阅读方法。&lt;/p&gt;
&lt;p&gt;未来可以在这个基础上增添平行语料、加入词汇参数或句法模型，并改善语言模型，使翻译结果更精确；在翻译服务后端增加负载平衡等措施，提高翻译服务在云端部署的可扩展性。同时，用户界面可以加入即时翻译和字典等功能，使该系统能更适合于辅助文言文阅读和学习。由于本项目最终使用的模型文件总体大小较小，可以考虑进一步缩小模型文件并制作成手机应用，使用户在离线时也可以翻译文言文。 &lt;a class="footnote-reference" href="#id75" id="id74"&gt;[‡‡‡]&lt;/a&gt;&lt;/p&gt;
&lt;table class="docutils footnote" frame="void" id="id75" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id74"&gt;[‡‡‡]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;除非有资助或其他贡献者，这些展望很难实现。&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
&lt;div class="section" id="id76"&gt;
&lt;h2&gt;&lt;a class="toc-backref" href="#id105"&gt;7&amp;nbsp;&amp;nbsp;&amp;nbsp;参考文献&lt;/a&gt;&lt;/h2&gt;
&lt;table class="docutils footnote" frame="void" id="id77" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id3"&gt;[1]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Philipp Koehn, Hieu Hoang, Alexandra Birch, Chris Callison-Burch, Marcello Federico, Nicola Bertoldi, Brooke Cowan, Wade Shen, Christine Moran, Richard Zens, Chris Dyer, Ondrej Bojar, Alexandra Constantin, Evan Herbst, &amp;quot;Moses: Open Source Toolkit for Statistical Machine Translation&amp;quot;,  In &lt;em&gt;Proceedings of the 45th Annual Meeting of the ACL on Interactive Poster and Demonstration Sessions&lt;/em&gt;, pages 177–180, 2007.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id78" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id4"&gt;[2]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Philipp Koehn, Franz Josef Och, Daniel Marcu, &amp;quot;Statistical phrase-based translation&amp;quot;, &lt;em&gt;Proceedings of the 2003 Conference of the North American Chapter of the Association for Computational Linguistics on Human Language Technology&lt;/em&gt;, p.48-54, May 27-June 01, 2003, Edmonton, Canada&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id79" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id7"&gt;[3]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Rico Sennrich, Martin Volk, &amp;quot;MT-based Sentence Alignment for OCR-generated Parallel Texts&amp;quot;. In &lt;em&gt;Proceedings of AMTA 2010&lt;/em&gt;, Denver, Colorado, 2010&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id80" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id30"&gt;[4]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Pi-Chuan Chang, Michel Galley and Christopher D. Manning, &amp;quot;Optimizing Chinese word segmentation for machine translation performance&amp;quot;, &lt;em&gt;Proceedings of the Third Workshop on Statistical Machine Translation&lt;/em&gt;, p.224-232, June 19-19, 2008, Columbus, Ohio&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id81" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id38"&gt;[5]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Kenneth Heafield, Ivan Pouzyrevsky, Jonathan H. Clark, and Philipp Koehn. &amp;quot;Scalable modified Kneser-Ney language model estimation&amp;quot;. In &lt;em&gt;Proceedings of the 51st Annual Meeting of the Association for Computational Linguistics&lt;/em&gt;, Sofia, Bulgaria, 4—9 August, 2013.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id82" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id39"&gt;[6]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Kenneth Heafield, &amp;quot;KenLM: Faster and Smaller Language Model Queries.&amp;quot; WMT at EMNLP, Edinburgh, Scotland, United Kingdom, 30—31 July, 2011.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id83" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id41"&gt;[7]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Philipp Koehn, &amp;quot;An Experimental Management System.&amp;quot;, Proceedings of the Machine Translation Marathon 2010, &lt;em&gt;The Prague Bulletin of Mathematical Linguistics&lt;/em&gt;, vol. 94, pp. 86-96, 2010.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id84" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id43"&gt;[8]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Chris Dyer, Victor Chahuneau, and Noah A. Smith. &amp;quot;A Simple, Fast, and Effective Reparameterization of IBM Model 2&amp;quot;. In Proc. of NAACL, 2013.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id85" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id44"&gt;[9]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Howard Johnson, Joel Martin, George Foster, and Roland Kuhn. &amp;quot;Improving translation quality by discarding most of the phrasetable&amp;quot;. In &lt;em&gt;Proceedings of EMNLP-CoNLL&lt;/em&gt;. 967–975. 2007.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id86" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id45"&gt;[10]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Marcin Junczys-Dowmunt. &amp;quot;Phrasal Rank-Encoding: Exploiting Phrase Redundancy and Translational Relations for Phrase Table Compression&amp;quot;, Proceedings of the Machine Translation Marathon 2012, &lt;em&gt;The Prague Bulletin of Mathematical Linguistics&lt;/em&gt;, vol. 98, pp. 63-74, 2012.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id87" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id46"&gt;[11]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Colin Cherry and George Foster, &amp;quot;Batch tuning strategies for statistical machine translation&amp;quot;,  In &lt;em&gt;Proceedings of the 2012 Conference of the North American Chapter of the Association for Computational Linguistics: Human Language Technologies&lt;/em&gt;, pages 427–436, 2012.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id88" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id47"&gt;[12]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Papineni, Kishore, Salim Roukos, Todd Ward, and Wei-Jing Zhu. &amp;quot;BLEU: A Method for Automatic Evaluation of Machine Translation.&amp;quot;, &lt;em&gt;Proceedings of the 40th Annual Meeting on Association for Computational Linguistics&lt;/em&gt;, pp. 311–318, 2002.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;table class="docutils footnote" frame="void" id="id89" rules="none"&gt;
&lt;colgroup&gt;&lt;col class="label" /&gt;&lt;col /&gt;&lt;/colgroup&gt;
&lt;tbody valign="top"&gt;
&lt;tr&gt;&lt;td class="label"&gt;&lt;a class="fn-backref" href="#id54"&gt;[13]&lt;/a&gt;&lt;/td&gt;&lt;td&gt;Gale, William A., and Geoffrey Sampson. &amp;quot;Good‐turing Frequency Estimation without Tears.&amp;quot; &lt;em&gt;Journal of Quantitative Linguistics&lt;/em&gt; 2.3 (1995): 217-37.&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="文言文"></category><category term="翻译"></category></entry><entry><title>通用密码字典（第三版）</title><link href="/newdictv3.html" rel="alternate"></link><published>2016-02-24T21:57:00+08:00</published><updated>2016-02-24T21:57:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2016-02-24:/newdictv3.html</id><summary type="html">&lt;p&gt;一个更高级的密码字典。这个密码字典的不同之处在于通过收集实际使用的密码、过滤并使用密码强度评分排序，提高使用字典的效率。（前两版就内部消化掉了）&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/"&gt;zxcvbn&lt;/a&gt; 库通过识别常见密码、代换、序列等组合，计算出密码强度，具有相当大的量化参考价值。使用 zxcvbn 密码强度来排序密码字典可以使实际应用更高效，由易到难，节约大量时间。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;特点&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;大部分来源于实际使用的密码&lt;ul&gt;
&lt;li&gt;常用高质量密码字典&lt;/li&gt;
&lt;li&gt;密码泄漏及社工库等&lt;/li&gt;
&lt;li&gt;没有包括用户名、邮箱等信息&lt;/li&gt;
&lt;li&gt;没有进行任何变换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;过滤无意义密码&lt;ul&gt;
&lt;li&gt;密码仅包含 ASCII 可打印字符及空格&lt;/li&gt;
&lt;li&gt;密码长度不超过 64 个字符&lt;/li&gt;
&lt;li&gt;密码强度 (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zxcvbn(pwd).guesses_log10&lt;/span&gt;&lt;/tt&gt;) 不超过 50（不同版本 zxcvbn 得出的强度可能不同）&lt;/li&gt;
&lt;li&gt;除去常见 hash、过长的网址等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 zxcvbn 评分排序&lt;ul&gt;
&lt;li&gt;通过简单截断就可以得到更小的字典&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.6G，348277374 行 …&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;一个更高级的密码字典。这个密码字典的不同之处在于通过收集实际使用的密码、过滤并使用密码强度评分排序，提高使用字典的效率。（前两版就内部消化掉了）&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="https://blogs.dropbox.com/tech/2012/04/zxcvbn-realistic-password-strength-estimation/"&gt;zxcvbn&lt;/a&gt; 库通过识别常见密码、代换、序列等组合，计算出密码强度，具有相当大的量化参考价值。使用 zxcvbn 密码强度来排序密码字典可以使实际应用更高效，由易到难，节约大量时间。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;特点&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;大部分来源于实际使用的密码&lt;ul&gt;
&lt;li&gt;常用高质量密码字典&lt;/li&gt;
&lt;li&gt;密码泄漏及社工库等&lt;/li&gt;
&lt;li&gt;没有包括用户名、邮箱等信息&lt;/li&gt;
&lt;li&gt;没有进行任何变换&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;过滤无意义密码&lt;ul&gt;
&lt;li&gt;密码仅包含 ASCII 可打印字符及空格&lt;/li&gt;
&lt;li&gt;密码长度不超过 64 个字符&lt;/li&gt;
&lt;li&gt;密码强度 (&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;zxcvbn(pwd).guesses_log10&lt;/span&gt;&lt;/tt&gt;) 不超过 50（不同版本 zxcvbn 得出的强度可能不同）&lt;/li&gt;
&lt;li&gt;除去常见 hash、过长的网址等&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;使用 zxcvbn 评分排序&lt;ul&gt;
&lt;li&gt;通过简单截断就可以得到更小的字典&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;3.6G，348277374 行，ASCII 编码，LF 行尾&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;a class="reference external" href="https://mega.nz/#!Qwc1SQBI!rBmdEeZHICklyWNBq6YlaC6sFE_U5SWpM-VnRdy35R0"&gt;下载地址&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;部分源码&lt;/h2&gt;
&lt;pre class="code javascript literal-block" id="pwdsort-js"&gt;
 &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;zxcvbn&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'./zxcvbn.js'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;readline&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'readline'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="kd"&gt;var&lt;/span&gt; &lt;span class="nx"&gt;rl&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;readline&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;createInterface&lt;/span&gt;&lt;span class="p"&gt;({&lt;/span&gt;
   &lt;span class="nx"&gt;input&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdin&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
   &lt;span class="nx"&gt;output&lt;/span&gt;&lt;span class="o"&gt;:&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="nx"&gt;require&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'stream'&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;Writable&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
 &lt;span class="p"&gt;});&lt;/span&gt;

 &lt;span class="nx"&gt;rl&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;on&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'line'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="kd"&gt;function&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;){&lt;/span&gt;
         &lt;span class="nx"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;line&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="nx"&gt;strength&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nx"&gt;zxcvbn&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;pwd&lt;/span&gt;&lt;span class="p"&gt;).&lt;/span&gt;&lt;span class="nx"&gt;guesses_log10&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt;
         &lt;span class="nx"&gt;process&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;stdout&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="nx"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nx"&gt;strength&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'\t'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="nx"&gt;pwd&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="s1"&gt;'\n'&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt;
 &lt;span class="p"&gt;});&lt;/span&gt;
&lt;/pre&gt;
&lt;pre class="code bash literal-block"&gt;
pv newallfiltered.txt &lt;span class="p"&gt;|&lt;/span&gt; parallel --pipe -j -2 nodejs pwdsort.js &lt;span class="p"&gt;|&lt;/span&gt; env &lt;span class="nv"&gt;LC_ALL&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;C sort -S 5G --parallel&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="m"&gt;2&lt;/span&gt; -u -k 1n,1n -k &lt;span class="m"&gt;2&lt;/span&gt; -t &lt;span class="s1"&gt;$'\t'&lt;/span&gt; &lt;span class="p"&gt;|&lt;/span&gt; pigz &amp;gt; filtered-zxcvbn-s.txt.gz
pv filtered-zxcvbn-s.txt.gz &lt;span class="p"&gt;|&lt;/span&gt; pigz -dc &lt;span class="p"&gt;|&lt;/span&gt; cut -d &lt;span class="s1"&gt;$'\t'&lt;/span&gt; -f &lt;span class="m"&gt;2&lt;/span&gt;- &amp;gt; newdictv3.txt
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;注意&lt;/strong&gt;：密码字典没有版权。作者不承担因使用造成的任何后果。&lt;/p&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="密码"></category></entry><entry><title>独立使用 Tor 的流量混淆插件</title><link href="/ptproxy.html" rel="alternate"></link><published>2015-08-19T22:26:00+08:00</published><updated>2015-08-19T22:26:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2015-08-19:/ptproxy.html</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="https://www.torproject.org/"&gt;Tor&lt;/a&gt; 项目中的&lt;a class="reference external" href="https://www.torproject.org/docs/pluggable-transports.html.en"&gt;传输插件 (Pluggable Transports)&lt;/a&gt; 一直以来都只用于网桥的防探测，避开网络设备的深度包检测。这些协议中不乏优秀的混淆或伪装算法，例如 obfs 系列以及 meek 等。而很多插件并不提供独立使用的接口，限制了它们的应用场景。&lt;/p&gt;
&lt;p&gt;经过研究 Tor 的 Pluggable Transport 协议，我写了一个简单的包装脚本来将其实用化：&lt;a class="reference external" href="https://github.com/gumblex/ptproxy"&gt;https://github.com/gumblex/ptproxy&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;这些传输插件只负责传输 TCP 流量，必须要有实际应用服务器部署，例如转发 SSH、HTTP 代理流量。推荐使用 obfs4，并将 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;iat-mode&lt;/span&gt;&lt;/tt&gt; 设为 1 或 2（隐藏发包的时间特征，服务端在第一次运行后修改 &lt;tt class="docutils literal"&gt;obfs4_state.json&lt;/tt&gt;）。&lt;strong&gt;注意：&lt;/strong&gt;有些传输插件并不带有加密，请仔细阅读这些插件的文档 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a class="reference external" href="https://www.torproject.org/"&gt;Tor&lt;/a&gt; 项目中的&lt;a class="reference external" href="https://www.torproject.org/docs/pluggable-transports.html.en"&gt;传输插件 (Pluggable Transports)&lt;/a&gt; 一直以来都只用于网桥的防探测，避开网络设备的深度包检测。这些协议中不乏优秀的混淆或伪装算法，例如 obfs 系列以及 meek 等。而很多插件并不提供独立使用的接口，限制了它们的应用场景。&lt;/p&gt;
&lt;p&gt;经过研究 Tor 的 Pluggable Transport 协议，我写了一个简单的包装脚本来将其实用化：&lt;a class="reference external" href="https://github.com/gumblex/ptproxy"&gt;https://github.com/gumblex/ptproxy&lt;/a&gt; 。&lt;/p&gt;
&lt;p&gt;这些传输插件只负责传输 TCP 流量，必须要有实际应用服务器部署，例如转发 SSH、HTTP 代理流量。推荐使用 obfs4，并将 &lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;iat-mode&lt;/span&gt;&lt;/tt&gt; 设为 1 或 2（隐藏发包的时间特征，服务端在第一次运行后修改 &lt;tt class="docutils literal"&gt;obfs4_state.json&lt;/tt&gt;）。&lt;strong&gt;注意：&lt;/strong&gt;有些传输插件并不带有加密，请仔细阅读这些插件的文档。&lt;/p&gt;
&lt;p&gt;运行包装脚本只要执行 &lt;tt class="docutils literal"&gt;python3 ptproxy.py &lt;span class="pre"&gt;[-c|-s]&lt;/span&gt; [config.json]&lt;/tt&gt;。&lt;tt class="docutils literal"&gt;&lt;span class="pre"&gt;-c,&lt;/span&gt; &lt;span class="pre"&gt;-s&lt;/span&gt;&lt;/tt&gt; 覆盖配置文件的角色设置。运行服务端后会打印出客户端所需要指定的 &lt;tt class="docutils literal"&gt;&amp;quot;ptargs&amp;quot;&lt;/tt&gt; 值（这些值通常是密钥和加密参数）。配置文件是一个 JSON 文件：（实际使用要将带 # 的行去掉）（如果不指定配置文件，使用 Python 脚本开头的设置）&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="p"&gt;{&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;client|server&lt;/span&gt; &lt;span class="err"&gt;客户端或服务器&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;role&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;状态文件储存位置&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;state&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;.&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;转发服务器的什么地址&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;（例如&lt;/span&gt; &lt;span class="err"&gt;HTTP&lt;/span&gt; &lt;span class="err"&gt;代理服务器地址，不必对外监听）&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;或监听客户端的什么地址&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;local&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;127.0.0.1:1080&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;监听服务器的什么地址（对外监听端口）&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;或连接服务器的地址&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;server&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;0.0.0.0:23456&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;执行传输插件的命令行（这里是&lt;/span&gt; &lt;span class="err"&gt;obfs4）&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;ptexec&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;obfs4proxy -logLevel=ERROR -enableLogging=true&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;传输插件名称&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;ptname&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;obfs4&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;[客户端]&lt;/span&gt; &lt;span class="err"&gt;传输插件参数&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;ptargs&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cert=AAAAAAAAAAAAAAAAAAAAAAAAAAAAA+AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA;iat-mode=0&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;[可选][服务器]&lt;/span&gt; &lt;span class="err"&gt;传输插件参数&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;格式&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;key&amp;gt;=&amp;lt;value&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;[;&amp;lt;key&amp;gt;=&amp;lt;value&amp;gt;&lt;/span&gt; &lt;span class="err"&gt;...]&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;ptserveropt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;[可选][客户端]&lt;/span&gt; &lt;span class="err"&gt;传输插件的前置代理&lt;/span&gt;
    &lt;span class="err"&gt;//&lt;/span&gt; &lt;span class="err"&gt;格式&lt;/span&gt; &lt;span class="err"&gt;&amp;lt;proxy_type&amp;gt;://[&amp;lt;user_name&amp;gt;][:&amp;lt;password&amp;gt;][@]&amp;lt;ip&amp;gt;:&amp;lt;port&amp;gt;&lt;/span&gt;
    &lt;span class="nt"&gt;&amp;quot;ptproxy&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;Bash 版 &lt;tt class="docutils literal"&gt;ptproxy.sh&lt;/tt&gt; 是之前的版本，因为 &lt;tt class="docutils literal"&gt;socat&lt;/tt&gt; 没有对 SOCKS5 协议的完整支持，无法与一些传输插件通信。Python 版的重新实现支持 SOCKS4/5 协议，并改善了进程管理和 TCP 服务器。&lt;/p&gt;
&lt;p&gt;关于这些传输插件的具体解释和比较可参见 &lt;a class="reference external" href="https://trac.torproject.org/projects/tor/wiki/doc/AChildsGardenOfPluggableTransports"&gt;A Child's Garden of Pluggable Transports (Tor Wiki)&lt;/a&gt;。&lt;/p&gt;
</content><category term="电脑技术"></category><category term="Tor"></category></entry><entry><title>Python 中文数字转换</title><link href="/python-num2chinese.html" rel="alternate"></link><published>2015-02-08T11:23:00+08:00</published><updated>2015-02-08T11:23:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2015-02-08:/python-num2chinese.html</id><summary type="html">&lt;p&gt;都什么年代了连个好的 Python
数字转中文的程序都找不到。所以只能重新发明轮子了。&lt;/p&gt;
&lt;p&gt;这个程序按照四位一组的划分，倒序拼写数字，准确处理补零、十几、小数的问题，支持大写、繁体、〇、两的写法，最多整数部分可达
48 位。由于浮点数型限制，长整数和小数应传入 int, Decimal
或字符串型。缺点只有不支持浮点数中的科学记数法（可以自己分段传入）。Python
2 只需将所有字符串改成 unicode 即可使用。&lt;/p&gt;
&lt;p&gt;授权：WTFPL 或 Unlicense 或 CC0，即公有领域授权，想干嘛干嘛。&lt;a class="reference external" href="https://gist.github.com/gumblex/0d65cad2ba607fd14de7"&gt;Gist
链接&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;num2chinese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twoalt …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;都什么年代了连个好的 Python
数字转中文的程序都找不到。所以只能重新发明轮子了。&lt;/p&gt;
&lt;p&gt;这个程序按照四位一组的划分，倒序拼写数字，准确处理补零、十几、小数的问题，支持大写、繁体、〇、两的写法，最多整数部分可达
48 位。由于浮点数型限制，长整数和小数应传入 int, Decimal
或字符串型。缺点只有不支持浮点数中的科学记数法（可以自己分段传入）。Python
2 只需将所有字符串改成 unicode 即可使用。&lt;/p&gt;
&lt;p&gt;授权：WTFPL 或 Unlicense 或 CC0，即公有领域授权，想干嘛干嘛。&lt;a class="reference external" href="https://gist.github.com/gumblex/0d65cad2ba607fd14de7"&gt;Gist
链接&lt;/a&gt;&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;itertools&lt;/span&gt;

&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;num2chinese&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;True&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;twoalt&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="kc"&gt;False&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="sd"&gt;    Converts numbers to Chinese representations.&lt;/span&gt;

&lt;span class="sd"&gt;    `big`   : use financial characters.&lt;/span&gt;
&lt;span class="sd"&gt;    `simp`  : use simplified characters instead of traditional characters.&lt;/span&gt;
&lt;span class="sd"&gt;    `o`     : use 〇 for zero.&lt;/span&gt;
&lt;span class="sd"&gt;    `twoalt`: use 两/兩 for two when appropriate.&lt;/span&gt;

&lt;span class="sd"&gt;    Note that `o` and `twoalt` is ignored when `big` is used,&lt;/span&gt;
&lt;span class="sd"&gt;    and `twoalt` is ignored when `o` is used for formal representations.&lt;/span&gt;
&lt;span class="sd"&gt;    &amp;quot;&amp;quot;&amp;quot;&lt;/span&gt;
    &lt;span class="c1"&gt;# check num first&lt;/span&gt;
    &lt;span class="n"&gt;nd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;abs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;float&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mf"&gt;1e48&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;number out of range&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;e&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;raise&lt;/span&gt; &lt;span class="ne"&gt;ValueError&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;scientific notation is not supported&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;c_symbol&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;正负点&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;正負點&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# formal&lt;/span&gt;
        &lt;span class="n"&gt;twoalt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kc"&gt;False&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;big&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;c_basic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;零壹贰叁肆伍陆柒捌玖&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;零壹貳參肆伍陸柒捌玖&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;c_unit1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;拾佰仟&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;c_twoalt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;贰&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;貳&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;c_basic&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;〇一二三四五六七八九&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;o&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;零一二三四五六七八九&amp;#39;&lt;/span&gt;
        &lt;span class="n"&gt;c_unit1&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;十百千&amp;#39;&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;twoalt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;c_twoalt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;两&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;兩&amp;#39;&lt;/span&gt;
        &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;c_twoalt&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;二&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;c_unit2&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;万亿兆京垓秭穰沟涧正载&amp;#39;&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;simp&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;萬億兆京垓秭穰溝澗正載&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;revuniq&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;k&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;k&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;g&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;itertools&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;groupby&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;l&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
    &lt;span class="n"&gt;nd&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="nb"&gt;str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;num&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;+&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;nd&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;lstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;+-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="kc"&gt;None&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
        &lt;span class="n"&gt;splitted&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;max&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
                    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;range&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;integer&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt;
        &lt;span class="n"&gt;intresult&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
        &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nu&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;splitted&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="c1"&gt;# special cases&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 0000&lt;/span&gt;
                &lt;span class="n"&gt;intresult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;nu&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# 0002&lt;/span&gt;
                &lt;span class="n"&gt;intresult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_twoalt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c_unit2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nu&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;continue&lt;/span&gt;
            &lt;span class="n"&gt;ulist&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[]&lt;/span&gt;
            &lt;span class="n"&gt;unit&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;zfill&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="mi"&gt;4&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;nc&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="nb"&gt;enumerate&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;reversed&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;)):&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;  &lt;span class="c1"&gt;# ???0&lt;/span&gt;
                        &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;nc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;)])&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;nc&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;1&amp;#39;&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;unit&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="c1"&gt;# special case for tens&lt;/span&gt;
                    &lt;span class="c1"&gt;# edit the &amp;#39;elif&amp;#39; if you don&amp;#39;t like&lt;/span&gt;
                    &lt;span class="c1"&gt;# 十四, 三千零十四, 三千三百一十四&lt;/span&gt;
                    &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_unit1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;elif&lt;/span&gt; &lt;span class="n"&gt;nc&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;2&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_twoalt&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c_unit1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c_unit1&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nc&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
            &lt;span class="n"&gt;ustr&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;revuniq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ulist&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nu&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;intresult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ustr&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;intresult&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ustr&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;c_unit2&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;nu&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;revuniq&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;intresult&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
    &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_symbol&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;
        &lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;append&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;c_basic&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ch&lt;/span&gt;&lt;span class="p"&gt;)]&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;ch&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;remainder&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;举例：&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;-1570712237615.5527&lt;/div&gt;
&lt;div class="line"&gt;负一兆五千七百零七亿一千二百二十三万七千六百一十五点五五二七&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;110184432904.79883&lt;/div&gt;
&lt;div class="line"&gt;一千一百零一亿八千四百四十三万二千九百零四点七九八八三&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;+4530692101492.777&lt;/div&gt;
&lt;div class="line"&gt;正四兆五千三百零六亿九千二百一十万一千四百九十二点七七七&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;-8274510741923.016&lt;/div&gt;
&lt;div class="line"&gt;负八兆两千七百四十五亿一千零七十四万一千九百二十三点零一六&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;744287603383.8828&lt;/div&gt;
&lt;div class="line"&gt;柒仟肆佰肆拾贰亿捌仟柒佰陆拾万叁仟叁佰捌拾叁点捌捌贰捌&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;-8863371530966.008&lt;/div&gt;
&lt;div class="line"&gt;负捌兆捌仟陆佰叁拾叁亿柒仟壹佰伍拾叁万零玖佰陆拾陆点零零捌&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;5096195844576.447&lt;/div&gt;
&lt;div class="line"&gt;伍兆零玖佰陸拾壹億玖仟伍佰捌拾肆萬肆仟伍佰柒拾陸點肆肆柒&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;-6652253865814.708&lt;/div&gt;
&lt;div class="line"&gt;負陸兆陸仟伍佰貳拾貳億伍仟參佰捌拾陸萬伍仟捌佰壹拾肆點柒零捌&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
</content><category term="软件编程"></category><category term="Python"></category></entry><entry><title>文言文机器翻译</title><link href="/wenyan-translate.html" rel="alternate"></link><published>2015-01-18T14:59:00+08:00</published><updated>2015-01-18T14:59:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2015-01-18:/wenyan-translate.html</id><content type="html">&lt;p&gt;&lt;a class="reference external" href="https://app.gumble.pw/wenyan/"&gt;在线文言文机器翻译&lt;/a&gt;即日起开始试运行。这个本来去年年末就可以上线，但由于各种各样问题，只好在2015年第一天上线。现在系统还在各种微调、提高性能，会经常更新，统计模型也会不时更新。由于资源限制，翻译速度可能略&lt;strong&gt;慢&lt;/strong&gt;，也可能出现各种错误。&lt;/p&gt;
&lt;p&gt;这个项目从2014年5月起开始试验，使用了&lt;a class="reference external" href="http://statmt.org/moses/"&gt;Moses&lt;/a&gt;统计机器翻译系统，逐渐完善了各种配套工具，例如&lt;a class="reference external" href="https://github.com/gumblex/jieba/tree/wenyan"&gt;文言文分词&lt;/a&gt;（基于结巴分词）、&lt;a class="reference external" href="https://github.com/gumblex/zhconv"&gt;简繁转换&lt;/a&gt;、分句等。主要使用维基文库、维基百科数据建立了三元文言文、现代文语言模型。平行语料采集于几个文言文翻译网站，使用机器翻译辅助句对齐，目前共有约五十万句。&lt;/p&gt;
&lt;p&gt;经测试，
这个翻译系统总体优于百度，特别是现代文翻译文言文；更优于简单查找替换翻译系统。但由于词库等原因，人名地名可能处理不好。总之，能用。&lt;/p&gt;
</content><category term="作品发布"></category><category term="文言文"></category><category term="翻译"></category></entry><entry><title>一点想法</title><link href="/some-thoughts.html" rel="alternate"></link><published>2014-10-01T20:00:00+08:00</published><updated>2014-10-01T20:00:00+08:00</updated><author><name>Freya</name></author><id>tag:None,2014-10-01:/some-thoughts.html</id><content type="html">&lt;p&gt;墙外风起云涌，墙内风平浪静。想起刚订阅CDT的时候，每天都被这些存在但被掩盖的真相轰炸的心力交瘁，深深的失望，还有面对这些信息的无能为力。&lt;/p&gt;
&lt;p&gt;自己不过是读者，那么那些真实经历过这一些的人呢？他们的失望，恐怕更甚。我一直支持明哲保身的观点，觉得有着优渥的工作和生活，还有一定社会地位的他们，为了民主和公平挺身算不上明智，但是，如果没有他们，如果没有人在与之抗争。也许这一切都会回到从前，带着未开化的麻木。&lt;/p&gt;
&lt;p&gt;这些天，H*K的动荡变得难以掩盖，原来，人民军队的枪口，最终还是对向人民的。根据以往的经验，例如六*四，当民主的呼声被枪炮打断，中国就会陷入一个更加不公平，不民主的境地，可以想象的是，如果这一次，H*K的呼声被浓浓白烟镇压，中国最终只能回到那个未开化的年代，从此以后，民主的呼声越来越少，而我们敬仰的它，会用更暴力粗糙的方法掩盖真相，我们最终会活在一个“造”出来的世界中。&lt;/p&gt;
&lt;p&gt;即使痛苦，拒绝对着真相视而不见，拒绝盲目，这是我的选择。&lt;/p&gt;
&lt;p&gt;10月1日，祝祖国生日快乐。&lt;/p&gt;
</content><category term="时事评论"></category></entry><entry><title>定远中黑</title><link href="/dingyuanzhonghei.html" rel="alternate"></link><published>2014-06-02T12:42:00+08:00</published><updated>2014-06-02T12:42:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-06-02:/dingyuanzhonghei.html</id><content type="html">&lt;p&gt;&lt;a class="reference external" href="http://wenq.org/wqy2/index.cgi?ZenHei"&gt;文泉驿正黑&lt;/a&gt;是一个全面的中文字体，开源，难看。但加粗后就不是很糟糕了。&lt;strong&gt;定远中黑&lt;/strong&gt;是它加粗完善后的版本，加粗比长宽约3:1。对字符位置进行了微调，对其他一些字符（特别是数字）进行了手工调整。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2014/06/DingyuanZhonghei.png"&gt;&lt;img alt="定远中黑" src="/static/2014/06/DingyuanZhonghei.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;我又借用了一下Ubuntu自带的字体预览。&lt;/p&gt;
&lt;p&gt;现在看上去还行。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2014/06/DingyuanZhongHei.ttf_.zip"&gt;DingyuanZhongHei.ttf&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;授权协议：&lt;a class="reference external" href="http://www.gnu.org/licenses/gpl-2.0.html"&gt;GNU General Public License
2&lt;/a&gt;。&lt;/p&gt;
</content><category term="图像作品"></category></entry><entry><title>维基编年史</title><link href="/wikihistory.html" rel="alternate"></link><published>2014-05-31T19:23:00+08:00</published><updated>2014-05-31T19:23:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-05-31:/wikihistory.html</id><summary type="html">&lt;p&gt;维基百科的日期条目齐全得可以写一本历史书了。&lt;/p&gt;
&lt;p&gt;《维基编年史》：按年代、年份排序&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-cn.html"&gt;大陆简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-cn.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-hk.html"&gt;香港繁體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-hk.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-sg.html"&gt;马新简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-sg.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-tw.html"&gt;台灣正體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-tw.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《维基日历》：按日期排序&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-cn.html"&gt;大陆简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-cn.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-hk.html"&gt;香港繁體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-hk.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-sg.html"&gt;马新简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-sg.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-tw.html"&gt;台灣正體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-tw.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2017年9月13日更新：&lt;/strong&gt;数据更新，修正一些问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016年1月1日更新：&lt;/strong&gt;&lt;a class="reference external" href="https://github.com/gumblex/wikihistory"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015年11月7日更新：&lt;/strong&gt;所有版本EPub，修正各种Bug。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015年3月1日更新&lt;/strong&gt;：数据更新，EPub 格式改进。&lt;/p&gt;
&lt;p&gt;运用MediaWiki的字词转换表进行了简繁/地区词转换，对手工转换也处理了。&lt;/p&gt;
&lt;p&gt;如要经常翻阅，建议先下载保存后阅读。&lt;/p&gt;
&lt;p&gt;文本授权协议：&lt;a class="reference external" href="http://zh.wikipedia.org/zh-cn/Wikipedia%3ACC-BY-SA-3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC"&gt;知识共享 署名-相同方式共享
3.0协议&lt;/a&gt;；程序授权协议：GNU
GPL v3+。&lt;/p&gt;
&lt;p&gt;源代码：&lt;a class="reference external" href="https://github.com/gumblex/wikihistory"&gt;GitHub …&lt;/a&gt;&lt;/p&gt;</summary><content type="html">&lt;p&gt;维基百科的日期条目齐全得可以写一本历史书了。&lt;/p&gt;
&lt;p&gt;《维基编年史》：按年代、年份排序&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-cn.html"&gt;大陆简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-cn.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-hk.html"&gt;香港繁體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-hk.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-sg.html"&gt;马新简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-sg.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikihistory_zh-tw.html"&gt;台灣正體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikihistory_zh-tw.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;《维基日历》：按日期排序&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-cn.html"&gt;大陆简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-cn.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-hk.html"&gt;香港繁體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-hk.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-sg.html"&gt;马新简体&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-sg.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/wikicalendar_zh-tw.html"&gt;台灣正體&lt;/a&gt;
(&lt;a class="reference external" href="/static/wikicalendar_zh-tw.epub"&gt;EPub&lt;/a&gt;)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;2017年9月13日更新：&lt;/strong&gt;数据更新，修正一些问题。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2016年1月1日更新：&lt;/strong&gt;&lt;a class="reference external" href="https://github.com/gumblex/wikihistory"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015年11月7日更新：&lt;/strong&gt;所有版本EPub，修正各种Bug。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;2015年3月1日更新&lt;/strong&gt;：数据更新，EPub 格式改进。&lt;/p&gt;
&lt;p&gt;运用MediaWiki的字词转换表进行了简繁/地区词转换，对手工转换也处理了。&lt;/p&gt;
&lt;p&gt;如要经常翻阅，建议先下载保存后阅读。&lt;/p&gt;
&lt;p&gt;文本授权协议：&lt;a class="reference external" href="http://zh.wikipedia.org/zh-cn/Wikipedia%3ACC-BY-SA-3.0%E5%8D%8F%E8%AE%AE%E6%96%87%E6%9C%AC"&gt;知识共享 署名-相同方式共享
3.0协议&lt;/a&gt;；程序授权协议：GNU
GPL v3+。&lt;/p&gt;
&lt;p&gt;源代码：&lt;a class="reference external" href="https://github.com/gumblex/wikihistory"&gt;GitHub&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;旧源代码及相关文件：&lt;a class="reference external" href="/static/2014/05/wikihis.7z"&gt;wikihis.7z&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;压缩包文件说明&lt;/h2&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;制作过程&lt;/h3&gt;
&lt;p&gt;可参见&lt;tt class="docutils literal"&gt;make.sh&lt;/tt&gt;自动生成。&lt;/p&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;下载&lt;a class="reference external" href="http://dumps.wikimedia.org/zhwiki/latest/"&gt;维基百科XML数据&lt;/a&gt;：选择
zhwiki-latest-pages-articles.xml.bz2。注意你的硬盘。&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;bzcat &lt;span class="pre"&gt;zhwiki-20140526-pages-articles.xml.bz2&lt;/span&gt; | python3 WikiExtractoryear.py&lt;/tt&gt;&lt;/li&gt;
&lt;li&gt;&lt;tt class="docutils literal"&gt;python3 sorthistory.py &lt;span class="pre"&gt;-l&lt;/span&gt; &amp;lt;语言&amp;gt; &lt;span class="pre"&gt;-i&lt;/span&gt; &amp;lt;XML文件名&amp;gt;&lt;/tt&gt; -l 选项可以为：&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;zh-cn&lt;/strong&gt; 大陆简体&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zh-hk&lt;/strong&gt; 香港繁體&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zh-sg&lt;/strong&gt; 马新简体&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;zh-tw&lt;/strong&gt; 台灣正體&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;维基日历制作过程相同，脚本文件名为&lt;tt class="docutils literal"&gt;WikiExtractordate.py&lt;/tt&gt;、&lt;tt class="docutils literal"&gt;sortdate.py&lt;/tt&gt;。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;文件说明&lt;/h3&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;README.md&lt;/strong&gt; 本说明。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;make.sh&lt;/strong&gt; 自动制作脚本：使用前请按实际修改。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;WikiExtractoryear.py&lt;/strong&gt;、&lt;strong&gt;WikiExtractordate.py&lt;/strong&gt;
筛选原存档XML中所需部分。&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;sorthistory.py&lt;/strong&gt;、&lt;strong&gt;sortdate.py&lt;/strong&gt;
整理筛选出的XML文件并生成HTML。&lt;/li&gt;
&lt;li&gt;&lt;dl class="first docutils"&gt;
&lt;dt&gt;&lt;strong&gt;style.css&lt;/strong&gt; HTML样式。&lt;/dt&gt;
&lt;dd&gt;生成文件：&lt;/dd&gt;
&lt;/dl&gt;
&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wikihistory_*.html&lt;/strong&gt; 《维基编年史》&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wikicalendar_*.html&lt;/strong&gt; 《维基日历》&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wikihistory_*.epub&lt;/strong&gt; 《维基编年史》EPUB&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;wikicalendar_*.epub&lt;/strong&gt; 《维基日历》EPUB&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="维基百科"></category></entry><entry><title>通过2048游戏界面推断其应得分</title><link href="/2048.html" rel="alternate"></link><published>2014-05-06T21:08:00+08:00</published><updated>2014-05-06T21:08:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-05-06:/2048.html</id><summary type="html">&lt;p&gt;&lt;a class="reference external" href="http://gabrielecirulli.github.io/2048/"&gt;2048&lt;/a&gt; 是最近热门的一款游戏。在4×4的方格界面上，通过上下左右移动来将相同数字的方块合并，数字相加，获得一2048方块者获胜。在移动一次后，空白处随机出现一值为2或4的方块，如没有空白且无可合并方块，玩家输。已知出现方块2的概率为90%，且得分为每一次合并后所获得方块数值之和，问给定一游戏画面，如何判定其真伪？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解：&lt;/strong&gt;每一个方块都是由2或4方块累加而得，所以只需求出每一个方块应得分之和，即可判断得分是否在应得分范围内。&lt;/p&gt;
&lt;p&gt;如 16=8+8=4+4+4+4，4=2+2。所以要得到 16，就有至少 16×2=32 的分数。而如果生成的方块全是 2，则有 16×3=48 的分数。一般地，要得到方块数字 &lt;span class="formula"&gt;&lt;i&gt;a&lt;/i&gt;&lt;/span&gt;，最少得分（全部生成 4 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;&lt;a class="reference external" href="http://gabrielecirulli.github.io/2048/"&gt;2048&lt;/a&gt; 是最近热门的一款游戏。在4×4的方格界面上，通过上下左右移动来将相同数字的方块合并，数字相加，获得一2048方块者获胜。在移动一次后，空白处随机出现一值为2或4的方块，如没有空白且无可合并方块，玩家输。已知出现方块2的概率为90%，且得分为每一次合并后所获得方块数值之和，问给定一游戏画面，如何判定其真伪？&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;解：&lt;/strong&gt;每一个方块都是由2或4方块累加而得，所以只需求出每一个方块应得分之和，即可判断得分是否在应得分范围内。&lt;/p&gt;
&lt;p&gt;如 16=8+8=4+4+4+4，4=2+2。所以要得到 16，就有至少 16×2=32 的分数。而如果生成的方块全是 2，则有 16×3=48 的分数。一般地，要得到方块数字 &lt;span class="formula"&gt;&lt;i&gt;a&lt;/i&gt;&lt;/span&gt;，最少得分（全部生成 4）为
&lt;span class="formula"&gt;&lt;i&gt;a&lt;/i&gt;(log&lt;sub&gt;2&lt;/sub&gt;&lt;i&gt;a&lt;/i&gt; − 2)&lt;/span&gt; （&lt;span class="formula"&gt;&lt;i&gt;a&lt;/i&gt; = 2&lt;/span&gt; 时为 0），最多得分（全部生成 2）为 &lt;span class="formula"&gt;&lt;i&gt;a&lt;/i&gt;(log&lt;sub&gt;2&lt;/sub&gt;&lt;i&gt;a&lt;/i&gt; − 1)&lt;/span&gt;&lt;/p&gt;
&lt;p&gt;所以最终得分不能低于每一块最小分值之和，不能高于每一块最大分值之和。观察分值是否在此范围内即可得知是否真实。&lt;/p&gt;
&lt;p&gt;再考虑概率问题。有 10% 概率的方块 4 是直接出现的，得 0 分。所以得分的数学期望应为：&lt;/p&gt;
&lt;div class="formula"&gt;
&lt;i&gt;a&lt;/i&gt;(log&lt;sub&gt;2&lt;/sub&gt;&lt;i&gt;a&lt;/i&gt; − 2) + 0.9&lt;i&gt;a&lt;/i&gt; = &lt;i&gt;a&lt;/i&gt;(log&lt;sub&gt;2&lt;/sub&gt;&lt;i&gt;a&lt;/i&gt; − 1.1)
&lt;/div&gt;
&lt;p&gt;Python 程序：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;math&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;log&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;score&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="n"&gt;cmax&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="n"&gt;cmin&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="n"&gt;cavg&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="k"&gt;lambda&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;int&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;log&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;n&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="mf"&gt;1.1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;n&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt; &lt;span class="k"&gt;else&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmax&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cmin&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;
            &lt;span class="nb"&gt;sum&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;cavg&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;values&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</content><category term="生活杂记"></category><category term="游戏"></category></entry><entry><title>停止支持不是理由</title><link href="/no-excuses-for-upgrading.html" rel="alternate"></link><published>2014-04-13T13:48:00+08:00</published><updated>2014-04-13T13:48:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-04-13:/no-excuses-for-upgrading.html</id><summary type="html">&lt;p&gt;微软宣布停止对 Windows XP 的支持。&lt;/p&gt;
&lt;p&gt;有什么影响？没有，除了一些人把这当作一个不怎么样的理由。&lt;/p&gt;
&lt;p&gt;停止支持意味着停止更新，也就是说以后不再会有烦人的漏洞补丁。现有的 XP 电脑并不会停止工作，也不会立刻爆发出一批病毒木马把 XP 消灭。用来保护电脑的软件照常运行，一点事情都没有。第三方软件已经取得了很多电脑的控制权，使用 Windows
Update 来更新成了一个不起眼的选项，所以他们并不会因此“失去保护”。老的操作系统并不会吸引多少新的安全威胁，因为用户量在逐步减少。&lt;/p&gt;
&lt;p&gt;即便他们升级了，有多少人会去购买新的Windows呢？原来的XP又有多少是从正规渠道获得使用权的呢？微软是为了用户的利益着想，也是为了自己的新产品着想。就算有人确实认为使用盗版不对，也买不起正版，为什么不考虑一下别的选择呢？免费的操作系统有很多，早就已经达到了日常使用的质量标准，有着较好的兼容性和安全性，易于使用，也有我们日常使用的必备软件。即使这样，使用的人也不是很多。Windows 不是唯一的选择，就像 Microsoft
Office 一样。&lt;/p&gt;
&lt;p&gt;总而言之：升不升级与是否安全、是否可以继续使用无关 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;微软宣布停止对 Windows XP 的支持。&lt;/p&gt;
&lt;p&gt;有什么影响？没有，除了一些人把这当作一个不怎么样的理由。&lt;/p&gt;
&lt;p&gt;停止支持意味着停止更新，也就是说以后不再会有烦人的漏洞补丁。现有的 XP 电脑并不会停止工作，也不会立刻爆发出一批病毒木马把 XP 消灭。用来保护电脑的软件照常运行，一点事情都没有。第三方软件已经取得了很多电脑的控制权，使用 Windows
Update 来更新成了一个不起眼的选项，所以他们并不会因此“失去保护”。老的操作系统并不会吸引多少新的安全威胁，因为用户量在逐步减少。&lt;/p&gt;
&lt;p&gt;即便他们升级了，有多少人会去购买新的Windows呢？原来的XP又有多少是从正规渠道获得使用权的呢？微软是为了用户的利益着想，也是为了自己的新产品着想。就算有人确实认为使用盗版不对，也买不起正版，为什么不考虑一下别的选择呢？免费的操作系统有很多，早就已经达到了日常使用的质量标准，有着较好的兼容性和安全性，易于使用，也有我们日常使用的必备软件。即使这样，使用的人也不是很多。Windows 不是唯一的选择，就像 Microsoft
Office 一样。&lt;/p&gt;
&lt;p&gt;总而言之：升不升级与是否安全、是否可以继续使用无关。不升级，并不会无法使用、有安全隐患；升级，更不会意味着微软会收到你这一份操作系统的钱。&lt;/p&gt;
&lt;p&gt;消费者有选择的自由，不合理的事物总是有其继续存在的理由。&lt;/p&gt;
</content><category term="时事评论"></category><category term="Microsoft"></category><category term="XP"></category></entry><entry><title>关于信仰</title><link href="/about-belief.html" rel="alternate"></link><published>2014-03-08T15:37:00+08:00</published><updated>2014-03-08T15:37:00+08:00</updated><author><name>Freya</name></author><id>tag:None,2014-03-08:/about-belief.html</id><summary type="html">&lt;p&gt;关于这篇文章，其实已经构思了很久。自从订阅了某网站的每日电邮之后，似乎，被事不关己的态度所掩埋的，那个冲动热血的我，又一次杀出重围，血淋淋地显现出来。一种异常强大的失望感，一次次地让心头泛起阵阵苦涩--如若只是爱财或爱权，如若只是隐瞒一些牵扯到自身利益的消息，如若只是愚民，都无法让人如此失望。&lt;/p&gt;
&lt;p&gt;面对某些显赫人物在避税天堂的离岸资产，想起来曾几何时的一个最高层领导人的财产公告，这份公告不具备任何意义，唯一的用途只是愚民罢了。看到有许多人转载，感受得到他们心里的那种关于“清廉政府”的欣慰之情。看到了网站上的提示，转载，以让更多人有这样的知情权。当时，心里油然而生一种寒冷，真的应该转载吗？所谓的真相，真的能给人带来幸福吗？真相所能给人带来的，只有如此刺骨的寒冷，那，宁愿他们不知道罢。本着这种观念，我并未转载或传播相关的任何信息。心里想着，只要让百姓能感觉得到幸福就好，不想剥夺当他们看到所谓的“清廉政府”的喜悦感。&lt;/p&gt;
&lt;p&gt;然后，关注到了关于某位姓许的“新公民运动”活动家被当局起诉的事件，在认真研究了案例之后，发现许某的所为仅仅只是激励人们去争取自己的基本权利，告诫访民不要与政府起冲突，并一直试图以法律允许的手段为人民争取权利。然而，就是这样一个可以说是真正代表人民利益的人 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;关于这篇文章，其实已经构思了很久。自从订阅了某网站的每日电邮之后，似乎，被事不关己的态度所掩埋的，那个冲动热血的我，又一次杀出重围，血淋淋地显现出来。一种异常强大的失望感，一次次地让心头泛起阵阵苦涩--如若只是爱财或爱权，如若只是隐瞒一些牵扯到自身利益的消息，如若只是愚民，都无法让人如此失望。&lt;/p&gt;
&lt;p&gt;面对某些显赫人物在避税天堂的离岸资产，想起来曾几何时的一个最高层领导人的财产公告，这份公告不具备任何意义，唯一的用途只是愚民罢了。看到有许多人转载，感受得到他们心里的那种关于“清廉政府”的欣慰之情。看到了网站上的提示，转载，以让更多人有这样的知情权。当时，心里油然而生一种寒冷，真的应该转载吗？所谓的真相，真的能给人带来幸福吗？真相所能给人带来的，只有如此刺骨的寒冷，那，宁愿他们不知道罢。本着这种观念，我并未转载或传播相关的任何信息。心里想着，只要让百姓能感觉得到幸福就好，不想剥夺当他们看到所谓的“清廉政府”的喜悦感。&lt;/p&gt;
&lt;p&gt;然后，关注到了关于某位姓许的“新公民运动”活动家被当局起诉的事件，在认真研究了案例之后，发现许某的所为仅仅只是激励人们去争取自己的基本权利，告诫访民不要与政府起冲突，并一直试图以法律允许的手段为人民争取权利。然而，就是这样一个可以说是真正代表人民利益的人，以“聚众扰乱公共场所秩序”罪名被判刑。恍然发现，原来所谓公共场所的秩序，不是为了百姓利益而建立的，而是为了阻止人民争取基本权利而建立的。其中之荒唐，之可笑，之愤怒，之失望，最后全部化为心中的寒意，凉得彻底。既然一个政权的成立，既没有做到清廉，有没有做到是人们感到幸福，甚至还阻止着人们获取基本权益，那么，那些铺天盖地印在政治书上的话，就成了一个个冷笑话，又冷，又可笑。面对那些还沉浸在政党营造的环境中的，盲目拥护着其一切行动的人们，同情，是的，是深深的同情。&lt;/p&gt;
&lt;p&gt;前些天的政治课上，某位同学的政治演讲中，提到，达赖是世界乞丐，大意如此。“乞丐”？原来国人是这么称呼信仰的，那也难怪中国如此可怕了，没有信仰的人才是最可怕的，没有信仰，就没有约束，没有底线。作为半个信奉藏传佛教的教徒，深深明白达赖喇嘛在所有信教者心中的地位，这是一个神一般的存在，这就是他们的信仰的化身，这是一种力量。在藏传佛教中，有一个类似于“摸顶”的仪式，大抵便是由喇嘛给予那些信教者的祝福，传达着佛祖的庇佑。传闻，在西藏，达赖喇嘛为信教者摸顶时是不收取任何费用的，在其晚年，衰老到不能动时，依旧有侍从的人扶着他的手，为信教者行礼。可是，当寺院有难时，这些信教者，都会义无反顾的倾囊相助，即使倾家荡产也不辞。这是一种强大的力量，信仰的力量。&lt;/p&gt;
&lt;p&gt;我们的政府，之所以如此排斥喇嘛，正是因为感觉到了这种强大的力量对其统治地位的威胁。倘若达赖喇嘛振臂一挥，要求西藏独立，或者反对某个政党，信教者们势必义无反顾，因为他们心怀信仰。所以，为了稳固自己的统治地位，宁可扼杀所有的信仰，于是乎，从大而流，国人的信仰千篇一律的变成了拜金、求权。&lt;/p&gt;
&lt;p&gt;没有信仰的人如此可怕&lt;/p&gt;
&lt;p&gt;没有信仰的人如此可悲&lt;/p&gt;
&lt;p&gt;我的信仰是自由，这就注定着我将和那些不自由，不民主，缺乏人权的势力斗争。而我所作所说的一切，不是为了那个早已离我远去的正义，而仅仅只是因为信仰。&lt;/p&gt;
&lt;p&gt;Freya N&lt;/p&gt;
&lt;p&gt;2014.3.8&lt;/p&gt;
</content><category term="时事评论"></category></entry><entry><title>Possession</title><link href="/possession.html" rel="alternate"></link><published>2014-03-01T20:56:00+08:00</published><updated>2014-03-01T20:56:00+08:00</updated><author><name>Carlos Chan</name></author><id>tag:None,2014-03-01:/possession.html</id><content type="html">&lt;p&gt;当初做了这个选择有后悔过，但之后又不了了之。&lt;/p&gt;
&lt;p&gt;算是放弃了一切，到一个人生地不熟的学校开始。灯红酒绿的生活，奢靡浮夸的氛围，我陷了进去。然后开始嫌弃那些旧相识，认为他们只不过是一群井底之蛙，对着头顶的一寸天空便以为是世界。鄙视、无语。看着他们在酒杯里倒满whisky，却不懂酒；赶着她们的穿衣，活脱脱轻纺市场装扮。古里古怪的英文发音，咬字不清的普通话。没有人没我一起去看画展，去田子坊消磨掉一下午，又或者只是干坐着看杂志。&lt;/p&gt;
&lt;p&gt;习惯了，便以为自己真正属于了那个圈子。像是被蒙闭了双眼，以为那些触手可及。时间久了，心浮了，才开始想那里才是归宿。我终究不属于那里，同样也不属于这里。无法选择自己的出生，一台条路铁路拉近的又或许只是30分钟而已。30分钟或后，继续甘于平凡。&lt;/p&gt;
&lt;p&gt;但这终究，不属于我。&lt;/p&gt;
</content><category term="生活杂记"></category></entry><entry><title>定远正书体</title><link href="/stamico.html" rel="alternate"></link><published>2014-02-07T00:03:00+08:00</published><updated>2014-02-07T00:03:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-02-07:/stamico.html</id><summary type="html">&lt;p&gt;这个字体拖了好久，看上去终于可以发布了。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;样张&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2014/02/stamico.png"&gt;&lt;img alt="定远正书体" src="/static/2014/02/stamico.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不要喷为什么我“能吞下玻璃而不伤身体”，只是因为借用了一下Ubuntu自带的字体预览。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;说明&lt;/h2&gt;
&lt;p&gt;中文名“定远正书体”，英文名 &lt;em&gt;Stamico&lt;/em&gt;。名字没有来历，只是因为读起来顺口。&lt;/p&gt;
&lt;p&gt;字体共有6007个字符（包括空白），其中汉字5352个。包括所有基础ASCII字符，大部分拉丁、希腊字母，一些特殊符号和数学符号，注音符号，标点符号等。&lt;/p&gt;
&lt;p&gt;字体授权协议：&lt;a class="reference external" href="http://scripts.sil.org/OFL"&gt;OFL&lt;/a&gt; （开放字体授权），即您可以自由使用、修改、以相同协议再发行，但再发行时不可使用原字体名。当前版本1.1.2.1402，2014年2月6日。&lt;/p&gt;
&lt;p&gt;字体从2013年6月11日起，历经千辛万苦，使用各种自动化脚本，无数手工修改，还要迎合bug像星星一样多的&lt;a class="reference external" href="http://fontforge.org/"&gt;FontForge&lt;/a&gt;，包括手动编译，真是没话讲。在此感谢以下软件所做出的贡献：&lt;a class="reference external" href="http://fontforge.org/"&gt;FontForge&lt;/a&gt;、&lt;a class="reference external" href="http://inkscape.org/zh/"&gt;Inkscape&lt;/a&gt;、&lt;a class="reference external" href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;、&lt;a class="reference external" href="https://code.google.com/p/fontindustry/"&gt;fontindustry&lt;/a&gt;、Turbo
Photo、&lt;a class="reference external" href="http://www.geany.org/"&gt;Geany …&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;这个字体拖了好久，看上去终于可以发布了。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;样张&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2014/02/stamico.png"&gt;&lt;img alt="定远正书体" src="/static/2014/02/stamico.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;不要喷为什么我“能吞下玻璃而不伤身体”，只是因为借用了一下Ubuntu自带的字体预览。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;说明&lt;/h2&gt;
&lt;p&gt;中文名“定远正书体”，英文名 &lt;em&gt;Stamico&lt;/em&gt;。名字没有来历，只是因为读起来顺口。&lt;/p&gt;
&lt;p&gt;字体共有6007个字符（包括空白），其中汉字5352个。包括所有基础ASCII字符，大部分拉丁、希腊字母，一些特殊符号和数学符号，注音符号，标点符号等。&lt;/p&gt;
&lt;p&gt;字体授权协议：&lt;a class="reference external" href="http://scripts.sil.org/OFL"&gt;OFL&lt;/a&gt; （开放字体授权），即您可以自由使用、修改、以相同协议再发行，但再发行时不可使用原字体名。当前版本1.1.2.1402，2014年2月6日。&lt;/p&gt;
&lt;p&gt;字体从2013年6月11日起，历经千辛万苦，使用各种自动化脚本，无数手工修改，还要迎合bug像星星一样多的&lt;a class="reference external" href="http://fontforge.org/"&gt;FontForge&lt;/a&gt;，包括手动编译，真是没话讲。在此感谢以下软件所做出的贡献：&lt;a class="reference external" href="http://fontforge.org/"&gt;FontForge&lt;/a&gt;、&lt;a class="reference external" href="http://inkscape.org/zh/"&gt;Inkscape&lt;/a&gt;、&lt;a class="reference external" href="http://www.gimp.org/"&gt;GIMP&lt;/a&gt;、&lt;a class="reference external" href="https://code.google.com/p/fontindustry/"&gt;fontindustry&lt;/a&gt;、Turbo
Photo、&lt;a class="reference external" href="http://www.geany.org/"&gt;Geany&lt;/a&gt;等，以及&lt;a class="reference external" href="http://python.org"&gt;Python&lt;/a&gt;编程语言。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;p&gt;本地下载：&lt;a class="reference external" href="/static/2014/02/Stamico_1124.zip"&gt;Stamico_112.zip&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;源文件及脚本：&lt;a class="reference external" href="https://github.com/gumblex/stamico"&gt;Github&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="作品发布"></category><category term="字体"></category></entry><entry><title>布卡漫画下载文件提取工具</title><link href="/buka-extractor.html" rel="alternate"></link><published>2014-02-05T21:35:00+08:00</published><updated>2014-02-05T21:35:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-02-05:/buka-extractor.html</id><summary type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;功能&lt;/h2&gt;
&lt;p&gt;支持提取布卡漫画现有的多种格式（包括.buka，.jpg.view，.bup.view），保存为普通图片，并自动对文件夹重命名为漫画名和卷名。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;提示&lt;/h2&gt;
&lt;p&gt;请先将安卓手机中的漫画文件夹（/sdcard/ibuka/down）复制到硬盘再操作。提取后部分文件大小可能会大5倍。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;用法&lt;/h2&gt;
&lt;div class="section" id="windows"&gt;
&lt;h3&gt;Windows:&lt;/h3&gt;
&lt;p&gt;直接将包含漫画的文件夹或.buka文件拖放到图标上。或者命令行：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
buka.exe 输入文件夹 [输出文件夹]
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="linux"&gt;
&lt;h3&gt;Linux:&lt;/h3&gt;
&lt;p&gt;切换到程序所在的文件夹，命令行：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
python3 buka.py 输入文件夹 [输出文件夹]
&lt;/pre&gt;
&lt;p&gt;然后就可以使用各种图片浏览器、漫画阅读器欣赏漫画。&lt;/p&gt;
&lt;p&gt;源代码为&lt;tt class="docutils literal"&gt;buka.py&lt;/tt&gt;，有兴趣者可自由再开发，以MIT协议授权。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/gumblex/refine-buka"&gt;源代码&lt;/a&gt; （最新开发版，Github）&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/2014/02/buka.zip"&gt;本地下载&lt;/a&gt; （v1.5）&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;更新历史&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;2 …&lt;/strong&gt;&lt;/li&gt;&lt;/ul&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;功能&lt;/h2&gt;
&lt;p&gt;支持提取布卡漫画现有的多种格式（包括.buka，.jpg.view，.bup.view），保存为普通图片，并自动对文件夹重命名为漫画名和卷名。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;提示&lt;/h2&gt;
&lt;p&gt;请先将安卓手机中的漫画文件夹（/sdcard/ibuka/down）复制到硬盘再操作。提取后部分文件大小可能会大5倍。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;用法&lt;/h2&gt;
&lt;div class="section" id="windows"&gt;
&lt;h3&gt;Windows:&lt;/h3&gt;
&lt;p&gt;直接将包含漫画的文件夹或.buka文件拖放到图标上。或者命令行：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
buka.exe 输入文件夹 [输出文件夹]
&lt;/pre&gt;
&lt;/div&gt;
&lt;div class="section" id="linux"&gt;
&lt;h3&gt;Linux:&lt;/h3&gt;
&lt;p&gt;切换到程序所在的文件夹，命令行：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
python3 buka.py 输入文件夹 [输出文件夹]
&lt;/pre&gt;
&lt;p&gt;然后就可以使用各种图片浏览器、漫画阅读器欣赏漫画。&lt;/p&gt;
&lt;p&gt;源代码为&lt;tt class="docutils literal"&gt;buka.py&lt;/tt&gt;，有兴趣者可自由再开发，以MIT协议授权。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;下载&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="https://github.com/gumblex/refine-buka"&gt;源代码&lt;/a&gt; （最新开发版，Github）&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="/static/2014/02/buka.zip"&gt;本地下载&lt;/a&gt; （v1.5）&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;更新历史&lt;/h2&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;&lt;strong&gt;2.0&lt;/strong&gt; 及之后版本见 &lt;a class="reference external" href="https://github.com/gumblex/refine-buka"&gt;Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;1.55开发版 检测是否能运行dwebp&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.5&lt;/strong&gt; 对.buka文件头的完整支持，改进重命名&lt;/li&gt;
&lt;li&gt;[STRIKEOUT:&lt;strong&gt;1.4&lt;/strong&gt; 内部版本]&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.3&lt;/strong&gt; 改进自动重命名&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.2&lt;/strong&gt;
基于&lt;a class="reference external" href="https://github.com/sillyousu/refine-buka"&gt;sillyousu/refine-buka&lt;/a&gt;，替换原有.buka解析方法&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;1.1&lt;/strong&gt; 基于网上搜索jpg文件头的代码解析.buka，增加.bup解析、自动重命名&lt;/li&gt;
&lt;/ul&gt;
&lt;/div&gt;
</content><category term="代码软件"></category><category term="软件"></category></entry><entry><title>技术支持小抄</title><link href="/tech-support.html" rel="alternate"></link><published>2014-02-02T14:38:00+08:00</published><updated>2014-02-02T14:38:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-02-02:/tech-support.html</id><content type="html">&lt;div class="section" id="xkcd-627-tech-support-cheat-sheet"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://www.xkcd.com/627/"&gt;xkcd 627&lt;/a&gt;: Tech Support Cheat Sheet /&amp;nbsp;技术支持小抄&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2014/02/627.png"&gt;&lt;img alt="xkcd 627: Tech Support Cheat Sheet" src="/static/2014/02/627.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;翻译自 &lt;a class="reference external" href="http://www.xkcd.com"&gt;xkcd&lt;/a&gt; 漫画。&lt;/p&gt;
&lt;/div&gt;
</content><category term="推荐转载"></category><category term="xkcd"></category><category term="翻译"></category></entry><entry><title>自动化</title><link href="/automation.html" rel="alternate"></link><published>2014-02-02T14:00:00+08:00</published><updated>2014-02-02T14:00:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2014-02-02:/automation.html</id><content type="html">&lt;div class="section" id="xkcd-1319-automation"&gt;
&lt;h2&gt;&lt;a class="reference external" href="http://www.xkcd.com/1319/"&gt;xkcd 1319&lt;/a&gt;: Automation /&amp;nbsp;自动化&lt;/h2&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2014/02/1319.png"&gt;&lt;img alt="xkcd 1319: Automation" src="/static/2014/02/1319.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;翻译自&lt;a class="reference external" href="http://www.xkcd.com"&gt;xkcd&lt;/a&gt;漫画。&lt;/p&gt;
&lt;/div&gt;
</content><category term="推荐转载"></category><category term="xkcd"></category><category term="翻译"></category></entry><entry><title>重要文件备份脚本</title><link href="/backup-script.html" rel="alternate"></link><published>2013-11-22T23:19:00+08:00</published><updated>2013-11-22T23:19:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2013-11-22:/backup-script.html</id><summary type="html">&lt;p&gt;一个用于实现文件筛选并备份的Python脚本。有如下功能：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;全局单文件大小限制（筛出了过大的音视频等文件）&lt;/li&gt;
&lt;li&gt;个别扩展名的扩大文件大小限制（避免筛选出稍大的图片、压缩包等）&lt;/li&gt;
&lt;li&gt;时间限制，增量备份&lt;/li&gt;
&lt;li&gt;仅更新大小不同的文件&lt;/li&gt;
&lt;li&gt;支持多语言文件名&lt;/li&gt;
&lt;li&gt;可跨平台&lt;/li&gt;
&lt;li&gt;有直观的文本输出&lt;/li&gt;
&lt;li&gt;脚本可扩展，可稍加修改实现可选的全局总大小限制、扩展名限制等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意使用时要保存为UTF-8编码，以免出编码问题。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;shutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;#highprext = [&amp;quot;.doc&amp;quot;,&amp;quot;.docx&amp;quot;,&amp;quot;.rtf&amp;quot;,&amp;quot;.xls&amp;quot;,&amp;quot;xlsx&amp;quot;,&amp;quot;.ppt&amp;quot;,&amp;quot;.pps&amp;quot;,&amp;quot;.pptx&amp;quot;] #可选的限制文件类型&lt;/span&gt;
&lt;span class="n"&gt;otherext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.gif&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tif&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.bmp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.zip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tgz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.gz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;7z …&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;一个用于实现文件筛选并备份的Python脚本。有如下功能：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;全局单文件大小限制（筛出了过大的音视频等文件）&lt;/li&gt;
&lt;li&gt;个别扩展名的扩大文件大小限制（避免筛选出稍大的图片、压缩包等）&lt;/li&gt;
&lt;li&gt;时间限制，增量备份&lt;/li&gt;
&lt;li&gt;仅更新大小不同的文件&lt;/li&gt;
&lt;li&gt;支持多语言文件名&lt;/li&gt;
&lt;li&gt;可跨平台&lt;/li&gt;
&lt;li&gt;有直观的文本输出&lt;/li&gt;
&lt;li&gt;脚本可扩展，可稍加修改实现可选的全局总大小限制、扩展名限制等&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;注意使用时要保存为UTF-8编码，以免出编码问题。&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="kn"&gt;from&lt;/span&gt; &lt;span class="nn"&gt;sys&lt;/span&gt; &lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="n"&gt;stdout&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;os&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;shutil&lt;/span&gt;
&lt;span class="kn"&gt;import&lt;/span&gt; &lt;span class="nn"&gt;time&lt;/span&gt;

&lt;span class="c1"&gt;#highprext = [&amp;quot;.doc&amp;quot;,&amp;quot;.docx&amp;quot;,&amp;quot;.rtf&amp;quot;,&amp;quot;.xls&amp;quot;,&amp;quot;xlsx&amp;quot;,&amp;quot;.ppt&amp;quot;,&amp;quot;.pps&amp;quot;,&amp;quot;.pptx&amp;quot;] #可选的限制文件类型&lt;/span&gt;
&lt;span class="n"&gt;otherext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.pdf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.gif&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.jpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.png&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tif&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.bmp&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.zip&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.tgz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.gz&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;7z&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.rar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.z&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.mov&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.mpg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.mpeg&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.avi&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.asf&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.mp3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.mp2&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.rm&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.wav&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.vob&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.qt&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.vid&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.ac3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.wma&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;.wmv&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="c1"&gt;#个别扩展名的扩大文件大小限制&lt;/span&gt;
&lt;span class="n"&gt;maxsizeone&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;  &lt;span class="c1"&gt;#全局单文件大小限制，Bytes&lt;/span&gt;
&lt;span class="n"&gt;maxsizetwo&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;16&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="c1"&gt;#扩大单文件大小限制，Bytes&lt;/span&gt;
&lt;span class="n"&gt;copyafter&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;mktime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;strptime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;2013-11-16 12:00:00&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;%Y-%m-&lt;/span&gt;&lt;span class="si"&gt;%d&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%X&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="c1"&gt;#增量备份的时间限制&lt;/span&gt;

&lt;span class="n"&gt;suffixes&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;B&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;KB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;MB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;GB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;TB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;PB&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt;
&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;humansize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;nbytes&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="sd"&gt;&amp;#39;&amp;#39;&amp;#39;可读的文件大小&amp;#39;&amp;#39;&amp;#39;&lt;/span&gt;
    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;nbytes&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;0 B&amp;#39;&lt;/span&gt;
    &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
    &lt;span class="k"&gt;while&lt;/span&gt; &lt;span class="n"&gt;nbytes&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;=&lt;/span&gt; &lt;span class="mi"&gt;1024&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;nbytes&lt;/span&gt; &lt;span class="o"&gt;/=&lt;/span&gt; &lt;span class="mf"&gt;1024.&lt;/span&gt;
        &lt;span class="n"&gt;i&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="mi"&gt;1&lt;/span&gt;
    &lt;span class="n"&gt;f&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;nbytes&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;0&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;.&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
    &lt;span class="k"&gt;return&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;&lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt; &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;suffixes&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="n"&gt;i&lt;/span&gt;&lt;span class="p"&gt;])&lt;/span&gt;

&lt;span class="c1"&gt;# main&lt;/span&gt;
&lt;span class="n"&gt;rootdir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;从哪个文件夹拷贝，斜杠\要双写&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="n"&gt;todir&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="sa"&gt;u&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;拷到哪个文件夹，斜杠\要双写&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;rstrip&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\\&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Copying...&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;fcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;filec&lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;sizesum&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="mi"&gt;0&lt;/span&gt;
&lt;span class="n"&gt;starttime&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;subFolders&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;walk&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rootdir&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;subFolders&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="n"&gt;tpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rootdir&lt;/span&gt;&lt;span class="p"&gt;):],&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
        &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
            &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;makedirs&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                &lt;span class="n"&gt;fcount&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;break&lt;/span&gt;
            &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                &lt;span class="k"&gt;pass&lt;/span&gt;
    &lt;span class="k"&gt;for&lt;/span&gt; &lt;span class="n"&gt;name&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;files&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
        &lt;span class="k"&gt;try&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="n"&gt;fpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;tpath&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;todir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;3&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;)],&lt;/span&gt;&lt;span class="n"&gt;name&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;ext&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;splitext&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
            &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;not&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;otherext&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;maxsizeone&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="ow"&gt;or&lt;/span&gt;
             &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;ext&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;]&lt;/span&gt; &lt;span class="ow"&gt;in&lt;/span&gt; &lt;span class="n"&gt;otherext&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="n"&gt;maxsizetwo&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt; &lt;span class="ow"&gt;and&lt;/span&gt;
             &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getmtime&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;&amp;gt;&lt;/span&gt; &lt;span class="n"&gt;copyafter&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt; &lt;span class="c1"&gt;#判断语句&lt;/span&gt;
                &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;exists&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                    &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;size&lt;/span&gt;&lt;span class="o"&gt;!=&lt;/span&gt;&lt;span class="n"&gt;os&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;getsize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;):&lt;/span&gt;
                        &lt;span class="c1"&gt;#仅复制文件大小不同的文件&lt;/span&gt;
                        &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fpath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                        &lt;span class="n"&gt;filec&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
                        &lt;span class="n"&gt;sizesum&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt; &lt;span class="c1"&gt;#总大小计数&lt;/span&gt;
                &lt;span class="k"&gt;else&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
                    &lt;span class="n"&gt;shutil&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;copy2&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;fpath&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;tpath&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
                    &lt;span class="n"&gt;filec&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;
                    &lt;span class="n"&gt;sizesum&lt;/span&gt;&lt;span class="o"&gt;+=&lt;/span&gt;&lt;span class="n"&gt;size&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt; &lt;span class="ne"&gt;KeyboardInterrupt&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;break&lt;/span&gt;
        &lt;span class="k"&gt;except&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;
            &lt;span class="k"&gt;continue&lt;/span&gt;
    &lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="se"&gt;\r&lt;/span&gt;&lt;span class="s2"&gt;Copied &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; files, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; folders. Total &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;. &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;...&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;fcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;humansize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizesum&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rootdir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="nb"&gt;len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;rootdir&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="mi"&gt;20&lt;/span&gt;&lt;span class="p"&gt;]))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="n"&gt;rootdir&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Done.&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;stdout&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;write&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;Copied &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; files, &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt; folders. Total &lt;/span&gt;&lt;span class="si"&gt;%s&lt;/span&gt;&lt;span class="s2"&gt;.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;filec&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;fcount&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;humansize&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;sizesum&lt;/span&gt;&lt;span class="p"&gt;)))&lt;/span&gt;
&lt;span class="nb"&gt;print&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;Total time: &lt;/span&gt;&lt;span class="si"&gt;%.2f&lt;/span&gt;&lt;span class="s2"&gt; s.&amp;quot;&lt;/span&gt; &lt;span class="o"&gt;%&lt;/span&gt; &lt;span class="n"&gt;time&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;clock&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="n"&gt;starttime&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
</content><category term="电脑技术"></category><category term="Python"></category><category term="代码"></category></entry><entry><title>缺了什么</title><link href="/lack-of-something.html" rel="alternate"></link><published>2013-11-17T10:17:00+08:00</published><updated>2013-11-17T10:17:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2013-11-17:/lack-of-something.html</id><summary type="html">&lt;p&gt;生活的空洞乏味来源于自身。缺少行动，更缺少思考，就让人们生活变得无趣，更让人变得被动。&lt;/p&gt;
&lt;p&gt;行动，这里不是说被迫的行动，而是出自自己意愿的行动。迫不得已，或是非常重要的事情当然不会被落下；但自己想做、要做，的事可能就搁置了。比如，第一天说每天背十个单词，第三天就大概不去背了；买了一本书，当时没时间看，就忘了这回事了。前一个是短期计划，实现的可能还比较大。后一个是暂时做不成的事，可能一直徘徊在脑海中，虽有机会，总是有各种原因没有去做。想法是美好的，惰性是残酷的，梦想就是这么被扼杀的，心中闪过的微光就是这样熄灭的。就像一首标题超长的歌《有些事现在不做
一辈子都不会做了》所说：“每个渺小的理由都困住自由”，有些事情就应下定决心去做，才会获得自己想要的结果。&lt;/p&gt;
&lt;p&gt;我们对事情都要尽自己所能，有时还要多做一点点。在升级了计算器后，有多少人浏览过说明书呢？甚至大概知道各种功能都怎么用也好。事实是大部分人都只会用低级型号的部分功能，其他的再多会用一点，然后抱怨运算麻烦，不会用。通读说明书，再活学活用一下所学的和自己了解的数学知识，也能找出很多问题的简便解法。在求教于人之前，首先 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;生活的空洞乏味来源于自身。缺少行动，更缺少思考，就让人们生活变得无趣，更让人变得被动。&lt;/p&gt;
&lt;p&gt;行动，这里不是说被迫的行动，而是出自自己意愿的行动。迫不得已，或是非常重要的事情当然不会被落下；但自己想做、要做，的事可能就搁置了。比如，第一天说每天背十个单词，第三天就大概不去背了；买了一本书，当时没时间看，就忘了这回事了。前一个是短期计划，实现的可能还比较大。后一个是暂时做不成的事，可能一直徘徊在脑海中，虽有机会，总是有各种原因没有去做。想法是美好的，惰性是残酷的，梦想就是这么被扼杀的，心中闪过的微光就是这样熄灭的。就像一首标题超长的歌《有些事现在不做
一辈子都不会做了》所说：“每个渺小的理由都困住自由”，有些事情就应下定决心去做，才会获得自己想要的结果。&lt;/p&gt;
&lt;p&gt;我们对事情都要尽自己所能，有时还要多做一点点。在升级了计算器后，有多少人浏览过说明书呢？甚至大概知道各种功能都怎么用也好。事实是大部分人都只会用低级型号的部分功能，其他的再多会用一点，然后抱怨运算麻烦，不会用。通读说明书，再活学活用一下所学的和自己了解的数学知识，也能找出很多问题的简便解法。在求教于人之前，首先“帮助”看了吗？能想到的都试过了吗？谷歌百度搜遍了吗？很多问题大部分只要尽自己所能，都能解决。而且，查资料时有时多看一下相关的知识，长久的积累就丰富了。多关注细节，就能避免一些错误，做得更好。&lt;/p&gt;
&lt;p&gt;多做就要多思考。人们缺少思考，随波逐流或固执己见，都是常见的现象。这在社交网络和流行趋势方面很常见。上次看到张暴漫说计算器由于算式太复杂不能给出根号式子，结果按照图上的数字，只需要一次平方，就知道答案了。一张截图，2008年的百度知道，回答者预测对了领导人。这种事情看一下中国的体制，心中就有数了，不算什么预言。各位可以想一想下一届是谁。再比如，去年的冬至，曾经是人们津津乐道的话题。但我们稍微想一下，根据经验和各种利害关系，末日这么重大的事件，怎么可能明文表现在电影里，而且还能审核通过？政府基本处于放任不管的态度，没有打压，也没有暗地准备和大动作。然后末日过了就放松了，否定一切。现在越来越乱的自然和社会环境难道不该引起人们深思？虚构的文学影视作品中的人物事件从来都是“与真实人物、团体、事件无关”，当然它们想表达什么则需要自己发掘，反映的问题就不是虚构了。事出必有因，事件背后的内涵就是要自己去发现。&lt;/p&gt;
&lt;p&gt;做事更要多思考。现在马路上店铺的电子条幅越来越多，随处可见。当你要看的时候，可能你两秒看完了后半句话还迟迟没有出现；或者尽是些废话，半天没有重点。像这种不顾观众的条幅能起到什么作用呢？要装就要调到最合适，没多大用处就把这点钱花到提高服务质量上，更有用处。往更大处看，我们一直在用科学来解释事实，不过似乎一直是用现有科学否定事实。新的更好的理论不受待见，不为公众所知。因为利益和自大限制了我们的视野。我们所看不到的，比能看到的多很多。因为多思考，就有了新发现和发明。&lt;/p&gt;
&lt;p&gt;我们更关注物质，却忽视了自己的精神生活。一天我们能有多少时间静下来认真思考除了自己任务以外的事情？假如你除了注意外部世界的动向以外也能观照自我的话，就会发现很多事物。而除了观照自我之外，关心别人和社会，回报总会比想象的多。&lt;/p&gt;
&lt;p&gt;虽然现在言论被限制，但思想不能被束缚。有些事可能现在做不了，但不应就此放弃。我们都不能完全做到多行动多思考。不管有什么原因，只要自己想做，总是能得到提升。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;后记&lt;/h2&gt;
&lt;p&gt;这本来是要交上去的随笔，由于来不及抄，就只能发布在这里，顺便把笔调稍微改一下，适应不同环境。感于现在浮躁的环境，不用脑子生活，浅层的思考；又看了《阿米》三本书，获益颇丰；又获知真正的大变动可能将来临，于是写下此文。至于最后一条原因，本来想写一篇长文来涵盖大部分信息，好像也没空把它写完，所以看着办吧……多看看外面的世界，多了解不同的思想。&lt;/p&gt;
&lt;p&gt;&lt;tt class="docutils literal"&gt;p.b/s/1lAqE6; t.b/p/2259479804&lt;/tt&gt;&lt;/p&gt;
&lt;/div&gt;
</content><category term="时事评论"></category><category term="2012"></category></entry><entry><title>fx-991ES PLUS刷图利器</title><link href="/991espaint.html" rel="alternate"></link><published>2013-07-31T11:28:00+08:00</published><updated>2013-07-31T11:28:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2013-07-31:/991espaint.html</id><content type="html">&lt;p&gt;Geek总归可以找到很多事情做。甚至在学生用函数计算器上。利用内存溢出等bug可以让计算器（CASIO
fx-ES
系列，下同）花屏、出现新功能、各种异常，还可以显示操作者指定的文字或图像。这里暂不细说，详情请见&lt;a class="reference external" href="http://tieba.baidu.com/f?kw=fx-es(ms)"&gt;fx-es(ms)吧&lt;/a&gt;、&lt;a class="reference external" href="http://www.cncalc.org/"&gt;cnCalc.org&lt;/a&gt;。至于它的显示图像，是通过计算器软件的Bug导致内存溢出，进而通过按不同字符来达到控制显示的目的。&lt;/p&gt;
&lt;p&gt;[STRIKEOUT:下载：&lt;a class="reference external" href="#"&gt;ESPaint&lt;/a&gt;&amp;nbsp;v1.3.31]（已更新）&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/espaint2.zip"&gt;ESPaint&lt;/a&gt;&amp;nbsp;&lt;strong&gt;v2.0.71&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2013/07/espv2.png"&gt;&lt;img alt="ESPaint v2" src="/static/2013/07/espv2.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;软件可直接在电脑上画图，并直接输出按键顺序（完整的[STRIKEOUT:按键顺序及]原理还是要参看精品贴），还可以导出内存图像可供导入模拟器内存。输入时可自动检验屏幕上的点阵是否可通过计算器上的按键直接输入，还是需要使用不稳定字符。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;使用说明均已在软件包中，请下载后阅读。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;这篇文章也不能写太多技术细节及操作方法，所以欲了解详情，参看精品贴，以及我整理的&lt;a class="reference external" href="/static/991eschar.pdf"&gt;以下pdf文件&lt;/a&gt;。&lt;/p&gt;
</content><category term="作品发布"></category><category term="fx-991ES"></category><category term="计算器"></category><category term="软件"></category></entry><entry><title>一眼看出U盘病毒</title><link href="/virus-in-flash-disk.html" rel="alternate"></link><published>2013-02-05T15:59:00+08:00</published><updated>2013-02-05T15:59:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2013-02-05:/virus-in-flash-disk.html</id><summary type="html">&lt;p&gt;U盘病毒真是麻烦……特别是在没有很好的安全软件的电脑上。为了防止U盘中毒、你的电脑中毒，或者成为病毒的传播者，了解中毒U盘的特点及其应对方法是很必要的。在本文中，不仅可以学到一些判断方法，还可以学会在不安全的电脑环境中使用U盘时尽量减少中毒或反复中毒的机会，并做一些预防措施，养成良好的使用习惯。&lt;/p&gt;
&lt;p&gt;中间会插播一些技巧及安全使用等知识。操作时请谨记：特别是在安全软件没有或较弱的情况下，千万别手贱，轻手轻脚，按稳键盘按准鼠标。一下运行一堆病毒文件概不负责。&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;如何分辨中毒U盘&lt;/h2&gt;
&lt;p&gt;这里只介绍目测法及简单的判断方法，用安全软件就不多说了。首先，插入U盘时图标不是默认的灰色图标（或者自己设置的图标，见下文），那么恭喜中招。例如有些笨病毒会把图标改成文件夹图标。右键点击U盘图标，发现有“自动播放”，就有病毒。如果双击U盘后新窗口弹出（包括点击文件夹后新窗口弹出），就说明已不幸执行病毒。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;〖技巧：安全地打开U盘〗&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;在自动播放窗口中选择“打开文件夹以查看文件”。（推荐）&lt;/li&gt;
&lt;li&gt;使用“资源管理器”，即在左边可以看到文件夹的树形列表的窗口，在树形列表中点击U盘来打开。&lt;/li&gt;
&lt;li&gt;在“我的电脑/计算机”窗口中U盘盘符位置右键，点最后一个打开。（没有进行仔细测试）&lt;/li&gt;
&lt;li&gt;用压缩软件如WinRAR …&lt;/li&gt;&lt;/ol&gt;&lt;/div&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;U盘病毒真是麻烦……特别是在没有很好的安全软件的电脑上。为了防止U盘中毒、你的电脑中毒，或者成为病毒的传播者，了解中毒U盘的特点及其应对方法是很必要的。在本文中，不仅可以学到一些判断方法，还可以学会在不安全的电脑环境中使用U盘时尽量减少中毒或反复中毒的机会，并做一些预防措施，养成良好的使用习惯。&lt;/p&gt;
&lt;p&gt;中间会插播一些技巧及安全使用等知识。操作时请谨记：特别是在安全软件没有或较弱的情况下，千万别手贱，轻手轻脚，按稳键盘按准鼠标。一下运行一堆病毒文件概不负责。&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;如何分辨中毒U盘&lt;/h2&gt;
&lt;p&gt;这里只介绍目测法及简单的判断方法，用安全软件就不多说了。首先，插入U盘时图标不是默认的灰色图标（或者自己设置的图标，见下文），那么恭喜中招。例如有些笨病毒会把图标改成文件夹图标。右键点击U盘图标，发现有“自动播放”，就有病毒。如果双击U盘后新窗口弹出（包括点击文件夹后新窗口弹出），就说明已不幸执行病毒。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h3&gt;〖技巧：安全地打开U盘〗&lt;/h3&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;在自动播放窗口中选择“打开文件夹以查看文件”。（推荐）&lt;/li&gt;
&lt;li&gt;使用“资源管理器”，即在左边可以看到文件夹的树形列表的窗口，在树形列表中点击U盘来打开。&lt;/li&gt;
&lt;li&gt;在“我的电脑/计算机”窗口中U盘盘符位置右键，点最后一个打开。（没有进行仔细测试）&lt;/li&gt;
&lt;li&gt;用压缩软件如WinRAR、7-zip等打开。也可以用来杀毒，之后我会说到。（其他的特别是国产软件我不保证其支持无视隐藏属性。）&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;第二，打开U盘后，观察界面。最好的情况，显示出隐藏的autorun.inf文件，就知道中毒了。或者有RECYCLER文件夹，也是一种中毒的迹象，因为病毒经常藏身于此地，由于我们知道，U盘的“回收站”是没有意义的。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="autorun-inf"&gt;
&lt;h3&gt;〖说明：autorun.inf〗&lt;/h3&gt;
&lt;p&gt;什么是autorun.inf？这是Windows系统中用于让系统知道对于各驱动器应该以什么方式打开。例如双击驱动器图标会运行此文件所指示的程序，图标也可以根据此文件更换。它并不是病毒，而是一种系统文件，可以加以很好的利用。就例如很多光盘插入后会有图标，并运行程序，这就是这个文件所带来的功能。但由于可以用它来规定进入驱动器时所要运行的程序，并且能更改右键菜单，恶意程序于是就利用这个功能来传播。Windows
XP及以下版本都存在这个漏洞，所以病毒得以广泛传播。虽然以上版本修复了这个漏洞，但也不能大意，因为病毒还可能有别的传播途径。&lt;/p&gt;
&lt;p&gt;以上情况都没有出现，那是很正常的，也不一定代表没有病毒，请继续听下去。第三，观察文件类型。看图。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2013/02/folderexec.png"&gt;&lt;img alt="U盘中毒范例" src="/static/2013/02/folderexec.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;看出什么问题来了吗？文件类型为“应用程序”的“文件夹”，而真正的文件夹被隐藏了。另外由于各种原因，在这里像“SYSTEM”这种可疑程序显示了出来，于是即可判定为中毒，且为文件夹类型。&lt;/p&gt;
&lt;p&gt;另外，此法还有一些引申方法。比如观察修改日期，最近修改且日期时间基本相同者，即为病毒动了手脚。特别是放在外面的应用程序（还可能有网页文件、快捷方式等），如果出现了这种情况，请不要运行，因为感染了通过修改exe传播的病毒。再比如这些“文件夹”都是几十几百KB的，也就是病毒了。此时用“打开”、“保存”对话框时打开U盘无法看见文件夹。在Windows
Vista/7中，出现XP风格的文件夹图标，而不是应该有的图标，一下子就可认定为中毒了。&lt;/p&gt;
&lt;p&gt;最后，关闭所有可能使用U盘的程序，停止安全软件扫描，尝试多次无法安全弹出的，说明病毒可能正在遍历U盘文件，感染U盘，此时应立即拔出。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h3&gt;如何快速减少危害&lt;/h3&gt;
&lt;p&gt;为什么不说杀毒呢？因为如果可执行文件感染了没有杀毒软件很难知道。这里不使用直接清除方法，像什么显示隐藏文件（有需要知道的自己查）之类，因为在染毒的机器上很可能无法显示隐藏文件、反复感染及隐藏。打开WinRAR、7-zip等压缩软件（其他的特别是国产软件我不保证其支持无视隐藏属性），定位到U盘根目录，删除&lt;strong&gt;autorun.inf&lt;/strong&gt;文件、&lt;strong&gt;RECYCLER&lt;/strong&gt;文件夹（病毒多在此地藏身）以及与已存在文件夹同名的exe文件，如果有什么十分可疑的文件一并删除（如“__D__.lnk”、“system.exe”、“MS-DOS.COM”等等，只要确知不是自己放进去的可疑文件就可以删除，或者拿压缩软件备份一下后删除）。此时可能文件夹都没有了，要修改隐藏属性。点开始，运行&lt;tt class="docutils literal"&gt;attrib &lt;span class="pre"&gt;-S&lt;/span&gt; &lt;span class="pre"&gt;-H&lt;/span&gt; &lt;span class="pre"&gt;X:\*&lt;/span&gt; /S /D&lt;/tt&gt;（X为U盘盘符）后，隐藏文件即可恢复。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;如何进行简易预防&lt;/h3&gt;
&lt;p&gt;在U盘建立RECYCLER文件（无后缀名）、autorun.inf文件夹，并设只读、隐藏、系统属性（系统属性不会也可以不设置）。即可以预防用自动运行传播的病毒。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="win-20002003xp"&gt;
&lt;h3&gt;〖技巧：禁止自动播放〗（仅适用于Win 2000、2003及XP）&lt;/h3&gt;
&lt;p&gt;更改注册表 “HKEY_CURRENT_USER\SOFTWARE\Microsoft\Windows\CurrentVe
rsion\policies\Explorer\NoDriveTypeAutorun”键值为“241”。或者可以使用我制作的工具“&lt;a class="reference external" href="https://gumble.pw/2012/works-1/#soft5"&gt;自动运行分类设置&lt;/a&gt;”。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;〖高级技巧：设置U盘个性化图标〗&lt;/h3&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;autorun.inf的基本文件结构：&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;&lt;tt class="docutils literal"&gt;[autorun] open=xxx.exe icon=xxx.exe&lt;/tt&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;当然还有别的用法，这里不细讲。把个性化图标（ico格式）放在U盘根目录并创建autorun.inf文件。设置U盘个性化图标时将open那句去掉，把icon那句改为图标的文件名（xxx.ico）。把图标、autorun.inf设置只读、隐藏、系统属性。这样既有了个性化的图标，又能在图标消失或改变时得知U盘的中毒情况。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h3&gt;推荐软件列表&lt;/h3&gt;
&lt;p&gt;使用以下软件可以更有效地手工消灭病毒木马：&lt;a class="reference external" href="http://www.xuetr.com/"&gt;XueTr/PCHunter&lt;/a&gt;、&lt;a class="reference external" href="http://hi.baidu.com/ithurricane"&gt;PowerTool&lt;/a&gt;、Wsyscheck。主要供对Windows系统较为熟悉的人使用。使用时须小心，不懂的功能选项就不要使用。前文提到的“&lt;a class="reference external" href="https://gumble.pw/2012/works-1/#soft5"&gt;自动运行分类设置&lt;/a&gt;”也不错。&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="电脑技术"></category><category term="U盘"></category><category term="病毒"></category></entry><entry><title>那些年</title><link href="/these-years.html" rel="alternate"></link><published>2013-01-01T15:33:00+08:00</published><updated>2013-01-01T15:33:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2013-01-01:/these-years.html</id><content type="html">&lt;p&gt;改编歌词之类的事情当然一直会有。又是作业。于是我就用铅笔手写，很快就写出了这么一篇稿子。&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;又回到最初的起点&lt;/div&gt;
&lt;div class="line"&gt;记忆中大考开始前&lt;/div&gt;
&lt;div class="line"&gt;我们终于来到了这一天&lt;/div&gt;
&lt;div class="line"&gt;桌面上的古诗篇&lt;/div&gt;
&lt;div class="line"&gt;多少作业成堆&lt;/div&gt;
&lt;div class="line"&gt;今天我们作业（又）要做到一两点&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;又回到最初的起点&lt;/div&gt;
&lt;div class="line"&gt;呆呆地站在桌子前&lt;/div&gt;
&lt;div class="line"&gt;笨拙理好这桌面上的卷&lt;/div&gt;
&lt;div class="line"&gt;语文数学英（语）物理化学&lt;/div&gt;
&lt;div class="line"&gt;再加上副科作业&lt;/div&gt;
&lt;div class="line"&gt;等会儿做完一定睁不开眼&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;好想再回到那些年的时光&lt;/div&gt;
&lt;div class="line"&gt;回到小学初中时候&lt;/div&gt;
&lt;div class="line"&gt;多做明天一点作业&lt;/div&gt;
&lt;div class="line"&gt;黑板上留下题目&lt;/div&gt;
&lt;div class="line"&gt;你能够解开吗&lt;/div&gt;
&lt;div class="line"&gt;谁没有交谁又抄作业&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;那些年错过的睡眠&lt;/div&gt;
&lt;div class="line"&gt;那些年错过的感情&lt;/div&gt;
&lt;div class="line"&gt;好想拥抱你&lt;/div&gt;
&lt;div class="line"&gt;拥抱错过的时间&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;曾经想改变这世界&lt;/div&gt;
&lt;div class="line"&gt;到最后回首才发现&lt;/div&gt;
&lt;div class="line"&gt;这道题想了半天还是没有解&lt;/div&gt;
&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;那些年错过的默写［注：错/过］&lt;/div&gt;
&lt;div class="line"&gt;那些年错过的大题&lt;/div&gt;
&lt;div class="line"&gt;好想告诉你&lt;/div&gt;
&lt;div class="line"&gt;告诉你我没有忘记&lt;/div&gt;
&lt;div class="line"&gt;那天晚上灯火通明&lt;/div&gt;
&lt;div class="line"&gt;一气之下作出的决定&lt;/div&gt;
&lt;div class="line"&gt;再一次相遇我会&lt;/div&gt;
&lt;div class="line"&gt;撒手不管你［注：指作业］&lt;/div&gt;
&lt;div class="line"&gt;（但还是）继续做下去&lt;/div&gt;
&lt;/div&gt;
</content><category term="生活杂记"></category><category term="作业"></category><category term="生活纪实"></category></entry><entry><title>GumboGumble（又）回来了</title><link href="/gumble-return.html" rel="alternate"></link><published>2012-12-31T23:37:00+08:00</published><updated>2012-12-31T23:37:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-12-31:/gumble-return.html</id><summary type="html">&lt;p&gt;前面由于服务商系统升级，导致数据库无法连接。各位可以不必幸灾乐祸了。在预言的这几天当掉只是纯属巧合。说法如下：（超级管理员）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Database Error&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good Day!&lt;/p&gt;
&lt;p&gt;Due to the recent upgrade of our servers, SQL users needs to be
recreated to be compatible with the new software installed on the
machine.&lt;/p&gt;
&lt;p&gt;If you are receiving sql errors for your account, Please do one of
the following …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;前面由于服务商系统升级，导致数据库无法连接。各位可以不必幸灾乐祸了。在预言的这几天当掉只是纯属巧合。说法如下：（超级管理员）&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;Database Error&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Good Day!&lt;/p&gt;
&lt;p&gt;Due to the recent upgrade of our servers, SQL users needs to be
recreated to be compatible with the new software installed on the
machine.&lt;/p&gt;
&lt;p&gt;If you are receiving sql errors for your account, Please do one of
the following procedures:&lt;/p&gt;
&lt;p&gt;...&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;这次还不错，网站没有因为各种原因永远消失。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/12/gumbledisappear.png"&gt;&lt;img alt="Gumble消失" src="/static/2012/12/gumbledisappear.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;然后你们可以期待我的新年第一帖。&lt;/p&gt;
&lt;p&gt;2012-12-31&lt;/p&gt;
&lt;p&gt;话说之后，一不小心，六月一过，gumblegumble.tk因为超期未续约，又挂了。正好，gumble.tk没有被注册，域名于是就缩短了。这也算是件好事吧……&lt;/p&gt;
</content><category term="关于网站"></category><category term="Gumble"></category></entry><entry><title>不合群的信息科技</title><link href="/criticism-on-the-it-lesson.html" rel="alternate"></link><published>2012-11-04T14:16:00+08:00</published><updated>2012-11-04T14:16:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-11-04:/criticism-on-the-it-lesson.html</id><summary type="html">&lt;p&gt;从小学就有，经常虎头蛇尾的一门课就是信息科技。学习下来，我个人认为信息科技是以花哨的形式展示过时甚至现在有些错误的计算机知识的学科。它一点也不留余地，计算时不说一声就忽略文件头等问题，不考虑其他情况，不知道有许多替代系统、软件、编码、技术，不考虑“信息的时效性”，不知道就乱用“常见”和“现今”，版权意识落后。信息科技不是数学物理，更不是历史之类的学科，它的目的大概也在于实际运用了。&lt;/p&gt;
&lt;p&gt;首先举一个例子，就是著名的Windows系统。它怎么知道我用的是Windows
XP系统呢？我用Mac或Ubuntu（一种Linux系统）不行吗？用了Windows系统它怎么知道我的版本呢？我用Windows
98和Windows
8来操作完全不符合XP的体验。没错，我们需要教大众化的东西，至少也应该有一个前提，我用了Windows
XP这个微软已不再提供支持的操作系统。&lt;/p&gt;
&lt;p&gt;我们再来看著名的ASCII码与GB2312码。ASCII最后一次更新是在1986年，它主要用于显示现代英语，而其扩展版本EASCII则可以勉强显示其他西欧语言，显示其他西欧语言时最高位为1。现在浏览器、操作系统等均默认使用UTF-8码。UTF-8是一种针对Unicode的可变长度字符编码，可以用来表示Unicode标准中的任何字符，且其编码中的第一个字节仍与ASCII兼容。因此，它逐渐成为电子邮件、网页及其他存储或传送文字的应用中 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;从小学就有，经常虎头蛇尾的一门课就是信息科技。学习下来，我个人认为信息科技是以花哨的形式展示过时甚至现在有些错误的计算机知识的学科。它一点也不留余地，计算时不说一声就忽略文件头等问题，不考虑其他情况，不知道有许多替代系统、软件、编码、技术，不考虑“信息的时效性”，不知道就乱用“常见”和“现今”，版权意识落后。信息科技不是数学物理，更不是历史之类的学科，它的目的大概也在于实际运用了。&lt;/p&gt;
&lt;p&gt;首先举一个例子，就是著名的Windows系统。它怎么知道我用的是Windows
XP系统呢？我用Mac或Ubuntu（一种Linux系统）不行吗？用了Windows系统它怎么知道我的版本呢？我用Windows
98和Windows
8来操作完全不符合XP的体验。没错，我们需要教大众化的东西，至少也应该有一个前提，我用了Windows
XP这个微软已不再提供支持的操作系统。&lt;/p&gt;
&lt;p&gt;我们再来看著名的ASCII码与GB2312码。ASCII最后一次更新是在1986年，它主要用于显示现代英语，而其扩展版本EASCII则可以勉强显示其他西欧语言，显示其他西欧语言时最高位为1。现在浏览器、操作系统等均默认使用UTF-8码。UTF-8是一种针对Unicode的可变长度字符编码，可以用来表示Unicode标准中的任何字符，且其编码中的第一个字节仍与ASCII兼容。因此，它逐渐成为电子邮件、网页及其他存储或传送文字的应用中，优先采用的编码。互联网工程工作小组（IETF）要求所有互联网协议都必须支持UTF-8编码。互联网邮件联盟（IMC）建议所有电子邮件软件都支持UTF-8编码。而我们熟知的GB2312码于1981年5月1日实施，GB18030已经取代GB2312成为国家强制性标准，所以教材也应介绍GB18030编码。&lt;/p&gt;
&lt;p&gt;还有一个典型的例子就是PNG。PNG的开发目标是改善并取代GIF作为适合网络传输的格式而不需专利许可，所以被广泛应用于互联网及其他方面上，而且现在已经，不是即将，成为一种通用格式。它使用无损压缩，支持透明度，现行版本在2003年11月10日作为W3C建议发布。现在网络上多数的Logo、背景图片和图标等均使用PNG格式。而JPG格式仅适用于存储照片，其算法也定死了它只适用于存储照片。&lt;/p&gt;
&lt;p&gt;它缺乏灵活性，上文讲了它默认您的操作系统是Windows
XP，这没关系。默认您设计使用Photoshop、动画使用Flash（快要淘汰了）。它继续默认您的压缩软件是WinRAR这个付费的共享软件，不知道还有7z等其他压缩格式。从“压缩软件的比较”中我们可以看出它缺乏算法观念，一个格式可以支持多种算法，如7z。我们真正比较的是RAR、Deflate、LZW、LZMA、Bzip等及其衍生算法的优劣。至于有损压缩方面，说文档程序必须无损，虽说速度稍慢，想一下“用自己的话概括”这种超级高级的有损压缩算法，即使有点扯得远，也确实是一种行之有效的方法。鼠标这种东西是可以没有的。计算机一开始就只有键盘，1968年才出现一只现在被成为鼠标的小木盒子。现代操作系统可以没有鼠标，Tab和快捷键可以搞定很多内容，至于鼠标那部分工作，以Windows为例，有“鼠标键”（用小键盘控制光标移动，在“辅助功能”中）可以完成，甚至更加精确。另外，我难道不可以用触控吗！那些ATM机、售票机等很多都是Windows系统，没有鼠标键盘，照样活得好好的。&lt;/p&gt;
&lt;p&gt;它病毒木马概念也较为混淆。现在单纯的病毒没有多少，变成了为利益而生的各类恶意软件，包括木马、浏览器劫持、某些工具条等。恶意软件官方定义其行为有强制安装、难以卸载、浏览器劫持、广告弹出、恶意收集用户信息、恶意卸载、恶意捆绑、其他侵犯用户知情权、选择权的恶意行为。现在少有单纯为了炫耀技术开发病毒的。骇客们都是为了利益来编写恶意程序。&lt;/p&gt;
&lt;p&gt;它版权意识落后，虽说介绍了几大类软件授权方式，但没有真正给我们介绍使用软件的权利与约束，有些例子直接就举付费的共享软件；制作作品时也只停留在“制作作品时要注明来源”层面。不知道GNU
GPL也就算了，EULA（最终用户许可协议）也不知道就有些说不过去了。虽然购买正版PC软件尚未普及，但教材不能错，多介绍免费的、开源的优秀软件（我现在也逐步转向使用这类软件），从娃娃抓起，这有利于计算机行业的健康发展。&lt;/p&gt;
&lt;p&gt;它不说一声就忽略一些问题。数学有“大约”，物理有什么“忽略空气阻力”、“轻质杠杆”，化学有“STP”，这边一概没有。&lt;/p&gt;
&lt;blockquote&gt;
存储一幅未经压缩的1024×768像素256色&lt;strong&gt;位图&lt;/strong&gt;图像，所占的磁盘空间&lt;strong&gt;为&lt;/strong&gt;多少KB？（要有公式）&lt;/blockquote&gt;
&lt;p&gt;BMP，以及几乎所有文件格式都有文件头，这边的“为”字说明是精确值，计算出来绝对经不起事实检验。&lt;/p&gt;
&lt;p&gt;“信息有时效性”，信息科技本身就没有做到理解这一点。它还在介绍什么软盘（我还算用过）（1990s）、磁带（1980s）、640×480之类“常见”的显示器分辨率以及老式的一些观点。现在举例分析：&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;用&lt;strong&gt;百度&lt;/strong&gt;搜索有关&lt;strong&gt;2010&lt;/strong&gt;年上海世博会关于低碳环保的相关信息，对于关键字“2010年上海世博会”和“低碳环保”之间，要用到的符号应该是_______。&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;A.“2010年上海世博会”&lt;strong&gt;AND&lt;/strong&gt;“低碳环保”&lt;/div&gt;
&lt;div class="line"&gt;B.“2010年上海世博会”&lt;strong&gt;OR&lt;/strong&gt;“低碳环保 ”&lt;/div&gt;
&lt;div class="line"&gt;C.“2010年上海世博会”&lt;strong&gt;NOT&lt;/strong&gt;“低碳环保”&lt;/div&gt;
&lt;div class="line"&gt;D.“2010年上海世博会”&lt;strong&gt;-&lt;/strong&gt;“低碳环保”&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;看出什么问题没有？现在有智能的算法，除非搜不到，此种连接词你基本不可能在搜索当中想到。&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;在以下情况中，计算机感染病毒的可能途径有________种。&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;1. 从Internet网上收到不明邮件 2. 使用外来盘片启动计算机&lt;/div&gt;
&lt;div class="line"&gt;3.软盘驱动器读盘故障 4. 键入了有语法错误的命令&lt;/div&gt;
&lt;div class="line"&gt;5.执行外来盘片上的程序 6. 复制外来盘片中的文件&lt;/div&gt;
&lt;div class="line"&gt;A. 2 B. 3 C. 4 D. 5&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;这更加明显，我不说什么了，一笑了之。&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;某同学打算为自己的计算机系统设置安全防范措施，最恰当的是_______。&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;A.定期访问Windows Update网站，下载并安装操作系统，借同学的个人用户杀毒软件并安装&lt;/div&gt;
&lt;div class="line"&gt;B.定期访问Windows Update网站，下载并安装操作系统补丁程序，购买正版杀毒软件，安装并定时升级，安装软件防火墙，还定期备份数据&lt;/div&gt;
&lt;div class="line"&gt;C.购买正版杀毒软件，安装并定时升级&lt;/div&gt;
&lt;div class="line"&gt;D.定期访问Windows Update网站，下载并安装操作系统，购买正版杀毒软件并安装&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;不论是Windows
XP还是7，都没必要这么麻烦，就算没有3XXXXX士，系统也会自动帮您更新。至于杀毒软件，还有许多免费的选择。对于数据安全，我认为只要有良好的操作习惯，经常备份，使用最新的软件，再加上可靠的安全软件就可以基本保证没有恶意软件可以入侵。我家电脑已经几年不知道病毒木马长什么样了。&lt;/p&gt;
&lt;p&gt;有人说这些经典的东西是基础，没错，有些譬如计算机结构等应该是基础，但是，我们为什么要深入学习一些现在已经或即将被淘汰的技术呢？我们的00后有多少见到过软盘、软驱的实物呢？有些已经成为历史，只要把它们当做计算机历史学习就可以了，不用去过多地叫下一辈理解与怀念。至于新技术，如HTML5、CSS3，我们也不必要求信息科技一一介绍，但基本概念必须正确，操作技术必须紧跟时代。有时候给学生介绍一些算法的原理是很好的，反而可以增强学生处理问题、解决问题的能力。&lt;/p&gt;
&lt;p&gt;在计算机操作中灵活性非常重要，而有些教学显然违反了这一点。如我在学校打印室值班时看见有些学生因为没看见“打印机”图标于是就无从下手。这就缺乏了灵活性。Word的菜单和工具栏可以随意编辑，比如我把“打印机”图标移到随便某个位置，把“文件”菜单中的“打印”命令移到“工具”菜单中，或者直接删掉，也未尝不可。而我看见计算机水平测试（具体叫什么我不清楚）的题目中有一些就是要记住某个命令的位置。这根本不必要。熟能生巧，一般的一些命令都会在差不多的地方。为了方便有些软件让你还可以自定义。实在找不到，搜索引擎是干嘛的？&lt;/p&gt;
&lt;p&gt;我觉得信息科技更应该教的是解决问题的方法，处理数据的态度和自我学习的精神。正如好学生不是教出来的，良好的计算机使用者或开发者也是自己通过经验、网络、资料总结得出的。不好的使用习惯才导致了恶意软件有机可乘、数据丢失。见识与创造力的缺乏导致了C2C（Copy
to
China）现象。很多软件根本用不着教，通过自己摸索与网络搜索就可以知道大部分的使用方法。软件开发出来是用来解决问题的，学生应该学会灵活使用软件、互联网及其他各种工具，甚至编写程序，决不能生搬硬套、死记步骤，这才是教育的最终目的。&lt;/p&gt;
&lt;p&gt;另外，它考试还考一些没有学、没有提到的内容，这还没有学校之分，目的到底是想考什么？&lt;/p&gt;
&lt;p&gt;（此文指上海，其余地区可借鉴。为了培养学生的自主学习能力，文章中提到的专业术语如欲了解，请&lt;strong&gt;自己&lt;/strong&gt;上互联网搜索。）&lt;/p&gt;
&lt;p&gt;更新：对于安全使用互联网的一些知识，可以参阅Google的《&lt;a class="reference external" href="http://www.google.com/goodtoknow/"&gt;不可不知的小知识——确保安全上网的指南&lt;/a&gt;》，比教科书准确易懂多了。注意文章中可能需要连接到YouTube获取视频，想要观看视频的，请自备&lt;a class="reference external" href="https://zh.wikipedia.org/wiki/%E7%AA%81%E7%A0%B4%E7%BD%91%E7%BB%9C%E5%AE%A1%E6%9F%A5"&gt;工具&lt;/a&gt;。&lt;/p&gt;
</content><category term="时事评论"></category><category term="信息科技"></category><category term="学生"></category></entry><entry><title>软件作品</title><link href="/software.html" rel="alternate"></link><published>2012-11-03T17:12:00+08:00</published><updated>2012-11-03T17:12:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-11-03:/software.html</id><summary type="html">&lt;p&gt;由于网站更替，一大堆东西没有传上来。分开写时间顺序可能有点乱，现只好将已完的作品分条陈列如下。本篇文章介绍软件部分。Gumble 即为原 Bigpig，批量更改不方便，所以就放在那儿了。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;目录&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft1"&gt;屏幕锁&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft2"&gt;PPT歌词代码生成器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft3"&gt;平均色计算工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft4"&gt;打拍子&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft5"&gt;自动运行分类设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft6"&gt;文件粉碎机&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft7"&gt;文本批量替换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft8"&gt;垃圾文件制造者&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft9"&gt;整人软件大集合&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft10"&gt;控件补丁包&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;1.屏幕锁&lt;/h2&gt;
&lt;p&gt;屏幕锁 1.0.15&lt;/p&gt;
&lt;p&gt;程序启动后，隐藏鼠标指针，封锁键盘输入，挡住其他程序，使别人无法操作。设置完成后按“锁定屏幕”，屏幕即被锁定。解锁时，请先按“Ctrl+Shift+C”（清空现有输入），然后按平时输入文本框的方式输入密码，按“Ctrl+Shift+Enter”（注意！不是仅按Enter！）即可解锁。&lt;strong&gt;密码请牢记 …&lt;/strong&gt;&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;由于网站更替，一大堆东西没有传上来。分开写时间顺序可能有点乱，现只好将已完的作品分条陈列如下。本篇文章介绍软件部分。Gumble 即为原 Bigpig，批量更改不方便，所以就放在那儿了。&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;目录&lt;/h2&gt;
&lt;ol class="arabic simple"&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft1"&gt;屏幕锁&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft2"&gt;PPT歌词代码生成器&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft3"&gt;平均色计算工具&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft4"&gt;打拍子&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft5"&gt;自动运行分类设置&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft6"&gt;文件粉碎机&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft7"&gt;文本批量替换&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft8"&gt;垃圾文件制造者&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft9"&gt;整人软件大集合&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a class="reference external" href="#soft10"&gt;控件补丁包&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;1.屏幕锁&lt;/h2&gt;
&lt;p&gt;屏幕锁 1.0.15&lt;/p&gt;
&lt;p&gt;程序启动后，隐藏鼠标指针，封锁键盘输入，挡住其他程序，使别人无法操作。设置完成后按“锁定屏幕”，屏幕即被锁定。解锁时，请先按“Ctrl+Shift+C”（清空现有输入），然后按平时输入文本框的方式输入密码，按“Ctrl+Shift+Enter”（注意！不是仅按Enter！）即可解锁。&lt;strong&gt;密码请牢记&lt;/strong&gt;，否则可能只能通过按机箱上的重启键解决！如忘记已保存的密码，请重新设置密码。作者对因使用该软件所造成的一切损失（数据丢失等）概不负责。&lt;/p&gt;
&lt;div class="section" id="id4"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: ScreenLock.exe
大小: 102400 字节
文件版本: 1.00.0015
修改时间: 2012年9月9日, 9:57:54
MD5: ACE42B6554D2E37ED3FF03BD7A0302AB
SHA1: 31A9CDB28D252AB048314C205922068D8876E1A7
CRC32: 833835FF
&lt;/pre&gt;
&lt;p&gt;下载地址：&lt;a class="reference external" href="/static/2012/10/scrlock.zip"&gt;屏幕锁&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="ppt"&gt;
&lt;h2&gt;2.PPT歌词代码生成器&lt;/h2&gt;
&lt;p&gt;PPT歌词代码生成器1.2.30&lt;/p&gt;
&lt;p&gt;让PPT能与音乐同步显示歌词。这玩意儿自诞生之日起已经两周年了，但在大型场合下没有成功用到过一次，为了纪念这么二的程序创造两周年，特此放在第二的位置上。使用说明请看随附文本文档，我不贴上去，下载后看文档、用程序的人请自带避雷针。&lt;/p&gt;
&lt;p&gt;不过它其实是费尽了我的心血的。它支持各种通用编码，无论时间码是否压缩的各种lrc格式。提供两种显示方法（单行显示和全部着色显示），在不同场合下使用。使用方法针对PowerPoint
2003，以上版本请自己试验，不会差太多。制作好的PPT在放映前，请先确定目标机器的安全设置。点“工具”，“选项”，“安全性”，“宏安全性”，选“中”。打开PPT时点启用宏。否则歌词可能无法显示。对LRC解析代码感兴趣的可以与我联系。源代码已上传。&lt;/p&gt;
&lt;p&gt;废话不多说了，上文件：&lt;a class="reference external" href="/static/2012/10/PPTLrc.zip"&gt;PPT歌词代码生成器&lt;/a&gt;，（新）&lt;a class="reference external" href="/static/2012/11/pptlrc_src.zip"&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: PPTLrc.exe
大小: 94208 字节
文件版本: 1.02.0030
修改时间: 2012年9月8日, 16:07:41
MD5: 2F34771795F9D4371FAA6C3312B9EB4E
SHA1: 0C734156FF59D381F2CF5541F9670D5B13A7A8B7
CRC32: BE0F8141
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;3.平均色计算工具&lt;/h2&gt;
&lt;p&gt;平均色计算工具1.0.9&lt;/p&gt;
&lt;p&gt;设计中可能用到，把图片的平均色作为底色。然后就有这个工具了。代码因为包含对系统快速处理图像的API的利用，具有一定的教学价值，所以开放源代码，可随意使用，最好注明作者。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/AvgClr.zip"&gt;平均色计算工具&lt;/a&gt;、&lt;a class="reference external" href="/static/2012/11/avgclr_src.zip"&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id7"&gt;
&lt;h3&gt;校验信息&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: AvgClr.exe
大小: 94208 字节
文件版本: 1.00.0009
修改时间: 2013年4月19日, 23:54:56
MD5: 525D65DD2035D5D6B20AB7241B22E4E8
SHA1: 1865C92651E6F40816A42456F50962F5496145B7
CRC32: 9FB2551D
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id8"&gt;
&lt;h2&gt;4.打拍子&lt;/h2&gt;
&lt;p&gt;打拍子 V1.0&lt;/p&gt;
&lt;p&gt;提供简易的测定音乐速度及节拍器功能。开始计时后跟着音乐的节奏按空格键打拍子，程序会根据按键平均的间隔时间算出音乐的速度（BPM，每分钟几拍）。如一拍时间太短，可勾选选项，两拍按一次空格键。为保证平均速度的稳定，前几次打拍子被忽略；如果平均值趋于稳定，就停止计时。由于算法简单，还是公开源代码。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/beats.zip"&gt;打拍子&lt;/a&gt;，&lt;a class="reference external" href="/static/2012/11/beats_src.zip"&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id9"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: Beats.exe
大小: 24576 字节
文件版本: 1.00.0002
修改时间: 2012年10月6日, 18:51:33
MD5: B5764AFC242BB3460376B124B1464428
SHA1: 19492D431BAB40642772E6779A48B2DD8B9F60A6
CRC32: 9512CDD2
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id10"&gt;
&lt;h2&gt;5.自动运行分类设置&lt;/h2&gt;
&lt;p&gt;自动运行分类设置1.0&lt;/p&gt;
&lt;p&gt;很多系统优化软件都提供了屏蔽自动运行的功能，但一般光盘中没有通过自动运行传播的病毒，它们也一并被封杀，失去了原有的便捷的功能。这个小软件能分种类设置禁止自动运行的设备，既方便运行光盘，又防止U盘病毒。&lt;/p&gt;
&lt;p&gt;这个程序通过修改注册表键值（&lt;tt class="docutils literal"&gt;HKEY_LOCAL_MACHINESOFTWARE\Microsoft\Windows\CurrentVersion\policies\Explorer\NoDriveTypeAutoRun&lt;/tt&gt;）来禁止某些类型的自动运行（如U盘、硬盘等）。发放源代码。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/autorun.zip"&gt;自动运行分类设置&lt;/a&gt;，&lt;a class="reference external" href="/static/2012/11/autorun_src.zip"&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id11"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: autorun.exe
大小: 36864 字节
文件版本: 1.00.0006
修改时间: 2010年8月11日, 13:24:43
MD5: C5193089E38EA046EF9C1E095CB814DC
SHA1: E0C8206D2FAB0869FFC6A5108F37B965BE3871CA
CRC32: 5EAD809E
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id12"&gt;
&lt;h2&gt;6.文件粉碎机&lt;/h2&gt;
&lt;p&gt;文件粉碎机v1.1&lt;/p&gt;
&lt;p&gt;彻底删除不想被泄露的文件。支持拖放，支持文件夹，支持大文件，支持列表内多选、快捷键操作，支持未完全粉碎时取消拯救部分文件。可以隐藏或更改删除文件名（低）、时间戳（中）、文件位置和大小（高），括号内为粉碎等级。基本上个人觉得除界面之外，比很多大厂商做的要好一些。软件没有经过专业测试，不保证能完全实现保护隐私，仅可作为一般用途。作者已停止开发，软件略有Bug，但一般不影响正常使用。系统API总是一个好东西。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/FileGrinder.zip"&gt;文件粉碎机&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id13"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: FileGrinder.exe
大小: 139264 字节
文件版本: 1.01.0075
修改时间: 2011年11月12日, 23:20:46
MD5: E8E49640ACB5E3FB076DF4DEF40E9583
SHA1: DCA4F3C85A15F37044A15F7808F61449C322CDE5
CRC32: 887D091E
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id14"&gt;
&lt;h2&gt;7.文本批量替换&lt;/h2&gt;
&lt;p&gt;文本批量替换1.0&lt;/p&gt;
&lt;p&gt;在同一个文件中有好几&lt;strong&gt;组&lt;/strong&gt;需要替换成其他对应的文本的文本时，这个软件就非常有用。这个软件的源代码主要展示了FileSystemObject、Instr等字符串处理函数的应用。先编写好替换规则文件，格式：“被替换=替换为”，一行一个。软件会按从上往下的顺序进行替换，并忽略没有等号的行。&lt;/p&gt;
&lt;p&gt;这软件我不想多说什么，好像不太能用到。放在这吧。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/batchrplc.zip"&gt;文本批量替换&lt;/a&gt;，&lt;a class="reference external" href="/static/2012/11/batchrplc_src.zip"&gt;源代码&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id15"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: BatchReplace.exe
大小: 69632 字节
文件版本: 1.00.0008
修改时间: 2010年8月23日, 13:33:06
MD5: 7DD6D2E9C0133CE55A04753AFAE9054E
SHA1: 52CF32D62F9B2C49FFAEBF07D0B0DA91BB5446DB
CRC32: 45382A84
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id16"&gt;
&lt;h2&gt;8.垃圾文件制造者&lt;/h2&gt;
&lt;p&gt;垃圾文件制造者1.0&lt;/p&gt;
&lt;p&gt;批量制造垃圾文件是它的功能。选好数量，选好大小，选好地点，然后静等完成。制造垃圾文件主要是用来测试，我就不知道其他用途了。此软件是文件粉碎机的姊妹篇，所用方法是一样的，只是用途不同。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/TrashMaker.zip"&gt;垃圾文件制造者&lt;/a&gt;&lt;/p&gt;
&lt;div class="section" id="id17"&gt;
&lt;h3&gt;校验信息：&lt;/h3&gt;
&lt;pre class="literal-block"&gt;
文件: TrashMaker.exe
大小: 77824 字节
文件版本: 1.00.0007
修改时间: 2012年11月3日, 16:22:24
MD5: A6175AE520450766AF1A3E5DEB23ADC2
SHA1: A5450A12780928A7B295D512B1E4BD64FEF2D936
CRC32: 298CBA03
&lt;/pre&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;div class="section" id="id18"&gt;
&lt;h2&gt;9.整人软件大集合&lt;/h2&gt;
&lt;p&gt;疯狂的鼠标指针 2.0.2；錯誤 1.0.0.14；鼠标坏了 1.0.2；关不掉的窗口
V1.1.0.8；疯狂的鼠标指针 V1.0.0&lt;/p&gt;
&lt;p&gt;其实这些整人程序都是我最早学习时做的，所以有些沿用Bigpig创立之前的代号“Fool's
software”，不过效果不错。所有软件都内附有说明和解决办法等内容，还有可能有写实现原理。有些功能对XP以上系统可能失效。作者对可能引起的损失概不负责，请勿用于非法用途。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/fool.zip"&gt;整人软件&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;校验信息在软件说明中。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id19"&gt;
&lt;h2&gt;10.控件补丁包&lt;/h2&gt;
&lt;p&gt;有些比较旧的软件由于我编程技术跟不上，使用了VB的ocx，而不是直接使用系统API，导致系统兼容性不好。现发出ocx打包，无法运行时请安装。文件均来自微软系统，版权属于微软。&lt;/p&gt;
&lt;p&gt;下载：&lt;a class="reference external" href="/static/2012/11/ActiveX-Install.zip"&gt;控件自动安装包&lt;/a&gt;或&lt;a class="reference external" href="/static/2012/11/ActiveX-ocx.zip"&gt;散装控件+NSIS源代码&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id20"&gt;
&lt;h2&gt;感谢使用&lt;/h2&gt;
&lt;p&gt;以上所有软件完全免费、安全，均可在Microsoft Windows
XP系统正常运行，支持Windows
7。任何人都可以非商业性使用或转载本站所公布的软件。转载软件介绍及任何文字描述时请注明出处及作者。&lt;/p&gt;
&lt;/div&gt;
</content><category term="作品发布"></category><category term="软件"></category></entry><entry><title>脉冲通信代码</title><link href="/pcc.html" rel="alternate"></link><published>2012-09-16T10:29:00+08:00</published><updated>2012-09-16T10:29:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-09-16:/pcc.html</id><summary type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;一、目的&lt;/h2&gt;
&lt;p&gt;为在只能通过发送在较短时间内无法以长度区分的信号，以信号间隔为信息介质的情形下提供快速编码通信的解决方案。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;二、编码规则&lt;/h2&gt;
&lt;p&gt;此编码为定长编码。一个字符为六次信号，信号中有长短间隔。每个字符间可以有更长的间隔时间作区分。现规定以“x”为信号，以“.”为信号间隔。&lt;/p&gt;
&lt;p&gt;开始时以六次连续的信号“xxxxxx”为呼叫代码，最后以“x.xxxxx
xxxxxx”结束。编码示例：xxxxxx xxxx.x.x x.xx.xx.x xxx.x.x.x xxx.x.x.x
x.xxxxx xx.xx.x x.xxxxx xx.x.x …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;一、目的&lt;/h2&gt;
&lt;p&gt;为在只能通过发送在较短时间内无法以长度区分的信号，以信号间隔为信息介质的情形下提供快速编码通信的解决方案。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;二、编码规则&lt;/h2&gt;
&lt;p&gt;此编码为定长编码。一个字符为六次信号，信号中有长短间隔。每个字符间可以有更长的间隔时间作区分。现规定以“x”为信号，以“.”为信号间隔。&lt;/p&gt;
&lt;p&gt;开始时以六次连续的信号“xxxxxx”为呼叫代码，最后以“x.xxxxx
xxxxxx”结束。编码示例：xxxxxx xxxx.x.x x.xx.xx.x xxx.x.x.x xxx.x.x.x
x.xxxxx xx.xx.x x.xxxxx xx.x.x.x.x x.xxxxx
xxxxxx。（HELLO!）由于效率原因一般不区分大小写。启用大小写模式用“x.xxxxx
x.xxxxx
xxxxx.x”，之后表示大写在字符前加“xxxxx.x”。锁定/解锁换档用“x.xxxxx
x.xxxxx x.xxxxx”。负号用“x.xxxxx xxxxx.x”。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;三、简记法&lt;/h2&gt;
&lt;p&gt;由于编码编制本身以5位二进制数为基础，所以实际使用时应用只表示信号间隔的简记法。有空格用“1”、“-”，无空格用“0”、“/”。此项不硬性规定，只要方便皆可。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;四、代码表（简记法）&lt;/h2&gt;
&lt;table border="0" frame="VOID" rules="NONE" cellspacing="0"&gt;&lt;colgroup&gt;&lt;col width="86"&gt;&lt;/col&gt;&lt;col width="86"&gt;&lt;/col&gt;&lt;col width="86"&gt;&lt;/col&gt;&lt;/colgroup&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="LEFT" width="86" height="17"&gt;&lt;/td&gt;&lt;td align="LEFT" width="86"&gt;&lt;p&gt;含义&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT" width="86"&gt;&lt;p&gt;换档&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00000&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;呼叫&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;重置&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11111&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;呼叫&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;重置&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10000&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;换档&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;模式&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00001&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;大小写&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;负号&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11110&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;不知道&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;提问&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01000&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;A&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11000&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;B&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00100&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;C&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10100&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;D&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01100&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;E&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11100&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;F&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00010&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;G&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10010&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;H&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01010&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;I&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11010&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;J&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10001&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;A&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;N&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01001&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;B&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;O&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11001&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;C&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;P&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00101&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;D&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;Q&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10101&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;E&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;R&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01101&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;F&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;S&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11101&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;G&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;T&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00011&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;H&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;U&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10011&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;I&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;V&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01011&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;J&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;W&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;11011&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;K&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;X&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;00111&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;L&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;Y&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;10111&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;M&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;Z&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01110&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;,&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;?&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="17"&gt;&lt;p&gt;01111&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;.&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;!&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="21"&gt;&lt;p&gt;00110&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;自定1&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;自定3&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="LEFT" height="21"&gt;&lt;p&gt;10110&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;自定2&lt;/p&gt;
&lt;/td&gt;&lt;td align="LEFT"&gt;&lt;p&gt;自定4&lt;/p&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;p&gt;&lt;strong&gt;五、转码规则&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;数字部分为信号间隔的二进制码翻转后减1即为该数字。字母部分为信号间隔的二进制码翻转后去掉最高位即为该字母编号或该字母编号除13的余数（换档）。这样可以使用普通的十进制与二进制互转的方法来编/解码。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;六、说明&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;本作品采用知识共享署名 3.0
Unported许可协议进行许可。即此方案使用者可随意修改和使用，如转载须注明原作者。&lt;/p&gt;
&lt;p&gt;2011年1月、2012年9月&lt;/p&gt;
&lt;p&gt;PS：此方法能干什么来着？自己想想。&lt;/p&gt;
&lt;/div&gt;
</content><category term="文字作品"></category><category term="代码"></category><category term="学生"></category><category term="通信"></category></entry><entry><title>简便的字数计算方法（续）</title><link href="/how-much-ink.html" rel="alternate"></link><published>2012-09-16T10:06:00+08:00</published><updated>2012-09-16T10:06:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-09-16:/how-much-ink.html</id><summary type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;一、原理&lt;/h2&gt;
&lt;p&gt;见《&lt;a class="reference external" href="https://gumble.pw/2012/amount-of-ink/"&gt;费了多少笔墨&lt;/a&gt;》一文。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;二、计算尺&lt;/h2&gt;
&lt;p&gt;为方便计算，按墨水管与纸上长度的比值制得计算尺。计算尺分三种型号：0.4mm、0.3mm、0.5mm。一般笔墨宽度0.5mm用0.4mm，0.38/0.35mm用0.3mm，出墨量大的0.5mm用0.5mm。如图所示为0.4mm的计算尺。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/ruler.png"&gt;&lt;img alt="笔墨计算尺" src="/static/2012/09/ruler.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;三、制作方法&lt;/h2&gt;
&lt;p&gt;将文后所附的打印稿打印在纸上（最好是卡纸），然后用如下图所示的方法裁剪，如下图所示的方法折叠。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto2.png"&gt;&lt;img alt="笔墨计算尺-裁剪" src="/static/2012/09/howto2-1024x493.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto3.png"&gt;&lt;img alt="笔墨计算尺-折叠" src="/static/2012/09/howto3.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;四、使用方法&lt;/h2&gt;
&lt;p&gt;写字前先用刻度尺测量从笔芯末端到笔墨末端的距离并记录。写字后将计算尺卡纸卡在刻度尺上，左端对准记录下的距离的刻度，笔墨末端对准计算尺的刻度即为所求的墨水长度/字数的值。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto.png"&gt;&lt;img alt="笔墨计算尺-使用" src="/static/2012/09/howto-1024x372.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;五、数据&lt;/h2&gt;
&lt;p&gt;本计算尺所使用数据如下：&lt;/p&gt;
&lt;p&gt;笔墨厚度：3.5μm，墨水管半径：0 …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;div class="section" id="id2"&gt;
&lt;h2&gt;一、原理&lt;/h2&gt;
&lt;p&gt;见《&lt;a class="reference external" href="https://gumble.pw/2012/amount-of-ink/"&gt;费了多少笔墨&lt;/a&gt;》一文。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;二、计算尺&lt;/h2&gt;
&lt;p&gt;为方便计算，按墨水管与纸上长度的比值制得计算尺。计算尺分三种型号：0.4mm、0.3mm、0.5mm。一般笔墨宽度0.5mm用0.4mm，0.38/0.35mm用0.3mm，出墨量大的0.5mm用0.5mm。如图所示为0.4mm的计算尺。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/ruler.png"&gt;&lt;img alt="笔墨计算尺" src="/static/2012/09/ruler.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;三、制作方法&lt;/h2&gt;
&lt;p&gt;将文后所附的打印稿打印在纸上（最好是卡纸），然后用如下图所示的方法裁剪，如下图所示的方法折叠。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto2.png"&gt;&lt;img alt="笔墨计算尺-裁剪" src="/static/2012/09/howto2-1024x493.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto3.png"&gt;&lt;img alt="笔墨计算尺-折叠" src="/static/2012/09/howto3.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id5"&gt;
&lt;h2&gt;四、使用方法&lt;/h2&gt;
&lt;p&gt;写字前先用刻度尺测量从笔芯末端到笔墨末端的距离并记录。写字后将计算尺卡纸卡在刻度尺上，左端对准记录下的距离的刻度，笔墨末端对准计算尺的刻度即为所求的墨水长度/字数的值。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/09/howto.png"&gt;&lt;img alt="笔墨计算尺-使用" src="/static/2012/09/howto-1024x372.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id6"&gt;
&lt;h2&gt;五、数据&lt;/h2&gt;
&lt;p&gt;本计算尺所使用数据如下：&lt;/p&gt;
&lt;p&gt;笔墨厚度：3.5μm，墨水管半径：0.125cm，墨水宽度：0.3、0.4、0.5mm，单字墨水长度（按简体中文字计算）：2.5cm。刻度间距精确到0.01mm。最大绘图误差（0.4mm尺）：刻度+0.26mm，测得长度+90.52cm。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id7"&gt;
&lt;h2&gt;六、附件&lt;/h2&gt;
&lt;p&gt;《&lt;a class="reference external" href="/static/2012/09/笔墨计算尺.pdf"&gt;笔墨计算尺&lt;/a&gt;》PDF打印稿。&lt;strong&gt;注意：&lt;/strong&gt;文档尺寸为B5，打印时即使纸张大小是A4或B5或更小，也请务必选择“无缩放”/“实际大小”，否则可能会有误差。使用卡纸时在打印机选项页面的纸张类型中请正确选择。&lt;/p&gt;
&lt;p&gt;2012年9月15日&lt;/p&gt;
&lt;/div&gt;
</content><category term="作品发布"></category><category term="小制作"></category><category term="水笔"></category></entry><entry><title>手绘QR码</title><link href="/handpainted-qrcode.html" rel="alternate"></link><published>2012-08-21T14:11:00+08:00</published><updated>2012-08-21T14:11:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-08-21:/handpainted-qrcode.html</id><summary type="html">&lt;a class="reference external image-reference" href="/static/2012/08/QRCode.jpg"&gt;&lt;img alt="QRCode" src="/static/2012/08/QRCode-260x300.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;用手机扫描一下，显示“HELLO”。在此声明，没有计算机我是完成不了这个任务的。&lt;/p&gt;
&lt;p&gt;首先我当然是阅读教程：&lt;a class="reference external" href="http://blog.csdn.net/dekko/article/details/6121899"&gt;QR码编码原理&lt;/a&gt;、&lt;a class="reference external" href="http://www.thonky.com/qr-code-tutorial/"&gt;QR
Code
Tutorial&lt;/a&gt;。打格子之类的事情我就不说了。把“HELLO”按混合模式（Alphanumeric
Mode）手工编码，从图上看得出来（铅笔写的部分），得32,43,11,120,204,0,236,17,236。于是进入纠错码环节。读了《&lt;a class="reference external" href="http://www.thonky.com/qr-code-tutorial/"&gt;QR
Code
Tutorial&lt;/a&gt;》的纠错码部分，本来想自己算的，但计算实在太繁杂，不得不用网站提供的工具计算出了纠错码。想学习算法的同学自己看教程。然后，我自编了一个小程序（VB）帮忙把这些数字转为了二进制。数据如下：&lt;/p&gt;
&lt;p&gt;32,43,11,120,204,0,236 …&lt;/p&gt;</summary><content type="html">&lt;a class="reference external image-reference" href="/static/2012/08/QRCode.jpg"&gt;&lt;img alt="QRCode" src="/static/2012/08/QRCode-260x300.jpg" /&gt;&lt;/a&gt;
&lt;p&gt;用手机扫描一下，显示“HELLO”。在此声明，没有计算机我是完成不了这个任务的。&lt;/p&gt;
&lt;p&gt;首先我当然是阅读教程：&lt;a class="reference external" href="http://blog.csdn.net/dekko/article/details/6121899"&gt;QR码编码原理&lt;/a&gt;、&lt;a class="reference external" href="http://www.thonky.com/qr-code-tutorial/"&gt;QR
Code
Tutorial&lt;/a&gt;。打格子之类的事情我就不说了。把“HELLO”按混合模式（Alphanumeric
Mode）手工编码，从图上看得出来（铅笔写的部分），得32,43,11,120,204,0,236,17,236。于是进入纠错码环节。读了《&lt;a class="reference external" href="http://www.thonky.com/qr-code-tutorial/"&gt;QR
Code
Tutorial&lt;/a&gt;》的纠错码部分，本来想自己算的，但计算实在太繁杂，不得不用网站提供的工具计算出了纠错码。想学习算法的同学自己看教程。然后，我自编了一个小程序（VB）帮忙把这些数字转为了二进制。数据如下：&lt;/p&gt;
&lt;p&gt;32,43,11,120,204,0,236,17,236,109,149,156,18,217,41,246,36,42,84,46,225,190,218,251,27,196&lt;/p&gt;
&lt;p&gt;代码如下（中文吓死你！）（其中&lt;tt class="docutils literal"&gt;InputText(2)&lt;/tt&gt;是输入这些数字，&lt;tt class="docutils literal"&gt;OutputText&lt;/tt&gt;是输出，可以用&lt;tt class="docutils literal"&gt;Debug.Print&lt;/tt&gt;之类的代替。这是在我自己做的一个专门用于测试片段代码的vb程序中的输入输出函数）：&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;span&gt;&lt;/span&gt;&lt;span class="vg"&gt;Private&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Sub&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Command1_Click&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;String&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Str&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Split&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;InputText&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="il"&gt;2&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;,&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;i&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;LBound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;UBound&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;OutputText&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;Format&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;CLng&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;Str&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;i&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;10&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;2&lt;/span&gt;&lt;span class="p"&gt;)),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;00000000&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Next&lt;/span&gt;
&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Sub&lt;/span&gt;

&lt;span class="vg"&gt;Function&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;ByVal&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;String&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;String&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;进行转换的子程序&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;转换自易语言例程（易语言例程有时还是很有用的）&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;String&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;输入的文本串&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;String&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;存放从输入的文本串中取出的一个文本&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时数值&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Long&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;次方数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;          &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;每一位数字对应的10的次方数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;要转换的进制-1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;要转换的进制&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;被转换的进制&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;将被转换数字转换成的大数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;余数大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;存放求出的余数大数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;数值1大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;只存放1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Currency&lt;/span&gt;&lt;span class="w"&gt;       &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;将被转换数字的每一位转换成的大数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Dim&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时变量&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;As&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Integer&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Or&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;36&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Then&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 判断两个“进制系数”是否正确&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;参数错误-进制只能在2-36之间&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;Exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Function&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;UCase&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;StrConv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;vbNarrow&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 规范参数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 判断输入的数字文本是否有效&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Mid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;InStr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;Left&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="p"&gt;),&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;-1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Then&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39;临时文本 = &amp;quot;参数错误-&amp;quot; &amp;amp; 被转换文本 &amp;amp; &amp;quot;不是一个有效的&amp;quot; &amp;amp; Left(daxie(被转换进制, True), LenB(StrConv(daxie(被转换进制, True), vbFromUnicode)) - 4) &amp;amp; &amp;quot;进制数！&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;参数错误-&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;不是一个有效的&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;amp;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;进制数！&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="vg"&gt;Exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;For&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 全部查找完毕&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Then&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Next&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 如果临时文本不为空，说明此数字文本无效！&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;lt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Then&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;临时文本&amp;quot;&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;Exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Function&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 以上为数据正确性校验处理代码&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Then&lt;/span&gt;&lt;span class="w"&gt;   &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 相同时，不用进行转换&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;Exit&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Function&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;If&lt;/span&gt;

&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 先将要转换的数字放入大数中&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;次方数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 数值1不能直接和大数类型计算，所以先放入一个大数中&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;被转换进制大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;For&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量2&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;To&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Len&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 求次方&lt;/span&gt;
&lt;span class="w"&gt;            &lt;/span&gt;&lt;span class="vg"&gt;次方数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;次方数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;被转换进制大数&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;Next&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时变量&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;InStr&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Mid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;被转换文本&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;计次变量1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时变量&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;次方数&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 临时大数即为最后转换成的大数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Next&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;数值1大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 数值1不能直接和大数类型计算，所以先放入一个大数中&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;While&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;&amp;gt;&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数1&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 开始进制转换,除进制数取余数&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;余数大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Mod&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 求出的余数&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;余数大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;数值1大数&lt;/span&gt;&lt;span class="w"&gt;  &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 求出的余数＋1&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时数值&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;CCur&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;StrConv&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;临时大数1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;vbNarrow&lt;/span&gt;&lt;span class="p"&gt;))&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 最后的余数&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Mid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时数值&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;&lt;span class="w"&gt;     &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 找出每一个余数对应的数字&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;/&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;转换的进制大数&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 取出剩余的数字&lt;/span&gt;
&lt;span class="w"&gt;        &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Fix&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;Wend&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;临时数值&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时大数&lt;/span&gt;&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 最后剩下的余数&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Mid&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;0123456789ABCDEFGHIJKLMNOPQRSTUVWXYZ&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;临时数值&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="il"&gt;1&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;+&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;&lt;span class="w"&gt;      &lt;/span&gt;&lt;span class="c1"&gt;&amp;#39; 整数转换结束&lt;/span&gt;
&lt;span class="w"&gt;    &lt;/span&gt;&lt;span class="vg"&gt;进制转换&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="o"&gt;=&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;欲转换文本&lt;/span&gt;
&lt;span class="vg"&gt;End&lt;/span&gt;&lt;span class="w"&gt; &lt;/span&gt;&lt;span class="vg"&gt;Function&lt;/span&gt;
&lt;/pre&gt;&lt;/div&gt;
&lt;p&gt;好了，你们想要测试就试一下。输出如下：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
00100000
00101011
00001011
01111000
11001100
00000000
11101100
00010001
11101100
01101101
10010101
10011100
00010010
11011001
00101001
11110110
00100100
00101010
01010100
00101110
11100001
10111110
11011010
11111011
00011011
11000100
&lt;/pre&gt;
&lt;p&gt;为了图省事，我用了Mask1（y mod 2 ==
0）。从右到左，从下到上，用铅笔点上这些点。我深知这违反了QR码Mask的优选法则，但由于是手绘，有点力不从心。至少手机可以扫描才是目的。手绘一位码简单得多，DM码好像不是很普遍。今天就讲到这儿。有兴趣自己去看那两个教程。最后得出结论：有些事情还是应该交给计算机去做。它们被发明出来就是为了简化人们的工作的。&lt;/p&gt;
</content><category term="图像作品"></category><category term="QR码"></category><category term="手绘"></category></entry><entry><title>论小杨生煎与群众效应</title><link href="/the-shengjian-and-the-mass-effect.html" rel="alternate"></link><published>2012-08-20T17:22:00+08:00</published><updated>2012-08-20T17:22:00+08:00</updated><author><name>lay970421</name></author><id>tag:None,2012-08-20:/the-shengjian-and-the-mass-effect.html</id><summary type="html">&lt;p&gt;近日，上海某郊区城市内的一座购物商城内，一家深受大众欢迎小杨生煎分店开门迎客。该店靠其产品皮薄、多汁、肉嫩的特色，吸引了许多食客。言归正传，本文意在交流探讨该店招揽顾客的方法。&lt;/p&gt;
&lt;p&gt;其一，品牌好。小杨生煎早已在本市创下金字招牌，口碑甚好，因此，作为该区第一家分店，自然有不少食客来访。&lt;/p&gt;
&lt;p&gt;其二，地段好。该店所在的购物商城也是该区最大的商城之一，自然客流较大。另外，购物者的消费水平参差不齐，但经济水平大多在小康以上，再加之该店的产品价格公道，因此，销量甚是如意。&lt;/p&gt;
&lt;p&gt;其三，群众效应。这第三条手段是该店最绝的一招，该店门口总有排不尽的长队，早至商场开门，晚至小店打烊，总找不到有丝毫空隙。外人看到这门庭若市的景象，自然不免心痒，也想尝试一番，因此，该店总是不缺顾客。其实，这一切只是因为，该店先将食客领生煎的窗口设在店门口，食客们自然得从店门口排起队，一直排到店外，再加上一锅生煎出炉耗时较长，以及部分食客一次会购买较多生煎等各种因素，导致队伍越排越长。除此之外，还有一个心理因素，该店在三楼，商场屋顶是透明的 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;近日，上海某郊区城市内的一座购物商城内，一家深受大众欢迎小杨生煎分店开门迎客。该店靠其产品皮薄、多汁、肉嫩的特色，吸引了许多食客。言归正传，本文意在交流探讨该店招揽顾客的方法。&lt;/p&gt;
&lt;p&gt;其一，品牌好。小杨生煎早已在本市创下金字招牌，口碑甚好，因此，作为该区第一家分店，自然有不少食客来访。&lt;/p&gt;
&lt;p&gt;其二，地段好。该店所在的购物商城也是该区最大的商城之一，自然客流较大。另外，购物者的消费水平参差不齐，但经济水平大多在小康以上，再加之该店的产品价格公道，因此，销量甚是如意。&lt;/p&gt;
&lt;p&gt;其三，群众效应。这第三条手段是该店最绝的一招，该店门口总有排不尽的长队，早至商场开门，晚至小店打烊，总找不到有丝毫空隙。外人看到这门庭若市的景象，自然不免心痒，也想尝试一番，因此，该店总是不缺顾客。其实，这一切只是因为，该店先将食客领生煎的窗口设在店门口，食客们自然得从店门口排起队，一直排到店外，再加上一锅生煎出炉耗时较长，以及部分食客一次会购买较多生煎等各种因素，导致队伍越排越长。除此之外，还有一个心理因素，该店在三楼，商场屋顶是透明的，遇上晴天就会产生（室内）的温室效应而巨热无比，排队者满头大汗，使人感觉排队时间很长。该店抓住了人们的从众心理，合理使用群众效应，造成了门庭若市的现象，以此吸引了不少顾客。&lt;/p&gt;
&lt;p&gt;对于第三点，部分读者可能会有疑问，为什么顾客看到这么多人不会望而却步呢？其实，作为一家新店，大家总会忍不住去尝试，而且有恒心有毅力的吃货并不鲜见。而且，生煎这种特色小吃既可以当做主食，也可以当做零食，老少皆宜。因此，该店近期的兴隆生意不会有丝毫减弱。&lt;/p&gt;
&lt;p&gt;注：以上均为个人观点，如有异议，请踊跃评论。（该店的生煎很美味，本人已亲自尝试，欢迎大家前去品尝，当心烫嘴）另外，这篇文章由本站的新作者&lt;a class="reference external" href="https://gumble.pw/author/lay970421/"&gt;Kiri&lt;/a&gt;撰写，由Gumble编辑。今后不再提醒，请读者自己留意。&lt;/p&gt;
</content><category term="生活杂记"></category><category term="生活纪实"></category><category term="群众"></category></entry><entry><title>费了多少笔墨</title><link href="/amount-of-ink.html" rel="alternate"></link><published>2012-08-15T15:00:00+08:00</published><updated>2012-08-15T15:00:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-08-15:/amount-of-ink.html</id><summary type="html">&lt;p&gt;这次我要讲的，是对写了多少字的计算方法。有些人说，数数字数不就行了？是，这是一种方法。一千字的文章还可以一个个数一下，但这既费时又费力，还是不如间接去求。先说明一下，本文适用于如图所示类型的中性笔的笔芯。其他样式也可以，只要是圆柱形。如果外面有不透明的图案，那么概不负责。&lt;a class="reference external" href="/static/2012/08/gelpenrefill.jpg"&gt;&lt;img alt="中性笔笔芯" src="/static/2012/08/gelpenrefill.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先，纸上的笔墨我们可以近似看作一个长方体；墨水管中墨水可看作圆柱体。于是可得出（用去的墨水记作ΔV&lt;sub&gt;墨&lt;/sub&gt;，墨水管中减少的高度记作Δh）：&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;ΔV&lt;sub&gt;墨&lt;/sub&gt;=V&lt;sub&gt;长方体&lt;/sub&gt;=ΔV&lt;sub&gt;圆柱体；&lt;/sub&gt;V&lt;sub&gt;圆柱体&lt;/sub&gt;=πr&lt;sup&gt;2&lt;/sup&gt;Δh=π×墨水管半径&lt;sup&gt;2&lt;/sup&gt;×墨水管中减少的高度；&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;V&lt;sub&gt;长方体&lt;/sub&gt;=abh=墨水长度×墨水宽度×墨水厚度。&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;则：墨水长度=π×墨水管半径&lt;sup&gt;2&lt;/sup&gt;×墨水管中减少的高度÷（墨水宽度 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;这次我要讲的，是对写了多少字的计算方法。有些人说，数数字数不就行了？是，这是一种方法。一千字的文章还可以一个个数一下，但这既费时又费力，还是不如间接去求。先说明一下，本文适用于如图所示类型的中性笔的笔芯。其他样式也可以，只要是圆柱形。如果外面有不透明的图案，那么概不负责。&lt;a class="reference external" href="/static/2012/08/gelpenrefill.jpg"&gt;&lt;img alt="中性笔笔芯" src="/static/2012/08/gelpenrefill.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;首先，纸上的笔墨我们可以近似看作一个长方体；墨水管中墨水可看作圆柱体。于是可得出（用去的墨水记作ΔV&lt;sub&gt;墨&lt;/sub&gt;，墨水管中减少的高度记作Δh）：&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;ΔV&lt;sub&gt;墨&lt;/sub&gt;=V&lt;sub&gt;长方体&lt;/sub&gt;=ΔV&lt;sub&gt;圆柱体；&lt;/sub&gt;V&lt;sub&gt;圆柱体&lt;/sub&gt;=πr&lt;sup&gt;2&lt;/sup&gt;Δh=π×墨水管半径&lt;sup&gt;2&lt;/sup&gt;×墨水管中减少的高度；&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;V&lt;sub&gt;长方体&lt;/sub&gt;=abh=墨水长度×墨水宽度×墨水厚度。&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;则：墨水长度=π×墨水管半径&lt;sup&gt;2&lt;/sup&gt;×墨水管中减少的高度÷（墨水宽度×墨水厚度）&lt;/p&gt;
&lt;p&gt;对于如图所示的笔芯，墨水管半径为0.125cm，墨水宽度为0.03～0.05cm（视具体规格而定），墨水厚度……为3.5μm。这个3.5μm是我自己用上述公式的变形（墨水长度已知）得出的。纸张为再生纸，其他类型的纸张我没试过，估计差不了多少。对于这种笔芯（墨水宽度以0.04cm计，因为号称0.5mm的笔芯用过一段时间之后就达不到0.5mm了），把数据代进去，公式可简化为：墨水管中减少的高度×3500。其他笔芯相仿。&lt;/p&gt;
&lt;p&gt;这样，就没有数字数的必要，一个汉字大约2.5cm，除一下就行了。与字数无关的情况就用不着了，直接比较长度大小。书写速度，或者更准确地说，速率，单位就是厘米/秒。（米/秒的话数值太小）开始写字的时候，测量一下墨水液面到笔芯末的距离，写完了再测一下，看看数字就对费了多少笔墨心中有数了。这也是测量作业量的一种较为客观简便的方法。不能保证作业&lt;a class="reference external" href="https://gumble.pw/2011/homework-amount/"&gt;只要做两个小时&lt;/a&gt;，至少通过比较笔墨量，最后得出一个平衡的结果。&lt;/p&gt;
&lt;p&gt;（2012年9月16日更新：&lt;a class="reference external" href="https://gumble.pw/2012/how-much-ink/"&gt;笔墨计算尺&lt;/a&gt;。）&lt;/p&gt;
</content><category term="研究报告"></category><category term="作业"></category><category term="水笔"></category></entry><entry><title>作业云计算</title><link href="/cloudy-homework.html" rel="alternate"></link><published>2012-08-13T14:50:00+08:00</published><updated>2012-08-13T14:50:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-08-13:/cloudy-homework.html</id><summary type="html">&lt;p&gt;云计算似乎是近年发展起来的，但“作业云计算”则由来已久。作业云计算当然也是有来头的。譬如老师布置作业过多，或难度较大，对自己的答案没有信心等。由各种各样的原因，复杂而高效的作业云计算自然而然地产生了。&lt;/p&gt;
&lt;p&gt;作业云计算中一朵“云”的结构主要又两部分组成。一部分是计算者，也就是我们所说的做作业的，一部分是接受者，也就是我们所说的抄作业的。这两层当然不可能分得那么绝对。有时自己做给别人抄，有时抄别人的人毕竟也是有一部分的。计算者之中大概有两种信息共享方式：一种是并列式，一起完成同样的作业，同时（或之后）讨论、校对并改进答案，这种方式在成绩较好的同学中比较多见；一种是分段式，参与者各自做完一段，然后互相共享其答案。孔子也有回答不出问题的时候（参见《两小儿辩日》），所以计算者做不出或嫌麻烦时，也会请求外部资源的帮助。例如请教不参与云计算而成绩较好者，或查阅已有文献如网络资源、书本及参考答案等。如此一来，作业便解决了。接下来成果进入接受者中流通。通常有与计算者关系较好者接收成果，先给自己复制，后以各种方式分发给其他人。当然，接受者也会自己通过上述的外部资源完成作业。接受者有时可能发现答案中的错误，便反馈给计算者。&lt;/p&gt;
&lt;p&gt;云朵之外还有一些旁观者 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;云计算似乎是近年发展起来的，但“作业云计算”则由来已久。作业云计算当然也是有来头的。譬如老师布置作业过多，或难度较大，对自己的答案没有信心等。由各种各样的原因，复杂而高效的作业云计算自然而然地产生了。&lt;/p&gt;
&lt;p&gt;作业云计算中一朵“云”的结构主要又两部分组成。一部分是计算者，也就是我们所说的做作业的，一部分是接受者，也就是我们所说的抄作业的。这两层当然不可能分得那么绝对。有时自己做给别人抄，有时抄别人的人毕竟也是有一部分的。计算者之中大概有两种信息共享方式：一种是并列式，一起完成同样的作业，同时（或之后）讨论、校对并改进答案，这种方式在成绩较好的同学中比较多见；一种是分段式，参与者各自做完一段，然后互相共享其答案。孔子也有回答不出问题的时候（参见《两小儿辩日》），所以计算者做不出或嫌麻烦时，也会请求外部资源的帮助。例如请教不参与云计算而成绩较好者，或查阅已有文献如网络资源、书本及参考答案等。如此一来，作业便解决了。接下来成果进入接受者中流通。通常有与计算者关系较好者接收成果，先给自己复制，后以各种方式分发给其他人。当然，接受者也会自己通过上述的外部资源完成作业。接受者有时可能发现答案中的错误，便反馈给计算者。&lt;/p&gt;
&lt;p&gt;云朵之外还有一些旁观者。他们这些乖孩子很少参与抄作业，都靠自己解决，这样就要比云中的人多耗费很多时间，所以这样的人比较少。有时他们的角色会转换成计算者的外援，有时也会成为不抄作业的计算者。毕竟人是社会性动物，不可能完全置身世外。一个班级里可能会有好几多这样的云，通常以地域和朋友圈划分。它们相对独立，有各自的生态系统，但也经常会有联系，例如相互的资源共享。如上所述，这样基本就是作业云计算的构成。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/07/CloudyHomework.png"&gt;&lt;img alt="作业云计算" src="/static/2012/07/CloudyHomework-1024x723.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;（图上很清晰地描绘了作业云计算的结构，流程图也值得一看。）&lt;/p&gt;
&lt;p&gt;作业云计算如此高效的运作当然与它的一些特点是分不开的。首先，它与其他云计算一样，局部很少影响整体。一个不能工作，云计算还是照常运行，只是效率可能会降低。对于反抄作业检查，云总能很好应对。计算者由于成绩较好及老师的信任等原因，很少被发现或提出指控，而接受者则很容易遭殃。即使计算者被提出指控，此时举报人常处于不利地位，于是举报人受到批评而被举报者通常就被无视。这应该也是云不间断运作的原因之一。云中各色人等大多有利用各种空闲时间完成做或抄作业任务的能力，且一些人能在完成后及时进行传递，或在不懂时及时利用外部资源。这也对运行效率有很大的贡献。同学们互相之间的检验和对外部资源的利用保证了答案的正确率。&lt;/p&gt;
&lt;p&gt;万事皆有利弊。作业云计算的好处前面已提到，能高效完成作业并分发，这样减少了同学们作业的压力和晚上做作业的时间，让同学们在晚上能有时间培养自己的兴趣、获得充足的睡眠。有了充足的睡眠，上课就可以专心听讲，为下一轮云计算做好准备，形成良性循环。计算者经过自己的研究实践和互相讨论，增加了自信心，也增强了解题的能力和不怕困难坚持不懈的精神，这样学习成绩可能不降反升。同时，云计算中的关系可发展为稳固的社交关系，催生出同学间各种情感，形成良好的学习环境和互相帮助的氛围。但必须指出的是，上述有利的一面仅仅针对计算者，特别是并列式的计算，而对于接受者，除了晚上的空闲时间外，则几乎不能享受到这种好处，所以不能一概而论“‘抄作业’有利于成绩提高”。&lt;/p&gt;
&lt;p&gt;作业云计算的坏处当然也有不少。正如传统的观点，对于接受者，抄作业使学生沉溺于抄他人的答案而不思考，失去了练习所学知识的机会，这样培养了学生的惰性，形成一种习惯，久而久之成绩自然就下降了，且让学生学会窃取他人成果。而且，学生在晚上作业做完空余的时间可能被用来玩游戏、看各类视频等，这被认为是会影响学习的。很多人没有提到的一点是，在云计算中，做作业和抄作业的行为通常不择手段。譬如同学们可能会在课上，特别是除语数英理化之外的课程上偷空完成作业，这样就损失了其他课程的内容，可能影响考试，又不利于全面发展和素质教育，对老师也是一种不尊重。若被发现，对学生来说，则会花更多的时间来做一些不必要的事情，听取老师教导的时间又会占去更多学习和做作业的时间。&lt;/p&gt;
&lt;p&gt;作业云计算的特点鲜明，它自有优缺点。如何运用云计算的优点来为自己服务并把握好尺度，这是在云中的读者所应该做的。而对于在云计算系统之外的，每个人都有他自己的生活方式，只要有可持续性，则可以继续这么做下去。作业云计算的产生有同学们的苦衷，它是现今教育体制的产物。我们应该用中立的角度看待这个问题，和其他一切事物。存在即合理，作业云计算不失为一种变相减负的方法，会一直存在下去，直到它不再为学生社会所需。作业云计算，不仅是抄作业。&lt;/p&gt;
&lt;p&gt;文章最后，作者附上小诗一首，《学生云》：（此处“云”为动词）&lt;/p&gt;
&lt;p&gt;题不在难，做出就行。错不在改，听懂则灵。斯是末题，留空不应。晨曦衬雀吵，夜色映灯明。谈笑有妙语，往来不碰钉。可以背单词，论古今。有噪声之乱耳，有作业之劳形。南海台湾岛，东洋日本民。学生云：“何苦之有？”&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;后记&lt;/h2&gt;
&lt;p&gt;这篇重量级的文章由于我本来想写在随笔本上作为作业，而没有碰上自由命题的机会，所以它经次次推延，终于得以完成。从开头到特点一段都是在手机上用印象笔记（Evernote）打的，用手机码字还是头一回。在手机上码字可不那么方便，两只手多年训练出来的qwerty键盘手感没多大用处。而且，是图比文章先问世，打字时完全靠脑子回忆那张图的结构，实在记不起才去翻一下。文中埋有一些隐含内容，懂的人自然会知道。近两千字的文章全部是我一个个字打出来的，图也是我自己绘制的（除书本与地球图案之外，这两幅图都属于公有领域）。这幅图我很早就开始构思了，当时的名称叫《作业产业链》，整体思想和这个差不多，只是没有画出来。图上标题副标题皆为我自己亲笔题词，好像看上去还不错。至于作者处于图中哪个位置……作者本人是文中所说的“旁观者”，有时是“外部资源”，所以作业经常做到半夜三更。我以前是最讨厌写作文的，我也没想到这篇文章会那么长。写完这篇文章，我终于明白网络肥皂剧作家是怎么写出来那么多字数的了！最后推荐一篇：&lt;a class="reference external" href="https://gumble.pw/2011/homework-amount/"&gt;最合适的作业量&lt;/a&gt;（本站之前的文章）&lt;/p&gt;
&lt;/div&gt;
</content><category term="文字作品"></category><category term="作业"></category></entry><entry><title>初中数学复习卡片</title><link href="/maths-revision-cards.html" rel="alternate"></link><published>2012-08-08T10:26:00+08:00</published><updated>2012-08-08T10:26:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-08-08:/maths-revision-cards.html</id><content type="html">&lt;p&gt;发一套1983年出版的（上海）初中数学复习卡片的PDF版。这套卡片原来是我爸买的，之前我在家中发现，觉得很有实用价值。放假无事便将其制作为PDF版本，以便随时翻阅，&lt;a class="reference external" href="/static/mathscard.pdf"&gt;点此下载&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2012/07/allcards.jpg"&gt;&lt;img alt="初中数学复习卡片" src="/static/2012/07/allcards-166x300.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;因为我是第一次制作这种PDF文件，且条件有限，只能用照相机拍摄，经后期处理而成，所以难免有些图片有变形等问题，请见谅。然后来一句不得不说的套话：本资料仅供学习研究，请勿用于商业用途。&lt;/p&gt;
&lt;blockquote&gt;
这套卡片图示明晰，力求以图表的形式将重要的概念、原理、公式、法则、数据、几何图形间的相互关系及一些解题的主要规律串点成线，织成一张“知识结构网”，既便于査阅，乂容易记忆，适宜初中程度学生复习参考。&lt;/blockquote&gt;
&lt;p&gt;可以看到，很多现在初中教材没有收录的内容都收录其中。放假时可以自学一下。另外，最后还附了两张试卷，有兴趣的可以自己看看得了几分。&lt;/p&gt;
</content><category term="图像作品"></category><category term="PDF"></category><category term="数学"></category></entry><entry><title>致群发者</title><link href="/to-group-senders.html" rel="alternate"></link><published>2012-06-29T13:11:00+08:00</published><updated>2012-06-29T13:11:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2012-06-29:/to-group-senders.html</id><summary type="html">&lt;p&gt;最近又收到一份转发信，收件人栏比以前还要长。这次内容是关于朋友的，标题为“转发：回复：转发：希望你会寄回给我O(∩_∩)O
(I am alone, but not lonely, just for
you.)”。我遂给发给我同样的这封信的三个人、信中我认识的一个发件人和可能的始作俑者回了如下一封信。&lt;/p&gt;
&lt;p&gt;致群发者：&lt;/p&gt;
&lt;p&gt;好了啦，你们不要再给我发“收件人炸弹”啦！！！&lt;/p&gt;
&lt;p&gt;但还是谢谢你们的来信为我沉寂的邮箱增加了点收信的期待。不过，数数我写了几个“（略）”就知道我有多辛苦了，数数源代码中有几个“&amp;lt;div&amp;gt;”就知道服务器和浏览器们有多辛苦了，看看滚动条柄有多短就知道读者们有多辛苦了。这种行为一点都不节能环保，违背绿色低碳的理念啊。&lt;/p&gt;
&lt;p&gt;另外，大量邮件地址可能会被垃圾邮件发送者使用，制造更多垃圾邮件；或者会有另外的用途。（我也利用过这些收件人地址一次，没干坏事）&lt;/p&gt;
&lt;p&gt;希望各位在“友情”转发的同时先仔细阅读正文，判断是否值得转发，并删掉收件人栏，谢谢。我不知道是否寄回给了原发件人 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;最近又收到一份转发信，收件人栏比以前还要长。这次内容是关于朋友的，标题为“转发：回复：转发：希望你会寄回给我O(∩_∩)O
(I am alone, but not lonely, just for
you.)”。我遂给发给我同样的这封信的三个人、信中我认识的一个发件人和可能的始作俑者回了如下一封信。&lt;/p&gt;
&lt;p&gt;致群发者：&lt;/p&gt;
&lt;p&gt;好了啦，你们不要再给我发“收件人炸弹”啦！！！&lt;/p&gt;
&lt;p&gt;但还是谢谢你们的来信为我沉寂的邮箱增加了点收信的期待。不过，数数我写了几个“（略）”就知道我有多辛苦了，数数源代码中有几个“&amp;lt;div&amp;gt;”就知道服务器和浏览器们有多辛苦了，看看滚动条柄有多短就知道读者们有多辛苦了。这种行为一点都不节能环保，违背绿色低碳的理念啊。&lt;/p&gt;
&lt;p&gt;另外，大量邮件地址可能会被垃圾邮件发送者使用，制造更多垃圾邮件；或者会有另外的用途。（我也利用过这些收件人地址一次，没干坏事）&lt;/p&gt;
&lt;p&gt;希望各位在“友情”转发的同时先仔细阅读正文，判断是否值得转发，并删掉收件人栏，谢谢。我不知道是否寄回给了原发件人。&lt;/p&gt;
&lt;p&gt;至于这封信是否转发，那就随你们啦，转发前请再看上文一遍。&lt;/p&gt;
&lt;p&gt;此致&lt;/p&gt;
&lt;p&gt;敬礼 （为转发精神敬礼）&lt;/p&gt;
&lt;p&gt;Gumble&lt;/p&gt;
&lt;p&gt;2012年6月29日&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;附注&lt;/h2&gt;
&lt;p&gt;由于没有将原信转贴，可能还有必要说明一下。“（略）”是我回复他们时把收件人地址替换掉了（真的很累啊），“&lt;tt class="docutils literal"&gt;&amp;lt;div&amp;gt;&lt;/tt&gt;”是由于邮箱们好像很喜欢用“&lt;tt class="docutils literal"&gt;&amp;lt;div&amp;gt;&lt;/tt&gt;”代替“&lt;tt class="docutils literal"&gt;&amp;lt;p&amp;gt;&lt;/tt&gt;”来换行。收件人地址多了，这些标签自然就多了。滚动条柄长也就算了，问题是我看邮件时有双重滚动条，这就更加令人讨厌了。我说的这封信“&lt;tt class="docutils literal"&gt;&amp;lt;div&amp;gt;&lt;/tt&gt;”多得好像都引起了浏览器的解析问题，可能是由于HTML标签错乱造成，收件人地址还没完，原信就冲上来了，把它们压在下面。至于“另外的用途”，应该还有社会工程学分析，或了解人脉，或寻找信的来源，或得知某人的邮箱地址/QQ号（因为有些是真实姓名，如果是熟人当然还知道常用昵称）等。我说过我以前利用过这些地址就是最后一个用途。白白赠送了这么多邮件地址，而且爱干嘛干嘛，当然会引发好事者们各显神通了。我转发这篇文章就是为了说明这个问题，引起重视，引不起也没有办法。现在提倡举手之劳做环保，这个举手之劳也同时保护了大家的安全隐私。&lt;/p&gt;
&lt;/div&gt;
</content><category term="时事评论"></category><category term="Email"></category></entry><entry><title>选择题各选项的概率</title><link href="/multi-choice.html" rel="alternate"></link><published>2011-06-19T15:51:00+08:00</published><updated>2011-06-19T15:51:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-06-19:/multi-choice.html</id><summary type="html">&lt;p&gt;题目是人出的，当然选择题（四个选项的单项选择题，下同）也一样。所以选择题各选项出现的几率有多有少不足为奇。问题是多少呢？我早就统计在本子上，但因为不方便以及种种原因，停止了。后来我又开始了这个项目，用电脑辅助计算。用什么软件呢？计算器+记事本？Excel？好像都不方便。所以我为此开发了一个小小的软件辅助计算，版本 1.1.21。&lt;/p&gt;
&lt;p&gt;用电脑统计选择题各选项出现的几率的项目开始的准确时间为2011年1月27日,
11:20:18（数据文件的创建时间）。经过很长时间，我不分科目，从卷子、教辅书等地收集答案并输入进电脑，已经有5065个答案的数据了。结果如下：&lt;/p&gt;
&lt;p&gt;截止至2012年8月21日，&lt;/p&gt;
&lt;p&gt;在5065个选择题中：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
A出现的频率为：22.15%，
B出现的频率为：27.78%，
C出现的频率为：26.83%，
D出现的频率为：23.24%。
&lt;/pre&gt;
&lt;p&gt;所以不会做全部写B或C也好歹有个27分……&lt;/p&gt;
&lt;p&gt;另外发布用来统计的工具（数据文件不发 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;题目是人出的，当然选择题（四个选项的单项选择题，下同）也一样。所以选择题各选项出现的几率有多有少不足为奇。问题是多少呢？我早就统计在本子上，但因为不方便以及种种原因，停止了。后来我又开始了这个项目，用电脑辅助计算。用什么软件呢？计算器+记事本？Excel？好像都不方便。所以我为此开发了一个小小的软件辅助计算，版本 1.1.21。&lt;/p&gt;
&lt;p&gt;用电脑统计选择题各选项出现的几率的项目开始的准确时间为2011年1月27日,
11:20:18（数据文件的创建时间）。经过很长时间，我不分科目，从卷子、教辅书等地收集答案并输入进电脑，已经有5065个答案的数据了。结果如下：&lt;/p&gt;
&lt;p&gt;截止至2012年8月21日，&lt;/p&gt;
&lt;p&gt;在5065个选择题中：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
A出现的频率为：22.15%，
B出现的频率为：27.78%，
C出现的频率为：26.83%，
D出现的频率为：23.24%。
&lt;/pre&gt;
&lt;p&gt;所以不会做全部写B或C也好歹有个27分……&lt;/p&gt;
&lt;p&gt;另外发布用来统计的工具（数据文件不发，以防止重复统计），点此&lt;a class="reference external" href="/static/2011/06/MultiChoice.zip"&gt;下载&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;用法很简单，在框中输入abcd或ABCD或1234即可，超过文本框长度的内容会自动添加入数据文件。文本框是用来干吗的？输入及修改输入错误的内容用的。注意这里“清除”按钮是指清除文本框内容，并不是所有数据，请放心。双击结果可复制像上面那样的格式的结果，双击“作者”一栏可复制“结果”框中一模一样的内容。&lt;/p&gt;
&lt;p&gt;附上校验信息：&lt;/p&gt;
&lt;pre class="literal-block"&gt;
文件: MultiChoice.exe
大小: 73728 字节
文件版本: 1.01.0021
修改时间: 2012年2月11日, 23:42:02
MD5: 116936E1B1B718BE446E71852B0EF449
SHA1: C6F250F3E452288CAE2303A1ADCA0F91AED4335C
CRC32: 285D193C
&lt;/pre&gt;
</content><category term="校园日志"></category><category term="统计"></category><category term="软件"></category></entry><entry><title>最合适的作业量</title><link href="/homework-amount.html" rel="alternate"></link><published>2011-06-19T15:03:00+08:00</published><updated>2011-06-19T15:03:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-06-19:/homework-amount.html</id><summary type="html">&lt;p&gt;对于一个正常的全面发展的三好学生来说，一个小时四十五分钟的作业量是最合适的。普及一下，“三好学生”的标准是：思想品德好、学习好、身体好（&lt;a class="reference external" href="http://zh.wikipedia.org/wiki/%E4%B8%89%E5%A5%BD%E5%AD%A6%E7%94%9F"&gt;维基百科&lt;/a&gt;的定义）。证明如下：&lt;/p&gt;
&lt;p&gt;假设他有效可利用的星期一到星期四晚上的时间为下午6:00～次日早上6:00，共12个小时。除做作业外时间划分如下（“晚餐”部分算入“进食”）（顺序不分先后）：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;正常生理需求——9小时：&lt;ul&gt;
&lt;li&gt;睡眠——8小时&lt;/li&gt;
&lt;li&gt;进食及排泄——15分钟&lt;/li&gt;
&lt;li&gt;休息——15分钟&lt;/li&gt;
&lt;li&gt;个人卫生（如刷牙、洗澡等）——30分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;读书、背书、预习、复习——20分钟&lt;/li&gt;
&lt;li&gt;体育锻炼（如跳绳）——10分钟&lt;/li&gt;
&lt;li&gt;兴趣爱好（如读书、电脑游戏）——30分钟&lt;/li&gt;
&lt;li&gt;帮助家务劳动——10分钟&lt;/li&gt;
&lt;li&gt;处理杂务及突发事件——5分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总计10个小时零15分钟 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;对于一个正常的全面发展的三好学生来说，一个小时四十五分钟的作业量是最合适的。普及一下，“三好学生”的标准是：思想品德好、学习好、身体好（&lt;a class="reference external" href="http://zh.wikipedia.org/wiki/%E4%B8%89%E5%A5%BD%E5%AD%A6%E7%94%9F"&gt;维基百科&lt;/a&gt;的定义）。证明如下：&lt;/p&gt;
&lt;p&gt;假设他有效可利用的星期一到星期四晚上的时间为下午6:00～次日早上6:00，共12个小时。除做作业外时间划分如下（“晚餐”部分算入“进食”）（顺序不分先后）：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;正常生理需求——9小时：&lt;ul&gt;
&lt;li&gt;睡眠——8小时&lt;/li&gt;
&lt;li&gt;进食及排泄——15分钟&lt;/li&gt;
&lt;li&gt;休息——15分钟&lt;/li&gt;
&lt;li&gt;个人卫生（如刷牙、洗澡等）——30分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;读书、背书、预习、复习——20分钟&lt;/li&gt;
&lt;li&gt;体育锻炼（如跳绳）——10分钟&lt;/li&gt;
&lt;li&gt;兴趣爱好（如读书、电脑游戏）——30分钟&lt;/li&gt;
&lt;li&gt;帮助家务劳动——10分钟&lt;/li&gt;
&lt;li&gt;处理杂务及突发事件——5分钟&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总计10个小时零15分钟。12小时-10小时15分钟=1小时45分钟。&lt;/p&gt;
&lt;p&gt;所以如果要保证我们思想品德好、学习好、身体好，既全面发展又身心健康，老师们只能布置只需要做约一个小时四十五分钟的作业量。&lt;/p&gt;
&lt;p&gt;从另一个角度来说，老师能全部批改完和/或讲评完的也即是对学生的最合适的作业量。这就是“己所不欲，勿施于人”的道理。过多作业不仅会损害学生们的身心健康，而且还可能会对成绩造成不良影响（做得太晚上课睡觉）。这篇文章对老师们其实是一个提醒，布置适量作业，给双方都减轻了负担，何乐而不为呢？&lt;/p&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;更现实一点&lt;/h2&gt;
&lt;p&gt;“理想很丰满，现实很骨感。”没错，以上规定对于学校老师来说基本全是扯淡。然后我又想出了一个更现实一点的版本（寄宿制学校，其他可参考）。这是我最近给学校提案中的一条。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;在不利用课间、午间、生活时间等时间的情况下，大部分学生能在熄灯时间前完成所有笔头&lt;/strong&gt;（及口头）&lt;strong&gt;作业。&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;括号之内是按实际情况选择的内容，毕竟要求太苛刻了学校也是听不进去的。关于这个版本，我觉得应该是既保证了休息、交流、吃饭、洗衣等的时间，又保证了校方的升学率观点。这个版本校方是很难反驳的，毕竟作业太多会导致不做、粗制滥造或休息时间不足而学习效率下降。其他理由这里不多说，读者如果需要，当然应该是自己能想出一大堆的。&lt;/p&gt;
&lt;p&gt;合适的作业量问题我从2011年6月提出到现在，已经算有了一个较好的结论。不仅有文字描述，还有之后发表的&lt;a class="reference external" href="https://gumble.pw/2012/amount-of-ink/"&gt;文章&lt;/a&gt;中作业量的比较方法。理论方面已经够齐全了，如果行动能跟上，我也不用在这里废话了。毕竟只是大喊减负口号一点也没有用。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;后记&lt;/h2&gt;
&lt;p&gt;“Nearly half of Chinese students spend more than two hours on their
homework every
day.”（几乎一半中国学生每天做作业超过两小时。）我今天做的英语卷子的文章这么说。我们中国学生压力大是事实，急需改革。据《中华人民共和国未成年人保护法》第二十条：&lt;/p&gt;
&lt;blockquote&gt;
学校应当与未成年学生的父母或者其他监护人互相配合，保证未成年学生的睡眠、娱乐和体育锻炼时间，不得加重其学习负担。&lt;/blockquote&gt;
&lt;p&gt;所以那些口号与实际行动不符的学校们基本上都是违法的。而《中华人民共和国未成年人保护法》第四十九条又写：&lt;/p&gt;
&lt;blockquote&gt;
未成年人的合法权益受到侵害的，被侵害人及其监护人或者其他组织和个人有权向有关部门投诉，有关部门应当依法及时处理。&lt;/blockquote&gt;
&lt;p&gt;真是投诉无门，“有关部门”难找啊！学生拼命做作业，老师有时则不批改，学生们无可奈何。适合每个人的作业量其实是不同的，适合每个老师的作业量也是不同的。教育改革不仅是口号，更应该从作业量抓起，还学生们一个充实的课余生活。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id4"&gt;
&lt;h2&gt;附录&lt;/h2&gt;
&lt;div class="section" id="id5"&gt;
&lt;h3&gt;《中华人民共和国未成年人保护法》&lt;/h3&gt;
&lt;div class="section" id="id6"&gt;
&lt;h4&gt;第三章　学校保护（节选）&lt;/h4&gt;
&lt;p&gt;&lt;strong&gt;第十七条&lt;/strong&gt;
学校应当全面贯彻国家的教育方针，实施素质教育，提高教育质量，注重培养未成年学生独立思考能力、创新能力和实践能力，促进未成年学生全面发展。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第十八条&lt;/strong&gt;
学校应当尊重未成年学生受教育的权利，关心、爱护学生，对品行有缺点、学习有困难的学生，应当耐心教育、帮助，不得歧视，不得违反法律和国家规定开除未成年学生。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第十九条&lt;/strong&gt;
学校应当根据未成年学生身心发展的特点，对他们进行社会生活指导、心理健康辅导和青春期教育。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二十条&lt;/strong&gt;
学校应当与未成年学生的父母或者其他监护人互相配合，保证未成年学生的睡眠、娱乐和体育锻炼时间，不得加重其学习负担。&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;第二十一条&lt;/strong&gt;
学校、幼儿园、托儿所的教职员工应当尊重未成年人的人格尊严，不得对未成年人实施体罚、变相体罚或者其他侮辱人格尊严的行为。&lt;/p&gt;
&lt;p&gt;《&lt;a class="reference external" href="http://www.shanghai.gov.cn/shanghai/node2314/node2319/node12344/userobject26ai12861.html"&gt;（上海）市教委关于认真执行本市中小学作息制度的通知&lt;/a&gt;》&lt;/p&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
</content><category term="研究报告"></category><category term="作业"></category></entry><entry><title>2的128次方</title><link href="/2x128times.html" rel="alternate"></link><published>2011-06-19T10:52:00+08:00</published><updated>2011-06-19T10:52:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-06-19:/2x128times.html</id><content type="html">&lt;p&gt;2的128次方，我在下课及中午时算的，其实比&lt;a class="reference external" href="/biography-of-chaogu.html"&gt;《巢谷传》&lt;/a&gt;来得早，只是晚一些发布而已。&lt;/p&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;因为2&lt;sup&gt;128&lt;/sup&gt;=2&lt;sup&gt;64+64&lt;/sup&gt;=2&lt;sup&gt;64&lt;/sup&gt;×2&lt;sup&gt;64&lt;/sup&gt;，2&lt;sup&gt;64&lt;/sup&gt;=18446744073709551616，&lt;/div&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;所以2&lt;sup&gt;128&lt;/sup&gt;=18446744073709551616×18446744073709551616。&lt;/div&gt;
&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;我正是根据这个来算的。我在初一时就已和一个同学在计算器帮助下算出了2的64次方，并很快就背出来了。这次也是一样，只是我自己一个人用计算器帮忙排竖式计算。（计算器不能精确到个位，因为精度不够。）你可以看到很多竖线，这是因为需要对齐。如下图所示：&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/06/2^128.jpg"&gt;&lt;img alt="2的128次方" src="/static/2011/06/2^128-300x222.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;正确结论应是：2&lt;sup&gt;128&lt;/sup&gt;=34028236&lt;strong&gt;6920&lt;/strong&gt;938463463374607431768211456。&lt;/p&gt;
&lt;p&gt;虽然差了4位，但精度也不错了。&lt;/p&gt;
</content><category term="校园日志"></category><category term="草稿纸"></category></entry><entry><title>请读《使用百度前必读》</title><link href="/read-before-using-baidu.html" rel="alternate"></link><published>2011-06-05T14:35:00+08:00</published><updated>2011-06-05T14:35:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-06-05:/read-before-using-baidu.html</id><summary type="html">&lt;p&gt;续&lt;a class="reference external" href="https://gumble.pw/blog/qzone-agreement/"&gt;对《QQ空间服务条款》的研究&lt;/a&gt;，我继续来帮忙解释百度的条款。&lt;/p&gt;
&lt;p&gt;度娘的页面底部有个《&lt;a class="reference external" href="http://www.baidu.com/duty/index.html"&gt;使用百度前必读&lt;/a&gt;》，不知道有多少人有兴趣去读它。百度真是把免责做到家了，搞得“无懈可击”。&lt;/p&gt;
&lt;blockquote&gt;
百度提醒您：在使用百度搜索引擎（以下简称百度）前，请您&lt;strong&gt;务必仔细阅读&lt;/strong&gt;并透彻理解本声明。您可以选择不使用百度，但如果您使用百度，您的使用行为将被视为&lt;strong&gt;对本声明全部内容的认可&lt;/strong&gt;。&lt;/blockquote&gt;
&lt;p&gt;使用个搜索引擎都要读条款，真是……&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;鉴于百度以&lt;strong&gt;非人工检索方式&lt;/strong&gt;、根据您键入的关键字自动生成到第三方网页的链接，除百度注明之服务条款外，其他一切因使用百度而可能遭致的意外、疏忽、侵权及其造成的损失（包括因下载被搜索链接到的第三方网站内容而感染电脑病毒），百度对其&lt;strong&gt;概不负责&lt;/strong&gt;，亦不承担任何法律责任。&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;p&gt;百度搜索结果根据您键入的关键字&lt;strong&gt;自动搜索获得并生成&lt;/strong&gt;，不代表百度赞成被搜索链接到的第三方网页上的内容或立场。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;竞价排名怎么解释？&lt;/p&gt;
&lt;p&gt;下面是《&lt;a class="reference external" href="http://www.baidu.com/duty/yinsiquan.html"&gt;百度隐私权保护声明&lt;/a&gt;》节选：&lt;/p&gt;
&lt;blockquote&gt;
在如下情况下，百度会遵照您的意愿或法律的规定披露您的个人信息，由此引发的问题将由您个人承担：
（1）事先获得您的授权；
（2）&lt;strong&gt;只有透露你的个人资料，才能提供你所要求的产品和服务 …&lt;/strong&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;续&lt;a class="reference external" href="https://gumble.pw/blog/qzone-agreement/"&gt;对《QQ空间服务条款》的研究&lt;/a&gt;，我继续来帮忙解释百度的条款。&lt;/p&gt;
&lt;p&gt;度娘的页面底部有个《&lt;a class="reference external" href="http://www.baidu.com/duty/index.html"&gt;使用百度前必读&lt;/a&gt;》，不知道有多少人有兴趣去读它。百度真是把免责做到家了，搞得“无懈可击”。&lt;/p&gt;
&lt;blockquote&gt;
百度提醒您：在使用百度搜索引擎（以下简称百度）前，请您&lt;strong&gt;务必仔细阅读&lt;/strong&gt;并透彻理解本声明。您可以选择不使用百度，但如果您使用百度，您的使用行为将被视为&lt;strong&gt;对本声明全部内容的认可&lt;/strong&gt;。&lt;/blockquote&gt;
&lt;p&gt;使用个搜索引擎都要读条款，真是……&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;鉴于百度以&lt;strong&gt;非人工检索方式&lt;/strong&gt;、根据您键入的关键字自动生成到第三方网页的链接，除百度注明之服务条款外，其他一切因使用百度而可能遭致的意外、疏忽、侵权及其造成的损失（包括因下载被搜索链接到的第三方网站内容而感染电脑病毒），百度对其&lt;strong&gt;概不负责&lt;/strong&gt;，亦不承担任何法律责任。&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;p&gt;百度搜索结果根据您键入的关键字&lt;strong&gt;自动搜索获得并生成&lt;/strong&gt;，不代表百度赞成被搜索链接到的第三方网页上的内容或立场。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;竞价排名怎么解释？&lt;/p&gt;
&lt;p&gt;下面是《&lt;a class="reference external" href="http://www.baidu.com/duty/yinsiquan.html"&gt;百度隐私权保护声明&lt;/a&gt;》节选：&lt;/p&gt;
&lt;blockquote&gt;
在如下情况下，百度会遵照您的意愿或法律的规定披露您的个人信息，由此引发的问题将由您个人承担：
（1）事先获得您的授权；
（2）&lt;strong&gt;只有透露你的个人资料，才能提供你所要求的产品和服务&lt;/strong&gt;；
（3）根据&lt;strong&gt;有关&lt;/strong&gt;的&lt;strong&gt;法律&lt;/strong&gt;法规要求；
（4）按照&lt;strong&gt;相关&lt;/strong&gt;政府主管&lt;strong&gt;部门&lt;/strong&gt;的要求；
（5）为维护百度的&lt;strong&gt;合法权益&lt;/strong&gt;。
（6）您同意让第三方共享资料。
（7）我们发现您&lt;strong&gt;违反&lt;/strong&gt;了百度公司服务条款或任何其他产品服务的使用规定。
（8）我们需要向代表我们提供产品或服务的公司提供资料（除非我们&lt;strong&gt;另行通知&lt;/strong&gt;你，否则这些公司无权使用你的身份识别资料）。&lt;/blockquote&gt;
&lt;p&gt;第二条让人没话说，有关法律、相关部门的威力甚大，从来不看服务条款的人很受伤。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;隐私权政策的修订：&lt;/p&gt;
&lt;p&gt;百度公司时常会对隐私权政策进行修改。如果在使用用户个人信息政策方面有修改时，我们会在网页中&lt;strong&gt;显著的位置&lt;/strong&gt;发布相关规定以便及时通知用户。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;没看见过，难道是在2月30日，或者是3月32日？&lt;/p&gt;
&lt;p&gt;至于其他的，自己研究，一直靠别人创建和谐社会是不行的。&lt;/p&gt;
</content><category term="研究报告"></category><category term="服务条款"></category><category term="百度"></category></entry><entry><title>蚂蚁字</title><link href="/mini-characters.html" rel="alternate"></link><published>2011-06-05T14:15:00+08:00</published><updated>2011-06-05T14:15:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-06-05:/mini-characters.html</id><summary type="html">&lt;p&gt;为了应付《精练与博览》这种题目之间空档很小的教辅书，经过一年多的训练，我写小字的功夫有很大提升。因为这种字体可以比一只蚂蚁还要小，所以称之为“蚂蚁字”。&lt;/p&gt;
&lt;p&gt;写蚂蚁字的目的&lt;strong&gt;不是为了给人看&lt;/strong&gt;，而是在&lt;strong&gt;小空间内写下很多字&lt;/strong&gt;，（看的人）这一点要清楚。当然让人看得清楚也是必要的。所以写蚂蚁字的&lt;strong&gt;基本要求&lt;/strong&gt;是：&lt;strong&gt;在放大镜下能看清楚&lt;/strong&gt;，而不是黑团。&lt;/p&gt;
&lt;p&gt;写蚂蚁字也是有方法的：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;空间不能太小。想要在高4厘米的空间内不分栏写35行普通笔是无论如何也办不到的。其实在容纳得下正常字体的情况下写蚂蚁字是完全没有必要的。&lt;/li&gt;
&lt;li&gt;笔出墨不能太多。即使是0.5mm的笔照样可以写出高度不到3mm的中文字。用过一些的新笔芯是很好的选择。其实更加细的笔芯有时候反倒不如0.5mm的。&lt;/li&gt;
&lt;li&gt;字不能太差。最好不要用行楷、草书等，否则会占用太多空间。字宽、字高最好一致，有利于行列的对齐和缩小空间占用。&lt;/li&gt;
&lt;li&gt;用力不能太实。就是说，不要用力把笔压在纸上，否则线条就可能很粗。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;蚂蚁字有很多好处，例如能在小空间内写下很多字，使卷面整洁，字迹工整，保持队形，一目了然；还能起到练字的效果（有人照做结果成功了）。另外它可以防止从远处偷窥 …&lt;/p&gt;</summary><content type="html">&lt;p&gt;为了应付《精练与博览》这种题目之间空档很小的教辅书，经过一年多的训练，我写小字的功夫有很大提升。因为这种字体可以比一只蚂蚁还要小，所以称之为“蚂蚁字”。&lt;/p&gt;
&lt;p&gt;写蚂蚁字的目的&lt;strong&gt;不是为了给人看&lt;/strong&gt;，而是在&lt;strong&gt;小空间内写下很多字&lt;/strong&gt;，（看的人）这一点要清楚。当然让人看得清楚也是必要的。所以写蚂蚁字的&lt;strong&gt;基本要求&lt;/strong&gt;是：&lt;strong&gt;在放大镜下能看清楚&lt;/strong&gt;，而不是黑团。&lt;/p&gt;
&lt;p&gt;写蚂蚁字也是有方法的：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;空间不能太小。想要在高4厘米的空间内不分栏写35行普通笔是无论如何也办不到的。其实在容纳得下正常字体的情况下写蚂蚁字是完全没有必要的。&lt;/li&gt;
&lt;li&gt;笔出墨不能太多。即使是0.5mm的笔照样可以写出高度不到3mm的中文字。用过一些的新笔芯是很好的选择。其实更加细的笔芯有时候反倒不如0.5mm的。&lt;/li&gt;
&lt;li&gt;字不能太差。最好不要用行楷、草书等，否则会占用太多空间。字宽、字高最好一致，有利于行列的对齐和缩小空间占用。&lt;/li&gt;
&lt;li&gt;用力不能太实。就是说，不要用力把笔压在纸上，否则线条就可能很粗。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;蚂蚁字有很多好处，例如能在小空间内写下很多字，使卷面整洁，字迹工整，保持队形，一目了然；还能起到练字的效果（有人照做结果成功了）。另外它可以防止从远处偷窥、手机拍照、复印等，还能防止视力差或耐心不好的人的抄袭，所以蚂蚁字也是一种很好的防抄袭的手段。因为字很小，涂改也很方便。&lt;/p&gt;
&lt;p&gt;但是！在使用蚂蚁字之前，请注意以下几点：&lt;/p&gt;
&lt;ul class="simple"&gt;
&lt;li&gt;必须明白它的用途&lt;/li&gt;
&lt;li&gt;必须有很大的耐心&lt;/li&gt;
&lt;li&gt;必须做好花费大量时间的准备&lt;/li&gt;
&lt;li&gt;要有适量的空间：太大就会浪费时间和精力，太小硬撑也是没有意义的&lt;/li&gt;
&lt;li&gt;要有适当的笔芯&lt;/li&gt;
&lt;li&gt;最好经过长期锻炼&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;总结一下，适当使用会带来好处，而滥用很可能造成不可恢复的后果。&lt;/p&gt;
&lt;p&gt;（按理说本来应该附图的，但是因为没时间拍照，所以等有机会再补上，对此深感抱歉。）&lt;/p&gt;
</content><category term="校园日志"></category><category term="中文"></category><category term="水笔"></category></entry><entry><title>腾讯又窥探隐私？</title><link href="/tencent-visit-user-links.html" rel="alternate"></link><published>2011-05-05T21:28:00+08:00</published><updated>2011-05-05T21:28:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-05-05:/tencent-visit-user-links.html</id><summary type="html">&lt;p&gt;前几个星期在QQ群上发了一个（连接到）我家电脑的的网址。今天翻看了一下日志，结果发现&lt;strong&gt;每天&lt;/strong&gt;都有来自“&lt;strong&gt;广东省深圳市电信&lt;/strong&gt;”的IP地址访问记录。“/fs/cc4w/材料.doc”是我发布的网址中的文件，大小77824字节。请看日志节选：&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;#Software: Microsoft Internet Information Services 5.1&lt;/div&gt;
&lt;div class="line"&gt;#Version: 1.0&lt;/div&gt;
&lt;div class="line"&gt;#Date: 2011-04-02 00:27:09&lt;/div&gt;
&lt;div class="line"&gt;#Fields: date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-bytes cs(Referer)&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 00:27:09 119.147.6 …&lt;/div&gt;&lt;/div&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;前几个星期在QQ群上发了一个（连接到）我家电脑的的网址。今天翻看了一下日志，结果发现&lt;strong&gt;每天&lt;/strong&gt;都有来自“&lt;strong&gt;广东省深圳市电信&lt;/strong&gt;”的IP地址访问记录。“/fs/cc4w/材料.doc”是我发布的网址中的文件，大小77824字节。请看日志节选：&lt;/p&gt;
&lt;blockquote&gt;
&lt;div class="line-block"&gt;
&lt;div class="line"&gt;#Software: Microsoft Internet Information Services 5.1&lt;/div&gt;
&lt;div class="line"&gt;#Version: 1.0&lt;/div&gt;
&lt;div class="line"&gt;#Date: 2011-04-02 00:27:09&lt;/div&gt;
&lt;div class="line"&gt;#Fields: date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-bytes cs(Referer)&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 00:27:09 119.147.6.209 - GET /fs/cc4w/ 302 310 173 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 00:27:09 119.147.6.209 - GET /fs/cc4w/ 200 2733 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 01:19:09 119.147.14.6 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 01:25:03 58.60.12.59 - GET /fs/cc4w/ 302 310 173 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 01:36:05 58.60.12.165 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 02:22:59 119.147.6.94 - GET /fs/clone 404 3943 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 02:41:20 119.147.6.209 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;#Software: Microsoft Internet Information Services 5.1&lt;/div&gt;
&lt;div class="line"&gt;#Version: 1.0&lt;/div&gt;
&lt;div class="line"&gt;#Date: 2011-04-02 12:38:06&lt;/div&gt;
&lt;div class="line"&gt;#Fields: date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-bytes cs(Referer)&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 12:38:06 183.62.126.7 - GET /fs/cc4w/ 302 310 173 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 13:19:56 119.147.14.68 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 13:26:46 58.60.12.166 - GET /fs/cc4w/ 302 310 173 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 13:26:46 58.60.12.166 - GET /fs/cc4w/ 200 2733 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 13:42:25 113.142.9.126 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 14:23:01 121.14.95.213 - GET /fs/clone 404 3943 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-02 14:43:31 125.39.52.166 - GET /fs/cc4w/材料.doc 200 65536 196 -&lt;/div&gt;
&lt;div class="line"&gt;#Software: Microsoft Internet Information Services 5.1&lt;/div&gt;
&lt;div class="line"&gt;#Version: 1.0&lt;/div&gt;
&lt;div class="line"&gt;#Date: 2011-04-03 01:21:15&lt;/div&gt;
&lt;div class="line"&gt;#Fields: date time c-ip cs-username cs-method cs-uri-stem sc-status sc-bytes cs-bytes cs(Referer)&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 01:21:15 113.142.9.124 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 01:28:13 124.115.10.252 - GET /fs/cc4w/ 302 310 173 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 01:28:13 124.115.10.252 - GET /fs/cc4w/ 200 2733 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 01:43:04 112.95.240.189 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 02:43:32 58.60.12.93 - GET /fs/clone 404 3943 174 -&lt;/div&gt;
&lt;div class="line"&gt;2011-04-03 02:49:21 121.14.95.213 - GET /fs/cc4w/材料.doc 200 78102 196 -&lt;/div&gt;
&lt;/div&gt;
&lt;/blockquote&gt;
&lt;p&gt;看上去这些服务器获得了&lt;strong&gt;整个文件&lt;/strong&gt;。&lt;/p&gt;
&lt;p&gt;发现的IP地址有：&lt;/p&gt;
&lt;blockquote&gt;
119.147.14.68
119.147.6.209
119.147.14.6
58.60.12.*
113.142.9.*
121.14.95.213
125.39.52.166
124.115.10.252
58.251.150.81
121.14.95.97
58.251.58.191
119.147.18.178
183.62.126.7
112.95.240.189
121.14.95.213
119.147.14.68
119.147.6.94
124.115.2.120
222.73.75.252
222.73.75.245
222.73.74.235
124.115.2.119
222.202.96.90
119.147.6.207&lt;/blockquote&gt;
&lt;p&gt;【本站已屏蔽上述IP地址（段）】&lt;/p&gt;
&lt;p&gt;放出个文件还钓到了不少“鱼”啊！所以“360隐私保护器”（扣扣保镖）的推出也是可以理解的。以后发网址可要小心点，如果是自己的网站得小心腾讯的巨大客流！发网址（特别是内部或者临时性的）时最好在当中加一些干扰的空格，或者使用截图，防止自动识别，如“&lt;a class="reference external" href="https://zh.wikipedia.org/zh-cn/Wikipedia:%E9%A6%96%E9%A1%B5"&gt;h
t t p s : / /
zh.wikipedia.org/zh-cn/Wikipedia:%E9%A6%96%E9%A1%B5&lt;/a&gt;”（维基百科，自由的百科全书）&lt;/p&gt;
&lt;p&gt;同时，我们要质疑腾讯这样做的目的。检查安全性？未必，因为只需一两次检查即可。收录到搜索引擎？我robots.txt已经屏蔽所有的搜索引擎了。那么只好说它是&lt;strong&gt;窃取用户隐私&lt;/strong&gt;。&lt;/p&gt;
</content><category term="电脑技术"></category><category term="QQ"></category><category term="腾讯"></category></entry><entry><title>生命科学线描图</title><link href="/picture-drawed-by-pen.html" rel="alternate"></link><published>2011-04-27T19:33:00+08:00</published><updated>2011-04-27T19:33:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-27:/picture-drawed-by-pen.html</id><content type="html">&lt;p&gt;生命科学绘图比赛，要我们拿8开的纸画书上的图。我为了展示它的简单程度，于是在（各一节）生命科学课上花5分钟画了如下两图——&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/leaf_draw.jpg"&gt;&lt;img alt="临摹《叶的光合作用和蒸腾作用》" src="/static/2011/04/leaf_draw-300x233.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/leaf_book.jpg"&gt;&lt;img alt="《叶的光合作用和蒸腾作用》" src="/static/2011/04/leaf_book-300x226.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;上图在传看过程中不幸被老师全班展示。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/flower_draw.jpg"&gt;&lt;img alt="临摹《花的组成》" src="/static/2011/04/flower_draw-232x300.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/flower_book.jpg"&gt;&lt;img alt="《花的组成》" src="/static/2011/04/flower_book-300x259.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
</content><category term="图像作品"></category><category term="水笔"></category><category term="草稿纸"></category></entry><entry><title>Word 2003 语法检查对中文的支持</title><link href="/word-2003-chinese-grammar-check.html" rel="alternate"></link><published>2011-04-24T16:22:00+08:00</published><updated>2011-04-24T16:22:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-24:/word-2003-chinese-grammar-check.html</id><content type="html">&lt;p&gt;不多说，自己看。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/wordgrammartips.png"&gt;&lt;img alt="Word 2003 语法检查对中文的支持" src="/static/2011/04/wordgrammartips.png" /&gt;&lt;/a&gt;&lt;/p&gt;
</content><category term="电脑技术"></category><category term="Microsoft"></category><category term="Word"></category><category term="中文"></category><category term="英文"></category></entry><entry><title>关于本站</title><link href="/about.html" rel="alternate"></link><published>2011-04-24T14:47:00+08:00</published><updated>2011-04-24T14:47:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-24:/about.html</id><content type="html">&lt;p&gt;本站内容作者基本上都是瞎写的。大家随便看看。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/logo.png"&gt;&lt;img alt="GumboGumble Logo" src="/static/2011/04/logo.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/gumblefavicon.png"&gt;&lt;img alt="GumbleFavicon" src="/static/2011/04/gumblefavicon.png" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;网站logo，大图标和小图标&lt;/p&gt;
&lt;p&gt;本网站上除特殊说明，或采用其他授权协议，或属于转载的，其他作品均采用“&lt;a class="reference external" href="http://creativecommons.org/licenses/by-nc-sa/4.0/deed.zh"&gt;知识共享署名-非商业性使用-相同方式共享
4.0 国际&lt;/a&gt;”许可协议进行许可；所有文章中源代码不保留任何权利，释放到公有领域。如转载请注明原网页地址，及文章作者是 Gumble。&lt;/p&gt;
&lt;p&gt;开源项目可前往作者的&lt;a class="reference external" href="https://github.com/gumblex"&gt;Github&lt;/a&gt;。邮件请发 info # gumble . pw。&lt;/p&gt;
</content><category term="关于网站"></category></entry><entry><title>小学电脑课用“画图”画的...</title><link href="/mspaint-drawing.html" rel="alternate"></link><published>2011-04-24T13:12:00+08:00</published><updated>2011-04-24T13:12:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-24:/mspaint-drawing.html</id><content type="html">&lt;p&gt;看起来“画图” MSPAINT 也是很有用的。&lt;/p&gt;
&lt;p&gt;鱼&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/fish.jpg"&gt;&lt;img alt="鱼" src="/static/2011/04/fish-300x199.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;蝌蚪&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="/static/2011/04/tadpole.jpg"&gt;&lt;img alt="蝌蚪" src="/static/2011/04/tadpole-300x194.jpg" /&gt;&lt;/a&gt;&lt;/p&gt;
</content><category term="图像作品"></category><category term="Microsoft"></category><category term="画图"></category></entry><entry><title>《巢谷传》英文翻译</title><link href="/biography-of-chaogu.html" rel="alternate"></link><published>2011-04-24T13:00:00+08:00</published><updated>2011-04-24T13:00:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-24:/biography-of-chaogu.html</id><summary type="html">&lt;p&gt;这次期中考试的复习时间，班头说：“谁要是再吵，罚抄《巢谷传》译文三遍，而且是英文版的！”于是乎，因为我比较闲，也无事可做，就翻译了《巢谷传》。（谁要是不乖，拿了抄去，868个单词^_^）&lt;/p&gt;
&lt;div class="section" id="the-biography-of-chao-gu"&gt;
&lt;h2&gt;The Biography of Chao Gu&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Su Zhe, Translated by Eric&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chao Gu was named Yuanxiu. His father was Chao Zhongshi, a farmer in
Meishan. He was taught by a Shidafu when he was young …&lt;/p&gt;&lt;/div&gt;</summary><content type="html">&lt;p&gt;这次期中考试的复习时间，班头说：“谁要是再吵，罚抄《巢谷传》译文三遍，而且是英文版的！”于是乎，因为我比较闲，也无事可做，就翻译了《巢谷传》。（谁要是不乖，拿了抄去，868个单词^_^）&lt;/p&gt;
&lt;div class="section" id="the-biography-of-chao-gu"&gt;
&lt;h2&gt;The Biography of Chao Gu&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Su Zhe, Translated by Eric&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Chao Gu was named Yuanxiu. His father was Chao Zhongshi, a farmer in
Meishan. He was taught by a Shidafu when he was young, and he taught
students in a school in his village when he was old. Chao Gu learned
with his father when he was young. Although his family was poor, he had
lots of knowledge. He saw a man who could fight very well while he was
taking an examination in the capital, and he liked fighting at once.
Chao Gu was very strong, so he gave up learning. He prepared bows and
arrows, and learned riding horses and shooting. Soon, he succeeded in
studying it, but he failed the writing test.&lt;/p&gt;
&lt;p&gt;It was said that the people in the west was good at fighting, and their
skill of fighting was the best in the country, so he went to Qingfeng
and Jingyuan. He made friends with heroes there. A man called Han Cunbao
was his closest friend. Chao Gu taught him the art of war. They had the
friendship like gold. In the years of Xining, Cunbao, leader of soldiers
in Hezhou succeeded in fighting the enemies. So he was known as ‘the
famous leader of Xihe’. The king paid attention to him a bit. Qidi of
Luzhouman happened to attack the country. Many provinces couldn’t fight
against them, so the king ordered Cunbao to lead the soldiers to attack
them. Cunbao didn’t know about the custom of their country, so he
invited Chao Gu to give him advice in the camp. Later, Cunbao broke the
law. He was going to be caught. He expected that he would die, so he
said to Chao Gu, ‘I’m a fighter in Jingyuan. My death won’t be a pity.
However, my wife and children would have to suffer from hunger and cold,
and they’ll be poor. There is still some money in my pocket. No one but
you can take the money to them for me.’ Chao Go agreed. He changed his
name, and brought the money to Cunbao’s sun on foot. No one knew about
this. After Cunbao died, Chao Gu stayed in Jianghuai until the king
pardoned.&lt;/p&gt;
&lt;p&gt;Chao Gu and I were born in the same village, so we knew each other when
I was young. I know he had great idea, and he was a man who can be
trusted to do different kinds of things. Then I became a leader of the
country, but Chao Gu was in his hometown. We didn’t have a chance to
meet.&lt;/p&gt;
&lt;p&gt;In the first year of Shaoshen, I stayed in Yunzhou because of my fault.
Soon I moved to Leizhou, then to Xunzhou. My elder brother Su Shi also
moved from Huizhou to Changhua. No leaders dared to communicate with us.
We also didn’t hear from our relatives and friends. Only Chao Gu said
publicly that he would visit us on foot. People who heard what he said
all laughed at him and thought he was mad. In the first month of the
second year of Yuanfu, he wrote a letter to me from Meishan and said,’ I
have walked a long way to visit you. I didn’t expect I could have been
alive until today. I am in Meizhou now, and we will meet soon. I won’t
have a pity if I die.’ I was surprised and said, ‘He isn’t a man living
now, but an ancient man!’ After we met, we shook hands with each other
and cried. Then we talked about the stories happened in our lives.
Although we had talked about this for over a month, we weren’t still
tired of it. Chao Gu was 73 years old then. He was thin and had many
sicknesses. He wasn’t that Yuanxiu many years ago. He was going to
Hainan to visit Zizhan. I showed sympathy for him because he was old and
weak, so I wanted to stop him. I said, ‘Although you’re kind, it’s quite
a long way from here to Zizhan’s. In addition, you have to take a ship.
It isn’t what an old man can do.’ He said, ‘I think I won’t die right
now. Don’t stop me!’ I couldn’t stop him. I looked at his bag, and found
only a little money. I happened to be poor, but I still gave him some
money as much as possible. When Chao Gu’s ship arrived in Xinhui, a
foreign servant stole his bag and ran away. He was caught in Xinzhou.
Chao Gu followed him in Xinzhou. Soon he died of disease. When I heard
that, I cried out loudly. I complained that he didn’t take my advice,
but I was surprised that he didn’t take my advice to realize his wish.&lt;/p&gt;
&lt;p&gt;I live in the south with the native people now. I think I will die here.
Although I knew he was kind and helpful, I had no idea about how to
spread his stories. I heard that he had a son named Chao Meng who was in
the army in Jingyuan, so I could only write a biography for him and give
it to his son some day. Chao Gu changed his name into Gu after meeting
me in Xunzhou.&lt;/p&gt;
&lt;div class="figure"&gt;
&lt;a class="reference external image-reference" href="/static/2011/04/IMG_6413.jpg"&gt;&lt;img alt="《巢谷传》英文翻译原稿" src="/static/2011/04/IMG_6413-300x210.jpg" /&gt;&lt;/a&gt;
&lt;p class="caption"&gt;这是原稿。&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;附《巢谷传》原文&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id2"&gt;
&lt;h2&gt;巢谷传&lt;/h2&gt;
&lt;p&gt;&lt;strong&gt;苏辙&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;巢谷，字元修。父中世，眉山农家也，少从士大夫读书，老为里校师。谷幼传父学，虽朴而博。举进士京师，见举武艺者，心好之。谷素多力，遂弃其旧学，畜弓箭，习骑射。久之,业成而不中第。&lt;/p&gt;
&lt;p&gt;闻西边多骁勇，骑射击刺,为四方冠，去游秦凤、泾原间，所至友其秀杰。有韩存宝者，尤与之善。谷教之兵书，二人相与为金石交。熙宁中，存宝为河州将，有功，号熙河名将，朝廷稍奇之。会泸州蛮乞弟扰边，诸郡不能制，乃命存宝出兵讨之。存宝不习蛮事，邀谷至军中问焉。及存宝得罪，将就逮，自料必死，谓谷曰：“我泾原武夫，死非所惜，顾妻子不免寒饿，橐中有银数百两，非君莫使遗之者。”谷许诺，即变姓名，怀银步行往授其子，人无知者。存宝死，谷逃避江淮间，会赦乃出。&lt;/p&gt;
&lt;p&gt;予以乡闾故，故幼而识之，知其志节，缓急可托者也。予之在朝，谷沉浮里中，未尝一见。&lt;/p&gt;
&lt;p&gt;绍圣初，予以罪谪居筠州，自筠徙雷，徙循。予兄子瞻亦自惠再徙昌化，士大夫皆讳与予兄弟游，平生亲友无复相闻者。谷独慨然自眉山诵言，欲徒步访吾兄弟。闻者皆笑其狂。元符二年春正月，自梅州遗予书曰：“我万里步行见公，不自意全，今至梅矣，不旬日必见，死无恨矣。”予惊喜曰：“此非今世人，古之人也。”既见，握手相泣，已而道平生，逾月不厌。时谷年七十有三矣，瘦瘠多病，非复昔日元修也。将复见子瞻于海南，予愍其老且病，止之曰：“君意则善，然自此至儋数千里，复当渡海，非老人事也。”谷曰：“我自视未即死也，公无止我。”留之不可，阅其橐中，无数千钱，予方乏困，亦强资遣之。&lt;/p&gt;
&lt;p&gt;船行至新会，有蛮隶窃其橐装以逃，获于新州，谷从之至新，遂病死。予闻，哭之失声，恨其不用吾言，然亦奇其不用吾言而行其志也。&lt;/p&gt;
&lt;p&gt;予方杂居南夷，与之起居出入，盖将终焉，虽知其贤，尚何以发之。闻谷有子蒙，在泾原军中，故为作传，异日以授之。谷始名榖，及见之循州，改名谷云。&lt;/p&gt;
&lt;p&gt;&lt;a class="reference external" href="http://translate.google.com/"&gt;Google翻译&lt;/a&gt;的结果很烂（自己去试），所以那些说只要用自动机器翻译就行了的人就不要再乱说了。&lt;/p&gt;
&lt;/div&gt;
&lt;div class="section" id="id3"&gt;
&lt;h2&gt;附注&lt;/h2&gt;
&lt;p&gt;在QQ空间上转载的版本因没有分段，且我不同意QQ空间的服务条款，所以作者不承认这个版本，也不允许继续转载。&lt;/p&gt;
&lt;p&gt;转载者违反了《&lt;a class="reference external" href="http://qzone.qq.com/web/tk.html"&gt;QQ空间服务条款&lt;/a&gt;》中的以下条款：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;3.
用户在遵守法律及本条款的前提下可依本《条款》使用“QQ空间”服务，用户无权实施包括但不限于下列行为：&lt;/p&gt;
&lt;p&gt;……&lt;/p&gt;
&lt;p&gt;3.5
利用发表、传送、传播、储存侵害他人知识产权、商业机密权等合法权利的内容。&lt;/p&gt;
&lt;/blockquote&gt;
&lt;/div&gt;
</content><category term="文字作品"></category><category term="翻译"></category><category term="英文"></category><category term="草稿纸"></category></entry><entry><title>对《QQ空间服务条款》的研究</title><link href="/qzone-agreement.html" rel="alternate"></link><published>2011-04-21T22:04:00+08:00</published><updated>2011-04-21T22:04:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-21:/qzone-agreement.html</id><summary type="html">&lt;p&gt;最近花了大概15分钟时间研究了一下《QQ空间服务条款》，不看不知道，一看吓一跳。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;（请特别注意以下引用内容的**加粗*&lt;/em&gt;部分！:）*&lt;/p&gt;
&lt;p&gt;“已经阅读协议并同意&lt;a class="reference external" href="http://qzone.qq.com/web/tk.html"&gt;《QQ空间服务条款》&lt;/a&gt;”？看都还没看就被勾上了。&lt;/p&gt;
&lt;p&gt;然后点开来看，标题是——“&lt;strong&gt;Qzone精彩由你而来&lt;/strong&gt;”！！一点都不正经。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;腾讯在此特别提醒，用户（您）欲使用“QQ空间”服务，&lt;strong&gt;必须事先认真阅读&lt;/strong&gt;本服务条款中各条款，包括免除或者限制腾讯责任的免责条款及对用户的权利限制。请您审阅并接受或不接受本服务条款（未成年人审阅时应得到法定监护人的陪同）。如您&lt;strong&gt;不同意&lt;/strong&gt;本服务条款及/或腾讯随时对其的修改，您应&lt;strong&gt;不使用&lt;/strong&gt;或&lt;strong&gt;主动取消&lt;/strong&gt;腾讯公司提供的服务。否则，您的任何对QQ空间中的相关服务的登陆、下载、查看等使用行为将被视为您对本服务条款&lt;strong&gt;全部的完全接受&lt;/strong&gt;，包括接受腾讯对服务条款随时所做的&lt;strong&gt;任何修改&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《重要须知》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;看看，你违反了上述条款了吗？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果您选择接受本条款，开通QQ空间服务成为QQ空间用户，即表示您&lt;strong&gt;同意&lt;/strong&gt;接受协议各项条件的约束 …&lt;/p&gt;&lt;/blockquote&gt;</summary><content type="html">&lt;p&gt;最近花了大概15分钟时间研究了一下《QQ空间服务条款》，不看不知道，一看吓一跳。&lt;/p&gt;
&lt;p&gt;&lt;em&gt;（请特别注意以下引用内容的**加粗*&lt;/em&gt;部分！:）*&lt;/p&gt;
&lt;p&gt;“已经阅读协议并同意&lt;a class="reference external" href="http://qzone.qq.com/web/tk.html"&gt;《QQ空间服务条款》&lt;/a&gt;”？看都还没看就被勾上了。&lt;/p&gt;
&lt;p&gt;然后点开来看，标题是——“&lt;strong&gt;Qzone精彩由你而来&lt;/strong&gt;”！！一点都不正经。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;腾讯在此特别提醒，用户（您）欲使用“QQ空间”服务，&lt;strong&gt;必须事先认真阅读&lt;/strong&gt;本服务条款中各条款，包括免除或者限制腾讯责任的免责条款及对用户的权利限制。请您审阅并接受或不接受本服务条款（未成年人审阅时应得到法定监护人的陪同）。如您&lt;strong&gt;不同意&lt;/strong&gt;本服务条款及/或腾讯随时对其的修改，您应&lt;strong&gt;不使用&lt;/strong&gt;或&lt;strong&gt;主动取消&lt;/strong&gt;腾讯公司提供的服务。否则，您的任何对QQ空间中的相关服务的登陆、下载、查看等使用行为将被视为您对本服务条款&lt;strong&gt;全部的完全接受&lt;/strong&gt;，包括接受腾讯对服务条款随时所做的&lt;strong&gt;任何修改&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《重要须知》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;看看，你违反了上述条款了吗？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;如果您选择接受本条款，开通QQ空间服务成为QQ空间用户，即表示您&lt;strong&gt;同意&lt;/strong&gt;接受协议各项条件的约束。如果您不同意本服务条款，则&lt;strong&gt;不能获得使用本服务的权利&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《重要须知》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;接受它的结果。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户&lt;strong&gt;同意&lt;/strong&gt;个人隐私信息是指那些能够对用户进行个人辨识或涉及个人通信的信息，包括下列信息：&lt;strong&gt;用户的姓名，身份证号，手机号码，IP地址，电子邮件地址信息&lt;/strong&gt;。而非个人隐私信息是指&lt;strong&gt;用户登陆的QQ号码&lt;/strong&gt;、对软件的操作状态以及使用习惯等用户的操作记录信息和&lt;strong&gt;其他一切个人隐私信息范围外的普通信息&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《一、产品保护条款》第10条&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;对个人隐私的描述，腾讯不认为私人文件是“个人隐私信息”。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;尊重用户个人隐私信息的私有性是腾讯的一贯制度，腾讯将会采取合理的措施保护用户的个人隐私信息，除法律或有法律赋予权限的政府部门要求或&lt;strong&gt;用户同意&lt;/strong&gt;等原因外，腾讯未经用户同意不向除&lt;strong&gt;合作单位&lt;/strong&gt;以外的第三方公开、
透露用户个人隐私信息。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《一、产品保护条款》第10条&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;“用户同意”，在哪儿设置？“合作单位”是哪些相关部门？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;用户保证向腾讯所提供的&lt;strong&gt;个人身份资料&lt;/strong&gt;信息&lt;strong&gt;真实、完整、有效&lt;/strong&gt;，依据法律规定和约定对所提供的信息承担相应的法律责任。如果资料发生变化，您应&lt;strong&gt;及时更改&lt;/strong&gt;。腾讯会及时、有效地提供&lt;strong&gt;该项服务&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《二、用户使用须知》第4条&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;给腾讯这么真实、完整、有效的个人身份资料信息用来干什么？“该项服务”指的是哪项服务？&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;同时，为了提高、改进腾讯各种服务的用户体验，您同意腾讯对凡是您经由本服务通过上传、张贴等任何方式发布到QQ空间的&lt;strong&gt;任何文字、图片及其他信息资料&lt;/strong&gt;等进行&lt;strong&gt;无偿&lt;/strong&gt;的&lt;strong&gt;修改、复制、传播等使用&lt;/strong&gt;。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《二、用户使用须知》第7条&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;也就是说，我们上传的任何东西版权都归腾讯！&lt;/p&gt;
&lt;p&gt;我不玩腾讯的网络游戏，所以请自己研究《三、关于网络游戏》的内容。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;若用户和腾讯之间发生任何纠纷或争议，首先应&lt;strong&gt;友好协商解决&lt;/strong&gt;，协商不成的，用户在此完全同意将纠纷或争议提交腾讯所在地&lt;strong&gt;深圳市南山区人民法院&lt;/strong&gt;管辖。&lt;/p&gt;
&lt;p class="attribution"&gt;&amp;mdash;—选自《五、适用法律》&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;暂且不论公正性，你这边的法院管不着。&lt;/p&gt;
&lt;blockquote&gt;
腾讯公司拥有对以上各项条款内容的解释权及修改权。&lt;/blockquote&gt;
&lt;p&gt;我不是批评腾讯，只是想提醒一下，对于某些比较“滑头”的网站，还是留意一下它的服务条款为好。&lt;/p&gt;
&lt;div class="section" id="id1"&gt;
&lt;h2&gt;小结&lt;/h2&gt;
&lt;p&gt;维权不仅在“3.15”，更在《最终用户许可协议》。&lt;/p&gt;
&lt;/div&gt;
</content><category term="研究报告"></category><category term="QQ"></category><category term="服务条款"></category><category term="腾讯"></category></entry><entry><title>Hello world!</title><link href="/hello-world.html" rel="alternate"></link><published>2011-04-19T22:29:00+08:00</published><updated>2011-04-19T22:29:00+08:00</updated><author><name>Gumble</name></author><id>tag:None,2011-04-19:/hello-world.html</id><content type="html">&lt;p&gt;这是WordPress在2011年4月19日 22:29:15自动创建的第一篇博客，原文如下：&lt;/p&gt;
&lt;blockquote&gt;
Welcome to WordPress. This is your first post. Edit or delete it,
then start blogging!&lt;/blockquote&gt;
&lt;p&gt;翻译如下：欢迎使用WordPress。这是您的第一篇文章。请编辑或删除它，然后开始写博客！&lt;/p&gt;
&lt;p&gt;这篇文章没什么意思，保留之仅作纪念意义。&lt;/p&gt;
</content><category term="关于网站"></category></entry></feed>