0%

各种编程语言都支持对象(object)的构造、复制、读取、修改和销毁等操作。其中的复制(copy)操作,就是在计算机内存中的某个新地址,构造一个和原对象一模一样的新对象。

少数语言,例如 C++ 和 Rust,还支持一种叫『移动』(move)的操作。对象的移动,顾名思义,就是把原对象从计算机内存中的某个地址搬运至新的地址。听上去,移动操作做的事情似乎和复制差不多。那么为什么 C++ 和 Rust 要引入移动操作呢?为什么其他大多数语言都不支持移动操作呢?

Read more »

本博客网站由 nginx 驱动,服务器运行在 AWS 上。与其它有固定公网 IP 的服务器一样,我的服务器也时常受到外界的攻击。今天讲解一种常见的攻击方式:基于时间的 SQL 盲注(time-based blind SQL injection)。

Read more »

经历了炼狱一般的 2020 年,每个人都期待着 2021 年能少一些波涛汹涌,多一些风平浪静。尽管没有人知道病毒还会肆虐多久,但是至少,我们可以怀着积极的心态,构思新一年的蓝图。

Read more »

在美国,有一种叫 401k 的养老金计划。个人和雇主可以每年向 401k 养老金账户存入一定数量的钱,60 岁之后就可以取出来。在 2020 年,个人每年可以向 401k 账户中存入最多 $19500 而不用上税。这个数字给人的直观感受,应该可以用杯水车薪来形容。很难想象,经历 30 年的通货膨胀,每年能支出的养老金却只有两三万,会是一种怎样的生活水平。所以,401k 账户中的养老金,真的能撑到人死的那一天么?

答案有一些反直觉。需要担心的,不是人还没死,钱就花完了,而是人死了,钱还没花完。假设你所在的公司稍有一些良心,愿意按个人出资的 50% 向你的 401k 账户中存钱。也就是说,每年 401k 账户中新存入的资金有 $29250。如果资产的平均年投资回报率有 7%,如此坚持 30 年,账户的最终余额是 296 万!

为什么说这个答案反直觉呢?大脑的正常思维是,每年存入 $29250,需要大约 100 年的时间才能达到 296 万。但是实际上,这一过程只需要 30 年。这其中的奥秘,就是复利。在复利的帮助下,资产价值会随着时间流逝指数增长。

Read more »

今年的股市因为受到新型冠状病毒的影响,走出了不寻常的行情。虽然一只股票的短期走势受到外部因素的影响很大,但它的长期走势,主要是由公司的经营状况来决定的。要想了解一家上市公司的经营状况,最直观的方式是阅读公司的财报。

在美国上市的公司,有义务在每年和每个季度披露公司财报。年度财报和季度财报都可以在 SEC 网站上查询。考虑到大部分行业都具备一定的季节性,分析公司基本面一般会重点考察年度财报。

大多数公司的年度财报通常有 50 页以上,可见其中包含的内容极为丰富。作为投资者,我们最关心的有如下一些信息:

  1. 公司在过去的一年中,收入和支出分别是多少。这些信息可以从损益表(income statement)中获取。
  2. 公司当前的资产和负债分别有多少。这些信息记录在资产负债表(balance sheet)中。
  3. 过去一年中,公司账户上现金数额的变化及其原因。现金流量表(cash flow statement)里包含了这方面的信息。

下面以苹果公司 2019 年度的财报为例,提取上面三个维度的信息。注意,本文的分析结果仅供参考,并没有推荐购买相应的股票。


Read more »

I used to run a VM in my mac with VMware Fusion. As my mac is getting older, the VM is becoming slower and slower. One day I got an ESXi host which had sufficient resource to run that VM, but migration from VMware Fusion to ESXi was not a straight forward task. If you are facing similar problem with VMware Workstation or Fusion, the following steps will help you.

Read more »

创业路上

从 2017 年 2 月开始,我在 VMware 工作已经有近三年的时间了。前两年在平台组做了一系列项目,大部分和分布式系统治理有关。不能否认在那里学到了很多知识技能,但总有一天我会彻底厌倦看日志修 bug 的循环往复。2019 年 3 月,我换了一个组,投入到了新产品的开发工作中。

进组的时机正逢项目从第一行代码起步。全组像一家创业公司:我们有大致的目标和方向,但所有的宏观设计和微观实现都需要自己摸索。与许多其他创业公司一样,踩各类知名开源软件的坑是大家都会经历的事情。

我们的项目决定使用 druid 作为时间序列数据库。新数据通过 kafka 源源不断进来,经索引后存放在数据库中,这一过程称为数据摄取。官网上的文档和例子还算齐全,示例程序运行起来也一切正常,但换成我们自己的数据后就立刻出现各类错误,以至于不得不深挖源码一探究竟。这么一个看似照葫芦画瓢的任务,最后花费了我三天时间。

之后我们想比较两种不同的数据摄取方式,其中一种依赖于 twitter 某个 scala 开源库的两年前的代码。那些代码过于古老,存在一系列编译和运行的问题。每一次运行,我都觉得,这是最后一个错误,再过片刻就可以把程序跑通了。但每一次,又会出现新的错误。那些莫名其妙的异常信息迷惑着我,但我没有时间探索这个开源库的细枝末节,与其确切地知道为什么会出错,不如凭借直觉把解决的方法猜出来。经历近一星期的煎熬,我终于跑通了流水线,拿到了两种方案的对比结果。我们最后没有选择这套开源库,但我不认为这是一项做完即被丢弃和遗忘的工作。对创业公司而言,知道为什么某种方式不好,并且有理有据地避开它,可能会在未来节约不小的成本 [1]。

从三月到九月,经历过一周连续五天的 war room,经历过打团战从上午十点到晚上九点半,经历过周六周日接连两天来公司点外卖,我们终于发布了产品的第一个版本。正当所有人想好好庆祝一下的时候,我们的客服电话被打爆了。

Read more »

1936 年,阿兰·图灵发表了图灵机理论,证明了存在一种计算机可以执行任何能被算法表达出来的计算过程。1945 年,第一台图灵完备的电子计算机 ENIAC 投入使用,它和后续的电子计算机改变了人类的历史进程。关于量子计算的研究始于 1980 年代。尽管时至今日,尚未出现能进行复杂计算的量子计算机,但量子计算的相关理论已经成熟。

一般来说,完成一次计算需要做三件事:

提供输入 -> 执行计算过程 -> 提取输出

对于电子计算机而言,输入和输出都可以表达为一串比特。计算过程,就是处理单元在程序的控制下,通过 AND, OR, NOT 等逻辑门电路修改这些比特的过程。

而量子计算机,输入的是量子比特(qubit)。计算过程是量子门(quantum logic gates)修改量子比特的状态(quantum state)。输出的是量子比特观测的结果。

因此,理解量子计算,需要搞清楚量子比特、量子门和量子观测。考虑到量子计算的物理实现有多种方法,且许多细节均为机密,本文只会阐释量子计算的理论基础。

Read more »

尽管相机厂家为了推动低端单反/微单相机的销售,很少特意强调相机是全画幅还是残画幅,但我们并不能因此低估它的影响。

所谓相机的全画幅和残画幅,是指相机感光元件的大小。全画幅使用 36 x 24 mm 的传感器,常见的残画幅 APS-C 使用 23.6 x 15.7 mm (佳能是 22.2 x 14.8 mm)的传感器。全画幅与某种画幅的传感器的长度之比,称为裁切系数(crop factor)。很容易算出,全画幅的裁切系数为 1,普通 APS-C 画幅的裁切系数为 1.5,对于佳能来说这个值是 1.6。

常用的相机画幅

知道裁切系数有什么用呢?由于画幅不同,为了取得相同的摄影效果,在不同相机上需要设定的焦距、光圈大小和感光度并不一样。有了裁切系数,我们就可以在不同画幅间进行转换:

使用残画幅,在已知某张照片焦距、光圈大小和感光度的条件下,若改为全画幅相机,需使用的焦距、光圈大小和感光度。

或者反过来:

使用全画幅,在已知某张照片焦距、光圈大小和感光度的条件下,若改为残画幅相机,需使用的焦距、光圈大小和感光度。

Read more »

这周日,我被拉去本地某个基督教会听福音。传道者精心准备了演讲,在一个小时里把基督教的核心逻辑说清楚了。这篇文章我就加上自己的理解,以一位非信徒的身份转述一下。各位读者阅毕如果有兴趣,可以去教会聆听正宗的版本。

宗教可以认为是一种高度严密和仪式化的信仰。至于信仰,按照我的理解,便是那些无需证明就自动为真的命题。基督教作为一种宗教,它的信众会相信下面几个基本命题:

  1. 世界上存在着一位神,他创造了万事万物。
  2. 神依照自己的形象创造了人。
  3. 所有人都是有罪的。
  4. 人在死后会经过审判,有罪的人会下地狱,无罪的人可以上天堂。
  5. 凡相信这位神和基督耶稣的存在,便会得到救赎,可在审判时洗刷一切罪过。

这些命题都是无法证明的。传道者正确的做法,是通过举例,让听众觉得这些命题应当是真的。当听众不再质疑命题的真伪时,他们就完成了从福音听众到基督徒的转变。

下面我来逐条解释一下这几个命题。

Read more »

在热血的战斗场面从脑海中逐渐消退之后,《心理测量者》留下的,是虚渊玄对正义、理想社会与人生信念的诸多思考。

在这样一个架空的世界里,西比拉系统(Sibyl System)通过测量人的犯罪系数来预测犯罪行为,并允许刑警对犯罪系数高的人实施惩戒。在这个世界,何为正义,是由西比拉决定的。那么正义到底是什么呢?正义与非正义又是如何界定的呢?假设火车会轧死铁轨上的五个孩子,但是你只要把一个胖子从桥上推下去就能救那五个孩子的命,这种行为是正义的么?因为判定正义,是西比拉拥有的特权,所以西比拉可以使用任何逻辑上自洽的判断标准。比如说,比起不作为,把胖子推到桥下的人拥有更高的犯罪系数,因此用一个胖子的命救五个孩子的命是非正义的。更广义的说,正义与非正义并不存在一个绝对的界定,它只要能被普罗大众接受即可。

Read more »

一线的程序员可能会遇到这种事情:领导安排一个任务,按照自己的能力两个小时就可以做完,但领导偏偏要你用半个小时设计,然后花三个小时给同事讲怎么做,同事做完之后又用半个小时评审,最后觉得还不如自己一个人做得好。既然如此,为什么要把任务交给别人去做呢?

Read more »

去年用微单相机开始摄影以来,我时不时会遇到一个怪现象:一张照片乍看起来很好,但稍稍放大就会发现画面是模糊的。这样的照片,即便构图很好、人照得很精致、色彩也很有吸引力,依旧只能算作废品。在拍过好几个月的照片之后,我终于搞清楚了这背后的原因。

Read more »

不知不觉,从学校毕业已经有两年的时间了,我也终于成长为一个稍有经验的社会人。翻看到两年前写的 《2017 年度规划》,其中既有顺利完成并一直坚持下来的部分,也有半途而废石沉大海的部分。两年之后,我想把自己对 2019 年的一些想法发表出来,以便让多年之后的我能回忆起今天在思考着什么。

Read more »

晨练的体验

去年年中在三藩市区跑过五公里,年底又在伯克利跑了万米,今年轮到半程马拉松了。为了避免中途被救护车敲诈钱财,我预先找了健身教练破财免灾。第一次的训练结束之后,身体伤得不轻,有三四天时间腹部动弹不得,在床上无法坐起来,只能翻滚着下去。第二次训练也没好到哪里去,在回家的路上,因为腿已失去知觉,踩油门和刹车的力度都把握不住了,几分钟的路程还要胆战心惊地把车开回家。周一在公司被经理叫去谈话的时候,我不得不靠着椅子站立,因为“坐下之后就站不起来了”。这种残障人的生活状态,在训练三四次之后才渐渐好转。

Read more »

由于先前良好的运作,我被抽中在十一黄金周国庆假期去佐治亚理工(GT)参加 VMware 的校园招聘。

国庆节当天是我们的首场活动。计算学院(CoC)的学生干部们在红楼里帮我们挤下了两张桌子。不知道这些学生干部是不是学校派来监视我们的间谍,他们每两个小时换一班岗,专职坐在旁边的桌子上刷手机。难道他们就这么闲不需要写作业么?还是在手机里装了 IDE 因此可以用手机写作业?

按照我们招聘经理的吩咐,所有收到的简历分成两堆,一堆是要拿回去的,另一堆是要交给环卫工人的。我们在桌子上摆了一左一右两个完全一样的文件夹,聊完之后会把简历放到其中一个文件夹里。可能每个学生都知道这两个文件夹意味着两种不同的结局,但可气的是他们就算眼睁睁地看着我把简历放进其中的一个,也无法知晓之后的命运。

Read more »

在这篇文章中,我们来讲解一下 git submodule 的实战用法,包括:

  1. 注册 git 子模块
  2. 从已有的文件创建 git 子模块
  3. 向上同步主仓库
  4. 向下同步子模块仓库
  5. 疑难杂症
Read more »

在公司写过一年多的 Java 代码之后,我的直观感受是,每天大多数的时间都用于检索和阅览前人写的代码,而不是动手书写新的代码。我和大多数 Java 开发者一样,使用 Intellij IDEA 作为 Java 开发工具。因此,我认为有必要回顾开发流程,熟练掌握频繁使用的导航类快捷键,以便提升开发效率。

本文以 Windows / Linux 平台的快捷键进行讲解,Mac OS 请查看 Intellij IDEA 的 帮助文档

Read more »