《素食者》

韩国唯一诺贝尔文学奖获奖作品
亚洲唯一布克文学奖获奖作品

看的中译本,相对于台译本删减严重。

我之所以会跟这样的女人结婚,是因为她没有什么特别的魅力,同时也找不出什么特别的缺点。在她平凡的性格里,根本看不到令人眼前一亮、善于察言观色和成熟稳重的一面。正因为这样,我才觉得舒坦。如此一来,我就没有必要为了博取她的芳心而假装博学多才,也无须为约会迟到而手忙脚乱,更不用自讨没趣地拿自己跟时尚杂志里的男人做比较了。我那二十五岁之后隆起的小腹,和再怎么努力也长不出肌肉的纤瘦四肢,以及总是令我感到自卑的短小阴茎,这些对她来讲都是无关紧要的事。

你现在不吃肉,全世界的人就会把你吃掉!

《你想活出怎样的人生》

看了宫崎骏的《你想活出怎样的人生》后来看的书,发现内容完全和动画片毫无关系。但是到底是宫崎骏从10岁读到70岁的小说,书中观念在90年后还能这样超前是非常难得的。

本书最初出版于1935年,在九一八事变(1931年)到七七事变(1937年)之间,最初收录在山本老师编撰的《日本少年国民文库》。读完全书回过头一想,很多讲的都是军国主义下的青少年思想教育。

在那些被称为英雄或伟人的人中,只有推动了人类进步的人才真正值得我们尊敬。在他们非凡的事业中,只有顺应人类进步所做的事,才真正有价值。

歌德曾说过:“错误同真理的关系,就像睡梦同清醒的关系一样。一个人从错误中醒来,就会以新的力量走向真理。”
我们拥有决定自己言行的力量,因此会犯错。
但是——
我们拥有决定自己言行的力量,因此能从错误中重新站起
来。

《你想活出怎样的人生》在日本曾有过多个版本,分别为新潮社版(1937年)、未来社版(1954年)、白杨社版(1958年)、讲谈社版(1963年)、岩波书店版(1982年)等,本书是岩波书店版的全译本,而岩波书店版的底本为最初新潮社的版本。

《TCP是怎样工作的》

书中有三个作者,其中主要的作者安永辽真写的是主要部分(《第4章 程序员必学的拥塞控制算法》)。还有两章(《第5章 CUBIC算法》和《第六章 BBR算法)写的是现在比较流行的阻塞控制算法。所以书名应该叫《拥塞控制是怎样工作的》。

图3.8 窗口控制、流量控制和拥塞控制之间的关系
图4.3 拥塞控制算法的状态迁移图
图4.4 本书介绍的拥塞控制算法
图6.2 端到端时延的构成

初期的以太网在逻辑上是“总线式”结构。换句话说,多台计算机是连接在同一根同轴线缆上的。在这种情况下,由任意一台终端设备发送出的数据可以被所有连接在这个网络上的计算机接收。也就是说,这个网络从原理上就无法进行一对一通信,所有的通信都是广播式的。
然后,所有已连接的设备共享同一个通信介质,一旦多台终端设备同时发送数据,就会发生信号冲突,导致数据丢失。发生冲突的范围称为冲突域(collision domain)。因此,当有多台终端想要发送数据时,需要按顺序来发送。实现这一功能的就是 CSMA/CD ( Carrier Sense Multiple Accesswith Collision Detection,带有冲突检测的载波侦听多路访问),这项技术也被认为是以太网的代表名片。

1984年的 Congestion Control in IP/TCP Internetworks(IP/TCP 互联网上的拥塞控制,RFC 896)中提出了 Nagle 算法,其目的是减少 TCPIP网络上待发送数据包的数量。可以肯定地说,Nagle 算法是一切为了防止TCP/P 网络出现拥塞崩溃而进行的拥塞控制相关技术的“鼻祖”。

介绍几个基本的拥塞控制算法,它们的思路是通过灵活运用以下几种算法,对拥塞窗口大小 cwnd 进行控制。
• 慢启动
• 拥塞避免
• 快速恢复

当出现以下两种情形时,便可以认为TCP报文段丢失了。
•重传计时器超时
• 收到多个重复的ACK

从通信数据包发送到接收为止的端到端的时延,主要由以下三部分组成:因链路上的交换机和路由器进行数据包处理而产生的处理时延(processing delay);因在链路上各个节点的队列中等待传输而产生的队列时延(queuing delay);从信号发送节点到目的地节点所需要的物理上的传播时延(propagation delay )。

在三大时延中,处理时延和队列时延可以通过提高通信节点的性能实现进一步的优化,而传播时延则只取决于传输距离。
因此,超远程节点间的通信往往无法忽视物理特性所导致的传播时延。例如,横跨太平洋的海底光缆,其传播时延超过50 ms。
此类宽带、高时延的通信环境就被称长肥管道。

在发生丢包之前,缓慢地增大拥塞窗口大小(additive increase,加法增大),拥塞发生之后,大幅減小拥塞窗口大小(multiplicative decrease,乘法减小),这便是 AIMD 控制算法。

《设计模式之禅(第2版)》

书的第一二三部分讲得很细致,后面四五两部分就不好看了
书里文字错误太多了

世界上最难的事有两件:一是让人心甘情愿地把钱掏出来给你,二是把自己的思想灌输到别人的脑子里。

对于单一职责原则,我的建议是接口一定要做到单一职责,类的设计尽量做到只有一个原因引起变化。

里氏替换原则为良好的继承定义了一个规范,一句简单的定义包含了4层含义。
1.子类必须完全实现父类的方法
2.子类可以有自己的个性
3.覆盖或实现父类的方法时输入参数可以被放大
4.覆写或实现父类的方法时输出结果可以被缩小

狙击手,为什么叫Snipper?Snipe翻译过来就是鹬,就是“鹬蚌相争,渔人得利”中的那只鸟,英国贵族到印度打猎,发现这个鹬很聪明,人一靠近就飞走了,没办法就开始伪装、远程精准射击,于是乎Snipper就诞生了。

子类中方法的前置条件必须与超类中被覆写的方法的前置条件相同或者更宽松。

证明一个定理是否正确,有两种常用的方法:一种是根据提出的论题,经过一番论证,推出和定理相同的结论,这是顺推证法;还有一种是首先假设提出的命题是伪命题,然后推导出一个荒谬、与已知条件互斥的结论,这是反证法。

注意 在Java中,只要定义变量就必然要有类型,一个变量可以有两种类型:表面类型和实际类型,表面类型是在定义的时候赋予的类型,实际类型是对象的类型,如zhangSan的表面类型是IDriver,实际类型是Driver。

人和人之间是有距离的,太远关系逐渐疏远,最终形同陌路;太近就相互刺伤。对朋友关系描述最贴切的故事就是:两只刺猬取暖,太远取不到暖,太近刺伤了对方,必须保持一个既能取暖又不刺伤对方的距离。

不知道大家有没有听过这样一个理论:“任何两个素不相识的人中间最多只隔着6个人,即只通过6个人就可以将他们联系在一起”,这就是著名的“六度分隔理论”。

Single Responsibility Principle:单一职责原则Open Closed Principle:开闭原则Liskov Substitution Principle:里氏替换原则Law of Demeter:迪米特法则Interface Segregation Principle:接口隔离原则Dependence Inversion Principle:依赖倒置原则把这6个原则的首字母(里氏替换原则和迪米特法则的首字母重复,只取一个)联合起来就是SOLID(solid,稳定的),其代表的含义也就是把这6个原则结合使用的好处:建立稳定、灵活、健壮的设计,而开闭原则又是重中之重,是最基础的原则,是其他5大原则的精神领袖。

有一个对象UserInfo存储用户的所有信息(实际系统上还有很多子类,不多说了),也就是BO(Business Object,业务对象),这个对象设计为贫血对象(Thin Business Object),不需要存储状态以及相关的关系,本人是反对使用充血对象(Rich Business Object),这里提到两个名词:贫血对象和充血对象,这两个名词很简单,在领域模型中分别叫做贫血领域模型和充血领域模型,有什么区别呢?一个对象如果不存储实体状态以及对象之间的关系,该对象就叫做贫血对象,对应的领域模型就是贫血领域模型,有实体状态和对象关系的模型就是充血领域模型。

对象适配器和类适配器的区别是:类适配器是类间继承,对象适配器是对象的合成关系,也可以说是类的关联关系,这是两者的根本区别。

组合模式有两种不同的实现:透明模式和安全模式。

在这里我们使用了一个新的设计方法:双接口设计,我们的一个类可以实现多个接口,在系统设计时,如果考虑对象的安全问题,则可以提供两个接口,一个是业务的正常接口,实现必要的业务逻辑,叫做宽接口;另外一个接口是一个空接口,什么方法都没有,其目的是提供给子系统外的模块访问,比如容器对象,这个叫做窄接口,由于窄接口中没有提供任何操纵数据的方法,因此相对来说比较安全。

说到访问者模式就不得不提一下双分派(double dispatch)问题,什么是双分派呢?我们先来解释一下什么是单分派(singledispatch)和多分派(multiple dispatch),单分派语言处理一个操作是根据请求者的名称和接收到的参数决定的,在Java中有静态绑定和动态绑定之说,它的实现是依据重载(overload)和覆写(override)实现的。
双分派意味着得到执行的操作决定于请求的种类和两个接收者的类型,它是多分派的一个特例。从这里也可以看到Java是一个支持双分派的单分派语言。