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