Blog

  • Slim 4初步研究

    Slim是一个我很喜欢用的轻框架,我用它为我的任氏有无轩站点提供API服务。这几天趁着放假,想重新“折腾”一下我的站点,于是就开了一个虚拟机,装好了必要的软件,准备开发。

    然后我发现,Slim这个框架已经升级到了4,有了重大的变化。

    参照Slim官方说明创建项目后,目录结构如下(请忽略其中的nbproject目录):

    • app目录:它包含了对于整个应用来说最基本的一些文件。具体说明如下。

    • dependencies.php:它主要是创建应用全局的容器。应用安装时,会生成logger这个实例。数据库链接的实例也是在这里生成的:

    return function (ContainerBuilder $containerBuilder) {
        $containerBuilder->addDefinitions([
            ...
            PDO::class => function (ContainerInterface $c) {
                $settings=$c->get('settings')['db'];
                $host=$settings['host'];
                $user=$settings['user'];
                $pass=$settings['pass'];
                $db=$settings['db'];
    
                $dsn="mysql:host=$host;dbname=$db";
                $conn=new PDO($dsn, $user, $pass);
                $conn->setAttribute(PDO::ATTR_DEFAULT_FETCH_MODE, PDO::FETCH_ASSOC);
                return $conn;
            },
        ]);
    };
    

    注意,我在这里设置了数据库PDO链接的一些属性。以后在应用的任何地方,只要用到PDO这个类的声明,Slim都会在容器中去寻找PDO的实例,从而保证所有的数据库链接都是统一的。

    • middleware.php:中间件我目前在API中还不会用到。按照Slim的说明,中间件可以在应用运行,修改相应的RequestResponse对象。
    • repositories.php:这里注册所有可以成为“仓库”的类。这是Slim 4新增的文件,用来统一管理MVC中的M;但Slim 4抛弃了M,而改用更轻量的仓库。这也是一个容器。如:
    declare(strict_types=1);
    
    use App\Domain\Book\BookRepository;
    use App\Infrastructure\Persistence\Book\DBBookRepository;
    
    use DI\ContainerBuilder;
    
    return function (ContainerBuilder $containerBuilder) {
        $containerBuilder->addDefinitions([
            BookRepository::class => \DI\autowire(DBBookRepository::class),
        ]);
    };

    注:这里用到的一些类会在后续得到说明。不过可以提醒一下,Slim 4用一个接口(BookRepository)定义所有该仓库支持的操作,而用一个实例类(DBBookRepository)对这个接口进行实现。你可以把它们的这种关系类比成C++中的“hpp/cpp”的关系。

    • routes.php:这是常规的路由配置。请注意,Slim4放弃了一个controller中多个action的做法,而是一个action对应一个controller,如下例所示:
    declare(strict_types=1);
    
    use Psr\Http\Message\ResponseInterface as Response;
    use Psr\Http\Message\ServerRequestInterface as Request;
    use Slim\App;
    use Slim\Interfaces\RouteCollectorProxyInterface as Group;
    
    use App\Application\Actions\Index\IndexAction;
    use App\Application\Actions\Book;
    
    return function (App $app) {
        $app->get('/', IndexAction::class);
        $app->group('/summary', function(Group $group) {
            $group->get('', Book\SummaryAction::class);
        });
    };

    于是,/summary这个路由就会调用Book\SummaryAction::class中制定的action函数。

    • settings.php:全局配置文件。数据库的配置也在此处出现:
    return function (ContainerBuilder $containerBuilder) {
        // Global Settings Object
        $containerBuilder->addDefinitions([
            'settings' => [
                'displayErrorDetails' => true, // Should be set to false in production
                'logger' => [
                    'name' => 'slim-app',
                    'path' => isset($_ENV['docker']) ? 'php://stdout' : __DIR__ . '/../logs/app.log',
                    'level' => Logger::DEBUG,
                ],
                //Database connection
                'db' => [
                    'host'  => 'localhost',
                    'user'  => '****',
                    'pass'  => '****',
                    'db'    => '****',
                ],
            ],
        ]);
    };

    总结:app目录中的,都是对应用全局产生影响的文件。

    • public目录:这里是应用的入口文件。一般情况下,对于一个API应用来说,这里没有什么需要修改的。
    • src/Application目录:这里有四个目录。我们重点要关注的是src/Application/Actions目录。

    根据我的理解,针对API要成立的各类实体,开发者可以进行逻辑抽象分类,形成各个action。在具体实现的时候,一般是针对每个实体实现一个抽象的类,然后对每个针对这个实体的操作定义一个action

    比如我的数据库中有“书籍(book)”这个实体,于是我就暂时定义了两个文件:BookAction.phpSummaryAction.php

    //BookAction.php
    
    declare(strict_types=1);
    
    namespace App\Application\Actions\Book;
    
    use App\Application\Actions\Action;
    use App\Domain\Book\BookRepository;
    
    use Psr\Log\LoggerInterface;
    use Psr\Http\Message\ResponseInterface as Response;
    
    abstract class BookAction extends Action
    {
        /**
         * {@inheritdoc}
         */
        protected $repo;
    
        public function __construct(BookRepository $repo, LoggerInterface $logger) {
            parent::__construct($logger);
            $this->repo=$repo;
        }
    }

    注意到,这是一个抽象类,主要目的是为本类(以及后续子类)引入各种dependency。这里我引入了BookRepositoryLoggerInterface

    //SummaryAction.php
    declare(strict_types=1);
    
    namespace App\Application\Actions\Book;
    
    use Psr\Http\Message\ResponseInterface as Response;
    
    class SummaryAction extends BookAction
    {
        /**
         * {@inheritdoc}
         */
        protected function action(): Response
        {
            $res=$this->repo->summary();
            return $this->respondWithData($res);
        }
    }

    SummaryAction继承了BookAction,完成了action方法。而在action方法中,通过调用repo中对应的方法而获取了数据并返回。Slim4很贴心地可以直接返回json数据,不用开发者再转换。调用的例子如下:

    我们再来看src/Domain目录。

    这个目录中包括用来定义各类仓库的文件。比如我们之前看到的BookRepository

    // /src/Domain/Book/BookRepository.php
    declare(strict_types=1);
    
    namespace App\Domain\Book;
    
    interface BookRepository
    {
        public function summary(): array;
        public function detail($id):array;
    }

    如前所述,这是一个接口,只是定义了各类接口,也就是这个仓库能做什么的定义。

    最后来看看src/Infrastructure/Persistence目录。这个目录对上面提到的接口进行实现。

    // /src/Infrastructure/Persistence/Book/DBBookRepository.php
    declare(strict_types=1);
    
    namespace App\Infrastructure\Persistence\Book;
    
    use App\Domain\Book\BookRepository;
    
    class DBBookRepository implements BookRepository
    {
        private $conn;
    
        public function __construct(\PDO $conn) {
            $this->conn=$conn;
        }
    
        public function summary(): array {
            $sql='select count(*) bc, sum(kword) wc, sum(page) pc from book_book';
            $res=$this->conn->query($sql)->fetch();
    
            return $res;
        }
    
        public function detail($id): array {
    
        }
    
    }

    请注意,这个类的构造函数中引入了\PDO,因此上文提到的dependency就起作用了。

    总体感觉,Slim 4的结构还是很清晰的,耦合度也合适,确实是可以一用的轻量级框架。

    本文推送到[go4pro.org]

  • 地理的报复

    The Revenge of Geography是我在2015年时买的书,今天终于看完了。

    在今年5月28日,为自己立下一个心愿:在50岁-59岁这10年中,看50本书,并按时写下读书笔记。The Revenge of Geography是第12本。

    同时,我也将这本书作为2020年看书的收官之作。作为2020年读书的总结,我在Visme制作了一张时序图:

    ==========

    回到这本书。我之前一直以为这本书没有中译本,后来和中信的编辑大人沟通时才知道,这本书已经有了中文版,中文名为《即将到来的地缘战争》

    这是一本那种我喜欢看的书:不过多纠结于细节,不纠结于那些所谓转瞬即逝(evanescent)的东西,而是从一些最基本的东西出发,进行演绎和推理,得出一些重要的、明确的结论。

    而在本书中,这个最基本的东西就是地理。

    全书共3个部分,15章。第一部分的8章主要是“掉书袋”,介绍了一些基本的概念;第二部分的6章讲述各个重要的地理组成“单元”:欧洲、俄罗斯及独立的核心地带(heartland)、中国、印度、伊朗以及所谓的前奥斯曼帝国;第三部分只有1章,主要集中在美国、墨西哥。

    作者一再强调,他不是地理决定论者,但是也旗帜鲜明地反对所谓“随着各种发展(尤其是交通、通讯、媒体等的发展),地理已经无足轻重,沦为边缘角色”的论点。也就是说,在卡普兰看来,地球仍然不是平的。更进一步,他论证说正是因为有了上述各种发展,地理才越发重要了起来。

    The smaller the world becomes because of technology, the more that every place in it becomes important—becomes strategic, in many cases.

    我个人很赞同这个观点。就拿互联网来说吧!

    一开始的时候,互联网是平的,没有隔断,只有汇聚和分发。可是互联网发展到现在,尤其是在大陆,我看到了更多的隔离和恶意。在这个意义上说,广义上的“地理”又出现了:各大互联网巨头刻意造成的网间壁垒越来越在控制我们(线上和线下)的生活,并控制着各种消费、意识形态。在这样的情形下,技术应该带来的沟通便利消失了,我们面前的是赛博空间中的喜马拉雅山脉和马里亚纳海沟。科技重新定义了”地理“,并利用其独到的领先优势,彻底粉碎了我们对科技本应理所当然却不知为何成为”空想“的期盼。

    这样看来,你还能忽视卡普兰的结论么?

    另外,卡普兰不光是一个地理学家,他对历史分析也有着掌握。在论述中,他经常结合历史学家的结论,来对当今地缘政治进行分析。

    比如他引用了Luttwak对罗马帝国三阶段发展战略的分析。

    公元前27年到公元68年,罗马帝国前5帝(Augustus,Tiberius,Caligula,Claudius,Nero)的Julio-Claudian帝制时期,罗马帝国中心势力的“完整性”使得各从属国无不心悦诚服地宾服,罗马不用派出军队进行征服就能如此。

    公元96年到192年,Nerva,Trajan,Hadrian,Pius,Verus,Aurelius,Commodus统治时期的所谓Antonine系统中,是罗马帝国的territorialization时期。罗马觉得有必要在各从属国到处派兵,目的就是为了保证这些国家的忠诚度,也因此丧失了克劳塞维茨的《战争论》中提出的“军事力量的经济性”(Economy of Force)。

    最后的阶段则是所谓Diocletian的“深度防御”战略。1

    这些引用的分析,暂且不论其在学术界的接受程度和权威性如何,对他的行文还是有帮助的,也为读者提供了更多的视角。

    2012年已经是8年前的事情了。卡普兰在文中进行的一些分析和预测或者说建议,已经得到了部分的证实。仅以此论,本书就是一本有价值的好书。

    最后要提醒的是,本书遣词造句十分艰涩,阅读原文将是一个巨大的考验。

    广告时间:我的新译作《帝国与蛮族》即将由中信出版社出版。欢迎选购!


    1. 对Luttwark提出的这些论断,学术界有着不同的声音,尤其是因为Luttwark本人不是罗马军事史专家,因此他的这些判断仅供参考。作者在书中引用想必有其特定的想法。——译者注。 

  • 蛋壳、社死和利他主义

    众所周知,我一般懒得写时事的东西。原因也不外乎几个:

    1. 翻转和反翻转和反反翻转总是来得太快又层出不穷。

    真相永远躲藏在迷雾之中,也没有任何来自“最高审判官”的澄清——或者即使有这样的澄清,却反而引发了更多的speculation。更何况,媒体在有意无意间、自觉非自觉间总会“适时”地抛出一些新的“问题”,吸引一批又一批吃瓜的群众。

    米兰·昆德拉在《庆祝无意义》(La fête de l’insignifiance)中深刻地指出:

    只是从无穷的好心情的高度你才能观察到你脚下人类的永久的愚蠢,从而发笑。

    更多的时候,我们不是在思考、在思考后评论,只是在无意义中寻求着意义,并为找到的所谓的意义而庆祝罢了。Alas, very droll.

    1. 讨论时事风险太大。

    就我个人而言,之前我写了一篇时事并发布在我的订阅号里,然后就被和谐了。我到现在也不知道我那个帖子的闵赶瓷在哪里。我懒得去问,也不屑去问。幸好的是,我的订阅号并未受影响,还是能发布“正常”的帖子。

    有可能的话,最好不要思考;万一思考了,也不要写下来;万一写下来了,也不要拿出去发表。

    我在微信上发布我的原创,向来都是曲高和寡。有人点赞我开心,有人打赏我更开心,有人留言我最开心——留言才是沟通的正确表达方式。

    ====以上是废话的分割线====

    最近看到不少新闻,比如:

    1. 被造谣出轨女子至今找不到工作:要追责到底
    2. 抓住他了!成都确诊女孩连发三文,四川省委书记为她发声
    3. 那位让学弟“社会性死亡”的清华学姐,自己却倒下了……

    当然还有大量有关蛋壳倒闭的新闻。

    我有一位朋友作为房东参与了蛋壳的租房计划。这次蛋壳倒闭后,他也受到了影响,这几天一直在忙着处理。我在微信上问他处理的结果。他说,他“命苦”,租客也是“命苦”,将自己重要的事情放在了这么一个不靠谱的机构身上。但又能怎么办呢?

    最后的商量结果,是这位(年付的)租客继续住下去,但是要支付原来价格的一半给我这位房东朋友,而我这位朋友损失了这位租客租房期间预期租金收入的一半。

    还能怎么办呢?我朋友的处理方法我是比较欣赏的,并让我想到了我翻译《凯恩斯传:一个利他主义者的七面人生》时在书中看到的一句话:

    如果(梅纳德)面临互相冲突的选择并需要就实际事务的推进选择方法时,合理的原则总是选择最慷慨的路线。

    本来,我们有一个很好的商业模式,一个各方可以得益的模式。但就是因为资本的贪婪和所谓的各种“创意”,让所有人——除了血腥的资本——陷入了多方共输的局面:年付的租客要多付0.5倍的租金,而房东却少收了0.5倍的租金。

    1+0.5=0.5了?!

    这被抢劫掉的1成就了多少人的光环?!却又造成多少人的损失和痛苦?!为什么要让他们承担这些“创意”的代价?!

    回到我文章开头时引用到的三个新闻。这三个新闻都有一个共同点,符合我最近在看的《The Revenge of Geography》中说的一句话:

    But in the future urbanization and electronic communications could lead to less benign expressions of public rage. 但到了将来,城市化和电子通讯可能导致人们在表达公共愤怒时变得更缺乏善意。

    卡普兰写这本书时差不多是在2012年前后,他的预言在8年的时间里得到了验证。

    这是必然的。具体分析我就不展开了,因为展开的结果是这篇文章被和谐。

    以上。

  • This is Game Changer, this is real AI

    《Game Changer》是一本关于国际象棋目前最强的引擎AlphaZero的书。

    根据推算,AlphaZero的等级分在3480分左右;而目前的国际象棋男子世界冠军马格努斯·卡尔森(Magnus Carlsen)的等级分也不过在2860分上下。也就是说,AlphaZero可以轻松吊打卡尔森。

    这本书目前国内还没法买到,也没有翻译。好朋友Vera帮我下单并顺便买单,她实在是一个好人!

    我曾试着和出版社联系,但他们听到这是一本关于国际象棋的书后,就表示很难出版——毕竟说来,虽然人工智能这个话题很热门,但国际象棋这个话题太冷门了。

    我国际象棋水平不高,但是很喜欢下。它能运动的子力以及子力的运动范围和作用都比中国象棋大了很多,所以其变化也就更加多样。

    国际象棋的AI(或者说人机大战)出现得很早。我们都熟知深蓝和卡斯帕罗夫的对战。自此之后,其实国际象棋引擎已经树立了全面超越人类棋手的地位:顶尖的人类棋手已经无法打败一个顶尖的国际象棋引擎

    那么,既然如此,DeepMind的各位老兄为什么还要钻到国际象棋引擎里来?

    我们必须知道一点,在AlphaZero出现之前,所有的顶级国际象棋引擎(乃至包括围棋引擎)都有一个共同点:有关该领域的人类知识的基础

    比如说,国际象棋引擎会被人教导说:开局一般不要重复走一个子(特别是大子)、叠兵一般是不好的、能易位就要尽量易位、双象一般比双马或者马象的结合要好等等……然后,也会被人教导说:后值9分,车是5分,马象是3分,兵是1分……;还有诸如开放线、通路兵之类的“价值”;甚至还有开局手册、终局指南等等。围棋引擎也是如此。

    但是:

    1. AlphaZero的学习不依靠任何与该领域(国际象棋)相关的或者人类的知识
    2. AlphaZero对局面的判定是或然性的(基于它认为赢或者平的机会多大)而不是以领先多少兵来判定——而这是当时所有引擎的判定方式。
    3. AlphaZero搜索它认为最有前途的走法,它的评估是多个可能序列的平均而不是试图找到单一的最佳路线。
    4. AlphaZero的评估函数结构非常灵活并允许它考虑位置因素的组合。

    这是和所有引擎都不同的地方。

    AlphaZero横空出世,在经过4个小时的训练后,DeepMind认为它已经超过了当时最强的引擎Stockfish 8的等级分,在训练了9个小时后,它和Stockfish 进行了100盘的对战,最终取得了压倒性的胜利:28胜,72平,0负。这100盘棋的棋谱得以公开,也正是本书分析的重点。

    作者通过分析这100局对战,总结出了很多AlphaZero的“风格”,比如:它倾向于瞄准对方的王;让自己的王安全;在削弱自己的王翼结构以打开进攻路线前,它会确保中心局势稳定等等等等。这些都是所谓的“后知”分析,是人类根据AlphaZero的下法得出的结论,并不是说AlphaZero“知道”这样下比较好——它根本不知道。它只知道如此这般的下法可以让自己有更多的赢棋机会。

    如今的国际象棋高手都已经习惯于通过某个引擎甚至多个引擎来帮助自己提高。AlphaZero的一些下法完全颠覆了人类多年来的固有下法和定式。这对国际象棋本身的发展是具有革命性意义的。棋手通过向“机器”学习,拓展自己的思路和对国际象棋的理解。国际象棋界甚至专门创造了一个术语“Engine Move”来特指那些几乎无法由人类棋手想到、但顶级引擎一定能想到的“神之一手”。

    DeepMind很有野心,他们是想将AlphaZero做成一个通用的引擎,可以用来下国际象棋(西方主流)、围棋(中国主流)以及将棋(日本主流)。不过,AlphaZero也有局限:它只能进行目标明确、双方对弈、信息全对称的游戏,而如炉石、星际争霸之类的信息非对称游戏下,它就无能为力了。

    这才是AI的正确的发展姿势。

    DeepMind公司并没有停步,就在今天我看到一条爆炸性新闻:他们公司的AlphaFold 2在所谓的CASP14蛋白质折叠竞赛中,拿到了接近90分的高分。

    这才是AI的正确的发展姿势。

    确定蛋白质的空间结构到底有多大的意义,我就不说了。有兴趣的可以自行搜索。

    我总是忍不住地想,只要人类中还有这样的科学家,人类发展的前景就将是美妙的。

  • 乡思岂因在他乡

    这是我“50岁后读50本书”计划的第10本书。马克一下。

    这本书是思客读书会中好友梁老师介绍给我的。当时,作者沈建东老师托梁老师找人帮忙为她的新书《知味苏州》想个英文名字。梁老师找到了我,我也就不揣冒昧地想了几个名字。其中一个Deep Rooted Suzhou Flavor获得了沈老师的肯定和选用。作为感谢,沈老师又拜托梁老师转增一本她的亲笔签名新书给我。此乃本书来源。

    ==========

    任氏一脉,目前已经在苏州立足了五代。从我的太爷爷在民国初年从无锡迁居到苏州算起,已经百年有余。

    我出生在阊门皋桥堍。当年老屋如今仍在,不过早已易手。我这一脉,从我爷爷开始就是长房。身为长孙且是孙辈中唯一的男性,自然从小得宠。虽然当时物质发展水平远不如今日,但在吃食方面,我好像就从来就没被亏待过,所以从小就被“惯”成一张很刁的嘴:非时令不食、非色香味形俱全不食。

    如今的我已届天命之年。时代变迁,小时养成的吃食习惯却难撼分毫。身为北方人的岳母大人多年来为家人操持后厨,也被我和太子的吃食习惯“训练”成了一个出色的南方厨师。不过,限于各种材料和设备,有些吃食是实在无法再尝了。

    感谢沈老师这本书,实在地让我在脑海中好好地过了一把瘾。仅仅在纸面上看到各种吃食的名字,已经让我食指大动,更回忆起幼时种种场景了。

    沈老师这本书涵盖极广、考据极深,文字和插图相得益彰,是难得的一本学术性、趣味性乃至实用性兼备的好书。从文字中可以看出,沈老师是一位极认真、极博学的人,对苏州的“味”真实地有着最真最深的热爱和眷恋。非如此,不能写出如此灵性、如此严肃、如此贴切的文字。

    我感到唯一的一个小小遗憾,就是本书中好像没有太多地讲到苏州的卤菜。苏州的卤菜和其他卤菜不同,更是下酒佐饭的妙品。我从小就习惯吃苏式卤菜,所以如今对各类广式、潮式卤菜表示统统不能接受。

    老家附近就有一家陆稿荐(现在仍在),小时候家中来了远客,我就会被派去买点卤菜,然后顺便可以从营业员手中蹭点切下来的叉烧碎屑吃。近几年喜欢走城墙,从相门上经盘门到阊门后,我还经常会拐到杜三珍,买点苏式叉烧带回家。若干年前,一位老同事不慎跌了一跤,成了独脚仙,住进了医院。我走完城墙,到杜三珍去买了一些叉烧带给她零吃。她高兴得不得了。这时的叉烧就不再是下酒佐饭之菜肴了,而是先严常说的“消闲果子”了。单以此论,苏式叉烧才是(所有)卤菜中的极品啊!

    看完此书,倒令我这个生在苏州、长在苏州的老苏州人有了从未有过的乡思。

    乡思岂因在他乡。

    这可真是我一开始没想到的。

  • Queen’s Gambit

    用最快的速度追完了Netflix的最新网剧《Queen’s Gambit》第一季,毫不犹豫地给了10分。

    先说说中文译名。首先,女王的开局、或者女王的棋局这样的翻译引申太远了。Queen’s Gambit是国际象棋中的一个非常常见的开局,就是翻译为“后翼弃兵”。

    这个开局的前三步走法是:

    1. d4 d5
    2. c4

    这时,黑方可以接受弃兵,也就是用自己的d5兵吃掉白方的c4兵,从而进入所谓的“接受后翼弃兵”变例(Queen’s Gambit Accepted,或QBA),也可以不接受弃兵而改走2. … e6挺起自己的黑兵而保护自己的d5兵,从而进入所谓的“拒绝后翼弃兵”变例(Queen’s Gambit Declined,或QBD)。

    这个开局是最古老的国际象棋开局之一,在斯坦尼茨塔拉什两位大师的研究下,该开局变得非常流行,在20世纪20和30年代达到巅峰。1927年国际象棋世界冠军赛,卡帕布兰卡阿廖欣的36局对战中,只有2局没有采用后翼弃兵开局。由此可见当时这个开局的风靡程度和被研究程度(以及还未被研究的程度)。2018年国际象棋世界冠军赛上,卫冕冠军卡尔森和挑战者卡鲁瓦纳的12局常规对局中,有2局采用了QBD开局。

    在本剧中,女主Beth和Borgov的终极对局就采用了QBD开局。

    =========

    谷歌曾经推出过深蓝,然后又在2014年通过收购DeepMind Technologies推出了AlphaZero。2017年12月5日,AlphaZero通过24小时的自我对弈训练——而且在训练时不借助任何开局手册和残局指南——已经达到了超人类的水平,等级分在3500以上(而目前的世界冠军卡尔森的等级分不过2882,而且大家也知道,等级分越高后再提高的难度有多大)。也就是说,AlphaZero可以“吊打”卡尔森。

    AlphaZero的棋局有一些得到了公开,比如这本《Game Changer》就详细分析了AlphaZero的多个棋局。任何对国际象棋有兴趣的人都应该买一本。

    AlphaZero给国际象棋带来的冲击是令人着迷的。它在开局、中局、残局时,在局面、子力强度、兵型、棋子的行动力、弃子以换取时间空间并造成伤害、异侧易位、防守等等方面,都给人类棋手带来全新的理念。

    当然,AlphaZero也不是一枝独秀。在AlphaZero的影响下,国际象棋社区开发出了Leela Chess Zero,该引擎和老牌Stockfish引擎在所谓的TCEC(Top Chess Engine Championship,顶级国际象棋引擎锦标赛)中,展开激烈的厮杀。从2018年11月开始,两者交锋5次,战绩是2:3。

    国际象棋超级引擎的出现,给人类棋手带来新的思路。很多世界顶级选手早就配备了一个或多个引擎,为自己训练和做对战准备提供一个强大的机器对手和“教练”。国际象棋界甚至专门创造了一个术语“Engine Move”来特指那些几乎无法由人类棋手想到、但顶级引擎一定能想到的“神之一手”。

    我很喜欢看国际象棋,虽然我的等级分很低,属于菜中菜,但这不妨碍我欣赏国际象棋对局。有限的平面空间内,兵的挺进和升变、象在斜线上的远程威胁、马的腾挪、车的强大火力、后的八面威风以及王的威力,子力的交换、对局面的判断、各种战术的综合运用、残局的精准计算……都很让我着迷。

    人类对这么一个成熟的游戏已经进行了很多代人的研究,而引擎——更确切地说是AI——的出现,为它赋予了全新的生命力。已经下过的棋局不计其数,但即便是高手对局中还是会出现completely new game。

    我想,这才是AI的魅力所在和发展方向吧。

    最后,小小地剧透一下。第一季终,当Beth战胜了Borgov后,Borgov拿起自己的黑王将它交给了Beth。这个黑王是不是会有什么玄机呢?我想,这应该是第二季的内容了吧——只是不要变成烂大街的谍战才好。

  • 《日本权力结构之谜》读后感

    承蒙中信孙未末老师的努力和辛劳,我最新的译作《日本权力结构之谜》终于付印。

    这本书应该说是比较被期待的,在豆瓣相关页面标记了“想看”的人达到了1172人。我想,一部分原因是因为很多人看过了《菊与刀》——一本受到极度好评的书。但可惜的是,《菊与刀》成书太早(虽然《日本权力结构之谜》成书也不算新),观察的对象有限,对日本投降后的观察只能说是不够的。

    那么,《日本权力结构之谜》一书的特点也就呼之欲出了:

    • 成书时间相对较新。作者成稿时间约在1988年底,同时特别应邀为此次中文版增写了第17章《改变与困难的平成30年》。
    • 观察对象多、时间非常长。沃尔夫伦在日本待了25年。身为特派记者+外国人的他,显然享有一些“特权”,可以接触各方面的人,更不乏与高层人物的接触,从而可以听到在几杯清酒之后才能吐露的真话。
    • 独到的视角和分析。我个人愿意信任作为记者的作者的视角和分析能力。在我翻译和请朋友帮忙进行试读时,我请他们就此发表意见。他们从事不同的工作,更不乏在日本工作生活多年的人。他们的反馈,我可以总结成三点:
      1. 过去不知道的事情,看完后知道了;
      2. 过去/现在不理解的事情,看完后理解了;
      3. 对未来的日本发展,有了全新的看待方式。

    我想,一本书如果能做到上述三点中的任何一点,已经可以被称为一本“有用”的书了,更何况本书做到了如上三点。

    作为译者,前后全文通读了本书不下4遍,在实体书到手后,又马不停蹄地看了一遍。我不敢说就此对日本的理解有了什么本质上的突破,但我觉得如下几点是我的深刻体会。

    首先,一个组织(小到一个作坊,大到一个国家——以下定义同)必须要有一个目标才能建立、生存、发展、壮大、存续。

    对于日本来说,这个“目标”就是维持“日本人性”。

    说实话,我对一个组织能以一个如此抽象的东西作为目标,是很意外的。不过,日本历代的政府显然找到了比较“完美”的落地方案:将“日本人性”具体化,用“和(wa)”作为最终的追求,从而训练出一批对此忠诚并不遗余力地加以宣传、贯彻、实施的官僚和政客,再将他们紧紧地与与之相关的实践、利益绑在了一起。从而最终达成在没有任何“终极真理”、没有任何“终极命令官”的条件下,国家机器被调动被激发起来,在经济上得以全面发展、扩张、侵入的结果。

    在西方政体中,我们很容易找到这样的“终极真理”和“终极命令者”。但作者明确并一再指出,在日本不存在这样的东西。

    一个自然的问题是:那么到底是什么维系了日本政府,同时赋予政府以“正当性”?在回答这个问题之前,我想跳出去一下。讨论在极端混沌情况下,高度组织的结构产生的问题以及这样的结构的一些特性。

    在宇宙这样的大尺度下,这样的情况是非常常见的——否则我们就看不到银河系、太阳系、我们的地球以及众多的生物。这是在极端混沌前提下,高度组织能够自发出现的极好例子。

    很早之前我看过一本《混沌——开创新科学》,一直以来有这样的想法:这样的情形应该可以出现在非自然科学领域——自然也包括政治领域。

    日本也许正是这么一个很好的例子。它表明的是,在没有“终极真理”(没有规则)、没有终极命令官(不存在外部干预)的情况下,一个政府是可以形成的。

    以上从一些我觉得我能掌握的原理出发,解释了这样一个政体存在的可能性——如果谈不上必然性的话。

    让我们回到之前的问题:到底是什么维系了日本政府,同时赋予政府以“正当性”?

    一个常规的政府,其合法性来自于超越政体的法律体系、人民做出的选择、超越性的“信念”(如宗教)。作者尖锐地指出,在日本这三样东西都不存在:没有法律体系(或者说法律无法被实施)、人民没得选择、也没有一个宗教。所以,其实我们可以说,日本政府很脆弱、几乎没有“正当性”。

    可是这个政府已经存在那么多年,为什么?

    我觉得,一个原因是这个政府在二战后很大程度上是由外力建立起来的。而正如作者指出,日本民族对强于它的势力,一直有着敬畏。这种敬畏转为变成对其“创造”出来的一切东西有一种崇拜。

    另一个原因,在于二战后共产主义的蓬勃涌现,使得美国调整了整个西太平洋战略(以及对日战略),从遏制军国主义+重建民主变成遏制军国主义+遏制共产主义。日本战前和战时政府中的众多顶级官员战犯(其中就有前几天刚创造日本首相任职最长记录的安倍晋三的外公岸信介)被刻意安排无罪释放并进入了战后的新机构重新执政。

    在我看来,这样的刻意安排也许在事实上给日本政府制造了一种因连续性而带来的正当性。而普通日本人民也可能因为这样的连续性而认可了其稳定性、一贯性:既然一切照旧,那么自然一切OK

    这样的情形是有类比的。比如,我另外一本还没出版的译作(初定译名《帝国与蛮族》)中讲到,欧洲的很多新兴国家就要通过追溯其历史而确立对某一块领土的合法占有性。惟其如此,这些国家的人民才能心安理得地生活在这块土地上,并接受统治阶级的领导,并捍卫自己和国家的利益。

    ==========

    说几句题外话。

    这本书到底是不是如豆瓣某书评所言,是一本“批判日本的书”,而不是一本“解构日本”的书?

    我个人对这本书的判定正好与上述相反。

    首先,这本书进行了很详细的所谓政权结构分析,甚至涉及到了很底层的政府机构和黑社会,并分析了这些“组织”间的关联关系。以作者25年在日经历作为背景,这样的分析我相信是到位的、精准的。

    其次,如果我们从“批判”最广义的定义出发,自然这本书可以称为“批判”;如果从“批判”比较狭义的定义出发,那么我觉得将这本书认为是“批判”可能略微过了一点。毕竟,讲出事实和自己的判定,离真正狭义上的“批判”还是有一定距离的。

    ==========

    那么,请允许我冒昧地总结一下:

    日本,因战争而屈服,并接受了外来势力以日本历史为参照而实施的相应改造,调整了日本的“优先级”。日本和外来势力由此构筑起相应的初始组织。之后,通过系统性的(虽然是没有中心的)剥夺选择、固化思想、可能无意识但利益一致的协同,完成了一个类似自组织那样由上到下、由大到小、由宏观到微观的精密自相似结构。我能想到的一个合适的形容词就是“混沌”。

  • SETI@home

    今天一早,作为出门前常规的浏览工作,我点进了我的BOINC客户端,看到了一则老消息——我不怎么检查这个客户端的运行,只是偶尔去看看——说SETI@home将不再发放任务了。

    突然有点感伤。

    我是2000年1月27日加入的SETI@home项目,它是美国加州伯克利大学的BOINCBerkeley Open Infrastructure for Network Computing,伯克利用于网络计算之开放架构)最早的项目之一。

    BOINC项目鼓励各位拥有电脑且联网的人自主加入,参加各项有趣的科学计算。它的原理是,计算机有很多时间是“空闲”的——最常见的比如你在打字的时候必然有的间隔、长期不操作鼠标键盘的空闲时间,经过恰当的软件设计,这样的空闲时间可以用来进行一些很耗时间的科学计算。一台电脑的空闲时间和计算力有限,但是全球那么多挂在互联网上的电脑综合起来,空闲时间和计算力就会很可怕,可以有效地作为超算的补充算力。

    根据维基的介绍,BOINC的第一个项目就是SETI@Home。伯克利大学在SETI@Home的基础上,将其通用化从而成为一个平台来为其他分布式计算应用提供相应的任务分发、计算、提交等功能。目前,在该平台上进行计算的科学项目包括:数学、语言、医药、分子生物、气象、环境以及宇宙学等。

    SETI@Home的全称是Search for Extraterrestrial Intelligence at home(在家搜索地外智慧,或者俗称为“搜索外星人”)。目前我还参加了:

    • Einstein@Home:搜索来自脉冲星的微弱天体物理信号,信号来自LIGO引力波探测器、Arecibo射电望远镜以及费米伽马射线卫星等。
    • Rosetta@Home:对蛋白质结构进行预测。
    • Amicable Numbers:搜索友好数。

    所谓“友好数”是说一个自然数的真因子之和等于另一个数;而另一个数的真因子之和等于第一个数。最小的友好数对是$(220, 284)$。因为$220$的真因子包括$1,2,4,5,10,11,20,22,44,55,110$,加起来是$284$。而$284$的真因子包括$1,2,4,71,142$,加起来正好是$220$。详情请见维基百科相关词条

    最近一直在看一本数论的教材:Number Theory Through Inquiry

    数学我不算学得很好,但至少一直读到研究生的时候都能保持A,所以一直保持了对数学的兴趣。

    我对SETI@home还是挺有贡献的——虽然至今未能找到一个外星人!但是我在我参加的组中,贡献值排名第三,还在2008年12月12日捐赠了25美金。

    按照官网的说法,这个项目目前进入“冬眠”状态,不再发放新的任务而全力进入后台数据分析,并乐观地希望能找到ET!

    希望这个项目能早点回归!

  • 今日二三事

    首先,今天是卖萌日,还没有卖萌的,赶快去卖萌啊!

    大家都知道,我不喜欢写时事,但是今天还是有很多很有意思的事情。所以就记一笔。

    1. NBA直播重新启动

    今天得到消息说,尘封已久的NBA直播在央妈妈的频道得以恢复。而今天正好有湖人对热火的NBA总决赛第5场。

    我记得NBA直播被封是在去年10月的样子,因为某支NBA球队以及NBA总裁的不当言论,引发了后续的封杀。

    今天能恢复直播,我看到了不少解释,比如这篇,有兴趣的可以自己移步。

    不过我想,今年因为新冠疫情,众多重大赛事(如东京奥运会)被迫取消,而中美之间的关系进入了前所未有的低谷。随着美国驻华大使布兰斯塔德的离去——为什么我想起了《别了,司徒雷登》?——中美两国之间的外交关系突然降到了代办级。

    不过,正好我也想起了另外一件往事,当年中美建交,不也是由乒乓球开始的吗?小球推动大球,这个可以再来一次。

    1. 360推出了仅限Android的所谓“翻墙”浏览器Tuber

    据说,这款软件已经在国内各大商店下架了。这比之前另一个所谓的“合法授权”翻墙软件的存活时间还要短。想到我们的政府时时在关注这样的一些小事,我感到很欣慰。

    这样的软件不会存活的,因为它有一个致命的问题:直接承认了伟大新长城的存在。

    同时,360推出的软件我也不会用。

    最后,在所有主流浏览器都推出Incognito浏览方式的大环境下,居然有一款浏览器需要实名使用,真的不是秀逗了吗?——当然不是,因为360的老板比我有钱得多了。

    最最后,给个建议,已经装了Tuber的,卸载吧。这个世界太复杂,一下子接触太多(哪怕是被过滤后的)东西,冲击会太大。

    1. 美国国务院公布了来自H女士私人邮箱的邮件

    网址如下:https://foia.state.gov/search/results.aspx?collection=Clinton_Email

    注意,这是正牌的官方网站,所公布的内容也肯定是经过核实的,也是经过过滤的。

    我不会有时间浏览全文,TLDR。

    正值美国大选,公开这些文字显然不是没有目的的。我是一个吃瓜人,Ich bin ein Melonenfresser。

    2020年10月10日,Another Day Of No Significance.

    (注:这篇文章在微信发布后速度被封。懒得去申诉。)

  • 转发需谨慎

    社交媒体(SNS)用了这么多年,总归有转发的时候。转发也是所有SNS不可缺少的功能——虽然各自实现的机制和背后的思想不同。

    饭否

    饭否的转发是我比较喜欢的。下图是一个典型的饭否消息及其多次转帖:

    其转帖过程是:

    [mermaid] graph LR; 猛老师原创–>肾老师转发+跟帖1–>猛老师转发+跟帖2–>苏老师转发–>王老师转发 [/mermaid]

    所以,同一个操作可以完成转发和跟帖两个动作。另外,值得注意的是,上述过程中的肾老师是我,我认识猛老师,但不认识后续转发的另外两位苏老师和王老师(或者严格地说是没有fo他们)。然后,通过这种机制,他们在转发时包含了我的跟帖,饭否就会认为这是对我的一次提及(文字中包含@肾*),我知道我的跟帖得到了传播。而自己的话语得到传播,不是所有SNS的根本功能和用户的根本诉求吗?

    另外,通过这样的转发,我能“知道”更多新的朋友。我不一定要去fo他们,但我fo的很多朋友就是通过若干次这样的间接转发,从而知道互相还算“臭味相投”,最后互加好友了。

    当然,这样的转发会受到140字的限制。层层转发后,正文前的@...就会很长,从而会将真正的正文截断。这当然是一个缺点,但不是根本性的缺陷。

    首先,对我这样的“礼貌”用户而言,我在转发时如果出现上述情况,我会将中间的@去掉,保留最早的那个“原创”者的ID,再酌情保留几个有趣的跟帖和ID。

    其次,即使是在140字的限制下,这样的情形也难得发生。

    也许有人会问,我要发很长的内容咋办?有可能出现一次转帖就截断原文的情况啊!

    这也可以解决。

    如果你有自己的博客平台,你可以在平台上完成写作,然后在SNS平台上转帖你文章的URI;如果你没法做到这个,那么可以将内容做成图片发布。

    现在国内的大多数SNS平台,其SNS功能十分的畸形,却在写作功能上浪费了太多的精力。而且,其平台的版权声明(或者说EULA)十分地变态。我不是一个专职的法律从业人员,也有需要用这个评价发布内容的需求,所以我宁可选择上面提到的第一种方法:在自己的博客平台上写作并第一时间发布,严格保留自己的版权,在SNS平台上进行转发。

    =====

    我很少转发文字(包括“新闻”)。我自认孤陋寡闻,很少知道这个世界上发生了那么多“震惊!”、“灾难!”、“首次披露!”的事情,也很少相信会有那么多“震惊!”、“灾难!”、“首次披露!”的事情。

    第一,“你”很难成为某件事情的第一知情人——除非是发生在你身上的事情,那再除非你是美国总统这样的人,那么在你身上发生的事情一般而言没有成为新闻的价值。

    在这样的情况下,你从一些渠道得知了“震惊!”、“灾难!”、“首次披露!”的事情,第一反应也许不是他怎么知道,但肯定要想一想:我怎么会第一时间居然知道了?而身边其他人需要我来让他们知道?!

    第二,这个渠道所知道的这个东西,符合它的定位和知识面吗?你fo了这个号,很好,这是无所谓的。平时这个号一直在谈A,突然开始谈起风马牛不相及的B。而其所做的将其关联起来的努力,一看就十分勉强,没有任何内在逻辑,只是为了证明自己造出来的“论点”而进行了摘取、裁剪甚至编造。这么得到的结论有多少可信度?

    第三、这些东西,符合我自身的一贯逻辑吗?

    第四、就算我一直被洗脑,但这些东西符合社会发展的一般逻辑吗?

    三和四出现乖离是很可悲的事情。但是,这种乖离也是可以得到纠正的。正因为社会发展的一般规律是更大尺度、更高层次的规律,所以,就算别人要对你洗脑,也要这一套规律。

    不简单地看别人怎么做,而要去想他为什么如此做、如此做后面的规律何在?这些规律和他所主张的东西有没有乖离?

    这个过程不是一个简单、直接的过程,甚至会很痛苦。

    我在多年前就说过,人最难做到的就是挑战自己。就是不断地自省、内观。而用社会发展一般规律来修正自己已经成型(也许已经成型很久)的观念和框架,就是一个最大的挑战。能迈出这一步的就是勇者,能坚持如此并有收获的,就是强者。所谓“胜人者力,胜己者强。知人者智,知己者明”啊!

    ====

    转发而不加评论或只加一些模糊的评论,也是很狡猾的做法。我不说对这个原文的立场,而将这个责任留给了受众。当然,所有人都有判断的权力和义务。但是,一个纯粹的传谣,被人指出后还羞赧地说:我也不知道,所以就转出来。如果此人由于种种原因无法获得全面信息、或者内容本身很难验证还算有情可原,那么对于只要某度一下就能知晓的事情,再行如此不负责任地转帖就有点耍流氓了。在我看来,这样的人很可能抱着这样的心态:万一要是真的(虽然只有亿万分之一的可能),我就成了这个群里最早向大家揭示真相的人;万一要是假的,反正也不是我一个人在转,何况我也说了,我不能确定。

    可惜的是,如果对陈述没有任何信心,也根本不愿动动鼠标去验证一下,那么这样的转发只能是传播谣言。亿万一你传了真的消息,也不是因为你信它为真,而是因为赌了一亿把,总也有你赢的时候罢了。

    当然,本文还没有论及一些所谓的“学术”文字。这样的文字也会被广泛转播,而且真伪极难判断。也许有空后,我再写点这方面的文字吧。

    乔帮主说过:Stay Hungry, Stay Foolish。这里的foolish不是说你不要学习——当然要排除伪学习——而是所谓的ipse se nihil scire id unum sciat(一般翻译为“我知道我一无所知”)。这是一种审慎、一种谦卑。