innodb_strict_mode
遇到这个参数是因为在建表的时候发生了row size too large的问题,字段类型决定的每行数据长度超过了数据库的限制,而这个限制的检查收到innodb_strict_mode的影响,如果将该参数设置为off,则会关闭长度的检查,能够正确建表,并且插入数据也无问题。
(行长度过大的原因是因为不同类型的row format和引擎,会导致不同的存储方式,也就导致了行长度有限制,具体可以参考:https://dev.mysql.com/doc/refman/8.0/en/innodb-row-format.html、https://cloud.tencent.com/developer/article/1690711)
这个参数可以是全局的,也可以是会话级别的,因为关闭这个参数后,会导致一些错误检查都被当成warning返回了,也即不会再返回错误,有一定的使用风险,特别是在DDL(create、alter等操作)时,这样会带来一定的风险,所以建议会话等级关闭:
set session innodb_strict_mode ='off';
grpc
https://colobu.com/2017/04/06/dive-into-gRPC-streaming/
grpc基于 HTTP/2 协议传输,使用Protocol Buffers 作为接口描述语言
https://doc.oschina.net/grpc?t=58011(grpc协议介绍)
HTTP2可以支持流式传输,一个连接上可以有多个stream,根据不同的stream_id来区分请求和响应,在使用protobuf,定义服务接口的时候,可以指定请求/响应是否使用stream:

因此有请求流、响应流、双向流的区分。
grpc是可以在http1.1中使用的,本身http/2就是兼容了http/1.1的一些特性

APIJSON
https://github.com/Tencent/APIJSON/blob/master/Document.md#2.1
http://apijson.cn/doc/zh/
http://apijson.cn/
apijson是一个ORM库,CRUD的接口不需要通过后段定义,传统方式需要后端定义接口,如何取请求参数,去查询数据库,所以CRUD一般都会对应多个后台接口;
前端处理这些查询数据库的请求结果,需要依赖后台的接口文档,任何后台的变更都可能导致前端突然失效。
APIJSON只需要在后台服务引入这个库,这个库会连接到配置的数据库上,然后执行数据库CRUD。只需要后台引入就行,后台不需要开发对外的接口,全由这个库来实现,不过需要url的监听,例如go语言的gin路由控制(类似于tornado,注册一个handler,前端的url可以匹配到这个handler)
前端根据APIJSON的请求协议,请求上面配好的url接口,就可以实现前端自主的数据库orm。
所谓APIJSON,其实API对应的是数据库的CRUD接口,JSON表示请求都是通过规定的json请求协议去请求的。
相当于是给了前端直接查数据库的能力,不依赖后端任何接口
整体流程是:
前端-->APIJSON请求包-->后台APIJSON库-->数据库(再反向返回给前端)
前端按照APIJSON定义的请求协议,来CRUD就行。
Swagger
https://swagger.io/
https://blog.csdn.net/zhanggonglalala/article/details/98070986
有swagger ui、swagger editor、swagger codegen三大部分

但是目前来看,就是在代码中引入swagger的库,然后在编写的接口里,按照swagger的注解方式,进行注释,然后使用swagger的工具,扫描代码,生成对应的接口文档(是一个json文档)
然后swagger ui可以读取这个文档,在前端页面展示你的接口文档信息
可以参考go语言下的案例
https://www.cnblogs.com/liwenzhou/p/13629767.html
swagger editor目前看来就是在线编辑上述的文档的。swagger ui同时还能进行接口请求测试,上面生成的接口文档比较通用,可以被一些别的系统导入,生成对应的文档。
这里需要看下OpenAPI和swagger之间的关系:

OpenAPI是一个规范,而swagger是实现该规范的一些工具,现在swagger也已经支持之心的OAS3.0(openAPI 3.0)。
可以上https://editor.swagger.io/的live demo看,左侧的是OpenAPI的规范约定的描述接口的文件,可以是json,也可以是yaml。
https://liqiang.io/post/openapi-30-vs-swagger-20


删除环境变量
echo $ENV_NAME
unset ENV_NAME (删除)
protobuf go_package
在go下使用protobuf时,经常会在.proto文件中看到下面的代码:
syntax = "proto3";
package trpc.test.helloworld;
option go_package="test_/new_helloworld";
有两个package相关的代码,第一行package的作用类似于作用域,为了避免import别的proto文件时,与自己proto文件中定义的对象重名了,而第二个option go_package则是用于确定这个proto文件编译生成的go文件是在什么包下,别的文件如何去引用编译出来的go文件,详细的解释可以看下面的图(https://stackoverflow.com/questions/66321215/what-is-the-go-package-option-used-for-in-a-protocol-buffer-file?rq=1)
此时,多个相互之间import的proto文件,在编译生成的每个不同包下的go文件,就知道该如何import别的go文件(import的路径就是go_package指定的路径)

而且一旦使用go_package,编译出来的go文件的包名也就确定了,就是这个参数的路径中的最后一个字符串,例如上面的将会编译出名为new_helloworld的包。

json schema validator
http://json-schema.org/
tcpdump抓包
tcpdump dst port 9620 -A -i eth1 | egrep -i "POST /|GET /|Host:"
抓取目标端口9620的包 并且过滤POST GET Host
tcpdump -i eth1 host domain.com -A -vv -w output.pcap
-vv -v可以展示协议名 -A以ascii码展示
-w输出到文件(可以是文本格式)
tcpdump host 127.0.0.1 and port 9527 -i eth1
抓取源目ip均为127.0.0.1,端口为9527的包
tcpdump dst 127.0.0.1 and port 9527 -i eth1
tcpdump src 127.0.0.1 and port 9527 -i eth1
如果是从一台机器的请求到自身,内核会自动优化走loopback,所以此时只能抓环回的端口,ip相应改为127.0.0.1
git commit规范约束
https://www.conventionalcommits.org/zh-hans/v1.0.0/
https://github.com/zuoxiaobai/commitizen-practice-demo
上面这个链接是实践(git commit规范检查、changelog自动生成、自动打tag)
替换文件中的字符串
find . -type f -print0 | xargs -0 sed -i 's/foo/bar/g'
找出所有文件,进行修改,print0是为了将文件名中有空格的正常输出
sed -i 's/a/b/g' file_name 将文件中的a全部替换成b,并直接修改文件

curl 带上cookie
curl "http://xxxx.com" -H "MyHeader: 123456" --cookie "user=rex;id=1"
grep 排除目录和文件
当使用-r或-R选项执行递归搜索时,您可能希望从搜索结果中排除特定目录。
-r或-R选项之间的主要区别在于,当使用大写R调用grep时,它将跟随所有符号链接。
要从搜索中排除目录,请使用--exclude-dir选项。排除目录的路径是相对于搜索目录的。
grep -Rn --exclude-dir=dont_want_dir "content"
grep -Rn -exclude=dont_want_file "content"
--exclude选项的参数支持正则
c++ 原生字符串
std::string str = R"(xxxx1\rsx'")";
R开头双引号内需要有小括号,括号内对应的是原生字符串
查看系统OOM日志
grep "Out of memory" /var/log/messages

egrep -i -r 'killed process' /var/log

查看core dump文件路径
cat /proc/sys/kernel/core_pattern
vim /etc/security/limits.conf 查看设置
全局生效coredump
vim /etc/profile
ulimit -c unlimited
source /etc/profile

查看机器配置
grep processor /proc/cpuinfo
scp linux文件传输命令
https://www.runoob.com/linux/linux-comm-scp.html
http content-length

Broken pipe报错
指对端关闭连接后,还继续往该fd写数据发生的报错,收到TCP RST,然后系统调用报错;

查看cpu 内存等信息
free -gth
总核数 = 物理CPU个数 X 每颗物理CPU的核数
总逻辑CPU数 = 物理CPU个数 X 每颗物理CPU的核数 X 超线程数
查看物理CPU个数
cat /proc/cpuinfo| grep "physical id"| sort| uniq| wc -l
查看每个物理CPU中core的个数(即核数)
cat /proc/cpuinfo| grep "cpu cores"| uniq
查看逻辑CPU的个数
cat /proc/cpuinfo| grep "processor"| wc -l
查看CPU信息(型号)
cat /proc/cpuinfo | grep name | cut -f2 -d: | uniq -c
查看内存信息# cat /proc/meminfo
如何查看Linux 内核
uname -a
cat /proc/version
查看机器型号(机器硬件型号)
dmidecode | grep "Product Name"
dmidecode
如何查看linux 系统版本
cat /etc/redhat-release
lsb_release -a
cat /etc/issue
如何查看linux系统和CPU型号,类型和大小
cat /proc/cpuinfo
如何查看linux 系统内存大小的信息,可以查看总内存,剩余内存,可使用内存等信息
cat /proc/meminfo
dns解析服务器配置
/etc/resolv.conf文件保存了dns解析服务的信息
https://man7.org/linux/man-pages/man5/resolv.conf.5.html


查看linux的系统时间
date -R 查看时区
date +"%Y-%m-%d" 年月日
date +"%H-%M-%S" 时分秒
date +%s 显示时间戳
date -d @1655456218 时间戳转为日期

vim查看不可见字符
:set invlist
JVM调优参数

脚本执行出错就退出
#! /bin/bash
set -e
-a 标示已修改的变量,以供输出至环境变量。
-b 使被中止的后台程序立刻回报执行状态。
-C 转向所产生的文件无法覆盖已存在的文件。
-d Shell预设会用杂凑表记忆使用过的指令,以加速指令的执行。使用-d参数可取消。
-e 若指令传回值不等于0,则立即退出shell。
-f 取消使用通配符。
-h 自动记录函数的所在位置。
-H Shell 可利用"!"加<指令编号>的方式来执行history中记录的指令。
-k 指令所给的参数都会被视为此指令的环境变量。
-l 记录for循环的变量名称。
-m 使用监视模式。
-n 只读取指令,而不实际执行。
-p 启动优先顺序模式。
-P 启动-P参数后,执行指令时,会以实际的文件或目录来取代符号连接。
-t 执行完随后的指令,即退出shell。
-u 当执行时使用到未定义过的变量,则显示错误信息。
-v 显示shell所读取的输入值。
-x 执行指令后,会先显示该指令及所下的参数。
+<参数> 取消某个set曾启动的参数。
批量kill 服务
ps -ef | grep "your_progame_name" | grep -v grep | awk '{print $2}' | xargs kill -9