cmake - 一些keywords
private, interface, public某些cmake函数是为target指定traits的,这些参数需要指定上述3个keywors中的一个。而如果某个target是一个库,那么这3个keywords就尤其重要。
private:指定的traits只作用于这个target,而不会作用于那些需要链接这个target的target。
interface:相反的含义。这个traits只作用于那些需要链接该target的target,而不作用于该target。
public:即private和interface的集合。
所谓的traits,举个例子就比如:要include的目录,C++ standard,等等。其对应于底层的INCLUDE_DIRECTORIES(私有属性), INTERFACE_INCLUDE_DIRECTORIES(接口属性), CXX_STANDARD(C++标准这个属性不具备接口值)等变量。
以下函数可以为target添加traits:
target_link_libraries: Other targets; can also pass libr ...
使用GoogleTest测试C++代码
术语
test suite:应该就是指整个测试的名称和意义
test:整个测试下某一类的测试
所以test suite是一个整体,下面会有不同的test,不同的test都属于这个test suite。单个test下可以包含多个测试用例
test case:废弃术语
使用流程
编写断言(assertion),检查环境是否有效;
断言包含TEST()和TEST_F()两种大类型,分别对应简单的测试,以及针对固定class的测试夹具;
断言
ASSERT_*类的断言只生成FATAL类型的错误,并立即终止程序;
EXPECT_*类的断言还会生成NONFATAL类型的错误,不会立即终止程序;
上述两种类型的断言如何选择?关键就在于:选择EXPECT_*,那么你想要的是,出现错误时,想要程序继续运行,去观察更多的错误现象以及输出;而选择ASSERT_*就意味着,如果出现了错误,那么后续的程序运行也就没有意义了;
cmake使用cmake构建用googletest进行测试的测试工程,大概有两种方式:FetchContent()和find_package()。本节中我们假设已经有了一个项目,内 ...
k8s tutorial - Learn Kubernetes Basics
流程汇总
创建cluster
在cluster上创建一个deployment,然后再部署对应的APP(因为创建deployment时会指定image)
当创建了Deployment之后,系统会创建对应的pod,视为一组紧密耦合的APP的逻辑主机
将pod视为一个逻辑主机之后,就很清晰了,kubectl提供了一系列接口以和pod进行通信以及运行APP(这里需要注意Pod和Node的区别)
pod因为只能运行在单个Node上,所以是很脆弱的,因此需要在此基础上创建service;同时,service使得APP能够expose到外部网络)
Learn Kubernetes Basics – Create a Cluster
Kubernetes automates the distribution and scheduling of application containers across a cluster in a more efficient way.
核心理念:使应用程序容器化,这样可以使得程序和主机解耦,程序不需要绑定到特定主机,而是通过k8s在cluster上进行调度编排。 ...
Hello World
Welcome to Hexo! This is your very first post. Check documentation for more info. If you get any problems when using Hexo, you can find the answer in troubleshooting or you can ask me on GitHub.
Quick StartCreate a new post1$ hexo new "My New Post"
More info: Writing
Run server1$ hexo server
More info: Server
Generate static files1$ hexo generate
More info: Generating
Deploy to remote sites1$ hexo deploy
More info: Deployment
Linux - Useful Command Argument Combination
ps
ps -ef:显示所有进程的信息;
ps l:输出进程的额外信息,包括 STAT 状态信息(XY,X 代表当前状态,分别有:S 睡眠,R 就绪,O 运行;Y 代表额外的状态信息,如下图所示),比如 Ss 代表该进程处于睡眠状态,并且是一个控制进程;
du
du -h -d1:显示当前文件夹下所有子文件和子文件夹所占用的空间(注意,递归深度只有 1)
MySQL子查询优化
子查询优化概述和分类
子查询在外层查询中可能出现的位置:
在 select 中:SELECT (SELECT MAX(COL1) FROM TABLE1);
在 from 中:SELECT M1 FROM (SELECT M+1 FROM TABLE1 WHERE M>2) AS TMP;
在 WHERE 中(最常见):SELECT * FROM TABLE1 WHERE M1 IN (SELECT M2 FROM TABLE2);
按照子查询返回的数据的规模,将子查询分类如下:
标量子查询;行子查询;列子查询;表子查询;
按照与外层查询的关系进行分类:
不相关子查询:子查询可以独立运行得到结果;
相关子查询:依赖外部查询的结果;SELECT * FROM T1 WHERE T1.M1 IN (SELECT T2.M2 IN T2 WHERE T1.N1 = T2.N2)
限制条件由于子查询一般只是用在 where 中,以构成操作数 comparison_operator (子查询),所以这里列举一下这种情况下的一些限制条件:
comparison_operato ...
mysql-grammer-summary
former
use <database> : 选择某个数据库
测试: 不加 FROM 字段可以测试 mysql 的各个功能
DELIMITER <character>: 自定义新的分隔符(以替换掉;分隔符)
常用的 SHOW 命令SHOW DATABASES:SHOW TABLES:SHOW COLUMNS FROM <TABLE> 等价于 DESCRIBE <TABLE>SHOW GRANTS
常用的 SELECT 命令SELECT <COLUMNS> FROM <TABLE> : 从表中选出某一列(整列)SELECT DISTINCT <COLUMNS> FROM <TABLE> : 从表中选出某一整列,但剔除掉重复的行SELECT <COLUMNS> FROM <TABLE> LIMIT <row, lines> : 选出从第 row 行开始的 lines 行SELECT <TABLES>.<COLUMNS> FROM & ...
Brief Notes of 《Effective C++》
本文为学习《Effective C++》各个条款之后的一点概要式的总结。
条款 2 尽量以 const, enum, inline 替代#define
宁可用编译器替代预处理器。以#define 定义的记号是不会记录到符号表中的;
#define 没有封装性可言。
enum hack。enum {tmp=5};对应的tmp一定在编译器就可以得到并且不会导致非必要的内存分配。
条款 3 尽可能使用 const
调用 const 成员函数以实现孪生 non-const 成员函数。通过使用const_cast和static_cast来达到目的,优点是避免了代码重复。
调用 non-const 成员函数实现 const 成员函数是错误的。因为这破坏了 const 的语义约束。
条款 5 了解 C++默认编写并调用哪些函数
如果自定义了需要实参的构造函数,则编译器不会自动生成 default ctor
如果 class 内部包含有带有&引用类型或者const常量类型,则编译器不会自动生成 copy assignment;因为编译器不知道该怎么处理
条款 7 为多 ...
TCP-summary
前言
面向连接的、可靠的字节流服务:
必须先连接,再交互数据;
TCP 不对发送的字节流做任何解释和标识符插入;
TCP 连接:
socket: 编程接口,一个 IP 地址和一个端口号唯一标志一个 socket
($2^{32}-1$): TCP 字节流的最大序号,循环反复; 每个被传输的字节都被计数
流量控制:每一端对窗口大小进行声明; 起始于确认序号字段指明的值(默认为 4096)
TCP 头部
2 字节源端口号+2 字节目的端口号;
4 字节序号
4 字节确认序号
{4 位首部长度,保留 6 位,6 位标志位}+2 字节窗口大小
2 字节检验和+2 字节紧急指针
可选选项
一些注意点:
TCP 中仅有两方进行通信,广播和多播不能用于 TCP
应用层数据会被 TCP 分割成合适的数据块,称为报文段(segment)
TCP 首部最长为 60 字节(4 位首部长度最大值为 15,单位为 4 字节,故最长为$4\times15=60$)
TCP 连接建立和终止
tcpdump:
格式:源 > 目的:标志({'S', ' ...
C++并发API总结
本文是阅读《Effective Modern C++》之后的一点理解和笔记github 博客地址
基于线程 VS. 基于任务1234int doAsyncWork();std::thread t(doAsyncWork); // 基于线程auto fut = std::async(doAsyncWork); // 基于任务
硬件线程:实际执行计算的线程,和实际的 CPU 核心有关(一个核心对应一个或多个硬件线程);
软件线程:进行进程管理、硬件线程调度的线程;系统能够提供的软件线程有限;
超订(oversubscription):就绪状态的软件线程超过了硬件线程个数;
软件线程和硬件线程的最佳比例很难确定,因为它取决于:
软件线程变为可运行状态的频繁程度(IO 密集型 VS. 计算密集型)
上下文切换的开销成本(与体系结构有关)
软件线程使用 CPU 缓存的命中率(与体系结构有关)
…
std::thread:底层软件线程的句柄
在通常情况下,基于任务会比基于线程更好,原因如下:
std::async的返回值类型std::future拥有get()成员函数,可以方便 ...