Blog

从1到N的漫长路程

Content #

2017 年,英特尔公司以 153 亿美元的天价收购了 CSAIL 校友创办的 Mobileye 公司(以色列一家无人驾驶技术公司)算是该实验室最成功的创业案例。既然硅谷没有太多从 0 到 1 的发明,为什么它比别的地区更擅长利用别人的原创发明,做出改变世界的事情呢?斯加鲁菲给出了两个原因:叛逆和执着。

今天,不少人也把颠覆现有行业放在嘴边,但是真正实现了颠覆的人很少,反而山寨的人却很多,这又是为什么呢?因为叛逆者们颠覆现有秩序不是一件容易的事情,要想改变世界,需要有常人所没有的执着。桂谷的叛逆者们为了达到目的,首先会想尽办法去寻找那些可能颠覆现有产业的技术(注意:是寻找而不是发明),这样,那些在其他地区被发明却又被束之高阁的技术,就被硅谷的颠覆者带到硅谷继续发扬光大。在前一节中我讲到过,新技术常常不可靠,时灵时不灵,要将这样的技术转变成产品,需要有足够的耐心和智慧,克服一个又一个困难,走完从 1 到 N 的漫长路程。

以无人驾驶汽车为例。在谷歌开始开发这个产品之前,卡内基-梅隆大学已经做了几十年,但是技术非常不成熟。2004 年,它研制的无人驾驶汽车原型花了几个小时只走了十几公里,然后就抛锚了。世界上其他研究所的产品表现更差,因此当时没有人能够看到这项技术的实用前景,连卡内基-梅隆大学自己也仅仅是满足于从政府获得点经费,多发表一些论文。谷歌之所以接手做这件前途难测的事情,并非它有更好的技术,只是它需要用无人驾驶汽车颠覆现有的产业。为此谷歌先将卡内基-梅隆大学的整个团队招了进来,然后投入大量的.人力物力来做改变整个汽车行业的事情。在这个过程中,谷歌遇到了无数的难题,它的工程师本着蚂蚁啃骨头的精神,将遇到的问题一个个解决,比如激光雷达和摄像机采集的数据量太大,以至来不及传输到计算机中,为此谷歌设计了专用的传输总线。最终,谷歌团队靠着从街景地图项目获得的大量数据,得以让无人驾驶汽车上路。 6 年后,即 2010 年,它已经在繁华的闹市区和拥堵的高速公路上行驶了 20万公里,没有出现一次交通事故。

From #

动态共享库的三个名称属性

Content #

动态共享库通常是有版本的,并且按照一定规则安装到系统中。举个例子,一个名为 libfoo 的动态共享库,在安装的目录下文件集合通常是这样:

2022-03-10 12:28 libfoo.so -> libfoo.so.0.0.0*
2022-03-10 12:28 libfoo.so.0 -> libfoo.so.0.0.0*
2022-03-10 12:28 libfoo.so.0.0.0*

按惯例,每个动态共享库都有多个名字属性,包括 real name、soname 和 linker name。下面我们来分别看下。

  1. real name:实际包含共享库代码的那个文件的名字 (如上面例子中的 libfoo.so.0.0.0)。动态共享库的真实版本信息就在 real name 中,显然 real name 中的版本号符合语义版本规范,即 major.minor.patch。当两个版本的 major 号一致,说明是向后兼容的两个版本;

  2. soname:shared object name 的缩写,也是这三个名字中最重要的一个。无论是在编译阶段还是在运行阶段,系统链接器都是通过动态共享库的 soname (如上面例子中的 libfoo.so.0)来唯一识别共享库的。我们看到的 soname 实际上是仅包含 major 号的共享库名字;参看 SO-NAME

  3. linker name:编译阶段提供给编译器的名字(如上面例子中的 libfoo.so)。如果你构建的共享库的 real name 跟上面例子中 libfoo.so.0.0.0 类似,带有版本号,那么你在编译器命令中直接使用 -L path -lfoo 是无法让链接器找到对应的共享库文件的,除非你为 libfoo.so.0.0.0 提供了一个 linker name(如 libfoo.so,一个指向 libfoo.so.0.0.0 的符号链接)。 linker name 一般在共享库安装时手工创建。

    ...

区块链用于贷款案例

Content #

(美国的工程承包商承接了康奈尔大学的工程,再转包给中国公司。)中国公司在和美国的工程承包商签了合同后,后者会付给前一笔定金。我们假定这笔定金为合同款的20%,但是大部分建造成本则需要由中国公司向银行货款获得,通常贷款的利率并不低。等到中国公司向美国的工程商交货后,后者要付给前者全款,但是它从康奈尔大学那里只能获得部分预付款,比如也是合同的20%,余款则需要向美国的银行借贷。具体到这笔交易,短期借贷的年利率为 12.99%。如果施工的周期为 6个月,则需要支付大约 6%的利息,这笔钱最终会转嫁到合同款上,也就是说康奈尔大学其实是最后的买单者。

这时,康奈尔大学讲了,我的信用非常好,贷款的利率只有 4.9%,能不能用我的信用来货款,这样可以节省 4%左右的费用。银行讲当然可以,不过必须由你们大学来货款,然后你们把钱交给工程承包商。但是这样一来又产生一个新的问题:钱在工程完成之前都付清了,工程一旦验收不合格扯皮起来非常麻烦。美国公司一般不这么做。如果银行能够按照康奈尔大学的信用,给工程承包商(甚至生产厂商)提供低息贷款,这个问题就解决了。但是,过去银行不愿意这么做,因为风险太大。现在利用区块链技术,这件事情就能够办到了。

首先,各方的合同可以通过区块链管理起来,并且授权银行能看到上下游各方签署的全部合同,而过去银行只能看到自己的合同,并不知道中国某太阳能公司生产的太阳能板的最终买家是康奈尔大学。知道了最终的买家是康奈尔大学,银行就敢以低利息向各方贷款了。不过这里面还有一个问题需要解决,那就是要防止生产者或者工程承包商挪用货款去做别的事情。在过去,即使银行有了整个上下游全部的合同,也无法控制贷款的使用。今天有了区块链则不同,每个商品一旦被制造出来,就可以产生一个区块链跟踪它的流动。同样,当一项任务(服务)完成之后,也可以产生一个区块链,表示进入了下一个阶段。银行的货款可以在合适的时候(比如需要开始付款了)给到相应的借方,用于专门的用途(比如只能向有关的合同方付款),这样就不会出现挪用贷款和拖欠款项的问题。

上述这种合作听起来很理想,是否实用呢?可以的。硅谷一家开发区块链服务的公司 Skuchain 就是帮助上述项目中的各方实现融资。釆用这样的融资方式,不仅各方的成本可以下降,而且银行方面也可以降低风险。沿着这个思路再往前走一步,提供资金的一方未必需要银行,它可以是中小投资人,这就实现了真正意义上的众筹。今天有一个新词叫作 Fintech,它是金融(finance)和技术 (technology)两个单词的缩写词,意思是采用新的科技实现金融业的进步,而众筹是其中的一个重要特征。

From #

做脏活累活的第三类公司

Content #

在未来,有三种公司能够受益于智能技术,除了上面提到的技术领先的大公司,还包括具有大量数据的传统公司,比如电信运营商、银行,甚至地方政府,这是第二类受益者。此外,第三类是那些愿意深入到原有产业中,了解在那些产业中有什么可以通过智能技术解决的问题,然后用新技术解决它们,从而让原有产业得到升级的公司。当然,第三类公司做的是一种脏活、累活,而且一开始是低利润的工作。不过,也正是因为如此,大公司才不愿意自己来做这件事情,反而给了小公司机会。

From #

共享经济最终会让大家多花钱

Content #

不论是什么形式,要想对哪一种物品或者服务成功实现共享,从根本上来讲,都需要通过共享创造出更大的市场、更多的需求。自从工业革命之后,全世界经济就进入要靠消费来拉动的供大于求的时代,而且这个趋势在不断地加速。

商业的本质是为了让人多花钱,而不是省钱。如果共享的结果是大家都不去买东西,那么经济一定会萎缩,这样的共享经济是一定发展不起来的;反之,如果让更多的资源加入到经济活动中,利用新技术提高效率、增加使用量,给大家带来方便,最终让大家多花钱,这样的共享经济就有造血功能,就能成功。

美国在没有共享奢侈品之前,那些喜欢时尚的女性每次出门只能在自己的两三个手袋、七八套礼服中来回挑选;有了这个服务之后,她们在不知不觉中就花掉了很多钱使用奢侈品。至于共享是由每个参与者提供物品,还是由某家公司自己提供,倒不是问题的关键。至于共享经济什么时候能够普及,我们在前面讲过,很多技术最终成功需要三波浪潮,也就是我所称的“第三眼美女”。2016 年之前的共享经济算是第一波,大部分失败了,因为从业者关于利用闲置资源的理解就是错误的。2016 年到最近兴起的是第二波,不少创业者对扩大市场规模这一点有了深刻体会,因此是一个进步。另外,技术的进步也让共享更加容易,但是依然会有大部分人要失败。当然,失败的主要原因是商业上的失败,而不是模式本身的失败,更不是技术的失败。接下来,还会有第三波浪潮,而在那一波浪潮中,我们今天所欠缺的一个环境,即用户的信用和行为习惯会被补充进来,并融入共享经济的生态圈,这样就能够做到共享更多资源了。

From #

如何选择Quorum NWR的三个参数

Content #

  1. 一般而言,不推荐副本数超过当前的节点数,因为当副本数据超过节点数时,就会出现同一个节点存在多个副本的情况。当这个节点故障时,上面的多个副本就都受到影响了。

  2. 当 W + R > N 时,可以实现强一致性。另外,如何设置 N、W、R 值,取决于我们想优化哪方面的性能。比如,N 决定了副本的冗余备份能力;如果设置 W = N,读性能比较好;如果设置 R = N,写性能比较好;如果设置 W = (N + 1) / 2、R = (N + 1) / 2,容错能力比较好,能容忍少数节点(也就是 (N - 1) / 2)的故障。

最后,我想说的是,Quorum NWR 是非常实用的一个算法,能有效弥补 AP 型系统缺乏强一致性的痛点,给业务提供了按需选择一致性级别的灵活度,建议你的开发实现 AP 型系统时,也实现 Quorum NWR。

Viewpoints #

From #

12 | Quorum NWR算法:想要灵活地自定义一致性,没问题!

Quorum NWR三要素

Content #

N 表示副本数,又叫做复制因子(Replication Factor)。也就是说,N 表示集群中同一份数据有多少个副本,就像下图的样子:

从图中你可以看到,在这个三节点的集群中,DATA-1 有 2 个副本,DATA-2 有 3 个副本,DATA-3 有 1 个副本。也就是说,副本数可以不等于节点数,不同的数据可以有不同的副本数。

需要你注意的是,在实现 Quorum NWR 的时候,你需要实现自定义副本的功能。也就是说,用户可以自定义指定数据的副本数,比如,用户可以指定 DATA-1 具有 2 个副本,DATA-2 具有 3 个副本,就像图中的样子。

当我们指定了副本后,就可以对副本数据进行读写操作了。那么这么多副本,你要如何执行读写操作呢?先来看一看写操作,也就是 W。

W,又称写一致性级别(Write Consistency Level),表示成功完成 W 个副本更新,才完成写操作:

从图中你可以看到,DATA-2 的写副本数为 2,也就说,对 DATA-2 执行写操作时,完成了 2 个副本的更新(比如节点 A、C),才完成写操作。

那么有的同学会问了,DATA-2 有 3 个数据副本,完成了 2 副本的更新,就完成了写操作,那么如何实现强一致性呢?如果读到了第三个数据副本(比如节点 B),不就可能无法读到更新后的值了吗?别急,我讲完如何执行读操作后,你就明白了。

R,又称读一致性级别(Read Consistency Level),表示读取一个数据对象时需要读 R 个副本。你可以这么理解,读取指定数据时,要读 R 副本,然后返回 R 个副本中最新的那份数据:

从图中你可以看到,DATA-2 的读副本数为 2。也就是说,客户端读取 DATA-2 的数据时,需要读取 2 个副本中的数据,然后返回最新的那份数据。

这里需要你注意的是,无论客户端如何执行读操作,哪怕它访问的是写操作未强制更新副本数据的节点(比如节点 B),但因为 W(2) + R(2) > N(3),也就是说,访问节点 B,执行读操作时,因为要读 2 份数据副本,所以除了节点 B 上的 DATA-2,还会读取节点 A 或节点 C 上的 DATA-2,就像上图的样子(比如节点 C 上的 DATA-2),而节点 A 和节点 C 的 DATA-2 数据副本是强制更新成功的。这个时候,返回给客户端肯定是最新的那份数据。

...

ID3算法的缺陷

Content #

ID3 的算法规则相对简单,可解释性强,其主要缺陷是什么?

ID3 算法倾向于选择取值比较多的属性。这样,如果我们把“编号”作为一个属性(一般情况下不会这么做,这里只是举个例子),那么“编号”将会被选为最优属性 。但实际上“编号”是无关属性的,它对“打篮球”的分类并没有太大作用。

From #

Hairpin Mode

Content #

Kubernetes设置CNI bridge 插件时,一般会为它设置 Hairpin Mode(发夹模式)。什么是Hairpin Mode?为什么要设置Hairpin Mode?

这是因为,在默认情况下,网桥设备是不允许一个数据包从一个端口进来后,再从这个端口发出去的。但是,它允许你为这个端口开启 Hairpin Mode,从而取消这个限制。

这个特性,主要用在容器需要通过NAT(即:端口映射)的方式,“自己访问自己”的场景下。举个例子,比如我们执行 docker run -p 8080:80,就是在宿主机上通过 iptables 设置了一条DNAT(目的地址转换)转发规则。这条规则的作用是,当宿主机上的进程访问“< 宿主机的 IP 地址 >:8080”时,iptables 会把该请求直接转发到“< 容器的 IP 地址 >:80”上。也就是说,这个请求最终会经过 docker0 网桥进入容器里面。

但如果你是在容器里面访问宿主机的 8080 端口,那么这个容器里发出的 IP 包会经过 vethb4963f3 设备(端口)和 docker0 网桥,来到宿主机上。此时,根据上述 DNAT 规则,这个 IP 包又需要回到 docker0 网桥,并且还是通过 vethb4963f3 端口进入到容器里。所以,这种情况下,我们就需要开启 vethb4963f3 端口的 Hairpin Mode 了。

From #

以个人天生的才能为标尺的环境

Content #

格拉德威尔总结说,当人们生活在一个以个人天生的才能为标尺的环境里时,一旦整体形象受到威胁,他们就会感觉遇到了巨大的困难。“他们不会参加‘补习班’,也不会在投资者和公众面前站出来承认自己错了,他们宁愿选择撒谎。”

From #

终身成长