本博客网站由 nginx 驱动,服务器运行在 AWS 上。与其它有固定公网 IP 的服务器一样,我的服务器也时常受到外界的攻击。今天讲解一种常见的攻击方式:基于时间的 SQL 盲注(time-based blind SQL injection)。
2021 年的计划
经历了炼狱一般的 2020 年,每个人都期待着 2021 年能少一些波涛汹涌,多一些风平浪静。尽管没有人知道病毒还会肆虐多久,但是至少,我们可以怀着积极的心态,构思新一年的蓝图。
复利的魔法
在美国,有一种叫 401k 的养老金计划。个人和雇主可以每年向 401k 养老金账户存入一定数量的钱,60 岁之后就可以取出来。在 2020 年,个人每年可以向 401k 账户中存入最多 $19500 而不用上税。这个数字给人的直观感受,应该可以用杯水车薪来形容。很难想象,经历 30 年的通货膨胀,每年能支出的养老金却只有两三万,会是一种怎样的生活水平。所以,401k 账户中的养老金,真的能撑到人死的那一天么?
答案有一些反直觉。需要担心的,不是人还没死,钱就花完了,而是人死了,钱还没花完。假设你所在的公司稍有一些良心,愿意按个人出资的 50% 向你的 401k 账户中存钱。也就是说,每年 401k 账户中新存入的资金有 $29250。如果资产的平均年投资回报率有 7%,如此坚持 30 年,账户的最终余额是 296 万!
为什么说这个答案反直觉呢?大脑的正常思维是,每年存入 $29250,需要大约 100 年的时间才能达到 296 万。但是实际上,这一过程只需要 30 年。这其中的奥秘,就是复利。在复利的帮助下,资产价值会随着时间流逝指数增长。
Don't Use File.separator When Loading Java Resource Files
Don't use File.separator when loading resource files into Java. Even though File.separator
is created to make Java program portable to different platforms, using it to load resource files will just have opposite effect.
看懂上市公司财报
今年的股市因为受到新型冠状病毒的影响,走出了不寻常的行情。虽然一只股票的短期走势受到外部因素的影响很大,但它的长期走势,主要是由公司的经营状况来决定的。要想了解一家上市公司的经营状况,最直观的方式是阅读公司的财报。
在美国上市的公司,有义务在每年和每个季度披露公司财报。年度财报和季度财报都可以在 SEC 网站上查询。考虑到大部分行业都具备一定的季节性,分析公司基本面一般会重点考察年度财报。
大多数公司的年度财报通常有 50 页以上,可见其中包含的内容极为丰富。作为投资者,我们最关心的有如下一些信息:
- 公司在过去的一年中,收入和支出分别是多少。这些信息可以从损益表(income statement)中获取。
- 公司当前的资产和负债分别有多少。这些信息记录在资产负债表(balance sheet)中。
- 过去一年中,公司账户上现金数额的变化及其原因。现金流量表(cash flow statement)里包含了这方面的信息。
下面以苹果公司 2019 年度的财报为例,提取上面三个维度的信息。注意,本文的分析结果仅供参考,并没有推荐购买相应的股票。
Migrate VMware Workstation / Fusion VM to ESXi
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.
2019 年终总结
创业路上
从 2017 年 2 月开始,我在 VMware 工作已经有近三年的时间了。前两年在平台组做了一系列项目,大部分和分布式系统治理有关。不能否认在那里学到了很多知识技能,但总有一天我会彻底厌倦看日志修 bug 的循环往复。2019 年 3 月,我换了一个组,投入到了新产品的开发工作中。
进组的时机正逢项目从第一行代码起步。全组像一家创业公司:我们有大致的目标和方向,但所有的宏观设计和微观实现都需要自己摸索。与许多其他创业公司一样,踩各类知名开源软件的坑是大家都会经历的事情。
我们的项目决定使用 druid 作为时间序列数据库。新数据通过 kafka 源源不断进来,经索引后存放在数据库中,这一过程称为数据摄取。官网上的文档和例子还算齐全,示例程序运行起来也一切正常,但换成我们自己的数据后就立刻出现各类错误,以至于不得不深挖源码一探究竟。这么一个看似照葫芦画瓢的任务,最后花费了我三天时间。
之后我们想比较两种不同的数据摄取方式,其中一种依赖于 twitter 某个 scala 开源库的两年前的代码。那些代码过于古老,存在一系列编译和运行的问题。每一次运行,我都觉得,这是最后一个错误,再过片刻就可以把程序跑通了。但每一次,又会出现新的错误。那些莫名其妙的异常信息迷惑着我,但我没有时间探索这个开源库的细枝末节,与其确切地知道为什么会出错,不如凭借直觉把解决的方法猜出来。经历近一星期的煎熬,我终于跑通了流水线,拿到了两种方案的对比结果。我们最后没有选择这套开源库,但我不认为这是一项做完即被丢弃和遗忘的工作。对创业公司而言,知道为什么某种方式不好,并且有理有据地避开它,可能会在未来节约不小的成本 [1]。
从三月到九月,经历过一周连续五天的 war room,经历过打团战从上午十点到晚上九点半,经历过周六周日接连两天来公司点外卖,我们终于发布了产品的第一个版本。正当所有人想好好庆祝一下的时候,我们的客服电话被打爆了。
Changing the Default Program with update alternatives
It is common to have multiple versions of the same software installed on a single ubuntu machine. With ubuntu's update-alternatives
utility, it is easy to choose the default one to use.
简明易懂的量子计算
1936 年,阿兰·图灵发表了图灵机理论,证明了存在一种计算机可以执行任何能被算法表达出来的计算过程。1945 年,第一台图灵完备的电子计算机 ENIAC 投入使用,它和后续的电子计算机改变了人类的历史进程。关于量子计算的研究始于 1980 年代。尽管时至今日,尚未出现能进行复杂计算的量子计算机,但量子计算的相关理论已经成熟。
一般来说,完成一次计算需要做三件事:
提供输入 -> 执行计算过程 -> 提取输出
对于电子计算机而言,输入和输出都可以表达为一串比特。计算过程,就是处理单元在程序的控制下,通过 AND, OR, NOT 等逻辑门电路修改这些比特的过程。
而量子计算机,输入的是量子比特(qubit)。计算过程是量子门(quantum logic gates)修改量子比特的状态(quantum state)。输出的是量子比特观测的结果。
因此,理解量子计算,需要搞清楚量子比特、量子门和量子观测。考虑到量子计算的物理实现有多种方法,且许多细节均为机密,本文只会阐释量子计算的理论基础。
相机的裁切系数
尽管相机厂家为了推动低端单反/微单相机的销售,很少特意强调相机是全画幅还是残画幅,但我们并不能因此低估它的影响。
所谓相机的全画幅和残画幅,是指相机感光元件的大小。全画幅使用 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。

常用的相机画幅
知道裁切系数有什么用呢?由于画幅不同,为了取得相同的摄影效果,在不同相机上需要设定的焦距、光圈大小和感光度并不一样。有了裁切系数,我们就可以在不同画幅间进行转换:
使用残画幅,在已知某张照片焦距、光圈大小和感光度的条件下,若改为全画幅相机,需使用的焦距、光圈大小和感光度。
或者反过来:
使用全画幅,在已知某张照片焦距、光圈大小和感光度的条件下,若改为残画幅相机,需使用的焦距、光圈大小和感光度。
基督教的核心逻辑
这周日,我被拉去本地某个基督教会听福音。传道者精心准备了演讲,在一个小时里把基督教的核心逻辑说清楚了。这篇文章我就加上自己的理解,以一位非信徒的身份转述一下。各位读者阅毕如果有兴趣,可以去教会聆听正宗的版本。
宗教可以认为是一种高度严密和仪式化的信仰。至于信仰,按照我的理解,便是那些无需证明就自动为真的命题。基督教作为一种宗教,它的信众会相信下面几个基本命题:
- 世界上存在着一位神,他创造了万事万物。
- 神依照自己的形象创造了人。
- 所有人都是有罪的。
- 人在死后会经过审判,有罪的人会下地狱,无罪的人可以上天堂。
- 凡相信这位神和基督耶稣的存在,便会得到救赎,可在审判时洗刷一切罪过。
这些命题都是无法证明的。传道者正确的做法,是通过举例,让听众觉得这些命题应当是真的。当听众不再质疑命题的真伪时,他们就完成了从福音听众到基督徒的转变。
下面我来逐条解释一下这几个命题。
《心理测量者》:有关正义、理想社会与人生信念
在热血的战斗场面从脑海中逐渐消退之后,《心理测量者》留下的,是虚渊玄对正义、理想社会与人生信念的诸多思考。
在这样一个架空的世界里,西比拉系统(Sibyl System)通过测量人的犯罪系数来预测犯罪行为,并允许刑警对犯罪系数高的人实施惩戒。在这个世界,何为正义,是由西比拉决定的。那么正义到底是什么呢?正义与非正义又是如何界定的呢?假设火车会轧死铁轨上的五个孩子,但是你只要把一个胖子从桥上推下去就能救那五个孩子的命,这种行为是正义的么?因为判定正义,是西比拉拥有的特权,所以西比拉可以使用任何逻辑上自洽的判断标准。比如说,比起不作为,把胖子推到桥下的人拥有更高的犯罪系数,因此用一个胖子的命救五个孩子的命是非正义的。更广义的说,正义与非正义并不存在一个绝对的界定,它只要能被普罗大众接受即可。
多做设计 少写代码
一线的程序员可能会遇到这种事情:领导安排一个任务,按照自己的能力两个小时就可以做完,但领导偏偏要你用半个小时设计,然后花三个小时给同事讲怎么做,同事做完之后又用半个小时评审,最后觉得还不如自己一个人做得好。既然如此,为什么要把任务交给别人去做呢?
为什么我的照片是模糊的
去年用微单相机开始摄影以来,我时不时会遇到一个怪现象:一张照片乍看起来很好,但稍稍放大就会发现画面是模糊的。这样的照片,即便构图很好、人照得很精致、色彩也很有吸引力,依旧只能算作废品。在拍过好几个月的照片之后,我终于搞清楚了这背后的原因。
2019 年的一些计划
不知不觉,从学校毕业已经有两年的时间了,我也终于成长为一个稍有经验的社会人。翻看到两年前写的 《2017 年度规划》,其中既有顺利完成并一直坚持下来的部分,也有半途而废石沉大海的部分。两年之后,我想把自己对 2019 年的一些想法发表出来,以便让多年之后的我能回忆起今天在思考着什么。
2018 年终总结
十一招聘吐槽大会
由于先前良好的运作,我被抽中在十一黄金周国庆假期去佐治亚理工(GT)参加 VMware 的校园招聘。

国庆节当天是我们的首场活动。计算学院(CoC)的学生干部们在红楼里帮我们挤下了两张桌子。不知道这些学生干部是不是学校派来监视我们的间谍,他们每两个小时换一班岗,专职坐在旁边的桌子上刷手机。难道他们就这么闲不需要写作业么?还是在手机里装了 IDE 因此可以用手机写作业?
按照我们招聘经理的吩咐,所有收到的简历分成两堆,一堆是要拿回去的,另一堆是要交给环卫工人的。我们在桌子上摆了一左一右两个完全一样的文件夹,聊完之后会把简历放到其中一个文件夹里。可能每个学生都知道这两个文件夹意味着两种不同的结局,但可气的是他们就算眼睁睁地看着我把简历放进其中的一个,也无法知晓之后的命运。
git submodule 实用教程
在这篇文章中,我们来讲解一下 git submodule
的实战用法,包括:
- 注册 git 子模块
- 从已有的文件创建 git 子模块
- 向上同步主仓库
- 向下同步子模块仓库
- 疑难杂症
Intellij IDEA 导航类快捷键指南
在公司写过一年多的 Java 代码之后,我的直观感受是,每天大多数的时间都用于检索和阅览前人写的代码,而不是动手书写新的代码。我和大多数 Java 开发者一样,使用 Intellij IDEA 作为 Java 开发工具。因此,我认为有必要回顾开发流程,熟练掌握频繁使用的导航类快捷键,以便提升开发效率。
本文以 Windows / Linux 平台的快捷键进行讲解,Mac OS 请查看 Intellij IDEA 的 帮助文档。
详解 Python 获取网卡 IP 地址的黑魔法
在 StackOverflow 上流传着这样一份用 Python 获取网卡 IPv4 地址的神秘代码。
1 | import socket |
但是,很少有人知道这段代码是如何工作的。本文将为你揭开这段代码的神秘面纱。