Unix Philosophy
- 让每个程序都做好一件事。要做一件新的工作,写一个新程序,而不是通过添加“功能”让老程序复杂化。
- 期待每个程序的输出成为另一个程序的输入。不要将无关信息混入输出。避免使用严格的列数据或二进制输入格式。不要坚持交互式输入。
- 设计和构建软件,甚至是操作系统,要尽早尝试,最好在几周内完成。不要犹豫,扔掉笨拙的部分,重建它们。
- 优先使用工具来减轻编程任务,即使必须曲线救国编写工具,且在用完后很可能要扔掉大部分。
SQL Parse In ClickHouse
首先经过token进行切词,然后通过ast node来进行组织
可以发现,ast parser 的时候,预先构造好状态空间,比如 select 的状态空间:
- expression list
- from tables
- where
- group by
- with …
- order by
- limit
在一个状态空间內,还可以根据 parse 返回的 bool 判断是否继续进入子状态空间,一直递归解析出整个 ast。
1 | bool ParserSelectQuery::parseImpl(Pos & pos, ASTPtr & node, Expected & expected) |
Tcp Reset Attack Intro
The attack is believed to be a key component of China’s Great Firewall, used by the Chinese government to censor the internet inside China.
the GFW may sometimes also want to allow a connection to be made, but to then kill it halfway through.
against long-lived connections
针对IPSec,针对ip级别的auth
虽然有TLS,但是基于tcp的协议,依然无效
Reconstructing segments into a stream requires care, because the internet is not reliable.重新组织tcp包
A successful TCP reset attack therefore requires a believable sequence number.
原理还是插入一个包,导致整个链路失效
UDP的连接是单向的,在调用connect的时候并不会产生任何通信流量,它只是在内核协议栈中绑定了一对五元组而已,该五元组是:UDP协议/源IP/源端口/目的IP/目的端口
UDP-端口复用的IP协议
UDP双方每次以512字节定长包通信
多点通讯
Data Event in shopee
There are only two hard things in Computer Science: Cache validation and naming things
1 | { |
采用zk作为元数据的存储
mysql binlog ->gds -> GDS Kafka -> Consumer-> kafka queue -> Executor -> other db/redis
每个库一个队列
controller + zookeeper来管理,前者用来调度,后者用来存储元数据信息
利用goroutine来进行并发,同时,根据key来分发,也有一定顺序性