my-blog
my-blog copied to clipboard
:book:My blog
硬饮料,香烟,海洛因和高纯度海洛因,它们的共同之处在于,后者的成瘾性都比前者强,全是我们普遍认为的拥有「成瘾性」的东西。如今,可怕的是,这类东西的出现速度正变得越来越快。 之所以存在这种现状的原因,和现在人类能治愈疾病的能力增长的越来越快的原因是一致的:科技的进步。科技的进步使事物能够朝着我们更意愿的方向去发展。当科技的进步使太阳能利用率提高了 X 个百分比时,显而易见,我们认为这样的科技进步是好的。当科技的进步使鸦片变为海洛因时,我们则认为这样的进步是不符合我们所愿的。但是在本质上,这两类进步属于同样的发展进程,二维一体。 毫无疑问,科技进步的增速正在越来越快,这意味着越来越多我们喜欢的事物将会变成我们「精神上过度沉溺的事物」。 在我的知识范围里很难找到一个能精确描述「精神上过度沉溺」的形容词,最接近的一词,可能便是「有成瘾性的」。这类东西在我们的生活中会变得越来越普遍,原因很简单:因为我们生活中越来越多的事物会拥有这种属性。由于人工养殖和食品加工技术的进步,食物变得越来越精细化加工。下棋和纸牌,被魔兽世界和开心农场所取代。电视节目虽然变得更引人入胜了,但相比脸书,吸引力仍差距甚大。 除非收到相关法律的限制,我们的世界在未来 40 年里,让人成瘾的东西必定会比之前 40 年多得多。 未来 40 年里我们会接触到更多更新鲜的事物。我的意思并不是我们都应该去不假思索地避免它们。酒精是危险的,但我更宁愿生活在一个有红酒存在的世界里。大多数人都可以和酒精共存,只需稍加小心即可。只是当这样的东西越多,那我们需要付出的“多加小心”也就随之越多。 不幸的是,大多数人做不到。这意味着,当这个世界的东西都变得更易成瘾,生活的两种态度将会变得愈加分化。第一种,是统计上的“常规的”生活态度,即不多加思索地跟随绝大多数人的选择,第二种生活态度,则是在选择前,都会先问自己,哪一种更好? 分别拥有这两种生活态度的人的区别,在如今已经很大了。持有后种态度的人,社会上的大多数人,都觉得他们过着一种古怪而节制的生活。这种现象在以后会更为明显。你甚至可以把下面这种判断作为真理:「如果大多数的人没有在生活中觉得你奇怪,那么你就是在过着危险的生活。」 当然,我们的社会里还同时存在着一股抵抗这种成瘾性事物的进程。例如香烟在社会中的发展历程。当香烟刚出现时,它就像在封闭人口中传播流行病一样迅速传播。抽烟迅速变成了一件(统计意义上)普遍的事情。到处都有烟灰缸,当我还是个小孩时,我们家也有烟灰缸,虽然我们的父母都不抽烟,但是我们必须为客人备一个。 当抽烟的危害性广为人知后,相关的习俗就变了。在过去 20 年里,抽烟的认知从一件普遍的事情,变成了一个有害的坏习惯。从在公共场合电影明星都会刻意去做的事情,变成了在办公楼门口,一小撮人去做的事情。诚然,这种改变最大的因素是法律法规上的变化,但是,如果认知和习俗没有改变,这样的法律法规变化不可能发生。 这样的认知习俗变化,大约花了 100 年时间,这样的速率太慢了。除非这类认知变化的速率能至少和科技进步带来的成瘾性事物的增速一致,不然我们就没法再用这件武器保护我们自己了。为了让我们不成为时代的悲剧,我们必须为我们自己找到应对和避免这类事物的方法。所以,「怀疑一切新事物」将会变成一个更合理的生活态度策略。 事实上,做到「怀疑一切新事物」还不够。我们将不仅只担心新事物会让我们成瘾,现存的事物也有可能。因为事物自身也是在不断进化的。以我自己为例,我自认为我避开了大多数精神成瘾物,但是互联网,随着时间,让我越来越上瘾。 大多数我认识的人都对互联网成瘾。我们都在寻求着一种认知的进步,来使我们从这种瘾中解脱出来。我最新的尝试是骑自行车远行,我曾经认为跑步是比骑行更好的运动形式,因为它花费的时间更少。现在,骑行的时长反而成为了它的优势,因为我在路上花的时间越多,我就有了更多不被打扰的思考时间。 这听上去有些古怪,不是吗?当你在没有风俗习惯引导的前提下,尝试解决问题时,就会是这种情况。也许我没法祈求[奥卡姆剃刀](https://zh.wikipedia.org/wiki/%E5%A5%A5%E5%8D%A1%E5%A7%86%E5%89%83%E5%88%80),也许是我过于古怪了,但是,如果我对于「加速成瘾」的预测正确,那么这种古怪的探索将会成为我们这样生活态度的人的命运。我们自身,将更会被我们向之说不的东西所定义。 原文链接:http://www.paulgraham.com/addiction.html
整理下最近两个月看过的的书单与对应评价,原本已发在了推特里,但是推特有字数限制,每本书不好细说,写完后删了不少,故把完整版放在博客: - 《超越感觉》8 分,思维工具书籍,提出了要培养「元意识」的概念,即在自己愤怒的时候意识到自己正在愤怒,自己开心的时候意识到自己在开心,从而避免成为情绪的奴隶。 - 《原则》7 分,内容略冗余,突出量化决策思维在今日做个人与企业决策时的重要性,调查结果与数据出偏差的可能性往往比直觉出偏差的可能性小不少。 - 《妙趣横生博弈论》8 分,博弈论工具书籍,建立新的思考维度,阐述了为各类博弈寻找「纳什均衡」为研究具体博弈问题的出发点之一,根据具体利害情况,均衡可能是「纯策略纳什均衡」亦可能是「混合策略纳什均衡」。 - 《富爸爸穷爸爸》7 分,偏鸡汤,主旨突出被动收入(资本收入)在财务自由中扮演角色的重要性远远高于工资收入,同时也引发了一些对会计学和公共关系方面的阅览兴趣。 - 《流量池》7 分,说明了裂变营销的主要方法论,以及打造购买闭环在其中的重要性。 - 《你凭什么做好互联网》7 分,互联网创业公司基础能力百科,开拓相关方面的基础思路,从商业逻辑分析,到冷启动方法论,再至公司运营方法论。 - 《世界上最简单的会计书》8 分,会计知识快速入门,理解企业的营收与现金流。 - 《债务危机》8 分,理解经济周期各个阶段,通常由贪婪和信息预估的不精确驱使,从早期正常阶段,到泡沫阶段,到泡沫顶部,到萧条阶段,到去(和谐/不和谐)去杠杆阶段,再回至正常化,周而复始。 - 《稀缺》6 分,论述了资源的稀缺会带来专注度上的红利,但是同时也会带来对应思路的不开阔,即管窥。
大家可能会好奇,在 Node.js 启动后,第一个执行的 JavaScript 文件会是哪个?它具体又会干些什么事? 一步步来看,翻开 Node.js 的源码,不难看出,入口文件在 `src/node_main.cc` 中,主要任务为将参数传入 `node::Start` 函数: ``` c++ // src/node_main.cc // ... int main(int argc, char *argv[]) { setvbuf(stderr, NULL, _IOLBF, 1024); return node::Start(argc,...
## 前言 [令牌桶](https://en.wikipedia.org/wiki/Token_bucket)是一种常见用于控制速率的控流算法。原理于 Wikipedia 上描述如下: - 每秒会有 r 个令牌被放入桶中,即每 1 / r 秒向桶中放入一个令牌。 - 一个桶最多可以存放 b 个令牌。当令牌被放入桶时,若桶已满,则令牌被直接丢弃。 - 当一个 n 字节的数据包抵达时,消耗 n 个令牌,然后放行之。 - 若桶中的令牌不足 n ,则该数据包要么被缓存要么被丢弃。 下面我们便根据上述描述,使用 Go 语言,基于多...
> 在分布式的数据库中,为了可用性以牺牲一些数据一致性,可以带来非常可观的可拓展性上的进步。 -- Dan Pritchett, Ebay 在过年的 10 年中, Web 应用变得越来越流行。不论你的 Web 应用的用户是终端用户还是开发者,你都希望应用被使用得越多越好。但是当用户使用得越来越多时,如果你的应用依赖于数据持久化,那么机器的存储空间很可能会成为应用的瓶颈。 一般来说有两种拓展应用的策略。第一种,也是较为简单的一种,就是垂直扩展:即把应用部署在一个容量更大机器上。垂直扩展在理论上非常可靠,但是它也有一些短板。最明显的短板就是它的上限就是你能获取的最好的宿主机的性能。垂直扩展同样也很耗费金钱,因为这通常意味着你需要购买更好的机器。垂直拓展通常也意味着你只能选择有限的机器供应商,这使得该方案更加耗费金钱。 水平拓展提供了一种相对复杂但可扩展性更高的方案。水平数据扩展可以从两个维度进行。功能化扩展(Functional scaling)意味着根据数据所提供的功能来划分它们,把不同功能的数据分别放进不同的数据库中。如果我们再将划分好的数据库中的数据再进行分片(sharding),那就是水平数据扩展的第二个维度。下图(图片 1)展示了水平数据扩展策略:  正如 图片 1 所示,两个维度的策略可以同时使用。Users 表,Products 表,和 Trans 表被分入了不同的数据库中。它们之间是相互独立的。 ## 基于功能的数据划分(Functional Partitioning)...
如果大家使用 Node.js 写过 web 应用,那么你一定使用过 `http` 模块。在 Node.js 中,起一个 HTTP server 十分简单,短短数行即可: ``` js 'use stirct' const { createServer } = require('http') createServer(function (req, res) { res.writeHead(200, { 'Content-Type': 'text/plain'...
 当一个分布式的微服务架构不断地变得庞大和复杂之后,理解和管理服务之间的网络调用变得越来越艰难。然而,服务的监控、A/B 测试、金丝雀发布、访问控制、端到端认证等等又都是一些常见的必须的要求。”服务网格(service mesh)“这个概念,便是用来描述一个微服务之间的网络层,并用于解决这些问题。 这篇文章会先给予服务网格一个简略的概述,然后用一个 Kubernetes 和 Istio 的简单应用来展示如果使用它来管理流量,注入错误(inject faults)和监控服务。 ## 服务网格概述 一个服务网格就是在服务的请求/响应之上的一个通信层(communication layer),用于提供一些保证服务健康的功能: - 零信任安全模型(zero-trust security),用于保证服务间通信的安全 - 链路追踪,用于展示服务之间的通信状态。 - 错误容忍和注入,用于试验和论证应用的可用性。 - 高级路由,用于执行 A/B 测试,版本切换等需求。 一个服务网格可能存在于 Kubernetes 集群中的好几个地方: - 作为一个依赖包存在于微服务应用的代码中。...
## 前言 众所周知,Node.js在[child_process](https://iojs.org/api/child_process.html)模块中提供了`spawn`和`exec`这两个方法,用来开启子进程执行指定程序。这两个方法虽然目的一样,但是既然Node.js为我们提供了两个方法,那它们之间必然还是会有一些不同之处,下面让我们来分析一下他们的异同。 首先我们来看看`官方API文档`中对它们的说明: ### child_process.spawn(command[, args][, options]) **command String** 将要运行的命令。 **args Array** 字符串参数数组。 **options 配置对象:** - **cwd String** 子进程的当前工作目录。 - **env Object** 环境变量键值对。 - **stdio Array|String** 子进程的stdio配置。 - **detached...
## 前言 众所周知,[connect](https://www.npmjs.com/package/connect)是TJ大神所造的一个大轮子,是大家用`尾式调用`来控制异步流程时最常使用的库,也是后来著名的[express框架](https://www.npmjs.com/package/express)的本源。但令人惊讶的是,它的源码其实只有200多行,今天也来解析一下它的真容。 ## 解析 以下是connect源码的主要文件结构: - lib目录 - connect.js - proto.js - index.js 是的,就这三个js文件。。 以下是一个connect的经典用法: ``` js var app = require('connect'); var http = require('http'); app.use('/',function(req,res){ res.send("haha"); }); app.use('/',function(req,res){...
在 Node.js 中,要说如果有几乎会在每一个文件都要用到的一个全局函数和一个全局对象,那应该是非 `require` 和 `module.exports` 莫属了。它们是 Node.js 模块机制的基石。大家在使用它们享受模块化的好处时,有时也不禁好奇: - 为何它俩使用起来像是全局函数/对象,却在 `global` 对象下访问不到它们? ``` js 'use strict' console.log(require) // Function console.log(module) // Object console.log(global.require) // undefined console.log(global.module) // undefined ```...