0%

第一章 天地之始,万物之母

道可道,非常道;名可名,非常名。

无,名天地之始;有,名万物之母。

故常无,欲以观其妙;常有,欲以观其徼。

此两者,同出而异名,同谓之玄。

玄之又玄,众妙之门。

可以言说的道,便不是恒常的道;可以定义命名的名,也不是恒常的名。

Read more »

我们将表的格式从未排序的行数组更改为 B 树。这是一个很大的更改,需要多篇文章来实现。在本文的结尾,我们将定义叶节点的布局,并支持将键/值对插入到单节点树中。但首先,让我们回顾一下切换到树结构的原因。

替代表格格式

使用当前格式,每个页面仅存储行(无元数据),因此非常节省空间。插入也很快速,因为我们只需追加到末尾即可。但是,只能通过扫描整个表来查找特定行。如果要删除一行,则必须通过移动其后的每一行来填补该空缺。

如果我们将表存储为数组,但按 id 对行进行排序,则可以使用二分查找来查找特定 id。但是,插入会很慢,因为我们必须移动很多行来腾出空间。

相反,我们使用树结构。树中的每个节点可以包含数量可变的行,因此我们必须在每个节点中存储一些信息来跟踪它包含多少行。此外,所有不存储任何行的内部节点还存在存储开销。作为对更大的数据库文件进行交换,我们获得了快速的插入、删除和查找。

未排序的行数组 已排序的行数组 节点树
页面包含 仅数据 仅数据 元数据、主键和数据
每页行数 更多的 更多的 更少
插入 O(1) O(n) O(log(n))
删除 O(n) O(n) O(log(n))
通过id查找 O(n) O(log(n)) O(log(n))
Read more »

B-Tree是 SQLite 用来表示表和索引的数据结构,因此它是一个非常核心的思想。本文只是介绍数据结构,所以不会有任何代码。

为什么树是数据库的良好数据结构?

  • 搜索特定值很快(对数时间)
  • 插入/删除您已经找到的值速度很快(重新平衡的时间很长)
  • 遍历一系列值的速度很快(与哈希映射不同)

B 树与二叉树不同(“B”可能代表发明者的名字,但也可以代表“平衡”)。这是一个 B 树示例:

example B-Tree (https://en.wikipedia.org/wiki/File:B-tree.svg)

与二叉树不同,B 树中的每个节点可以有 2 个以上的子节点。每个节点最多可以有 m 个子节点,其中 m 称为树的“order”。为了保持树基本平衡,我们还说节点必须至少有 m/2 个子节点(向上舍入)。

Read more »

安装

1
curl https://sh.rustup.rs -sSf | sh

安装完成后

1
Rust is installed now. Great!

快速参考

Read more »

读书时听着老师念答案不太能读懂诗词,年纪大了便能体会到其中的韵味和阅历。每次读时,还能有不同的品味。

诗词包含了古人所有的情感,你的酸甜苦辣,各种感受都能从中找到共鸣。

定风波·莫听穿林打叶声

苏轼

三月七日,沙湖道中遇雨,雨具先去,同行皆狼狈,余独不觉。已而遂晴,故作此词。

莫听穿林打叶声,何妨吟啸且徐行。竹杖芒鞋轻胜马,谁怕?一蓑烟雨任平生。

料峭春风吹酒醒,微冷,山头斜照却相迎。回首向来萧瑟处,归去,也无风雨也无晴。

Read more »

当测试程序需要数据时,可以通过faker来构造测试数据

安装

1
$ pip install faker

基本使用

1
2
3
4
5
6
7
8
9
10
11
12
from faker import Faker
faker = Faker()

faker.name()
# 'Lucy Cechtelar'

faker.address()
# '426 Jordy Lodge
# Cartwrightshire, SC 88120-6700'

faker.ipv4()
# '196.67.103.129'

对方法 faker.ipv4()的每次调用都会产生不同的随机结果

1
2
3
4
5
6
7
8
9
10
11
12
13
for _ in range(10):
print(faker.ipv4())

# '120.36.235.152'
# '16.58.6.69'
# '170.215.56.41'
# '135.217.158.192'
# '218.235.87.38'
# '175.80.75.73'
# '122.120.1.128'
# '99.91.143.38'
# '1.90.129.142'
# '184.148.193.249'
Read more »

Steve Jobs

I am honored to be with you today at your commencement from one of the finest universities in the world. Truth be told, I never graduated from college, and this is the closest I’ve ever gotten to a college graduation. Today I want to tell you three stories from my life. That’s it. No big deal. Just three stories.

The first story is about connecting the dots.

I dropped out of Reed College after the first 6 months, but then stayed around as a drop-in for another 18 months or so before I really quit. So why did I drop out?

It started before I was born. My biological mother was a young, unwed college graduate student, and she decided to put me up for adoption. She felt very strongly that I should be adopted by college graduates, so everything was all set for me to be adopted at birth by a lawyer and his wife. Except that when I popped out they decided at the last minute that they really wanted a girl.

Read more »

1. 概述

Protocol Buffers(又名protobuf) 是一种语言中立、平台中立的可扩展机制,用于序列化结构化的数据

它就像JSON,只是它更小、更快

只需定义一次数据如何被结构化,然后就可以使用特殊生成的源代码,轻松地从各种数据流和使用各种语言写入和读取结构化数据

Read more »

简介

tcpdump是一个命令行数据包分析、抓取工具

可以使用 -D 标志来列出可用于捕获的接口

1
2
3
4
5
6
7
8
9
10
11
$ tcpdump -D

1.virbr0
2.docker0
3.vethdb0f731
4.nflog (Linux netfilter log (NFLOG) interface)
5.nfqueue (Linux netfilter queue (NFQUEUE) interface)
6.usbmon1 (USB bus number 1)
7.enp2s0
8.usbmon2 (USB bus number 2)
9.enp3s0

可以使用 -i 标志指定要捕获的接口,指定 any 作为接口将从所有活动接口捕获

1
2
$ tcpdump -i any
$ tcpdump -i eth1

可以使用 -v 标志来调整tcpdump输出中的详细程度

1
2
3
$ tcpdump -i any -v (Verbose output)
$ tcpdump -i any -vv (Even more verbose output)
$ tcpdump -i any -vvv (The most verbose output)

协议过滤器

可以根据协议过滤捕获流量。例如,侦听所有TCP连接

1
$ tcpdump tcp

端口过滤器

如果只对特定端口的流量感兴趣,则可以使用端口过滤器来确定分析

1
tcpdump port 80

将端口80作为其源端口或目标端口的流量,则可以使用

1
2
$ tcpdump src port 80
$ tcpdump dest port 80

主机过滤器

如果只对特定主机的流量感兴趣,则可以使用主机过滤器。主机过滤器还可以与源或目的过滤器组合。

1
2
3
$ tcpdump host 1.2.3.4
$ tcpdump src host 1.2.3.4
$ tcpdump dst host 1.2.3.4

组合滤波器

可以在tcpdump中组合多个过滤器

1
2
$ tcpdump "src port 80" and "dst host 1.2.3.4"
$ tcpdump "src port 80" or "src port 443"

保存输出
可以使用 -w 将捕获的数据包保存到文件中

1
$ tcpdump tcp -w FILE_PATH

如果需要既保存又打印,可以将 –print 与 -w 结合使用

1
$ tcpdump tcp -w FILE_PATH --print

扩展

更多内容可参考tcpdump手册

https://www.tcpdump.org/manpages/tcpdump.1.html

The Pragmatic Programmer Quick Reference Guide

  1. 关心你的技艺
    Care About Your Craft
    如果你不在乎能否漂亮地开发出软件,你又为何要耗费生命去开发软件呢?

  2. 思考!你的工作
    Think!About Your Work
    关掉自动驾驶,接管操作,不断地批评和评估你的工作

  3. 提供各种选择,不要找蹩脚的借口
    Provide Options, Don’t Make Lame Excuses
    要提供各种选择,而不是找借口,不要说事情做不到,说明能够做什么

  4. 不要容忍破窗户
    Don’t Live with Broken Windows
    当你看到糟糕的设计、错误的决策和糟糕的代码时,修正它们

  5. 做变化的催化剂
    Be a Catalyst for Change
    你不能强迫人们改变。相反,要向他们展示未来可能会怎样,并帮助他们参与对未来的创造

  6. 记住大图景
    Remember the Big Picture
    不要太过专注于细节,已忘了查看周围正在发生什么

Read more »