<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>WilliamGates&#39; Blog</title>
    <link>https://blog.williamgates.net/</link>
    <description>WilliamGates&#39; Blog</description>
    <generator>Hugo -- gohugo.io</generator>
    <language>en-us</language>
    <lastBuildDate>Thu, 11 Sep 2025 09:56:00 +0800</lastBuildDate>
    
    <atom:link href="https://blog.williamgates.net/index.xml" rel="self" type="application/rss+xml" />
    
    
    <item>
      <title>在RouterOS上配置家用路由的笔记</title>
      <link>https://blog.williamgates.net/2025/09/configuring-home-router-on-routeros/</link>
      <pubDate>Thu, 11 Sep 2025 09:56:00 +0800</pubDate>
      
      <guid>https://blog.williamgates.net/2025/09/configuring-home-router-on-routeros/</guid>
      <description>&lt;p&gt;拉脱维亚公司MikroTik的路由器、交换机等硬件产品及其配套的操作系统&lt;a href=&#34;https://mikrotik.com/software&#34;&gt;RouterOS&lt;/a&gt;是对普通用户友好的准专业网络配置方案。&lt;/p&gt;
&lt;p&gt;近日，为了调整VLAN而把路由器搞炸了（从任何接口都无法连进去改配置），懒得找串口线，直接重置路由。特此记录一下重新配置过程中的一些坑。&lt;/p&gt;
&lt;p&gt;本文基于&lt;code&gt;RouterOS 7.19.3&lt;/code&gt;版本，仅针对家庭主路由用途，且假设路由器已经重置并适用了默认配置（例如防火墙设置了默认规则，已经建立了bridge并把物理LAN口添加了进去）。全部配置都可以使用WinBox或Web完成，本文列出命令主要是为了方便描述。&lt;/p&gt;
&lt;h2 id=&#34;第一部分pppoe接口的注意事项&#34;&gt;
    &lt;a href=&#34;#%e7%ac%ac%e4%b8%80%e9%83%a8%e5%88%86pppoe%e6%8e%a5%e5%8f%a3%e7%9a%84%e6%b3%a8%e6%84%8f%e4%ba%8b%e9%a1%b9&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    第一部分，PPPOE接口的注意事项
&lt;/h2&gt;
&lt;p&gt;RouterOS的默认防火墙配置中，masquerade规则有一个&lt;code&gt;out-interface-list=WAN&lt;/code&gt;，而如果你没有使用Quick Set来做引导式配置的话，自己新建的pppoe interface是不会自动被加入WAN这个interface list的。因此你需要：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface list member
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;pppoe-out1 &lt;span class=&#34;nv&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;WAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;第二部分关于vlan&#34;&gt;
    &lt;a href=&#34;#%e7%ac%ac%e4%ba%8c%e9%83%a8%e5%88%86%e5%85%b3%e4%ba%8evlan&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    第二部分，关于VLAN
&lt;/h2&gt;
&lt;p&gt;我使用VLAN的目的不是为了在二层隔离VLAN，这样自由度太低，适合子网需要严格隔离的大组织。另一方面，家庭网络结构混乱，又不可能分什么接入/汇聚/核心交换机，还不是随便找个网口插上，同在客厅的交换机上的几个设备可能就需要不同的VLAN，在家用路由器有限的接口上根本不可能划出专门用于哪个VLAN的物理接口。&lt;/p&gt;
&lt;p&gt;因此我的方案是，通过交换机/AC+AP对某些特定的设备（比如从某个特定SSID连入WIFI的设备）打VLAN tag，然后对不同的VLAN分配不同的子网，通过三层防火墙来控制它们之间的互访，类似于（但不同于）RouterOS官方文档中的&lt;a href=&#34;https://help.mikrotik.com/docs/spaces/ROS/pages/328068/Bridging+and+Switching#BridgingandSwitching-VLANExample-InterVLANRoutingbyBridge&#34;&gt;InterVLAN Routing by Bridge&lt;/a&gt;，也被称作&lt;a href=&#34;https://help.mikrotik.com/docs/spaces/ROS/pages/88014957/VLAN#VLAN-Layer3VLANexamples&#34;&gt;Layer3 VLAN&lt;/a&gt;。&lt;/p&gt;
&lt;p&gt;在下面的例子里，普通设备（比如电脑）通过无VLAN tag的流量接入路由器，这样配置最为简单；IoT设备根据特定的SSID被AP打上VLAN id=5的tag，以便后面配置防火墙和主要设备的子网隔离。&lt;/p&gt;
&lt;h4 id=&#34;设置一个不包括在bridge内的lan口&#34;&gt;
    &lt;a href=&#34;#%e8%ae%be%e7%bd%ae%e4%b8%80%e4%b8%aa%e4%b8%8d%e5%8c%85%e6%8b%ac%e5%9c%a8bridge%e5%86%85%e7%9a%84lan%e5%8f%a3&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    设置一个不包括在bridge内的lan口
&lt;/h4&gt;
&lt;p&gt;这是一个保险动作，不是必须的，但我强烈推荐这么做。比如，我从bridge里面删掉ether5,平时也不使用这个物理接口。当你在bridge上错误配置VLAN而无法连入路由器（我就是因此而重置路由的），你就可以通过这个接口连入路由来修改。&lt;/p&gt;
&lt;p&gt;为了通过IP连入，你需要给这个接口分配一个IP（当然连入的设备也要手动设定IP）；为了通过MAC连入，你需要把这个接口加入interface list LAN,因为/tool mac-server默认allowed-interface-list=LAN。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface bridge port 
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;remove &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt;find &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ether5&lt;span class=&#34;o&#34;&gt;]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ip address
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.250.1/24 &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ether5 &lt;span class=&#34;nv&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.250.0
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface list member
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;ether5 &lt;span class=&#34;nv&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;LAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;新建vlan-interface并在其上配置dhcp-server&#34;&gt;
    &lt;a href=&#34;#%e6%96%b0%e5%bb%bavlan-interface%e5%b9%b6%e5%9c%a8%e5%85%b6%e4%b8%8a%e9%85%8d%e7%bd%aedhcp-server&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    新建VLAN interface并在其上配置dhcp server
&lt;/h4&gt;
&lt;p&gt;如果你只是像我一样，想为不同的VLAN配置不同的dhcp服务器，分配不同的子网，那么在interface中新建虚拟的VLAN接口，确保这些接口基于bridge（而不是物理接口），并在这些VLAN接口上分别新建dhcp服务器就好了。&lt;/p&gt;
&lt;p&gt;按照如下设置，一个设备的流量如果被打上了VLAN id=5的tag，它就会被分配到192.168.5.0/24的地址，之后别忘了为限制它而配置防火墙，此处略过防火墙配置。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface vlan
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 vlan-id&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface list member
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 &lt;span class=&#34;nv&#34;&gt;list&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;LAN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ip pool
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 &lt;span class=&#34;nv&#34;&gt;ranges&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.10-192.168.5.250
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ip dhcp-server
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add add-arp&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes address-pool&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 &lt;span class=&#34;nv&#34;&gt;name&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;server5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ip dhcp-server network
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.0/24 dns-server&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.1 &lt;span class=&#34;nv&#34;&gt;gateway&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.1 &lt;span class=&#34;nv&#34;&gt;netmask&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;24&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ip address
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.1/24 &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5 &lt;span class=&#34;nv&#34;&gt;network&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;192.168.5.0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;可选看完再配置打开bridge-vlan-filtering&#34;&gt;
    &lt;a href=&#34;#%e5%8f%af%e9%80%89%e7%9c%8b%e5%ae%8c%e5%86%8d%e9%85%8d%e7%bd%ae%e6%89%93%e5%bc%80bridge-vlan-filtering&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    （可选，看完再配置！）打开bridge VLAN filtering
&lt;/h4&gt;
&lt;p&gt;从字面意义上看，如果我们要在路由器上设置VLAN，就需要打开这个功能，但这实际上是个误解。你只需要按照上一节的内容设置VLAN接口，已经被打了VLAN tag的流量就会被正确处理。如果你的家庭网络规模较小，又不想踩坑，可以完全不打开bridge VLAN filtering。&lt;/p&gt;
&lt;p&gt;但&lt;code&gt;bridge VLAN filtering&lt;/code&gt;确实是官方推荐的配置。RouterOS在v7版本支持了同时使用&lt;code&gt;bridge VLAN filtering&lt;/code&gt;和&lt;code&gt;hardware offloading&lt;/code&gt;之后，所有的官方文档都推荐你在配置VLAN时使用这个功能。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Bridge VLAN Filtering provides VLAN-aware Layer 2 forwarding and VLAN tag modifications within the bridge. This set of features makes bridge operation more similar to a traditional Ethernet switch and allows overcoming Spanning Tree compatibility issues compared to the configuration when VLAN interfaces are bridged.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;但是，这个功能很容易导致你被锁在路由器外面……以下的代码块是我写的原理分析和吐槽，只想知道结论的人可以跳过：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;在打开bridge VLAN filtering功能前，你需要知道：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 打开bridge VLAN filtering，路由器的交换芯片将可以处理VLAN tag，工作在二层，因此本段中我们简称它为交换机
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 进入交换机的数据帧如果没有VLAN tag，会被相应的端口根据其PVID打上tag
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- bridge自己也有PVID
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 你需要设置Bridge VLAN table。在这个table中，你需要对所有你会在该交换机中用到的VLAN id，分别设置tagged和untagged组
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- tagged和untagged的意思如下：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# Bridge VLAN table represents per-VLAN port mapping with an egress VLAN tag action. The tagged ports send out frames with a corresponding VLAN ID tag. The untagged ports remove a VLAN tag before sending out frames.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# - tagged (interfaces; Default: none) Interfaces or interface list with a VLAN tag adding action in egress. This setting accepts comma-separated values. e.g. tagged=ether1,ether2.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;c1&#34;&gt;# - untagged (interfaces; Default: none) Interfaces or interface list with a VLAN tag removing action in egress. This setting accepts comma-separated values. e.g. untagged=ether3,ether4.&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 如果你需要某个VLAN的流量或无标签流量访问bridge（管理路由器/访问网关/访问bridge上的VLAN接口等，基本上是家用路由的大部分用途），你需要把bridge interface（具体见下面吐槽）加入Bridge VLAN table
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;如果在Bridge VLAN table&lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;简称table&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;中没有正确配置相应的VLAN id或其tagged和untagged组，会有如下情况：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt; 如果一个数据帧在进入交换机之前已经打上了VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2的tag，进入的物理接口是ether2
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1.1 table中没有VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2，帧会被丢弃
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1.2 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2的tagged和untagged组都不包含ether2，帧会被丢弃
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1.3 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2的untagged组包含ether2，帧会被删除VLAN tag，向客户端发送的帧会失去VLAN tag，无法到达客户端
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  1.4 接下来，如果没有出现前述错误，而这是一个访问bridge的帧
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    1.4.1 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2的tagged和untagged组都不包含bridge interface，帧会被丢弃
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    1.4.2 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;2的untagged组包含bridge interface，帧会被删除VLAN tag，可能错误地允许某个VLAN访问bridge上的默认网关
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;m&#34;&gt;2&lt;/span&gt; 如果一个数据帧在进入交换机之前没有VLAN tag，进入的物理接口是ether2，ether2和bridge的PVID&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2.1 table中没有VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1，帧会被丢弃（因为这个无VLAN tag的帧在进入ether时会被按照接口的PVID加上tag）
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2.2 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tagged和untagged组都不包含ether2，帧会被丢弃
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2.3 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tagged组包含ether2，向客户端发送的帧会被保留VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tag，无法到达客户端
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  2.4 接下来，如果没有出现前述错误，而这是一个访问bridge的帧
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    2.4.1 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tagged和untagged组都不包含bridge interface，帧会被丢弃
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;    2.4.2 table中VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tagged组包含bridge interface，帧在离开bridge interface（而不是工作在三层的bridge，见下面吐槽）的时候会保留VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的tag，无法访问无VLAN的bridge，只能访问bridge上VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的VLAN interface，这违反了设计目的
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;吐槽：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 1.1/1.2/2.1/2.2 体现在官方文档中Bridge Interface Setup的&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;ingress-filtering&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;设置中，不在&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;Bridge VLAN Filtering&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;条目下，虽然不好找但问题不大；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 1.3/2.3 符合官方文档对于tagged和untagged的介绍，是最容易理解的部分；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 1.4.1/2.4.1 体现在官方文档的警告中，还算明确；
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- ---以下是最难理解的部分，也是核心原理---
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;- 1.4.2/2.4.2 虽然符合官方的例子（下面结论中的两个例子），但完全从文档中无法直接读出来。我能想到加入bridge VLAN table中的bridge interface指的是交换机芯片连接CPU的端口（文档里也提了一嘴,&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;Though it is possible in certain situations to allow a packet to be processed by the CPU, this is usually called a packet forwarding to the switch CPU port &lt;span class=&#34;o&#34;&gt;(&lt;/span&gt;or the bridge interface in bridge VLAN filtering scenario&lt;span class=&#34;o&#34;&gt;)&lt;/span&gt;&lt;span class=&#34;sb&#34;&gt;`&lt;/span&gt;），但绝对想不到这个bridge和你要访问的、绑定了默认dhcp server和默认网关IP的bridge不是一回事（或者说是同一个东西的二层和三层）。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - bridge VLAN table中的bridge interface指的是交换机芯片连接路由器CPU的端口，这个端口的egress指的是访问路由器CPU，工作在二层，从而受tagged/untagged影响
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - 绑定了默认网关IP的bridge指的是路由器CPU内部的网桥，绑定IP作为默认网关的功能工作在三层，不会传输而会终结VLAN tag
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;  - bridge VLAN table中的bridge &lt;span class=&#34;nv&#34;&gt;interface的PVID&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1，但绑定了默认网关IP的bridge却还是只接受无VLAN tag的流量（这简直是故意误导用户），接受VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1流量（即终结VLAN tag）的是bridge.VLAN1
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;再思考：
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;ether2到bridge算不算egress？VLAN tag是否经历了添加-删除-添加-删除的过程？为什么bridge和untagged的物理接口的PVID要一样？官方文档没说。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;我尝试将ether2设置为PVID 1，bridge设置为PVID 9，通过package sniffer来看，任何接口上都没有VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;1的包，ether2上有VLAN &lt;span class=&#34;nv&#34;&gt;id&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;9的tx包（即向lan设备发出的包，src ip是公网），这能说明从公网进入bridge的包被bridge加了VLAN id 9，但不能用于回答上面的问题，累了。
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;顺便一说，这样的情况下在某些物理接口上出现了不少跟它不可能有关系的包，不知道是package sniffer工具的混乱，还是路由本身乱了，总之建议保持bridge和untagged的物理接口的PVID一致。
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;结论：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;对于已经打上VLAN tag的帧，应该将VLAN id加入&lt;code&gt;Bridge VLAN table&lt;/code&gt;，并设置所有可能进入的物理接口和bridge为这个VLAN id的&lt;code&gt;tagged&lt;/code&gt;组成员&lt;/li&gt;
&lt;li&gt;对于没有打上VLAN tag的帧，如果不需要访问bridge本身，而只需要访问bridge上的VLAN interface从而访问路由器（官方文档推荐配置），应该将物理接口和bridge的PVID（应该一样）作为VLAN id加入&lt;code&gt;Bridge VLAN table&lt;/code&gt;，并设置所有可能进入的物理接口为这个VLAN id的&lt;code&gt;untagged&lt;/code&gt;组成员，bridge设为&lt;code&gt;tagged&lt;/code&gt;组成员，再添加正确的&lt;code&gt;VLAN interface&lt;/code&gt;。如&lt;a href=&#34;https://help.mikrotik.com/docs/spaces/ROS/pages/328068/Bridging+and+Switching#BridgingandSwitching-UntaggedaccesswithVLANfiltering&#34;&gt;官方文档例子1&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;对于没有打上VLAN tag的帧，如果需要访问bridge本身（在家庭网络中几乎是必然的），应该将物理接口和bridge的PVID（应该一样）作为VLAN id加入&lt;code&gt;Bridge VLAN table&lt;/code&gt;，并设置所有可能进入的物理接口和bridge为这个VLAN id的&lt;code&gt;untagged&lt;/code&gt;组成员，如&lt;a href=&#34;https://help.mikrotik.com/docs/spaces/ROS/pages/328068/Bridging+and+Switching#BridgingandSwitching-ChanginguntaggedVLANforthebridgeinterface&#34;&gt;官方文档例子2&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;如果你配错了，没打VLAN tag的流量就没法通过IP或者MAC（因为VLAN tag在二层）连入路由器。注意，有很多网卡驱动中设置VLAN tag的功能并不可靠，可能和路由的VLAN并不兼容，因而你只能通过无标签流量访问路由器，我的电脑就是。&lt;/p&gt;
&lt;p&gt;在本文的例子里，我的配置是：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface bridge VLAN
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge &lt;span class=&#34;nv&#34;&gt;untagged&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge,ether2,ether3,ether4 vlan-ids&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;1&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;bridge&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge &lt;span class=&#34;nv&#34;&gt;tagged&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge,ether2,ether3,ether4 vlan-ids&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;m&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/interface bridge &lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; bridge vlan-filtering&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;请确保你一切都配置好了，再执行最后一步的set bridge vlan-filtering=yes。&lt;/p&gt;
&lt;h4 id=&#34;bridge三层意义上是没有vlan-tag的不要配置一个dhcp服务器来为vlan-1服务&#34;&gt;
    &lt;a href=&#34;#bridge%e4%b8%89%e5%b1%82%e6%84%8f%e4%b9%89%e4%b8%8a%e6%98%af%e6%b2%a1%e6%9c%89vlan-tag%e7%9a%84%e4%b8%8d%e8%a6%81%e9%85%8d%e7%bd%ae%e4%b8%80%e4%b8%aadhcp%e6%9c%8d%e5%8a%a1%e5%99%a8%e6%9d%a5%e4%b8%bavlan-1%e6%9c%8d%e5%8a%a1&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    bridge（三层意义上）是没有VLAN tag的，不要配置一个dhcp服务器来为VLAN 1服务
&lt;/h4&gt;
&lt;p&gt;正如上文所述，绑定了默认网关IP的bridge处理的流量是不含VLAN tag的，如果你并没有把bridge设置在VLAN id=1的tagged组，就不需要在bridge上设置一个VLAN1 interface，更不要在这个接口上运行dhcp，我观测到明显的路由器性能下降（但是写这篇文章的时候又观测不到了，可能有其他原因）。&lt;/p&gt;
&lt;h2 id=&#34;第三部分关于ipv6&#34;&gt;
    &lt;a href=&#34;#%e7%ac%ac%e4%b8%89%e9%83%a8%e5%88%86%e5%85%b3%e4%ba%8eipv6&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    第三部分，关于IPv6
&lt;/h2&gt;
&lt;p&gt;我对于将家庭设备暴露给公网还是有一定的担心，所以我违背IPv6的初衷，在IPv6上还是配置了NAT。&lt;/p&gt;
&lt;h4 id=&#34;获取前缀&#34;&gt;
    &lt;a href=&#34;#%e8%8e%b7%e5%8f%96%e5%89%8d%e7%bc%80&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    获取前缀
&lt;/h4&gt;
&lt;p&gt;在我的电信宽带，只要开启dhcp client就能获得/60的IPv6前缀，记得request不要选address（选了address和prefix，电信不会下发任何东西）。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 dhcp-client
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add add-default-route&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes default-route-tables&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;main &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;pppoe-out1 pool-name&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public-ipv6 &lt;span class=&#34;nv&#34;&gt;request&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;prefix use-peer-dns&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;no
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h4 id=&#34;给pppoe接口绑定地址&#34;&gt;
    &lt;a href=&#34;#%e7%bb%99pppoe%e6%8e%a5%e5%8f%a3%e7%bb%91%e5%ae%9a%e5%9c%b0%e5%9d%80&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    给PPPOE接口绑定地址
&lt;/h4&gt;
&lt;p&gt;因为我要设置NAT，所以不希望在bridge或物理LAN接口上绑定公网IPv6地址，而且这个地址要设为advertise=no，即不会通过ND下发。在lo接口上绑定是没有用的（这和Linux不同），只能随便找个不属于bridge的接口绑定了，你可以绑在WAN口上，这样可以启用eui-64，也可以像我一样绑在pppoe口上，这样更符合逻辑。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 address
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;:: &lt;span class=&#34;nv&#34;&gt;advertise&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;no eui-64&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;no from-pool&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;public-ipv6 &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;pppoe-out1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，你的路由本身应该能够ping通公网IPv6地址。&lt;/p&gt;
&lt;h4 id=&#34;下发私有地址&#34;&gt;
    &lt;a href=&#34;#%e4%b8%8b%e5%8f%91%e7%a7%81%e6%9c%89%e5%9c%b0%e5%9d%80&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    下发私有地址
&lt;/h4&gt;
&lt;p&gt;我们要给局域网设备下发IPv6地址，但又不能下发从ISP获得的公网前缀，所以我们自定义一段，假设是fc00:fc00:fc00:1::/64（实际上我用的不是这个前缀）发给VLAN0，fc00:fc00:fc00:5::/64发给VLAN5。设置ND的interface=bridge，能够正常下发到bridge上的vlan接口上，不用担心。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 address
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fc00:fc00:fc00:1:: eui-64&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;address&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;fc00:fc00:fc00:5:: eui-64&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;vlan5
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 nd
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;set&lt;/span&gt; &lt;span class=&#34;o&#34;&gt;[&lt;/span&gt; find &lt;span class=&#34;nv&#34;&gt;default&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;yes &lt;span class=&#34;o&#34;&gt;]&lt;/span&gt; advertise-dns&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;no advertise-mac-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;no &lt;span class=&#34;nv&#34;&gt;interface&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;bridge
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;你的设备应该会获取到一个fc00开头的IPv6地址。&lt;/p&gt;
&lt;p&gt;如果它也获取到了ISP给的公网前缀（原因不明，可能是因为ND默认是打开的，你在配置前几步的时候它已经开始错误地工作了），不用担心。一方面，重启路由后，这个前缀就会从局域网设备中消失；另一方面，由于我们把公网IP绑定在了pppoe口上，bridge或物理LAN口上没有公网IP的路由，所以即使不设置任何防火墙，路由器（以及根据/60前缀来访问你的路由器的公网用户）也无法根据下发给你的公网IP来路由到这个内网设备。&lt;/p&gt;
&lt;h4 id=&#34;设置ipv6-nat&#34;&gt;
    &lt;a href=&#34;#%e8%ae%be%e7%bd%aeipv6-nat&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    设置IPv6 NAT
&lt;/h4&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 firewall nat
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;masquerade &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;srcnat ipsec-policy&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;out,none out-interface-list&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;WAN
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;现在，就像IPv4的NAT一样，我们在不让局域网设备获得公网IPv6地址的情况下，允许它们通过IPv6正常访问互联网。如果你还不放心，可以在防火墙上再限制一下。&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-shell&#34; data-lang=&#34;shell&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/ipv6 firewall filter
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;add &lt;span class=&#34;nv&#34;&gt;action&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;drop &lt;span class=&#34;nv&#34;&gt;chain&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;forward &lt;span class=&#34;nv&#34;&gt;comment&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s2&#34;&gt;&amp;#34;drop not from fc00 to WAN&amp;#34;&lt;/span&gt; out-interface-list&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;WAN src-address&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;!fc00:fc00:fc00::/48
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>在Linux环境下使用开源工具玩中国象棋</title>
      <link>https://blog.williamgates.net/2024/05/play-xiangqi-in-linux-with-open-source-tools/</link>
      <pubDate>Mon, 27 May 2024 10:35:00 +0800</pubDate>
      
      <guid>https://blog.williamgates.net/2024/05/play-xiangqi-in-linux-with-open-source-tools/</guid>
      <description>&lt;p&gt;　　中国象棋有悠久的历史，是老少皆宜的棋类项目。在象棋竞技上，人类早早就被AI（广义上的，很原始的AI就够了）彻底击败了，但由于象棋的特性，AI的“高明”之处相对来说更容易被人类所理解，所以不论是与AI对弈，还是使用AI进行对局分析、观看AI对弈，都有一定的乐趣可言。&lt;/p&gt;
&lt;p&gt;　　但是事情没这么简单。某天突发奇想，试图在自己的电脑上跑个象棋AI，这时候才发现，虽然个人电脑的算力完全足以运行先进的象棋AI（而且完全不需要GPU出手），但几乎所有的中国象棋软件都不开源，几乎所有会被windows报毒，几乎所有都不支持在虚拟机中运行，几乎所有都有收费版本，甚至有多个莫名其妙的收费层级。显然，这里的“几乎所有”是一种严谨而委婉的说法。结合从论坛看到的信息，我猜测这些软件的主要付费客群可能是在网络对弈中开挂的无聊人士，所以他们非常在乎在软件以外的其他界面上自动识别和自动行棋的能力，以及微小的棋力差距，而这些都不是我们想随随便便和AI下棋、看AI下棋的人关心的事。&lt;/p&gt;
&lt;p&gt;　　一个稍有一点点技术常识的人能忍这些？我只好尝试完全基于开源方案的中国象棋，并且希望在Linux（实际上是WSL2）环境下运行，减少风险。本文就是关于这些实践的经验介绍。这些开源方案基本上都与国际象棋（Chess）相关软件有渊源，下文介绍时也将在一定程度上使用国际象棋相关的术语、引用与国际象棋相关的页面。&lt;/p&gt;
&lt;h2 id=&#34;相关术语&#34;&gt;
    &lt;a href=&#34;#%e7%9b%b8%e5%85%b3%e6%9c%af%e8%af%ad&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    相关术语
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/Engines&#34;&gt;&lt;code&gt;Engine&lt;/code&gt;&lt;/a&gt;，which is the chess playing part of the chess program, relying on proprietary or standard protocols communicating with an external graphical user interfaces. 引擎是决定走法的部分，是“后端”。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/GUI&#34;&gt;&lt;code&gt;GUI&lt;/code&gt;&lt;/a&gt;，Graphical User Interface (GUI), a user interface where interaction between user and a (chess) program takes place. 用户界面就是呈现棋盘、供用户操作（包括走棋和编辑棋局等）的“前端”。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/Protocols&#34;&gt;&lt;code&gt;Protocol&lt;/code&gt;&lt;/a&gt;，a formal description of digital message formats and the rules for exchanging those messages in or between computing systems. 在象棋软件中，协议指的是前端界面和后端引擎之间联系的协议，通过约定协议，可以允许界面和引擎之间进行自由搭配（下文会提到，并非如此）,也有助于开发者只开发引擎或只开发界面，致力于自己感兴趣的部分。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/Opening_Book&#34;&gt;&lt;code&gt;Opening Book&lt;/code&gt;&lt;/a&gt;，chess programs often look up the positions at the beginning of the game in an Opening Book. 开局库，让引擎根据一定的定势起手，减少开局阶段的运算量，提高开局速度，也可能在一定程度上提高棋力。基于我们的目的，本文不涉及开局库，你当然可以自己加载开局库。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Chess_variant&#34;&gt;&lt;code&gt;Chess variant&lt;/code&gt;&lt;/a&gt;，指国际象棋的各类变种。这里有一点历史争论，国际上一般认为各种象棋都是源自一种印度的游戏——恰图兰卡，7世纪时流传至波斯成为波斯象棋，而波斯象棋传入中国成宝应象棋，最后中国人在宋代改造成象棋，换言之，中国象棋就是一种&lt;code&gt;chess variant&lt;/code&gt;；但中国象棋界主张中国象棋是从春秋战国时期的“六博”演绎而来（以上两种观点均来自&lt;a href=&#34;https://zh.wikipedia.org/wiki/%E8%B1%A1%E6%A3%8B&#34;&gt;维基百科&lt;/a&gt;）。折衷来说，&lt;a href=&#34;https://en.wikipedia.org/w/index.php?title=List_of_chess_variants&amp;amp;section=26#Chess-related_historical_and_regional_games&#34;&gt;维基百科&lt;/a&gt;将象棋归类为 &amp;ldquo;Chess-related historical and regional games&amp;rdquo;。抛开历史争论不谈，由于开发者一般这么认为，本文的语境中中国象棋与日本将棋、韩国将棋等一样，都是&lt;code&gt;chess variant&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/NNUE&#34;&gt;&lt;code&gt;nnue&lt;/code&gt;&lt;/a&gt;，Efficiently Updatable Neural Networks，a Neural Network architecture intended to replace the evaluation of Shogi, chess and other board game playing alpha-beta searchers running on a CPU. NNUE是一种神经网络，能够减少计算量、提升引擎的棋力。&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.chessprogramming.org/Forsyth-Edwards_Notation&#34;&gt;&lt;code&gt;FEN&lt;/code&gt;&lt;/a&gt;，Forsyth-Edwards Notation，以字符串表示棋局的方式。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;可用的开源方案&#34;&gt;
    &lt;a href=&#34;#%e5%8f%af%e7%94%a8%e7%9a%84%e5%bc%80%e6%ba%90%e6%96%b9%e6%a1%88&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    可用的开源方案
&lt;/h2&gt;
&lt;h3 id=&#34;引擎&#34;&gt;
    &lt;a href=&#34;#%e5%bc%95%e6%93%8e&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    引擎
&lt;/h3&gt;
&lt;p&gt;　　上文提到“几乎所有”中国象棋软件都不开源，但其中的部分将引擎以二进制形式发布出来，但我不想讨论，也不想提到他们的名字。&lt;/p&gt;
&lt;p&gt;　　近年正在开发的开源的引擎主要包括两个：&lt;a href=&#34;https://github.com/fairy-stockfish/Fairy-Stockfish&#34;&gt;&lt;code&gt;Fairy-Stockfish&lt;/code&gt;&lt;/a&gt;和&lt;a href=&#34;https://github.com/official-pikafish/Pikafish&#34;&gt;&lt;code&gt;Pikafish&lt;/code&gt;&lt;/a&gt;，两者都自称脱胎于著名的国际象棋引擎&lt;a href=&#34;https://github.com/official-stockfish/Stockfish&#34;&gt;&lt;code&gt;Stockfish&lt;/code&gt;&lt;/a&gt;，前者是一个致力于多种chess variant且支持多种协议的大而全的引擎，国内有人翻译为“仙鱼”；后者是中国人开发的专用于中国象棋的引擎，中文名为“皮卡鱼”。一般而言，公认Pikafish比Fairy-Stockfish的棋力要强一些，近期的开发也更积极。当然，对于我们的目的而言，棋力的微小差距并不那么重要。&lt;/p&gt;
&lt;p&gt;　　有一个古老的开源引擎&lt;a href=&#34;https://github.com/xqbase/eleeye/tree/master&#34;&gt;象眼&lt;/a&gt;，近年还有微小的更新，我没有尝试，有兴趣的人可以自己研究看看。&lt;/p&gt;
&lt;h3 id=&#34;界面&#34;&gt;
    &lt;a href=&#34;#%e7%95%8c%e9%9d%a2&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    界面
&lt;/h3&gt;
&lt;p&gt;　　界面是“几乎所有”中国象棋软件的重灾区，研发个引擎不行，研发个（骗钱或挂马的）界面还是不难的。还是那句话，我不想讨论，也不想提到他们的名字。&lt;/p&gt;
&lt;p&gt;　　目前支持中国象棋的开源界面主要有两个：&lt;a href=&#34;https://www.gnu.org/software/xboard/&#34;&gt;&lt;code&gt;XBoard&lt;/code&gt;&lt;/a&gt;和&lt;a href=&#34;https://github.com/ml-research/liground&#34;&gt;&lt;code&gt;LiGround&lt;/code&gt;&lt;/a&gt;。前者从上古时代延续至今（可考的最早发布时间为1991年，最新版4.9.1发布于2016年），功能强大，一切基本上都可以定制，也可以在图形界面上直接编辑棋局。后者的目标是 &amp;ldquo;modern Chess Variant Analysis GUI for the 21st century&amp;rdquo;，界面更好看（见仁见智），只能使用FEN编辑棋局，现在还在更新，但不能算处于积极开发状态。&lt;/p&gt;
&lt;p&gt;　　其他主流国际象棋界面大多明确表示没有支持variant的计划，或者没有支持中国象棋的计划，例如&lt;a href=&#34;https://github.com/pychess/pychess&#34;&gt;&lt;code&gt;pyChess&lt;/code&gt;&lt;/a&gt;。目前最接近支持中国象棋的界面是&lt;a href=&#34;https://github.com/cutechess/cutechess&#34;&gt;&lt;code&gt;Cute Chess&lt;/code&gt;&lt;/a&gt;,有一个&lt;a href=&#34;https://github.com/cutechess/cutechess/pull/565&#34;&gt;PR&lt;/a&gt;支持中国象棋，但没有被合并。&lt;/p&gt;
&lt;p&gt;　　请注意在WSL2中使用图形界面（也就是WSLg），需要一些技巧和设置，比如你需要遵循&lt;a href=&#34;https://learn.microsoft.com/zh-cn/windows/wsl/tutorials/gui-apps&#34;&gt;微软的指引&lt;/a&gt;，你的发行版可能会对WSLg有特定的安排（比如&lt;a href=&#34;https://en.opensuse.org/openSUSE:WSL#Enabling_GUI_support_(WSLg)&#34;&gt;OpenSUSE的&lt;/a&gt;）,你可能遇到问题（比如我就遇到重启后&lt;code&gt;cannot open display: :0&lt;/code&gt;的问题）需要&lt;a href=&#34;https://github.com/microsoft/wslg/wiki/Diagnosing-%22cannot-open-display%22-type-issues-with-WSLg&#34;&gt;解决方法&lt;/a&gt;。具体请自行摸索。&lt;/p&gt;
&lt;h3 id=&#34;协议&#34;&gt;
    &lt;a href=&#34;#%e5%8d%8f%e8%ae%ae&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    协议
&lt;/h3&gt;
&lt;p&gt;　　与中国象棋有关的协议主要包括&lt;a href=&#34;https://www.chessprogramming.org/Chess_Engine_Communication_Protocol&#34;&gt;&lt;code&gt;CECP&lt;/code&gt;&lt;/a&gt;，&lt;a href=&#34;https://www.chessprogramming.org/UCI&#34;&gt;&lt;code&gt;UCI&lt;/code&gt;&lt;/a&gt;和&lt;a href=&#34;https://www.xqbase.com/protocol/cchess_ucci.htm&#34;&gt;&lt;code&gt;UCCI&lt;/code&gt;&lt;/a&gt;,其中CECP主要是xboard及其windows衍生版本winboard在用，它们也只支持这一种协议（其他协议可以通过工具转换），所以该协议也被很多程序称为xboard协议；UCI是使用最广泛的国际象棋协议，中国象棋在使用的时候如果处理不当会有兼容性问题（下文会提到）；UCCI是专为中国象棋制定的协议，几乎没有开源界面支持（这里的几乎还是一种严谨而委婉的说法）。Pikafish只支持UCI协议，而Fairy-Stockfish支持CECP/UCI/UCCI协议。&lt;/p&gt;
&lt;h2 id=&#34;实际使用&#34;&gt;
    &lt;a href=&#34;#%e5%ae%9e%e9%99%85%e4%bd%bf%e7%94%a8&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    实际使用
&lt;/h2&gt;
&lt;p&gt;　　从上文可以看出，我们基本上只有两种引擎、两种界面可用，他们组合起来分别有以下技巧和问题：&lt;/p&gt;
&lt;h3 id=&#34;xboardfairy-stockfish&#34;&gt;
    &lt;a href=&#34;#xboardfairy-stockfish&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    XBoard+Fairy-Stockfish
&lt;/h3&gt;
&lt;p&gt;　　一般的发行版都带有XBoard包（我用的是OpenSUSE的包），默认没有提供中国象棋棋盘和棋子，如果你安装的版本也是这样，那么可以在&lt;a href=&#34;https://github.com/Kadagaden/chess-pieces&#34;&gt;Kadagaden/chess-pieces&lt;/a&gt;或者其他地方下载棋盘和棋子，然后在XBoard中打开&lt;code&gt;View - Edit Theme List...&lt;/code&gt;，添加形如这样的配置（注意坑点：路径写&lt;code&gt;~&lt;/code&gt;不能识别，也没有报错；写&lt;code&gt;~~&lt;/code&gt;指的是安装路径，例如&lt;code&gt;/usr/share/games/xboard&lt;/code&gt;），然后在&lt;code&gt;View - Board...&lt;/code&gt;中双击&lt;code&gt;gmchess&lt;/code&gt;就可以使用相应棋盘和棋子配置了（如果你棋盘显示不正常，根据下一步加载引擎后就会正常了）：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;&amp;#34;gmchess&amp;#34; -ubt true -lbtf &amp;#34;/home/you/xboard/gmchess_wood/xiangqi_gmchess_wood.png&amp;#34; -dbtf &amp;#34;/home/you/xboard/gmchess_wood/xiangqi_gmchess_wood.png&amp;#34; -lbtm 1 -dbtm 1 -lsc #C8C365 -dsc #77A26D -ub false -upf false -pid &amp;#34;/home/you/xboard/gmchess_wood&amp;#34; -trueColors true -hsc #FFFF00 -phc #FF0000 -overrideLineGap 0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　你需要在&lt;a href=&#34;https://github.com/fairy-stockfish/Fairy-Stockfish-NNUE/releases&#34;&gt;fairy-stockfish/Fairy-Stockfish-NNUE&lt;/a&gt;而不是&lt;a href=&#34;https://github.com/fairy-stockfish/Fairy-Stockfish/releases&#34;&gt;fairy-stockfish/Fairy-Stockfish&lt;/a&gt;下载最新版的引擎（引擎已经内置nnue文件），前者最新版是&lt;a href=&#34;https://github.com/fairy-stockfish/Fairy-Stockfish-NNUE/releases/tag/xiangqi-aa162e1771e5&#34;&gt;2023年1月的&lt;/a&gt;，比后者的&lt;a href=&#34;https://github.com/fairy-stockfish/Fairy-Stockfish/releases/tag/fairy_sf_14_0_1_xq&#34;&gt;2021年11月&lt;/a&gt;要新；记得要下载标着xiangqi或者largeboard的版本。&lt;/p&gt;
&lt;p&gt;　　Fairy-Stockfish支持CECP协议，所以只需要在XBoard的&lt;code&gt;Engine - Edit Engine List...&lt;/code&gt;中添加形如这样的配置，然后在&lt;code&gt;Engine - Load New 1st Engine&lt;/code&gt;的界面中双击&lt;code&gt;Fairy-Stockfish&lt;/code&gt;就可以调入引擎了（同样注意路径的坑，这里用&lt;code&gt;-fd&lt;/code&gt;指定工作目录的方法不可以用于上面的Theme List：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;&amp;#34;Fairy-Stockfish&amp;#34; /variant&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;xiangqi -fcp &amp;#34;./fairy-stockfish-largeboard_x86-64-bmi2&amp;#34; -fd &amp;#34;/home/you/xboard/fairy-stockfish&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　如果加载后XBoard崩溃跳出，可以尝试加载一下其他象棋引擎（也就是Pikafish了）再加载Fairy-Stockfish。&lt;/p&gt;
&lt;p&gt;　　XBoard的&lt;code&gt;Engine - Common Settings...&lt;/code&gt;中可以调整一些与引擎有关的设置，&lt;a href=&#34;https://github.com/official-pikafish/Pikafish/wiki/Pikafish-FAQ#optimal-settings&#34;&gt;Pikafish建议&lt;/a&gt;把CPU数设高，Hash-Table设高（达到1-2GB）。XBoard的&lt;code&gt;Engine - Engine #1 Settings&lt;/code&gt;里面还有具体引擎的设置，&lt;a href=&#34;https://github.com/official-pikafish/Pikafish/wiki/Pikafish-FAQ#optimal-settings&#34;&gt;Pikafish建议&lt;/a&gt;把MultiPV设成1。&lt;/p&gt;
&lt;p&gt;　　然后你执红走一步，引擎就会执黑走棋了。如果没有加载开局库，一开始几步棋会很慢，可以通过引擎输出界面看看它在做什么。当然你也可以不走棋，使用&lt;code&gt;Mode - Two Machines&lt;/code&gt;让引擎对弈（需要加载1st和2nd引擎）。你还可以在&lt;code&gt;Mode - Edit Position&lt;/code&gt;状态下编辑棋局，用左键拖动棋子，右键修改棋子（点击后向不同方向拖动右键可以改变棋子内容，滚轮也可以）；编辑完之后选择Mode（例如Machine Black）就可以开始下棋了，如果XBoard报告&amp;quot;It&amp;rsquo;s not black&amp;rsquo;s turn&amp;quot;之类的，那么你要操作另一方先走一步再点击相应Mode。&lt;/p&gt;
&lt;h3 id=&#34;xboardpikafish&#34;&gt;
    &lt;a href=&#34;#xboardpikafish&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    XBoard+Pikafish
&lt;/h3&gt;
&lt;p&gt;　　XBoard的部分与上一节相同，而引擎的部分有所区别。&lt;/p&gt;
&lt;p&gt;　　虽然Pikafish的各个版本可以从&lt;a href=&#34;https://github.com/official-pikafish/Pikafish/releases&#34;&gt;official-pikafish/Pikafish&lt;/a&gt;中轻易获得，但是它并没有像Fairy-Stockfish一样集成nnue文件，不同版本的引擎不可换用其他版本的nnue文件。而除了最新版本对应的nnue文件可以从&lt;a href=&#34;https://github.com/official-pikafish/Networks&#34;&gt;official-pikafish/Networks&lt;/a&gt;下载到以外，其他版本的nnue文件是没有官方途经可下载的（official-pikafish/Networks中只有一个release，但每当有新的nnue，作者就会更新这个release并删掉旧的文件，理由不明）。你需要把引擎文件和nnue文件放到同一个目录，两者的文件名最好相同（例如pikafish和pikafish.nnue）以便自动调用。&lt;/p&gt;
&lt;p&gt;　　Pikafish不支持CECP协议，你需要使用&lt;a href=&#34;https://www.chessprogramming.org/UCI2WB&#34;&gt;&lt;code&gt;uci2wb&lt;/code&gt;&lt;/a&gt;(意思是UCI to Winboard)程序来转换。关于uci2wb的介绍到处都有，但是源码和二进制程序有一点难找……&lt;a href=&#34;http://hgm.nubati.net/cgi-bin/gitweb.cgi&#34;&gt;作者网站上的源码&lt;/a&gt;打不开，有人提供了一份可能不是最新的源码在&lt;a href=&#34;https://github.com/ianfab/uci2wb&#34;&gt;ianfab/uci2wb&lt;/a&gt;，我是从&lt;a href=&#34;https://packages.ubuntu.com/noble/uci2wb&#34;&gt;Ubuntu的包&lt;/a&gt;里面获得二进制程序的。在XBoard中这样设置引擎：&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;&amp;#34;Pikafish&amp;#34; /variant&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;xiangqi -fcp &amp;#34;./uci2wb ./pikafish-bmi2&amp;#34; -fd &amp;#34;/home/you/xboard/pikafish&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　也许你觉得XBoard有个-fUCI参数，加载引擎的界面上也可以选UCI，不是能直接用么？实际上这个参数会调用比uci2wb更古老的一个转换器polyglot，而它和uci2wb一样不是XBoard自带的，需要去找，还不如直接用uci2wb，因此上面的设置实际上等价于&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;na&#34;&gt;&amp;#34;Pikafish&amp;#34; /variant&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;s&#34;&gt;xiangqi -fUCI -adapterCommand &amp;#34;./uci2wb ./pikafish-bmi2 &amp;#34;%fd&amp;#34;&amp;#34; -fd &amp;#34;/home/you/xboard/pikafish&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;　　uci2wb这个协议转换器带来一个重要的问题：XBoard与Pikafish连用时，无法支持残局，使用残局开局会崩溃跳出。个人推测可能是uci2wb并没有把初始局面正确告知引擎，技术水平有限无法分析代码，只能猜测了。&lt;/p&gt;
&lt;h3 id=&#34;ligroundfairy-stockfish&#34;&gt;
    &lt;a href=&#34;#ligroundfairy-stockfish&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    Liground+Fairy-Stockfish
&lt;/h3&gt;
&lt;p&gt;　　Liground内置了三个引擎（包含了某个版本的Fairy-Stockfish，所以你不下载引擎也可以），你可以把自己下载的Fairy-Stockfish放到&lt;code&gt;./resources/engines/&lt;/code&gt;目录下去替换相应文件。
　　在界面中，左边选择棋盘和棋子的样式，右上区域的下拉框选择&lt;code&gt;Xiangqi&lt;/code&gt;，然后引擎的下拉框就只有支持中国象棋的引擎可选了。你可以通过界面上的FEN栏来编辑局面。界面上打开PVE开关，并且把引擎后面的启用开关也打开，就可以与AI对弈了。可惜的是，Liground并不支持两个引擎对弈，虽然可以添加和删除引擎，但多个引擎只会对下一步的可能性进行分析，并不会行棋。
　　&lt;/p&gt;
&lt;h3 id=&#34;ligroundpikafish&#34;&gt;
    &lt;a href=&#34;#ligroundpikafish&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    Liground+Pikafish
&lt;/h3&gt;
&lt;p&gt;　　这是最麻烦的一套组合，因为Pikafish虽然支持UCI协议，但棋盘编号、UCI option等方面与Liground并不兼容。根据&lt;a href=&#34;https://github.com/ml-research/liground/issues/261&#34;&gt;Liground&lt;/a&gt;和&lt;a href=&#34;https://github.com/official-pikafish/Pikafish/issues/40&#34;&gt;Pikafish&lt;/a&gt;两边的issue，你需要使用修改了代码的Pikafish。&lt;a href=&#34;https://github.com/mtaktikos/Pikafish/tree/liground-compatible&#34;&gt;mtaktikos/Pikafish&lt;/a&gt;是一个修改后的230216版，但是你很可能没法找到230216版Pikafish对应的nnue文件……所以我根据mtaktikos的工作照抄了一个231203版的，在&lt;a href=&#34;https://github.com/williamgateszhao/Pikafish/tree/liground&#34;&gt;williamgateszhao/Pikafish&lt;/a&gt;，release中附上了231203版Pikafish对应的nnue文件。&lt;/p&gt;
&lt;h2 id=&#34;结论&#34;&gt;
    &lt;a href=&#34;#%e7%bb%93%e8%ae%ba&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    结论
&lt;/h2&gt;
&lt;p&gt;　　完全使用开源方案跑中国象棋还挺麻烦的……这可能和中文软件开发的恶劣环境有关，我不想多说。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;如果你只是想和轻易碾压你的AI下棋，你可以使用以上四种组合中的任意一种，其中Liground+Fairy-Stockfish可能是相对简单的方案。&lt;/li&gt;
&lt;li&gt;如果你想使用残局与AI对弈，你可以选XBoard+Fairy-Stockfish，Liground+Pikafish或Liground+Fairy-Stockfish。&lt;/li&gt;
&lt;li&gt;如果你想让两个AI对弈，你可以用XBoard+Pikafish或XBoard+Fairy-Stockfish。使用不同版本的引擎，让他们对弈也挺有乐趣的，也许还能学习一下走法。&lt;/li&gt;
&lt;li&gt;如果你想使用残局让两个AI对弈，你只能使用XBoard+Fairy-Stockfish。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　本文没涉及到的部分包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;XBoard有可能崩溃，除了本文提到的先载入Pikafish再载入Fairy-Stockfish（哪怕你只想载入后者）的技巧之外，还可能有其他情况、其他解决方案，请自行摸索。&lt;/li&gt;
&lt;li&gt;Pikafish和Fairy-Stockfish引擎本身都有一些选项可以调整，我也没有形成经验，就不胡说了，你可以看他们各自的wiki自行摸索。&lt;/li&gt;
&lt;li&gt;Pikafish制定了一个“&lt;a href=&#34;https://pikafish.org/rule.pdf&#34;&gt;中国象棋程序竞赛规则&lt;/a&gt;”，这个规则和人类竞赛规则并不完全一样，越新版本的Pikafish越向这个规则靠拢，或者说逐步取消了一些符合人类竞赛规则的选项。这会导致其他引擎觉得合法的走法Pikafish认为是禁手，或者反过来Pikafish认为是合法的走法被XBoard认为是禁手（对于后一种情况也许可以调整XBoard的&lt;code&gt;Adjudications&lt;/code&gt;界面中的选项），我的象棋水平太差没法具体分析，请自行摸索&lt;/li&gt;
&lt;li&gt;通过不同的时间限制，也许可以让AI对弈更有趣，但引擎似乎不完全遵守时间限制（按照引擎公开的测试数据，它们应该是遵守的才对），可能是协议或界面的问题，请自行研究。&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>使用whisper生成字幕的经验备忘</title>
      <link>https://blog.williamgates.net/2024/04/use-whisper-to-generate-subtitles/</link>
      <pubDate>Fri, 26 Apr 2024 21:56:00 +0800</pubDate>
      
      <guid>https://blog.williamgates.net/2024/04/use-whisper-to-generate-subtitles/</guid>
      <description>&lt;p&gt;　　&lt;a href=&#34;https://huggingface.co/openai/whisper-large-v3&#34;&gt;whisper&lt;/a&gt;是openai发布的模型，主要用于语音转写。我最近尝试了用它来听写并生成字幕，主要的需求显然是文字准确，不漏记也不多记（多记显然更不能接受，下文会提到幻觉问题）；次要的需求是：每行字幕不应该太长，字幕时间戳应该尽量准确。本文是截至2024年4月的一些知识和经验备忘，是一篇“综述”，不是一篇详尽的教程。本文中对参数的解释大多基于作者给出的解释或本人对相关工具代码的阅读和理解，但对参数调整的意见就纯粹基于个人的感觉了，不一定有科学依据。&lt;/p&gt;
&lt;h2 id=&#34;相关术语&#34;&gt;
    &lt;a href=&#34;#%e7%9b%b8%e5%85%b3%e6%9c%af%e8%af%ad&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    相关术语
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;ASR&lt;/code&gt;, Automatic Speech Recognition, also known as Speech To Text (STT), refers to the problem of automatically transcribing spoken language, 这解释来自&lt;a href=&#34;https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/asr/intro.html&#34;&gt;Nvidia&lt;/a&gt;。我们在使用whisper的过程中，主要使用的就是ASR功能。在具体的工具中，该部分任务或功能一般被称为&lt;code&gt;transcribe&lt;/code&gt;。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;VAD&lt;/code&gt;, Voice Activity Detection, 检测语音（或者说反过来，检测非语音），标出语音部分供模型进行下一步推理。个人认为第三方工具针对whisper的增强主要体现在推理速度和VAD两方面，我们几乎所有的参数调整也集中针对于VAD。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Hallucination&lt;/code&gt;, the experience of seeing, hearing, feeling, or smelling something that does not exist, 用过chatGPT的你应该很熟悉了，幻觉就是模型在一本正经地胡说八道。在ASR用途的模型中，幻觉主要体现为转写了根本不存在的语句，而不是字词意义上的识别错误。正因为这样，幻觉在生成字幕的任务中危害非常大，因为字词错误观众可以推测、可以忽略，完全不存在的台词则严重影响对内容的理解。whisper最常出现的典型幻觉是，它会在字幕的结尾加上“谢谢观看”或者类似意思的语句。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;Beam search&lt;/code&gt;, a heuristic search algorithm that explores a graph by expanding the most promising node in a limited set, 这解释来自&lt;a href=&#34;https://en.wikipedia.org/wiki/Beam_search&#34;&gt;维基百科&lt;/a&gt;。在whisper的使用中，有两种设置路径：一种是使用whisper的&lt;code&gt;beam_size&lt;/code&gt;和&lt;code&gt;patience&lt;/code&gt;等参数来进行beam search，另一种是使用&lt;code&gt;temperature&lt;/code&gt; &lt;code&gt;best_of&lt;/code&gt; &lt;code&gt;compression_ratio_threshold&lt;/code&gt;和&lt;code&gt;log_prob_threshold&lt;/code&gt;等参数来进行取样。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;diarization&lt;/code&gt;, Speaker diarization is the process of segmenting audio recordings by speaker labels and aims to answer the question “who spoke when?”, 还是来自&lt;a href=&#34;https://docs.nvidia.com/nemo-framework/user-guide/latest/nemotoolkit/asr/speaker_diarization/intro.html&#34;&gt;Nvidia&lt;/a&gt;的解释。whisper模型没有这个功能，各种工具都承认他们自己的实现不能算完美。理论上这能实现更准确的字幕断句，但本身并不是生成字幕的强需求，我没有深入研究。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;WER&lt;/code&gt;, word error rates, ASR模型的能力相对比较容易考核，这就是最常用的指标，另一个常用的指标是&lt;code&gt;CER&lt;/code&gt;即character error rates）。&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;模型&#34;&gt;
    &lt;a href=&#34;#%e6%a8%a1%e5%9e%8b&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    模型
&lt;/h2&gt;
&lt;p&gt;　　openai官方提供了各种大小的模型，就我们非实时生成字幕的用途来说，只有large模型有意义（最新的是large-v3）。&lt;/p&gt;
&lt;p&gt;　　huggingface上有很多在whisper基础上调优的模型，我尝试下来日语的&lt;a href=&#34;https://huggingface.co/clu-ling/whisper-large-v2-japanese-5k-steps&#34;&gt;clu-ling/whisper-large-v2-japanese-5k-steps&lt;/a&gt;还不错，但记得基于CTranslate2的推理工具需要转换后的CT2模型，&lt;a href=&#34;https://huggingface.co/zh-plus/faster-whisper-large-v2-japanese-5k-steps&#34;&gt;有人帮你做好了&lt;/a&gt;。这个模型的缺陷是在某些情况下转写内容可能缺少标点符号，本文的速度测试中的样本在某些推理工具中就会这样，暂时不知道原因。另一个日语模型&lt;a href=&#34;https://huggingface.co/vumichien/whisper-large-v2-mix-jp&#34;&gt;vumichien/whisper-large-v2-mix-jp&lt;/a&gt;就会有标点。&lt;/p&gt;
&lt;p&gt;　　作为字幕，我们希望转写文本既准确又简短，要注意不同的模型在推理工具相同的参数下转写的长度不同，这里不是指遣词造句的风格不同导致句子长度不同，而是换行（换一条新字幕）的频率不同。虽然这一点和下文提到的VAD关系最大，但根据我的经验，模型也会有影响。&lt;/p&gt;
&lt;h2 id=&#34;推理工具&#34;&gt;
    &lt;a href=&#34;#%e6%8e%a8%e7%90%86%e5%b7%a5%e5%85%b7&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    推理工具
&lt;/h2&gt;
&lt;p&gt;　　以下工具全都可以顺利在WSL2中运行，记得如果你需要在WSL2中安装cuda-tools或cudnn之类的玩意，请遵守&lt;a href=&#34;https://docs.nvidia.com/cuda/wsl-user-guide/index.html&#34;&gt;Nvidia的指导&lt;/a&gt;，简单来说就是不要安装linux驱动（WSL2里面的显卡驱动是windows驱动提供的），安装那些不含驱动的包就好，建议用conda来做这些工作。&lt;/p&gt;
&lt;h3 id=&#34;官方工具-openaiwhisper&#34;&gt;
    &lt;a href=&#34;#%e5%ae%98%e6%96%b9%e5%b7%a5%e5%85%b7-openaiwhisper&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    官方工具 openai/whisper
&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/openai/whisper&#34;&gt;openai/whisper&lt;/a&gt;是openai官方提供的工具，按照官方的介绍以及&lt;code&gt;no_speech_threshold&lt;/code&gt;这个参数，这个工具会使用whisper自己的VAD功能，个人觉得跟下文中的第三方工具使用的VAD方法而言，只能说聊胜于无（第三方工具几乎全都引入了自己的VAD，说明他们也是这么想的）。这个工具不能调用非官方的whisper模型，推理速度也没有任何优势。&lt;/p&gt;
&lt;h3 id=&#34;主流后端-systranfaster-whisper-及其命令行套壳-softcatalawhisper-ctranslate2&#34;&gt;
    &lt;a href=&#34;#%e4%b8%bb%e6%b5%81%e5%90%8e%e7%ab%af-systranfaster-whisper-%e5%8f%8a%e5%85%b6%e5%91%bd%e4%bb%a4%e8%a1%8c%e5%a5%97%e5%a3%b3-softcatalawhisper-ctranslate2&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    主流后端 SYSTRAN/faster-whisper 及其命令行套壳 Softcatala/whisper-ctranslate2
&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/SYSTRAN/faster-whisper&#34;&gt;SYSTRAN/faster-whisper&lt;/a&gt;是很主流的whisper推理工具，它不仅不提供图形界面，而且也不提供命令行接口，只能作为一个Python库被调用，幸好有人做了一个命令行套壳&lt;a href=&#34;https://github.com/Softcatala/whisper-ctranslate2&#34;&gt;Softcatala/whisper-ctranslate2&lt;/a&gt;，节省很多工作量。faster-whisper的重要优势在于：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;使用了第三方VAD方案&lt;a href=&#34;https://github.com/snakers4/silero-vad&#34;&gt;silero-vad&lt;/a&gt;,效果明显、可调参数多（部分不是silero-vad的参数，而是faster-whisper给VAD功能添加的参数，下文会提到，很有用处）。通过VAD将音频提前切断，只将语音部分提供给whisper做转写，大幅度降低了whisper的幻觉，（在某些情况下大幅度）提高了转写的速度。&lt;/li&gt;
&lt;li&gt;可以加载非官方whisper模型，有些基于whisper调优的模型对特定语言的转写能力提升很大。&lt;/li&gt;
&lt;li&gt;使用&lt;a href=&#34;https://github.com/OpenNMT/CTranslate2/&#34;&gt;CTranslate2&lt;/a&gt;进行推理,推理速度明显快（数倍）于官方工具。但是需要使用兼容CTranslate2的模型，hugging face上标为ct2的模型就是这类，其他模型也可以通过脚本转换为ct2模型。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　我个人主要使用的就是Softcatala/whisper-ctranslate2，需要注意的参数主要包括（未特别说明独有的参数，在官方工具中也有）：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;length_penalty&lt;/code&gt;, 这是whisper模型提供的参数，并不硬性对单行字幕长度产生影响，只会在推理时更倾向于选择产生较短的句子，影响转写质量，不建议修改。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no_speech_threshold&lt;/code&gt;, whisper自己的VAD设置，值越低，越偏向于认定一段声音为沉默（即不是语音）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;word_timestamps&lt;/code&gt;, 是否提供基于词的时间戳，这个选项实际上不会导致输出的字幕文件是每行一个词的，只是在推理过程中对词标出了时间戳，生成字幕文件的时候还是会合并成每行一句话，这有利于控制单行字幕长度，也可以用于在字幕中标出当前发音的词。但是whisper提供的时间戳实际上是不准的，下文会提到。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;repetition_penalty&lt;/code&gt;, 软性要求whisper在推理时降低重复，个人感觉不是很好用，设置为1.2以上的时候有效果，但会影响转写内容（即使不存在重复，语句内容也会随着这个参数而发生变化）。这是ctranslate2的功能，不是whisper模型实现的，当然在官方工具中也就没有这个参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;no_repeat_ngram_size&lt;/code&gt;, 在一行结果中没有重复的如此规模的“语丝”，按理说在设为2的时候应该不会出现任何重复的字/词，但实际上效果并不理想，个人觉得不是很好用，且会影响转写内容，建议自己尝试效果。这是ctranslate2的功能，不是whisper模型实现的，官方工具不包含这个参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;max_words_per_line&lt;/code&gt;, 基于上述对每个词打时间戳的功能，可以限制每行字幕的长度，这不是whisper提供的功能，是推理工具在写入字幕文件时进行的处理。但是whisper-ctranslate2和官方工具一样，实现的方法非常粗暴，就是严格按照词数截断字幕，不能按照标点或空格合理截断。&lt;a href=&#34;https://github.com/Softcatala/whisper-ctranslate2/pull/78&#34;&gt;有个PR&lt;/a&gt;试图在一定程度上解决这个问题，但还没有被合并。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vad_threshold&lt;/code&gt;, 这是faster-whisper自带的silero-vad的参数，官方工具没有。这个值越高，越偏向于认定一段声音为沉默（与&lt;code&gt;no_speech_threshold&lt;/code&gt;的方向相反）。对于字正腔圆的样本（例如新闻或动漫），建议设为默认的0.5；对于偏向生活化、口语化的样本，建议设为0.4乃至0.35（更低也可以尝试）。由于这个VAD工作于whisper推理之前，所以这个值越高，判断出的沉默越多、语音越少，whisper的工作内容越少、推理速度越快。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vad_min_speech_duration_ms&lt;/code&gt;, 硬性抛弃短于多少时间的片段，即使VAD认为它是语音。这不是whisper实现的功能，是推理工具检查VAD结果时进行的处理。如果样本中有大量短促无意义的语音或类似于语音的声音，不想让它们毫无意义地出现在字幕中，这个功能非常有用。faster-whisper和whisper-ctranslate2暴露了这个参数，其他工具大多没有这个参数（没有进行这样的处理，或者硬编码了一个作者喜欢的值）。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vad_max_speech_duration_s&lt;/code&gt;, 规定交给whipser的一段语音的最大长度，有助于减少字幕中出现过长的句子。考虑到上述&lt;code&gt;max_words_per_line&lt;/code&gt;参数非常粗暴从而用途有限，这个参数挺有用的。我尝试使用faster-whisper的&lt;code&gt;chunk_length&lt;/code&gt;参数（硬性决定交给whisper的分段长度），但结果是导致了转写结果完全不正确；我尝试将faster-whisper的&lt;code&gt;vad_speech_pad_ms&lt;/code&gt;参数设置成0，也没有取得类似于whisperX的效果（完全没有效果）。因此基于vad的这个参数是非常有必要的。这也是官方工具没有的参数。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vad_min_silence_duration_ms&lt;/code&gt;, 硬性规定短于多少时间的沉默不会被切除，即使VAD认为它是沉默。这同样不是whisper的功能，是推理工具进行的处理，对于长句过多的结果，将这个值设为0有奇效（只要喘气就算一段新的语音，降低输入whisper模型的segment长度）。官方工具显然不会有这个参数。&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;超快工具-m-bainwhisperx&#34;&gt;
    &lt;a href=&#34;#%e8%b6%85%e5%bf%ab%e5%b7%a5%e5%85%b7-m-bainwhisperx&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    超快工具 m-bain/whisperX
&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/m-bain/whisperX&#34;&gt;m-bain/whisperX&lt;/a&gt;这个工具标榜自己的快，虽然其使用faster-whisper作为后端，但它并不是纯粹的faster-whisper套壳。它用有点奇怪的方法实现了单个音频样本的分片批量处理（让faster-whisper社区&lt;a href=&#34;https://github.com/SYSTRAN/faster-whisper/issues/59&#34;&gt;感到困惑&lt;/a&gt;）；由于批量处理，不能在转写过程中显示结果，只能以百分比方式显示进度；由于批量处理，它不适合打开&lt;code&gt;condition_on_prev_text&lt;/code&gt;参数，因此可能降低转写内容的稳定性。它虽然使用了faster-whisper，但不使用faster-whisper的VAD功能，而是使用了作者提供的VAD模型（实际上可能是&lt;a href=&#34;https://huggingface.co/pyannote/segmentation&#34;&gt;pyannote/segmentation&lt;/a&gt;），这个模型比faster-whisper的VAD模型大差不多10倍，可能效果也更好（实测是的）。它在whisper之外，引入facebook的&lt;a href=&#34;https://huggingface.co/facebook/wav2vec2-large-960h-lv60-self&#34;&gt;wav2vec&lt;/a&gt;用来辅助生成精确的时间戳，但这功能只能在部分主流语言上实现（因为需要对应语言的wav2vec模型，第三方调优的也可以），而且对数字的处理不佳。因为它它暴露的VAD参数很少，特别是推理工具实现而非模型实现的那些参数（例如faster-whisper的&lt;code&gt;vad_min_speech_duration_ms&lt;/code&gt;）；即使是暴露的那些参数，也并不是在VAD流程的每个阶段都使用用户指定的值，有些阶段是硬编码的。总而言之，这个项目的速度确实是优势（虽然在我们的测试中不明显，更长的、VAD不容易处理好的样本会明显得多，特别是保持&lt;code&gt;chunk_size&lt;/code&gt;为默认值而不在乎出现长句的情况下，速度数倍于faster-whisper是很正常的），但其代码质量不太好评价。&lt;/p&gt;
&lt;p&gt;　　我使用该工具较少，可以介绍的参数主要包括：&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;vad_onset&lt;/code&gt;, 基本等于faster-whisper的&lt;code&gt;vad_threshold&lt;/code&gt;，但两者VAD模型不同，数值需要自己摸索。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;vad_offset&lt;/code&gt;, 猜测等于faster-whisper中的&lt;code&gt;neg_threshold&lt;/code&gt;（代码中的变量，没有暴露为命令行参数），faster-whisper硬编码为&lt;code&gt;vad_threshold&lt;/code&gt;减去0.15，whisperX的默认值是&lt;code&gt;vad_onset&lt;/code&gt;减去0.137。&lt;/li&gt;
&lt;li&gt;&lt;code&gt;chunk_size&lt;/code&gt;, 这个参数不是提供给faster-whisper的&lt;code&gt;chunk_length&lt;/code&gt;, 而是提供给VAD的，类似于whisper-ctranslate2的&lt;code&gt;vad_max_speech_duration_s&lt;/code&gt;, 但降低长句的效果比whisper-ctranslate2好得多，可能得益于更好的VAD模型或更好的处理方式（winsperX的作者的&lt;a href=&#34;https://arxiv.org/abs/2303.00747&#34;&gt;论文&lt;/a&gt;中有关于这个&lt;code&gt;VAD Cut &amp;amp; Merge&lt;/code&gt;的描述)&lt;/li&gt;
&lt;/ul&gt;
&lt;h3 id=&#34;精确时间轴-linto-aiwhisper-timestamped&#34;&gt;
    &lt;a href=&#34;#%e7%b2%be%e7%a1%ae%e6%97%b6%e9%97%b4%e8%bd%b4-linto-aiwhisper-timestamped&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    精确时间轴 linto-ai/whisper-timestamped
&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/linto-ai/whisper-timestamped&#34;&gt;linto-ai/whisper-timestamped&lt;/a&gt;介绍了whisper为什么不能提供准确的时间戳，也介绍了其他提供准确时间戳方案的局限性（主要是whisperX使用wav2vec的方案），强调自己能够在不借助辅助模型的情况下实现精准时间戳，我觉得这个项目的README价值比工具更大。它提供三种不同的VAD方案供选择，但没有暴露任何VAD参数。它可以使用第三方模型，但不要被他的说明骗了，使用第三方模型不需要加&lt;code&gt;--backend transformers&lt;/code&gt;参数（加了跑不起来）。我没有测试过其时间戳是否真的比别的工具精准，你可以自己试试看。它不是一个基于faster-whisper的工具，意味着它的速度不会是优势。&lt;/p&gt;
&lt;h3 id=&#34;ggerganovwhispercpp&#34;&gt;
    &lt;a href=&#34;#ggerganovwhispercpp&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    ggerganov/whisper.cpp
&lt;/h3&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/ggerganov/whisper.cpp&#34;&gt;whisper.cpp&lt;/a&gt;是另一个主流工具（31.1K star），设计之初致力于在CPU上高效推理，没看出其在GPU上有特殊优势，而且没有附加的VAD功能，因此我没有实际用过，你可以试试看。&lt;/p&gt;
&lt;h3 id=&#34;速度测试&#34;&gt;
    &lt;a href=&#34;#%e9%80%9f%e5%ba%a6%e6%b5%8b%e8%af%95&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    速度测试
&lt;/h3&gt;
&lt;p&gt;　　使用的样本是&lt;code&gt;[SFEO-Raws] Koimonogatari - 01 (BD 720P x264 10bit AACx2)[9369B674].mp4&lt;/code&gt;即恋物语第一集的音频，长度为26m34s，转换为16000hz的wav（这对于VAD很重要，因为VAD模型大多是基于8K和16Khz训练的）。所有的运行时间都是time命令的real项。&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;以下各行的命令分别为：
&lt;/code&gt;&lt;/pre&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisperx --model whisper-large-v2-japanese --device cuda --output_format srt --language ja --vad_onset 0.5 --vad_offset 0.35 --no_speech_threshold 0.3 --print_progress True output.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisperx --model whisper-large-v2-japanese --device cuda --output_format srt --language ja --vad_onset 0.5 --vad_offset 0.35 --chunk_size &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --no_speech_threshold 0.3 --print_progress True output.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisper-ctranslate2 --device cuda --compute_type float16 --model_directory ./whisper-large-v2-japanese --language ja --local_files_only &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --output_format srt --word_timestamps &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --hallucination_silence_threshold &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; --beam_size &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; --vad_filter &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --vad_threshold 0.5 --vad_min_silence_duration_ms &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; --vad_min_speech_duration_ms &lt;span class=&#34;m&#34;&gt;100&lt;/span&gt; --vad_max_speech_duration_s &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --no_speech_threshold 0.3 output.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisper-ctranslate2 --device cuda --compute_type float16 --model_directory ./whisper-large-v2-japanese --language ja --local_files_only &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --output_format srt --word_timestamps &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --hallucination_silence_threshold &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; --beam_size &lt;span class=&#34;m&#34;&gt;5&lt;/span&gt; --vad_filter &lt;span class=&#34;nb&#34;&gt;true&lt;/span&gt; --vad_threshold 0.5 --vad_min_silence_duration_ms &lt;span class=&#34;m&#34;&gt;0&lt;/span&gt; --vad_max_speech_duration_s &lt;span class=&#34;m&#34;&gt;10&lt;/span&gt; --no_speech_threshold 0.3 output.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisper_timestamped --model clu-ling/whisper-large-v2-japanese-5k-steps --device cuda --output_dir . --output_format srt --language ja --vad True --no_speech_threshold 0.3 --verbose True --accurate
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;whisper_timestamped --model clu-ling/whisper-large-v2-japanese-5k-steps --device cuda --output_dir . --output_format srt --language ja --vad silero:3.1 --no_speech_threshold 0.3 --verbose True --accurate output.wav
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;序号&lt;/th&gt;
          &lt;th&gt;工具&lt;/th&gt;
          &lt;th&gt;时间&lt;/th&gt;
          &lt;th&gt;字幕条数&lt;/th&gt;
          &lt;th&gt;备注&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;0&lt;/td&gt;
          &lt;td&gt;whisperX&lt;/td&gt;
          &lt;td&gt;1m21.291s&lt;/td&gt;
          &lt;td&gt;57&lt;/td&gt;
          &lt;td&gt;全是长句，但速度确实快&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;1&lt;/td&gt;
          &lt;td&gt;whisperX&lt;/td&gt;
          &lt;td&gt;1m32.823s&lt;/td&gt;
          &lt;td&gt;176&lt;/td&gt;
          &lt;td&gt;句子普遍较短，可能得益于更好的VAD模型，但有些句子反而非常长&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;2&lt;/td&gt;
          &lt;td&gt;whisper-ctranslate2&lt;/td&gt;
          &lt;td&gt;3m6.634s&lt;/td&gt;
          &lt;td&gt;241&lt;/td&gt;
          &lt;td&gt;句子长短与上一栏相比各有千秋，效果均不完美&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;3&lt;/td&gt;
          &lt;td&gt;whisper-ctranslate2&lt;/td&gt;
          &lt;td&gt;3m7.070s&lt;/td&gt;
          &lt;td&gt;184&lt;/td&gt;
          &lt;td&gt;可能是物语系列讲话太疯狂的原因，去掉&lt;code&gt;vad_min_speech_duration_ms&lt;/code&gt;会加强转写准确性，但长句更多了……&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;4&lt;/td&gt;
          &lt;td&gt;whisper_timestamped&lt;/td&gt;
          &lt;td&gt;14m59.857s&lt;/td&gt;
          &lt;td&gt;207&lt;/td&gt;
          &lt;td&gt;看到这感人的时间了吧，另外结果中的长句和准确性都不太理想，可能是我没有充分调试&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;5&lt;/td&gt;
          &lt;td&gt;whisper_timestamped&lt;/td&gt;
          &lt;td&gt;12m35.261s&lt;/td&gt;
          &lt;td&gt;208&lt;/td&gt;
          &lt;td&gt;换了vad速度快一点，句子长度也好一点&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;字幕翻译及其他后处理&#34;&gt;
    &lt;a href=&#34;#%e5%ad%97%e5%b9%95%e7%bf%bb%e8%af%91%e5%8f%8a%e5%85%b6%e4%bb%96%e5%90%8e%e5%a4%84%e7%90%86&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    字幕翻译及其他后处理
&lt;/h2&gt;
&lt;p&gt;　　对于减少字幕中长句的需求，目前看来最好的方法不是在上面提到的工具中折腾chunk的长度，而是直接用非常短的字词长度硬性截断字幕（使用&lt;code&gt;max_words_per_line&lt;/code&gt;之类的参数），再通过对字幕文件进行后处理，将字幕按照标点、空格等分隔符拼接起来。根据whisper的工作原理，这个行为不能反过来——后处理的时候不知道每个字词的时间戳，因此不能生成长句再拆分。但这条路还没有走通，虽然有人做了&lt;a href=&#34;https://github.com/zj1123581321/Adjust_SubTitle&#34;&gt;类似思路的小工具&lt;/a&gt;，但他的设计目的是合并过短的字幕，通过初步阅读代码，我觉得简单修改这个工具也达不成我们的目的。&lt;/p&gt;
&lt;p&gt;　　对于字幕的翻译，一股脑发给AI的效果会很差，AI还会评价剧情甚至因为（它认为的）色情暴力之类而拒绝翻译。因此一股脑丢给google翻译/deepl之类的翻译引擎可能是比较简单的选择，而一句句发给AI可能是效果较好的方案。我还没有找到最合适的工具。&lt;/p&gt;
&lt;p&gt;　　可能会尝试自己写一个工具来做以上这两件事，就不在本文中介绍了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>请你勇敢地伸出手</title>
      <link>https://blog.williamgates.net/2014/05/fight_for_happiness/</link>
      <pubDate>Mon, 19 May 2014 21:55:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2014/05/fight_for_happiness/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/fight_for_happiness.png&#34; alt=&#34;fight_for_happiness&#34;  width=500 height=&#34;649&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　是的，我就是你们所嘲笑的脑残，自掏腰包去看一个60后写的80后的青春故事，然后哭得睁不开眼。&lt;br&gt;
　　是的，我就是你们所不齿的傻瓜，看一个破绽百出的、虚构的故事，然后试图从中矫情地“缅怀”自己的青春。&lt;br&gt;
　　是的，这片子剧情上的硬伤实在让人出戏，且不谈文科生为什么读计算机系，也不说为什么女神最终总要嫁一个势利的土豪，最大的硬伤显然来自——如同豆瓣上某位提到的——作为60后的高胖子，认为出国是非常牛逼、非常困难的一件事，出了国混好了必然不回来，混惨了必然不好意思回来，断然不存在回国发展的可能性。&lt;br&gt;
　　这个硬伤如此之大以至于几乎所有人都在纠结为什么申请不了斯坦福不能申请别的学校、为什么两次被拒签就不能去美国、为什么男主去了美国女主就不舍得把他叫回来、为什么男主十年都不肯回国看看等一系列问题，归结起来无非一个问题——遇到这点挫折你就放弃了？这样就是尝试了所有方法了？这点小事就让你们十年的恋情莫名其妙地消失了？&lt;/p&gt;
&lt;p&gt;　　是的，纵然剧情编排有硬伤，但核心思想是不变的，高晓松想告诉我们的显然就是——错过，往往不需要生离死别的理由，往往不需要毁天灭地的阻碍，人生很多重大决定往往就是小事推动的，青春的荒唐往往不是败在光明顶，而是阴沟里翻船。&lt;br&gt;
　　你选择初恋对象，真的是因为她是最温柔、最漂亮的么？你选择文理分班、选择专业，真的是因为你更喜欢、更擅长么？你选择出国、读研、工作、创业，真的是深思熟虑后的结果么？人生的选择，其实很多时候只是一念之间，回望时连自己都说服不了自己。&lt;br&gt;
　　青春就是这么扯淡，青春就是这么飞快地掠过，毅然决然地留给你永无止尽的悔恨。&lt;/p&gt;
&lt;p&gt;　　而我想借题发挥的是，既然青春有无数的选项，既然这些选项最终必然会让你后悔，为什么不主动一点、勇敢一点，在选择的时候直面自己的本心呢？&lt;br&gt;
　　那个第一次见面就表白的男孩呢？那个把女同学扛在肩上上学的男生呢？那个为了同桌被打得鼻青脸肿的小流氓呢？那个看了新闻就冲到大使馆抗议的愤青呢？那个在千禧夜去抢别人的相机的疯子呢？那个为了一见钟情的女孩，可以转班、可以发奋、可以苦读出国的傻瓜呢？当十年的恋情终于进入一帆风顺，到了美国的你就因为一通电话而被踹了，你就没有胆量飞回国问问到底是怎么回事么？当从小钟情的女生、毁了你一辈子的女人在教堂里说“我愿意”的时候，你就没有胆量上前说“我不同意”么？&lt;br&gt;
　　那个因为吃醋而逞强摔伤的小女孩呢？那个从愤怒的人海中把男生拽回来的女生呢？那个敢于为了男孩而选择厦大的优等生呢？那个敢于在破碎的窗前拉起男孩的女汉子呢？当十年的梦想遇到了挫折，你就没有胆量说给你相处十年的恋人听么？你就没有胆量询问男孩能否再一次为了你而改变人生轨迹么？你就没有没有胆量像十年前一样，牵起男孩的手，一起逃跑么？&lt;br&gt;
　　女孩塑造了男孩的青春历程，却觉得柔弱的自己无权去破坏男孩的飞黄腾达；男孩按照女孩的梦想活过了二十年，却觉得自己没有资格再去牵起女孩的手。&lt;br&gt;
　　一切都源自于自我摧残式的利他之心，一切都源自于不肯说出自己本心的自卑与胆怯。&lt;br&gt;
　　过度为别人着想，也许是对双方共同的一种犯罪。&lt;br&gt;
　　青春的爱情应该自私，应该表达，应该将想法传达给那个你想与其共度一生的人。&lt;/p&gt;
&lt;p&gt;　　高某人也许想说的是，青春就是这样，一句话没来得及说出，就永久地擦肩而过。而我想说，也许只有勇敢地伸出手，才有可能获取你自己的幸福，至少让你在回忆起青春的荒唐历程时，能像《同桌的你》所唱的那样怀着淡淡的青涩，而不是浓浓的心酸。&lt;/p&gt;
&lt;p&gt;　　豆瓣上怒骂的人群中，有人说这部电影毁了高晓松的经典之作，但我私以为这部片子叫《青春无悔》也许更加合适。你应该先去听一听《青春无悔》这张专辑，然后也许你会意识到你欠这位大叔一个好评。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;是谁的声音  唱我们的歌&lt;br&gt;
是谁的琴弦  撩我的心弦&lt;br&gt;
你走后依旧的街  总有青春依旧的歌&lt;br&gt;
总是有人不断重演  我们的事&lt;br&gt;
都说是青春无悔  包含所有的爱恋&lt;br&gt;
都还在纷纷说着  相许终生的誓言&lt;br&gt;
都说亲爱的  亲爱永远  都是年轻如你的脸&lt;br&gt;
含笑的  带泪的  不变的眼&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　也许高晓松心目中真正的青春故事是这样的歌词，是比“我也是偶然翻相片 才想起同桌的你”更加伤感、更加沉静、更多嗟叹而更少缅怀的，因为他明白青春就是这样不清不楚、就是这样莫名其妙、就是这样无可救药地奔向懊悔和错过。&lt;br&gt;
　　而我想说，即使青春不可能无悔，也不要忘记勇敢地伸出你的手。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>不再依赖Google Reader的Kindle Reader</title>
      <link>https://blog.williamgates.net/2013/04/kindle-reader-without-google-reader/</link>
      <pubDate>Tue, 16 Apr 2013 11:05:15 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2013/04/kindle-reader-without-google-reader/</guid>
      <description>&lt;p&gt;　　&lt;a href=&#34;https://github.com/jiedan/kindlereader/&#34;&gt;Kindle Reader&lt;/a&gt;是一个自动将Google Reader内容生成mobi文件并通过邮件发送至kindle的工具，由&lt;a href=&#34;https://github.com/jiedan&#34;&gt;jieban&lt;/a&gt;开发。由于Google Reader即将关闭，所以我对其进行了一些修改，让程序从配置文件读取RSS地址并直接访问内容，不通过Google Reader的API，从而不再依赖Google的服务。&lt;br&gt;
　　感谢&lt;a href=&#34;https://github.com/jiedan&#34;&gt;jieban&lt;/a&gt;迅速接受了我的Pull Request，本文中的程序已经被合并到主分支。欢迎有兴趣的朋友到Github的&lt;a href=&#34;https://github.com/jiedan/kindlereader&#34;&gt;Kindle Reader项目&lt;/a&gt;去观看代码并给出意见（&lt;a href=&#34;https://github.com/williamgateszhao/kindlereader/&#34;&gt;本人fork出来的repository在此&lt;/a&gt;）。&lt;br&gt;
　　多用户版正在开发，将免费提供公开服务，不再需要用户自行运行程序，类似于狗耳朵、kindle4rss等。&lt;/p&gt;
&lt;h2 id=&#34;更新历史&#34;&gt;
    &lt;a href=&#34;#%e6%9b%b4%e6%96%b0%e5%8e%86%e5%8f%b2&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    更新历史
&lt;/h2&gt;
&lt;pre&gt;&lt;code&gt;0.6.5 修正一个当rss中author为空时的隐蔽错误；修正运行目录不能含有空格的错误；修改模板，在正文界面显示来源和作者；停止为多用户版进一步重构，代码与多用户版开始区分  
0.6.4 修正win下的路径错误；修正目录页的内容摘要（过滤html标签）；更换BeautifulSoup版本  
0.6.3 新增时区选项，所有可见的日期显示均根据用户选择的时区（默认为+8）；新增灰度图选项，在生成mobi前将图片转为灰度图，减小文件体积（默认关闭）；允许用户选择是否启用kindlestrip  
0.6.2 修改mobi文件标题，现在periodical格式在原生系统能自动归档了（但两个文件为同一天的，会将较新的文件归档，目前无法解决）  
0.6.1 修复一些问题；尝试处理一些不合规范的时间信息；在所有文章信息中均使用utc时间  
0.6.0 对feed读取也采取了多线程，大幅度提高速度；重构代码，为开发多用户版做准备  
0.4.9 增加强制全文输出的功能，使用fivefilters.org，为了避开该站点免费用户每次只能输出3篇文章的限制，尝试将每篇文章单独发给该站点进行解析  
0.4.8 不再需要安装feedparser库，Python 2.7环境可以直接使用本程序  
0.4.7 优化feed读取和图片下载流程，下载失败自动进行重试；修复了对不提供发布时间的RSS格式支持  
0.4.6 修复了对图片URL中含有非ASCII字符的支持，并加强了下载图片的效率和适应性  
0.4.5 修复了对不提供author或content节点的RSS格式支持  
0.4.4 引入Kindlestrip，大幅度压缩了生成mobi文件的大小（一般小于原先的50%）;打包了exe文件，使得NoGR分支可以在windows不依赖Python环境运行，对普通用户更加友好  
0.4.3 修复了不会自动退出的BUG;修复了对&amp;quot;/&amp;quot;结尾Feed地址处理的BUG  
0.4.2 修复了某些feed地址必须以&amp;quot;/&amp;quot;结尾或反之所导致的问题，对feed是否读取成功进行判断  
0.4.1 增加限制最旧文章时间的功能;修改了日期格式  
0.4.0 it works
&lt;/code&gt;&lt;/pre&gt;
&lt;h2 id=&#34;主要功能&#34;&gt;
    &lt;a href=&#34;#%e4%b8%bb%e8%a6%81%e5%8a%9f%e8%83%bd&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    主要功能
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;保留原有的读取内容、生成mobi文件并发送到任意邮箱的功能&lt;/li&gt;
&lt;li&gt;相比著名推送服务如kindle4rss、狗耳朵等来说，通过本程序自建服务可以让mobi包含图片，不受任何流量和频率限制&lt;/li&gt;
&lt;li&gt;不再依赖google reader提供feed地址和内容，直接从配置文件读取feed地址并访问网站获取内容&lt;/li&gt;
&lt;li&gt;通过引入&lt;a href=&#34;http://www.mobileread.com/forums/showthread.php?t=96903&#34;&gt;kindlestrip&lt;/a&gt;，大幅度缩小了生成的mobi文件大小，以方便通过邮件的推送&lt;/li&gt;
&lt;li&gt;通过使用&lt;a href=&#34;http://fivefilters.org/content-only/&#34;&gt;fivefilters.org&lt;/a&gt;的服务，提供对RSS强制全文输出的功能&lt;/li&gt;
&lt;/ul&gt;
&lt;!--description--&gt;
&lt;h2 id=&#34;windows用户使用方法很简单&#34;&gt;
    &lt;a href=&#34;#windows%e7%94%a8%e6%88%b7%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%e5%be%88%e7%ae%80%e5%8d%95&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    Windows用户使用方法（很简单）
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下载最新版本的&lt;a href=&#34;https://github.com/williamgateszhao/kindlereader/archive/v0.6.5.zip&#34;&gt;v0.6.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;解压缩后，只需保留&lt;code&gt;kindlereader.exe&lt;/code&gt;和&lt;code&gt;config.sample.ini&lt;/code&gt;两个文件，放在任意目录，其他文件都不需要&lt;/li&gt;
&lt;li&gt;如果你使用的系统是WindowsXP，那么你需要安装&lt;a href=&#34;http://www.microsoft.com/en-us/download/details.aspx?id=29&#34;&gt;Microsoft Visual C++ 2008 Redistributable Package&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;config.sample.ini&lt;/code&gt;改名为&lt;code&gt;config.ini&lt;/code&gt;，并修改其中的内容，具体可以看文件中的注释，主要要改的选项是：&lt;/li&gt;
&lt;/ol&gt;
&lt;ul&gt;
&lt;li&gt;kindle_format，默认为book，如果你想要类似于狗耳朵那样的杂志形式，请改为periodical（只对官方系统有效）&lt;/li&gt;
&lt;li&gt;max_items_number，每个RSS源最多读取多少篇文章，建议不要太多&lt;/li&gt;
&lt;li&gt;max_image_per_article，每篇文章最多下载多少图片，由于上述的技术更新，本程序生成的文件不再动辄十几M，所以这里多一些也没问题&lt;/li&gt;
&lt;li&gt;max_old_date，不读取早于N天前的文章，一般与你多少天运行一次本程序相等，以免看到重复的文章&lt;/li&gt;
&lt;li&gt;mail_enable，如果需要程序自动将生成的mobi文件发送到kindle，需要将此项设为1&lt;/li&gt;
&lt;li&gt;to,一般是@free.kindle.com或@iduokan.com的邮箱，根据你使用系统的不同来决定&lt;/li&gt;
&lt;li&gt;username，你的邮箱（发信用，不是收信的iduokan或kindle邮箱）用户名，如果不使用gmail发信，请相应修改host、port、ssl等选项来符合你的smtp服务器（如QQ邮箱是host=smtp.qq.com,- port=25,ssl=0）&lt;/li&gt;
&lt;li&gt;password，你的邮箱密码，如果不愿意将主要邮箱的密码明文写在配置文件中，可以单独注册一个邮箱专门用于发送&lt;/li&gt;
&lt;li&gt;feed1，feed2等都是你需要读取的RSS源地址，比如订阅果壳网，就写成feed1=www.guokr.com/rss/，每个feed结尾的数字不能重复，即必须是feed1、feed2、feed3这样编写下去，总量不限。如果你需要打开某个feed的强制全文输出（即原来该feed的文章只有摘要），你可以在http前面加上full，即fullhttp://www.a.com/rss/这样的。&lt;/li&gt;
&lt;/ul&gt;
&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;下载亚马逊官方的mobi生成工具&lt;a href=&#34;http://s3.amazonaws.com/kindlegen/kindlegen_win32_v2_8.zip&#34;&gt;kindlegen&lt;/a&gt;，解压后只需要&lt;code&gt;kindlegen.exe&lt;/code&gt;一个文件，跟&lt;code&gt;kindlereader.exe&lt;/code&gt;和&lt;code&gt;config.ini&lt;/code&gt;放在同一个目录下&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;kindlereader.exe&lt;/code&gt;之后，.mobi文件就会自动发送到你设置的邮箱，并被kindle所读取。如果你设置了不发送邮件，可以从当前目录下生成的data目录中找到两个.mobi文件，将较小的那个拷贝到kindle上也可以正常阅读。可以通过计划任务来让程序定期运行&lt;/li&gt;
&lt;li&gt;如果你的&lt;code&gt;kindlereader.exe&lt;/code&gt;一闪而过，说明出错了，请到windows命令行下运行它来查看出错信息&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;linux用户使用方法桌面用户vps用户&#34;&gt;
    &lt;a href=&#34;#linux%e7%94%a8%e6%88%b7%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%e6%a1%8c%e9%9d%a2%e7%94%a8%e6%88%b7vps%e7%94%a8%e6%88%b7&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    Linux用户使用方法（桌面用户/VPS用户）
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;下载最新版本的&lt;a href=&#34;https://github.com/williamgateszhao/kindlereader/archive/v0.6.5.zip&#34;&gt;v0.6.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;解压后，只保留&lt;code&gt;lib&lt;/code&gt;目录和&lt;code&gt;kindlereader.py&lt;/code&gt;和&lt;code&gt;config.sample.ini&lt;/code&gt;两个文件，其他文件都不需要&lt;/li&gt;
&lt;li&gt;将&lt;code&gt;config.sample.ini&lt;/code&gt;改名为&lt;code&gt;config.ini&lt;/code&gt;，并修改其中的内容，请参考上一段对windows用户的解释&lt;/li&gt;
&lt;li&gt;Linux用户特有的选项：grayscale，将其设为1可以让mobi文件更小一点，效果一般，必须要安装python的pillow库&lt;/li&gt;
&lt;li&gt;尽量确保你的python版本为2.7，其他版本均未测试。如果默认版本不是2.7，最好单独安装一个，方法可以参考下一段针对虚拟主机用户的说明&lt;/li&gt;
&lt;li&gt;下载下载亚马逊官方的mobi生成工具&lt;a href=&#34;http://s3.amazonaws.com/kindlegen/kindlegen_linux_2.6_i386_v2_8.tar.gz&#34;&gt;kindlegen&lt;/a&gt;，解压后只需要&lt;code&gt;kindlegen&lt;/code&gt;一个文件，跟&lt;code&gt;kindlereader.py&lt;/code&gt;和&lt;code&gt;config.ini&lt;/code&gt;放在同一个目录下&lt;/li&gt;
&lt;li&gt;运行&lt;code&gt;python kindlereader.py&lt;/code&gt;即可，可以通过crontab定期运行，脚本可以参考下一段&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;linux用户使用方法虚拟主机用户以hostmonster为例&#34;&gt;
    &lt;a href=&#34;#linux%e7%94%a8%e6%88%b7%e4%bd%bf%e7%94%a8%e6%96%b9%e6%b3%95%e8%99%9a%e6%8b%9f%e4%b8%bb%e6%9c%ba%e7%94%a8%e6%88%b7%e4%bb%a5hostmonster%e4%b8%ba%e4%be%8b&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    Linux用户使用方法（虚拟主机用户，以Hostmonster为例）
&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;如果你的系统默认python版本就是2.7（运行python，查看显示的版本），那么使用方法完全和上面桌面/VPS用户一样&lt;/li&gt;
&lt;li&gt;如果你系统默认的python不是2.7版本，请按照下面的说明安装2.7版本的python&lt;/li&gt;
&lt;li&gt;修改&lt;code&gt;~/.bash_profile&lt;/code&gt;文件，确保文件中有以下内容（如已有某行，不用再写这一行）&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/bin:&lt;span class=&#34;nv&#34;&gt;$PATH&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nv&#34;&gt;LD_LIBRARY_PATH&lt;/span&gt;&lt;span class=&#34;o&#34;&gt;=&lt;/span&gt;&lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;/lib/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; PATH
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;nb&#34;&gt;export&lt;/span&gt; LD_LIBRARY_PATH
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;4&#34;&gt;
&lt;li&gt;安装python&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ wget http://www.python.org/ftp/python/2.7.4/Python-2.7.4.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ tar -xvfz Python-2.7.4.tgz
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ &lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt;  Python-2.7.4
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ ./configure --prefix &lt;span class=&#34;nv&#34;&gt;$HOME&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;$ make install
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;5&#34;&gt;
&lt;li&gt;确保&lt;code&gt;kindlereader.py&lt;/code&gt;和&lt;code&gt;config.ini&lt;/code&gt;、&lt;code&gt;kindlegen&lt;/code&gt;和&lt;code&gt;lib&lt;/code&gt;目录都存在的情况下，运行&lt;code&gt;~/bin/python kindlereader.py&lt;/code&gt;即可&lt;/li&gt;
&lt;li&gt;可以使用脚本以便cron来运行，假设你的家目录是&lt;code&gt;/home1/xxx/&lt;/code&gt;,你将&lt;code&gt;kindlereader.py&lt;/code&gt;、&lt;code&gt;kindlegen&lt;/code&gt;和&lt;code&gt;config.ini&lt;/code&gt;存放在&lt;code&gt;/home1/xxx/kindle/&lt;/code&gt;下面，那么写一个&lt;code&gt;kindle.sh&lt;/code&gt;放在同一目录下&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; class=&#34;chroma&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;#!/bin/sh
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;&lt;span class=&#34;cp&#34;&gt;&lt;/span&gt;&lt;span class=&#34;nb&#34;&gt;cd&lt;/span&gt; /home1/xxx/kindle/
&lt;/span&gt;&lt;/span&gt;&lt;span class=&#34;line&#34;&gt;&lt;span class=&#34;cl&#34;&gt;/home1/xxx/bin/python kindlereader.py
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ol start=&#34;7&#34;&gt;
&lt;li&gt;在虚拟主机控制面板里的“时钟守护作业”中填入&lt;code&gt;/home1/xxx/kindle/kindle.sh&lt;/code&gt;，我选的运行频率是&lt;code&gt;0 15 */3 * *&lt;/code&gt;，即每三天运行一次，在主机时间的每天15点。&lt;/li&gt;
&lt;li&gt;顺便可以再做一个cron任务，用于清理生成的data目录，填入&lt;code&gt;rm -rf /home1/xxx/kindle/data/&lt;/code&gt;即可，频率和上面一样，但时间要推迟一点，比如&lt;code&gt;0 16 */3 * *&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;常见问题&#34;&gt;
    &lt;a href=&#34;#%e5%b8%b8%e8%a7%81%e9%97%ae%e9%a2%98&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    常见问题
&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;想要类似于狗耳朵那样的杂志格式？请设置config.ini里的&lt;code&gt;kindle_format = periodical&lt;/code&gt;，在K4和KPW上测试无问题。如果你这样设置还是不能正常显示杂志格式，请将config.ini中的&lt;code&gt;kindlestrip&lt;/code&gt;改为0试试看&lt;/li&gt;
&lt;li&gt;旧版本用户已经安装了feedparser怎么办？不影响使用，你也可以卸载掉&lt;/li&gt;
&lt;li&gt;报错找不到kindlegen？请下载对应你系统的版本并确保放在同一个目录下&lt;/li&gt;
&lt;li&gt;无法用上面的链接直接下载kindlegen？请到&lt;a href=&#34;http://www.amazon.com/gp/feature.html?ie=UTF8&amp;amp;docId=1000765211&#34;&gt;这个官方页面&lt;/a&gt;下载&lt;/li&gt;
&lt;li&gt;RSS内容/图片无法读取？多试几次，一般是网络原因，同时请确认你的RSS地址正确&lt;/li&gt;
&lt;li&gt;无法在kindle fire或非kindle设备上阅读？可能是因为去除了mobi文件中的KF8格式支持，请将config.ini中的&lt;code&gt;kindlestrip&lt;/code&gt;改为0试试看&lt;/li&gt;
&lt;li&gt;订阅的feed太多，导致每次运行时间太长？请将config.ini中的&lt;code&gt;thread_numbers&lt;/code&gt;改为10或更高，建议不要超过20&lt;/li&gt;
&lt;li&gt;VPS等小内存环境，运行时占用内存太多甚至导致系统出错？请将config.ini中的&lt;code&gt;thread_numbers&lt;/code&gt;改为2或3&lt;/li&gt;
&lt;li&gt;如果上述解答不能解决你的问题，或者你发现BUG，或者你觉得有重要的功能需要添加，请到github上提交Issue&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;使用建议&#34;&gt;
    &lt;a href=&#34;#%e4%bd%bf%e7%94%a8%e5%bb%ba%e8%ae%ae&#34; class=&#34;anchor&#34;&gt;
        &lt;svg class=&#34;icon&#34; aria-hidden=&#34;true&#34; focusable=&#34;false&#34; height=&#34;16&#34; version=&#34;1.1&#34; viewBox=&#34;0 0 16 16&#34; width=&#34;16&#34;&gt;
            &lt;path fill-rule=&#34;evenodd&#34;
                d=&#34;M4 9h1v1H4c-1.5 0-3-1.69-3-3.5S2.55 3 4 3h4c1.45 0 3 1.69 3 3.5 0 1.41-.91 2.72-2 3.25V8.59c.58-.45 1-1.27 1-2.09C10 5.22 8.98 4 8 4H4c-.98 0-2 1.22-2 2.5S3 9 4 9zm9-3h-1v1h1c1 0 2 1.22 2 2.5S13.98 12 13 12H9c-.98 0-2-1.22-2-2.5 0-.83.42-1.64 1-2.09V6.25c-1.09.53-2 1.84-2 3.25C6 11.31 7.55 13 9 13h4c1.45 0 3-1.69 3-3.5S14.5 6 13 6z&#34;&gt;
            &lt;/path&gt;
        &lt;/svg&gt;
    &lt;/a&gt;
    使用建议
&lt;/h2&gt;
&lt;p&gt;　　建议放在虚拟主机或VPS上，使得程序定期运行；建议只订阅少量的、精品的、长篇的RSS源，如果壳网、科学松鼠会、译言精选等，新闻性的内容还是更适合用手机和电脑阅读；建议更新频率不要太频繁，我自己设置是3天运行一次，这样我才不会因为积存了很多未读文件而干脆不去读；建议每个feed每次更新内容在5-10篇，总共不超过30篇为宜，过多也会造成阅读懒惰；如果有喜欢的RSS源但网站不输出全文，可以使用新增的强制全文输出功能（看上面的介绍）；如果遇到fivefilters不能解决的网站，可以考虑用yahoo pipes进行精确自定义处理。&lt;/p&gt;
&lt;p&gt;　　希望所有的kindle用户都能顺利使用本程序，享受阅读的快乐。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>（旧版）对gaeproxy的一些研究，兼谈Geek的社会责任</title>
      <link>https://blog.williamgates.net/2013/02/gaeproxy-analysis-deprecated/</link>
      <pubDate>Sun, 24 Feb 2013 23:03:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2013/02/gaeproxy-analysis-deprecated/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;该文中描述的原理仍然有效，而gaeproxy的作者已经在项目主页、官方twitter帐号上明确说明了存在这种情况，故“作者未对公众说明”已经不存在了。&lt;/li&gt;
&lt;li&gt;作者Max Lv在这件事上表现出来的诚恳和大度令人钦佩，且已经在项目主页上放上了我原文的链接，所以特将原文移动至此，原地址仅放上我对原理的解释，不再有较为激进的内容。&lt;/li&gt;
&lt;li&gt;对我的文章给作者带来的一些误解表示歉意。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　核心提示：gaeproxy的“https代理”功能是由作者自建服务器提供，并非通过GAE转发，打开这个选项就意味着所有的https请求都会通过第三方代理服务器；由于种种原因，很多人实际上不能正常连接goagent服务器端，但手机端看起来还可以使用，是因为这个“https代理”功能让用户通过私人VPS进行了代理访问，而这些服务器到底是谁拥有、谁运营、安全性如何，我们完全一无所知。这一切，都没有在google code或google play页面告知用户。&lt;/p&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/madeye/gaeproxy&#34;&gt;gaeproxy&lt;/a&gt;是goagent在android上的客户端，作者是&lt;a href=&#34;http://madeye.me/&#34;&gt;Max Lv&lt;/a&gt;，&lt;a href=&#34;https://code.google.com/p/goagent/&#34;&gt;goagent&lt;/a&gt;在google code页面上将其作为android上使用goagent的解决方案来介绍。&lt;br&gt;
　　从近期的某次升级开始，gaeproxy不再支持android 2.2系统，其项目主页上建议2.2用户使用0.19.1版。但是使用0.19.1版再也打不开“https代理”选项了，只要勾选这个选项就会一直提示gae代理启用失败；取消这个选项后，虽然显示gae代理启用成功，但任何网站（无论http还是https）都无法访问，于是我就开始了我的研究之旅：&lt;/p&gt;
&lt;p&gt;　　1、寻找官方签名版&lt;br&gt;
　　通过阅读&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=231&#34;&gt;Issue 231&lt;/a&gt;，我了解到“所有第三方编译版本都无法使用 Enable HTTPS Proxy 选项”，“打开此选项后，所有 HTTPS 流量将由远程服务器转发”，为了避免中间人攻击，gaeproxy会在启用这个功能的时候验证apk的签名。&lt;br&gt;
　　于是我就想下载一个官方签名版，我误以为google code上的是自动编译的版本，签名不正确，所以提交&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=476&#34;&gt;Issue 476&lt;/a&gt;，希望作者提供一个签名正确的版本，作者回应说：“官方版见 Downloads 页面，另外 HTTPS 模式已不支持 2.2 系统了，请依照 Wiki 自行导入根证书”，这时候我对后半句还不明白（看下文你就明白了），前半句倒是听懂了，google code上就是官方版，那为什么我不能打开“https代理”呢？&lt;br&gt;
　　搜索后发现，其实有不少所谓“汉化去广告版”都自称可以打开“https代理”功能，又看到&lt;a href=&#34;http://tech.yaoruisheng.com/355240.html&#34;&gt;这篇文章（需翻越观看）&lt;/a&gt;，了解到gaeproxy验证签名其实就是访问&lt;a href=&#34;https://auth-gaeproxy.rhcloud.com/auth.php&#34;&gt;https://auth-gaeproxy.rhcloud.com/auth.php&lt;/a&gt;并提供基于时间戳和apk签名的sig，我发现这个地址已经不能访问了，而最新版代码（github上gaeproxy/src/org/gaeproxy/GAEProxyService.java）里访问的是&lt;a href=&#34;http://myhosts.sinaapp.com/auth-4.php&#34;&gt;http://myhosts.sinaapp.com/auth-4.php&lt;/a&gt;。看来作者在版本更新过程中放弃了容易被墙的rhcloud，换成了sinaapp。那能不能自己编译一个版本，将代码里写死的rhcloud地址换成sinaapp的，再通过前面说的技巧骗过验证呢？&lt;br&gt;
　　我尝试向作者要一个修改验证地址的0.19.1版本（&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=477&#34;&gt;Issue 477&lt;/a&gt;)，作者回应说“抱歉，0.19.1 已不支持 HTTPS 代理。解决方案：1. 升级你的 ROM 到 2.3。2. 使用伪造证书的 HTTPS 模式。”这时我对“https代理”这个功能的含义发生了怀疑——难道不是“对https流量也进行代理”的意思？经过翻阅，我终于看到了&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=433&#34;&gt;Issue 433&lt;/a&gt;，了解到了两个惊人的事实：&lt;br&gt;
　　（1）作者说“gaeproxy 的 https 代理有两种模式，第一种是由本地伪造证书由GAE转发的模式，第二种是由第三方服务器透明转发的模式。未开启「HTTPS代理」选项时默认使用第一种方式。第二种方式属于私有方式，由App中的置顶广告所得提供服务器资源。第二部分的服务器代码部署在SAE上，是出于可靠性考虑，SAE 对于开源应用有资源支持，不涉及收费问题。关闭「HTTPS代理」选项后，即是由GAE转发。”&lt;br&gt;
　　也就是说，“https代理”功能不是指“通过goagent代理https流量”，刚好相反，这个意思是“不通过goagent代理https流量”，而是通过第三方服务，这令人惊出一身冷汗——我们之所以信任goagent就是因为信任GAE，信任google，作者也说“所有 HTTPS 流量将由远程服务器转发，通过恶意修改这部分的代码可以轻松的获得所有经由 HTTPS 传输的敏感信息”，&lt;strong&gt;那我们的https访问原来一直是通过第三方代理的？作者从未明确告知过我们&lt;/strong&gt;。&lt;br&gt;
　　（2）根据作者所说，那么这个功能如果不打开，应该也能正常访问http网站；通过导入证书，更应该能访问https网站。但实际上不只是我，很多人不打开这个功能什么网站都连接不上，也有很多人打开这个功能后图片显示不出来（http访问不正常），也就说明&lt;strong&gt;很多人使用gaeproxy这个软件，根本只是在用作者提供的第三方代理！&lt;/strong&gt;&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　2、寻找能正常连接GAE的版本&lt;br&gt;
　　了解了这些事实后，我再也不敢用“https代理”这个功能了，我导入了证书，只想用正常的goagent（我承认导入证书也有风险），但是无论什么版本的gaeproxy都无法使用，软件提示gae服务已启用，系统log及SuperSU的log中也看出iptables被正确写入，redsocks正确启动，goagent的1984端口也正常打开，但就是无法连上GAE（应该是goagent客户端出了问题），也就根本没法访问任何网站（见&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=478&#34;&gt;Issue 478&lt;/a&gt;）。我也更换了不同的goagent服务器端，连古老的goagent1.8.11/gaeproxy0.16.7和goagent1.7.8/gaeproxy0.15.6这两个搭配都试过，没有一个能够使用。
　　经过翻看代码的history，发现0.20.2的更新内容是“fix issues on Android 2.2”，奇怪，作者不是说0.19.1之后不再支持2.2么？而且0.20.1的更新还写着“update to python 2.7.2 for new goagent”，作者称python 不能用于android 2.2（未见别处有这种说法），0.20.2居然还能在android 2.2上运行？事实证明就是可以，python版本就是2.7，安装后完全正常，可以访问http/https网站。&lt;br&gt;
　　这一版到底修改了什么产生了如此神奇的效果，看了代码也没明白。首先猜测是该软件一定要通过某种验证才能启用基本的功能，但该版本的验证地址虽然是sinaapp，但验证页面不对，所以也无法打开“https代理”功能，不过这个猜测至少能解释老版本goagent服务器端配老版本gaeproxy，当年能用现在却不行这一问题；另一种猜测是另有写死的地址（该作者在每一版代码中都有诸多写死的地址，甚至IP），但我简单浏览了几个版本的history，没发现关键所在；还有一种猜测是goagent客户端不使用python2.7就是不行，因为github上最早版本的goagent 1.7.8已经是python27环境了，但如果是这样，gaeproxy岂不一直只是一个第三方https代理？应该不可能。所以，这个问题有待进一步研究，可能需要作者去分析了。&lt;/p&gt;
&lt;p&gt;　　3、“https代理”功能研究&lt;br&gt;
　　我虽然不敢再用这个功能，但还是进行了一下研究，发现gaeproxy的原理实际上是通过iptables将设备上所有的请求都经redsocks转发，而redsocks在http流量上使用goagent生成的代理（1984端口），在https流量上，如果你不勾选“https代理”就仍然走1984，如果勾选的话会变成gaeproxy从sinaapp那个页面取到的一个服务器，53端口的代理，是美国的某VPS。通过显示客户地址的网页（比如&lt;a href=&#34;https://ip-lookup.net&#34;&gt;ip-lookup.net&lt;/a&gt;）也可以看出，打开“https代理”选项，我们的地址变成了一台VPS的地址（我测试到的是一个123systems的VPS，臭名昭著啊）。&lt;br&gt;
　　据此可以了解到，作者通过这个验证页面不仅想防止中间人攻击，而且想防止他提供的免费代理被人滥用或者被封。实际上很好找——它就在redsocks.conf里面，只要你有一台2.3以上版本的设备，安装0.21.1版（0.21.2版在我的Nexus 10上无法使用，见&lt;a href=&#34;https://code.google.com/p/gaeproxy/issues/detail?id=479&#34;&gt;Issue 479&lt;/a&gt;），连一次“https代理”就行了……经测试，也能用于无法打开该功能的旧版gaeproxy，但是我强烈建议不要这么做，更不推荐将其用于gaeproxy以外的地方。&lt;/p&gt;
&lt;p&gt;　　从整个研究过程可以看出，作者其实很早就发现android设备上goagent的证书无法很好地被使用（即使导入了还有问题），而且在android上goagent对https的转发性能也很不理想，所以他在&lt;a href=&#34;https://code.google.com/p/gaeproxy/downloads/detail?name=gaeproxy-0.10.2.apk&amp;amp;can=1&amp;amp;q=&#34;&gt;0.10.2版本&lt;/a&gt;就引入了第三方服务，当时是用FreeSocksProxy.org；后来又改为了这种自建在VPS上的代理。其实我很惊讶53端口的代理能带来这么强劲的速度和承载能力——coolapk上约467750次下载，google play上100,000 - 500,000次下载，不知道作者到底用了多少服务器来做这个“https代理”。&lt;br&gt;
　　我很佩服作者的这种公益精神和技术能力，但是从未在任何软件介绍和项目页面说明这一点，就显得非常不恰当。从学生时代，不少Geek朋友就有这种理念——我们写我们的，用户都是傻x，只管用就好了。实际上我赞同用户有权也应当是傻瓜，他们应该不用向我这样研究一个软件的代码才能使用它，面对普通用户的软件应该是轻松易用的；但是这种轻松附随了一个要求——用户有选择权。用户虽然可以傻瓜地使用软件，但有权在涉及自己切身利益——特别是隐私问题的时候有知情权和选择权。&lt;br&gt;
　　独立的软件作者写东西往往没有金钱回报，研究问题也纯属兴趣和公益心，但是只要你自认是Geek，那么你就一样有社会责任，这种责任不仅要求你做对社会有益的事情，而且要求你将这种“你自认为对社会有益的事情”公开出来，由社会监督；这种责任不仅要求你提供给用户好的东西，还要求你允许用户自行评判“你自认为好的东西”。&lt;strong&gt;这也是自由的要义——精神和意志上的自由才是真正的自由，受蒙蔽而使用免费的“自由软件”，蒙蔽用户而发布“自由软件”，均非真正的自由。&lt;/strong&gt;&lt;br&gt;
　　也许有人不同意，免费为你提供服务，你放下筷子还骂娘？殊不知信息权力已经成为一种真正可以影响社会的权力，比如google，它免费为世界提供Gmail服务，虽然我们没有支付任何费用，但它有义务保障用户的数据和隐私安全，而且有义务接受全世界各种眼光（包括黑客）的监督；比如国内的很多商业和半商业网站，明文存储的密码给无数人带来了损失，正是因为信息权力不受监督所致——一方面是政府要求明文存储密码的权力，一方面是网站安全流程设计上的权力，均不受公众监督。&lt;strong&gt;任何不受监督的权力必然导致腐败，即使这种腐败是一种极为特别的形式——掌握权力者本身甚至可能并未参与，但绝不意味着他可以置身世外&lt;/strong&gt;。在开源领域，作者的代码虽然已经公开，但仍有责任向公众介绍软件的机制，特别是涉及隐私、涉及代码外黑箱的部分。&lt;br&gt;
　　在gaeproxy这个软件的问题上，作者从未积极地向公众介绍其“https代理”功能的原理，而且一直严重这一误导性的名称，并且在开源的代码外架设有验证服务器、代理服务器，这是多个黑箱，其中有一个留有陷阱就会让数万用户产生不可估量的损失。即使作者本身不参与窃取隐私的行动，这种不透明的流程仍然可能被人破解及利用。实际上了解到这个软件使用的第三方代理地址易如反掌，而一旦攻破这些VPS，获取代理的log后就能得到不少有价值的隐私信息，如果进一步将这些代理服务器用于中间人攻击，后果不堪设想。&lt;br&gt;
　　&lt;strong&gt;即使我们无比相信开源软件的作者，我们也无法相信不受监督的权力。请将自由还给自由软件的用户。&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>（新版）对gaeproxy的“https代理”功能之分析和说明</title>
      <link>https://blog.williamgates.net/2013/02/gaeproxy-analysis/</link>
      <pubDate>Sat, 23 Feb 2013 16:39:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2013/02/gaeproxy-analysis/</guid>
      <description>&lt;ul&gt;
&lt;li&gt;经过我旧版文章分析后，gaeproxy的作者Max Lv很诚恳和大度地在项目主页和官方twitter帐号上解释了“https代理”功能，并将本地址作为说明放在项目主页上，故我将较为耸人听闻的旧版移至另一地址，在本地址重做了一份简单的说明。&lt;/li&gt;
&lt;li&gt;对我的文章给作者带来的一些误解表示歉意。&lt;/li&gt;
&lt;li&gt;再次声明，我相信作者从未也永远不会谋求窃取/篡改用户数据，作者提供的该功能是基于善意，我个人只是指出整个流程中的一个安全风险，并希望所有用户都有所了解之后自己选择是否要使用。&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;　　&lt;a href=&#34;https://github.com/madeye/gaeproxy&#34;&gt;gaeproxy&lt;/a&gt;是goagent在android上的客户端，作者是&lt;a href=&#34;http://madeye.me/&#34;&gt;Max Lv&lt;/a&gt;，&lt;a href=&#34;https://code.google.com/p/goagent/&#34;&gt;goagent&lt;/a&gt;在google code页面上将其作为android上使用goagent的解决方案来介绍。&lt;/p&gt;
&lt;p&gt;　　说明1：gaeproxy的“https代理”功能&lt;br&gt;
　　该功能实际上是将https的请求和回应通过作者提供的代理服务器来进行代理，原理如下：&lt;br&gt;
　　没有打开“https代理”功能时，所有的流量都通过goagent服务器端，而goagent服务器端是部署在google appengine（GAE）上的，在客户和服务器之间，只有google的服务器存在，这个过程中只要你信任google的服务器，就是相对安全的。如图：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/gaeproxy-analysis-01.png&#34; alt=&#34;gaeproxy-analysis-01&#34;  width=625 height=&#34;725&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　打开“https代理”功能时，https流量（往往是敏感数据，不过会被加密，并非明文）会通过作者提供的服务器代理，而不经过goagent的服务器端，这时候如果有人攻破了作者提供的服务器，在其上进行中间人欺骗，或者解密用户与目的服务器交换的数据（并非完全不可能），会给用户造成无法估量的损失。如图：&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/gaeproxy-analysis-02.png&#34; alt=&#34;gaeproxy-analysis-02&#34;  width=617 height=&#34;725&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　说明2：风险所在&lt;br&gt;
　　如上文所述，典型的goagent架构全程只通过google所维护的服务器来代理，虽然由于gae不支持https connect，所以在google的服务器上https请求会被解码并重编码（我理解如此，未必正确），所以不管是PC还是android上访问https网站，都需要导入证书。&lt;br&gt;
　　而gaeproxy作者提供的https代理不经过google的服务器，而是经过作者自己提供并维护的服务器，考虑到人力物力上的差距，作者维护的服务器在安全性上不如google的服务器来得可信，这就是我们所担心的。&lt;/p&gt;
&lt;p&gt;　　说明3：风险到底有多大&lt;br&gt;
　　实际上这种风险与你购买收费VPN、SSH代理的风险是一样的，甚至小于使用免费VPN、SSH的风险（包括著名的地下铁），存在恶意的VPN和SSH提供商能够给你带来更大的损害。我只是提出了整个流程中的一种可能性，而且不满于作者（当时）未明示这一事实而已。实际上我猜测是由于android设备上直接使用典型goagent模式时，https的性能比较差（我实测如此），所以作者才添加了“https代理”这一功能，并非出于恶意，相反自己花费了经费。&lt;br&gt;
　　实际上goagent的作者也承认，PC上典型的goagent架构也是不安全的，我们只是信任google的维护能力而已，并不是说goagent就是安全的。&lt;br&gt;
　　实际上翻墙的方法无非两种，一种是通过各类代理，其中加入了一道甚至几道服务器后，信息被窃取/篡改的可能性显然会增加；另一种是通过对网络协议的修改，如西厢计划等小众方案，由于需要使用别人编写的软件，一样存在风险。没有一种翻墙方式是不增加信息被窃取/篡改的风险的，只能说一定程度上降低了被GFW窃取/篡改的风险而已。&lt;/p&gt;
&lt;p&gt;　　&lt;strong&gt;总结：既然gaeproxy的作者明示了“https代理”功能的原理，我对这个软件及其服务并无进一步的意见，我推荐大家继续使用这个软件。就我个人而言，我不会继续使用“https代理”这个功能，但如果你选择继续使用，风险并没有多么可怕。&lt;/strong&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>自制inf文件覆盖EDID数据以解决显示器分辨率和刷新率问题</title>
      <link>https://blog.williamgates.net/2012/04/edit-edid-to-force-resolutions-and-refresh-rates/</link>
      <pubDate>Tue, 17 Apr 2012 00:33:21 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2012/04/edit-edid-to-force-resolutions-and-refresh-rates/</guid>
      <description>&lt;p&gt;　　当windows系统（本文以win7为例）通过数字方式（HDMI或DVI）连接显示器/电视机时，会通过显卡驱动读取&lt;a href=&#34;http://zh.wikipedia.org/zh/EDID&#34;&gt;EDID&lt;/a&gt;数据，该数据会告知系统该显示设备的最佳及支持的分辨率和刷新率。&lt;br&gt;
　　如果这个值正确，那么一切正常，糟糕的是有时候这个值并不正确……我买了一台&lt;a href=&#34;http://www.360buy.com/product/481852.html&#34;&gt;康佳LED32E320PD&lt;/a&gt;，国产电视再一次向我证明了国货是没有下限的……该电视通过HDMI连接电脑后，自动的分辨率是——1360x768@6Hz。我没打错，1360，以及6Hz。&lt;br&gt;
　　而它的说明书上，清清楚楚地写着最佳分辨率1366x768@60Hz。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　我想，一定是小工在刷EEPROM的时候填错了……而且所有可选的分辨率中，就是没有1366或1360x768，你只能等待接上线的时候自动变为这个分辨率，而忍受6Hz的刷新率。&lt;br&gt;
　　也就是说，本文所述的方法旨在解决&lt;strong&gt;显示器/电视机内置EDID数据错误或显卡读取EDID错误的情况下&lt;/strong&gt;，如何以设计的最佳分辨率和刷新率使用该显示器/电视机来连接电脑。理论上来说本文也可用于强制让显示器运行于超出设计标准的分辨率和刷新率，比如很多人就用来修改CRT的刷新率使之支持120Hz并用于3D显示；但是这一行为具有相当的危险性，本文不予推荐，也未予测试。&lt;br&gt;
　　为了解决这个问题，我想到的方案是&lt;strong&gt;强制电脑不使用显示器报告的EDID&lt;/strong&gt;，而使用自定义的分辨率和刷新率。但是虽然很多人说ATI和NV的最新驱动支持彻底的自定义分辨率，我却始终没有找到（Intel似乎可以），于是我就想&lt;strong&gt;覆盖掉显示器报告的EDID数据&lt;/strong&gt;。我首先尝试了&lt;a href=&#34;http://msdn.microsoft.com/en-us/windows/hardware/gg487330&#34;&gt;微软的这套说法&lt;/a&gt;，后来的事实证明它未必错，但在没有软件帮助的情况下自制inf或者修改注册表都太过复杂了（你没法自己算出合适的EDID值，而且你用下文的方法修改成功后会发现，自己改注册表也是非常困难的，微软的这篇文章里对注册表的描述过于模糊），于是我找到了&lt;a href=&#34;http://www.sevenforums.com/tutorials/7947-force-dvi-hdmi-resolutions-refresh-rates.html&#34;&gt;这个帖子&lt;/a&gt;，经我翻译和简化，方法如下：&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;使用DVI/HDMI连接上你所要修改的显示器，确保在电脑上显示为“即插即用监视器”或具体型号的显示器，即系统识别并自动安装了驱动&lt;/li&gt;
&lt;li&gt;下载Phoenix EDID Designer，我不知道官网在哪里，请自行搜索&lt;/li&gt;
&lt;li&gt;运行之，点击Tools-Extract Registy EDID，选择你想修改的那个显示器&lt;/li&gt;
&lt;li&gt;点击File-Read Only，把钩去掉，不要乱动其他的数据，在Detailed Timings中修改默认分辨率/刷新率，但这里需要填pixel clk，这个决定了刷新率但并不等于刷新率，似乎也没有明确的工业标准（网上有人在1366x768下填了84.75、85.86，我填了85.5，都可以产生60Hz的后果），你只能根据原值与原刷新率的比例来猜测一下，并且到下一个软件中去验证。顺便一说康佳居然在这里填了两个分辨率，到底是想干啥……&lt;/li&gt;
&lt;li&gt;如果你的默认分辨率/刷新率正确，只是想添加或修改一个其他分辨率选项，又或者默认分辨率/刷新率错误，但你实在不敢乱写pixel clk，那么在Standard Timings里修改或新增一个分辨率/刷新率组合，这里可以直接填刷新率，但是分辨率只能填宽度和比例，宽度也必须取一些特定数值（我填入1366是不行的，会自动变为1360，怀疑康佳的小工就是在这里犯的错误），从1360-1370中只有1360和1368两个值可用，这就不如Detailed Timings自由。&lt;/li&gt;
&lt;li&gt;将修改后的EDID文件保存，并下载moninfo.exe（同样请自己搜索，我找到一个绿色版，但大多似乎需要安装）来打开保存的EDID文件&lt;/li&gt;
&lt;li&gt;打开如果没有提示数据出错，那么检查软件显示出的分辨率/刷新率数据是否你所希望修改的，前面提到Detailed Timings中pixel clk不知道对不对，就是到这里来验证&lt;/li&gt;
&lt;li&gt;如果都正确，那么点击Create INF来生成一个inf文件&lt;/li&gt;
&lt;li&gt;打开设备管理器，更新该显示器的驱动（可以通过硬件ID来判断哪个是你想要修改的显示器），选择从磁盘安装（如果选择搜索相应目录的话会提示你已经安装了最合适的驱动，所以必须从磁盘安装），选取刚才生成的inf文件&lt;/li&gt;
&lt;li&gt;然后……就好了。有人说重启后或重连后需要重装驱动，经我实验似乎不存在这个问题。&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;　　再次提醒，如果想把这个方法用于超频显示器，后果自负。顺便吐槽一下中文的技术论坛和帖子，里面似乎懂的人/似乎做成功的人，只字不提具体方法，都是说“用那个inf的方法”之流；不懂的人胡说八道，却装得亲自试验过一般。我从CDMA手机的GPS问题开始就彻底不信任中文的技术帖子（他们认为星图文件的更新服务器选&amp;quot;us&amp;quot;还是&amp;quot;cn&amp;quot;对GPS性能有根本影响，而经我测试两个选项下到的数据完全一样，MD5都一样）&lt;strong&gt;绝大多数中文的技术论坛上不成完整教程的短篇文字都是胡扯，要么是胡编，要么没有经过原理分析，几乎和跳大神一样，以心理作用代替实验结果&lt;/strong&gt;。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>十年十选——ACG动人一刻</title>
      <link>https://blog.williamgates.net/2010/12/top-10-acgs-of-10-years/</link>
      <pubDate>Tue, 14 Dec 2010 15:17:25 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2010/12/top-10-acgs-of-10-years/</guid>
      <description>&lt;p&gt;　　迫于百合C版的自发十年总结风潮，我也决定来写一个十年十大最动人ACG作品。不用说，是用我个人（怪异的）标准，以我个人接触过（极少的）ACG作品为范围，非常不权威。说到底我只不过是被勾起了兴趣，自己想写而已。文字对于很多人来说是记录回忆的过程，对我来说，本身就是产生感动和回忆的手段。&lt;br&gt;
　　说是动人一刻，更准确的说是有动人一刻的作品，因为我不想明确地评选十大镜头；说是动人，并不一定是萌、燃或者感动，只是“心头一动”的感觉。排名不分先后（尽量按从旧到新排列），有不同意见，欢迎吐槽，不接受拍砖。&lt;/p&gt;
&lt;p&gt;　　一、秋之回忆（Gal2000）&lt;br&gt;
　　这是我玩过的第一个Gal，大约在02年前后。现在去看维基的Memories Off页面，才发现当时这作品中就充斥着现在已经用烂的模式化设定，体弱的萌妹、活泼的御姐、强气的转校生之类，都无非是一个设定而已——如果不是翻阅维基，我基本上已经忘了她们的存在。但是只有每天陪伴你上学的唯笑和选错了线就会害死你的前女友彩花，至今我都记得她们的样子，她们的全名。&lt;br&gt;
　　至今还认为唯笑是近乎最佳的女朋友，青梅竹马，单纯可爱，平时愚钝易骗，但在关键时刻能成为最可靠的人，能让人枕着腿哭泣的最坚强的人，是可爱到让人不肯相信她不是真实人物的女主角。这部戏中稻穗信这个贯穿了Memories Off系列、号称Galgame最佳损友的人物也第一次登场，成功的成为剧情推动的重要力量——没有他，基本上MO系列的男主都不会谈恋爱——多么恐怖的坏人啊。&lt;br&gt;
　　正是信所推动的剧情，让我第一次对着电脑痛哭流涕。当信骗智也要去对唯笑表白（有人分析认为信是真心的），当智也追到夜晚的小公园里去找唯笑，唯笑流着眼泪诉说自己一直在身边看着智也和彩花的爱情、一直在身边陪着失去了彩花的智也、一直在默默喜欢着智也的时候，我生平第一次感到来自ACG作品的惊人的感动。沉浸于过去就不能前进，不放弃无法继续的爱情就无法看到身边同样不能割舍的人，现在看起来简单而被各种作品用烂的爱情观，在当时的作品中，在当时少年的心灵中，有着巨大的力量。&lt;br&gt;
　　对唯笑的感情，对Memories Off的感情，可以说是我与ACG的初恋。&lt;/p&gt;
&lt;p&gt;　　二、Air（Gal2000，动画2005）&lt;br&gt;
　　Air是我最早看的一部动漫（灌篮高手、柯南等国民动漫除外），也是我大学里接触ACG的开始。当时只是在COS（现在看起来觉得这域名起得绝了）上随便闲逛，随便点进了动漫目录，随便下了第一个就随便看了起来——我被精致的画面和考究的细节吸引了（这也是我不管如何都不愿黑京都的原因），虽然当时未必理解动漫的固定桥段和隐晦的结局，但仅仅是这穿越千年的孽缘，就充分的震撼了我——可以理解为“被设定所感动”，就像看刘慈欣的小说一样……&lt;br&gt;
　　要说哪个镜头、哪个细节让我最为感动，真的无法列举。因为当时对我来说，初夏树荫下的铁轨、奇形怪状的小狗、灵异的女孩和人鱼般消失在海边的结局，效果是一样的——不管你们怎么黑Air和京都，对于让我入门，不，入梦的作品来说，它永远占据我心底无法取代的位置。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　三、I&#39;&#39;s（漫画2000完结）/草莓100%（漫画2005完结）&lt;br&gt;
　　之所以写在一起，主要的原因是……十个排不下……这两部作品常常被拿来比较，认为草莓借鉴I&#39;&#39;s的很多，但我认为草莓的东西南北设定做得更加张扬，故事也更加成熟，I&#39;&#39;s里的多角关系总让人觉得有点肮脏或者说背叛，但草莓除了最后东城没有取得胜利的“人气投票结局”以外，并不觉得任何一个人的感情是虚伪或者不道德的，可以说很好的保持了青春剧中常见的主题“喜欢一个人并不是错误”，这句话害了多少无知少女……&lt;br&gt;
　　I&#39;&#39;s给人最深的感动就是关于理想的理解，“太假了”是很多人的感叹，但将其换个方式讲出来的FSN和H&amp;amp;C;何尝不是同一个意思？把对一个人的爱当成自己最高的理想，放弃一切与之冲突的理想和愿望，哪怕与世界为敌——其实都是一回事。“有些人不信我所信，所以你们看不到我看到的奇迹/有些人看到了奇迹，他们却把它仅仅当作一个与生活无关的童话/只有相信奇迹的人，奇迹才会降临在他的头上/我不是生活在童话中，我却相信奇迹，相信我能书写自己的童话”，&lt;a href=&#34;https://blog.williamgates.net/2006/04/i-s-the-miracle-the-fairy-tale/&#34;&gt;这是我看完I&#39;&#39;s写下的&lt;/a&gt;，所谓感动，就是当自己心中的梦想得到支持的触动吧，哪怕这种支持只是一个虚构的故事。&lt;br&gt;
　　草莓么，如果没有最后纠结的结局，感动也许不会那么深刻——作者如此狡猾的选择了这样的结局，对于西军来说收获了胜利，同时又给东军留下了最深的回忆，作品霎时上了一个档次——“每当我想起深深爱上你的那一刻，我都会变得无比坚强”，这一句话比“志同道合的暧昧男女终于热恋在一起”的结局要深刻得多，不过有恶意催泪的嫌疑。&lt;/p&gt;
&lt;p&gt;　　四、Fate/stay night（GAL2004，动画2006）&lt;br&gt;
　　和大多数人一样先看了动画再玩游戏，动画里最有感觉的显然是第一个OP——THIS ILLUSION和最后Saber消失的那个镜头。纯情少年从动画里只能看到战斗的燃和Saber的萌，直到08还是09年玩穿游戏的HF线，才终于明白这个作品的深重。&lt;br&gt;
　　游戏中最有感觉的镜头是雨中士郎抱着樱的那一刻。给你的选项等于就是“从小‘正常的人类’教给你的‘正常的正义感’”还是“你口口声声说的‘为所爱的付出一切’”，或者更直白一点，“与世界为敌”或“与最心爱的人为敌”。当你选择了作品一路诱导你拐骗你暗示你去选的那个选项的时候，这些阴暗的老滑头们成功的向你灌输了他们的主旨——救一个人等于救世界，拯救自己最心爱的人，哪怕与世界为敌，也是最真的选择。当你点下那个选项，当你放弃了虚伪的道德和正义观，当你看到士郎和樱的拥抱，看到樱迷茫而欣喜的眼神，你不会感动么？&lt;br&gt;
　　从Fate线的拯救世界，到UBW的拯救自己，到HF的拯救爱人，FSN就是一部心灵救赎之旅，你需要的不是世界的重任，也不是自我放弃，更不是从头再来，你需要的只是执着所爱，在雨中抱住所爱的人，将她从瓢泼大雨中带回来，告诉她，我站在你这一边。&lt;br&gt;
　　如果爱，请深爱。这么二的一句话，竟如此契合FSN的主题。&lt;/p&gt;
&lt;p&gt;　　五、Narcissu&lt;br&gt;
　　既不Gal也不Game的作品，算是一个中篇电子小说。这里没有奇迹，没有戏剧化的结局，一切都是正常的生活，有人活着有人死去，不出乎意料，也不震撼人心。但是黑暗的背景中，隐藏着一种强有力的诉说。&lt;br&gt;
　　“我们会痛苦会失望，其实都是因为我们还有希望，还有未来。不管承受着多么大的痛苦和压力，不管经历多么难以接受的事情，只要你还会痛苦，只要你还会失望，就说明你还心存希望。”&lt;a href=&#34;https://blog.williamgates.net/2006/01/narcissu-time-goes-on/&#34;&gt;这是我当时写下的文字&lt;/a&gt;。作品不是指出或者发掘什么事物有问题，只是简单的陈述绝望与希望的关系——他并不憎恨绝望，也并不宣扬希望——提出问题不解答问题，这是我个人对于优秀作品一贯的评价标准。&lt;/p&gt;
&lt;p&gt;　　六、校园迷糊大王（动画、漫画2008完结）&lt;br&gt;
　　School Rumble到底是悲剧还是喜剧？相信没有多少人在看到结尾之前觉得这不是喜剧，但我在看了一半的时候，就曾经骂过作者，这不是把少年的梦想和执着当作笑柄么，那么努力却不能成功的少年，很可笑么？但当看到结尾之后，有那么多人认为是烂尾，有那么多人认为是悲剧的结尾，&lt;a href=&#34;2008/11/school-rumble-the-tragicomedy-of-our-youth/&#34;&gt;我却明白了作者的用意&lt;/a&gt;：他在用喜剧，无奈而又倔犟地，记叙，怀念，和高歌——青春。&lt;br&gt;
　　至少从一个喧嚣的校园来看，他们都是失败者。青春就是一场必输无疑的战争，与自己，与岁月，与爱情，与命运。&lt;a href=&#34;https://blog.williamgates.net/2009/12/school-rumble-youth-is-fighting-for-nothing/&#34;&gt;但青春最重要的，不是那必然失败的结果，而是明知道要失败，还是要奔赴战场的勇气&lt;/a&gt;。&lt;br&gt;
　　让我最感动的镜头不是播磨在摩托车上的告白，不是天满推门进病房的那一刻，而是花井组织的毕业远足，在一夜的磨难和欢笑之后，当太阳初升，神经病和二傻子们相约“向太阳奔跑吧”然后拖着那些永不疲倦的身躯为了莫名其妙的第一名而狂奔的那一刻。那一刻，多么希望我也有过这样一个神经病班长，一个能忽悠住老师、能带着全班人一起做最傻的事情的班长，一个强悍而永不言败、敢于大声说出单恋的班长，也许那样，我们就能拥有一个这样傻到可怕、又可爱到令所有人向往的青春？&lt;br&gt;
　　不可能的。不管是火山一般热情的班长还是世界级的摔跤手还是专业漫画家，都是不可能的，而你自己，甚至不可能是无用的泳衣相扑三人组。你不敢，你不能，你不会。这就是SR最令我痛哭流涕的地方。&lt;/p&gt;
&lt;p&gt;　　七、零之使魔（小说2004开始未完结，动画2006开始未完结）&lt;br&gt;
　　周而复始的纠结感情，推而不倒的主仆关系，超强后宫的狗血剧情不是我所感动的部分，我所感动的是：“你，今天为什么非要让我看你的笑容？”“不行？”“这太奇怪了！你和我已经一起相处一年了，但也只见过你两次笑容啊！可是，今天你竟然笑了七十二次！这太异常了！”“你在数啊。我好高兴。谢谢”“一年两次。如果今后和你一直在一起三十年。不，是四十年吧？要是能有五十年就好了……。这是你到那时所能看到的，我笑的次数”“我呢，已经，一生不会再笑了”“我一生，不会再去爱任何人。但是你不能这样。你要去喜欢上谁，要像你对我一样去保护那女孩儿。在你的世界里……”&lt;br&gt;
　　傲娇并不稀缺，钉宫也不是只配一个角色，废柴变无敌的男主满地都是，更强大的后宫总有更不要脸的作者来建设，但是就凭这段对话，小说我也要一直看下去。坚强而果决的爱，是真正的傲娇、真正的大小姐最可爱的地方。扭扭捏捏的所谓傲娇，无非只是个设定而已，只有与大小姐身份相符的坚强的心灵，才是“傲娇”这个设定最真正的核心。&lt;/p&gt;
&lt;p&gt;　　八、蜂蜜与四叶草（动画、漫画2006完结）&lt;br&gt;
　　第一季而第二季是两部作品。第一季是真实的励志片，第二季是励志的真实生活。&lt;br&gt;
　　因为太过温馨和纯净，真实也显得虚假；因为太过残酷和伤感，故事也显得真实。当山田一遍又一遍地说着我喜欢你，当真山一次又一次抱紧理花，当森田暴走的神经突然在飘雪的窗前沉静，当竹本骑着已经烂掉的自行车说我回来了，当花本作出了惊人的选择，当竹本抱着四叶草面包独自哭泣，这一切近乎梦境，又那么真实。生活是没有主角的，没有任何一个受到主角光环照耀的人，没有不死的、不败的、不变的，有的只是“&lt;a href=&#34;https://blog.williamgates.net/2006/10/honey-and-clover-second-season/&#34;&gt;选择为了自己心中最重要的事物，而交出整个人生的权利&lt;/a&gt;”&lt;/p&gt;
&lt;p&gt;　　九、交响诗篇（动画2006完结）&lt;br&gt;
　　过多的隐喻、庞大的世界设定并非完美无缺，少年成长的传统剧情也不是很有新意，但是这部作品做得最好的就是说故事的能力，正如其名，整个故事如同气势磅礴的交响诗，从世界的眼光来看人而不是从人的眼光来看世界，每个人物都有独特的故事，并非简单的少年升级记，而是有着群像般的饱满故事。比起注重天生的救世主能力或者无限的精神力的常见萝卜剧，这个故事可谓视角独特，说得精彩。&lt;br&gt;
　　不过最感动我的部分倒不是剧情，也不是无敌变身的结尾，而是当所有人绑好安全带，机头缓缓拉起，耳机里音乐打碟模仿着打不着的发动机，突然流畅的音乐喷薄而出，眼前的云层猛然消失，只有耀眼的阳光灼烧着眼睛的时候，我们仿佛也感觉到了那巨大的加速度，亲身体验到兰顿和霍兰德们对天空的渴望和热爱。&lt;/p&gt;
&lt;p&gt;　　十、秒速五厘米（2007）及新海诚其他作品&lt;br&gt;
　　动人一刻带给你的未必是心动，也可能是心碎。“你创造的星海中的故事，用无法逾越的距离来告诉我们心灵的距离可以超越空间的隔阂，自始至终，我们看到的都是相信，都是坚持，都是跨越那无尽距离的努力；你演绎的云端的传奇，让我们看到了为了约定而跨越不可能的少年豪情，我们还是看到了相信，坚持，和跨越世界的鸿沟的努力。悲剧也好团圆也好，分离也好拥抱也好，你给我们的总是两个字，希望。”&lt;br&gt;
　　“但是现在，你竟然要用你的作品来展现那现实的残酷——不在于失败，错过或者颓废，而在于无奈，放弃和绝望。”“但我总觉得，动漫应该是我们的梦，应该是青春的梦想。纵使不能实现，它也应该是引领我们做梦的精灵，而不是唤醒我们梦想的闹钟。”&lt;br&gt;
　　&lt;a href=&#34;https://blog.williamgates.net/2008/12/happy-ending-of-first-love-or-keep-it-as-memory/&#34;&gt;这是我看过秒速5后写下的&lt;/a&gt;，听着主题歌，痛哭流涕。的确存在刻意的催泪、虐心作品，的确存在刻意描绘普通人不能抵抗世界的生活故事，但是将这样的故事用我们所爱的动漫来讲述，由新海诚来讲述，未免过于残酷。因为故事太过真实，因为叙事太过优秀，因为那淡淡的哀伤太过甜美而绝望，这部戏是我最无法接受却也最喜欢的ACG作品之一。&lt;br&gt;
　　“若是一切可以重来/那我一定会赶到你身边/我已然别无所求/你才是我最重要的唯一”。似乎这又是一个关于放弃和选择的爱情故事，只不过选择的不是童话，放弃的不是正常生活，但是为什么每次听到这首歌，都赶到无以名状的痛苦呢。&lt;/p&gt;
&lt;p&gt;　　十年十选，只不过是自己体验过的极少作品中的极少部分。我不想推荐什么，我只是记录下ACG带给我的心灵旅程。谢谢你们，整日研究如果赚宅男更多钱的ACG业者们，谢谢你们给了我们，一段段精彩的梦。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>笑着说我一无所有——再看School Rumble</title>
      <link>https://blog.williamgates.net/2009/12/school-rumble-youth-is-fighting-for-nothing/</link>
      <pubDate>Thu, 24 Dec 2009 22:50:16 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2009/12/school-rumble-youth-is-fighting-for-nothing/</guid>
      <description>&lt;p&gt;　　在圣诞夜，终于看完了School Rumble的漫画。再一次投身2-C，再一次回到那喧嚣的校园，再一次，为我们共同存在于纸上的青春，泪流满面。&lt;/p&gt;
&lt;p&gt;　　这一次我不会再说什么小林尽该死了，我不会再觉得结局有多么牵强——动画缺失的那一段，正好是小林尽为了这个结局而一步步埋下伏笔、一点点安排过渡的过程。我不会觉得乌丸多么的单薄、无力，而是能够理解他心中的执着与伤痛；我不会觉得天满有多么阴险，而是明白了她将自己的一切投入到对一个人的爱之上的决绝。看完了漫画后，会觉得结局根本就是顺理成章——对于荒腔走板的整部恶搞作品来说，结局诚意得令人感动——这根本不是什么腰斩结尾，而是实实在在用人物和故事安排出来的、几乎没可能逃避的命运。&lt;br&gt;
　　是的，从一开始就设定好的个性使然，其中每个人物选择这样的过程、这样的结局几乎都是必然的。小林尽在后记中提到，他按自己的思想去扮演每一个角色，去设想他们到底会怎么做，然后再形成剧情——但有两个人例外，那就是天满与播磨。他们俩被设定成无可救药、无法改变，永远不可能改掉那天下无敌的误会和愚蠢，也永远不可能改变那坚如磐石的纯真和专情。他们是超越作者意志的存在，用作者的话说，是“让我放心的主角”。因为有他们在，因为有这样纠结的单恋关系，结局几乎是一定的。&lt;br&gt;
　　是啊，这样的结局是注定的——不论是主角、配角，乃至路人，不管是主动的、被动的、别扭的、直率的，心中的希望几乎都没有实现，心中的恋情几乎都没有结果，终于明白了喜欢的感情的八云，最终未能转身走开的爱理，还有无数纠结和悲剧的人们，没有几个人能童话般幸福地生活在一起。&lt;br&gt;
　　至少从一个喧嚣的校园来看，他们都是失败者。青春就是一场必输无疑的战争，与自己，与岁月，与爱情，与命运。&lt;/p&gt;
&lt;p&gt;　　&lt;strong&gt;但青春最重要的，不是那必然失败的结果，而是明知道要失败，还是要奔赴战场的勇气。&lt;/strong&gt;&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　即使只有一次也好，真的好想和他们站在一起，好想成为他们喧嚣的背景，一起经历那硝烟弥漫的运动会，真刀真枪的模拟战，向着朝阳奔跑的海滩上的人群……这个班上有大小姐、武道家的儿子、公共浴室老板的女儿和没用的小混混，但从来没有人说“我去告诉老师”或者“让我当XXX官的爸爸来跟你谈”，一切的分歧、一切的不爽，卷起袖子，来一场赌上名誉的对决吧——只用青春的热血和激情，还有愚蠢——但是想到什么都能比赛、什么都不可以服输的激情，真的希望自己就是那其中的一人，哪怕只是一次，哪怕只是配角，哪怕不是最后的胜利者——这样的青春，你不曾梦想过么？&lt;br&gt;
　　“我曾经问个不休/你何时跟我走/可你却总是笑我/一无所有/我要给你我的追求/还有我的自由/可你却总是笑我/一无所有”，我看完这部漫画，不知为什么就想到了这首歌。是啊，我一无所有，为什么你还要飞跃半个地球来追寻？是啊，我一无所有，因为我把所有的人生都投注在了对一个人的执着。小林尽在后记中说“把自己的一直贯彻到最后是很重要的，如果要谈恋爱，就要拿出这种干劲。这部作品就是要表达出这种想法。”我们是不是可以这样理解，作者要说的意思就是，虽然未必有好的结果，虽然必然要面对失败，但是青春就是顽固到愚蠢的执着，青春就是永不言败的勇气，青春的意义就在于敢于笑着说我一无所有——然后踏上下一次的旅程。&lt;/p&gt;
&lt;p&gt;　　这个圣诞夜，动漫群的朋友们大多过得比较冷清。当我一个人回到家煮饺子吃饭的时候，不禁有些感伤。仔细一想，那些一起搞活动、一起吃饭、一起唱歌的朋友们，很多已经离开南京，遍布天涯海角，想要组织一次团吃都那么困难。但是青春就是充满了离别和感伤，也充满了回忆和对未来的向往——我们都还年轻，我们都可以笑着说，我们一无所有。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/school-rumble-youth-is-fighting-for-nothing.jpg&#34; alt=&#34;school-rumble-youth-is-fighting-for-nothing&#34;  width=490 height=&#34;754&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>秒速5厘米：飞向云端的初恋，随风飘落的初恋，你选哪一个？</title>
      <link>https://blog.williamgates.net/2008/12/happy-ending-of-first-love-or-keep-it-as-memory/</link>
      <pubDate>Sun, 21 Dec 2008 00:01:03 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2008/12/happy-ending-of-first-love-or-keep-it-as-memory/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/happy-ending-of-first-love-or-keep-it-as-memory-01.jpg&#34; alt=&#34;happy-ending-of-first-love-or-keep-it-as-memory-01&#34;  width=500 height=&#34;707&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　不知道这是不是人类第一部根据主题歌而写的电影。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　看完之后我多么想说，新海诚先生，你错了。我多么想当一次政工干部，我多么想告诉你，你的立意不高，你的故事不积极向上，你让我们——几乎是所有的观众——看完了觉得很郁闷。&lt;br&gt;
　　我知道用是不是大团圆来评价一部作品的价值是非常愚蠢的，但是我不得不说这样的动漫作品还真少——主角通过奋斗，最后一瞬间暴气，拾起伙伴们的回忆，小宇宙爆发，打败大魔王抱得美人归，大家看得太多了；就算是“悲剧”结局，死了重要的角色，但总还有一个或者几个人在春意盎然的景色中站在其墓碑前，微笑着保证会好好活下去，会获得幸福之类。主角浑浑噩噩活着，并且知道自己所爱，更加知道自己所爱将一生不可得，这估计才是真正的悲剧——这也是比死很多人的结局更让人郁闷的原因。&lt;br&gt;
　　新海诚先生，你创造的星海中的故事，用无法逾越的距离来告诉我们心灵的距离可以超越空间的隔阂，自始至终，我们看到的都是相信，都是坚持，都是跨越那无尽距离的努力；你演绎的云端的传奇，让我们看到了为了约定而跨越不可能的少年豪情，我们还是看到了相信，坚持，和跨越世界的鸿沟的努力。悲剧也好团圆也好，分离也好拥抱也好，你给我们的总是两个字，希望。&lt;br&gt;
　　但是现在，你竟然要用你的作品来展现那现实的残酷——不在于失败，错过或者颓废，而在于无奈，放弃和绝望。&lt;br&gt;
　　我知道表现现实一点也不能妨碍你的作品成为佳作，我知道的。但我总觉得，动漫应该是我们的梦，应该是青春的梦想。纵使不能实现，它也应该是引领我们做梦的精灵，而不是唤醒我们梦想的闹钟。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/happy-ending-of-first-love-or-keep-it-as-memory-02.jpg&#34; alt=&#34;happy-ending-of-first-love-or-keep-it-as-memory-02&#34;  width=500 height=&#34;338&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　也许你要解释为，正是因为有这样纯真的回忆，那自己无法言说、满溢于信纸而又仅用一个字就能表达的初恋心情，所以人生——哪怕是小人物灰暗和平凡的、无奈和绝望的人生——也才会拥有色彩。&lt;br&gt;
　　而我痛苦地感到，正是因为有这样纯真地令人痛心的回忆，人生的每一秒，每一个不那么美好不那么色彩斑斓的日子，都才会那样追忆那永不回来的年少，才会那样悔恨没有说出口的心意，才会显得愈发痛苦。&lt;br&gt;
　　你看到的是擦肩而过的人，因为永远无法得到而显得那样的美好；我看到的是经历过的青春，却因为软弱和放弃，而追悔一辈子的痛苦。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/happy-ending-of-first-love-or-keep-it-as-memory-03.jpg&#34; alt=&#34;happy-ending-of-first-love-or-keep-it-as-memory-03&#34;  width=500 height=&#34;328&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　跨越日本的距离，在荒野中晚点的列车，这些的确会打击年少的心，也许正是因为这样的痛苦才让他们明白要永远在一起有多么困难，也让他们没有交出给对方的信，没有说出心中的告白。但是这些距离并非不可超越的，它们远不是以数光年以外的星空，也不是云端之上的世界，他们大可以考一样的大学，在同一个城市工作。真正让他们远隔天边的，是心。&lt;br&gt;
　　早有人说新海诚的作品都是关于距离的，光年的距离，世界的距离，这次是，心的距离。虽然几乎不可能是新海诚的原意，但我认为，秒速5厘米，是樱花飘落的速度，也是心灵，爱情，随风飘落的速度。&lt;br&gt;
　　与前两部作品合起来看，这次的回答更加残酷而讽刺——他曾经努力告诉过我们，心的距离可以超越一切，包括光年，包括世界的缝隙，包括生死——但是现在他要告诉我们，不好意思，我忘了，有一样东西不能超越，那就是现实的人生。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/happy-ending-of-first-love-or-keep-it-as-memory-04.jpg&#34; alt=&#34;happy-ending-of-first-love-or-keep-it-as-memory-04&#34;  width=500 height=&#34;328&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　人生中短短的交集让他们拥有了挥之不去的思念，但是无奈的分离，把他们各自抛入了人生的洪流——没有选择，没有停靠，只有马不停蹄，无法停下来寻找，寻找与对方再一次的交集。是的，我说起来很轻松，他们可以考一样的大学，可以在同一个城市工作，定居。但是现实的生活并没有给你这样的机会，从他们在枯萎的樱花树下相吻那一刻，幼小的心灵就已经屈服于整个无奈和随波逐流的人生。&lt;br&gt;
　　所以，飞向云端追寻幸福的少年之梦，随着樱花飘落的初恋回忆，你选哪一个？你一定会选前者，但是新海诚叹着气要告诉我们的就是，这由不得你，你没有机会选择。&lt;br&gt;
　　是的，我们哪有机会选择啊，看起来那么轻易的事情，看起来“只要奋斗就好了嘛”的回答，在人生的河流中，又有多少次就在那快要实现的时候会变成失望，甚至一生的遗憾。即使如罗密欧与朱丽叶般至死不渝——如果那样年幼的孩子能做到——结局也未必就是团圆收场。&lt;/p&gt;
&lt;p&gt;　　所以，新海诚先生没有错，我也没有错，他说的是更真实的故事，是每天都在发生的事实，而我想说的是我期望他能去维护、去描绘我们的梦想，这正是在人生的洪流中无力地漂流的我们，所希望看到的——越是自己做不到的，越是希望有那样死不了的角色，去帮我们完成。&lt;br&gt;
　　飞向云端，随风飘落，这选择不在我们自己。选择前者不意味着你一定勇敢，反倒是如果你能正视后者，也许你会在人生的道路中拥有更多自己选择的机会。&lt;/p&gt;
&lt;p&gt;　　本想反驳新海诚先生，写到最后把自己驳倒了。但是我还是愿意保留自己的梦想，愿意执念那愚蠢的相信，如果你不相信自己是可以实现梦想的主角，就永远不可能成为主角。&lt;br&gt;
　　因为你自己也用了那样的歌词，你用那样的歌词一遍又一遍敲击我们的心，直到我们泪流满面你才肯停止。或者即使你不承认，我也坚持相信，你是为了这样的歌词才写这样的故事，你是为了让我们明白这样的歌词，继续拥有梦想，才会写这样一个关于错过的故事——&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;若是一切可以重来&lt;br&gt;
那我一定会赶到你身边&lt;br&gt;
我已然别无所求&lt;br&gt;
你才是我最重要的唯一&lt;/p&gt;&lt;/blockquote&gt;
</description>
    </item>
    
    <item>
      <title>School Rumble，用喜剧纪念青春</title>
      <link>https://blog.williamgates.net/2008/11/school-rumble-the-tragicomedy-of-our-youth/</link>
      <pubDate>Tue, 18 Nov 2008 23:25:37 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2008/11/school-rumble-the-tragicomedy-of-our-youth/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/school-rumble-the-tragicomedy-of-our-youth.jpg&#34; alt=&#34;school-rumble-the-tragicomedy-of-our-youth&#34;  width=500 height=&#34;375&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　少年的梦，终究只能是青春的，喧闹的，虽然温暖而可爱，却不能实现&lt;br&gt;
　　少年的梦，就是让你老了之后回忆起来的时候，微笑一下：我们还有过那样的岁月啊&lt;/p&gt;
&lt;p&gt;　　School Rumble到底是悲剧还是喜剧？相信没有多少人在看到结尾之前觉得这不是喜剧，但我在看了一半的时候，就曾经骂过作者，这不是把少年的梦想和执着当作笑柄么，那么努力却不能成功的少年，很可笑么？&lt;br&gt;
　　但当看到结尾之后，有那么多人认为是烂尾，有那么多人认为是悲剧的结尾，我却明白了作者的用意：他在用喜剧，无奈而又倔犟地，记叙，怀念，和高歌——青春。&lt;/p&gt;
&lt;p&gt;　　我说，作者把自己投影到博磨身上去了；而有人说得更好，博磨不仅是作者的化身，更是无数追求梦想的少年的化身。他们努力，倔强，很多时候傻里傻气，但又因为无可救药地执着而那么可爱，那么令人伤心——因为年少的执着，往往除了一身的伤痕，并不能换来别的什么——坚持青春的梦想，是很难有大人们所定义的幸福的。&lt;br&gt;
　　虽然无奈，但作者却在用真实的故事纪念青春，因为青春并不常常给你带来莫名其妙成为救世主，拥有指数增长的力量和用不完的宝具，加上无法逃脱的拯救世界的重任；也不常常带给你不小心发现千金大小姐的秘密，和美女成为隔一个窗台的邻居，或者同时被校花一二三四号追求的机会。青春最常带给你的，就是喧闹的校园，数不尽的憧憬，以及同样数不尽的失败，而且如果你一直活在青春的梦中，一直坚持年少的梦想，那最有可能的结局，就是一直的失败。&lt;/p&gt;
&lt;p&gt;　　看似残酷，却是事实&lt;br&gt;
　　看似无奈，却正是青春的高歌——哪怕注定要失败，哪怕知道不可能，也一定要遍体鳞伤努力到底的顽固&lt;br&gt;
　　怀念青春的人啊，悔恨青春虚度的人啊，你们所失去或不曾拥有的，正是这种顽固，无可救药的顽固啊&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　School Rumble里面的人，每一个人虽然个性鲜明，但其实他们拥有的属性也不过是你熟悉的，你或者你的同学曾经有过的那些特点，只是在作品中被戏剧化了，极端化了。他们身上的特点是那么顽固，完全不可能改变——好斗的，喜欢读书的，热爱运动的，哪怕是好色的，多情的，也是顽固到底，坚持不动摇。当爱上一个人的时候，更是如此——这就是为什么他们中的大多数注定没有结果——一个人往往只执着于一个自己爱的人，而另一个爱自己的人，在他们执着的眼中，却根本没有一点点影子。&lt;br&gt;
　　正是因为他们每个人都如此的一根筋，才会导致那样的喧闹，那样的泪水，那样不知是不是悲剧的结局，也正因为他们每个人都如此的一根筋，这才是一个标准的、夸张却又真切的校园青春故事。谁不曾在年少时坚持点什么？谁不曾认为自己的某种想法、某种做法，将会坚持一辈子？&lt;/p&gt;
&lt;p&gt;　　永远坚持梦想的男孩，和永远坚持梦想的女孩&lt;br&gt;
　　永远记得青春和梦想的下场，就是一辈子得不到大人们所谓的幸福&lt;br&gt;
　　永远沉浸在欢乐的同学聚会中的故事，只能是这样梦一般，美丽而没有结局&lt;/p&gt;
&lt;p&gt;　　爱一个人真的可以爱一辈子么？从你看到她的第一眼开始，一直到你生命的终结，真的可以么？&lt;br&gt;
　　哪怕他不爱你，哪怕他注定不能爱你，哪怕她眼里甚至没有你的影子？&lt;br&gt;
　　坚持一件事真的可以那样执着么？哪怕要痛，要苦，哪怕要搭上生命&lt;br&gt;
　　或者更甚，要奉献自己的一生？&lt;/p&gt;
&lt;p&gt;　　长大的你，敢回答这些问题么？&lt;br&gt;
　　因为，我们都要长大，我们不可能生活在剧中&lt;br&gt;
　　因为，我们都会长大，我们都总会有点结局&lt;br&gt;
　　长大的我们，只能靠剧中人，为我们一直延续青春的梦想&lt;br&gt;
　　一直活在青春里的人们，就没法有个结局&lt;br&gt;
　　多么可笑的矛盾，又多么真实&lt;/p&gt;
&lt;p&gt;　　就如有人所说，我真的希望自己是2-C班的一员，不，我真的觉得自己就是2-C班的一员，在角落静静观看这一切的普通人，他们的青春，他们的欢笑与泪水，都映在我眼中， 都与我有关。他们就像我拥有过的真正的同学，他们和我记忆中的那些同学，其实没有什么不同。定格在记忆中的那些同学，其实也是青春剧中的角色，记忆中的他们，与2-C的每一个人一样，不会长大。&lt;/p&gt;
&lt;p&gt;　　我是多么的爱你们，希望每个人都可以获得幸福&lt;br&gt;
　　我是多么的羡慕你们，因为青春必然只留存于回忆&lt;br&gt;
　　但我又是多么的为你们伤心，为你们流泪——&lt;/p&gt;
&lt;p&gt;　　你们就是我们的梦想，欢乐，喧闹，信仰，顽固，和哀愁&lt;br&gt;
　　你们就是我们曾经在喧闹的校园中，一去不回而又终生难忘的，青春啊&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>趁年轻，赶紧摇</title>
      <link>https://blog.williamgates.net/2008/02/like-a-rolling-rock-as-early-as-possible/</link>
      <pubDate>Tue, 05 Feb 2008 23:03:33 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2008/02/like-a-rolling-rock-as-early-as-possible/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/like-a-rolling-rock-as-early-as-possible.jpg&#34; alt=&#34;like-a-rolling-rock-as-early-as-possible&#34;  width=500 height=&#34;440&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　高旗的声音响起，我差点掉下了眼泪。&lt;/p&gt;
&lt;p&gt;　　时隔多年，曲子还是那些曲子，李延亮还是李延亮，但是高旗已经不是那个高旗，超载已经不是那个超载。&lt;br&gt;
　　我是在高中同座位，一个疯狂的摇滚迷推荐下听了《超载》的，说实话，一开始并不是很喜欢。我不知道不同的人喜欢上摇滚的历程是否不同，但在我，我一开始是很厌恶，然后是有兴趣，再然后是欲罢不能。转折点，就是这张《超载》。&lt;br&gt;
　　不知是第几次听那张专辑开始，我开始喜欢高旗那疯狂的怒吼，开始喜欢那长篇大论的Solo，喜欢那不拘礼法、困兽犹斗般的绝望与希望。我托表哥从北京买了正版的《超载》，50块钱一张，几乎绝版；我又疯狂地寻找《魔幻蓝天》，发现的确绝版；到了大学，我在宿舍里放的第一支曲子是《荒原困兽》，那时候只有我有笔记本，他们为了借我的电脑玩游戏，只能忍耐。但是当有一天，对门宿舍跟我借《超载》那张专辑的时候，我真的很意外。&lt;br&gt;
　　我从Joyo买了《生命是一次奇遇》，也许是我对摇滚了解不深，也许是我本来就是个不挑食的胃口，我并不像大多数人一样厌恶超载的这次转型，我只是觉得超载给我的感觉，从一群荒野中开着战车的狂徒，变成了一个在姑娘窗下高歌的落魄骑士。他们从不向任何人低头，变成了宣布向爱情，希望，毅力，以及金钱，一些被称作可欲的东西，被无数次歌颂的东西效忠。但好歹，他们还没有宣称随便什么东西都可以效忠。&lt;/p&gt;
&lt;p&gt;　　在豆瓣上看到这张《生命之诗》，立刻就想要听听看。已经是两年前的东西，两年前他们搞了这个演唱会。当琵琶声停，高旗的声音响起，我真的感觉到一种想哭的冲动。&lt;br&gt;
　　一半是为了再次听到高旗的声音，一半是因为，高旗真的老了。&lt;br&gt;
　　苍凉的声音，沙哑的嗓子，他已经不能再把每句话每个尾音都变成狂吼，已经不得不在生命之诗中通篇用降调，不得不在陈胜吴广中放弃那代表性的长长的嚎叫，不得不在很多高音处紧急变声。他已经不是那个高旗，不是那个运用嗓子如一样乐器般自如和无拘无束的高旗了。当然，苍凉的声音别有风味，特别在《现在到永远》这样的英式摇滚风格中，表现得比原来还要好。但是，我想知道，任何一个超载的老乐迷，在被李延亮的急奏带起来激情之后，当听到高旗用真的”命若琴弦“的声音，那上气不接下气的声音唱出”命若琴弦“这句话的时候，你们会不会像我一样，真的哭出声？&lt;br&gt;
　　我更不敢想象，在听那首新歌的时候，在听高旗开始说歌词蹩脚的Rap的时候，现场那些铁杆老乐迷脸上是什么表情。高旗从来不是一个缺乏才华的创作者，但是为什么要写出这样的一首歌，就算除去Rap也只能算做平庸的一首歌？&lt;br&gt;
　　就如我前面说的，我听歌的时候往往会在脑中演出MV，一种因为歌的感觉而产生的画面感。如果说高旗和超载从《超载》中的狂徒、战士变成了《魔幻蓝天》中的嬉皮士，变成了《生命是一次奇遇》中的为爱所困的落魄骑士，那么现在，我脑中的画面，就是一群苍老的吟游诗人，在唏嘘和回忆中，谈起自己一生的冒险。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　我并不是要指责超载或者这张专辑，这次演唱会。正相反，我很喜欢这张专辑，很高兴我能在这么多年之后还能评价他们为，苍老的吟游诗人，而不是为了金钱拼杀的老年雇佣兵。&lt;br&gt;
　　是的，他们没有丢掉摇滚的灵魂。&lt;br&gt;
　　但遗憾的是，他们&lt;strong&gt;毕竟&lt;/strong&gt;已经老了。&lt;br&gt;
　　这个世界上不乏老顽童，但人的心灵总是在成长和变老，总是在不断的积累和沉淀，要想让心灵完全如少年一般年轻和激情，是完全不可能的。在老夫聊发少年狂中，他毕竟也知道自己是老夫，也知道自己是在酒后轻狂，也知道那手中龙吟再也不能带他马踏连营。这是不可避免的历程，摇滚人也不例外。&lt;br&gt;
　　前几天DlzM&lt;a href=&#34;http://www.dlzm.net/?p=6&#34;&gt;在blog里提到&lt;/a&gt;，年轻人总是喜欢脱口而出一些夸张的话语，总是喜欢编造一些不那么真实的东西来让自己说的事情更加有趣、更加新奇。我也有他说的那种毛病，我承认。每个人的骨子里都有那种冲动和期盼，寻找更加新奇的、更加有趣的、更加令人不可置信和不能理解的一切一切。有种说法叫做凉宫春日综合征，是说在看过凉宫春日之后对这个真实世界的绝望，对没有那些新奇和不可思议现象的生命感到绝望的一种病症。我们每个人都在逐渐寻找新奇、探寻神秘中长大、老去，逐渐变得熟知这世上的事物，了解自己生存所需的一切；我们所不知道的事物也有人帮我们了解清楚了，放在图书馆里；我们所需要探索的东西逐渐变少，探索本身逐渐变得失去动力和意义——我们渐渐不再相信会有崭新的、让人激动的事情，会被我们发现。&lt;br&gt;
　　&lt;strong&gt;年轻本身就是一种力量&lt;/strong&gt;。为了在无数次的摔倒中探寻，人的生命本质中赋予年轻人这样的力量，那就是不相信，就是不放弃，就是不灭的激情。而摇滚，正是歌唱这种力量的语言。摇滚要阐释的是只属于年轻的那种力量，但是摇滚的灵魂可以渗透在人的生命中，直到老去。也许你不能永远拥有年轻的激情，但你可以不放弃一颗摇滚的心。&lt;br&gt;
　　我为高旗和超载的不再年轻而感伤，但我更为他们坚持了摇滚的心而感到高兴。&lt;/p&gt;
&lt;p&gt;　　刚好听完一整张专辑，写完了这篇文章。东扯西扯从高旗的嗓子说到了摇滚的心，是因为看到了最近DlzM的那篇文章，再加上想到同样是老摇滚人的汪峰，在豆瓣上被人痛骂为”最后的武器就是一颗敢于拿着这种东西来骗钱的勇敢的心“（我并不赞同，我觉得汪峰即使是现在的专辑在中国摇滚界也算有一定水平）。我真的不觉得摇滚人的老去、趋于商业和流行化是多么悲惨的事情，同样是音乐，摇滚并不是干净和神圣的代名词，也不比其他音乐要高级、要伟大；但如果转型过程中不能坚守那颗摇滚的心，真正愧对的不仅是老乐迷，不仅是自己摇滚人的那个标签，更是自己曾经的岁月，自己年少的激情，那些自己曾经最想要通过摇滚之心延续下来的东西。&lt;br&gt;
　　要说明的是，起这个标题，并不暗示”老了就滚“的意思，只是偶然想到觉得有趣，就用了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>再见哈利波特，再见我们的童年</title>
      <link>https://blog.williamgates.net/2007/08/goodbye-harrypotter/</link>
      <pubDate>Thu, 16 Aug 2007 20:30:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2007/08/goodbye-harrypotter/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/goodbye-harrypotter.jpg&#34; alt=&#34;goodbye-harrypotter&#34;  width=350 height=&#34;500&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　也许这样说并不妥当，毕竟我是从高一时，哈一电影上映那年才开始看哈利波特的，把前四本借来看了一遍，看完之后当即去书店买来，又看了一遍。从高一到大四，应该不算是小孩子了，但我要说的不是年龄上的童年，而是那段我们拥有天真的幻想，愿意相信奇迹的岁月。&lt;br&gt;
　　我承认我订购太晚，从北京回家太迟，英文阅读太慢，以至于到现在才读完第7本。让我们来说点什么吧，不管是剧情，还是感想。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　还记得自从一口气看完两遍前四本，我就彻底迷上了这个故事，从哈利身上估计不少人都能看到自己的影子——我说的不是父母双亡的悲惨遭遇，而是成长中的少年所特有的不安、躁动，更确切地说可以算是暴躁和一点点自私，还有勇敢、无视规则，积极进取，不畏强权，他的一举一动都像一个我们的同龄人，他的每一个想法、每一次怒火都那么让我们感觉如心灵相通——这就是我们的思维方式，就是我们的成长历程。&lt;br&gt;
　　是的，罗琳伟大之处并不在于一个幻想世界的创造——这一点上绝大多数玄幻作家比她高明得多——这也是很多此类作家不服气她的成功的原因。其实她的伟大在于对少年们心理历程的描写，那样真实，那样令人信服，这一切的人和事都那么可信，以至于整个魔法世界的存在都是不可置疑的事情了。&lt;/p&gt;
&lt;p&gt;　　看完第七本，我的感觉与很多人提到的类似——失落，因为感觉失去了一个伴我们长大的童年挚友。但我的失落还来自于，不管是这个结局，还是结局的方式，都让我对这样一个令我魂牵梦绕的故事，有些失望。我当然不指望她在读者年龄层如此广泛的作品中来个大悲剧结尾——例如写到Harry看完Snape的记忆，意识到Dumbledore的计划之后，万念俱灰，从容赴死，然后被Voldemort干净利落地杀掉，就此停笔——要我写就这样结束，但我知道这是不可能的。但即使要一个大团圆结局，也不必通过如此潦草的办法来结尾。&lt;br&gt;
　　很多的谜团都只是用Dumbledore的模棱两可的话来回答；很多BUG最后也没有修补上。最后的故事可以说一切都在预料之中，Dumbledore对Harry的利用，Snape的双面谍，Harry的死而复生，可以说完全是全世界爱好者们早就猜过了的；拯救Hogwarts的战役，这可是我梦想过无数次的，当战役打响之前，我就被那准备的场面彻底地感动了——虽然真正的战役场面描写得太草率；Harry和Ginny，Ron和Hermione，也早在预料之中，也是大家所期望的。&lt;br&gt;
　　相反，很多大家猜测过的，甚至已经被认为是准官方说法的东西，没了下文。Neville与Harry的身世纠葛——到底谁是The One，居然这个问题只字未提——我并不认为在上一本里这个问题解释得很好；James的身世——只说出了是The Third brother的后代，还是没有关于整个家族情况的说明。如果说这一切都仅仅是BUG或者不完美，我更不能接受的就是Ginny从头到尾没有与Harry并肩战斗——Ron离开时我就以为她会跟着一起回来，最后战役时我以为她会救下Harry或者反之，或者在Harry走向死亡的时候会给他不一样的信念——但居然作为主角的女朋友就这样给丢在一边了，让最后他们的爱情显得不那么自然，这样一个出生入死的主角，身边的哈利女郎居然不是和自己并肩战斗的伟大战友，这太说不过去了。如果要说最不可接受的，就是Harry莫名其妙、毫无英雄气概地，被抬回Hogwarts，还躺在地上看着自己的战友被Voldemort威胁、羞辱，然后居然趁乱蒙上Invisibility Cloak，在一个描写少年成长的7部曲的最后一战的最后时刻，这实在是太丢脸的事情了。&lt;br&gt;
　　综合来看，罗琳缺少的不是“讲故事”的能力，而是对悬疑的解释能力——那些本以为有多么深层含义的伏笔，到最后原来就是表面看起来那个样子——包括Lupin在开头的表现，我还以为他是叛徒呢。最后的解释弃用了很多本已埋好的伏笔，简直就像把读者心里所理解的那个答案简单地说出来，没有什么峰回路转，没有什么意料之外。罗琳还缺少控制大场面的能力，如此激动人心的战争场面被描写得像小学生打雪仗——看不出惨烈和宏伟，最后Harry和Voldemort的对决更是罗嗦了一大堆之后一击毙命，落入了俗套。&lt;/p&gt;
&lt;p&gt;　　我是真的不愿意自己如此喜爱的作品在最后一部才意识到自己是一个儿童文学的。但我不得不承认，罗琳对整个故事的构建，让我们的童年——那个愿意相信奇迹的年纪——充满了魔法般的色彩。我真的相信这个世界上有那些不可解释的事情存在——就像书里它们存在那样理所当然。&lt;br&gt;
　　如同很多人说过的那样，我不愿意去读完它，但又废寝忘食地读完了它。我不愿意看到这个陪伴我们成长的故事的终结，但一切就像我们不得不长大那样，我们不得不说，再见。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Eureka——交响诗中，没有孤独</title>
      <link>https://blog.williamgates.net/2007/03/eureka-meets-no-loneliness/</link>
      <pubDate>Mon, 26 Mar 2007 21:06:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2007/03/eureka-meets-no-loneliness/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/eureka-meets-no-loneliness.jpg&#34; alt=&#34;eureka-meets-no-loneliness&#34;  width=500 height=&#34;375&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　看这部作品用了差不多一年时间。看前半部的时候，我怎么也想不通为什么这个英文标题可以冠以一个“交响诗篇”的日文/中文名称。但看完它的时候，我不得不感叹这名字起得伟大。&lt;br&gt;
　　这部戏有男女主角，但我却更倾向于把它看作一个宏伟的时代剧。在片尾，当兰顿下定决心的时候提到查尔斯这样一个消失了快20集的角色，当太空中交战的背景音乐突然从Hip-Hop变成了交响乐，我突然明白，这不是一部快餐作品，这是一个时代的史诗，是一群人的传奇。&lt;br&gt;
　　所以，这是一部不折不扣的交响诗。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　一个在学校受欺负的、平凡的小男孩，却有着被称为“全人类的救世主”的父亲，在他14岁那一年，他不甘心在父亲名声的阴影下生活，只身离家去追寻自己的命运。&lt;br&gt;
　　很像传统的热血电影和英雄史诗的开头吧？但是后来呢？后来他发现他根本不是拥有超能力的英雄，也不是能迷倒一大片美女的主角大帅哥，他只是一个被人瞧不起、被首领敲打、被同伴捉弄的“呕吐虫”。&lt;br&gt;
　　故事慢慢展开，当他认识的人从一群无政府主义者拓展到雇佣兵、科学家甚至非人类，当他明白自己爱上了一个并非人类的女孩，当这个世界的本质像永远剥不完的洋葱皮在我们面前一片片落下，我不得不承认，我被这个故事吸引住了。&lt;br&gt;
　　从抱着滑板离家出走的小男孩，到驾驶尼尔瓦修在空中接住滑空板的少年战士，到最后拯救了世界的神一般的存在，每一个镜头转换，无不令人倒吸一口凉气，每一次故事推进，无不令人恍然彻悟。就算你说这是部热血片也罢，这故事也太离奇，太宏伟了些。&lt;br&gt;
　　所以，这是一部不折不扣的交响诗。&lt;/p&gt;
&lt;p&gt;　　DJ，Rave，LOF，ELF，滑板，机器人，无政府，佛学，希腊文化，神秘主义，以及交响乐，这些东西杂糅在一起，无数的隐喻、谜语和作者根本没准备回答的伏笔，除了最后一版的ED五个人托起地球的画面，我看不出任何理由说这是一部早七点档放给14岁以下儿童看的环保教育片，虽然作者坚持这么说。&lt;br&gt;
　　虽然其中有5-10集可以完全删掉，但除去拖戏的商业理由不谈，剩下的集数可谓精品。这些乱七八糟的元素被结合得很好，不仅是很好，甚至令人感觉营造了一个非常自然的世界，这就是所谓宏大世界观的最高境界吧。一如沙丘，星战，EVA，这个世界上所有最伟大的科幻作品无一不是创造了一个近乎真实的世界。&lt;br&gt;
　　所以，这是一部不折不扣的交响诗。&lt;/p&gt;
&lt;p&gt;　　这其中的玄妙，关于金枝的无数的寓言，我就不再探讨了，仅仅从我理解的一个侧面来说——那就是人的本性——也许是所有生物的本性——害怕孤独。&lt;br&gt;
　　兰顿害怕孤独，于是离家去寻找自己的青春，和一群他崇拜至极的无政府主义分子一起；Eureka害怕孤独，于是她将同源的尼尔瓦修当作最亲密的朋友，并且最终爱上了本应三生之隔的兰顿；珊瑚岩害怕孤独，所以不愿意消灭人类，却尽力寻求共生；查尔斯和蕾，诺鲁布和佐久夜，霍兰德和塔尔荷，无不因为害怕孤独而战斗，无不因为逃避孤独而忍受煎熬。就连杜伊在死之前也说，之所以要把整个人类拉下作垫背，“因为我怕孤独啊”。这里面的每一个人都有着爱与恨的纠葛，都在逃避孤独，寻找交流和共生，也许这正是作者的本意——如果非要扯上环保题材的话——如果整个星球只有一种生物，那该多么孤独。&lt;br&gt;
　　没错，我们害怕孤独，而在这一个伟大的时代，在这一群伟大的人身上，我们看到无尽的孤独，我们看到爱与恨都是因为孤独，我们看到他们的所作所为都是为了逃避孤独，我们突然明白善恶的区分也许并没有那么绝对，也许只是对孤独的不同的理解，以及不同的反应方式而已。&lt;br&gt;
　　所以，这是一部不折不扣的交响诗。&lt;/p&gt;
&lt;p&gt;　　最后的结尾，我愿意这样去理解：珊瑚岩带着其中所有的失去了物质存在的人的思维去了分裂出的另一个宇宙，整个地球恢复原始状态，而兰顿和Eureka二人以一种既非人类也非克拉利安的状态生活着，寻求和谐共存的途径。这也许正是作者讲了那么多谜语之后的一个不那么深奥的解答：为了让我们不会孤独，为了让整个地球上的所有生物不会孤独，让我们学会共生、共存，共同保护这一颗如梦般神奇而美丽的星球。&lt;br&gt;
　　好吧，我承认我还是会为那充满节奏感的背景音乐和奋战的场面而热血沸腾的年少的孩子，我承认我还相信那些救世主、大英雄、自己的命运之类的玩意，我承认当我在写这些文字的时候，耳机里传来这部片子的原声碟震撼的声音，我不由自主地又沉浸到那英雄的故事中去了。&lt;br&gt;
　　但这有什么不对呢？&lt;br&gt;
　　交响诗中，有少年的热血与成长，有亚文化的律动和反叛，有佛教、巫术、神秘主义的种种谜语与彻悟，有跨越一切界限、最伟大最包容最真诚的爱情，唯独，没有孤独。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>老狼老了，青春还在</title>
      <link>https://blog.williamgates.net/2007/03/lao-lang-your-song-our-youth/</link>
      <pubDate>Thu, 08 Mar 2007 22:31:33 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2007/03/lao-lang-your-song-our-youth/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/lao-lang-your-song-our-youth.jpg&#34; alt=&#34;lao-lang-your-song-our-youth&#34;  width=500 height=&#34;500&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　看到douban上提到老狼《北京的冬天》这张新专辑，是在网上发售后24小时以内。立刻冲上Joyo，发现我三年未登录的账号还在，毫不犹豫地点了购买。不为什么，就是冲动。&lt;br&gt;
　　拿到专辑，第一眼的感觉就是老狼老了，比《晴朗》中的照片又要老了一些，甚至可称作“苍老”了。按下播放键，耳机里传来我不大喜欢的电子配器，但几秒钟后，我就听到了那不会改变的声音。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　跟《恋恋风尘》和《青春无悔》比起来，现在的老狼唱功增长了，嗓子下降了，声音没变。不是物理意义上的没变，而是听起来的感觉，忧郁，沙哑，苍凉，唯一不同的大约是比那时的他少了一点点犹豫和无奈，多了一点坚定。也许这就是青铜器的老狼和中年的老狼的区别。&lt;br&gt;
　　跟《晴朗》相比，虽然有人说这张专辑不如《晴朗》好听，但我觉得即使从“悦耳”上来说可以认为不如《晴朗》（有些电子配器比《未知的旅程》还厉害），但从“味道”上来说这更贴近当年我们最喜欢的老狼。虽说现在唱的已经算是都市民谣而不是校园民谣（其实大多还是校园民谣时代的老歌），却没有南合文斗那么多的“回忆年轻时代”的感觉，也没有唐磊那种风尘气，也没有卢庚戌那样激情，也许校园民谣掌门人这块牌子，是打不倒、砸不掉的（特别是在不大可能再听到沈庆，郁冬这群人的新歌之后）。&lt;br&gt;
　　当年他起这个艺名的时候，也许有一点“装老”的意味，但现在的他应该被称作那种少有的“越老越有味道的男人”，可以算是应了老狼这个名号。听他唱情歌对唱，没有任何“装嫩”的感觉，却比《青春无悔》那样的对唱中的伤感和无奈，多了一份岁月凝练的成熟和温情；听他唱八十年代的老校园歌曲，没有怀旧的感觉，却感到“这就是我们的青春”。&lt;br&gt;
　　没错，这就是我们的青春，失去了它的人不会因此而感伤落泪，却只是沉浸在真切的回忆中；经历它的人不会感到苍老的回忆和说教，却充满心头的共鸣。正如有人说的“老狼是不会令我惊喜也不会令我失望的歌手”，他就是那样，当他老了，当他的嗓音老了，当他的唱功提升了，当他的声音中增加了成熟的味道和温软的气息，他还是在唱我们的青春，我们每一个人经历过的，正在经历的青春，甚至下一代人，将要经历的青春。他的声音没有随着他年龄的增长而老去，他永远唱的都是那二十多岁的，那年少的忧愁，充满希望的喜悦，改变一切的激情，他唱的是那永远不会老去的，每一代人的青春。&lt;br&gt;
　　老狼老了，嗓音老了，他却一直唱着不老的青春，我们每一个人的青春。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>再见列宁</title>
      <link>https://blog.williamgates.net/2007/02/goodbye-lenin/</link>
      <pubDate>Sun, 11 Feb 2007 17:19:38 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2007/02/goodbye-lenin/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/goodbye-lenin.jpg&#34; alt=&#34;goodbye-lenin&#34;  width=566 height=&#34;800&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　看了这部片子就知道自己又给自己布置了个作业，必须写点什么，想不到题目就用这个最有震撼力的片名来代替了。&lt;br&gt;
　　当传统的制度在一夜间倾覆，当自己的母亲在对传统祖国的梦境中沉睡，年轻的主人公选择了撒谎，一个又一个越来越大的谎言，最后实际上已经达到了片中说的“把整个柏林都装修一遍”的效果。而他的母亲也在半信半疑中、在真相已经揭开一角之时，安然离去了。&lt;br&gt;
　　这是一部好片子，它好就好在，这是一部各取所需的片子。&lt;/p&gt;
&lt;p&gt;　　有人会说，这是一部悲剧，在光明已然来临的时候，在黑暗中沉睡过久的人不得不在谎言中生存，才能避免过大的心理冲击，不仅仅是他们的母亲，也包括那一群片中所谓“遗老”。对民主，对自由的压抑，让人们已经习惯于奴化和缄默，如同深埋在洞穴中的动物不能见阳光一样。&lt;br&gt;
　　有人会说，这是一部喜剧，它表现了在过渡中的人们的心态和生活方式，表现了一个“遗老”的故去和一群年轻人对未来的憧憬，是颇具有象征意义的。疯狂的世界杯、漫天的焰火，不仅仅是表达一个国家统一和民族复归的欣喜，也表现一种对未来的无限期望。&lt;br&gt;
　　有人会说，这是一部温情正剧，表现了儿子对母亲的爱，即便这种爱要与整个社会大潮、与历史变迁为敌，即使要将整个国家“包装”了给母亲看，也是在所不惜的。&lt;br&gt;
　　有人会说，这是一部历史和政治剧，表达了对历史的重新设想（片中那些假新闻，如果是真的会怎样呢？），表达了对历史的疑问、假设和思考。&lt;br&gt;
　　还有人说，这是一部荒诞剧，它不想表达什么，也不想说明什么，它的意义就在于，让你感受一个时代的荒谬，一个国家的荒谬，类似于我们所见到的很多表现文革的作品，没有哭诉，没有愤懑，只有淡淡地记述，毫不关己的记述。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　这是我一贯相信的，最好的艺术作品，没有答案，只有疑问和思考。&lt;br&gt;
　　我至今想不通，剧中有多次已经允许母亲了解这一切的真相，甚至我多次以为她已经了解了；但是在最后，她还是接受，或者表面上接受了那个荒诞的国庆谎言。她为什么要接受呢？我觉得有多种理解：&lt;br&gt;
　　一是她没有看穿真相，她在对过去的温情回忆中逝去了，但这似乎说不通，因为片中她多次的若有所悟，最后娜拉对她的讲述，以及她自己对与丈夫分离的痛苦回忆，都表明，其实她并不喜欢，至少并不从心底完全爱戴那样一个体制。&lt;br&gt;
　　二是她半信半疑，怀着对过去美好的回忆，也怀着对“一切都没有改变”的失望，在国庆的焰火照耀中，黯然睡去。从最后她挣扎着从床上探起身想要看那些焰火，可以看出来。与其说她在好奇，不如说她在向往，向往新的生活，如同楼顶上的那一对青年，他们的心其实是一样的。&lt;br&gt;
　　三是她已经完全了解了真相，但是基于对儿子的爱以及不知道什么原因(被制度压抑过久后的习惯缄默？)而没有说出来，于是她了解了一切，却又不愿意接受新的历史，含着与社会格格不入的痛苦，也报有对新时代的期冀，离开了。&lt;/p&gt;
&lt;p&gt;　　这些都有道理。但这是我第一次在看完一部电影后想不出哪个结论是对的，也许这就是这部片子的精髓所在，时代大潮中，旧的也值得人们去温情地忆起，新的也吸引人们去追求，新旧交替之间的奇景，是每一个人都无法分辨对错、无法知道自己该站在墙的哪一边的。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>社会的良心——听潘根老师讲座有感</title>
      <link>https://blog.williamgates.net/2006/12/conscience-of-the-society/</link>
      <pubDate>Thu, 21 Dec 2006 22:35:35 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/12/conscience-of-the-society/</guid>
      <description>&lt;p&gt;　　曾经听说“知识分子是社会的良心”，颇不以为然，觉得知识分子做好本职工作即可，除非是社会学、政治学家，否则颇不必为“社会良知”“重视教育”之类的事情走与呼。但前日听得潘根老师一席讲座，虽时间不长、所言具体内容有限，却受益良多，方才懂“社会的良心”的涵义。&lt;br&gt;
　　潘老师所讲的，是宇宙学的争论，从宇宙学的一些基本事实，讲到历史上的几个主要理论和模型，再谈到关于大爆炸假说的争论，所涉主题虽颇有专业，但讲解深入浅出，毫无跳跃、矛盾之处，让我这个文科生也能顺利理解。&lt;br&gt;
　　在讲到数学原理的时候，我不禁出了会神，毕竟数学对我而言实在太艰涩。我从小学就喜欢读《飞碟探索》《科幻世界》之类的杂志和书，曾经梦想着能成为一个天文学者，而现在的场景，正是一位这样的学者，一位白发苍苍的老者，在冬日有些寒冷的教室中，面对着台下稀稀落落的人群，面对着不多却听得出神的学生，在高声地、精神地高颂他心中的学术观点，这不就是所谓“真正的大学”应该有的样子么？这不就是每个人梦想中的大学课堂——在来到大学后或多或少会让我们失望的梦想？&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　潘老师讲到他对大爆炸假说的驳斥，集于60年代的一篇论文，却几经周折，在八十年代末才得以发表。我不禁想到，实用科学的东西，这种时候恐怕早已过时了。但是纯理论科学，却历经岁月而不会褪色。这是为什么？因为那句“人性的进化，是很慢很慢的”么？我看不仅如此。最重要的是，越纯粹理论的东西，越接近最纯粹的真理，关于什么是宇宙，什么是人，关于宇宙的意义，人的意义，这些思考，现在看来没有什么特别的实用价值，但并不妨碍它们的重要，因为人若不思考，或只思考吃穿饱暖，便与禽兽无异；人若不去思考自身的意义，不去仰望星空，思考这个世界的本质，便永恒被囚于庸碌之中，无以自省、自知。&lt;br&gt;
　　作为一个法学专业的学生，我和一切实用科学的受教者一样，平时于实用价值想得太多，于哲学、于真理想得太少。我们为了科研的高花费而不屑，因为学究们的迂腐而讪笑，但我们却从未想过，对于真理的追求，正是人类得以存在的意义和本能，而这种面对广漠星空毫不畏惧、却又真心承认自己的渺小的明澈心态，也正是一个理智、开化的社会所需要的。&lt;br&gt;
　　这就是为什么知识分子是社会的良心的原因，因为真正的知识分子对真理的追求，是整个人类前进的动力，这个前进，不是经济指数上的，不是社会制度上的，而是“心灵”上的。从某种意义上说，纯理论科学也不是没有实用价值的，其实用价值也正在于启迪民智，让人类“慢慢地进化”。&lt;br&gt;
　　讲座结束，一位我熟识的朋友从鼓楼赶来，恳请潘老师在他的课本上题写潘老师自己用作该书结尾的话：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;科学在争论中前行&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　一时间，我觉得眼眶甚至有些模糊。在此，对给我上了大学生涯中最重要的一堂课的潘老师，对这位我所敬佩的真正的知识分子，我们迷浊社会中的星火和良心，致以一个学生最真诚的敬意。&lt;/p&gt;
&lt;p&gt;Comment By Eniac@LilyBBS in December 23, 2006:&lt;/p&gt;
&lt;p&gt;　　在浦口校区乘车点乘返回鼓楼的班车时，大家（包括部分学生，也包括很多中青年教师）都骚动地向校车涌去，唯独剩下66岁的潘老独自立在疯狂的人群外，静静看着这一切。我为潘老呼喊，却又总觉喉咙作梗。此时，我听到潘老师轻叹道，“大概这里面没有比我更老的了罢。”——所幸，此时校车尚余空位，而我也像我的好友在文中所提到的一样，“眼眶有些模糊”。&lt;br&gt;
　　距离上次见到潘老的时间已有四年，但上次潘老冒着严寒大雪将167份勘误表送到我们手中的情景仍历历在目。我们是潘老正式退隐后的第一届学生，因此心里总觉缺了些什么，执意要去浦口补上这一课。当我从书包中掏出潘老那本厚重的课本时，我看到前面一位仁兄的会心一笑——我知道，他一定也是为潘老师课本所吸引而前来求学的人。&lt;br&gt;
　　潘老教了四十年的书，仅是为化院教普通物理就有二十多年。在这四十年中，他从来没用过讲稿。然而今天，潘老说羡慕我们的年龄，因为他的记忆力已不复当年，但年轻时所学的东西都历历在目。其实，我又何尝不崇敬潘老的人格魅力和社会良心呢？潘老潜心教学，著书立说，从不放弃自己的观点，并在寒冷冬日，欣然接受邀请赴浦口教学。清华大学老校长梅贻琦先生有一句名言：“大学者，非谓有大楼之谓也，有大师之谓也。”我想，我们不仅需要能发文章，能拿奖项的大师，我们更需要潘老这样的大师。&lt;br&gt;
　　讲座结束后，几位浦口百合的朋友惊讶地问我为何从鼓楼过来，我激动地向他们讲起潘老和化院的渊源，并高高扬起了凝结潘老毕生精力的著作。从潘老的口中，我听说他的书已经再版，并且被列为国家十一五重点规划教材，看到老人家激动之情，我又怎忍心告诉他，如今潘老的书作为化院的教材已经名存实亡，老师根本不屑使用，同学也自视之为累赘，甚至将其淹没在废品回收站的故纸堆里？&lt;/p&gt;
&lt;p&gt;　　“物质能否生灭？宇宙是否有极限？一万年以后还会有争论。正确的答案只有一个。未来的自然科学不是满足于各分支学科自成体系的自恰性，而是要求在综合之后仍能自恰。科学在争论中前进。”不知为什么，每次读到这段话，都有一种荡气回肠的感觉。她写尽了一位以教书育人为毕生己任的老人，穷尽大半生，与主流大爆炸理论相争论，不为人所认可，却又从不低头的辛酸故事。&lt;/p&gt;
&lt;p&gt;　　最后，我愿以潘老的全书后记来结束本文.&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/conscience-of-the-society.gif&#34; alt=&#34;conscience-of-the-society&#34;  width=599 height=&#34;534&#34; /&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>光芒还是灰烬？——读余杰《我的梦想在燃烧》</title>
      <link>https://blog.williamgates.net/2006/12/my-dream-is-burning/</link>
      <pubDate>Fri, 08 Dec 2006 01:35:35 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/12/my-dream-is-burning/</guid>
      <description>&lt;p&gt;　　作为一个毫不害怕承认自己曾经是愤青的人，我一直非常想读余杰的书，毕竟他曾经号称是中国当代热血青年的领军人物，虽然他也许并不齿这类称号。但不知什么原因，直到我过了20岁，已经不在那么坚定的相信民族主义或者自由主义那一套，也就是说我不再那么右也不在那么左，不再那么愤世嫉俗的时候，我突然捧起了他的书，并且只用了三天就看完了一本。&lt;br&gt;
　　读着读着，我总觉得与我记忆中，概念中的那个余杰，有些不一样。一方面，他的评论确实犀利，他的眼光确实独到，他的价值观的确特立独行，但我总觉得缺了点什么，缺了点让一个杂文家之所以伟大的东西；一方面，他的意识形态明显的美国化，他对基督教文明的崇拜，却又没有详细的理论解释他为什么崇拜这种信仰，不由得让人觉得有点不快。&lt;br&gt;
　　看到维基百科对余杰的评价，一部分人认为他是自由派的领军人物，是当代少数敢说真话、敢于直面社会现实的文人和学者；一部分人认为他已经成为一个通过文字讨好各方的谄媚文人。我觉得这两方的观点，正应了我的两个感受。&lt;br&gt;
　　他的一些东西还是非常令我赞同的，例如对暴力文化的批判，对“儒文化是新世纪的世界道德”的批判，对高等教育的忧虑和见解，都可谓精辟。但不知是因为时间过去较久，一些时评已经失去当时的效果，还是因为我最近阅读学术著作较多，只要看到价值判断都喜欢问作者论证何在，总觉得他更倾向一个“文人”而不是“学者”，也就是说更多的诉诸主观的激情，而少有理性的推理和论证，当然这也是杂文的特点，如战斗檄文召唤热血青年们去战斗；但对于我，似乎没有那种热血沸腾的效果。&lt;br&gt;
　　而他一再地对基督教文明、对基督教国家、对国内的基督徒的连篇累牍的赞颂，让人不禁感觉这是一本传教手册。他自己也不是不知道这一点，他明白自己对基督教文明的颂扬导致国内对他的认同度降低，但他还是坚持这一点，也算可钦佩，至少他坚持主张写文章要说真话，我觉得这乃是一个文人的最低的要求，但在当代社会也属不易。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　我突然想到两个人，也许类型不同，但在青少年读者看来并无本质区别：韩寒和郭敬明。他们应该是当代年轻文人“玩个性”最典型的表现，而韩寒至少活得很好，他坦然自己玩文字，坦然自己就是要赚钱，不是写文学，他整天唠唠叨叨自己赛车的输赢，但至少还得了不少奖项，他自愿脱离那个《三重门》的自己，脱离文学，走向他向往的边缘的生活，但是他在自己的梦想中活得挺好；郭敬明就差得多了，写不出东西来还要抄，想赚钱还要遮遮掩掩，可谓连穷酸文人都算不上，成了一个让人提到就皱眉的“现象”，从一开始到现在都只是一个“现象”。&lt;br&gt;
　　某种程度上，大众眼中的两个余杰跟这两个人也有很多相像。我宁愿阅读一个疯狂的倾诉自己内心的杂文家的书，他激烈、犀利、目空一切，他的笔尖如闪电将古树与枯木一齐点燃，我们可以嗤笑他的轻狂无知，我们可以对他的观点不屑一顾，但至少他是在说真话，敢于讲自己的真话说出来的文字，才是如余杰自己所说，是超越自己、达到理想的界限之外的一种方式。我不愿一个人写文章娓娓动听，感人至深，但却没有自己的价值判断，一切只为了讨好和迎合，只为了博取更多的同情或支持，这种人写的东西不用奢谈文学，连文字都算不上。&lt;br&gt;
　　但是，我刚刚读了一本余杰的书，还不知道他到底是自己宣称的说真话的人，还是借着说真话的招牌讨好各方的小人。他说“我的梦想在燃烧”，我却不知道他要说的，是燃烧的光芒，还是灰烬。所以，我选择继续读下去，我觉得此人还算有点意思。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>谁来教我们法哲学？——读林立《法学方法论与德沃金》</title>
      <link>https://blog.williamgates.net/2006/12/dworkin-the-methodology-of-law/</link>
      <pubDate>Thu, 07 Dec 2006 22:15:09 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/12/dworkin-the-methodology-of-law/</guid>
      <description>&lt;p&gt;　　读完了林立先生的《法学方法论与德沃金》，虽未能全然理解其思想本意，也并非完全赞同其对德沃金先生的批判，但舍去具体学术问题不谈，我想到一个问题：谁来教我们法哲学？&lt;/p&gt;
&lt;p&gt;　　作为法学专业的学生，我们大学的第一个学期就开设有法理学这门课。其出发点无疑是让我们培养起专业的法学思维方法，了解一定的法学研究方式。但综观各种法理学教材，回想当年上过的法理学课程，不由惊出一身冷汗：老师讲了多少？我们又理解了多少？&lt;br&gt;
　　我记忆中的，确凿的大概只有一些法学基本术语、基本体系，例如不同法系的概述，不同法学观点的简单阐释等。然后很快地，我们就进入了“社会主义法学”，进入了我国的法律制度的介绍。这些课程，顶多能算“法学基础常识”（正如某些学校已经在法学专业所作的改变），而要谈“法理”，不仅老师不愿讲，学生也不能懂。&lt;br&gt;
　　我们懵懂地接受了一些原则，却从未问过它们本身从何而来，我们坚信宪法高于其他法律，却从未问过宪法的本质，或者即便我们问到了契约论或者天赋人权，却从未把它再深入探究：为什么基于社会契约的制度就是“善”的？我们热烈地讨论“恶法是不是法”，却只是从不成体系的个人道德观念出发，从未从语义学和法理学上思考过，什么是法，法有着怎样的本质？甚至，我们为了废除死刑、为了期待可能性而呼号，却从未想过，是什么力量，让我们合理地将一个法律条文，适用到与它相对应的案件之上(哪怕不需要任何传统意义上的“类推适用”)？&lt;br&gt;
　　是的，你可以主张，在我们的法理学、宪法学、刑法民法教科书上，都有这些问题的答案。但是谁能给一个真正法理意义上的答案，而不要诉诸一如“为了社会安定”“为了生产力发展”“民主法制”之类的伦理学上仍须证明的命题？&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　例如，林立先生对Kaufmann之理论的解释，仅举“类型”学说的部分来看：他论述了“类型”和“抽象概念”之间的区别，并且明确了“类型”学说在法学上的应用价值，他提到：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“类型”代表了不同的行为或事态中，却背负或透显相同的“道理”、“事物本然之理”，虽然这些行为或事态有较大或极大的物理性外在特征上的差异，以至于无法轻易被一条法律的文字陈述网在一起，但是给予它们——不管其物理性外在特征上的差异——的确是呈现相同的“事物本然之理”，因此应该得到相同的对待。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　然后，林立先生论述了，正是因为现实生活中的“生活类型”在立法者笔下变为了“抽象概念”，法律条文必然比现实情况要窄化，必然是对“意义整体性”的“生活类型”之武断的切断。于是得出结论，刑法上的“禁止类推适用”不应是受缚于文字的字义而造成“以辞害义”。&lt;br&gt;
　　另外，林立先生还引用了Kaufmann的理论来解释为什么每一次将法律条文适用于具体案件都是“模拟”，进而推出即使是百分之百符合条文规定的案件，其判决的过程也是一种与类推适用本质上无甚区别的行为，再用此结论驳斥德沃金先生的理论，不管其观点对错如何，其论辩方式的严谨和精彩的确令人拍案叫绝。&lt;br&gt;
　　但是我们的法理学呢，我们从来只能得到口号性的回答，我们学习的理论也许并非建立在空洞的口号之上，但是我们所得到的解释，我们所坚持的一些原则所要基于的“公理”性的东西，并非罗尔斯所说人的本性和“慎思的判断”，而更多是口号，是明确无误不需证明的，却又与人类本性和自然之理毫无关系的定论。&lt;br&gt;
　　也就是说，我们一直在这样的楼阁上建筑，它的根基何在，到底有多深，我们为什么要建筑，这一切都与我们无关，老师只管讲，我们只管记就好了。我相信马克思不是靠他的“德行”之类来传播思想的，他靠的是深入的研究和严谨的论证；我相信美国的开国先哲们也不是靠武力来推广他们的民主自由的，他们靠的是哲学和政治学的论证。而现在，作为(仅仅是被认为是)将要担负一个国家的法制建设的一代法科学生，却在他们完全不“懂”，不了然于心的基础上，在研习学术，在争论是非，他们可能今天支持这个明天支持那个，他们可能为了各种外在影响而改变自己的观点，因为他们甚至没有法哲学意义上的学术信仰。&lt;/p&gt;
&lt;p&gt;　　写这篇文字，只是读了这本书之后感觉到，我们的法理学课程根本没有资格称得上法理学，顶多叫做法学常识，至少，它没有包摄法哲学这一最基础最本质的法学根基。也许是我才疏学浅，也许是我读书太少，到了这个年纪才明白法理学的重要性，也许有很多同学已经饱读法理学经典著作而至少可以算是了解法哲学的基本常识，那么我只能说，我太过拘泥于我看到的、听到的、感受到的周围人的现象，我只看到中国下一代法律人的极少一部分，我再次，像我一个同学做过的那样，所谓贻笑大方之家了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>《波斯纳与法律经济分析》读后感（二）——法律经济分析的价值矛盾</title>
      <link>https://blog.williamgates.net/2006/11/posner-law-and-economics-02/</link>
      <pubDate>Tue, 21 Nov 2006 16:26:27 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/11/posner-law-and-economics-02/</guid>
      <description>&lt;p&gt;　　读林立先生的书，字里行间无不充满着严谨的逻辑论证和强烈的思辨气息，例如他对波斯纳先生所倡导的理论的终极价值的评价：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;其实问题的最终核心，一言以蔽之，就在于：波斯纳只把“社会利益”视为有据的、唯一带给人们幸福的价值，而把道德理论或传统法律中追求的价值视为虚幻的。&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　首先，波斯纳先生批评传统的道德哲学是“教条主义”、“本质主义”，即传统的道德理论都预设某些价值，不惜代价要实现之，但这些道德哲学又未曾自证其预设价值的正当性，故是他无法相信、且厌恶的。“法律使用道德语言是造成混乱的根源，所以从法律中驱逐所有这类的道德语言是一件好事。”(The Problematices of Moral and Legal Theory,p.207)我们可以这样理解，安定的、确定的法律权利(如坚定批判波斯纳先生的德沃金先生所见)在波斯纳先生眼中是一种教条的，也就是说，有必要对每一案件作出实证分析，使用他所坚持的“社会利益”来评价最后的权利归属(也是最初的，因为他不承认一开始就有确定的权利分配)，我们姑且不论这种方法是否正确，是否“正义”，至少我们可以问，所谓“社会利益至上”“社会利益最大化”难道不是一种价值，不是一种预设的终极标尺，这不是陷入了波斯纳先生批判的预设价值的“教条主义”中去了？&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　当然，波斯纳先生是不承认其将一个终极价值视为不可逾越的目标和尺度的，至少在早期著作中，他多次宣称：“当效率这个术语在本书中被用来指称能使价值得到最大化的资源配置时，其充当社会决策的伦理标准之功能是有限的”(Economic Anglysis Law,p.13)，但事实上，波斯纳先生在其后的著作中，一直致力于建立一套完整的基于经济分析、追求财富最大化的价值理论体系。由于没有一个价值理论可以有两个或可冲突的终极价值，当他宣称同样重视和尊重的基本人权、平等和正义与“社会财富最大化”所冲突时，他往往毫不犹豫地选择了后者(例如黑白人同校的案例，他的观点是应该让白人支付大量的金钱以换取合法的种族隔离)。&lt;br&gt;
　　其次，就算“社会财富最大化”是我们所有人应该追求的终极价值，那么它的正当性何在？波斯纳先生也承认这个标准事会忽视公平和(他的批评者眼中的)正义的，但是他的回答就是可以由法官来“把饼做大”，至于分配正义，那是立法者的事情，而且他努力论证并且尝试让一切人类生活领域都化为自由市场、自愿交易的形式，因为在自愿交一种人人都是获益者，所以必然逐步达至分配的公平。但是仔细分析就可以发现，事实上就连这种听起来非常合理的自由市场理论，也是与财富最大化本身所矛盾的。波斯纳先生自己也说“合同法的目的毋宁是为了提升效率、更甚于实现承诺本身(后者是一个不可能的目标，因为大部分的承诺在法律上都是无法被执行的)”(Economic Anglysis Law,p.105)波斯纳先生特别赞赏法官大胆地认为当事人除了合同中明示的意思表示外，还有默示的意思，并且以增进效率的方向去解释合同中尚存哪些默示的条款，而这本身就是一种对合同自由的侵犯，不仅如此，在波斯纳先生的很多论著中都提到政府(在美国既包含司法也包含行政)有义务去实现社会财富的最大化，即采取一种政策性的司法手段去促进社会向着财富最大化的方向前进，这正好是作为古典自由主义者的波斯纳先生所最为不能接受的，非自由的市场。可见，他所追求和宣扬的价值是矛盾的，两者权衡，最后的胜者一定是他奉为至上规则的“社会财富最大化”。&lt;br&gt;
　　所以，正如林立先生的分析所得的结论，经济学的分析进路的确在整个社会学体系中有重要的指导作用，但是任何学术理论都应该是谦抑的、谨守本分的，所以将其用于整个法律体系的分析并且要求指导法律甚至整个人类伦理学的价值构建，就显得力不从心，且有些霸道了。用林立先生的话来说：&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;这种价值观的根本盲点，是先把个人追求“幸福最大化”错误地等同于“财富最大化”，把个人的经济行为误以为是人类行为的全部领域。然后，在认为“财富”即等于“幸福”之后，进到法律规范整个社会的议题后，又更进一步认为法律的目的是“社会财富总量最大化”；然而他没有提出有说服力的道理说明这些财富若没有平均为大众所享有，则为什么那么迫切、不顾一切地要这个“社会财富最大化”，急切到照顾弱势的问题丢在一边不说，侵犯个人的自尊心不说，也讲“法的安定性”弃之如敝屣(不承认人有既有的什么法定权利)，甚至最后导致波斯纳自相矛盾地连侵犯法定个人既有的财产权也在所不惜，而这一切只为了“社会财富总量最大化”，道理何在？&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　本文谈不上读后感，仅仅算是读书笔记而已，只是从林立先生的思考进路分析了一下法律经济分析中的价值矛盾，虽引用不少林立先生的文字，却只是我自己的论证，而未能得林先生观点之精髓，各位见笑了。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>《波斯纳与法律经济分析》读后感（一）——实证科学不是万能的</title>
      <link>https://blog.williamgates.net/2006/11/posner-law-and-economics-01/</link>
      <pubDate>Fri, 10 Nov 2006 20:32:15 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/11/posner-law-and-economics-01/</guid>
      <description>&lt;blockquote&gt;
&lt;p&gt;有两样东西，我们愈经常持久地加以思索，它们就愈使心灵充满始终新鲜，不断增长的景仰和敬畏：&lt;br&gt;
在我之上的星空和居我心中的道德法则。&lt;br&gt;
——康德&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　终于看完了林立先生的这本书，其严谨的逻辑论证、有说服力的思考进路，令人不得不感叹这是一本好书。难得读一本纯学术著作，颇有些稀奇古怪的想法，从今天开始随便记述一点，也算是不枉费这么多读书的时间。&lt;/p&gt;
&lt;p&gt;　　很多次在网上、在现实中与人争论问题，基本上只有两种结果：对方不讲理的，跟我说“我就这么说，怎么样”，这属于没逻辑的，对于这种人就应该用对付傻子的方法，好好敲一敲他们的脑壳，然后关起来养着。还有一种人，这种人是懂得、并且甚至很擅长逻辑分析的，他们喜欢说的是“拿数据来，拿统计结果来”。&lt;br&gt;
　　我一直在想，所谓理工科和文科的真正差别所在，到底是什么？读了林立先生的书，才明白，就是在这一点上。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　现代科学的勃兴，世界各国对自然科学和实验科学的推崇和神化，让世界的主流思潮普遍倾向于将“实证科学”等同于“科学”，再将“科学”等同于“真理”。我们从小接受的教育都是美化甚至神化科学工作者的，并且往往（我相信不仅仅是出于无意）忽视了科学工作者中还有社会科学、特别是哲学、伦理学、社会学等等的存在。所有的教材中都写着，科学是实验的科学，只有通过实验得出的结论才是真正的结论。我们从未认真考虑过，是否有一种东西不能通过数据来表达，只能存于内心，并且是全人类所共知的、公认的，这种东西能不能被称为真理呢？&lt;/p&gt;
&lt;p&gt;　　波斯纳先生是典型的美国式的实用主义者，即使是林立先生所赞同的罗尔斯先生，甚至林立先生本人，包括愿意讨论诸如“什么是最高价值标准”之类问题（而不是把它们当作一种不证自明的道德真理）的我们，都是实用主义者，我们都承认人是自利的，且人有权利和必然的倾向去追求最大的实用价值，区别仅仅在于，我们追求的“实用”到底是什么，有着怎样的标准。&lt;br&gt;
　　我们也曾嘲笑老一辈人对所谓道德标准的执著，也曾对一些看起来假而空的古训不屑一顾，在当代社会里，最常用的反击就是“你说的能当饭吃么？”当然，波斯纳先生不承认他是功利主义者，所以他不会这么反问，但我们不能忽视一点，正是他自己在抨击传统道德是“死板教条”的同时，自己在教条地践行着自己的道德标准，即最大的社会财富（而不是幸福）。&lt;br&gt;
　　这就是典型的理工类科学的思维方式，想要说服我？拿数据来。有诸多参数？全都变成数值，建立模型加以比较和判断。如果用传统哲学的、不可以通过公式、图形、参数来表示的思维进路，即被称为“凭感觉”“不可信”。但是，即便是自称为最靠近上帝的理论物理，也有无法自证的公理存在，否则任何理论体系都无从建立；那为什么社会科学的、纯哲学的思维方式，就是“凭直觉”的呢？&lt;br&gt;
　　正如林立先生所说，传统哲学过多的诉诸“天赋人权”之类的概念，而不将论证的结尾（类似于公理的存在）落脚于人所共知的常识、可以引起共鸣的基本人性，从而缺乏论证的说服力，是现代人不能、或不愿意理解的一个重要原因。但是对实证科学的过度崇拜、对科学的曲解，对生产力、对社会价值的片面理解，不能不说是纯粹文科类科学（而不是较大意义上的社会科学）受到冷落的重要原因之一。&lt;br&gt;
　　绕了一圈回来，林立先生其实就是要说，波斯纳先生用数学的、经济学的，总而言之是实证科学的理论，来霸权地侵入法学、社会学和伦理哲学的领域，是不智的，用经济方法分析一切法律现象并且要求指导一切法律实践的尝试，是无法得到预期结果的。&lt;br&gt;
　　其实伦理哲学、法哲学这类的东西，并不像人们认为的那样难懂。相较而言，至少不会比原子弹的造法难懂。但是有无数的人愿意去学习原子弹的造法，却不愿意理解这更贴近人类本性的理论。并不是这类理论没有说服力——只是大众长期习惯于接受实证的、数据的结论，而不愿意倾听那些更来自他们内心的、本性的东西。所以说，不是哲学难懂，也不能算是民智未开，只是对什么是“真实”的标准，被片面地理解了。我们要说的其实是在每个人心灵里的东西，它们不可以用模型、用数据来表达，但它们却绝不是不存在，绝不是不可理解、没有意义。&lt;br&gt;
　　这些东西比原子弹威力大多了。&lt;/p&gt;
&lt;p&gt;　　本来想严谨地写一点论文性的东西，结果写着写着变成了随感，走题到不知哪里去了。也罢也罢，下次再来讨论讨论关于波斯纳先生和林立先生的观点的问题吧。台湾学者的学术钻研、著作撰写果然认真严谨，绝非某些大陆学者凑字数的那些书能比，这本书看下来，可以写、可以思考的东西太多了，我才学疏浅，还是随便发点感想比较不容易落下笑柄，呵呵。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>H&amp;C II——关于青春，关于成长</title>
      <link>https://blog.williamgates.net/2006/10/honey-and-clover-second-season/</link>
      <pubDate>Mon, 23 Oct 2006 16:18:39 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/10/honey-and-clover-second-season/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/honey-and-clover-second-season.jpg&#34; alt=&#34;honey-and-clover-second-season&#34;  width=1024 height=&#34;768&#34; /&gt;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“时光流逝，总有一天，一切都将变为回忆。&lt;br&gt;
但是，有我，有你，有大家，只为寻找同一样东西的，那段奇迹般的岁月，&lt;br&gt;
将会永远，伴随着甜蜜的痛楚，在心中某个遥远的地方，一直，&lt;br&gt;
都在令人怀念的转动着。”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　终于看完了蜂蜜与四叶草的第二季，虽然不少人说这是狗尾续貂的12集，虽然很多人说没有了第一季那样的感动，但我，还是在静静的夜里，捧着笔记本，泪流满面。&lt;br&gt;
　　我还是坚持我幼稚的艺术观点，一切好的作品都只是提出一个问题，都不会有一个内在的确定的结论，一切取决于感受作品的人。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　如果我是两年前的我，我会为竹本而伤心，明明是经历了那样的成长，经历了那样寻找自己的旅程，明明在成长的路上，牢牢地握住了最爱的人的手，突然间却被剧情安排得连竞争的机会都没有，突然成为一个不会争取、轻言放弃的弱者。森田在放弃了整个人生的时候，有他最爱的人给了他希望，而这个人留给竹本的，却仅仅是伤感的告别，和隔着车窗玻璃的挥手。&lt;br&gt;
　　有一瞬间我真的想像竹本那样大喊，难道没有钱，没有才能，哪怕拥有一颗善良得近乎天使的心灵，就注定要成为配角么？难道真的只允许永远光彩耀眼的人，在该耀眼时有人追捧，该失落时有人安慰，即使退场也要潇洒地挥挥手，不留下一片云彩吗？难道配角就只配拥有微笑着离开的模样，只配拥有安然接受不平的性格，就是为了让女主角离开时，不觉得太过愧疚而存在的吗？&lt;br&gt;
　　可是，我不再是两年前的我。我，也不会再把竹本，当成自己。&lt;/p&gt;
&lt;p&gt;　　如果我是一年前的我，我会想起蜂蜜的第一季，我不会忘记那短短的24集故事给我的人生观的巨大改变，我不会忘记发誓要寻找自己，要真正的体验青春和成长的那种激情，以及因为幼稚和冲动，为了这样童话般的理想而付出的代价。而且，也正是因为蜂蜜，我深深地爱上了动漫。可以说，对我大学生活影响最大的一部作品，就是H&amp;amp;C了。&lt;br&gt;
　　我真的很想假装自己没有看过第二季，我很想一切就停留在竹本车轮下的那小小的四叶草上。生活还在继续，有似乎已经看到幸福的甜蜜，有似乎永远无法摆脱的伤痛，有似乎一生也无法解决的问题。有人在奔向新的生活，有人却安然让自己的人生默默地为别人而延续。花本老师的存在就是一个永远的守护者，永远安排着这一群孩子的生活。森田永远在热情、疯狂和无忧无虑地吵闹着，而山田、真山和理花，却总是在烦恼和伤痛中前行。这些结合在一起，就是一幅众生之像，人生，也正是由这一个个侧面组成的。&lt;br&gt;
　　可是，我不再是去年的我，我不会再去问，消逝了的事物，和从未存在的事物，到底有什么差别呢。我也不再会因为这太过真实又不够真实的故事，去让自己的人生，错过一些什么。&lt;/p&gt;
&lt;p&gt;　　现在的我，看到的不仅仅有离别的伤痛，不仅仅有放弃的悲凉，不仅仅有近乎被欺骗的愤怒，我也看到了，每一个人都是自己的主角，对一个人来说，不存在“将人生交给谁”的问题，不管你怎样选择，终究还是为了你内心最重要的东西。阿久选择花本老师，也就是选择了她要继续打开她的盒子，当一个人为才能太多不能在一生中全部实现而烦恼时，她注定要放弃一些什么，她是幸福的，也是悲伤的。仿佛永远是背景般的花本，却可以大胆的喊出“喜欢，很喜欢”，当一个人为了自己最重要的人而放弃未来的时候，他是幸福的，也是悲伤的。当竹本和森田带着不同的目标转身走开的时候，当竹本带着泪水咽下那带着四叶草的土司时，当森田在晨曦中知道了自己不能放弃人生时，他们注定要选择，也要放弃，他们是幸福的，也是悲伤的。&lt;br&gt;
　　我们一再感叹第二季不如第一季那样令人感到幸福，正是因为它更加真实，它没有考虑给你一个“好”的结局，如果说第一季那并不完美的结局让我们觉得真实而温暖的话，现在我们才明白，那也不是真实的生活，真实的生活中，还会比它有更多更多的猜忌、决裂、意外和头也不回的告别。“最终，我们没能去成海边。”现在的结局，也已经是尽量“温暖”了之后的结果吧。&lt;br&gt;
　　我就是喜欢蜂蜜的这份感觉。&lt;br&gt;
　　可是，我也不仅仅是现在的我，我也曾经是过去的我，我也将变成以后的我。我曾经，正在，并将一直，为配角的小男孩而哭泣，为才能暴走的天才而忧伤，为苦苦等待的善良女孩而扼腕，为突然成为主角的所谓背景人物，惊异、恼怒，以及拍案叫绝。&lt;br&gt;
　　因为，我们的人生，曾经，正在，并将一直，就是这个样子。&lt;/p&gt;
&lt;p&gt;　　我现在终于可以说，蜂蜜不是一部“真实的”励志片，而是一部“励志的”真实生活。它只是将每个人所必经的生活艺术化了，它不是要说教一些什么，它甚至不需要激励你什么，它只是告诉你，生活，就是这个样子。&lt;/p&gt;
&lt;p&gt;　　我们每个人都是幸福的。因为我相信，每一个人，或多或少的，都有选择为了自己心中最重要的事物，而交出整个人生的权利。&lt;br&gt;
　　就像他们一样。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>因为，全世界都在看着</title>
      <link>https://blog.williamgates.net/2006/07/the-whole-world-is-looking-at-you/</link>
      <pubDate>Mon, 10 Jul 2006 15:30:05 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/07/the-whole-world-is-looking-at-you/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/the-whole-world-is-looking-at-you-01.jpg&#34; alt=&#34;the-whole-world-is-looking-at-you&#34;  width=480 height=&#34;375&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/the-whole-world-is-looking-at-you-02.jpg&#34; alt=&#34;the-whole-world-is-looking-at-you&#34;  width=480 height=&#34;324&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/the-whole-world-is-looking-at-you-03.jpg&#34; alt=&#34;the-whole-world-is-looking-at-you&#34;  width=283 height=&#34;400&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/the-whole-world-is-looking-at-you-04.jpg&#34; alt=&#34;the-whole-world-is-looking-at-you&#34;  width=480 height=&#34;325&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　世界杯就这样结束了。四强都是我喜爱的球队，谁赢谁输其实并不是关键。但昨天的比赛过后，还是觉得，有些感伤，甚至在网上说了些发泄的话。但是，仔细想来，不管怎样，这就是历史的痕迹，已经确定的事实。&lt;/p&gt;
&lt;p&gt;　　因为，全世界都在看着。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　不知怎么突然想到，那些精彩的进球，那些疯狂的庆祝，那些遗憾的泪水，那些迟暮英雄的背影，如果没有这么多人看着，如果是发生在学校的一场球赛中，甚至街头巷尾孩子们的一场玩耍中，即使再精彩绝伦，再跌荡起伏，又能如何？&lt;br&gt;
　　没有慢镜头回放，没有高清晰录像，没有激情解说，更没有高举过头顶的金杯——这一切，不仅仅来自场上的球员，不仅来自他们脚下的足球，更来自——全世界都在看着。&lt;/p&gt;
&lt;p&gt;　　突然想到测不准原理，当你观察一个粒子的时候，就已经改变了它的状态，或者说，由于你的观察，才确定了它的状态。进而，又想到唯心主义中的某种观点——如果全世界都闭上眼睛，世界还会存在么？&lt;br&gt;
　　正是因为整个世界都在看着他们，他们在球场上的痛苦与喜悦，悲伤与欢乐，才因此，成为历史，融入人类文化的长河。&lt;/p&gt;
&lt;p&gt;　　是的，英雄也好，罪人也罢，进球也好，受伤也罢，胜者为王当狂喜，败者成寇自多怜，不管是怒射，飞铲，争吵，友谊，带着伤痛下场，背负希望上前，不管是好汉还是懦夫，不管是天使还是魔鬼，这一切，都将成为历史。&lt;br&gt;
　　有人说，世界杯是伪球迷的狂欢节。没错，绝大多说世界杯期间的球迷，都不是真球迷。但正因为这样，只有这项运动，只有这捧金杯，够得上全人类为之狂欢，全人类为之放开工作与生活，为之疯狂和伤悲，哪怕我们不懂球，哪怕我们只是为了迎合潮流，只是为了在这样的节日中不显得孤单，我们也都有资格，成为这狂欢人群中的一员。因为，全世界都在看着。&lt;br&gt;
　　我们注定是观察者。我们不拥有强健的体魄和优秀的意识，我们注定只能在杂草丛生的泥土中寻找足球的快乐，但是世界杯，接纳每一个人，不管你是球场上的英雄，还是球场下的观察者。&lt;/p&gt;
&lt;p&gt;　　决赛的转播镜头，无数次切换到从高空俯瞰整个球场外景的画面。这更让我有一种感觉，整个人类，整个世界，正以上帝的姿态观察着这一场比赛，我们都是渺小的，谁也不会因为我们某一个人的观看而射失点球，谁也不会因为我们某一个人的离席而黯然退场，但是我们是整个世界，当全人类都在看着时，我们，每一个人，都拥有了成为这场狂欢的上帝的资格。&lt;/p&gt;
&lt;p&gt;　　有谁事前能想到？有谁事后会忘记？&lt;br&gt;
　　所以，成败并不重要，当我们从高空掠过，看到那绿茵场上跳动的小点，你会觉得，那些胜利的庆祝，是多么的微不足道；当我们无数次地回放每一场比赛每一个细节，你会明白，那一时的闪光，又是多么伟大。&lt;br&gt;
　　结果并不重要，谁成为英雄谁成为罪人，谁拥有遗憾谁带走了荣光，都不重要，没有人不完美的谢幕，即使是黄油手，即使是齐秃头，即使是某个微不足道的小国某个微不足道的球员，哪怕是在小组赛就被淘汰，哪怕是上场就被罚下，这都是，铭记在整个人类心中的历史，这就够了。&lt;br&gt;
　　因为，整个世界都在看着。&lt;/p&gt;
&lt;p&gt;　　他们没有遗憾，每一个人，都是幸福的，都是胜利者。因为，整个世界，都在看着他们，他们的传奇，是人类的一段历史，必将代代相传。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>I&#39;&#39;S：一个关于奇迹的童话</title>
      <link>https://blog.williamgates.net/2006/04/i-s-the-miracle-the-fairy-tale/</link>
      <pubDate>Sun, 02 Apr 2006 00:25:51 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/04/i-s-the-miracle-the-fairy-tale/</guid>
      <description>&lt;p&gt;　　看完了I&#39;&#39;S的漫画，很后悔自己现在才看到这么优秀的作品，又有些庆幸，在看这部作品之前，看了草莓100%，否则对比看来，可能连看完草莓的兴致都没有了。&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/i-s-the-miracle-the-fairy-tale-01.jpg&#34; alt=&#34;i-s-the-miracle-the-fairy-tale&#34;  width=385 height=&#34;359&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　这是一个关于奇迹的童话。&lt;/p&gt;
&lt;p&gt;　　对一个好似遥不可及的人告白，在放弃的那一刹那，一句随口的话，换来的是一份红着脸的，幸福的回答。&lt;br&gt;
　　自己的女朋友成了电视上的广告明星，成了“大家的”偶像，原本在学校里每天都能看到却不敢接近半步的爱人，在成为自己女朋友之后却没有半点音讯。&lt;br&gt;
　　自己所爱的人在前途最光明的时候放弃了自己的理想，因为她明白她所爱的人，有着更伟大的理想——永远和她在一起。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/i-s-the-miracle-the-fairy-tale-02.jpg&#34; alt=&#34;i-s-the-miracle-the-fairy-tale&#34;  width=317 height=&#34;235&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/i-s-the-miracle-the-fairy-tale-03.jpg&#34; alt=&#34;i-s-the-miracle-the-fairy-tale&#34;  width=701 height=&#34;533&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/i-s-the-miracle-the-fairy-tale-04.jpg&#34; alt=&#34;i-s-the-miracle-the-fairy-tale&#34;  width=259 height=&#34;391&#34; /&gt;&lt;/p&gt;
&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/i-s-the-miracle-the-fairy-tale-05.jpg&#34; alt=&#34;i-s-the-miracle-the-fairy-tale&#34;  width=538 height=&#34;534&#34; /&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;br&gt;
　　如果你的理想，最最心底的理想是为了和最爱的人在一起，那么，放弃其他都是可以理解的。一贵想放弃伊织而没有做到，是因为那是他唯一的，最珍贵的理想；伊织放弃了成为明星的理想，却还有一个更大的理想在等待她，那就是，和所爱的人在一起。&lt;/p&gt;
&lt;p&gt;　　不知道说了些什么傻话，纯属无聊吧。其实这部作品从艺术角度来说还是有很多问题的，过多的擦边球让剧情的吸引力下降，后两个人物的出现，如果说麻生还算是对一贵最好的考验的话（完全一样的人，一个远在天边，一个近在眼前，你会选择哪一个？），泉就纯粹是一个拖戏的人物了。但是和草莓到最后都让人捉摸不定的路线相比，I&#39;&#39;S的思路很明确，从一开始到最后，一贵最喜欢的人都是同一个，其他所有女角出场都是对他的考验而以。他动摇过，很符合一个真实的人的心路过程，而最终他在那样的困境和压力中坚持了下来，我觉得他并不是一无是处的。相比而言，淳平摇摆不定的心更应该被人唾弃吧。&lt;/p&gt;
&lt;p&gt;　　与草莓一样，I&#39;&#39;S也有多余的人物，但草莓毕竟是模仿之作，所以，I&#39;&#39;S这个关于青春，关于爱情，关于年轻的奇迹的童话，当之无愧可算经典。&lt;/p&gt;
&lt;p&gt;　　有些人不信我所信，所以你们看不到我看到的奇迹。&lt;br&gt;
　　有些人看到了奇迹，他们却把它仅仅当作一个与生活无关的童话。&lt;br&gt;
　　只有相信奇迹的人，奇迹才会降临在他的头上。&lt;br&gt;
　　我不是生活在童话中，我却相信奇迹，相信我能书写自己的童话。&lt;/p&gt;
&lt;p&gt;　　我坚信。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>八月照相馆——绝望中的希望，是残酷还是温暖？</title>
      <link>https://blog.williamgates.net/2006/01/photostudio-in-august/</link>
      <pubDate>Mon, 16 Jan 2006 20:55:50 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/01/photostudio-in-august/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/photostudio-in-august.jpg&#34; alt=&#34;photostudio-in-august&#34;  width=399 height=&#34;570&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　一部好电影，应该不是要传达一个什么特定的意义，而只是提出一个问题。&lt;br&gt;
　　每个人看同一部电影，会看到不同的心情。&lt;br&gt;
　　也许有人会为这部电影掉眼泪，也许有人会想如果自己失去了爱人会如何。&lt;br&gt;
　　而我，也有自己的想法。看懂一部电影，是需要把自己放进去看的。&lt;/p&gt;
&lt;p&gt;　　这部片子提出的问题其实就是：给一个注定会失望的人，或者说一个已经应该绝望的人，以希望，到底是坏事还是好事？&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　——我不知道。&lt;/p&gt;
&lt;p&gt;　　从一开始，永元（男主角）就知道自己要死了，但是他只提过一次，对最亲密的朋友，在最疯狂的时候。而平时，他还是一样生活，他没有刻意去追求德琳（女主角），也没有刻意去拒绝。&lt;br&gt;
　　我不觉得他是一个坚强的人，但他也不是一个怯懦的人。他只是一个普通人，他只是不敢也不愿接受自己面对的现实，只好忘却。&lt;br&gt;
　　但是，他还是给了德琳希望。他知道他们不会有未来，但还是没有制止两人的接近。他是自私的么？他是残酷的么？给一个注定没有希望的人以希望，他只是为了让自己最后的人生走得有些光彩么？&lt;/p&gt;
&lt;p&gt;　　希望是双向的。她也给了他希望，一个注定不可能有希望的人。在最后的日子里，他如果过得平淡，如果心境平和地面对结局，就如他自己所说“我没有什么牵挂”，岂不是很好？他所说的，也正是他尝试去做的，不想被感情所牵绊，不想留下牵挂，更不想伤害一个无辜的女孩。&lt;/p&gt;
&lt;p&gt;　　如果你一开始就知道不可能爱我，为什么不早一点拒绝我？&lt;br&gt;
　　答案是，我一开始并不知道，我会不会爱上你。&lt;/p&gt;
&lt;p&gt;　　所以，他们也都是在彼此寻找希望，一个背负着巨大的伤痛，另一个则毫不知情。&lt;br&gt;
　　但是他没有表露出丝毫的畏惧，没有丝毫的绝望，他懂得如何去爱，懂得给她温暖和希望。&lt;/p&gt;
&lt;p&gt;　　我不该挤出笑容，我不该一再退却和迟疑。&lt;br&gt;
　　因为，我本该从心底找出幸福和温暖，告诉你，让你知道。&lt;/p&gt;
&lt;p&gt;　　确诊后，他开始留下各种笔记和指导，让人们学会用他用过的东西。&lt;br&gt;
　　其实照片，不就是我们为了留下些什么，才出现的么？&lt;br&gt;
　　我们所做的一切，不都是我们竭力，而又无助的，想在这个世间留下些什么，在别人的心里留下什么，哪怕明知是徒劳，哪怕明知没有希望，哪怕明知一切都会随风而逝，但还是不断去做的事实么？&lt;br&gt;
　　于是，这种努力，又有什么长短可分？没有了未来的人，也有权利拥有最后的希望，他要在世间留下自己的温暖，也要在自己心里，留下一个人的样子，和感情。&lt;/p&gt;
&lt;p&gt;　　片尾，导演说&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“爱情的感觉都会褪色&lt;br&gt;
一如老照片&lt;br&gt;
但是，你的模样，却永远刻在我心里&lt;br&gt;
直到&lt;br&gt;
我生命的最后一刻”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　我们的爱，哪怕不是双向的，哪怕你不可能接受，哪怕我们注定不能在一起，我们拥有的，我们所追寻的，不就是留下一些什么吗，不就是一段回忆么？哪怕它会短暂，哪怕它不如你幸福的爱情一样长久或热烈，但它们一样，铭心刻骨。&lt;/p&gt;
&lt;p&gt;　　我喜欢不强烈的东西，我喜欢淡淡的感觉。&lt;br&gt;
　　不管是淡淡的快乐，还是淡淡的忧伤。&lt;br&gt;
　　它们，未必不如你们的幸福和快乐，你们年少的激情。&lt;/p&gt;
&lt;p&gt;　　她站在照相馆前，为什么笑呢？&lt;br&gt;
　　因为她看见了自己的相片，在橱窗里。&lt;br&gt;
　　她知道了，自己也已经在对方的心里了。&lt;/p&gt;
&lt;p&gt;　　我们都留下了一些什么，虽然未必是快乐，未必是幸福。&lt;br&gt;
　　但每一段感情都会陪着我们，走过快乐悲伤，走过人生的每一个坎和每一次激动，给我们勇气，也让我们在月夜拎着酒瓶哭泣，就这样伴着我们，&lt;/p&gt;
&lt;p&gt;　　直到生命的最后一刻。&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Narcissu：冰冻的时间再次开始了流动</title>
      <link>https://blog.williamgates.net/2006/01/narcissu-time-goes-on/</link>
      <pubDate>Wed, 11 Jan 2006 15:50:00 +0000</pubDate>
      
      <guid>https://blog.williamgates.net/2006/01/narcissu-time-goes-on/</guid>
      <description>&lt;p&gt;&lt;img loading=&#34;lazy&#34; src=&#34;https://blog.williamgates.net/assets/img/narcissu-time-goes-on.jpg&#34; alt=&#34;narcissu-time-goes-on&#34;  width=500 height=&#34;600&#34; /&gt;&lt;/p&gt;
&lt;p&gt;　　我是不愿意把这个作品称为“游戏”的，更不想用“玩”这个字，只是实在找不到词语来解释了……其实，就像制作人员所说，它更接近于一部小说，虽然 Gal本来就跟小说差不多，但这部更加特别，如果按作者的希望不去听语音的话，这简直就完完全全是一部电子小说，连Gal最常见的选项都没有，一路到底，没有任何可以选择或停留的地方。&lt;/p&gt;
&lt;p&gt;　　结束之后，没有太强烈的感觉，似乎不该笑，但又似乎不该哭，没有太明确的悲伤或喜悦。我该为女主角高兴？还是扼腕？好像，一切都应该在她走进海水的一瞬，被潮水轻松的带走，不留痕迹。&lt;/p&gt;
&lt;!--description--&gt;
&lt;p&gt;　　很奇怪的，这是一部没有让我哭的Gal，虽然它的主题相比其他的Galgame可谓灰暗，虽然我是一个很容易被感动的人，但这一次，我没有流泪，甚至没有特别想哭的欲望，甚至，没有太大的感动。&lt;/p&gt;
&lt;p&gt;　　这绝不意味着这部作品不好。在漆黑的夜里，我坐在床上抱着笔记本，听着淡淡地几乎可以忽略的音乐，看着黑黑的屏幕上被挤压成一小块的图画，细小的字体从眼前流过，一切都如剧中人，简单，压抑，喜怒不形于色，想的比说出来的多得多。我的心情也是。&lt;/p&gt;
&lt;p&gt;　　也许这就是它想要给我们的感受。正如作者所说，最小化的信息量，最简单甚至最简陋的表达，反而是最伟大的虚拟现实。淡淡的，说不清楚的感受，就是它的主旨。&lt;/p&gt;
&lt;p&gt;　　要说思考，能想到的，谈不上获得什么希望或者受到什么感触，只有一点点看似废话的结论：我们会痛苦会失望，其实都是因为我们还有希望，还有未来。不管承受着多么大的痛苦和压力，不管经历多么难以接受的事情，只要你还会痛苦，只要你还会失望，就说明你还心存希望。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“即使这个世界就是那耳喀索斯的化身&lt;br&gt;
而我则扮演着艾歌&lt;br&gt;
我也不会去憧憬他&lt;br&gt;
更不会去诅咒他”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　最后，如果要说悲伤，如果要说有谁会为这个结局流泪，那也是因为，我们还有希望吧。&lt;br&gt;
　　最后，剧中人能选择的，不仅仅是家或者七楼。&lt;br&gt;
　　他们还能选择希望，在没有了未来的时候，还能给自己最后的希望。&lt;/p&gt;
&lt;p&gt;　　这里没有奇迹，没有戏剧化的结局，一切都是正常的生活，有人活着有人死去，不出乎意料，也不震撼人心。&lt;br&gt;
　　但是，在走向大海的身影被浪花淹没时，我们突然发现，即使在最大的绝望面前，还是可以有希望。&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;“但现在……我的心却动摇了&lt;br&gt;
冰冻的时间再次开始了流动”&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;　　说不清给一个注定没有未来的人以希望，是美好还是残酷。&lt;br&gt;
　　但至少她走入海水的时候，有人会留恋她，她，也会留恋这个世界&lt;/p&gt;
&lt;p&gt;　　——这也许就是生活，就是命运吧。&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
