挑选海外域名服务商

根据最新的《境内网站管理》,未备案域名将在 7 月 24 日之前停止解析。由于这一项规定的落实需要各个域名服务商自己实施,如果实施得不好,可能连现有域名的转出也一起给禁止了,到时候可就叫天天不应了。所以趁还有时间,把所有的域名转到海外服务商才是上策。

以下介绍一下我使用过的几个域名服务商,仅供参考:

Google Domains

在域名管理方面,Google 算是后起之秀了。Google Domains 主要是为了完善 Google 的云生态环境,提供一些可以和其它服务集成的功能。基于这一点,Google Domains 中可选的根域名并不多,而且增加的速度较慢。

优势:

  • 管理界面干净,操作简便,无需额外的登录步骤(如果你已经登录了 GMail 的话)
  • 可以使用 Google Wallet 自动续费域名
  • 免费提供隐私保护,即 whois 查询不会显示注册人的真实信息

选择 Google Domains 的主要原因是本博客几乎全部使用了 Google 的服务,统一使用 Google Wallet 来付款比较方便。美中不足的是 Google 的 DNS 服务器由于大家都知道的原因而不太稳定,被迫使用了 CloudFlare

GoDaddy

大而全的服务商,什么服务都有,比如域名、主机、邮箱等,时常用打折活动。但是管理界面一直在升级,并且有部分新界面加上部分老界面的情况,操作比较复杂。

优势:

  • 可以顺便购买主机建站服务
  • 可以使用支付宝

GoDaddy 是我把域名迁移到国外后所使用的第一家服务商。有过一段时间,主机也用的是它家的。后来在 AWS 等云主机流行了之后才迁移了出去。由于 Google Domains 支持的域名并不多,所以之后还有一些域名是先注册在 GoDaddy 然后再迁移出去的。

Gandi

Gandi 是一家主要从事域名服务的商家,同时也提供了主机服务。

优势:

  • 支持几乎所有的根域名
  • 可以使用比特币支付

由于最上面的那一条通知,最近开始使用了 Gandi,把所有遗留在国内的域名全都转了出来。由于一些域名在 GoDaddy 上并不支持,所以就选择了 Gandi。从域名迁移的流程来看,Gandi 的服务基本令我满意。一点小缺陷是它似乎不支持使用信用卡自动续费,即每年到期的时候需要手动再输入一次信用卡信息,才可以续费。相比之下 GoDaddy 和 Google Domains 在这一点上做得很好。

再次提醒

为了避免不必要的问题,请尽快把没有备案的域名转移到国外的服务商。

Javascript 中的 Lambda 表达式

Lambda 表达式是一种简易的函数定义形式,通常在编程语言用来简化代码的结构。比如以下的 Javascript 函数:

在其它语言中的 Lambda 形式为:

Lambda 表达式之所以流行,是因为它可以方便地嵌在其它语句中,比如 Java 8 使用了 Lambda 表达式大规模简化了数组的处理:

Javascript 也终于迎来的 Lambda 表达式,在 ES6 中的定义是“箭头函数”(Arrow Function),第一个例子中的函数可以被简化为:

语法和 C# 类似,而和 Java 不同。

Lambda 表达式基本上可以看成是一个语法糖,但在 EC6 中,它和 function定义的函数有一点点的不一样。你可能已经想到了,就是 this的定义域。看下面的例子:

上面的函数中,一定要使用自定义的 self来把 this传到 .eachfunction中。而使用 Lambda 表达式的话,就不需要这么做了:

箭头函数在 Chrome 45.0 和 Firefox 22.0 以上版本中支持,具体的信息请参考 Arrow functions

Go 语言 select 语句的优先级

Go 语言中,配合通道“channel”的读写操作,特地提出一个 select语句,用于多个 channel 的并发读写操作。例如:

上述代码的意思是,同时在 a 和 b 中选择,哪个有内容就从哪个读,否则输出“No data”。由于 channel 的读写操作是阻塞操作,使用 select语句可以避免单个 channel 的阻塞。 default的作用是避免两个 channel 同时阻塞。

有一个问题, selectcase顺序是随机的,并不是按代码中写的顺序。于是就产生了优先级的问题。比如我想先从 a 读取,a 没有内容的时候,再从 b 读取,就不能用上述的方式了。这种情况下的逻辑要稍微麻烦一点:

描述起来倒是蛮简单,先从 a 读,没数据的话再从两个一起读。这种方式对于读和写操作都适用, default是否需要取决于应用场景。

博客使用了椭圆曲线 TLS 证书

心血来潮把博客的证书更新了,加密算法由本来的 RSA-2048 更换为 EC-256。简单来说,HTTPS 通讯初始化的时候,需要在服务器和客户端之间交换一个 TLS 证书,用来验证服务器的身份。

由于每次 HTTPS 通讯时,都需要下载这么一个证书,它的体积在一定程度上决定服务器响应的速度。传统的基于 RSA-2048 算法的证书,有 2048 位即 256 字节大小,而新的 EC-256 算法,则只需要 32 字节。更换之后,一下子就少了 200 多字节,在网络繁忙的时候,可以有效地传输。

EC 或者 Elliptic Curve,中文译为“椭圆曲线”。EC 是一种新的非对称加密算法。EC-256 所提供的安全性相当于 RSA-3072,已经高于传统的 RSA-2048,但只需要 1/8 的体积,性价比很高。

不过博客的速度已经很快了,更换证书的性能提升应该是感受不到了 :P

禁用 NUC 的快速启动

Intel NUC 有一个 BIOS 设置,叫快速启动(Fast Boot),我一开始不知道是什么东西,想想“快速”那就快速呗,于是就勾上了。之后就发现,再也进不了 BIOS 设置了。

于是我就知道了,这个“快速启动”,就是指开始的时候跳过 BIOS 选项界面,直接进入系统。而如果想再次进入 BIOS 呢,就要先把“快速启动”禁用掉,然后再开机按 F2。

关闭“快速启动”的步骤在 Intel 官网有写,大致是这样的:

  1. 先完全关闭机器,不能是休眠之类的;
  2. 开机的时候按住开机键不放,直到听到三声“哔”的声音,然后放掉开机键;
  3. 这时“快速启动”已关闭,可以按 F2 进入 BIOS。

我一共听了十次共 30 声“哔”…………

然后继续搜了一些其它资料,一位 Intel 员工在一个贴子里透露了一种暴力的方法:

  1. 先关机;
  2. 按下开机键,电源灯亮了之后,直接拔电源;
  3. 然后把电源插回去,开机,就可以按 F2 进 BIOS 了。

好吧,Intel 你赢了。

第六代 Intel NUC 安装体验

两年前购入了第一台 Intel NUC,一种迷你型的台式机,作为家庭娱乐用途。当初只考虑到看本地影片的需求,而没想到网络视频。这台机器可以勉强播放本地的 1080p 视频,但加上了网络传输之后就力不从心了,主要表现在它只能要么下载视频,要么播放视频,于是每看个几分钟就需要停下来等缓冲,体验很不好。

于是我又买了一台新的,NUC6i5SYK。这台机器带了最新一代的 Core i5-6260U CPU,性能肯定富裕了。

具体的配置如下。基本上算是一步到位,可以看很多很多年的视频了。

  • Intel® NUC6i5SYK
  • Kingston Technology HyperX Impact 8G * 2
  • Samsung 950 PRO 256G

硬件的安装很简单,就不详细说明了。底板拆下来之后就可以看到内存和硬盘的插槽,有防呆设计只有一种安装方式,不会搞错。如下图,上面是 M2 硬盘槽,底部是两条内存槽。

硬件组装完毕之后,开始装软件。和上次一样,继续装 Windows。可以在微软官网下载到 ISO 文件,解压到一个可以启动的 U 盘中就可以准备安装了。在安装之前,还需要准备另外一个 U 盘。

使用另一个 U 盘的原因,通俗一点来说,是这一届的开发人员不行 -_-。根据 BIOS 的版本不同,这个 NUC 有一定机率认不出 M2 接口上的设备,也就是硬盘。在安装系统之前升级到最新的 BIOS,需要把新的 BIOS 文件复制到 U 盘上,然后使用 U 盘启动。我一开始也以为这是一个简单的文件复制操作,但实际上并不然。开机按 F7 进入 BIOS 升级模式之后,NUC 会把 U 盘的引导信息覆盖掉,然后重启再进行 BIOS 升级,于是之前制作 Windows 启动工具就没有用了。

当然你可以先升级 BIOS,再用同一个 U 盘制作 Windows 启动盘。如果资源足够丰富,用两个 U 盘可以加快安装速度。

另外,Windows 10 还有一个小小的问题,它认不出这个 NUC 的无线网卡。如果打算装完系统直接使用无线网络的话,U 盘里还需要备一个网卡驱动程序。网卡驱动和 BIOS 文件都可以在 Intel 官网下载到,这里就不详述了。

把上面提到的东西都准备好之后,安装 Windows 还是很方便的,而且 SSD 速度非常快,大概 10 分钟就可以看到桌面了。

具体的评测过段时间再发。

如何战胜 AlphaGo?

李世乭今日再输一场,比分 0:3 负于 AlphaGo,与百万奖金无缘了。而 AlphaGo 今天的表现异常完美,开局 45 分钟左右,李世乭已经招架不住。赛后英文解说 Michael Redmond 更是直言,AlphaGo 很有可能成为继吴清源之后又一位开创新格局的历史性角色。

虽然我不懂围棋,但可以从计算机的角度来介绍一下 AlphaGo 有哪些弱点。看了一些赛后评论,发现多数都是从围棋的角度来讲棋,而忽视了计算机的东西。所谓“知己知彼”,了解 AlphaGo 是怎么工作的,才更有可能击败它。

先说说 AlphaGo 的工作原理。已经有一些文章详细地介绍过了,这里就简单说一下。AlphaGo 决策的时候有两个步骤,一是选出下一步棋所有可能的位置(由 Policy Network 做出),二是在这些可能的位置里,精算一个最优的(由 Value Network 做出)。新闻中提到的 AlphaGo 每天几千万盘棋,都是在训练 Policy Network,就是培养它尽可能找全所有价值高的点。而 Value Network 似乎是在比赛中实时计算的,不需要训练。

Value Network 的工作原理和自然人无异,就是一步一步推演,看看之后几步的胜负情况。这一步骤在讲棋的时候经常用到,嘉宾和主持人都会用棋子摆一摆,并揣测棋手下一步的动向。Value Network 也是这样做的,只是它算得特别快而已。我看了一些现场解说,一般都是算出之后的五到十步棋左右,越到后面,计算的复杂度越高。这对人和电脑都是一样的。

影响 Value Network 精确程度的一个重要因素是时间,比如给它五秒钟,它可以算到五步之后,给它十秒钟,它可以算七步。我重看了一下前两场比赛,刚开场的时候,AlphaGo 大约是每 60 - 80 秒下一步棋;而到了中盘的时候,决策时间会上升到两分钟以上。这是因为刚开场的时候,每个位置的重要性都差不多,算了几步之后发现各个位置都不错,就随便选一个即可。而到了中盘,一个位置可能要算上几十步才能确定它的重要性,于是耗时就上去了。

想要打击 AlphaGo,就必须尽量不给它时间做计算。让它计算的步数减小,提高犯错的可能性。要做到这一点,只有一个办法,增加 Policy Network 选出来的位置的数量。假设一个位置它要算 10 秒钟,那么 10 个并列的位置,它就要算 100 秒,这样就大大地增加了时间上的消耗。时间耗尽之后进行读秒阶段,这个阶段中,AlphaGo 大约 30 秒左右就会给出计算结果,估计是在程序中强制设定了的。很明显,30 秒和 2 分钟的计算相比,30 秒算得不清楚,更容易犯错。李世乭在第二场成功地把 AlphaGo 拖进了读秒阶段,但依然没有把握住,有点可惜。当然主要原因是当时李世乭自己也开始读秒了。

由于 AlphaGo 并不会在局部战场鏖战很久,即它没有局部战场的概念,每次选位置都会从整个盘面入手。虽然这样有很好的大局观,但也损失了不少计算性能。如果李世乭能够尽可能多地制造出重要性差不多的位置,可以极大地增加 AlphaGo 的计算量。而 AlphaGo 的应对方式,要么是增加计算时间,要么是在没算完的时候直接给出一个临时最优解,无论哪种方式,都对李世乭有利。

另外网络上有人提到下模仿棋。虽然模仿棋在围棋界不是什么光彩的事情,但对 AlphaGo 确实有效。所谓的模仿棋就是利用棋盘的对称性,对方在哪里落子,自己就在对称地方落子。对人类而言,模仿棋是有破解招数的(详情略);而 AlphaGo 是否有理解对方在下模仿棋,这一点还不清楚,需要我们的“高级软件测试工程师”来验证一下(笑)。如果 AlphaGo 没有对应模仿棋的特殊策略,按正常情况来选位置,那会相当于自己左右互搏,实际上也会产生一盘不错的棋。

模仿棋还有另一个好处,就是李世乭所消耗的时间不多。在前期节约一些时间,就可以把更多的时间放在中盘拉锯上,就更有可能获得胜利。由田渊栋的赛后分析来看,第一局中盘李世乭曾经一度扳了回来。所以有更多的时间放在中盘,李世乭更有希望赢得比赛。

无论如何,这场比赛都会被载入史册。虽然已经连输三场,还希望李世乭可以放下包袱,贡献出两场更为精彩的对局。