Merge branch 'develop'

2/27
This commit is contained in:
e0x2d 2025-02-27 22:37:35 +08:00
commit 7539960a7d
95 changed files with 744 additions and 522 deletions

View File

@ -1,14 +0,0 @@
#!/bin/bash
#
PATH=/bin:/sbin:/usr/local/bin
export PATH
read -p "Please input (in/out)" cz
if [ ${cz} == "in" ]; then
cp -v ~/.profile ~/.bashrc ~/.vimrc ./
cp -rv ~/.ssh ./
fi
if [ ${cz} == "out" ]; then
cp -iv ./.profile ./.bashrc ./.vimrc ~/
fi

View File

@ -1,39 +0,0 @@
1.配置dhcp
vim /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
#iface eth0 inet static
#address 192.168.0.108
#netmask 255.255.255.0
#gateway 192.168.0.101
#network 192.168.0.108
service network restart //cpwl
2.配置dns
vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
search localdomain
3.更新应用
apt update
apt upgrade
4.安装配置ibus
apt install ibus
apt install ibus-pinyin
ibus-setup
5.安装gcc,g++,gdb,cmake
apt update
apt install build-essential gdb
gcc --version
g++ --version
gdb --version
apt intall cmake
cmake --version
6.安装各工具
tree
dnsmap
nload

View File

@ -1,19 +0,0 @@
存放计算机类笔记的仓库
======================
## 使用说明以及环境
+ 今后我尽量改写成makedown的文本
## 项目结构
## 更新连接
## 历史版本 Histroy
## 作者列表 AUTHORS
+ ely

View File

@ -1,63 +0,0 @@
linux系统头文件
1. **`stdio.h`** - `printf``scanf``fopen``fclose`
2. **`stdlib.h`** - `malloc``free``rand``exit`
3. **`string.h`** - `strcpy``strlen``strcat`
4. **`errno.h`** -
5. **`limits.h`** -
6. **`fcntl.h`** -
7. **`sys/types.h`** - `size_t``off_t`
8. **`sys/stat.h`** -
9. **`sys/time.h`** -
10. **`sys/resource.h`** -
11. **`sys/wait.h`** -
12. **`sys/ioctl.h`** -
13. **`sys/socket.h`** -
14. **`netinet/in.h`** -
15. **`arpa/inet.h`** -
16. **`netdb.h`** -
17. **`signal.h`** -
18. **`setjmp.h`** -
19. **`time.h`** -
20. **`pthread.h`** - POSIX 线
21. **`dlfcn.h`** -
22. **`dirent.h`** -
23. **`grp.h`** -
24. **`pwd.h`** -
25. **`termios.h`** -
26. **`sys/mman.h`** -
27. **`sys/shm.h`** -
28. **`sys/ipc.h`** -
29. **`sys/msg.h`** -
30. **`sys/sem.h`** -
C

View File

@ -1,16 +0,0 @@
C++代码性能优化的方法
1. 使用const关键字
2. 避免频繁进行内存分配和释放
3. 尽量减少值传递,多用引用来传递参数
4. 局部变量VS静态变量多次调用局部更快因为局部变量可以读入寄存器静态不行
5. ++i和i++引申出的效率问题(某些情况下,使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构
6. 避免使用多重继承
7. 低级代码使用位运算替代算术运算
8. 使用编译器自带的优化选项
9. 将小粒度函数声明为内联函数inline
10. 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
11. 小函数放在同一循环内效率高大函数分开放效率更高由cpu寄存器决定
12. 尽量少使用dynamic_cast
13. 减少除法运算的使用,除数尽量使用常量,让编译器有空间优化
14. 多用直接初始化
15. 循环展开加速

View File

@ -1,52 +0,0 @@
#include<bits/stdc++.h>//万能头,包括大部分头文件。
#include <ctype.h>//字符处理
#include <cctype>
#include <cerrno>
#include <clocale>
#include <cmath>
#include <complex> //复数类
#include <cstdio>
#include <cstdlib>
#include <cstring>
#include <ctime>
#include <cwchar>
#include <errno.h>//定义错误码
#include <float.h>//浮点数处理
#include <fstream.h>//文件输入/输出
#include <fstream>
#include <iomanip.h>//参数化输入/输出
#include <iostream.h> //数据流输入/输出
#include <limits.h> //定义各种数据类型最值常量
#include <locale.h> //定义本地化函数
#include <math.h> //定义数学函数
#include <stdio.h> //定义输入/输出函数
#include <stdlib.h> //定义杂项函数及内存分配函数
#include <string.h> //字符串处理
#include <strstrea.h> //基于数组的输入/输出
#include <time.h> //定义关于时间的函数
#include <wchar.h> //宽字符处理及输入/输出
#include <wctype.h> //宽字符分类
#include <algorithm> //STL 通用算法
#include <bitset> //STL 位集容器
#include <deque> //STL 双端队列容器
#include <exception> //异常处理类
#include <functional> //STL 定义运算函数(代替运算符)
#include <limits>
#include <list> //STL 线性列表容器
#include <map> //STL 映射容器
#include <iomanip>
#include <ios> //基本输入/输出支持
#include <iosfwd> //输入/输出系统使用的前置声明
#include <iostream>
#include <istream> //基本输入流
#include <ostream> //基本输出流
#include <queue> //STL 队列容器
#include <set> //STL 集合容器
#include <sstream> //基于字符串的流
#include <stack> //STL 堆栈容器
#include <stdexcept> //标准异常类
#include <streambuf> //底层输入/输出支持
#include <string> //字符串类
#include <utility> //STL 通用模板类
#include <vector> //STL 动态数组容器
#include <windows.h>

View File

@ -1,105 +0,0 @@
#include <iostream>
#include <fstream>
using namespace std;
void c_io(); // c IO
void stream_io(); // c++ 流IO
void stream_fio(); // c++ 流文件IO
int main() {
c_io();
return 0;
}
void c_io() {
int i = 14;
double d = 3.3;
char c = 'e';
const char * str = "Hello";
// scanf & printf
// in
scanf("%d %lf %c %s", &i, &d, &c, &str);
// out
printf("%d---%3d---%x---%o \n", i, i, i, i); //int型
printf("%3.3f \n", d); //double型
printf("%c \n", c); //char
printf("%s \n", str); //str
printf("%p \n", i); //地址
c = getchar(); //读入一个char, 最快
putchar();
fgets();
}
void stream_io() {
// ios::sync_with_stdio(false);cin.tie(0),cout.tie(0); 关闭缓冲加速
int i = 14;
double d = 3.3;
char c = 'e';
const char * str = "Hello";
cin.get(c); //返回一个流引用
c = cin.get(); //返回char略快
cin.get(str, 100, '\n'); //读入字符串
cin.width(10); //设置场宽
}
void stream_fio() {
//文件流的创建 打开 关闭
fstream fin;
fstream fout;
fin.open("in");
fout.open("out");
fin.close();
fout.close();
/*
open函数的原型如下
void open(char const *,int filemode,int =filebuf::openprot);
3123使
2
ios::in
ios::out
ios::ate
ios::app
ios::binary
ios::trunc
ios_base::app方式之外ios_base::app使文件当前的写指针定位于文件尾
bad() truefalse
clear()
eof() truefalse
good() truefalse
fail() good相反falsetrue
is_open() truefalse
*/
// 二进制文件读写
fin.write((char*)&data, sizeof data);
fin.read((char*)&data, sizeof data);
/*
seekg(pos,ios::);
seekg(pos);
seekp(pos,ios::);
seekp(pos);
tellg();
tellp();
ios::beg
ios::cur
ios::end
*/
}

View File

Before

Width:  |  Height:  |  Size: 405 KiB

After

Width:  |  Height:  |  Size: 405 KiB

View File

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 397 KiB

View File

Before

Width:  |  Height:  |  Size: 478 KiB

After

Width:  |  Height:  |  Size: 478 KiB

31
miscellaneous/mirrors.md Normal file
View File

@ -0,0 +1,31 @@
# 镜像合集
- [python](# pip)
- [Docker](# docker)
- [soft](# soft)
## python
以下是部分国内可用的镜像源列表,按不同类型分类整理:
### pip
| 清华大学 | https://pypi.tuna.tsinghua.edu.cn/simple/ | 更新及时,速度较快 |
| 阿里云 | https://mirrors.aliyun.com/pypi/simple/ | 企业级支持,速度极快 |
| 腾讯云 | https://mirrors.cloud.tencent.com/pypi/simple/ | 高速、可靠的云支持 |
| 中国科学技术大学 | https://pypi.mirrors.ustc.edu.cn/simple/ | 稳定高效,适合科研场景 |
| 华为云 | https://repo.huaweicloud.com/repository/pypi/simple/ | 稳定镜像,适用多种网络环境 |
### docker
| DaoCloud | https://docker.m.daocloud.io | 国内老牌服务商 |
| Docker.imgdb.de | https://docker.imgdb.de | 德国镜像站(全球化同步) |
| Docker-0.unsee.tech | https://docker-0.unsee.tech | 亚洲节点加速站 |
| Docker.hlmirror.com | https://docker.hlmirror.com | 国内高校镜像(理论场景专用) |
| Docker.1ms.run | https://docker.1ms.run | 分钟级同步镜像站 |
### soft
| 清华大学开源软件镜像站 | https://mirrors.tuna.tsinghua.edu.cn/ | 综合性开源软件镜像 |
| 阿里云开源镜像站 | https://mirrors.aliyun.com/ | 综合性开源软件镜像 |
| 腾讯云开源镜像站 | https://mirrors.cloud.tencent.com/ | 综合性开源软件镜像 |
| 南京邮电大学 | https://mirrors.njupt.edu.cn/ | 综合性开源软件镜像 |

View File

@ -1,3 +1,18 @@
# website
+ game
+ live
+ program
+ study
+ tool
## game
indienova.com # 冰与火之舞
zh.minecraft.wiki
https://slowroads.io/
https://www.geo-fs.com/
yorg.io
## live
中国裁判文书网(https://wenshu.court.gov.cn/) 中国裁判文书网(https://wenshu.court.gov.cn/)
国家企业信用信息公示系统(https://gs.gsxt.gov.cn/index.html) 国家企业信用信息公示系统(https://gs.gsxt.gov.cn/index.html)
国家社会保险服务平台(https://si.12333.gov.cn/) 国家社会保险服务平台(https://si.12333.gov.cn/)
@ -15,3 +30,24 @@
中国法律服务网(https://www.12348.gov.cn/#/homepage) 中国法律服务网(https://www.12348.gov.cn/#/homepage)
中国庭审公开网(https://tingshen.court.gov.cn/) 中国庭审公开网(https://tingshen.court.gov.cn/)
中国关键词(http://keywords.china.org.cn/index.htm) 中国关键词(http://keywords.china.org.cn/index.htm)
## program
https://linux.vbird.org/ # 鸟哥linux
https://www.52hb.com/ # 吾爱
oi-wiki.org/lang
https://zh.cppreference.com/w/
## study
国家智慧教育公共服务平台(https://gjzwfw.www.gov.cn/)
终身教育平台(https://le.ouchn.cn/home)
国家数字图书馆(https://www.nlc.cn/web/index.shtml)
国家哲学社会科学文献(https://www.ncpssd.org/)
国家高等教育智慧教育平台(https://www.chinaooc.com.cn/)
职业教育专业教学资源库(https://zyk.icve.com.cn/)
## tool
kimi.moonshot.cn # kimi
www.tbtool.cn # 图吧
https://www.intel.cn/content/www/cn/zh/ark.html # intel CPU参数查询
https://cn.aliyun.com/ # 阿里云
https://next.itellyou.cn/ # 镜像站

View File

@ -113,6 +113,38 @@
patch -p<n>-R < <file.patch> # 还原 patch -p<n>-R < <file.patch> # 还原
``` ```
> rsync
> > 文件同步工具,它通过比较源和目标文件的大小、时间戳等信息,只同步发生变化的部分,提高了效率
> > rsync [选项] 源文件/目录 目标文件/目录
+ -aarchive归档模式,用于完整同步
+ -vverbose详细模式显示同步过程中的详细信息。
+ -uupdate仅在目标文件不存在或源文件更新时才同步。
+ -zcompress在传输过程中压缩文件数据。
+ --delete删除目标目录中多余的文件使目标目录与源目录保持一致
+ -ersh指定远程连接时使用的工具如 ssh
+ --exclude指定排除的文件或目录模式。
+ --include指定包含的文件或目录模式。
+ -P --progress显示同步进度。
+ --bwlimit : 限速,用于单个大文件,避免占用过多带宽
+ --dry-run模拟同步操作不实际执行用于测试同步命令的效果。
> > example
1. 本地同步
rsync -avP /path/to/source/ /path/to/destination/
2. 从本地同步到远程
rsync -avzP /path/to/source/ user@remote_host:/path/to/destination/
3. 同步时删除多余文件
rsync -av --delete /path/to/source/ /path/to/destination/
4. 排除某些文件或目录
rsync -av --exclude 'temp/*' --exclude '*.log' /path/to/source/ /path/to/destination/
--exclude 'temp/*':排除 temp 目录下的所有文件。
--exclude '*.log':排除所有 .log 文件。
5. 包含某些文件或目录
rsync -av --include 'data/*' --exclude '*' /path/to/source/ /path/to/destination/
--include 'data/*':仅包含 data 目录下的文件。
--exclude '*':排除其他所有文件。
6. 模拟同步操作
rsync -av --dry-run /path/to/source/ /path/to/destination/
# 文件查找 # 文件查找
> find > find
@ -213,6 +245,23 @@
-a 全部参数 -a 全部参数
-H 是否正常 -H 是否正常
> parted
> > 磁盘分区管理工具
> > parted [OPTIONS] [DEVICES] [COMMAND]
+ -i 列出所有设备的分区信息
+ -s 非交互模式
> > 交互模式常用命令
+ print 显示当前设备的分区表
+ mklabel [gpt/msdos] 创建分区表
+ mkpart [part-type] [fs-type] [start] [end] 创建一个分区
`例: mkpart primary ext4 1MiB 1000MiB`
+ rm [number] 删除指定编号的分区
+ resizepart [number] [size] 重调大小
+ set [number] [mode] 设置分区标志
+ quit
> > 非交互
`sudo parted -s /dev/sdb mklabel gpt mkpart primary ext4 0% 100%`
`sudo parted -s /dev/sdb rm 2`
# 用户 # 用户
@ -271,12 +320,32 @@
> nice renice > nice renice
> > 调整谦让度 > > 调整谦让度
> bg
> > 让后台中的进程继续运行
> fg
> > 把后台进程拉回前台
> jobs
> > 列出后台进程
# 网络 # 网络
> ip > ip
> > > > 查看网络的各种信息
> > address 地址等连接信息
> > neigh arp相关
+ ip neigh [OPTIONS] [COMMAND]
+ ip neigh add [IP] lladdr [MAC] dev [eth0] 添加表项
+ ip neigh del [IP] dev [eth0] 删除表项
+ ip neigh flush all 清空
_________________________________
REACHABLE表示邻居设备可达。
STALE表示邻居设备的条目已过期但之前是可达的。
DELAY表示正在等待确认邻居设备是否可达。
PROBE表示正在积极探测邻居设备是否可达
_________________________________
> ss > ss
> > 查看端口开放情况 > > 查看端口开放情况
@ -353,14 +422,6 @@
# nohup 命令挂机(退出登陆后依然执行) # nohup 命令挂机(退出登陆后依然执行)
nohup [command] & nohup [command] &
`screen` 主要用于用户开启多个独立的会话(称为"窗口")在这些会话之间可以自由切换而不会中断已经运行的程序 `screen` 主要用于用户开启多个独立的会话(称为"窗口")在这些会话之间可以自由切换而不会中断已经运行的程序
### 主要功能:
1. **多会话管理**:可以同时运行多个独立的 shell 会话。
2. **会话分离与重连**:可以从一个会话中分离出来,稍后再重新连接到该会话。
3. **窗口分割**:在一个 screen 会话中,可以水平或垂直分割窗口,以同时查看和操作多个任务。
4. **滚动记录**:可以查看会话的滚动记录,即使之前的输出已经滚出屏幕。
5. **复制和粘贴**:在 screen 会话中,可以使用快捷键复制文本并粘贴到其他位置。
6. **会话锁定**:可以锁定当前会话,防止他人查看或操作。
7. **自动保存会话**在网络断开或其他异常情况下screen 可以自动保存当前会话状态。
### 基本使用方法: ### 基本使用方法:
1. **启动一个新的 screen 会话** 1. **启动一个新的 screen 会话**
screen screen
@ -370,16 +431,6 @@
screen -r [会话ID或名称] screen -r [会话ID或名称]
4. **分离当前会话** 4. **分离当前会话**
在 screen 会话中按 `Ctrl-a` 然后按 `d` 在 screen 会话中按 `Ctrl-a` 然后按 `d`
5. **在会话中创建新窗口**
在 screen 会话中按 `Ctrl-a` 然后按 `c`
6. **在窗口之间切换**
在 screen 会话中按 `Ctrl-a` 然后按 `n`(下一个窗口)或 `Ctrl-a` 然后按 `p`(上一个窗口)
7. **分割窗口**
- 水平分割:在 screen 会话中按 `Ctrl-a` 然后按 `"`(双引号键)。
- 垂直分割:在 screen 会话中按 `Ctrl-a` 然后按 `S`
8. **调整分割窗口的大小**
- 增加/减少水平大小:在 screen 会话中按 `Ctrl-a` 然后按方向键。
- 增加/减少垂直大小:在 screen 会话中按 `Ctrl-a` 然后按 `Shift` 加上方向键。
9. **退出 screen 会话** 9. **退出 screen 会话**
- 关闭当前窗口:在 screen 会话中按 `Ctrl-a` 然后按 `k` - 关闭当前窗口:在 screen 会话中按 `Ctrl-a` 然后按 `k`
- 退出所有窗口并结束会话:在 screen 会话中按 `Ctrl-a` 然后按 `\` - 退出所有窗口并结束会话:在 screen 会话中按 `Ctrl-a` 然后按 `\`

View File

@ -1,4 +1,5 @@
# linux键盘高级操作技巧 # linux键盘高级操作技巧
man readline
> 光标移动 > 光标移动
+ C a # 到行首 + C a # 到行首
+ C e # 到行末 + C e # 到行末
@ -7,6 +8,7 @@
+ C l # clean + C l # clean
+ A f # 下一个词 + A f # 下一个词
+ A b # 上一个词 + A b # 上一个词
___按住Ctrl的同时按方向键可以快速移动___
> 文本修改 > 文本修改
+ C t # 与上一个字符互换 + C t # 与上一个字符互换
@ -22,3 +24,4 @@
+ C n # 下一个命令 + C n # 下一个命令
+ C j # 复制 + C j # 复制
+ C o # 执行当前项,并移到下一项 + C o # 执行当前项,并移到下一项
+ C r # 搜索历史命令 Esc 选取

22
os/linux/knowledge/net.md Normal file
View File

@ -0,0 +1,22 @@
## 配置dhcp
vim /etc/network/interfaces
auto eth0
iface eth0 inet dhcp
## 手动配置
iface eth0 inet static
address 192.168.0.108
netmask 255.255.255.0
gateway 192.168.0.101
network 192.168.0.108
service network restart //cpwl
2.配置dns
vim /etc/resolv.conf
nameserver 114.114.114.114
nameserver 8.8.8.8
search localdomain

View File

@ -0,0 +1,10 @@
# 有关ioctl的使用
`#include <sys/ioctl.h>`
## 查询当前终端的长宽大小
```cpp
struct winsize w;
ioctl(STDOUT_FILENO, TIOCGWINSZ, &w);
printf("%d\n%d\n", w.ws_col, w.ws_row);
```

110
program/c_cpp/linux/net.md Normal file
View File

@ -0,0 +1,110 @@
```cpp
#include <iostream>
#include <cstring>
#include <unistd.h>
#include <netdb.h>
#include <cstdlib>
#include <sys/types.h>
#include <sys/socket.h>
#include <arpa/inet.h>
```
# tips
+ 所有网络函数失败基本是返回 -1,errno被设置
# socket
原型: int socket(int domain, int type, int protocol)
+ domain 协议族
\ PF_INET # IPv4 互联网协议族
\ PF_INET6 # IPv6 互联网协议族
\ PF_LOCAL # 本地通讯地址族
+ type 数据传输类型
\ SOCK_STREAM # 面向连接; 数据不丢失; 数据顺序不错乱; 双向通道;
\ SOCK_DGRAM # 无连接; 数据可能丢; 数据可能错乱; 效率高;
+ protocol 最终使用协议
\ IPPROTO_TCP
\ IPPROTO_UDP
\ 0 # 编译器自动识别
# 主机字节序和网络字节序
+ 大端序和小端序 (如果数据大于1B,CPU在内存中存放数据的方式)
\ 大端序 低位字节在高位,高位字节在低位
\ 小端序 低位字节在低位,高位字节在高位 (INTEL)
## 字节序不同的系统字节传输数据,可能会出现问题,所以网络字节序约定使用大端序
+ c提供了4个库用于主机字节序和网络字节序之间的转换
\ uint16_t htons(uint16_t hostshort); // 2字节的整数
\ uint32_t htonl(uint32_t hostshort); // 4字节的整数
\ uint16_t ntons(uint16_t netshort); // 2字节的整数
\ uint32_t ntonl(uint32_t netshort); // 4字节的整数
// h host主机
// to 转换
// n network网络
// s short(2byte)
// l long(4byte)
# IP地址和通讯端口
+ IPv4(4byte) 端口(2byte)
# 大小端序的处理
+ 在网络编程中数据收发有自动转换,只有sockaddr_in结构成员变量填充数据时才需要考虑字节序
# 结构体
## sockaddr
```cpp
struct sockaddr { // connect() bind() 都需要
unsigned short sa_family; // 协议族
unsigned char sa_data[14]; // 14byte的端口和地址
}
```
## sockaddr_in
```cpp
struct sockaddr { // 为了方便操作大小与sockaddr相同可以强制转换
unsigned short sin_family; // 协议族
unsigned short sin_port; // 2byte端口号
//struct in_addr sin_addr; // 4byte地址
unsigned int sin_addr; // 4byte地址
unsigned char sin_zero[8]; // 保留,长度对齐
}
```
# gethostbyname函数
+ 用 域名/主机名/字符串IP 转换成大端序
```cpp
struct hostent *gethostbyname(const char *name);
struct hostent {
char *h_name; // 主机名
char **h_aliases; // 主机所有别名的字符串数组
short h_addrtype; // 主机IP类型,IPv4或IPv6
short h_length; // 主机IP长度
char **h_addr_list; // 主机IP地址,以网络字节序存储
}
#define h_addr h_addr_list[0]
// 转换后,用 memcpy(&servaddr.sin_addr, h->h_addr, h->h_length);
```
# 字符串IP和大端序IP的转换
## atoi() 把字符串IP转换成大端序
```cpp
typedef unsigned int in_addr_t; //4byte大端序IP
// 字符串转大端序IP,转换后IP赋给sockaddr_in.in_addr.s_addr
in_addr_t inet_addr(const char *cp);
// 字符串转大端序IP,转换后IP赋给sockaddr_in.in_addr
int inet_aton(const char *cp, struct in_addr *inp);
//大转字符串,用于服务端解析IP
char *inet_ntoa(struct in_addr in);
```

View File

@ -32,6 +32,7 @@
## 查找 ## 查找
```cpp ```cpp
size_t length(); // 返回string字符串的长度
int find(const string& str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置,pos为开始查找的位置 int find(const string& str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置,pos为开始查找的位置
int find(const char* str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置 int find(const char* str, int pos = 0) const; // 查找str在当前字符串第一次出现的位置

View File

@ -23,6 +23,8 @@
memmove(buf1 + 1, buf1, 4); //移动5个字节到前一个位置 memmove(buf1 + 1, buf1, 4); //移动5个字节到前一个位置
``` ```
___注:未进行长度指定的函数有溢出风险 例如:strcpy___
## 两种转换 ## 两种转换
```cpp ```cpp
string str1; string str1;

View File

@ -51,5 +51,22 @@ demo& demo::operator = (demo&&); // 移动赋值构造函数
`egg demo1 = egg::large;` `egg demo1 = egg::large;`
并且关闭了隐式转换的特性 并且关闭了隐式转换的特性
## 友元
+ 友元函数
+ 友元类
+ 友元成员函数
将函数声明放在类体内,public private 内都无所谓
在声明前面加上friend关键字
explicit 禁止单个参数构造函数导致的自动类型转换 ## 类的自动转换和强制类型转换
当类有仅一个参数的构造函数时
遇到合适的会进行自动转换
explicit 禁止单个参数构造函数导致的隐式自动类型转换
仍然可以使用显式强制转换(当不存在二义性时)
### 转换函数
`int aaa = int(demo);`
operator typeName();
+ 必须是类成员
+ 不能有参数
+ 不能指定返回类型

View File

@ -0,0 +1,16 @@
# C++代码性能优化的方法
+ 使用const关键字
+ 避免频繁进行内存分配和释放
+ 尽量减少值传递,多用引用来传递参数
+ 局部变量VS静态变量多次调用局部更快因为局部变量可以读入寄存器静态不行
+ ++i和i++的效率问题(使用迭代器可能比使用指针更优:迭代器++i可以减少一次构造和析构
+ 避免使用多重继承
+ 低级代码使用位运算替代算术运算
+ 使用编译器自带的优化选项
+ 将小粒度函数声明为内联函数inline
+ 循环内定义,还是循环外定义对象:由构造函数和复制操作的效率比较决定
+ 小函数放在同一循环内效率高大函数分开放效率更高由cpu寄存器决定
+ 尽量少使用`dynamic_cast`
+ 减少除法运算的使用,除数尽量使用常量,让编译器优化
+ 多用直接初始化
+ 循环展开加速

View File

@ -0,0 +1,164 @@
# c with cpp io
# 目录
- [c stdio](# c stdio)
- [c fio](# c fio)
- [cpp stdio](# cpp stdio)
- [cpp fio](# cpp fio)
## c stdio
> 头文件
`#include <stdio.h>`
> scanf 格式化输入函数
printf 格式化输出函数
__控制符__
+ %d %nd %ld %x %o 整数
+ %f %n.mf %lf 浮点数
+ %c
+ %s
+ %p ptr
> 文件流
+ stdin
+ stdout
+ stderr
`int getchar(void);`
`int putchar(int c);`
`int getc(FILE *stream);` getchar() 文件版
`int putc(int c, FILE *stream);`
`char *fgets(char *s, int size, FILE *stream);`
+ 换行符后(包含换行符)
+ 文件尾
+ size-1
`fputs(const char *s, FILE *stream);` **不添加换行符**
`size_t fread(void *ptr, size_t size, size_t nmemb, FILE *stream);`
+ size 读写的块大小
+ nmemb 读写的块数量
`size_t fwrite(const void *ptr, size_t size, size_t nmemb, FILE *stream);`
## c fio
`FILE *fp` 文件指针
`FILE *fopen(const char *pathname, const char *mode);` 错误返回NULL
`int fclose(FILE *stream);` 关闭文件 返回0为正常关闭
**mode**
+ "r" 读
+ "w" 写截0新建
+ "a" 写,尾+,新建
+ "r+" 读写
+ "w+" 读写截0新建
+ "a+" 读写,仅尾+,新建
+ "b" 搭配表二进制仅win
`long ftell(FILE *stream);` 获取当前文件指针位置
`int fseek(FILE *stream, long offset, int whence);` 移动文件指针
+ offset 移动字节数
+ whence 参考位置
+ `SEEK_SET` 文件头
+ `SEEK_CUR` 当前位置
+ `SEEK_END` 文件尾
`int fflush(FILE *stream);` 刷新缓冲区
`int setvbuf(FILE *stream, char *buf, int mode, size_t size);` 设置缓冲区,return 0
+ buf 设置的缓冲区
+ mode
- `_IOFBF` 完全缓冲
- `_IOLBF` 行缓冲
- `_IONBF` 无缓冲
+ size 指定缓冲区的大小,无缓冲时无效
`int ferror(FILE *stream);` 流异常时return非0
## cpp stdio
> 头文件
#include <iostream>
`ios::sync_with_stdio(false);cin.tie(0),cout.tie(0);` 关闭缓冲加速
>
```cpp
cin.get(c); //返回一个流引用
c = cin.get(); //返回char略快
cin.get(str, 100, '\n'); //读入字符串
cin.width(10); //设置场宽
```
>
```cpp
std::flush // 立即刷新缓冲区
std::endl // 换行加刷新
```
________________________________________________
## file IO
> 头文件
#include <fstream>
```cpp
//文件流的创建 打开 关闭
fstream fin;
fstream fout;
fin.open("in");
fout.open("out");
fin.close();
fout.close();
/*
open函数的原型如下
void open(char const *,int filemode,int =filebuf::openprot);
它有3个参数第1个是要打开的文件名第2个是文件的打开方式第3个是文件的保护方式一般都使用默认值。
第2个参数可以取如下所示的值
打开方式 解释
ios::in 打开文件进行读操作,这种方式可避免删除现存文件的内容
ios::out 打开文件进行写操作,这是默认模式
ios::ate 打开一个已有的输入或输出文件并查找到文件尾开始
ios::app 在文件尾追加方式写文件
ios::binary 指定文件以二进制方式打开,默认为文本方式
ios::trunc 如文件存在,将其长度截断为零并清除原有内容,如果文件存在先删除,再创建
除ios_base::app方式之外文件刚刚打开时当前读写位置的文件指针都定位于文件的开始位置而ios_base::app使文件当前的写指针定位于文件尾
函数 功能
bad() 如果进行非法操作返回true否则返回false
clear() 设置内部错误状态,如果用缺省参量调用则清除所有错误位
eof() 如果提取操作已经到达文件尾则返回true否则返回false
good() 如果没有错误条件和没有设置文件结束标志返回true否则返回false
fail() 与good相反操作失败返回false否则返回true
is_open() 判定流对象是否成功地与文件关联若是返回true否则返回false
*/
// 二进制文件读写
fin.write((char*)&data, sizeof data);
fin.read((char*)&data, sizeof data);
/*
随机存取
seekg(pos,ios::);
seekg(pos);
seekp(pos,ios::);
seekp(pos);
tellg();
tellp();
文件位置
ios::beg
ios::cur
ios::end
*/
```

View File

@ -0,0 +1,55 @@
a1 = int(input("input:")) # input
print('%8d'%a1, '\n') # print
# print(objects, sep=' ', wnd='\n')
# 数据类型
x1 = 123
x2 = 123.123
x3 = True
x4 = "True"
print(x1, " ", type(x1))
print(x2, " ", type(x2))
print(x3, " ", type(x3))
print(x4, " ", type(x4))
print()
# 运算符
"""
1. **
2. * / % //
3. + -
4. <= < > >=
5. <> == !=
6. = %= /= //= -= += *= **=
7. not or and
"""
# 条件判断
if (x1==a1) and (x3==True):
print("OK!!!")
elif x3==False:
print("x3==False")
else:
print("x1:", x1)
print("a1:", a1)
print()
# 循环控制
for i in range(10): # 逐一访问序列中的元素
while i>=9 and i<13: # 通过条件控制
print(i)
i+=1
continue
break
# range() 函数 创建一个整数列表
"""
# 基本格式
range(start, stop,[step])
# 开始 结束 步长
range(5, 1, -1) # 可做到倒序输出
"""

View File

@ -0,0 +1,15 @@
# 字典 dict
dict1 = {'你好':'Hello'}
dict2 = zip(li1,li2) # 通过两个列表创建字典
del dict1['你好'] # 删除元素
dict1['再见'] = 'bey' # 存在更新,不存在添加
dict1.setdefault('','OK') # 存在不修改,不存在添加
s = dict1.get('','NO') # 不存在追加,存在返回原值不修改
for i,t in dict1.items(): # 遍历所有键值对
print(i,t)
for i in dict1.keys(): # 遍历所有键
print(i)
for i in dict1.values(): # 遍历所有值
print(i)

View File

@ -0,0 +1,7 @@
# 函数
def jc(n):
ans = 1;
for i in range(n):
ans *= i
return ans

View File

@ -0,0 +1,22 @@
# 列表
li1 = [] # 创建空列表
li2 = list()
li3 = list(s) # 转换字符串成列表
li3.index('H') # 返回对应值的下标 反查
li4 = s.split(' ') # 通过空格分割字符串成列表
# li1[start:end:step]
for i,t in enumerate(li3): # 同时输出索引和值(列表本身也可以直接作为循环的序列)
print(i,t)
# 列表的更新与排序
li1.append([26,71]) # [26,71]作为一个元素追加到末尾
li1.extend([26,71]) # 将[26,71]每一项合并到末尾
li1.insert(1,520) # 将520插入位置1
li1[0] = 1314 # so easy
li1.remove(3) # 删除指定位置元素
li1.pop() # 默认删除-1位置的元素
li1.sort() # 对列表本身排序
li1.sort(reverse=True) # 对列表本身排序(倒序)
li2 = sorted.(li1) # 返回一个排序完的列表

View File

@ -0,0 +1,10 @@
# 集合 set
set1 = {4,3,2,1}
set2 = set(li1)
set3 = set1 & set2 # 交集
set3 = set1 | set2 # 并集
set3 = set1 - set2 # 差集
set3.add(123) # 添加
set3.remove(123) # 删除
sum(set3) # 求总个数

View File

@ -0,0 +1,23 @@
# 字符串
s = str("Hello world")
print(s[3])
print(s[-3])
print(s[0:3]) # 字符串切片
print(s[3:])
print(s[:5])
print(s[:-5])
print(s[::-1]) # 倒序
len(s) # 计算长度
# 字符串查询
s.find('w')
s.count('l')
s.replace('H','h') # H变成h
s.casefold() # 大写转小写
s.upper() # 小写转大写
s.swapcase() # 转换大小写
eval('12+3') # 计算值 返回15

View File

@ -0,0 +1,3 @@
# 元组tuple 元素不可修改的列表
t1 = ()
t1 = tuple(li1)

35
program/tool/gdb.txt Normal file
View File

@ -0,0 +1,35 @@
gdb c/c++ 代码调试工具
使用 g++ -g 生成调试文件,不可以加 -O 选项
set [argc] # 传入参数
l n # 列出源码
r # 开始运行到第一个断点
b n # 在第n行打断点
break main if var_name > 10 # 满足条件时打断点
d n # 删除断点
c # 继续运行到下一个断点
s # 单步执行
si # 单步汇编
n # 单步执行,不进入函数
q # 退出
set var [] # 修改变量的值
set $rsp = 0x7ccccccc # 修改寄存器的值
p # 查看特定变量或表达式的值
bt # 查看函数调用栈
bt full # 详细信息
disassemble # 查看当前函数的汇编,可在后面加函数名看指定汇编
x/10gx $rsp # 查看内存中由$rsp开始的10个八字节数据 g:八字节 x:16进制
info locals # 查看局部变量
info registers # 查看寄存器状态
info program # 查看程序运行信息
info break # 查看断点信息
info threads # 查看所有线程
使用gdb调试core文件
使用ulimit -c unlimited 使挂掉的程序产生core文件
gdb ./a.out core
gdb demo -p [pid] # 调试运行中的程序

39
program/tool/perf.md Normal file
View File

@ -0,0 +1,39 @@
# perf 功能强大的linux性能分析工具
`perf [command] [options] [arguments]`
子命令 额外选项 要分析的程序或命令
## 性能概览
`perf stat <command>`
> 性能计数器
```
0.60 msec task-clock # 0.589 CPUs utilized cpu利用率
0 context-switches # 0.000 /sec 上下文切换次数
0 cpu-migrations # 0.000 /sec cpu切换
68 page-faults # 113.661 K/sec 页错误次数
1,772,372 cycles # 2.963 GHz 时钟周期
1,247,336 instructions # 0.70 insn per cycle 指令数量
229,972 branches # 384.396 M/sec 分支数量
8,262 branch-misses # 3.59% of all branches 未命中分支
0.001016124 seconds time elapsed 总用时
0.000000000 seconds user
0.001106000 seconds sys
```
## 记录性能数据
`perf record -g -o output.data <command>`
+ -o 指定输出文件
+ -g 启用调用图
`sudo perf record -a -g -o system.data`
+ -a 采集系统级数据
## 分析性能数据
`perf report -i output.data`
+ -i 指定输入文件
## 实时性能监控
`sudo perf top`

View File

@ -1,143 +0,0 @@
a1 = int(input("input:")) # input
print('%8d'%a1, '\n') # print
# print(objects, sep=' ', wnd='\n')
# 数据类型
x1 = 123
x2 = 123.123
x3 = True
x4 = "True"
print(x1, " ", type(x1))
print(x2, " ", type(x2))
print(x3, " ", type(x3))
print(x4, " ", type(x4))
print()
# 运算符
"""
1. **
2. * / % //
3. + -
4. <= < > >=
5. <> == !=
6. = %= /= //= -= += *= **=
7. not or and
"""
# 条件判断
if (x1==a1) and (x3==True):
print("OK!!!")
elif x3==False:
print("x3==False")
else:
print("x1:", x1)
print("a1:", a1)
print()
# 循环控制
for i in range(10): # 逐一访问序列中的元素
while i>=9 and i<13: # 通过条件控制
print(i)
i+=1
continue
break
# range() 函数 创建一个整数列表
"""
# 基本格式
range(start, stop,[step])
# 开始 结束 步长
range(5, 1, -1) # 可做到倒序输出
"""
# 字符串
s = str("Hello world")
print(s[3])
print(s[-3])
print(s[0:3]) # 字符串切片
print(s[3:])
print(s[:5])
print(s[:-5])
print(s[::-1]) # 倒序
len(s) # 计算长度
# 字符串查询
s.find('w')
s.count('l')
s.replace('H','h') # H变成h
s.casefold() # 大写转小写
s.upper() # 小写转大写
s.swapcase() # 转换大小写
eval('12+3') # 计算值 返回15
# 列表
li1 = [] # 创建空列表
li2 = list()
li3 = list(s) # 转换字符串成列表
li3.index('H') # 返回对应值的下标 反查
li4 = s.split(' ') # 通过空格分割字符串成列表
# li1[start:end:step]
for i,t in enumerate(li3): # 同时输出索引和值(列表本身也可以直接作为循环的序列)
print(i,t)
# 列表的更新与排序
li1.append([26,71]) # [26,71]作为一个元素追加到末尾
li1.extend([26,71]) # 将[26,71]每一项合并到末尾
li1.insert(1,520) # 将520插入位置1
li1[0] = 1314 # so easy
li1.remove(3) # 删除指定位置元素
li1.pop() # 默认删除-1位置的元素
li1.sort() # 对列表本身排序
li1.sort(reverse=True) # 对列表本身排序(倒序)
li2 = sorted.(li1) # 返回一个排序完的列表
# 元组tuple 元素不可修改的列表
t1 = ()
t1 = tuple(li1)
# 集合 set
set1 = {4,3,2,1}
set2 = set(li1)
set3 = set1 & set2 # 交集
set3 = set1 | set2 # 并集
set3 = set1 - set2 # 差集
set3.add(123) # 添加
set3.remove(123) # 删除
sum(set3) # 求总个数
# 字典 dict
dict1 = {'你好':'Hello'}
dict2 = zip(li1,li2) # 通过两个列表创建字典
del dict1['你好'] # 删除元素
dict1['再见'] = 'bey' # 存在更新,不存在添加
dict1.setdefault('','OK') # 存在不修改,不存在添加
s = dict1.get('','NO') # 不存在追加,存在返回原值不修改
for i,t in dict1.items(): # 遍历所有键值对
print(i,t)
for i in dict1.keys(): # 遍历所有键
print(i)
for i in dict1.values(): # 遍历所有值
print(i)
# 函数
def jc(n):
ans = 1;
for i in range(n):
ans *= i
return ans

View File

@ -1,3 +1,4 @@
# git
git config --global credential.helper store git config --global credential.helper store
/\ /\ user.name " " /\ /\ user.name " "
|| || user.email " " || || user.email " "
@ -50,7 +51,7 @@ git branch #显示本地分支
-d/D #删除分支 大写强制 -d/D #删除分支 大写强制
-m/M #修改主分支 大写强制 -m/M #修改主分支 大写强制
-u <remote>/<branch> #设置追踪关系 -u <remote>/<branch> #设置追踪关系
-vv #查看每个分支的最后提交信息和跟踪关系 -vv #查看每个分支的最后提交信息和跟踪关系,常用于检查是否全部分支已同步
--merged #列出所有已合并到当前分支的分支 --merged #列出所有已合并到当前分支的分支
--no-merged #未合并 --no-merged #未合并

View File

@ -1,20 +0,0 @@
gdb c/c++ 代码调试工具
使用 g++ -g 生成调试文件,不可以加 -O 选项
set [argc] # 传入参数
l n # 列出源码
r # 开始运行到第一个断点
b n # 在第n行打断点
info break # 查看断点
c # 继续运行到下一个断点
s # 单步执行
n # 单步执行,不进入函数
p # 输出变量或表达式的值
set var [] # 修改变量的值
q # 退出
bt # 查看函数调用栈
使用gdb调试core文件
使用ulimit -c unlimited 使挂掉的程序产生core文件
gdb demo -p [pid] # 调试运行中的程序

View File

@ -1,5 +0,0 @@
#4 perf
性能剖析工具
可分析程序运行期间发生的系统硬件事件
sudo perf record ./a.out
sudo perf report -i perf.data

View File

@ -24,15 +24,17 @@ nnoremap <space>v :vsp<space>
nnoremap <space>d <c-w>w nnoremap <space>d <c-w>w
nnoremap <space>w :w<cr> nnoremap <space>w :w<cr>
nnoremap <space>q :q<cr> nnoremap <space>q :q<cr>
nnoremap <space>fq :q!<cr>
nnoremap <space>tt :tabedit<space> nnoremap <space>tt :tabedit<space>
nnoremap <space>to :tabonly<cr> nnoremap <space>tm :vert term<cr>
inoremap jf <esc> inoremap jf <esc>
inoremap jq <esc>:wq<cr>
inoremap jw <c-x><c-n>
inoremap jl <c-x><c-l> inoremap jl <c-x><c-l>
cnoremap jf <c-c> cnoremap jf <c-c>
"inoremap jq <esc>:wq<cr>
"inoremap jw <c-x><c-n>
"nnoremap <space>to :tabonly<cr>
augroup numbertoggle 智能切换绝对行号和相对行号 augroup numbertoggle "智能切换绝对行号和相对行号
autocmd! autocmd!
autocmd BufEnter,FocusGained,InsertLeave,WinEnter * if &nu && mode() != "i" | set rnu | endif autocmd BufEnter,FocusGained,InsertLeave,WinEnter * if &nu && mode() != "i" | set rnu | endif
autocmd BufLeave,FocusLost,InsertEnter,WinLeave * if &nu | set nornu | endif autocmd BufLeave,FocusLost,InsertEnter,WinLeave * if &nu | set nornu | endif

View File

@ -1,9 +1,52 @@
# 小技巧 # 小技巧
使用 q[Key] 开始录制宏,再次点击q结束录制 使用 q[Key] 开始录制宏,再次点击q结束录制
@[Key] 调用宏 @[Key] 调用宏
@@ 重复调用
# vim中打开终端
`:term``:vert term`
从终端转到普通模式:`<c-\>+<c-n>`
# 快捷键 # 快捷键
## ]f > 移动
## 0 gm
行首行尾移动
## ngg
移动到第n行
## fc tc
搜索字符 ; , 可重复
> 插入
## r R
替换光标下的字符
## n<< n>>
多行左右移动
> 删除
## x
删除光标下字符
## J
与下一行合并
> 复制
## "x
使用寄存器x进行下一次复制 粘贴 删除
:reg 显示所有寄存器
> 可视模式
## o
交换选择区域另一端和光标的位置
## aw as ap ab aB
选择一个单词 句子 段落 () {}
## vi{
选中一整个大括号内
## va{
选中一整个大括号全部
## ]f
在文件中若出现文件名,指针放在上面使用这个快捷键可直接打开 在文件中若出现文件名,指针放在上面使用这个快捷键可直接打开

View File

@ -1,5 +0,0 @@
indienova.com # 冰与火之舞
zh.minecraft.wiki
https://slowroads.io/
https://www.geo-fs.com/
yorg.io

View File

@ -1,4 +0,0 @@
https://mirrors.tuna.tsinghua.edu.cn/ # 清华开源站
https://linux.vbird.org/ # 鸟哥linux
https://www.52hb.com/ # 吾爱

View File

@ -1,6 +0,0 @@
国家智慧教育公共服务平台(https://gjzwfw.www.gov.cn/)
终身教育平台(https://le.ouchn.cn/home)
国家数字图书馆(https://www.nlc.cn/web/index.shtml)
国家哲学社会科学文献(https://www.ncpssd.org/)
国家高等教育智慧教育平台(https://www.chinaooc.com.cn/)
职业教育专业教学资源库(https://zyk.icve.com.cn/)

View File

@ -1,5 +0,0 @@
kimi.moonshot.cn # kimi
www.tbtool.cn # 图吧
https://www.intel.cn/content/www/cn/zh/ark.html # intel CPU参数查询
https://cn.aliyun.com/ # 阿里云
https://next.itellyou.cn/ # 镜像站