2022-02-07_星期一

陈天 · Rust 编程第一课

什么是 trait?

trait 是 Rust 中的接口,它定义了类型使用这个接口的行为

  • 可以把数据结构中的行为单独抽取出来,使其可以在多个类型之间共享
  • 也可以作为约束,在泛型编程中,限制参数化类型必须符合它规定的行为

trait 分类

基本 trait

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
pub trait Write {
    fn write(&mut self, buf: &[u8]) -> Result<usize>;
    fn flush(&mut self) -> Result<()>;
    fn write_vectored(&mut self, bufs: &[IoSlice<'_>]) -> Result<usize> { ... }
    fn is_write_vectored(&self) -> bool { ... }
    fn write_all(&mut self, buf: &[u8]) -> Result<()> { ... }
    fn write_all_vectored(&mut self, bufs: &mut [IoSlice<'_>]) -> Result<()> { ... }
    fn write_fmt(&mut self, fmt: Arguments<'_>) -> Result<()> { ... }
    fn by_ref(&mut self) -> &mut Self where Self: Sized { ... }
}

trait 中的方法也被称作关联函数(associate function)

带关联类型的 trait

1
2
3
4
pub trait Parse {
    type Error;
    fn parse(s: &str) -> Result<Self, Self::Error>;
}

trait 方法里的参数或者返回值,都可以用关联类型来表述,而在实现有关联类型的 trait 时,只需要额外提供关联类型的具体类型即可。

支持泛型的 trait

1
2
3
4
5
pub trait Add<Rhs = Self> {
    type Output;
    #[must_use]
    fn add(self, rhs: Rhs) -> Self::Output;
}

Rhs 默认是 Self,也就是说你用 Add trait ,如果不提供泛型参数,那么加号右值和左值都要是相同的类型。

Pasted image 20220207151813.png

Self 和 self

  • Self 代表当前的类型,比如 File 类型实现了 Write,那么实现过程中使用到的 Self 就指代 File。
  • self 在用作方法的第一个参数时,实际上是 self: Self 的简写,所以 &self 是 self: &Self, 而 &mut self 是 self: &mut Self。

动态分派(dynamic dispatching)

我们要有一种手段,告诉编译器,此处需要并且仅需要任何实现了 Formatter 接口的数据类型。在 Rust 里,这种类型叫 Trait Object,表现为 &dyn Trait 或者 Box<dyn Trait>

1
2
3
4
5
pub fn format(input: &mut String, formatters: Vec<&dyn Formatter>) {
    for formatter in formatters {
        formatter.format(input);
    }
}

dyn 关键字只是用来帮助我们更好地区分普通类型和 Trait 类型。

只有满足对象安全的 trait 才能使用 trait object:

  1. 不允许返回 Self,因为 trait object 在产生时,原来的类型会被抹去,所以 Self 究竟是谁不知道。
  2. 不允许携带泛型参数,因为 Rust 里带泛型的类型在编译时会做单态化,而 trait object 是运行时的产物,两者不能兼容。

我们为什么睡觉

失眠症患者无法从忙碌的、使人焦虑的、反复思考的大脑活动模式中脱离出来。

失眠症患者的睡眠质量较差,这反应为深度非快速眼动睡眠期问较浅、较弱的脑电波。

失眠实际上是一种全天候的失调症:白天和夜晚一样紊乱。

安眠药只是直接用原始方法镇静你大脑的高级区域,或者说皮质。

你生命中所有真正重要的行为都受到两条非常简单的规则支配:

  1. 远离那些感觉不好的事情
  2. 去完成那些感觉良好的事情

嗜睡症至少由三种核心症状组成:

  1. 白天过度嗜睡
  2. 睡眠麻痹
  3. 猝倒

我们偶尔也会出现尽管大脑终止了睡眠,快速眼动睡眠的麻痹狀态仍然一直持续的情况。

当一个人经历睡眠麻痹时,通常伴随着恐惧感和房间中有侵入者的感觉。

鬼压床、外星人绑架

猝倒的发作并不是随机的,而是由中度或强烈的情绪所触发的,正面或负面情绪都有可能。

嗜睡症患者被放逐到了一种情感保持中立的单调生活中,必须放弃普通人时刻都沉浸于其中的丰富多彩的情绪。

这个睡眠——清醒开关,就位于大脑中央丘脑的下方,一个称为下丘脑的区域。这也正是作为总指挥的 24 小时生物钟所在的区域,

五个关键因素强烈地影响着我们的睡眠时间和睡眠质量:

  1. 不断亮着的电灯和 LED 灯
  2. 恒定的室温
  3. 咖啡因
  4. 酒精
  5. 上下班打卡的规则

充满现代室内世界的人造光会终止通常由褪黑激素在傍晚激增所带来的生物时间推进。

大部分海洋生物都在蓝色可见光范围内进化,包括水生视觉的进化。我们偏向于对冷调蓝光敏感,这是我们海洋祖先遗留的痕迹。

人类大脑的前额叶区域有助于我们克制冲动、控制行为。酒精正是首先使我们大脑的这一部分停止运转。结果,我们“放松”了,变得更不拘束、更外向了。

酒精的麻醉作用让你不清醒,但不会诱发自然的睡眠。

酒精还有两种方式可以破坏人的睡眠:

  1. 酒精会将睡眠碎片化
  2. 酒精是我们所知道的抑制快速眼动睡眠的最强力物质之一

因此,在下午或晚上饮用中等量的酒,就会使人失去有梦睡眠。

快速眼动睡眠的一个功能是帮助记忆整合与关联,也就是在新语言的学习中形成语法规则,或者将大量相关的事实合成为一个相互关联的整体时,所需的信息处理方式。

要成功开启睡眠,你的核心温度需要降低约 1℃。

夜间褪黑激素水平不仅受到黄昏时日光衰减的控制,而且受到与日落一致的温度下降的控制。

温热的手和脚可帮助你的身体核心冷却得更多,从而快速有效地引发睡眠。

小孩子肢体的乱伸有助于保持身体核心的冷却,使他们进入并维持睡眠。

大约 18.3℃的卧室温度就是适合大至数人睡觉的理想温度。

安眠药药引发的“睡眠”脑电波中缺少幅度最大、最深的脑电波。

许多人在这些药物的作用下只增加了很少的“睡眠,而且其主观上的效果比客观上要更多。

安眠药只能对“主观监测测得的睡眠延迟(即睡着所用的时间)产生轻微改善”。

通过让患者长时间保持清醒,可以建立起强大的睡眠压力——更高的腺苷浓度。

失眠症认知行为疗法应该作为所有慢性失眠患者的一线治疗药物,而不是安眠药。

不论发生什么,每天都在同一时间睡觉和醒来。

睡一夜好觉的小贴士》(第 22 页):

  • Stick to a sleep schedule. Go to bed and wake up at the same time each day. As creatures of habit, people have a hard time adjusting to changes in sleep patterns. Sleeping later on weekends won’t fully make up for a lack of sleep during the week and will make it harder to wake up early on Monday morning.(规律作息)
  • Exercise is great, but not too late in the day. Try to exercise at least 30 minutes on most days but not later than 2—3 hours before your bedtime.(不要运动太晚)
  • Avoid caffeine and nicotine. Coffee, colas, certain teas, and chocolate contain the stimulant caffeine, and its effects can take as long as 8 hours to wear off fully. Therefore, a cup of coffee in the late afternoon can make it hard for you to fall asleep at night. Nicotine is also a stimulant, often causing smokers to sleep only very lightly. In addition, smokers often wake up too early in the morning because of nicotine withdrawal.(避免咖啡和尼古丁,包括茶和巧克力)
  • Avoid alcoholic drinks before bed. Having a “nightcap” or alcoholic beverage before sleep may help you relax, but heavy use robs you of deep sleep and REM sleep, keeping you in the lighter stages of sleep. Heavy alcohol ingestion also may contribute to impairment in breathing at night. You also tend to wake up in the middle of the night when the effects of the alcohol have worn off.(睡前不要饮酒)
  • Avoid large meals and beverages late at night. A light snack is okay, but a large meal can cause indigestion that interferes with sleep. Drinking too many fluids at night can cause frequent awakenings to urinate.(晚上不要暴饮暴食)
  • If possible, avoid medicines that delay or disrupt your sleep. Some commonly prescribed heart, blood pressure, or asthma medications, as well as some over-the-counter and herbal remedies for coughs, colds, or allergies, can disrupt sleep patterns. If you have trouble sleeping, talk to your healthcare provider or pharmacist to see whether any drugs you’re taking might be contributing to your insomnia and ask whether they can be taken at other times during the day or early in the evening(避免服用会延迟或扰乱睡眠的药物,如心血管药、止咳药、感冒药)
  • Don’t take naps after 3 p.m. Naps can help make up for lost sleep, but late afternoon naps can make it harder to fall asleep at night.(下午 3 点以后不要小睡)
  • Relax before bed. Don’t overschedule your day so that no time is left for unwinding. A relaxing activity, such as reading or listening to music, should be part of your bedtime ritual.(睡前放松,如读书、听音乐)
  • Take a hot bath before bed. The drop in body temperature after getting out of the bath may help you feel sleepy, and the bath can help you relax and slow down so you’re more ready to sleep.(冲个热水澡)
  • Have a good sleeping environment. Get rid of anything in your bedroom that might distract you from sleep, such as noises, bright lights, an uncomfortable bed, or warm temperatures. You sleep better if the temperature in the room is kept on the cool side. A TV, cell phone, or computer in the bedroom can be a distraction and deprive you of needed sleep. Having a comfortable mattress and pillow can help promote a good night’s sleep. Individuals who have insomnia often watch the clock. Turn the clock’s face out of view so you don’t worry about the time while trying to fall asleep.(良好的睡眠环境,灯光、床、电子设备、时钟)
  • Have the right sunlight exposure. Daylight is key to regulating daily sleep patterns. Try to get outside in natural sunlight for at least 30 minutes each day. If possible, wake up with the sun or use very bright lights in the morning. Sleep experts recommend that, if you have problems falling asleep, you should get an hour of exposure to morning sunlight and turn down the lights before bedtime.(晒太阳)
  • Don’t lie in bed awake. If you find yourself still awake after staying in bed for more than 20 minutes or if you are starting to feel anxious or worried, get up and do some relaxing activity until you feel sleepy. The anxiety of not being able to sleep can make it harder to fall asleep.(睡不着时就不要一直躺着)

23 页有个睡眠记录表,也很实用。

尽量不要在睡前做运动。体力消耗后,较高的体温可以保持 1-2 个小时。最好在熄灯前 2-3 个小时就结束锻炼。

应该避免吃得太饱或太饿,并避免过度偏向于高碳水化合物(超过总能量摄人的 70%)的饮食,尤其要避免糖的摄入。

后端技术面试 38 讲

不同操作系统,特别是不同 CPU 架构,不能执行相同的指令。Java 之所以可以在不同操作系统上运行,是因为 Java 编译的字节码文件不是直接在底层的系统平台上运行的,而是在 Java 虚拟机 JVM 上运行,JVM 屏蔽了底层系统的不同,为 Java 字节码文件构造了一个统一的运行环境。

JVM 主要由类加载器、运行时数据区、执行引擎三个部分组成: Pasted image 20220207182514.png 运行时数据区主要包括方法区、堆、Java 栈、程序计数寄存器

  • 方法区主要存放从磁盘加载进来的类字节码,而在程序运行过程中创建的类实例则存放在堆里。
  • 方法的输入参数和方法内定义的变量被压入 Java 栈
  • 如果在方法内创建了一个对象实例,这个对象实例信息将会被存放到堆里(对象实例的引用,也就是对象实例在堆中的地址信息则会被记录在栈里。)
  • 程序计数寄存器存放当前线程执行到哪一行字节码指令

JVM 封装了一组自定义的字节码指令集,有自己的程序计数器执行引擎,像 CPU 一样,可以执行运算指令。它还像操作系统一样有自己的程序装载与运行机制内存管理机制线程及栈管理机制,看起来就像是一台完整的计算机,这就是 JVM 被称作 machine(机器)的原因

JVM 通过可达性分析算法进行垃圾对象的识别。

Pasted image 20220207183121.png

JVM 垃圾回收主要有三种方法:

  1. 清理 Pasted image 20220207183205.png

  2. 压缩 Pasted image 20220207183247.png

  3. 复制 Pasted image 20220207183217.png

JVM 中具体执行垃圾回收的垃圾回收器有四种: Pasted image 20220207183633.png

  1. Serial 串行垃圾回收器
  2. Parallel 并行垃圾回收器
  3. CMS 并发垃圾回收器
  4. G1 垃圾回收器
    • 它将整个堆空间分成多个子区域,然后在这些子区域上各自独立进行垃圾回收,在回收过程中垃圾回收线程和用户线程也是并发运行。
    • G1 综合了以前几种垃圾回收器的优势,适用于各种场景,是未来主要的垃圾回收器。

JVM 将频繁执行的代码编译为底层 CPU 指令存储起来,后面再执行的时候,直接执行编译好的指令,不再解释执行,这就是 JVM 的即时编译 JIT

消息队列高手课

曾经是有一些国际组织尝试制定过消息相关的标准,比如早期的 JMS 和 AMQP。但让人无奈的是,标准的进化跟不上消息队列的演进速度,这些标准实际上已经被废弃了

好的架构不是设计出来的,而是演进出来的。

两种消息模型:

队列模型: Pasted image 20220207195805.png 发布 - 订阅模型(Publish-Subscribe Pattern): Pasted image 20220207195824.png RabbitMQ:队列模型

RabbitMQ 中,Exchange 位于生产者和队列之间,生产者并不关心将消息发送给哪个队列,而是将消息发送给 Exchange,由 Exchange 上配置的策略来决定将消息投递到哪些队列中。

Pasted image 20220207195902.png

RocketMQ、Kafka:发布 - 订阅模型

每个主题包含多个队列,通过多个队列来实现多实例并行生产和消费。只在队列上保证消息的有序性,主题层面是无法保证消息的严格顺序的。

Pasted image 20220207195946.png 在 Kafka 中,队列这个概念的名称不一样,Kafka 中对应的名称是“分区(Partition)”

读库2200

如果把漫画从各种标签的躯壳中拽出来,你就会发现,无论长多大,都有适合你看的漫画。作为一种语言和容器,漫画的魅力还远远没有开发完。

漫画的其他名字:

  • 剧画
  • 万话
  • 图像小说

漫画,它是我们已知的出版物中,最具有表现力和叙事潜力的读物,也是人类世界至今最为流行的艺术表现形式。

漫画是一门组合艺术,涉及绘画、电影、文学、艺术设计等,同时还有独属于漫画自己的表现语言。

如果把艺术创作分成「一个人可以完成」和「一个人无法完成」两类,漫画似乎就在那个临界点上。

漫画作品就是漫画家人生积累与人性力量的一部分,也是自身美学信阳、艺术造诣、创作水准的集中体现。

日本人发明了一个词,叫「脚心审美」。他们在室内不穿鞋,所以很强调榻榻米和地板的洁净。特别是光脚走路时,脚底的洁净感会带来很舒适的体验。脚知道你喜欢什么。

updatedupdated2022-03-092022-03-09