Blog

迪米特法则(LOD)

迪米特法则 #

迪米特法则(Law of Demeter, LOD),也叫最小知识原则:The Least Knowledge Principle。

Each unit should have only limited knowledge about other units: only units “closely” related to the current unit. Each unit should only talk to its friends; Don’t talk to strangers.

每个模块(unit)只应该了解那些与它关系密切的模块(units: only units “closely” related to the current unit)的有限知识(knowledge)。或者说,每个模块只和自己的朋友“说话”(talk),不和陌生人“说话”(talk)。

在面向对象里,可以这么说:

  1. 不该有直接依赖关系的类之间,不要有依赖;
  2. 有依赖关系的类之间,尽量只依赖必要的接口(也就是定义中的“有限知识”)。

Viewpoint #

From #

22 | 理论八:如何用迪米特法则(LOD)实现“高内聚、松耦合”?

巴菲特卖出基金的策略

如何卖 #

长期持有从长远来看,长期持有指数基金才会发挥其优秀的盈利能力。但我们也不是永远把它握在手里,那么什么时候卖就成了核心问题,有时候“卖出的时机”才决定了你这次投资的成果。这里给出了当指数基金增长时,卖出的时机:

  • 半年涨幅超过50%以上,至少卖出30%;
  • 一年涨幅一倍以上时,至少卖出50%;
  • 两年涨幅两倍以上时,至少卖出70%;
  • 3年涨幅3倍以上时,卖出90%;
  • 但有10%是永远不卖的。

Viewpoint #

From #

Linux64环境下32位汇编注意事项

Linux64位环境下的32位汇编 #

汇编语言中添加指令:

.code32

用as汇编时,指定32位:

as --32 -o power.o power.s

连接时指定emulate参数

ld -m elf_i386 -o power power.o

在64位环境下执行32位程序,容易出现段错误,用gdb调试时,x命令无法打印出指定内存位置的值。如果要添加gdb调试信息,在as时需要指定–gstabs选项。

as --gstabs --32 -o power.o power.s

Viewpoint #

From #

execve原理

execve原理 #

execve 的作用是使当前进程执行一个新的可执行程序,它的原型如下所示:

#include <unistd.h>
int execve(const char* filename, const char* argv[],
          const char* envp[])

其中 execve 的第一个参数是可执行程序的文件名,第二个参数用来传递命令行参数,第三个参数用来传递环境变量。

execve 的执行步骤如下所示:

  1. 清空页表这样整个进程中的页都变成不存在了,一旦访问这些页,就会发生页中断;
  2. 打开待加载执行的文件在内核中创建代表这个文件的 struct file 结构;
  3. 加载和解析文件头文件头里描述了这个可执行文件一共有多少 section;
  4. 创建相应的vma vma 用来描述代码段,数据段,并且将文件的各个 section 与这些内存区域建立映射关系;
  5. 加载其他共享库文件如果当前加载的文件还依赖其他共享库文件,则找到这个共享库文件,并跳转到第 2 步继续处理这个共享库文件;
  6. 跳转到可执行程序的入口处执行。

execve 的实现并不负责将文件内容加载到物理页中,它只建立了文件 section,与内存区域的映射关系就结束了。真正负责加载文件内容的是缺页中断,接下来,我们就看看缺页中断是如何加载物理页的。

在 execve 的执行步骤中,内核为可执行程序创建一个 vma 结构体实例,然后将它的 vm_file 属性设成第 2 步所打开的文件,这就建立起了内存区域和文件的映射关系。这个内核区域的区间首地址、区间尾地址和控制权限,都是由第 3 步解析的信息决定的。例如.text 段被加载到的内存首地址,也就是链接时所决定的起始地址,它就决定了内存代码段的起始地址。

由于第 1 步把页表都清空了,这就导致 CPU 在加载指令时会发现代码段是缺失的,此时就会产生缺页中断。

Linux 内核用于处理缺页中断的函数是 do_no_page,如果内核检查,当前出现缺页中断的虚拟地址所在的内存区域 vma(虚拟地址落在该内存区域的 vm_start 和 vm_end 之间)存在文件映射 (vm_file 不为空),那就可以通过虚拟内存地址计算文件中的偏移,这就定位到了内存所缺的页对应到文件的哪一段。然后内核就启动磁盘 IO,将对应的页从磁盘加载进内存。一次缺页中断就这样被解决了。

可执行程序的加载不是一次性完成的,而是由缺页中断根据需要,将文件的内容以页为单位加载进内存的,一次只会加载一页。

Viewpoint #

From #

10 | 页中断:fork、mmap背后的保护神

...

沉默的证据

Content #

2000多年前,罗马雄辩家、文学作家、思想家、禁欲主义者、阴谋政治家及高贵绅士西塞罗讲了下面这个故事。有人把一幅画给一个无神论者看,画上画着一群正在祈祷的拜神者,他们在随后的沉船事故中幸存了下来。其寓意在于说明祈祷能保护人们不被淹死。无神论者问:“那些祈祷后被淹死的人的画像在哪儿?”

淹死的拜神者已经死了,所以很难从海底爬出来到处宣传他们的经历。这能够欺骗那些粗心大意的人相信奇迹。

我们把这种情况叫做沉默的证据问题。

Viewpoint #

From #

GPS定位原理

Content #

你可以试着想明白,为什么知道了4颗位置已知的卫星与你的距离,你就一定能知道自己的位置。

(提示:与一颗卫星距离固定的点都在以这颗卫星为球心的球面上。如果你取两个以各自卫星为球心的球面,它们要么相交,相交的点形成一个圆,要么不相交。由于你的位置在它们的交叉区域,它们显然会相交。现在考虑对应于第三颗卫星的球面如何与这个圆交叉。一般来说,它们会交于两点。最后,第四颗卫星的球面会选出这两个点之一为你的位置。)

让我们回到GPS卫星如何知道它们自己的位置这个问题。尽管技术上的细节很复杂,但核心思想却很简单:它们从已知的地点出发,然后追踪自己的运动轨迹。把这两部分信息结合起来,它们就可以计算出自己的位置。

具体而言,卫星使用搭载的陀螺仪和加速度计(和你苹果手机里的类似)来监控自己的运动。从这些仪器的反馈中,卫星的计算机可以利用牛顿力学来读取卫星的加速度,然后利用微积分计算出卫星移动的距离。事实上,牛顿正是为了解决这样的问题才发明了微积分。

如果你重新审视所有的步骤,你会发现工程师在设计全球卫星定位系统的过程中,依赖于许多并不显然的假设。这个系统依赖于光速恒定的想法。它使用了原子钟来精确记录时间,而设计原子钟并利用它计算时间又基于高深的量子理论原理。它还使用了经典力学的工具来计算部署的卫星位置。广义相对论预测时钟走的速度会随着它们距离地面的高度不同产生细微的变化,靠近地表的时钟由于引力更强而走得稍慢,因此它也要对此效应做出修正。

Viewpoint #

From #

toc:History

中国 #

官与吏 胡焕庸线 刑不上大夫的来历 霸王道杂之 断袖 太岁头上动土 汉廷往往用大夫来安排三种人 今文经学与古文经学 刘歆见到古文的《左氏春秋》 新朝的失败终结了西汉的政治儒学 三语掾 圣人有情无情的争论 景德镇的来历 防秋与灭丁 蒙古骑兵的战术 司马光根本就不该跟皇帝赌这一盘 导致弘光一朝武将跋扈局面的是史可法 毛泽东不让陈粟分兵 负户以汲 佛教提供了一种社会生活的新可能

绍兴十二年 #

官家赐宴 元宵节意味着“放偷节” 敏感问题的微妙之处 宋代管所有的面食都叫“饼” 笔力扛鼎 蛛丝马迹 太师椅的来历

明朝 #

崇祯算命的故事 节俭一直像一柄无形的剑 崇祯拒绝李自成提出的议和条件 顾炎武对改朝换代的思考 血脉深处一种叫作文化的精灵在作怪 湘军用人

美国 #

清教派和分裂派 Pilgrims一词用来指称“清教徒”的由来 英国殖民地与西班牙殖民地的区别 新法兰西的两大失误 美国革命的三支火把 富兰克林创立的外交模式 众议院与参议院的区别 麦迪逊提出的“选举人团制” 共和与民主的区别是什么 怎样防止宗派带来的危害 第五和第六修正案 米兰达警告 中央银行合法性的争论 华盛顿的“南方身”和“北方心” 密苏里妥协案

世界 #

圣布伦丹之岛 本土俄罗斯与文明俄罗斯 海恩法则

史前 #

人类曾经处于灭绝的边缘

战争 #

海空战的两大原则

经济史 #

处理石油输出国膨胀的财富 给自己的股东和管理人提供关联贷款

阿拉伯的劳伦斯 #

一场脱离接触的战争 贵族和议会现任议员甘当陪衬 解围天神是始终采取行动的人

芯片战争 #

丹纳德开始设想采用集成电路 EUV的光刻光源 米德-康维革命

阿富汗 #

加尔各答黑洞(Black Holes of Calcutta) 杜兰德线(Durand Line)

欧洲文明十五讲 #

孟德斯鸠论罗马的衰亡 民族国家在中世纪形成 国家的存在就是排他性的存在 旧教与新教 修正主义的来历 哥德斯堡纲领的来历 大宪章与权利法案 自由需要法律来保护 法国前总统密特朗有过一句话我觉得是个“警句”,他说:“欧洲的形成和欧洲的解体总是围着德国转的。”

以色列 #

约旦放弃约旦河西岸

俄罗斯 #

俄罗斯套娃跟俄国传统文化毫无关系 没有任何对恶行的悔改之心

官与吏

Content #

宋江是个吏,这个出身决定了他再怎么折腾也白搭。吏的发展空间很窄,几乎没有机会变成官员。官和吏之间有座巨大的鸿沟。明代有首情诗,叫《劈破玉》:“要分离,除非是天做了地!要分离,除非是东做了西!要分离,除非是官做了吏!你要分时分不得我,我要离时离不得你,就死在黄泉也,做不得分离鬼。”情人起誓都拿官和吏说事,可见两者差别有多大。《水浒传》的故事发生在宋朝,情形稍微好一点。当时有一种制度,叫“流外铨”,极少数的吏可以通过这种途径,成为有编制的官。但就算吏当了官,品级也非常低,一辈子也不会有大出息。

Viewpoint #

From #

Daemon Pod的三个特征

Content #

DaemonSet 的主要作用,是让你在 Kubernetes 集群里,运行一个 Daemon Pod。所以,这个 Pod 有哪三个特征?

  1. 这个 Pod 运行在 Kubernetes 集群里的每一个节点(Node)上;
  2. 每个节点上只有一个这样的 Pod 实例;
  3. 当有新的节点加入 Kubernetes 集群后,该 Pod 会自动地在新节点上被创建出来;而当旧节点被删除后,它上面的 Pod 也相应地会被回收掉。

Viewpoint #

From #