Blog

让整个扩展过程能够自我推动

Content #

沃伦回想到麦加夫兰,他的理念是如果能够教会人们养成基督徒的习惯,那么他们就会像基督徒一样生活,而不需要不断地指导与照顾。沃伦不可能挨个指导每个小组,他没办法让这些小组的每一次对话都集中在基督而非聊最新的电视剧方面。但是他发现,如果让人们养成新的习惯,他就不用事必躬亲了。那样的话,大家齐聚一堂时,会本能地讨论《圣经》,一起祈祷,践行自己的信仰。

沃伦设计了一系列教会上课和小组讨论时可以进行的活动,目的很明确,就是要让教友们养成新习惯。

马鞍峰教会课程手册中写道:“如果你想具有基督一样的秉性,你就要培养出基督拥有的习惯,我们所有人都是有习惯的……我们的目标是帮助你改掉坏习惯,养成能够让你成长得像基督的习惯。”每一位马鞍峰教会的成员都被要求在“成熟圣约卡”上签名,保证会遵循三大习惯:第一是利用每天静下心来的时间反思与祈祷,第二是上交个人收入的10%,第三是参加教友小组。让大家养成新习惯成为了教会的工作重心。

沃伦跟我说:“一旦我们这样做,灵性成长的责任就不在我肩上了,而是由你们来承担。我们已经给了你们方法,不需要去指导你们,因为你们正在指导自己。这些习惯变成了人们新的身份,这样一来,我们只需要提供支持,然后放手让你们去发展。”

沃伦发现他可以像小马丁·路德·金让抵制运动越变越大一样来拓展教会,做法就是将强联系和弱联系结合起来。将教会转化成一场运动,要让教会的规模达到两万教友和数千牧师,这就需要更多的投入,才能使这种拓展自发地进行下去。沃伦得让大家养成带着信仰生活的习惯,并且这种习惯不是因为他们之间的联系而形成的,而是因为他们自身形成的。

这就是社会习惯驱动运动的第三个方面,即要想让一个理念扩展到社群之外,就必须让整个扩展过程能够自我推动。而实现这一点最靠谱的方法就是:要让人们养成可以帮助他们找到自我方向的新习惯。

当然,蒙哥马利县公共汽车抵制运动之所以可以成功,之所以会点燃席卷美国南部全境的运动,背后有很多很复杂的原因。但是其中一个至关重要的因素,是社会习惯的第三个方面。金的理论中嵌入了一套新行为,可以将运动的参与者转化为能够自我引导的领导者。我们传统上并不认为这是习惯,但是,通过给予示威参与者一种新的自我身份感,金把蒙哥马利县的斗争换了一个样。示威游行在人们的积极参与下变成了一场声势浩大的运动,因为这些人已经在主导整个历史事件。这种社会活动的模式随着时间的推移变成了自发性行为,而且扩散到了其他地区。与金素未谋面的学生与示威者已经可以通过观察参与者的习惯性行为来领导这场运动。

From #

利用已经存在的社交欲望与社交模式

Content #

沃伦回到了马鞍峰,他决定要将几个月前就开始的小实验拓展一下。他希望这能让教会更易于管理。他从来都不确定自己是不是有足够的教室,能让所有到访的人都参加查经活动。于是他请几位教会成员在他们家里办查经班。他担心有人抱怨说怎么要去别人家里,而不是在正规的教堂教室中学习,不过教友都说他们很喜欢这样,小型聚会让他们有机会认识自己的邻居。于是,沃伦回到马鞍峰之后便将所有的教会成员分配成一个又一个的小组,这些小组每周聚会一次。这是他做过的最重要的决定之一,因为这种做法将参与教会活动从一种决定变成了一种习惯,而这利用的正是已经存在的社交欲望与社交模式。

沃伦告诉我说:“现在,要是有人周末在马鞍峰看到一大群人,就会想到这是我们的成就。不过这还只是冰山一角。教会每周95%的活动都以小组的形式进行。教会聚会和教友小组就像组合拳。集体聚会提醒你一开始为什么要这样做,然后亲密朋友间的小组聚会让你把精力放在如何加强信仰上,二者像胶水一样将教友和教会连接在一起。我们现在有超过5 000个教友小组,这是唯一能管理好这种规模教会的办法。否则,我会忙到过劳死,而95%的教友根本无法得到他们来此寻求的照料。”

正是这种模式推动了蒙哥马利县公共汽车抵制运动,而沃伦在不知不觉间复制了这一切,当然他是反过来做的。蒙哥马利县的抵制运动始于认识罗莎·帕克斯的人,等到社群的弱联系促使大家参与时,运动已经变成了一场大规模的示威。在马鞍峰教会,则是反过来的。人们是因为社群的归属感和教友之间的弱联系而被吸引去教会的。在加入教会后,他们便组成了由邻居组成的小组,就像培养皿一样,只要你愿意,你就可以培育出强联系,这样人们的信仰就会变成他们社会经历和日常生活的一部分。

From #

雪花算法(Snowflake)

Content #

雪花算法(Snowflake)是 Twitter 公司分布式项目采用的 ID 生成算法。

这个算法生成的 ID 是一个 64 位的长整型,由四个部分构成:

  1. 第一部分是 1 位的符号位,并没有实际用处,主要为了兼容长整型的格式。

  2. 第二部分是 41 位的时间戳用来记录本地的毫秒时间。

  3. 第三部分是机器 ID,这里说的机器就是生成 ID 的节点,用 10 位长度给机器做编码,那意味着最大规模可以达到 1024 个节点(2^10)。

  4. 最后是 12 位序列,序列的长度直接决定了一个节点 1 毫秒能够产生的 ID 数量,12 位就是 4096(2^12)。

这样,根据数据结构推算,雪花算法支持的 TPS 可以达到 419 万左右(2^22*1000),我相信对于绝大多数系统来说是足够了。

但实现雪花算法时,有个小问题往往被忽略,那就是要注意时间回拨带来的影响。机器时钟如果出现回拨,产生的 ID 就有可能重复,这需要在算法中特殊处理一下。

Viewpoints #

From #

17 | 为什么不建议你使用自增主键?

自增主键无法单调递增

Content #

对于单体数据库自身来说,自增主键确实是单调递增的。但使用自增主键也是有前提的,那就是主键生成的速度要能够满足应用系统的并发需求。而在高并发量场景下,每个事务都要去申请主键,数据库如果无法及时处理,自增主键就会成为瓶颈。那么,这时只用自增主键已经不能解决问题了,往往还要在应用系统上做些优化。

比如,对于 Oracle 数据库,常见的优化方式就是由 Sequence 负责生成主键的高位,由应用服务器负责生成低位数字,拼接起来形成完整的主键。

图中展示这样的例子,数据库的 Sequence 是一个 5 位的整型数字,范围从 10001 到 99999。每个应用系统实例先拿到一个号,比如 10001,应用系统在使用这 5 位为作为高位,自己再去拼接 5 位的低位,这样得到一个 10 位长度的主键。这样,每个节点访问一次 Sequence 就可以处理 99999 次请求,处理过程是基于应用系统内存中的数据计算主键,没有磁盘 I/O 开销,而相对的 Sequence 递增时是要记录日志的,所以方案改进后性能有大幅度提升。

这个方案虽然使用了 Sequence,但也只能保证全局唯一,数据表中最终保存的主键不再是单调递增的了。

因为,几乎所有数据库中的自增字段或者自增序列都是要记录日志的,也就都会产生磁盘 I/O,也就都会面临这个性能瓶颈的问题。所以,我们可以得出一个结论:在一个海量并发场景下,即使借助单体数据库的自增主键特性,也不能实现单调递增的主键。

Viewpoints #

From #

17 | 为什么不建议你使用自增主键?

自增主键无法连续递增

Content #

在多数情况下,自增主键确实表现为连续递增。但是当事务发生冲突时,主键就会跳跃,留下空洞。下面,我用一个例子简单介绍下 MySQL 的处理过程。

两个事务 T1 和 T2 都要在同一张表中插入记录,T1 先执行,得到的主键是 25,而 T2 后执行,得到是 26。

但是,T1 事务还要操作其他数据库表,结果不走运,出现了异常,T1 必须回滚。 T2 事务则正常执行成功,完成了事务提交。

这样,在数据表中就缺少主键为 25 的记录,而当下一个事务 T3 再次申请主键时,得到的就是 27,那么 25 就成了永远的空洞。

为什么不支持连续递增呢?这是因为自增字段所依赖的计数器并不是和事务绑定的。如果要做到连续递增,就要保证计数器提供的每个主键都被使用。

怎么确保每个主键都被使用呢?那就要等待使用主键的事务都提交成功。这意味着,必须前一个事务提交后,计数器才能为后一个事务提供新的主键,这个计数器就变成了一个表级锁。

显然,如果存在这么大粒度的锁,性能肯定会很差,所以 MySQL 优先选择了性能,放弃了连续递增。至于那些因为事务冲突被跳过的数字呢,系统也不会再回收重用了,这是因为要保证自增主键的单调递增。

Viewpoints #

From #

17 | 为什么不建议你使用自增主键?

用环境去预示他的性格或者命运

Content #

何伟在《寻路中国》一书中,为了介绍一个故事的主人公魏子淇,就先用了大段笔墨,设置了他的生活场景三岔村。他是这样写的:

20 世纪 90 年代初期,这儿的一所学校关闭了。村民们都没有买车,也不用手机。没有餐馆,没有商店,想找个花钱的地方都没有。每隔一、两天,会有个小贩开着敞篷货车从沟里上到这里来,车上装着大米、面条、肉,以及其他简单的日常用品。到了秋天,另外有卡车开上来收购村民们手里收获的东西。在村里,所有的车辆都停靠在那条死胡同土路的尽头,那里进行了拓宽,用于停车。那块土坝子代表了当地的全部经济活动——完全是一种停车场经济。

作者用环境去预示他的性格或者命运,这个开头的奇特之处在哪里?

通过他的描写,三岔村落后封闭的状态近在眼前。当你读到主人公魏子淇出场时,你能发现作者的良苦用心,因为主人公原来是一位农民,生活贫苦,就跟停车场经济一样,感觉就像一条死胡同。但后来他开始经商,正是突破了原有的停车场经济,走出了那条死胡同。所以,这段环境描写与他后来的成功遥相呼应,那个时候的三岔村有多封闭,那么现在的主人公就有多开放,也就形成了环境和人物的反差。

From #

消除静态噪音

Linux下如何消录音时的除静态噪音?(Static noise in microphone recording) #

Static noise in microphone recording #

If we are getting static noise in Skype, gnome-sound-recorder, arecord, etc.’s recordings, then the sound card sample rate is incorrect. That is why there is static noise in Linux microphone recordings. To fix this, we need to set the sampling rate in /etc/pulse/daemon.conf for the sound hardware.

In addition to the guide below, since PulseAudio 11 it is possible to set avoid-resampling = yes in daemon.conf.

...

SSH connection through host in the middle

Content #

Unreachable_host is unavailable from local network, but it’s available from reachable_host’s network. This command creates a connection to unreachable_host through “hidden” connection to reachable_host.

ssh -t reachable_host ssh unreachable_host

From #

Compare a remote file with a local file

Content #

Useful for checking if there are differences between local and remote files.

ssh user@host cat /path/to/remotefile | diff /path/to/localfile -

From #