Hook钩子程序

钩子(Hook),是Windows消息处理机制的一个平台,应用程序可以在上面设置子程序以监视指定窗口的某种消息,而且所监视的窗口可以是其他进程所创建的。当消息到达后,在目标窗口处理函数(原本真正的处理函数)之前处理它。钩子机制允许应用程序截获处理Windows消息或特定事件。

类似于埋点,一旦触发了就会先执行钩子函数。

可以理解成在原本的函数执行流中,插入了别的函数地址,先执行了钩子函数,而钩子函数又可以去篡改数据,停止执行流等操作。

日志打印等级区分

假设日志等级从低到高分别为TRACE,INFO,WARN,ERROR

在代码中分别使用TRACE_LOG,INFO_LOG,WARN_LOG,ERR_LOG时,真正会打印到文件的日志是根据当前设置的日志等级来的。

假设现在设置日志登记为INFO,那么只有INFO_LOG,WARN_LOG,ERR_LOG的日志才会打出,这是因为,真正输出的日志,其等级要大于等于当前设置的等级。

日志等级越低,打印的日志就越多。

apache启动方法

cd /usr/local/apache2/bin

./apachectl start/stop/restart/reload/status

reload优雅的重启,加载新的配置

查询目录下的所有符号链接文件和指向的文件

find -type l -exec ls -l {} ;

c++lambda 捕获列表

1、值捕获,不论是显示捕获[local_var]还是隐式捕获[=],对于被捕获的变量,都是这些变量的副本,不会因为这些变量的销毁而出现内存错误,但是值捕获是常量,在lambda函数中不能修改这些副本的值

想要强行改值捕获的变量也可以,通过mutable关键字:

2、引用捕获,通过[&local_var]或[&]实现的捕获,可以在lambda函数中修改被捕获变量的值,但要十分小心,如果这些变量被销毁了,那么就会发生内存错误,容易core。

对于隐式捕获[=][&],存在很多陷阱,有时候不能直接按照上面的来理解,尤其是一些引用了类成员变量的情况,这个链接有一定的介绍:https://www.cnblogs.com/5iedu/p/11390495.html

https://docs.microsoft.com/zh-cn/cpp/cpp/lambda-expressions-in-cpp?view=msvc-160

string.rfind

指定开始搜索的下标位置,从这个位置往左(头部)开始搜索,来匹配字符或者字符串

https://tinacristal.github.io/2018/12/09/string%E7%B1%BB%E5%9E%8B%E7%9A%84rfind-find/

c++中string的默认中文编码

c++11中,std::string默认是utf8编码的,如果写文件的话要特别注意。

http://c.biancheng.net/view/4296.html

libxls遇到的问题

库的基本使用方法,这里很粗糙,没有去判断没有单元格是什么类型,直接用string类型来获取每个单元格的字符串值。

struct st_row::st_row_data* row;
xls_error_t error = LIBXLS_OK;
xlsWorkBook*  work_book;
xlsWorkSheet* work_sheet;
work_book = xls_open((char*)(file_name.c_str()), (char*)"UTF-8");
if (work_book != NULL) {
    work_sheet = xls_getWorkSheet(work_book, 0);
    error = xls_parseWorkSheet(work_sheet);
    if (error != LIBXLS_OK){
        ERR_LOG("excel文件解析失败");
        return;
    }
    for (uint32_t i = 0; i <= work_sheet->rows.lastrow; i++) {
        row = (st_row::st_row_data*)&work_sheet->rows.row[ i ];
        if (row->cells.cell[ 0 ].str) {
            std::string each_line((char*)row->cells.cell[ 0 ].str);
            // 处理每一行的数据
    }
    xls_close_WS(work_sheet);
    xls_close_WB(work_book);
} else {
    ERR_LOG("excel文件打开失败");
    return;
}

遇到的问题是,如果xls文件中是数字,会出现其他的字符,例如空字符:

发现最后出现了空字符,可能导致一些解析出问题。

c++ xlsx文件处理

https://github.com/troldal/OpenXLSX

OpenXLSX库可以处理xlsx文件,但不知道是否可以处理xls,后续有时间可以尝试一下

vim全选复制

ggVG稍微解释一下上面的命令gg 让光标移到首行,在vim才有效,vi中无效

  • V 是进入Visual(可视)模式

  • G 光标移到最后一行

选中内容以后就可以其他的操作了,比如:

  • d 删除选中内容

  • y 复制选中内容到0号寄存器

  • "+y 复制选中内容到+寄存器,也就是系统的剪贴板,供其他程序用

proto变量名相关

1、proto文件中定义的变量名不能带下划线

例如:

不能 optional int32 number_ =1;

2、如果字段名和protobuf的内置名字冲突了,编译后会自动在该字段加个下划线

例如:

Pb的message的字段名为opeartor的时候,会冲突,编译出来的字段实际是operator_,这应该是pb防止冲突的方法。

建议按照上面的规则来写proto,这样编译出来的rpc函数和消息字段名才符合正常的使用习惯,不然protobuf可能会对名字处理,导致使用的时候名字引用不对。

time_t是一个长整型

是utc时间戳,秒级

慢查询

超过指定时间的 SQL 语句查询称为“慢查询”,对应语句称为“慢查询语句”。

mysql执行sql语句的几种方法

https://blog.csdn.net/lwei_998/article/details/11806223

可以直接在shell命令行执行sql:

mysql -h -u -p -e "select count(*) from my_db;"

shell命令行最大长度限制

通过命令xargs --show-limits可以得到机器允许的最大命令行长度:

命令getconf ARG_MAX可以获取命令行长度上限,ARG_MAX包含环境变量和用户的参数,所以上图中2597+2089910=2092507=ARG_MAX,单位是字节

相关文章:https://www.cnblogs.com/MYSQLZOUQI/p/5552238.html

iptables

https://www.huaweicloud.com/articles/3abf0cf9743f2f582f45e320452596f6.html

iptables是用于linux自带的防火墙管理软件,通过命令行可以对不同的协议,入包/出包/转发等等网络包的逻辑进行处理,例如可以阻止包的转发,丢弃包等等。

上面这个网页中有很多例子,可以帮助理解。

https://www.huaweicloud.com/articles/98b6509a9fd7248e94364ff21ea434ac.html

https://www.cnblogs.com/zclzhao/p/5081590.html

这也有些说明,总的来说配置还是比较简单的。

主要要把握住,iptables其实管理的就是四张表,五个链,每个数据包根据起场景,是转发、入包还是出包会走不同的链,每个链都配了一系列规则,只要其中一个规则符合了就会停止往下找下一个规则。

linux和windows的换行符处理方法

https://www.itbiancheng.com/linux/4930.html

在windows下,换行符是\r\n,而在linux下换行符是\n

所以windows的文件如果在linux下getline,最后结尾的是一个\r字符

\r字符在xls文件中又会换行,给代码处理带来麻烦,处理windows的文件一定要记得出来最后的\r字符

在vim下可以查看是否存在这样的字符,vim以二进制打开文件:

vim -b filename

如果看到^M就表示这是一个windows文件,而且也可以在vim下输入:set invlist可以显示特殊字符。

$在linux下就是换行符\n,M等同于\r\n,I是制表符

上面的文件之所以会这样,是因为这是一个windows文件,然后我又在mac下在每行的最后买了个空格,然后就多了一个linux的换行符,所以这意味着两个系统一起操作同一个文件,会留下两个系统的痕迹。

不过索性一般文件只会在一个系统里操作,或者说是一个系统里生成,就还好,不会同时出现两种换行符,导致getline获取两行的情况。

goframe的orm

goframe是go语言下的一个组件,他支持orm,可用这个来操作数据库的一些操作。

https://goframe.org/pages/viewpage.action?pageId=1114286

redis的容灾恢复

https://blog.csdn.net/nlcexiyue/article/details/108266127

redis提供两种方式的持久化,一个是AOF,一个是RDB,前者是每次写操作都会append到aof文件,每一秒fsync到磁盘,而后者则是周期性的将内存快照落盘到硬盘上,rdb适合冷备。

strtol函数

#include <stdlib.h>

unsigned long strtoul (const char* str, char** endptr, int base);

str 为要转换的字符串,endstr 为第一个不能转换的字符的指针(函数执行时会自动设置,指针指向str的第一个非数字的字符),base 为字符串 str 所采用的进制(2-32,10代表十进制)。

ssh的一些问题

ssh的配置项在/etc/ssh/sshd_config下,修改这个文件后,执行service sshd restart来生效配置

每一项参数代表的意思:

https://blog.csdn.net/whatday/article/details/112389511

三个和最大连接数有关的参数:

MaxStartups的几个值都调大,例如300:30:1000, 或者干脆直接只写1000好了

ssh如果去连接一个挂掉的机器会一直阻塞重试;如果是目前连接到达上限,这时候去连,ssh直接返回:

ssh_exchange_identification: Connection closed by remote host

不会阻塞。

MaxSessions,一个tcp连接允许的会话个数上限,简单的理解成一个连接可以打开多少个shell,如果超过这个数量,那么就需要再创建一个新的tcp连接。

ssh多路复用multiplexing配置

https://www.cnblogs.com/birdstudio/p/6801052.html

假设机器A通过ssh连接机器B,在机器A上设置上述的配置之后,只要不超过MaxSessions参数,在A上连接B,会复用一个tcp连接,有一个master进程,复用同一个tcp连接的ssh进程通过unix套接字进行通信,进而实现复用。

RESTful

其实简单的理解就是uri是个名词,通过网络被获取的一个资源,而这个资源有不同的表现形式,例如文本可以是txt、xml、json等,而你想要获取这个资源则是通过在http头部中指定method:get post put delete等,动名词分开。

平时开发的就是restful的接口,详细的可以看:

https://www.ruanyifeng.com/blog/2011/09/restful.html

https://www.ruanyifeng.com/blog/2014/05/restful_api.html

python 退出程序

exit

抛出异常,如果没有获取异常则程序推出

sys.exit

抛出异常,如果没有获取异常则程序推出

os._exit

直接退出

gethostbyname_r gethostbyname

这两个函数的功能相似,只是_r是线程安全的,可重入的。

对一个主机名做dns解析,来获取ip地址

这个有几个版本,不同的内核有不同的版本,总的来说就是要给一个struct hostent对象,传这个对象的指针给这个函数,函数会把结果写到这个对象中,要么可以通过hostent指针的指针是否为null来判断是否调用成功,也有的函数重载是通过retcode来判断的。

hostent的介绍:

https://docs.microsoft.com/en-us/windows/win32/api/winsock/ns-winsock-hostent

url参数有中文的问题

url是ascii编码的,如果client和server两端对中文参数没有做好参数的编解码,就会导致处理的那一方参数乱码导致异常。

例如可以对参数进行utf8编码,server那边进行utf8解码,那就能够正常得到中文参数进而进行处理。

top命令下各指标的含义

https://blog.csdn.net/zhaifengmin/article/details/64123072

https://www.cnblogs.com/jiahm/p/11867375.html

其中常驻内存的指标RES的计算方式:

https://blog.csdn.net/whbing1471/article/details/108427689

所以res是包含mmap申请的内存的。

进程的目录下也有相应的内存占用信息,例如/proc/25816/maps

https://www.cnblogs.com/jiayy/p/3458076.html

http://linuxperf.com/?p=143

通过mmap的内存,在进程使用这部分内存后,才会被统计入RSS大小。

top命令

执行top后,再按e能够显示内存的单位,每按一次都会切换一次单位:

切换的单位也是 k,m,g,t,p:

string erase clear函数

clear函数只是将size变为0,将首字符变成空字符,没有去释放空间

erase函数则是将数据进行移动,也没有去释放被删掉字符的空间。