标签搜索

目 录CONTENT

文章目录

易忘知识点

小小城
2021-08-21 / 0 评论 / 0 点赞 / 7 阅读 / 12,229 字 / 正在检测是否收录...
温馨提示:
本文最后更新于 2022-05-02,若内容或图片失效,请留言反馈。部分素材来自网络,若不小心影响到您的利益,请联系我们删除。

易忘知识点

[toc]

正则当中的.*?

.:任意一个字符
*:匹配前导字符任意个(0个或者多个)
?:匹配前导字符0个或者1个
+:匹配前导字符1个或者多个

shell中的()、{}

file=/dir1/dir2/dir3/my.file.txt

可以用${ }分别替换得到不同的值:
${file#*/}:删掉第一个 / 及其左边的字符串:dir1/dir2/dir3/my.file.txt
${file##*/}:删掉最后一个 / 及其左边的字符串:my.file.txt
${file#*.}:删掉第一个 . 及其左边的字符串:file.txt
${file##*.}:删掉最后一个 . 及其左边的字符串:txt
${file%/*}:删掉最后一个 / 及其右边的字符串:/dir1/dir2/dir3
${file%%/*}:删掉第一个 / 及其右边的字符串:(空值)
${file%.*}:删掉最后一个 . 及其右边的字符串:/dir1/dir2/dir3/my.file
${file%%.*}:删掉第一个 . 及其右边的字符串:/dir1/dir2/dir3/my

Base64编码

  1. Base64是网络上最常见的用于传输8Bit字节码的编码方式之一,Base64就是一种基于64个可打印字符来表示二进制数据的方法
  2. 特点:
  • 可以将任意的二进制数据进行Base64编码。
  • 数据加密之后,数据量会变大,变大1/3左右。
  • 编码后有个非常显著的特点,末尾有个=号。
  • 可进行反向解密。
  • Base64编码具有不可读性
  1. 结果
  • 所有的数据都能被编码为并只用65个字符就能表示的文本文件。
  1. 65字符
A~Z a~z 0~9 + / =

image.png

  1. Base64加密原则:
  • 6bit(原8bit)一个字节,不足的位数用0补齐,两个0用一个=表示。
  1. Base64编码原理
  • Base64编码的思想是:采用64个基本的ASCII码字符对数据进行重新编码。
  • 将需要编码的数据拆分成字节数组,以3个字节为一组,按顺序排列24位数据,再把这24位数据分成4组,即每组6位;
  • 再在每组的的最高位前补两个0凑足一个字节,这样就把一个3字节为一组的数据重新编码成了4个字节;
  • 当所要编码的数据的字节数不是3的整倍数,也就是说在分组时最后一组不够3个字节,这时在最后一组填充1到2个0字节,并在最后编码完成后在结尾添加1到2个=号。
例如对ABC进行Base64编码过程:

- 首先取ABC对应的ASCII码值
A : 65、B : 66、C : 67
- 再取二进制值
A : 01000001、B : 01000010、C : 01000011
- 然后把这三个字节的二进制码接起来
010000010100001001000011
- 再以6位为单位分成4个数据块并在最高位填充两个0后形成4个字节的编码后的值
00010000、00010100、00001001、00000011
- 再把这4个字节数据转化成10进制数
16、20、19、3
- 最后根据Base64给出的64个基本字符表,查出对应的ASCII码字符
Q、U、J、D
这里的值实际就是数据在字符表中的索引。

解码过程就是把4个字节再还原成3个字节再根据不同的数据形式把字节数组重新整理成数据。

clock_gettime

  1. 简介:函数"clock_gettime"是基于Linux C语言的时间函数,他可以用于计算精度和纳秒。
  2. 函数原型
#include<time.h>
int clock_gettime(clockid_t clk_id,struct timespec *tp);
  1. 参数:
  • clk_id : 检索和设置的clk_id指定的时钟时间
CLOCK_REALTIME:系统实时时间,随系统实时时间改变而改变,即从UTC1970-1-1 0:0:0开始计时,
中间时刻如果系统时间被用户改成其他,则对应的时间相应改变
- CLOCK_MONOTONIC:从系统启动这一刻起开始计时,不受系统时间被用户改变的影响
- CLOCK_PROCESS_CPUTIME_ID:本进程到当前代码系统CPU花费的时间
- CLOCK_THREAD_CPUTIME_ID:本线程到当前代码系统CPU花费的时间
  • tp
struct timespec
{
    time_t tv_sec; /* 秒*/
    long tv_nsec; /* 纳秒*/
};

CV_8UC3

  1. opencv中CV_8UC3的含义:
  • 预定义类型的结构:
CV_<bit_depth>(S|U|F)C<number_of_channels>
  • 其中
(1) bit_depth---比特数---代表8bite\16bite\32bite\64bite

eg:8表示你所创建的储存图片的Mat对象中,每个像素点在内存空间所占的空间大小8bite。

(2) S|U|F
S: signed int,即有符号整型;

U: unsigned int,即无符号整型;

F: float,单精度浮点型。

(3) C<number_of_channels>:所存储的图片的通道数。
1---grayImg灰度图像---是---单通道图像

2---RGB彩色图像---是---3通道图像

3---带Alpha通道的RGB彩色图像---是---4通道图像

cvtColor函数

  1. 简介:cv::cvtColor()用于将图像从一个颜色空间转换到另一个颜色空间的转换(目前常见的颜色空间均支持),并且在转换的过程中能够保证数据的类型不变,即转换后的图像的数据类型和位深与源图像一致
  2. 原型:
void cv::cvtColor(
      cv::InputArray src, // 输入序列
      cv::OutputArray dst, // 输出序列
      int code, // 颜色映射码
      int dstCn = 0 // 输出的通道数 (0='automatic')
     );
  1. 参数解释:
  • InputArray src: 输入图像即要进行颜色空间变换的原图像,可以是Mat类
  • OutputArray dst: 输出图像即进行颜色空间变换后存储图像,也可以Mat类
  • int code: 转换的代码或标识,即在此确定将什么制式的图片转换成什么制式的图片
  • int dstCn = 0: 目标图像通道数,如果取值为0,则由src和code决定
  • code:

image.png

OpenCV中Scalar函数

  1. 简介: cv::Scalar的构造函数是cv::Scalar(v1, v2, v3, v4),前面的三个参数是依次设置B、G、R的,第四个参数设置图片的透明度。
  2. 作用:设置opencv中的颜色

std::make_shared函数

  1. 简介:返回指定类型的std::shared_ptr
  2. 和std::shared_ptr的区别:
  • 提高性能
  • shared_ptr 需要维护引用计数的信息
  • 强引用, 用来记录当前有多少个存活的 shared_ptrs 正持有该对象.
  • 共享的对象会在最后一个强引用离开的时候销毁( 也可能释放).
  • 弱引用, 用来记录当前有多少个正在观察该对象的 weak_ptrs. 当最后一个弱引用离开的时候, 共享的内部信息控制块会被销毁和释放 (共享的对象也会被释放, 如果还没有释放的话).
  • 如果你通过使用原始的 new 表达式分配对象, 然后传递给 shared_ptr (也就是使用 shared_ptr 的构造函数) 的话, shared_ptr 的实现没有办法选择, 而只能单独的分配控制块
  • std::make_shared(比起直接使用new)的一个特性是能提升效率。使用std::make_shared允许编译器产生更小,更快的代码,产生的代码使用更简洁的数据结构
  • std::make_shared只需要进行一次内存分配,计数器和数在一块内存当中
    异常安全
  1. 缺点:当构造函数是私有或保护以及没有相应的构造函数时是无法使用std::make_shared的
//1.
std::shared_ptr<int> ptr = std::make_shared<int>(999); //ok

//2.
class Test {
public:
    Test(){};
};

class Child {
public:
    Child(){};
};

std::shared_ptr<Child> child = std::make_shared<Child>(test);//false

//3.
class Test {
public:
    Test(){};
};

class Child : public Parent {
public:
    Child(Test* test) : _test(test){};
    Test* _test;
};



 std::shared_ptr<Child> child = std::make_shared<Child>(test);//ok

md5sum命令

  1. 简介:生成md5进行校验
  2. 命令:md5sum [OPTION]... [FILE]...
-b : 二进制 md5sum -b file.bin
-c : 检验 md5sum -c file.md5(file.md5是带检验文件的md5)
-t : txt md5sum -t file.txt

gflag

  1. 头文件:#include <gflags/gflags.h>
  2. 定义:DEFINE_bool(hex_log_id, false, "Show log_id in hexadecimal")
  3. 处理程序参数:google::ParseCommandLineFlags(&argc, &argv, true/表示把识别的参数从argc/argv中删除/)
  4. 使用:在变量名前加上FLAGS_来进行使用
  5. 从命令行传递数值:./bin --arg1=val1 --arg2=val2
  6. 从文件中传值:./bin --flagfile=filename或者在程序中直接指定flagfile文件google::SetCommandLineOption("flagfile", "conf/gflags.conf")
  7. 从命行传值和从文件传值的注意事项:
  • 在命令行中参数和值之间可不加等号,而在flagfile中一定要加。
  • 比如./myapp -param 7是ok的,但在./myapp -flagfile=./gflags.conf对应的gflags.conf中一定要写成-param=7或--param=7,否则就不正确且不会报错。
  • 在命令行中字符串可用单引号或双引号包围,而在flagfile中不能加。
  • 比如./myapp -name="tom"或./myapp -name='tom'都是ok的,但在./myapp -flagfile=./gflags.conf对应的gflags.conf中一定要写成-name=tom或--name=tom,如果写成-name="tom"的话,引号也会作为值的一部分。
  • 配置文件中的值可以有空格
  • 比如gflags.conf中写成-name=value with spaces是ok的,参数name的值就是value with spaces,而在命令行中要用引号括起来。
  • flagfile中参数可由单横线(如-foo)或双横线(如--foo)打头,但不能以三横线或更多横线打头,否则的话是无效参数且不会报错!
  • flagfile中以#开头的行被认为是注释。开头的空格和空白行都会被忽略。
  • flagfile中可以使用--flagfile包含另一个flagfile。

vim中打开多个文件

  1. vim filename1 filename2 ... or 在底行模式下输入:e file
:sp 水平切分窗口
:vsplit 垂直切分窗口
:bn 下一个文件
:bp 上一个文件
:ls 列出打开的文件,带编号
:b1~bn 切换至第n个文件

如果gdb局部变量报No symbol 'xxx'

解决办法:是因为gdb和gcc/g++版本不一致导致的,换成相同版本

中文汉字的字节长度

  1. 英文字母:

字节数 : 1;编码:GB2312
字节数 : 1;编码:GBK
字节数 : 1;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 1;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE
  1. 中文汉字:
字节数 : 2;编码:GB2312
字节数 : 2;编码:GBK
字节数 : 2;编码:GB18030
字节数 : 1;编码:ISO-8859-1
字节数 : 3;编码:UTF-8
字节数 : 4;编码:UTF-16
字节数 : 2;编码:UTF-16BE
字节数 : 2;编码:UTF-16LE

valgrind工具(检测内存泄露)

  1. 下载官网:https://www.valgrind.org/downloads/current.html
  2. 官方使用教程:https://www.valgrind.org/docs/manual/manual.html
  3. 安装教程:
  • tar jxvf valgrind-3.14.0.tar.bz2
  • cd valgrind-3.14.0/
  • ./autogen.sh
  • ./configure --prefix=/home/renz/rz/opt/valgrind//安装路径
  • make && make install
  1. 常用命令:
valgrind --tool=memcheck --leak-check=full --show-reachable=yes --trace-children=yes ./test
valgrind
--tool=memcheck:valgrind不止检测内存泄露,指定功能
--leak-check=full:检测内存泄露的方式(完全检查内存泄漏)
--show-reachable=yes:显示内存泄漏的地点
--trace-children=yes:是跟入子进程
./test:待检查的程序

静态库和动态库

  1. 静态库生成:
g++ -c test.cpp         //生成test.o问价
ar cr libtest.a test.o //根据test.o文件生成libtest.a静态库
  1. 静态库使用:
g++ main.cpp -o main -L. -ltest//-L.代表静态库的路径,-ltest代表静态库的名称
  1. 动态库的生成:
gcc test.cpp -fPIC -c -o test.o //生成test.o
gcc test.o -shared -o libtest.so//生成libtest.so
  1. 动态库的使用:
g++ main.cpp -o main -L. -ltest

CSDN博客数据导出

  1. 登录web版CSDN
  2. 进入https://blog-console-api.csdn.net/ (显示404没关系)
  3. 在控制台输入下面命令即可立即下载
var s=document.createElement('script');s.type='text/javascript';document.body.appendChild(s);s.src='//cdn.jsdelivr.net/gh/ame-yu/csdn-move@latest/dist/index.js';

image.png

Git操作

  1. git add
  2. git commit --amend 追加提交,追加注释
  3. git pull --rebase
  4. git push origin HEAD:refs/for/
  5. git cherry-pick [commitid] 将其他分支上的提交拉到本分支
  6. git reset HEAD^ 回退到上一版本
  7. git reset --soft HEAD^ 不删除本地代码撤回提交,回退到上一版本
  • 配置git:
git config --global user.email 用户名@baidu.com    # 百度邮箱 
git config --global user.name 用户名 
#1)生成密钥,一路回车、用默认选项 
ssh-keygen -t rsa               
  
#2)复制到粘贴板 
cat ~/.ssh/id_rsa.pub | clip    # Windows 
cat ~/.ssh/id_rsa.pub | pbcopy  # MacOS 
  
#3)粘贴到iCode,在iCode右上角>个人设置>添加SSH Keys[注意:一定要把不可见的换行符去掉](入口链接:http://icode.baidu.com/account/profile) 

免密sudo:

vim /etc/sudoers 
fangyuntao ALL=(ALL) NOPASSWD:ALL 
%sudo   ALL=(ALL) NOPASSWD:ALL 

解决SSH Connect error问题:

  • yum update -y nss curl libcurl

gdb 调试问题:

  • set sysroot /absolute/path/to/copy/of/target/root/filesystem

本地和开发机互传文件:

  • 服务器安装jumbo:
    bash -c "$( curl http://jumbo.baidu.com/install_jumbo.sh )"; source ~/.bashrc

安装httpfileserver:

  • jumbo install python-httpfileserver

在任意开发机上、你想上传、下载的目录里,执行命令httpfileserver + port
浏览器输入(域名:端口号),上传下载要传输的文件

开发机和开发机之间互传文件:

  • 方案一:scp
  • 方案二:服务端在指定文件目录下运行httpfileserver命令,然后开发机wget即可

将程序在前后台之间切换

  • 方法:nohup command>myoutfile.log 2>&1 &
  • nohup表示用户退出时,这个命令也不停止(可选)
  • command>myoutfile.log是将command的输出重定向到myoutfile.log文件
  • 2>&1 是将标准出错重定向到标准输出,这里的标准输出已经重定向到了 myoutfile.log文件,所以标准出错也输出到myoutfile.log文件中
  • 最后一个&, 是让该命令在后台执行
  • 查看后台任务列表:jobs -l
  • 将编号为n的任务转为后台运行:bg %n
  • 将编号为n的任务转到前台运行:fg %n
  • 挂起当前任务:ctrl + z

”.xz”文件的压缩和解压缩

  • 压缩:xz -z filename
  • 解压缩:xz -d filename.xz

Xz命令默认不能对目录进行操作,同时默认会删除源文件,通过-k选项可以保存源文件

tar命令详解

  • 压缩
  • tar -cvf jpg.tar *.jpg //将目录里所有jpg文件打包成tar.jpg 
  • tar -czf jpg.tar.gz *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用gzip压缩,生成一个gzip压缩过的包,命名为jpg.tar.gz
  • tar -cjf jpg.tar.bz2 *.jpg //将目录里所有jpg文件打包成jpg.tar后,并且将其用bzip2压缩,生成一个bzip2压缩过的包,命名为jpg.tar.bz2
  • tar -cZf jpg.tar.Z *.jpg   //将目录里所有jpg文件打包成jpg.tar后,并且将其用compress压缩,生成一个umcompress压缩过的包,命名为jpg.tar.Z
  • rar a jpg.rar *.jpg //rar格式的压缩,需要先下载rar for linux
  • zip jpg.zip *.jpg//zip格式的压缩,需要先下载zip for linux
  • 解压
  • tar -xvf file.tar //解压 tar包
  • tar -xzvf file.tar.gz //解压tar.gz
  • tar -xjvf file.tar.bz2   //解压 tar.bz2
  • tar -xZvf file.tar.Z   //解压tar.Z
  • unrar e file.rar //解压rar
  • unzip file.zip//解压zip
  • 总结
  • 1、*.tar 用 tar -xvf解压
  • 2、*.gz 用 gzip -d或者gunzip 解压
  • 3、.tar.gz和.tgz 用tar -xzf 解压
  • 4、*.bz2 用 bzip2 -d或者用bunzip2 解压
  • 5、*.tar.bz2用tar -xjf解压
  • 6、*.Z 用 uncompress解压
  • 7、*.tar.Z 用tar -xZf 解压
  • 8、*.rar 用 unrar e解压
  • 9、*.zip 用 unzip解压

更换pip源

  • mkdir ~/.pip && cd ~/.pip && touch pip.conf
  • 在文件在添加:
[global] 
timeout = 6000 
index-url = https://pypi.tuna.tsinghua.edu.cn/simple 
trusted-host = pypi.tuna.tsinghua.edu.cn 

pip命令

  • pip --default-timeout=1000000 install -i https://pypi.tuna.tsinghua.edu.cn/simple

登录跳板机:

  • ssh fangyuntao@relay.baidu-int.com

查找文件命令

  • locate
  • find
  • whereis
  • which

wc命令

  • ll file | grep “.txt” | wc -l统计”.txt”的行数

crontab命令

  • https://www.runoob.com/linux/linux-comm-crontab.html
crontab -r:删除目前的时程表 
crontab -l:列出目前的时程表 
crontab file.sh:执行crontab脚本 
# 时间格式: 
f1 f2 f3 f4 f5 program 
- 其中 f1 是表示分钟,f2 表示小时,f3 表示一个月份中的第几日,f4 表示月份,f5 表示一个星期中的第几天。program 表示要执行的程序。 
- 当 f1 为 * 时表示每分钟都要执行 program,f2 为 * 时表示每小时都要执行程序,其馀类推 
- 当 f1 为 a-b 时表示从第 a 分钟到第 b 分钟这段时间内要执行,f2 为 a-b 时表示从第 a 到第 b 小时都要执行,其馀类推 
- 当 f1 为 */n 时表示每 n 分钟个时间间隔执行一次,f2 为 */n 表示每 n 小时个时间间隔执行一次,其馀类推 
- 当 f1 为 a, b, c,... 时表示第 a, b, c,... 分钟要执行,f2 为 a, b, c,... 时表示第 a, b, c...个小时要执行,其馀类推 
* * * * * 
- - - - - 
| | | | | 
| | | | +----- 星期中星期几 (0 - 7) (星期天 为0) 
| | | +---------- 月份 (1 - 12) 
| | +--------------- 一个月中的第几天 (1 - 31) 
| +-------------------- 小时 (0 - 23) 
+------------------------- 分钟 (0 - 59) 
eg: 
#!/bin/bash 
* * * * * /bin/bash /home/fangyuntao/baidu/personal-code/start/src/sh/sendmail.sh > crontab.log 

SpaceVim

  • curl -sLf https://spacevim.org/install.sh | bash
  • mkdir .SpaceVim.d && cd .SpaceVim.d && touch init.toml
  • 写入:
[options] 
relativenumber = false 
default_indent=4 
expand_tab = false 

鉴权登陆方式

  • 如果报错:Baas auth failed! Please check your username and group name in queryengine-site.xml
  • 解决办法:
baas login --baas_group=g_speech --baas_user=fangyuntao --enable_hi_beep 

代理

勾选自动发现代理和自动代理配置,填入:http://pac.internal.baidu.com/bdnew.pac

解决git速度慢的问题

# export http_proxy=http://agent.baidu.com:8118
# export https_proxy=https://agent.baidu.com:8118
- git config --global http.proxy http://agent.baidu.com:8118
- git config --global https.proxy https://agent.baidu.com:8118

Mac安装Homebrew的正确姿势

  1. 方法一:brew官网的安装脚本
  • 执行命令:
/bin/bash -c "$(curl -fsSL https://raw.githubusercontent.com/Homebrew/install/master/install.sh)"
  • 这时很可能会出现一个问题: 要么下载极其龟速,要么直接出现如下提示

  • curl: (7) Failed to connect to raw.githubusercontent.com port 443: Connection refused

  • 原因:这是 http://raw.githubusercontent.com 访问不稳定引起的。

  1. 方法二:brew 镜像安装脚本(亲测最快速最有效)
/usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"
  • 该脚本用了中科大镜像加速访问,仅修改仓库地址部分,不会产生安全隐患。 - 关于中科大所提供的 Homebrew 镜像服务https://lug.ustc.edu.cn/wiki/mirrors/help/brew.git

  • 注:注意这里的速度,几百kib/s或几m/s才是正常的。若只有几kib/s,通常为无效的安装方法,一般加载了百分之几十后就会报错。

  1. Homebrew 安装时如何避坑
  • 若出现 Error: Checksum mismatch.
  • 报错代码如下:
curl: (56) LibreSSL SSL_read: SSL_ERROR_SYSCALL, errno 54
Error: Checksum mismatch.
Expected: b065e5e3783954f3e65d8d3a6377ca51649bfcfa21b356b0dd70490f74c6bd86
Actual: e8a348fe5d5c2b966bab84052062f0317944122dea5fdfdc84ac6d0bd513c137
Archive: /Users/joyce/Library/Caches/Homebrew/portable-ruby-2.6.3_2.yosemite.bottle.tar.gz
To retry an incomplete download, remove the file above.
Error: Failed to install Homebrew Portable Ruby (and your system version is too old)!
Failed during: /usr/local/bin/brew update --force
  • 这里是由Homebrew目录下的portable-ruby-2.6.3_2.yosemite.bottle.tar.gz文件引起的安装中断,只需要到上面对应的路径里,删掉这个文件,重新执行安装命令即可:
/usr/bin/ruby -e "$(curl -fsSL https://cdn.jsdelivr.net/gh/ineo6/homebrew-install/install)"
  • 2.若卡在了Cloning into...
    image.png

  • 由这里的龟速可断定卡住了,立马用Control + C中断脚本,然后执行以下命令:

cd "$(brew --repo)/Library/Taps/"
mkdir homebrew && cd homebrew
git clone git://mirrors.ustc.edu.cn/homebrew-core.git
git config --global --unset http.proxy 
git config --global --unset https.proxy
  1. 必备设置
  • 替换 brew.git:
git -C "$(brew --repo)" remote set-url origin https://mirrors.ustc.edu.cn/brew.git
  • 替换 homebrew-core.git:
git -C "$(brew --repo homebrew/core)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-core.git
  1. 按需设置
  • 替换 homebrew-cask.git:
git -C "$(brew --repo homebrew/cask)" remote set-url origin https://mirrors.ustc.edu.cn/homebrew-cask.git
```shell
- 替换homebrew-bottles:
- 首先要先区分你的mac用哪种终端工具,如果是 bash,则执行:
```shell
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.bash_profile
source ~/.bash_profile
  • 若是 zsh,则执行:
echo 'export HOMEBREW_BOTTLE_DOMAIN=https://mirrors.ustc.edu.cn/homebrew-bottles' >> ~/.zshrc
source ~/.zshrc
```shell
0

评论区