├── .gitignore ├── C++ ├── C++ OOP │ ├── C++ OOP基础.md │ ├── C++ 动态内存.md │ ├── C++ 友元.md │ ├── C++ 多态.md │ ├── C++ 类成员变量.md │ ├── C++ 类的封装.md │ ├── C++ 继承.md │ ├── C++ 虚函数.md │ └── img │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 14.png │ │ ├── 15.png │ │ ├── 16.png │ │ ├── 17.png │ │ ├── 18.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png ├── C++ 数据结构 │ ├── C++ List.md │ ├── C++ Map.md │ ├── C++ String.md │ ├── C++ Union.md │ ├── C++ Vector.md │ ├── C++ stack.md │ ├── C++ 数组.md │ └── C++ 结构体.md ├── C++ 结构化编程 │ ├── C++ 11.md │ ├── C++ Cpp.md │ ├── C++ exam.md │ ├── C++ 函数.md │ ├── C++ 命名空间.md │ ├── C++ 头文件.md │ ├── C++ 异常处理.md │ ├── C++ 指针与引用.md │ ├── C++ 数据.md │ ├── C++ 核心关键字.md │ ├── C++ 环境问题.md │ ├── C++ 表达式.md │ ├── C++ 输入输出.md │ ├── C++ 输入重定向到文件.md │ ├── C++ 部分内置函数.md │ ├── C++ 部分特殊符号.md │ ├── C++混合编译.md │ └── img │ │ ├── IO │ │ ├── 1.png │ │ └── 2.png │ │ ├── cpp │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ │ ├── exam │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ └── 8.png │ │ ├── exception │ │ └── 2.png │ │ ├── function │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ └── 7.png │ │ ├── pointer │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png │ │ └── union │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png ├── C++ 高级程序设计.md ├── C++.md └── img │ ├── introduce │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ └── 7.png │ └── switch │ ├── 1.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── Git ├── Git Fork.md ├── Git 操作学习笔记.md ├── Git 本地计算机实验.md ├── Git 远程分支操作.md ├── Git 部分报错的解决办法.md └── img │ ├── 1.png │ ├── 2.png │ ├── 3.png │ └── 4.png ├── Java基础 ├── IDEA 使用经验.md ├── java BigDecimal.md ├── java GUI.md ├── java java编码规范.md ├── java 加密.md ├── java 变量.md ├── java 实体类.md ├── java 序列化.md ├── java 异常.md ├── java 总记.md ├── java 接口.md ├── java 数据结构.md ├── java 文件与流.md ├── java 方法.md ├── java 时间.md ├── java 标签.md ├── java 正则表达式.md ├── java 特殊关键字.md ├── java 类.md ├── java 继承和多态.md ├── java 网络.md ├── java 脚本调用.md ├── java 虚拟机和字节码.md ├── java 访问控制.md ├── java 语法糖.md ├── java 集合.md └── java 面向对象编程.md ├── Java进阶 ├── img │ └── volatile │ │ ├── 1.png │ │ └── 2.png ├── java Predicate&Stream.md ├── java Session.md ├── java TimeUnit.md ├── java cv.md ├── java stl.md ├── java 代理.md ├── java 反射.md ├── java 外部扩展库.md ├── java 泛型.md ├── java 流.md ├── java 线程.md └── java 锁.md ├── Jenkins ├── Docker 安装 Jenkins.md └── img │ └── install │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png ├── LICENSE ├── Maven └── 管理配置依赖.md ├── MySQL ├── MySQL 事务.md ├── MySQL 存储过程.md ├── MySQL 学习笔记.md ├── MySQL 懒加载.md ├── MySQL 数据备份.md ├── MySQL 数据库规范.md ├── MySQL 时间.md ├── MySQL 正则表达式.md ├── MySQL 用户管理.md ├── MySQL 索引.md ├── MySQL 表.md ├── MySQL 语句.md ├── MySQL 部分简介.md ├── MySQL 部分错误.md ├── img │ └── procedure │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png ├── 服务器端的数据库操作.md └── 高性能 MySQL │ ├── Charpter1 MySQL 架构与历史.md │ └── img │ └── charpter1 │ ├── 1.png │ └── 2.png ├── Neo4j ├── Neo4j Cypher.md ├── Neo4j Python操作.md └── Neo4j 高级.md ├── Python ├── Python Flask │ ├── Flask HTTP.md │ ├── Flask 响应.md │ ├── Flask 基础.md │ ├── Flask 状态.md │ ├── Flask 路由.md │ ├── Flask 部署.md │ └── Flask 配置.md ├── Python GUI.md ├── Python IO.md ├── Python __name__.md ├── Python excel处理.md ├── Python mysql连接.md ├── Python 入门及介绍.md ├── Python 图片处理.md ├── Python 快捷键.md ├── Python 扩展库 │ ├── Scipy.md │ ├── argparse.md │ ├── baidu-aip.md │ ├── bisect.md │ ├── collections.md │ ├── csv.md │ ├── delorean.md │ ├── docx-mailmerge.md │ ├── docx.md │ ├── genism.md │ ├── img │ │ ├── docx-1.png │ │ ├── jieba-1.png │ │ └── time │ │ │ └── 1.png │ ├── jieba.md │ ├── json.md │ ├── keras.md │ ├── math.md │ ├── matplotlib.md │ ├── nltk.md │ ├── numpy.md │ ├── os.md │ ├── pandas-profiling.md │ ├── pandas.md │ ├── pytesseract.md │ ├── python-docx.md │ ├── random.md │ ├── re.md │ ├── sh.md │ ├── sklearn.md │ ├── ssl.md │ ├── statistics.md │ ├── subprocess.md │ ├── surprise.md │ ├── sys.md │ ├── time.md │ ├── tqdm.md │ ├── wget.md │ ├── wordcloud.md │ ├── zipfile.md │ └── 图像处理.md ├── Python 排序.md ├── Python 数据结构.md ├── Python 文件读写.md ├── Python 文件路径.md ├── Python 时间.md ├── Python 机器学习 │ ├── Python 保存或加载模型.md │ ├── Python 手写体识别.md │ └── Python 聚类分析.md ├── Python 爬虫 │ └── 爬虫环境配置问题(部分).md ├── Python 编码格式.md ├── Python 语法结构.md ├── Python 面向对象.md └── img │ └── path │ └── 1.png ├── README.md ├── Redis ├── Redis Key.md ├── Redis Rehash.md ├── Redis 安装.md ├── Redis 总述.md ├── Redis 扩展功能.md ├── Redis 数据与安全.md ├── Redis 数据类型.md └── Redis 连接.md ├── Spring Boot ├── Beanutils.md ├── Lombok.md ├── ServletInitializer的理解.md ├── Spring Apache Tomcat.md ├── Spring Banner.md ├── Spring Bean.md ├── Spring Boot & mondrian.md ├── Spring Boot AOP.md ├── Spring Boot Controller层.md ├── Spring Boot Dao层.md ├── Spring Boot HTTPS.md ├── Spring Boot IOC&DI.md ├── Spring Boot Junit测试.md ├── Spring Boot MongoDB.md ├── Spring Boot MySDK.md ├── Spring Boot OSS.md ├── Spring Boot Python.md ├── Spring Boot Redis.md ├── Spring Boot ResponseEntity.md ├── Spring Boot SSM邮件.md ├── Spring Boot Service层.md ├── Spring Boot Swagger2.md ├── Spring Boot Token.md ├── Spring Boot VO、PO.md ├── Spring Boot mybatis.md ├── Spring Boot websocket.md ├── Spring Boot 事务.md ├── Spring Boot 发起HTTP请求.md ├── Spring Boot 启动.md ├── Spring Boot 基础.md ├── Spring Boot 处理跨域请求.md ├── Spring Boot 多源数据库问题.md ├── Spring Boot 容器性能差异.md ├── Spring Boot 微信.md ├── Spring Boot 时间.md ├── Spring Boot 松绑定.md ├── Spring Boot 核心注解.md ├── Spring Boot 框架出现的问题.md ├── Spring Boot 注解开关原理.md ├── Spring Boot 网络解释.md ├── Spring Boot 获取Header参数.md ├── Spring Boot 部署到Linux服务器.md ├── Spring Boot 配置.md ├── Summary-Spring Boot推荐阅读.md ├── img │ ├── Dao │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ ├── Junit │ │ └── 1.png │ ├── MySDK │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ └── 4.png │ ├── SpringBoot框架学习 │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ ├── Tomcat&Servlet │ │ ├── 1.png │ │ ├── 2.png │ │ └── 3.png │ ├── Transaction │ │ └── 1.png │ ├── bean │ │ ├── 1.bmp │ │ ├── 2.png │ │ └── 3.png │ ├── ioc │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ └── 8.png │ ├── multiDatabase │ │ └── 1.png │ ├── service │ │ └── 1.png │ └── token │ │ ├── 1.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ └── 5.png └── 理解Token的实现机制.md ├── Spring Cloud ├── SpringCloud Feign.md ├── SpringCloud Sidecar.md ├── SpringCloud 问题.md ├── img │ └── first │ │ ├── 1.png │ │ ├── 10.png │ │ ├── 11.png │ │ ├── 12.png │ │ ├── 13.png │ │ ├── 14.png │ │ ├── 2.png │ │ ├── 3.png │ │ ├── 4.png │ │ ├── 5.png │ │ ├── 6.png │ │ ├── 7.png │ │ ├── 8.png │ │ └── 9.png └── 第一个微服务项目.md ├── Spring ├── Spring 概述.md ├── Spring 装配Bean.md └── img │ └── charpter1 │ └── 1.jpg ├── 云原生技术 ├── Devops入门.md ├── Docker&Kubernetes.md ├── Docker │ ├── Tec1-Docker 部署 Vue 项目.md │ ├── Tec2-Dockerfile 编写和使用.md │ └── Tec3-Docker 具体操作.md ├── Tec01-Windows安装Kubernates.md ├── Tec02-Windows卸载安装Docker.md ├── Tec03-Kubernetes集群安装.md └── img │ ├── devops │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png │ ├── docker │ ├── 1.png │ ├── 10.png │ ├── 11.png │ ├── 12.png │ ├── 13.png │ ├── 14.png │ ├── 15.png │ ├── 16.png │ ├── 17.png │ ├── 18.png │ ├── 19.png │ ├── 2.png │ ├── 20.png │ ├── 21.png │ ├── 22.png │ ├── 23.png │ ├── 24.png │ ├── 25.png │ ├── 26.png │ ├── 27.png │ ├── 28.png │ ├── 29.png │ ├── 3.png │ ├── 30.png │ ├── 31.png │ ├── 32.png │ ├── 33.png │ ├── 4.png │ ├── 5.png │ ├── 6.png │ ├── 7.png │ ├── 8.png │ └── 9.png │ ├── tec02 │ ├── 1.png │ ├── 2.png │ ├── 3.png │ ├── 4.png │ └── 5.png │ └── tec03 │ ├── 1.png │ └── 2.png ├── 服务器 ├── Docker 安装neo4j.md ├── SSH免密登陆.md ├── 云服务器搭建.md └── 博客搭建.md └── 编码格式 ├── ReadMe.md ├── img ├── 1.jpg ├── 1.png ├── 10.png ├── 11.png ├── 12.png ├── 13.png ├── 14.png ├── 15.png ├── 16.png ├── 17.png ├── 18.png ├── 19.png ├── 2.png ├── 20.png ├── 21.png ├── 22.png ├── 23.png ├── 3.png ├── 4.png ├── 5.png ├── 6.png ├── 7.png ├── 8.png ├── 9.png └── mp3.png ├── 压缩算法.md ├── 图片编码格式.md ├── 字符类型编码.md ├── 文件编码格式.md ├── 视频编码格式.md └── 音频编码格式.md /.gitignore: -------------------------------------------------------------------------------- 1 | .DS_Store -------------------------------------------------------------------------------- /C++/C++ OOP/C++ 动态内存.md: -------------------------------------------------------------------------------- 1 | 动态内存 2 | --- 3 | 1. 操作系统中内存的一种形式 4 | 1. 栈空间:局部变量、值传递参数 5 | 2. 堆空间:动态内存分配的位置 6 | 2. C:早在C之中已经有malloc和free等对动态内存操纵的函数。 7 | 1. malloc() – memory allocation 8 | 2. free() – free memory 9 | 3. C++ 10 | 1. new – create space for a new object (allocate) 11 | 2. delete – delete this object (free) 12 | 13 | 14 | 15 | - [1. 动态对象](#1-动态对象) 16 | - [2. 创建对象](#2-创建对象) 17 | - [3. 对象的删除](#3-对象的删除) 18 | - [4. 动态对象数组](#4-动态对象数组) 19 | - [5. 动态2D数组](#5-动态2d数组) 20 | 21 | 22 | 23 | # 1. 动态对象 24 | 1. 在heap中创建 25 | 2. new/delete(constructor/destrutor),可以被重载 26 | 3. 为什么要引入new和delete操作符:因为新的操作符可以解决初始化函数的析构函数的调用的问题 27 | 4. 具体示例如下: 28 | 29 | ```c++ 30 | class A { 31 | public : 32 | A () ; 33 | A (int); 34 | }; 35 | A *p,*q; 36 | p = new A; 37 | //在程序的 heap 中申请一块大小为 sizeof(A) 的 内存 38 | //新的功能:调用 A 的默认构造函数对该空间上的对象初始化 39 | //返回创建的对象的地址并赋值给 p 40 | q = new A(1); 41 | //调用 A 的另一个构造函数 A::A(int) 42 | delete p; 43 | //新功能:调用 p 所指 向 的对象的析构函数 44 | //释放对象空间 delete q ; 45 | ``` 46 | 1. malloc(不调用构造函数)|free(不调用析构函数) 47 | + new可以重载 48 | ```c++ 49 | p = (A *)malloc(sizeof(A))//A中的成员变量没有初始化 50 | free(p) 51 | ``` 52 | 53 | # 2. 创建对象 54 | 1. new: 55 | 1. 使用原始类型 56 | 2. 使用类类型 57 | 2. Syntax:语法 58 | 1. 原始类型:`type* ptrName = new type;` 59 | 2. 使用类类型:`type* ptrName = new type(params);` 60 | 3. 注意:这是没有变量名字的物体 61 | 62 | ![](img/1.png) 63 | 64 | >关于对象指针 65 | 66 | # 3. 对象的删除 67 | 1. delete: 68 | 1. 唤起指向物体的指针 69 | 2. 处理原始类型或类类型 70 | 2. 语法:`delete ptrName;` 71 | 3. 注意:删除之后,要将指针置为空指针,这样子之后可以继续使用,避免意外的引用对象,如果指针没有修改的话,可能是一个悬挂指针(有可能出现段错误等等) 72 | ```c++ 73 | delete ptrName; 74 | ptrName = NULL; 75 | ``` 76 | 77 | # 4. 动态对象数组 78 | 1. 动态对象数组的创建与撤销 79 | ```c++ 80 | A *p; 81 | p = new A[100]; 82 | delete []p; 83 | ``` 84 | 2. 注意: 85 | 1. 不能显式初始化,相应的类必须有默认构造函数 86 | 2. 初始化部分是修改比较多的 87 | 3. 在堆上分配的内存默认不进行初始化 88 | 1. `int *p1 = new int[5];` 默认不进行初始化 89 | 2. `int *p2 = new int[5]();`进行默认初始化 90 | 3. `int *p2 = new int[5]{0,1,2,3,4}`:进行显式对应函数初始化 91 | 4. 注意:`delete []p`中的[]不可以省略 92 | 1. 如果省略的话,是删除了数组的第一个元素。并且会破坏其中的存储数组长度 93 | 2. `new int[100]`就可以直接delete,因为不是复杂对象 94 | 95 | # 5. 动态2D数组 96 | 1. 创建算法: 97 | 1. 分配行的数量 98 | 2. 对于每一行分配列 99 | 100 | ![](img/15.png) 101 | 102 | ```c++ 103 | const int ROWS = 3; 104 | const int COLUMNS = 4; 105 | char **chArray2; 106 | 107 | // allocate the rows 粉色部分 108 | chArray2 = new char* [ROWS]; 109 | 110 | // allocate the (pointer) elements for each row 蓝色部分 111 | for (int row = 0; row < ROWS; row++ ) 112 | chArray2[row] = new char[ COLUMNS ]; 113 | ``` 114 | 115 | 1. 删除算法:和创建算法相反 116 | 117 | ```c++ 118 | for (int row = 0; row < ROWS; row++) { 119 | delete []chArray2[ row ]; 120 | chArray2[ row ] = NULL; 121 | } 122 | delete []chArray2; 123 | chArray2 = NULL; 124 | ``` -------------------------------------------------------------------------------- /C++/C++ OOP/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/1.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/10.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/11.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/14.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/15.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/16.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/17.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/18.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/2.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/3.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/4.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/5.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/6.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/7.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/8.png -------------------------------------------------------------------------------- /C++/C++ OOP/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ OOP/img/9.png -------------------------------------------------------------------------------- /C++/C++ 数据结构/C++ Map.md: -------------------------------------------------------------------------------- 1 | Map 2 | --- 3 | 1. map(正序默认是字典序): map.find(y1)==m.end() 4 | + 没有y1这个key 直接m[y1]取出 value 逆序遍 5 | 6 | ```c++ 7 | map::reverse_iterator iter; 8 | for (iter = m.rbegin(); iter != m.rend(); iter++) {//逆序遍历 9 | if (iter->second != 0) { 10 | if (iter == m.rbegin()){ 11 | cout << iter->second << "x^" << iter->first; 12 | }else{ 13 | cout << " + " << iter->second << "x^" << iter->first; 14 | } 15 | } 16 | } 17 | ``` 18 | 19 | 2. 正序遍历 20 | ```c++ 21 | map::iterator iter; 22 | for (iter = m.begin();iter != m.end(); iter++){ 23 | cout << iter->first << "-" << iter->second << endl; 24 | } 25 | ``` -------------------------------------------------------------------------------- /C++/C++ 数据结构/C++ Vector.md: -------------------------------------------------------------------------------- 1 | Vector 2 | --- 3 | 1. 需要头文件`#include` 4 | 2. 如果不`using namespace std;`会编译错误 5 | 3. 向量(Vector)是一个封装了动态大小数组的顺序容器,可以存放各种类型的对象。 6 | 7 | 8 | 9 | - [1. 容器特性](#1-容器特性) 10 | - [2. 声明初始化](#2-声明初始化) 11 | - [2.1. 简单初始化](#21-简单初始化) 12 | - [2.2. 二维vector的初始化](#22-二维vector的初始化) 13 | - [3. 元素输入](#3-元素输入) 14 | - [4. 特殊方法](#4-特殊方法) 15 | - [5. 了解更多](#5-了解更多) 16 | 17 | 18 | 19 | # 1. 容器特性 20 | 1. **顺序序列** 21 | + 其中元素按照严格的线性顺序排序,可以通过元素在序列中的位置访问相应的元素。 22 | 2. **动态数组** 23 | + 支持对序列中的任意元素进行快速直接访问,甚至可以通过指针算术进行该操作。 24 | 3. **能够感知内存分配器的** 25 | + 使用了一个内存分配器对象来动态地处理它的存储需求。 26 | 27 | # 2. 声明初始化 28 | 29 | ## 2.1. 简单初始化 30 | 31 | ```c++ 32 | vector a ; 33 | //声明一个int型向量a 34 | vector b(10); 35 | //声明一个初始大小为10的向量 36 | vector c(10, 1); 37 | //声明一个初始大小为10且初始值都为1的向量 38 | vector b(a); 39 | //声明并用向量a初始化向量b 40 | vector b(a.begin(), a.begin()+3); 41 | //将a向量中从第0个到第2个(共3个)作为向量b的初始值 42 | ``` 43 | 44 | ## 2.2. 二维vector的初始化 45 | ```c++ 46 | vector> array; 47 | ``` 48 | 49 | # 3. 元素输入 50 | 1. 可以直接向普通数组一样使用cin>>,cout<<进行输入输出 51 | 52 | # 4. 特殊方法 53 | 54 | | 方法 | 作用 | 55 | | --------------------------------------- | -------------------------- | 56 | | `a.size()` | 返回长度 | 57 | | `a.empty()` | 判断是否为空 | 58 | | `a.clear()` | 清空向量中的元素 | 59 | | `a.insert(a.begin(),共几个,插入的数字)` | 在一个位置上插入 | 60 | | `a.erase(b.begin(),b.begin()+3)` | 删除某个位置或者之间的元素 | 61 | | `sort.(a.begin(),a.end())` | 排序 | 62 | 63 | 2. 遍历器:`vector::iterator t;` 64 | + t = a.begin() 65 | + t!= a.end() 66 | + t ++ 67 | 68 | # 5. 了解更多 69 | 1. 菜鸟教程 -------------------------------------------------------------------------------- /C++/C++ 数据结构/C++ stack.md: -------------------------------------------------------------------------------- 1 | c++ stack 2 | --- 3 | 1. 简要记录比较通俗易懂的stack(c++内置版本) 4 | 2. 头文件:`#include` 5 | 3. 是一个FIFO的线性链表 6 | 7 | | 函数名 | 功能 | 其他备注 | 8 | | ------- | ---------------- | -------------- | 9 | | top() | 取出栈顶元素 | 不删除栈顶元素 | 10 | | pop() | 删除栈顶元素 | 无 | 11 | | empty() | 检验栈是否为空 | 为空则为true | 12 | | push() | 在栈顶增加元素 | 无 | 13 | | size() | 返回栈中元素个数 | 无 | -------------------------------------------------------------------------------- /C++/C++ 数据结构/C++ 数组.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 数组](#1-数组) 4 | - [1.1. 一维数组](#11-一维数组) 5 | - [1.2. 一位数组的初始化](#12-一位数组的初始化) 6 | - [1.3. 二维数组](#13-二维数组) 7 | - [1.4. 多维数组](#14-多维数组) 8 | - [1.5. 字符数组](#15-字符数组) 9 | 10 | 11 | 12 | # 1. 数组 13 | 1. 数组作为参数`int a[]` 14 | 2. 特征: 15 | 1. 相同类型 16 | 2. **连续存储**:0 - n-1 17 | 3. 数组名的含义: 18 | + `int A[6]`的A是代表6个int的集合 19 | + `sizeof(A)`:6 * sizeof(int) 20 | 21 | ## 1.1. 一维数组 22 | 1. 类型定义`T name[number]` 23 | 2. 赋值操作,部分赋值的话,之后按照默认值 24 | 3. 函数接口:`void f(int a[], int n);//这里面的a的身份已经发生了变化` 25 | + 此时a已经不知道有多少个元素了 26 | + C++是允许数组的越界(给予语言表达极大的灵活性),不检查数组的越界 27 | + 元素个数需通过参数**显式**给出,不可以通过sizeof来获得:`void f(char a[]);` 28 | ```c++ 29 | char s1[]="abc"; 30 | cout << s1;//实际上是{'a','b','c','\0'} 31 | char s2[]={'a','b','c'}; 32 | cout << s2;//错误 33 | ``` 34 | 4. 读取字符数组的时候,我们可以根据`\0`来判断是否字符串结束 35 | 5. 为什么会出现"烫烫烫":`0xCC`是烫(在VS下由于未初始化,VS为了帮助你发现问题,对于未使用的内存空间我们都使用0xCC填充,0xCC是指3号中断) 36 | + 0xCC:烫 37 | + 0xCD:屯:heap(在栈部分出现的额问题) 38 | + 数组未初始化:在对应位置填充0xCC,其上下文填充0xFD 39 | + 释放内存,如果没有请0,则会帮你将内存中的值清理成一个特定的值,用来防止内存为清零。 40 | 41 | ## 1.2. 一位数组的初始化 42 | 1. 整数数组的初始化 43 | ```c++ 44 | //默认初始化 45 | int a[5] = {}; //[0, 0, 0, 0, 0] 46 | //全部初始化为0 47 | int a[5] = {0}; //[0, 0, 0, 0, 0] 48 | //c++11新写法 49 | int a[5]{}; //[0, 0, 0, 0, 0] 50 | 51 | //注意,想要整型数组 全部初始化为1的时候不能粗暴的设置为 52 | int a[5] = {1}; //[1, 0, 0, 0, 0] 53 | // 因为 数组初始化列表中的元素个数小于指定的数组长度时, 不足的元素以默认值填补。 54 | //可以分别赋值 55 | int a[5] = {1,1,1,1,1}; //[1,1,1,1,1] 56 | ``` 57 | 58 | 2. 字符串的初始化-栈初始化 59 | ```c++ 60 | string *str = string[5]; //调用5次默认构造函数 61 | string *str1 = string[5]{"aaa"}; //数组中的第一个元素调用 string::string(const char *) 进行初始化。后面四个调用 默认构造函数 62 | ``` 63 | 64 | 3. 数组的默认初始化:如果不明确指出初始化列表,那么基本类型**不会被初始化**(全局变量和静态变量除外),所有内存都是脏数据;且自定义的类类型会为每个元素调用默认构造函数进行初始化 65 | ```c++ 66 | int a[5]{}; 67 | a[6]; //32766 68 | a[10]; //1474921429 69 | // Xcode会提示 Array index 10 is past the end of the array (which contains 5 elements)。虽然不会爆红,但是Xcode提示越界了。这在程序中也是需要特别注意的,越界时会取到脏数据。 70 | string str[5]; //["","","","",""] 71 | string str1[5] = {"","2","",""}; //["","2","',"",""] 72 | string str2[5] = {"a"}; //["a","","","",""] 73 | ``` 74 | 75 | ## 1.3. 二维数组 76 | 1. `T name[number1][number2]` 77 | 2. 也是按照顺序进行排列的,不过是一行一行的放置而已 78 | 3. 二维数组初始化 79 | 80 | ```c++ 81 | int **p; 82 | p = new int*[10];//一个有10个元素的指针数组 83 | for(int i = 0; i < 10; ++i){ 84 | p[i] = new int[5]; 85 | } 86 | ``` 87 | 88 | ## 1.4. 多维数组 89 | 1. 定义:`T A[c1][c2]` 90 | 2. 存储组织: 91 | 3. 参数传递:`void f(int a[][3], int n);` 92 | + 理解为int[3] a[] (单个元素是三个int) 93 | + 缺省第1维 94 | ```c++ 95 | typedef T T1[c2]; 96 | typedef T1 A[c1]; 97 | ``` 98 | 4. 升/降维处理 99 | 100 | 101 | ## 1.5. 字符数组 102 | 1. 直接按照字符串形式输出 103 | 2. 字符数组的约定是,以`\0`作为结尾 104 | -------------------------------------------------------------------------------- /C++/C++ 数据结构/C++ 结构体.md: -------------------------------------------------------------------------------- 1 | struct 结构体 2 | --- 3 | 4 | 1. 赋值-同类型:同类型一共就两种情况 5 | 1. 同类型:Memory copy 6 | 2. 同类型:Typedef 7 | 3. 内存布局就算是一样也不认为是相同的。 8 | 2. alignment:一般是指内存对齐(存在于大多数编程语言中) 9 | 1. 契合硬件 10 | 2. 提升效率 11 | 3. 我们使用参数传递 12 | 4. C++向前兼容,class不写访问权限,全部都是private,struct不写访问权限,全部都是public 13 | 5. struct也可以被理解成为类 14 | 6. 结构体是按名访问 15 | 7. typedef:是重命名 16 | 17 | ```c++ 18 | struct B 19 | { 20 | char b; //1 21 | int a; //4 22 | short c; //2 23 | }; 24 | cout << sizeof(B);//12 25 | //为什么是12,是因为内存空间对齐,提高内存访问效率 26 | ``` 27 | ```c++ 28 | //可关闭 29 | __declspec(align(8)) 30 | #pragma pack(n) 31 | //可以调整内存布局,将c和b整合到一起,然后B就是大小为8 32 | ``` 33 | 8. 使用pack可以让其摒弃用存储空间换取时间的做法,将空间尽可能的利用起来。 -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 头文件.md: -------------------------------------------------------------------------------- 1 | C++ 头文件 2 | --- 3 | 4 | 5 | 6 | - [1. 头文件](#1-头文件) 7 | - [2. 头文件主要内容](#2-头文件主要内容) 8 | 9 | 10 | 11 | # 1. 头文件 12 | 1. `#include` 13 | 2. iostream:输入输出流 14 | 3. cmath:数学函数 15 | 4. iomanip:I/O流控制符 16 | 17 | # 2. 头文件主要内容 18 | 1. 头文件可以包含常量定义、变量/函数声明、编译预处理、类型定义、内联函数 19 | ```c++ 20 | //const.h 21 | const double pi = 3.1415926; 22 | ``` 23 | ```c++ 24 | //a.h 25 | extern float salary; 26 | extern void show(); 27 | ``` 28 | 2. 调用头文件:`#include "a.h"` -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 核心关键字.md: -------------------------------------------------------------------------------- 1 | c++核心特殊关键字 2 | --- 3 | 4 | 5 | 6 | - [1. friend关键字](#1-friend关键字) 7 | - [1.1. 友元函数](#11-友元函数) 8 | - [1.2. 友元类](#12-友元类) 9 | - [2. this关键字](#2-this关键字) 10 | - [2.1. 用法](#21-用法) 11 | - [2.2. 注意](#22-注意) 12 | - [3. volatile](#3-volatile) 13 | - [3.1. 易变性](#31-易变性) 14 | - [3.2. 不可优化](#32-不可优化) 15 | - [3.3. 顺序性](#33-顺序性) 16 | - [3.4. 参考](#34-参考) 17 | - [4. static 关键词](#4-static-关键词) 18 | - [4.1. 成员函数](#41-成员函数) 19 | - [4.2. 数据成员](#42-数据成员) 20 | - [5. const类型](#5-const类型) 21 | 22 | 23 | 24 | # 1. friend关键字 25 | 1. private和protected不能从声明它们的同一类外部访问。 26 | 2. 被friend关键字修饰的函数或类成为友元函数或友元类。 27 | 28 | ## 1.1. 友元函数 29 | 1. 友元函数是可以直接访问类的私有成员的非成员函数。(不需要通过public部分的接口) 30 | 2. 它是定义在类外的普通函数,它不属于任何类,但需要在类的定义中加以声明,声明时只需要在友元的名称前加上关键词friend。 31 | 3. 声明格式:`friend 类型 函数名(形式参数);` 32 | + 友元函数的声明可以放在类的私有部分,也可以放在公有部分,这并没有区别。 33 | + 一个函数可以是多个类的友元函数,只要在多个类中声明即可。 34 | 35 | ## 1.2. 友元类 36 | 1. 友元类的所有成员函数都是另一个类的友元函数,都可以访问另一个类中的隐藏信息(包含私有成员和保护成员)。 37 | 2. 语法:`friend class 类名;` 38 | 3. 注意: 39 | 1. 友元关系不能被继承。 40 | 2. 友元关系是单向的,不具有交换性。 41 | 3. 友元关系具有非传递性。 42 | 43 | # 2. this关键字 44 | 1. 在C++中,每一个对象都可以通过this指针来访问自己的地址。 45 | 2. this是所有成员函数的隐藏参数。 46 | 47 | ## 2.1. 用法 48 | 1. 如果有某个变量和成员变量相同,那么用this来引用成员变量 49 | 2. 需要返回变量或结构体变量时,使用this关键字。 50 | 51 | ## 2.2. 注意 52 | 1. 友元函数没有this指针 53 | 2. this关键字之能用于成员函数,不能被修饰static的函数。 54 | 3. 因为在C++中,this关键字是一个指向对象自己的指针,不能加点,而是用-> 55 | 56 | # 3. volatile 57 | 58 | ## 3.1. 易变性 59 | 1. 也就是在汇编层面上来讲,下一条语句不会直接使用上一条语句的volatile变量的寄存器内容,而是重新从内存读取。 60 | 61 | ## 3.2. 不可优化 62 | 1. volatile告诉编译器,不要对这个变量进行优化,保证程序员写在代码中的指令一定会被执行。 63 | 64 | ## 3.3. 顺序性 65 | 1. 保证在多线程情况下的一定的处理顺序 66 | 67 | ## 3.4. 参考 68 | 解释volatile关键字 69 | 70 | # 4. static 关键词 71 | 1. 用static可以为类类型的所有对象所共有,像是全局对象,但又被约束在类类型的名字空间中。static定义的静态变量在函数执行后不会释放其存储空间。 72 | - 修饰一个全局变量只对定义在同一文件中的函数可见:其他文件可以定义相同名字的变量。 73 | - 修饰局部变量,这个变量值不会因为函数终止而丢失,该变量在全局函数区分配内存(局部变量在栈区) 74 | 2. 可以实施封装,将其放在private和protected区域 75 | 3. static成员没有this指针,它不是任何一个对象的组成部分,推荐使用"类名::static成员名"调用 76 | 77 | ## 4.1. 成员函数 78 | 1. 声明时候写static关键词 79 | 2. 定义时候不写static关键词 80 | 3. 不可以使用const以修饰其不改变其成员属性。`static void f() const{};//error`,因为static函数不包含this指针 81 | 4. 不能使用virtual修饰其虚拟性 82 | 5. 目的:作为类作用域的全局函数。不能访问类的非静态数据成员。类的静态成员函数没有this指针,这导致 83 | 1. 不能直接存储类的非静态成员变量,调用非静态成员函数 84 | 2. 不能被声明为virtual 85 | 86 | ## 4.2. 数据成员 87 | 1. 声明时候写static关键词 88 | 2. 定义时候不写static关键词,如果定义的时候加了,其实是变成了**文件作用域** 89 | 3. `static const`数据成员 90 | 1. 可以在类中声明并且初始化,然后在类定义之外再次进行定义 91 | 2. 或者在类中声明,但在类定义外进行定义。 92 | 4. **非const的static数据成员仅能在类中声明,并在类定义之外进行定义。** 93 | 94 | # 5. const类型 95 | 1. const定义的常量在超出其作用域之后**其空间会被释放** 96 | 1. const数据成员只在某个对象生存期内是常量 97 | 2. 对于整个类是可变的,因为类是可以创建多个对象,对于不同对象其const数据成员的值可以不同 98 | 2. const数据成员的初始化**只能在类的构造函数的初始化列表中进行**,想要建立在整个类中都恒定的常量,应该用类对的枚举常量来实现,或者static const 99 | 3. const成员函数主要目的是防止成员函数修改对象的内容。即const成员函数不能修改成员变量的值,但是可以访问成员变量。当方法成员函数时,该函数只能是const成员函数。 100 | 4. **数组成员不能在初始化列表中初始化** -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 环境问题.md: -------------------------------------------------------------------------------- 1 | C++ 出现的部分问题 2 | --- 3 | 4 | 5 | 6 | - [1. x86和x64的不同](#1-x86和x64的不同) 7 | - [2. xc00000007应用无法启动的问题](#2-xc00000007应用无法启动的问题) 8 | - [3. 缺少ddl文件](#3-缺少ddl文件) 9 | 10 | 11 | 12 | # 1. x86和x64的不同 13 | 1. x86是32位系统 14 | 2. x64是64位系统 15 | 3. 在配置dll文件的时候务必注意两者区别 16 | 17 | # 2. xc00000007应用无法启动的问题 18 | 1. 我遇到的是链接库的ddl文件和调试模式不同,32位和64位混淆 19 | 20 | # 3. 缺少ddl文件 21 | 1. 首先务必确认是32位操作系统还是64位操作系统 22 | 2. 去网上找到网站下载并且配置到提示的对应路径 -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 输入重定向到文件.md: -------------------------------------------------------------------------------- 1 | ```c++ 2 | #include 3 | #include 4 | #include 5 | #include 6 | using namespace std; 7 | int main() { 8 | string str1; 9 | string str2; 10 | getline(cin, str1); 11 | getline(cin, str2); 12 | string str = str1 + "\n" + str2; 13 | std::ofstream f("D:\\answer\\answer.txt", std::ios::app); 14 | f << str << std::endl; 15 | f.close(); 16 | } 17 | ``` 18 | 19 | # 1. 考试注意事项 20 | 1. 多次扩容,嵌套操作 21 | 2. int输入可能导致内部 long long 22 | -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 部分内置函数.md: -------------------------------------------------------------------------------- 1 | C++部分内置函数 2 | --- 3 | 4 | 5 | 6 | - [1. 内置函数](#1-内置函数) 7 | - [2. 系统时间](#2-系统时间) 8 | - [2.1. 通过SYSTEMTIME来进行获取](#21-通过systemtime来进行获取) 9 | - [2.2. 参考](#22-参考) 10 | - [3. sort函数的用法](#3-sort函数的用法) 11 | - [3.1. sort()的标准型](#31-sort的标准型) 12 | - [3.2. 参考](#32-参考) 13 | - [4. put()和write()](#4-put和write) 14 | - [4.1. put()](#41-put) 15 | - [4.2. write()](#42-write) 16 | - [4.3. 参考](#43-参考) 17 | 18 | 19 | 20 | # 1. 内置函数 21 | | 函数 | 作用 | 22 | | -------- | -------- | 23 | | max(a,b) | 取最大值 | 24 | | min(a,b) | 取最小值 | 25 | 26 | # 2. 系统时间 27 | 28 | ## 2.1. 通过SYSTEMTIME来进行获取 29 | 1. 相应头文件:`windows.h` 30 | 2. 变量类型:SYSTEMTIME sys; 31 | 3. 获取当前系统时间:`GetLocalTime(&sys)` 32 | 4. 其结构定义如下: 33 | ```c++ 34 | typedef struct _SYSTEMTIME { 35 | WORD wYear;//年 36 | WORD wMonth;//月 37 | WORD wDayOfWeek;//星期 38 | WORD wDay;//日 39 | WORD wHour;//时 40 | WORD wMinute;//分 41 | WORD wSecond;//秒 42 | WORD wMilliseconds;//毫秒 43 | } SYSTEMTIME; 44 | ``` 45 | 46 | ## 2.2. 参考 47 | SYSTEMTIME 48 | 49 | # 3. sort函数的用法 50 | 1. 被包含的头文件:`#include` 51 | 52 | ## 3.1. sort()的标准型 53 | 1. `sort(a,b,function_name)` 54 | + 可以调用定义的函数,default->整数的 55 | + function要求他们的参数应当为两个。 56 | 2. 可以自定义的函数cmp(a,b) 57 | 58 | ```c++ 59 | sort(first_pointer,second_pointer,cmp); 60 | //cmp(a,b)可以自定义 61 | //返回1表示a在b前,返回0表示a在b后面 62 | bool cmp(const int &a,const int &b) { 63 | return a > b; 64 | } 65 | 66 | int main() { 67 | vector temp = { 6, 5, 4, 3, 2, 1 }; 68 | out(temp); 69 | sort(temp.begin(), temp.end() , cmp); 70 | out(temp); 71 | } 72 | ``` 73 | 74 | ## 3.2. 参考 75 | 1. c++sort函数的用法 76 | 77 | # 4. put()和write() 78 | 79 | ## 4.1. put() 80 | 1. 原型:`put()`:适用于wchar_t 81 | + `osrteam &put(char)` 82 | + 返回一个指向调用对象的引用,也就是可以直接拼接输出 83 | 84 | ## 4.2. write() 85 | 1. 原型:`basic_ostream &write(const char_type* s,streamsize n);` 86 | 2. write():方式返回一个指向调用它对象的引用,所以可以拼接,并不会遇到空制度时自动停止打印字符,而是打印指定数目的字符。 87 | 88 | ## 4.3. 参考 89 | 1. c++ put()与write() -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++ 部分特殊符号.md: -------------------------------------------------------------------------------- 1 | C++中部分特殊符号 2 | --- 3 | 4 | 5 | 6 | - [1. ~](#1-) 7 | - [2. ->](#2--) 8 | - [3. .](#3-) 9 | - [4. ||](#4-) 10 | - [5. &&](#5-) 11 | - [6. 冒号](#6-冒号) 12 | - [6.1. :](#61-) 13 | - [6.2. ::](#62-) 14 | 15 | 16 | 17 | # 1. ~ 18 | 1. 用在类中的析构函数之前,表示该函数是析构函数。 19 | 1. 作用:释放对象的资源,销毁非static成员。 20 | 2. 特点: 21 | 1. 无参数无返回值。 22 | 2. 每个类有且只有一个析构函数,不显式定义,系统会帮你生成一个缺省的析构函数。 23 | 3. 析构函数不能重载,一次构造函数的调用一定有一次析构函数的调用。 24 | 2. 用在数字或者整形变量之前,表示对该数取反操作,按照二进制取反。 25 | 26 | # 2. -> 27 | 1. 用处:主要用于类类型的指针访问类的成员。 28 | 2. A->B: 29 | 1. A只能是指向类、结构、联合的指针。 30 | 31 | # 3. . 32 | 1. 用处:主要用于访问类的成员。 33 | 34 | # 4. || 35 | 1. 用处:逻辑或 36 | 37 | # 5. && 38 | 1. 用处:逻辑与 39 | 40 | # 6. 冒号 41 | 42 | ## 6.1. : 43 | 1. 用法一:表示机构内位域的定义(即一个变量占几个bit空间) 44 | ```C++ 45 | typedef struct name{ 46 | char a:4; 47 | }; 48 | ``` 49 | 2. 用法二:构造函数后面的冒号起分隔作用,是类给成员变量赋值的方法,初始化列表,更适用于成员变量的常量const型(初始化表) 50 | ```C++ 51 | struct _XXX{ 52 | _XXX():y(0){}; 53 | } 54 | ``` 55 | 3. 用法三:public和private后面的,用来声明相应的变量的类型 56 | 4. 用法四:类名冒号后面的是用来定义类的继承。 57 | + 默认继承方式:public 58 | ```C++ 59 | class 派生类名:继承方式 基类名{派生类的成员}; 60 | ``` 61 | 5. 用法五:在?:这个表达式中 62 | 63 | ## 6.2. :: 64 | 1. 表示域运算符:在类外声明一个函数的实体 65 | ```C++ 66 | class test{ 67 | public: 68 | void f(); 69 | } 70 | void test::f(){ 71 | more; 72 | } 73 | ``` 74 | 2. 直接用在全局函数前,表示是全局函数。 75 | 3. 表示引用成员函数及变量,作用域成员运算符。 76 | 1. 静态数据成员既可以通过对象名引用,也可以通过类名加::来引用。 77 | 2. 静态成员函数同上 78 | + 静态成员函数引用不了非静态的数据成员。 79 | 3. 引用勒种定义的typedef新类型。 80 | 4. A::B 81 | 1. A可以使名字空间、类、结构。 82 | 83 | ```C++ 84 | class test{ 85 | public: 86 | typedef int INT; 87 | } 88 | test::INT b; 89 | ``` -------------------------------------------------------------------------------- /C++/C++ 结构化编程/C++混合编译.md: -------------------------------------------------------------------------------- 1 | C++ 混合编译 2 | --- 3 | 4 | # 1. 在Cpp文件中调用c文件中部分 5 | ```cpp 6 | extern "C" 7 | { 8 | // 声明 9 | } 10 | ``` 11 | 12 | 如何在cpp文件中调用gcc编译的.o文件的函数 -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/IO/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/IO/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/IO/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/IO/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/cpp/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/cpp/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/cpp/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/cpp/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/cpp/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/cpp/3.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/3.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/4.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/5.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/6.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/7.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exam/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exam/8.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/exception/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/exception/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/3.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/4.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/5.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/6.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/function/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/function/7.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/3.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/4.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/5.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/6.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/7.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/8.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/pointer/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/pointer/9.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/union/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/union/1.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/union/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/union/2.png -------------------------------------------------------------------------------- /C++/C++ 结构化编程/img/union/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/C++ 结构化编程/img/union/3.png -------------------------------------------------------------------------------- /C++/img/introduce/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/1.png -------------------------------------------------------------------------------- /C++/img/introduce/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/2.png -------------------------------------------------------------------------------- /C++/img/introduce/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/3.png -------------------------------------------------------------------------------- /C++/img/introduce/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/4.png -------------------------------------------------------------------------------- /C++/img/introduce/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/5.png -------------------------------------------------------------------------------- /C++/img/introduce/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/6.png -------------------------------------------------------------------------------- /C++/img/introduce/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/introduce/7.png -------------------------------------------------------------------------------- /C++/img/switch/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/1.png -------------------------------------------------------------------------------- /C++/img/switch/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/11.png -------------------------------------------------------------------------------- /C++/img/switch/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/12.png -------------------------------------------------------------------------------- /C++/img/switch/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/13.png -------------------------------------------------------------------------------- /C++/img/switch/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/14.png -------------------------------------------------------------------------------- /C++/img/switch/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/15.png -------------------------------------------------------------------------------- /C++/img/switch/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/16.png -------------------------------------------------------------------------------- /C++/img/switch/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/2.png -------------------------------------------------------------------------------- /C++/img/switch/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/3.png -------------------------------------------------------------------------------- /C++/img/switch/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/4.png -------------------------------------------------------------------------------- /C++/img/switch/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/5.png -------------------------------------------------------------------------------- /C++/img/switch/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/6.png -------------------------------------------------------------------------------- /C++/img/switch/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/7.png -------------------------------------------------------------------------------- /C++/img/switch/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/8.png -------------------------------------------------------------------------------- /C++/img/switch/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/C++/img/switch/9.png -------------------------------------------------------------------------------- /Git/Git Fork.md: -------------------------------------------------------------------------------- 1 | Git Fork 2 | --- 3 | 1. 主要记载了fork后如何在github上同步原仓库的更新到本仓库 4 | 5 | # 1. 步骤 6 | 1. 首先点击进入Pull requests 7 | 2. 然后点击New pull request新建一个pull request 8 | 3. 之后修改方向,首先将左侧的仓库改为自己的仓库,然后点击compare across fork,将右侧改为原仓库 9 | 4. 如果有差异,那么则会比较是否可以合并,如果可以,则点击create pull request,提交相关信息。 10 | 5. 之后点击merge pull request,合并分支,最后点击confirm merge完成操作。 11 | 12 | # 2. 参考 13 | 1. Github 中 fork 原项目后,如何更新保持和原仓库保持一致 -------------------------------------------------------------------------------- /Git/Git 本地计算机实验.md: -------------------------------------------------------------------------------- 1 | # 1. 添加文件 2 | 1. git add [file1]:添加指定文件 成功 3 | 2. git add [dir]:添加指定子目录 成功 4 | 3. git add . 5 | 4. 以上所有的文件都是提交到暂存区 6 | 7 | # 2. 代码提交 8 | 1. git commit -m [message] 提交全部暂存区 成功 9 | 2. git commit [file1] -m [message] 成功 10 | 3. git commit [file1] [file2] -m [massage] 成功 11 | 4. git commit -a 提交上次commit之后的变化,直接到仓库区 12 | 5. git commit -v 提交时显示所有 diff 信息 13 | 14 | # 3. 查看状态 15 | 1. git status:显示有变更的文件 16 | 2. git log:显示当前分支的版本历史 17 | 3. git diff:显示暂存区和工作区的差异 18 | 19 | # 4. 撤销 20 | 1. git checkout [file] 撤销暂存区的指定文件回到工作区(处理误删除和文件内容),commit是通过log查看的号。 21 | 1. 可以调整到当前的分支 22 | 2. git checkout [commit] [file] 恢复某个commit的指定文件到暂存区和工作区 23 | 3. git checkout . 恢复暂存区的所有⽂件到⼯作区 24 | 4. git reset [file] 重置暂存区的指定⽂件,与上⼀次commit保持⼀致,但⼯作区不变(回推添加到暂存区的操作) 25 | 5. git reset --hard 重置暂存区与⼯作区,与上⼀次commit保持⼀致 26 | 6. git reset [commit] 重置当前分⽀的指针为指定commit,同时重置暂存区,但⼯作区不变 27 | 7. git reset --hard [commit] 重置当前分⽀的HEAD为指定commit,同时重置暂存区和⼯作区,与指定commit⼀致 28 | 8. git reset -- soft 只改变提交点,暂存区和工作目录的记录都不改变 29 | 9. git reset -- mixed 改变提交点,同时改变暂存区的内容,这是默认的回滚方式。 30 | 10. git commit --amend 撤销最后一些commit(原地修改,让上一次提交不露痕迹) 31 | 32 | # 5. 远程同步 33 | 1. git remote -v 显示所有远程仓库 34 | 2. git remote show [remote] 显示某个远程仓库的信息 35 | 3. git fetch [remote] 下载远程仓库的所有变动 36 | 4. git pull [remote] [branch] 取回远程仓库的变化,并与本地分支合并 37 | 5. git push [remote] [branch] 上传本地指定分支到远程仓库 38 | 39 | # 6. Rebase 40 | ![](img/3.png) 41 | 42 | # 7. Cherry-pick 43 | 1. 复制一个提交点所作的工作,将其完成的应用到当前分支的某个提交点上。 44 | 45 | # 8. 正反过程对比 46 | ![](img/4.png) -------------------------------------------------------------------------------- /Git/Git 远程分支操作.md: -------------------------------------------------------------------------------- 1 | Git 远程分支操作 2 | --- 3 | 1. 避免污染Master主分支,我们往往直接对于远程分支进行操作。 4 | 5 | # 1. 拉取远程分支 6 | 7 | ## 1.1. 本地创建一个Github仓库 8 | 1. `git init`:新建一个仓库 9 | 10 | ## 1.2. 建立远程连接 11 | 1. `git remote add origin git@xxxx`:将本地仓库和远程仓库相关联。 12 | 2. `git remote -v`:查看远程库。 13 | 14 | ## 1.3. 拉取远程分支到本地 15 | 1. `git fetch origin branch-name`:拉取远程名字为branch-name的分支到本地 16 | 17 | # 2. 提交到github远程分支 18 | 1. 使用vscode先从左下角切换分支 19 | 2. 推送提交:`git push origin master:remote-branch` 20 | 21 | # 3. 参考 22 | 1. github:拉取远程分支到本地 23 | 2. git提交到github远程分支 24 | 3. [Git]保持本地和fork的原仓库代码一致 25 | 26 | 27 | # 4. 完整操作 28 | ``` 29 | git init 30 | git remote add origin https://github.com/nju-AU/nju-AU.git 31 | git fetch origin hello 32 | git checkout hello 33 | ``` -------------------------------------------------------------------------------- /Git/Git 部分报错的解决办法.md: -------------------------------------------------------------------------------- 1 | Git 部分报错的解决方案 2 | --- 3 | 4 | # 1. index文件损坏 5 | > error: bad signature fatal: index file corrupt 6 | 1. 解决方案:我们需要的是重新生成index文件 7 | 8 | ```linux 9 | rm -f .git/index 10 | git reset --mixed HEAD 11 | ``` -------------------------------------------------------------------------------- /Git/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Git/img/1.png -------------------------------------------------------------------------------- /Git/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Git/img/2.png -------------------------------------------------------------------------------- /Git/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Git/img/3.png -------------------------------------------------------------------------------- /Git/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Git/img/4.png -------------------------------------------------------------------------------- /Java基础/IDEA 使用经验.md: -------------------------------------------------------------------------------- 1 | IDEA 使用经验 2 | --- 3 | 4 | # 1. 不能适用java jdk 5 | 1. 将src等源文件夹右键,选择mark as:对应类型 6 | 7 | # 2. IDEA 自动生成类注释和方法注释 8 | 9 | ## 2.1. 生成类注释 10 | 1. 打开file中的Preferences(mac)/settings(windows) 11 | 2. 找到Editor -> File and Code Templates 中具体想要自动生成的模板。 12 | 3. 具体变量,参考右下角的Desciption 13 | 14 | ## 2.2. 生成方法注释 15 | 1. 打开file中的Preferences/settings 16 | 2. 找到Editor -> Live Templates 中具体想要自动生成的模板。 17 | 3. 可以编辑快捷键和模板。 18 | 19 | # 3. Java 扩展 jar 包的方案 20 | 1. 可以直接下载到jar包然后配置到IDEA中去 21 | 2. 我们还可以通过配置到maven管理的项目的pom.xml文件去中。 22 | 23 | # 4. lombok和IDEA自带的generate操作 24 | 1. lombok的使用应该是慎重的(比较强的入侵性) 25 | 2. 我们可以右键,选择generate来自动生成对应的set和get方法 26 | 27 | # 5. IDEA统计代码数量 28 | 1. 在Plugin中的Statistic扩展包可以用来统计代码的行数 29 | 30 | # 6. 代码的全局搜索 31 | 1. 在这个类中进行搜索:Edit -> find(Ctrl + F) 32 | 2. 在全部代码文件中搜索:Edit -> Find in Path(Ctrl + Shift + F) 33 | 34 | # 7. Structure侧边栏的使用 35 | 1. 左侧m表示方法,f表示属性占位符 36 | 1. **红色**关闭的锁表示private 37 | 2. **圆圈**表示默认不带任何修饰符 38 | 3. **一把钥匙**表示protected 39 | 4. **绿色**打开的锁表示public 40 | 2. 展示实现的接口类和继承的抽象类(I) 41 | 3. 圆圈p表示会显示所有的get/set方法 42 | 4. 圆圈f表示是否显示属性字段 43 | 5. 三个小矩形表示继承的方法 44 | 6. 两个同心圆:展示出匿名内部类 45 | 7. 等等,详见参考2 46 | 47 | # 8. Favorites的使用 48 | 1. 在代码里面进行favorites然后会被注册记录下来 49 | 50 | # 9. TODO注册 51 | 1. 使用`//TODO`进行注册 52 | 2. 竖栏的使用见参考三 53 | 54 | # 10. debug 面板的使用 55 | 1. debug面板打开之后,我们可以进行进一步的定制化。 56 | 1. spend:断点级别,ALL表示对程序而言,Thread表示到线程级别。 57 | 2. Condition:断点进入的条件 58 | 3. Log to console:在流程走到断点时打印一些信 59 | 1. "Breakpoint hit" message 60 | 2. Stacktrace会打印堆栈信息 61 | 4. Evaluate and log:打印指定参数的值 62 | 5. Remove once hit:断点走一次就放掉 63 | 6. Disable until breakpoint is hit:只有进入了指定断点后才能进入此断点 64 | 2. 多线程debug:在debugger里面选择不同的线程切换即可 65 | 3. 详见参考三 66 | 67 | # 11. Spring的查看 68 | 1. 在Spring中可以查看bean(从对应包入手),可以查看具体的应用和使用情况 69 | 2. 在下边栏中找到spring,然后可以查看使用情况 70 | 3. MVC的情况和API可以通过里面的MVC找到 71 | 72 | # 12. Settings迁移 73 | 1. 换电脑的时候,我们只要先Export Settings,然后在新的电脑里面Import Settings即可 74 | 75 | # 13. 分屏功能 76 | 1. x选中想要分屏的文件右键找到Split Vertically实现左右分屏 77 | 2. Split Horizontaly是上下分屏 78 | 79 | # 14. 查看方法调用情况 80 | 1. 在Structure中选择中方法,然后我们可以从Navigate菜单栏中选择Call Hierarchy 81 | 82 | # 15. 自己的扩展插件 83 | 1. Alipay DevTools 84 | 2. Java Methods References Diagram 85 | 3. Lombok 86 | 4. PlantUNL integeration 87 | 5. SequenceDiagram 88 | 6. soapUI Plugin 89 | 7. static 90 | 8. Websocket Client 91 | 9. Graph Database support 92 | 93 | ## 15.1. 自动生成 94 | 1. 在类里面 Alt + Insert 来生成getter、setter、consturctor等 95 | 2. 在方法上 Alt + Insert 来生成Test方法 96 | 97 | # 16. 参考 98 | 1. 详解IDEA 的 添加jar包 99 | 2. java开发工具(1)你真的会用IDEA么?(上) 100 | 3. java开发工具(2)你真的会用IDEA么?(中) -------------------------------------------------------------------------------- /Java基础/java 接口.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. Deadly Dlamond](#1-deadly-dlamond) 4 | - [2. 相关语句](#2-相关语句) 5 | - [3. 特点](#3-特点) 6 | - [4. 具体类和接口的使用](#4-具体类和接口的使用) 7 | - [5. 链表的例子](#5-链表的例子) 8 | - [6. 栈的例子](#6-栈的例子) 9 | - [7. 字节码解释](#7-字节码解释) 10 | - [8. default 默认方法](#8-default-默认方法) 11 | 12 | 13 | **接口** 14 | 1. 为了实现外部定义与内部实现彻底分离,达到"相同接口,多种实现"的目的,java小红提供了"接口" 15 | # 1. Deadly Dlamond 16 | 1. java不支持多重继承,但是c++支持多重继承 17 | 2. 而java允许多个接口 18 | 19 | # 2. 相关语句 20 | 1. 定义方式: `public interface name{}` 21 | 2. 使用方式: `public class name implements name` 22 | 23 | # 3. 特点 24 | 1. 纯抽象类,没有任何方法的定义,仅仅持有这些方法的声明 25 | 1. 接口中的数据成员在自动是static和final的,它们不能是空final,但是可以被非常量表达式初始化。 26 | 2. 其中的抽象方法需要全部的实现 27 | 1. 接口方法在方法表中的位置不是固定的,调用方法需要查找 28 | 1. invokeinterface会相对慢一些:需要在方法表中去查找 29 | 2. 接口方法和抽象方法不可以相互替代 30 | 1. 接口可以被类和接口多继承 31 | 2. 但是抽象类只能被单继承 32 | 3. 接口中没有this指针,没有构造函数,没有实例字段,无法保存状态,而抽象方法就可以 33 | 4. 抽象类不能在java8中使用lambda表达式 34 | 5. 在设计理念上,接口反映的是"like-a"关系,抽象类反映的是"is-a"关系 35 | 3. 接口可以被嵌套在类或其他接口中 36 | 2. 我们可以通过继承接口来扩展接口 37 | 38 | # 4. 具体类和接口的使用 39 | 1. 显示地使用具体的类 40 | 1. 锁定某个具体的实现 41 | 2. 丧失了可扩展性 42 | 3. 丧失了灵活性 43 | 2. 按接口编程 44 | 1. 增加开发的可并行性 45 | 2. 栈:后入先进 46 | 3. 队列:先进先出 47 | 48 | # 5. 链表的例子 49 | 1. 链表无法进行快速的查询,链表只能从头遍历 50 | 2. 使用集合给的比要的要多 51 | 3. 增加了耦合性 52 | 4. 增加了出错了的概率 53 | 54 | # 6. 栈的例子 55 | 1. Monitorable和stack组合 56 | 2. 你依赖的东西是否有问题 57 | 3. 不同类型的栈 58 | 59 | # 7. 字节码解释 60 | 1. 详见PPT 61 | 62 | # 8. default 默认方法 63 | 1. default关键字只能在接口中使用(使用在switch中的default不能用在抽象类中) 64 | 2. 这个用于解决为借口添加新方法而又不会破坏已有方法的实现,为升级旧接口且保持向后兼容提供了途径 65 | 3. 默认方法的继承问题:可以重写,参见PPT 66 | 4. 接口继承行为发生冲突时的解决规则: 67 | 1. 使用super来调用父类中的方法 68 | 2. 当接口继承行为发生冲突时的另一个规则是,类的方法声明优先于接口默认方法,无论该方法是具体的还是抽象的。 69 | 5. 接口方法不能重写:Object类中的`equals、hashCode、toString` 70 | 6. 接口中的静态方法必须是public的,这个修饰符可以省略,但是static修饰符不可以被省略 71 | ```java 72 | default void hello(){ 73 | System.out.println("hi."); 74 | } 75 | ``` -------------------------------------------------------------------------------- /Java基础/java 标签.md: -------------------------------------------------------------------------------- 1 | java 标签 2 | --- 3 | 4 | 1. 在java经常会有一些标签用来表示相应部分的时候用情况。 5 | 6 | 标签|功能|备注 7 | --|--|-- 8 | @Native|用来标识源代码中的常量部分|无 9 | @HotSpotIntrinsicCandidate|是指被该标签标注的方法在HotSpot中都有基于CPU指令的更高效的实现,如果支持则会自动替换JDK的代码完成|无 -------------------------------------------------------------------------------- /Java基础/java 脚本调用.md: -------------------------------------------------------------------------------- 1 | java-脚本调用 2 | --- 3 | 4 | # 1. 使用Runtime对python进行传参 5 | ```java 6 | package test; 7 | import java.io.BufferedReader; 8 | import java.io.InputStreamReader; 9 | public class MyDemo { 10 | public static void main(String[] args) { 11 | try { 12 | System.out.println("start"); 13 | String[] args1=new String[]{"python","D:\\pyworkpeace\\9_30_1.py","D:\\basic\\data.txt"};//参数列表,python的sys.argv获得到的参数组 14 | 15 | Process pr=Runtime.getRuntime().exec(args1); 16 | 17 | BufferedReader in = new BufferedReader(new InputStreamReader( 18 | pr.getInputStream())); 19 | String line; 20 | while ((line = in.readLine()) != null) { 21 | System.out.println(line); 22 | } 23 | in.close(); 24 | pr.waitFor(); 25 | System.out.println("end"); 26 | } catch (Exception e) { 27 | e.printStackTrace(); 28 | } 29 | } 30 | public void test(){ 31 | System.out.println("我的第一个方法C"); 32 | } 33 | 34 | } 35 | ``` 36 | 37 | # 2. 参考 38 | 1. java调用python脚本并向python脚本传递数据实现 39 | 2. Java调用Python程序方法总结(最全最详细) -------------------------------------------------------------------------------- /Java基础/java 访问控制.md: -------------------------------------------------------------------------------- 1 | Java 访问控制 2 | --- 3 | 1. 主要研究讨论了Java的主要的访问控制符:public、private、protected、default 4 | 2. 常见场景:内部访问、继承关系、同包、不同包 5 | 6 | 7 | 8 | - [1. 内部访问](#1-内部访问) 9 | - [2. 同包](#2-同包) 10 | - [2.1. 非继承关系](#21-非继承关系) 11 | - [2.2. 继承关系](#22-继承关系) 12 | - [3. 不同包](#3-不同包) 13 | - [3.1. 非继承关系](#31-非继承关系) 14 | - [3.2. 继承关系](#32-继承关系) 15 | - [4. 对于default的单独说明](#4-对于default的单独说明) 16 | - [5. 访问控制表](#5-访问控制表) 17 | - [6. 参考](#6-参考) 18 | 19 | 20 | 21 | # 1. 内部访问 22 | 1. 所有访问控制权限都可以进行访问 23 | 24 | # 2. 同包 25 | 26 | ## 2.1. 非继承关系 27 | 1. 同包protected和default都满足同包中非子类访问 28 | 29 | ## 2.2. 继承关系 30 | 1. 在同包情况下,子类可以访问父类除private以外的访问类型的属性和方法 31 | 32 | # 3. 不同包 33 | 34 | ## 3.1. 非继承关系 35 | 1. 不能满足protected和default的访问 36 | 37 | ## 3.2. 继承关系 38 | 1. 在不同包情况下,子类可以访问父类中protected和public的部分(default不可以) 39 | 40 | # 4. 对于default的单独说明 41 | 1. default也不能被其他包的子类访问,所以default不能被其他包中的类访问(无论是否子类) 42 | 43 | # 5. 访问控制表 44 | | | private | default | protected | public | 45 | | ------------ | ------- | ------- | --------- | ------ | 46 | | 同一类 | √ | √ | √ | √ | 47 | | 同一包中的类 | | √ | √ | √ | 48 | | 子类 | | | √ | √ | 49 | | 其他包中的类 | | | | √ | 50 | 51 | # 6. 参考 52 | 1. java四种访问控制权限的总结 -------------------------------------------------------------------------------- /Java基础/java 语法糖.md: -------------------------------------------------------------------------------- 1 | Java 语法糖 2 | --- 3 | 4 | # 1. Java判断字符串你是否全为汉字 5 | ```java 6 | String str1 = "java判断是否quan为汉字"   7 | String str2 = "全为汉字"   8 | String reg = "[\\u4e00-\\u9fa5]+"   9 | boolean result1 = str1.matches(reg)//false   10 | boolean result2 = str2.matches(reg)//true 11 | ``` 12 | 13 | 1. 参考:Java判断字符串全是汉字 -------------------------------------------------------------------------------- /Java进阶/img/volatile/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Java进阶/img/volatile/1.png -------------------------------------------------------------------------------- /Java进阶/img/volatile/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Java进阶/img/volatile/2.png -------------------------------------------------------------------------------- /Java进阶/java Predicate&Stream.md: -------------------------------------------------------------------------------- 1 | java Predicate & Stream 2 | --- 3 | 1. java8学习之BiFunction函数式接口实例演示&Predicate函数式接口详解 -------------------------------------------------------------------------------- /Java进阶/java Session.md: -------------------------------------------------------------------------------- 1 | # 1. Session介绍 2 | 1. 在WEB开发中,服务器可以为每个用户浏览器创建一个会话对象(Session对象) 3 | 2. 一个浏览器独占一个session对象,所以需要保存用户数据时,服务器程序可以把用户数据写到浏览器独占的session中,写出时可以在session中取出用户数据。 4 | 5 | # 2. Session和Cookie的主要区别 6 | + Cookie把用户的数据写给用户的浏览器。 7 | + Session技术把用户的数据写到数据独用的Session中 8 | + Session对象由服务器创建,开发人员调用request对象的getSession方法得到session对象。 9 | 10 | # 3. Session实现原理 11 | 12 | ## 3.1. 服务器如何实现一个session为一个用户浏览器服务的? 13 | 1. 服务器创建session出来,将session的id号,以cookie的形式写回客户机。 14 | 15 | ## 3.2. session对象的创建和销毁时机 16 | 17 | ### 3.2.1. session对象的创建时机 18 | 1. 程序中第一次调用request.getSession()方法时会创建一个session,可以用isNew()方法来判断session是不是新创建的 19 | 20 | ### 3.2.2. session对象的销毁时机 21 | 1. session对象默认30分钟没有使用,服务器会自动销毁session,在web.xml文件中可以手动配置session的失效时间 -------------------------------------------------------------------------------- /Java进阶/java TimeUnit.md: -------------------------------------------------------------------------------- 1 | Java TimeUnit 2 | --- 3 | >所属包:`java.utils.concurrent .TimeUnit ` 4 | 5 | # 1. TimeUnit 和 阻塞线程 6 | 1. TimeUnit帮助指定睡眠时间长度 7 | 2. 支持指定`DAYS`、`HOURS`、`MINUTES`、`SECONDS`、`MILLISECONDS`和`NANOSECONDS` 8 | 3. 是Java中使用枚举场景非常出色的例子 9 | 10 | ```java 11 | TimeUnit.MINUTES.sleep(4); // sleeping for 4 minutes 12 | TimeUnit.SECONDS.sleep(5) //线程休眠5秒 13 | ``` 14 | 15 | # 2. TimeUnit 和 时间转换 16 | ```java 17 | //关于秒的常用方法 18 | TimeUnit.SECONDS.toMillis(1) //1秒转换为毫秒数 19 | TimeUnit.SECONDS.toMinutes(60) //60秒转换为分钟数 20 | TimeUnit.SECONDS.convert(1, TimeUnit.MINUTES) //1分钟转换为秒数 21 | 22 | //TimeUnit.DAYS 日的工具类 23 | //TimeUnit.HOURS 时的工具类 24 | //TimeUnit.MINUTES 分的工具类 25 | //TimeUnit.SECONDS 秒的工具类 26 | //TimeUnit.MILLISECONDS 毫秒的工具类 27 | ``` -------------------------------------------------------------------------------- /Java进阶/java stl.md: -------------------------------------------------------------------------------- 1 | Java STL JDK内部具体实现的解释 2 | --- 3 | 4 | 1. Java容器之HashSet、LinkedHashSet、TreeSet源码分析(不敢称东半球最好,只称东半球最好理解) -------------------------------------------------------------------------------- /Java进阶/java 外部扩展库.md: -------------------------------------------------------------------------------- 1 | java_外部扩展库 2 | --- 3 | 4 | # 1. JSON与JAVA 5 | 6 | ## 1.1. Java将对象序列化存储成为String 7 | 8 | ```java 9 | public void JsonToString(){ 10 | //就是即将被序列化的对象 11 | Object oject = new Object(); 12 | //核心对象 13 | ObjectMapper mapper = new ObjectMapper(); 14 | //将对象进行序列化 15 | String json = mapper.writeValueAsString(object); 16 | } 17 | ``` 18 | 19 | ## 1.2. 参考 20 | 1. 如何将java对象转换成JSON数据 -------------------------------------------------------------------------------- /Java进阶/java 泛型.md: -------------------------------------------------------------------------------- 1 | java_泛型 2 | --- 3 | 4 | 5 | - [1. 什么是泛型](#1-什么是泛型) 6 | - [2. 特性](#2-特性) 7 | - [3. 泛型的使用](#3-泛型的使用) 8 | - [3.1. 泛型类](#31-泛型类) 9 | - [3.2. 泛型接口](#32-泛型接口) 10 | - [4. 参考网页](#4-参考网页) 11 | 12 | 13 | # 1. 什么是泛型 14 | 1. 泛型:即参数化类型。 15 | 2. 其本质是为了参数化类型(在不创建新的类型的情况下,通过泛型指定的不同类型来控制形参来控制形参具体限制的类型) 16 | 3. 泛型可以让部分错误在编译阶段可以被发现。 17 | 18 | # 2. 特性 19 | 1. 泛型只在编译阶段是有效的,在编译之后,程序会采取泛型化的措施 20 | 2. 总而言之:泛型类型在逻辑上可以看成十多个不同的类型,但实际上都是相同的基本类型。 21 | 22 | # 3. 泛型的使用 23 | 1. 三种使用方式:泛型化、泛型接口和泛型方法 24 | 25 | ## 3.1. 泛型类 26 | 1. 泛型类型用于类的定义中,被称为泛型类。通过泛型可以完成对一组类的操作对外开放相同的接口。 27 | 2. 相应的泛型类的例子:list、Set、Map。 28 | 3. 泛型类的最基本写法: 29 | ```java 30 | class 类名称 <泛型标识:可以随便写任意标识号,标识指定的泛型的类型>{ 31 | private 泛型标识 /*(成员变量类型)*/ var; 32 | ..... 33 | 34 | } 35 | } 36 | ``` 37 | 4. 基本的泛型类的示例: 38 | ```java 39 | //此处T可以随便写为任意标识,常见的如T、E、K、V等形式的参数常用于表示泛型 40 | //在实例化泛型类时,必须指定T的具体类型 41 | public class Generic{ 42 | //key这个成员变量的类型为T,T的类型由外部指定 43 | private T key; 44 | 45 | public Generic(T key) { //泛型构造方法形参key的类型也为T,T的类型由外部指定 46 | this.key = key; 47 | } 48 | 49 | public T getKey(){ //泛型方法getKey的返回值类型为T,T的类型由外部指定 50 | return key; 51 | } 52 | } 53 | ``` 54 | 5. 泛型类:泛型的时候传入泛型实参,则会根据传入的泛型实参做相应的限制,这时候才会应起到的限制作用。 55 | 56 | ## 3.2. 泛型接口 57 | 1. 泛型接口与泛型类的定义及使用基本相同。 58 | ```java 59 | //定义一个泛型接口 60 | public interface Generator { 61 | public T next(); 62 | } 63 | ``` 64 | 65 | # 4. 参考网页 66 | 67 | 详解java泛型 -------------------------------------------------------------------------------- /Jenkins/img/install/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/1.png -------------------------------------------------------------------------------- /Jenkins/img/install/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/2.png -------------------------------------------------------------------------------- /Jenkins/img/install/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/3.png -------------------------------------------------------------------------------- /Jenkins/img/install/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/4.png -------------------------------------------------------------------------------- /Jenkins/img/install/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/5.png -------------------------------------------------------------------------------- /Jenkins/img/install/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/6.png -------------------------------------------------------------------------------- /Jenkins/img/install/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/7.png -------------------------------------------------------------------------------- /Jenkins/img/install/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/8.png -------------------------------------------------------------------------------- /Jenkins/img/install/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Jenkins/img/install/9.png -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2020 stormbroken(ZhangHongYin) 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. -------------------------------------------------------------------------------- /Maven/管理配置依赖.md: -------------------------------------------------------------------------------- 1 | 管理配置依赖 2 | --- 3 | 4 | # 1. 通过pom文件管理 5 | 可以通过创建pom.xml文件,在之中的``添加``完成依赖添加 6 | 7 | # 2. 手动安装jar包到本地仓库 8 | 1. 命令:`mvn install:install-file -Dfile={name of jar} -DgroupId={groupId} -DartifactId={artifactId} -Dversion={version} -Dpackaging=jar` 9 | 2. 引用方式:手动安装后,就可以通过在pom.xml文件中配置来完成引用。 10 | 11 | # 3. 参考文献 12 | 1. maven如何将本地jar安装到本地仓库 -------------------------------------------------------------------------------- /MySQL/MySQL 事务.md: -------------------------------------------------------------------------------- 1 | MYSQL 事务 2 | --- 3 | 4 | # 1. 事务回滚 ROLLBACK 5 | 1. 事务回滚只能使用于DML,不适用于DDL 6 | 2. ROLLBACK适用于事务回滚。 7 | 8 | ## 1.1. 开始事务 9 | `START TRANSACTION` | `BEGIN` 10 | 11 | ## 1.2. 提交事务 12 | `COMMIT` 13 | 14 | ## 1.3. 回滚事务 15 | `ROLLBACK` 16 | 17 | ## 1.4. 使用情景 18 | 1. 执行大量的UPDATE和DELETE时,一定要使用事务。 19 | 20 | # 2. 参考 21 | 1. MySQL的rollback--事务回滚 -------------------------------------------------------------------------------- /MySQL/MySQL 学习笔记.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 数据库定义](#1-数据库定义) 4 | - [2. RDBMS](#2-rdbms) 5 | - [2.1. RDMBS术语](#21-rdmbs术语) 6 | 7 | 8 | # 1. 数据库定义 9 | 数据库是按照数据结构来组织、存储和管理数据的仓库。 10 | 11 | # 2. RDBMS 12 | 1. 我们使用*关系型数据库管理系统(RDBMS)*来存储和管理大量数据。 13 | >1. 数据以表格形式出现 14 | >2. 每行为各种记录名称 15 | >3. 每列为记录名称所对应的数据域 16 | >4. 许多行和列构成一张表 17 | >5. 若干的表单组成database 18 | 19 | ## 2.1. RDMBS术语 20 | 术语|解释 21 | --|-- 22 | 数据库|一些关联表的集合 23 | 数据表|表示数据的矩阵 24 | 列|包含有相同的数据 25 | 行|是一组相关的数据 26 | 冗余|存储两倍的信息,降低了性能,但提高了数据的安全性 27 | 主键|唯一性,一个数据表中只能包含一个主键,可以用于查询数据 28 | 外键|用于关联两个表 29 | 复合键|将多个列为一个索引键,常用于复合索引 30 | 索引|用于快速访问数据库表中的特定信息 31 | 参照完整性|要求关系中不允许引用不存在的实体 32 | 表头|每一列的名称 33 | 列|具有相同数据类型的数据的集合 34 | 行|用于描述某条记录的具体信息 35 | 值|行的具体信息,每个键必须与该列的数据类型相同 36 | 键|键的值在当前列中具有唯一性 -------------------------------------------------------------------------------- /MySQL/MySQL 懒加载.md: -------------------------------------------------------------------------------- 1 | MySQL 2 | --- 3 | 1. 通过编写SQL语句实现一页只显示10条记录 4 | ```sql 5 | Select * from 6 | (Select * from comment where cid = #{cid} and tid = -1 order by createTime DESC) as c 7 | limit #{page},10 8 | # 这里是指从page开始的10条记录 9 | ``` -------------------------------------------------------------------------------- /MySQL/MySQL 数据备份.md: -------------------------------------------------------------------------------- 1 | MySQL 数据备份 2 | --- 3 | 4 | 5 | 6 | - [1. 备份命令](#1-备份命令) 7 | - [2. 备份压缩](#2-备份压缩) 8 | - [3. 备份数据库结构(无数据)](#3-备份数据库结构无数据) 9 | - [4. 备份一个库多个表](#4-备份一个库多个表) 10 | - [5. 同时备份多个库](#5-同时备份多个库) 11 | - [6. 备份实例上的所有数据库](#6-备份实例上的所有数据库) 12 | - [7. 备份数据出删除数据库或者表的sql备份](#7-备份数据出删除数据库或者表的sql备份) 13 | - [8. 参考](#8-参考) 14 | 15 | 16 | 17 | # 1. 备份命令 18 | `mysqldump -h主机名 -p端口 -u用户名 -p密码 --database 数据库名 > 文件名.sql` 19 | 20 | # 2. 备份压缩 21 | 1. 如果导出的数据有可能会比较大,不方便进行远程备份 22 | 2. `mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 | gzip > 文件名.sql.gz` 23 | 24 | # 3. 备份数据库结构(无数据) 25 | `mysqldump -h主机名 -P端口 -u用户名 -p密码 --no-data 数据库名1 数据库名2 数据库名3 > 文件名.sql` 26 | 27 | # 4. 备份一个库多个表 28 | `mysqldump -h主机名 -P端口 -u用户名 -p密码 --database 数据库名 表1 表2 .... > 文件名.sql` 29 | 30 | # 5. 同时备份多个库 31 | `mysqldump -h主机名 -P端口 -u用户名 -p密码 --databases 数据库名1 数据库名2 数据库名3 > 文件名.sql` 32 | 33 | # 6. 备份实例上的所有数据库 34 | `mysqldump -h主机名 -P端口 -u用户名 -p密码 --all-databases > 文件名.sql` 35 | 36 | # 7. 备份数据出删除数据库或者表的sql备份 37 | `mysqldump -h主机名 -P端口 -u用户名 -p密码 --add-drop-table --add-drop-database 数据库名 > 文件名.sql` 38 | 39 | # 8. 参考 40 | 1. -------------------------------------------------------------------------------- /MySQL/MySQL 数据库规范.md: -------------------------------------------------------------------------------- 1 | MySQL 数据库规范 2 | --- 3 | MySQL 数据库规范 -------------------------------------------------------------------------------- /MySQL/MySQL 时间.md: -------------------------------------------------------------------------------- 1 | MYSQL 时间 2 | --- 3 | 4 | # 1. 将日期转化为字符串 5 | 1. `select date_format(time, '%Y-%m-%d %H:%i:%s') from info # 2020-08-22 21:03:21` 6 | 2. MYSQL将日期转为字符串 7 | 8 | # 2. 如何将datatime格式的数据转换为时间戳 9 | `UNIX_TIMESTAMP(param)` -------------------------------------------------------------------------------- /MySQL/MySQL 正则表达式.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 正则表达式](#1-正则表达式) 4 | - [2. 实例](#2-实例) 5 | - [3. 参考](#3-参考) 6 | 7 | 8 | 9 | # 1. 正则表达式 10 | 1. 同样的,我们也可以在sql中匹配的时候使用正则表达式。 11 | 2. 正则表达式语法见参考外链。 12 | 3. 关键字:`REGEXP` 13 | 14 | # 2. 实例 15 | ```sql 16 | # 查找name中以st为开头的所有数据 17 | SELECT name FROM person_tbl WHERE name REGEXP '^st'; 18 | # 查找name中以ok为结尾的所有数据 19 | SELECT name FROM person_tbl WHERE name REGEXP 'ok$'; 20 | # 查找name字段中包含mar字符段的所有数据 21 | SELECT name FROM person_tbl WHERE name REGEXP 'mar'; 22 | # 查找name中以元音字符开头或以ok字符串结尾的所有数据 23 | SELECT name FROM person_tbl WHERE name REGEXP '^[aeiou]|ok$'; 24 | ``` 25 | 26 | # 3. 参考 27 | 正则表达式 -------------------------------------------------------------------------------- /MySQL/MySQL 用户管理.md: -------------------------------------------------------------------------------- 1 | MySQL 用户管理 2 | --- 3 | > 随着深入,MySQL可以通过用户管理完成对内部数据的访问控制。 4 | 5 | # 1. 新建用户 6 | > CREATE USER 'username'@'localhost' IDENTIFIED BY 'password'; 7 | 8 | 1. 用户名称:`username` 9 | 2. 登录主机:`localhost`,可以替换成具体的IP地址,全部允许:`%` 10 | 3. 口令:`password` 11 | 12 | # 2. 删除用户 13 | > DROP USER username@'localhost'; 14 | 15 | # 3. 为用户分配权限 16 | 17 | ## 3.1. 具体数据库权限 18 | > grant all privileges on \`test_db\`.* to 'username'@'localhost'; 19 | 20 | 1. 授权给用户username,数据库test_db相关的所有权限,并且该用户username在所有网络IP上都有权限,%是指没有网络限制 21 | 2. 权限可以细分为:`SELECT`,`INSERT`,`UPDATE`,`DELETE`,`CREATE`,`DROP`,更多权限见参考二 22 | 23 | ## 3.2. 刷新权限 24 | > flush privileges; 25 | 26 | ## 3.3. 授予管理员权限 27 | > grant all privileges on \*.\* to 'username'@'password' IDENTIFIED BY 'password' with grant option; 28 | 29 | 1. \*.\* 30 | 1. 第一个\*表示是所有数据库 31 | 2. 第二个\*表示是所有数据表 32 | 2. `with grant option`是指允许用户username,传递其拥有的权限给其他的用户 33 | 34 | # 4. 收回用户权限 35 | > revoke grant option on *.* from username; 36 | 37 | # 5. 查看某个用户的权限 38 | > show grants for username@localhost; 39 | 40 | # 6. 查看用户表 41 | > SELECT * FROM mysql.\`user\` 42 | 43 | # 7. 参考 44 | 1. mysql数据库怎么新建用户 45 | 2. MySQL 新建用户,为用户授权,指定用户访问数据库 -------------------------------------------------------------------------------- /MySQL/MySQL 索引.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 索引](#1-索引) 4 | - [1.1. 分类:](#11-分类) 5 | - [1.1.1. 普通索引](#111-普通索引) 6 | - [1.1.2. 唯一索引](#112-唯一索引) 7 | - [1.2. 联合索引](#12-联合索引) 8 | - [2. 索引操作](#2-索引操作) 9 | - [2.1. 查看索引](#21-查看索引) 10 | - [2.2. 调整索引结构](#22-调整索引结构) 11 | - [2.3. 删除索引](#23-删除索引) 12 | 13 | 14 | 15 | # 1. 索引 16 | 17 | 1. 索引可以大大提高MySQL的检索速度,但是会占用磁盘中的索引文件 18 | 19 | ## 1.1. 分类: 20 | 1. 单列索引 21 | 2. 组合索引 22 | 23 | ### 1.1.1. 普通索引 24 | 语法|作用 25 | ----|--- 26 | `CREATE INDEX indexName ON mytable(username(length)); `|创建索引方式一,如果是CHAR,VARCHAR类型,length可以小于字段实际长度;如果是BLOB和TEXT类型,必须指定 length。 27 | `ALTER table tableName ADD INDEX indexName(columnName)`|添加索引 28 | 代码块1|添加索引,在创建表的时候直接指定索引。 29 | `DROP INDEX [indexName] ON mytable; `| 30 | 删除索引 31 | **代码块1** 32 | ```SQL 33 | CREATE TABLE mytable( 34 | ID INT NOT NULL, 35 | username VARCHAR(16) NOT NULL, 36 | INDEX [indexName] (username(length)) 37 | ); 38 | ``` 39 | 40 | ### 1.1.2. 唯一索引 41 | 1. 特点:列的值唯一,但是允许有空值。如果是组合索引,则列值的组合必须唯一。 42 | 2. 语法 43 | 语法|作用 44 | --|-- 45 | `CREATE UNIQUE INDEX indexName ON mytable(username(length)) `|创建索引 46 | `ALTER table mytable ADD UNIQUE [indexName] (username(length))`|修改表结构 47 | 代码块2|创建表的时候直接指定索引 48 | **代码块2** 49 | ```SQL 50 | CREATE TABLE mytable( 51 | ID INT NOT NULL, 52 | username VARCHAR(16) NOT NULL, 53 | UNIQUE [indexName] (username(length)) 54 | ); 55 | ``` 56 | 57 | ## 1.2. 联合索引 58 | 1. 使用联合索引来提高索引速度 59 | 2. 标准格式:`EXPLAIN SELECT* FROM sth WHERE sth AND sth...` 60 | 3. 理解: 61 | 1. 利用索引中的附加列,我们可以所想搜索的范围,但是用一个具有两列的索引,不同于使用两个单独的索引。 62 | 2. 复合索引的结构与电话簿相似,因此在创建复合索引时,应该仔细考虑列的顺序,对索引中的所有列执行搜索或仅对前几列执行搜索时,复合索引非常有用,仅对后面的任意列执行搜索时,复合索引则没有用处。 63 | 3. 注意:多个单列索引在多条件查询时只会生效第一个索引,所以联合查询时,我们最好建立联合索引 64 | 4. 最左前缀原则: 65 | 1. 以最左边的为起点的任何连续的索引都可以被匹配上 66 | 2. 一般在建立联合索引的时候,我们将where子句中使用的最频繁的一列放在最左边,增强扩展性 67 | 5. 联合索引的本质:如果建立(a,b,c)的联合索引的,相当于建立了(a)的单列索引、(a,b)的联合索引、(a,b,c)的联合索引。 68 | 6. 如果WHERE中条件时OR的情况下,加索引没有作用。 69 | 7. 联合索引比对每个列分别建立索引更有优势,索引越多,那么占据的磁盘空间就越大,更新数据就会变慢,应将严格的索引放在前面,这样子筛选的力度会更大,效率更高。 70 | 71 | # 2. 索引操作 72 | 73 | ## 2.1. 查看索引 74 | `show index from mytable;//mytable是表名` 75 | 76 | ## 2.2. 调整索引结构 77 | 1. 使用ALTER命令添加和删除索引 78 | 有四种方式添加索引: 79 | + `ALTER TABLE tbl_name ADD PRIMARY KEY (column_list)`:该语句添加一个主键,这意味着索引值必须是唯一的,且不能为NULL。 80 | + `ALTER TABLE tbl_name ADD UNIQUE index_name (column_list)`:这条语句创建索引的值必须是唯一的(除了NULL外,NULL可能会出现多次)。 81 | + `ALTER TABLE tbl_name ADD INDEX index_name (column_list)`:添加普通索引,索引值可出现多次。 82 | + `ALTER TABLE tbl_name ADD FULLTEXT index_name (column_list)`:该语句指定了索引为 FULLTEXT ,用于全文索引。 83 | 2. 注意: 84 | 1. 在创建索引是要确定索引是应用于WHERE语句的条件,索引也是一个表,类似于指针 85 | 86 | ## 2.3. 删除索引 87 | 1. 用来删除唯一索引:`alter table table_name drop index index_name;` -------------------------------------------------------------------------------- /MySQL/MySQL 表.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 临时表](#1-临时表) 4 | - [2. 复制表](#2-复制表) 5 | - [2.1. 元数据](#21-元数据) 6 | - [2.2. 序列](#22-序列) 7 | - [2.3. 重复数据](#23-重复数据) 8 | - [2.4. 导出数据](#24-导出数据) 9 | - [2.5. 导入数据](#25-导入数据) 10 | - [2.6. explain 查询搜索计划](#26-explain-查询搜索计划) 11 | 12 | 13 | # 1. 临时表 14 | 1. 用于保存一些临时数据时是非常有用的,临时表只在当前链接可见。 15 | 2. 删除:`DROP TABLE` 16 | 17 | # 2. 复制表 18 | 1. 用于完整的复制MYSQL的数据表,包含标的结构,索引,默认值等。 19 | 2. 基本步骤: 20 | 1. 获取创建数据表语句:`SHOW CREATE TABLE`:包含原数据表的结构,索引等。 21 | 2. 复制一下命令现实的SQL语句,修改数据表表名,并执行SQL语句,通过以上命令将 22 | 23 | ## 2.1. 元数据 24 | 25 | 命令|描述 26 | --|-- 27 | `SELECT VERSION()`|服务器版本信息 28 | `SELECT DATABASE()`|当前数据库名(或者返回空) 29 | `SELECT USER()`|当前用户名 30 | `SHOW STATUS`|服务器状态 31 | `SHOW VARIABLES`|服务器配置变量 32 | 33 | ## 2.2. 序列 34 | 1. 一张数据表只能有一个字段自增主键,如果你想实现别的字段的自动增加,就可以使用序列 35 | 2. 使用方法 36 | `AUTO_INCREMENT `用于定义列的序列的开始,可以在创建表的时候写在引擎后面也可以在创建表后进行修改。 37 | 38 | ## 2.3. 重复数据 39 | 1. 防止出现重复数据: 40 | 把某些字段声明为`PRIMARY KEY(主键)`或者`UNIQUE(唯一)`来保证某一个字段的唯一性。 41 | >双主键需要保证那个键值不为null 42 | 2. 统计重复数据的步骤 43 | + 确定哪一行的数据有可能重复 44 | + 在列选择列表使用COUNT(*)列出的那些列 45 | + 在GROUP BY子句中列出的列 46 | + HAVING子句设置重复数大于1 47 | 实例: 48 | ```SQL 49 | SELECT COUNT(*) as repetitions, last_name, first_name 50 | FROM person_tbl 51 | GROUP BY last_name, first_name 52 | HAVING repetitions > 1; 53 | ``` 54 | 3. 过滤重复数据 55 | 1. 如果你需要读取不重复的数据可以在 SELECT 语句中使用 DISTINCT 关键字来过滤重复数据。 56 | 实例: 57 | ```SQL 58 | SELECT DISTINCT last_name, first_name 59 | FROM person_tbl; 60 | ``` 61 | 2. 使用GROUP BY 62 | 实例: 63 | ```SQL 64 | SELECT last_name, first_name 65 | FROM person_tbl 66 | GROUP BY (last_name, first_name); 67 | ``` 68 | 4. 删除重复数据 69 | 1. 实例: 70 | ```SQL 71 | CREATE TABLE tmp SELECT last_name, first_name, sex FROM person_tbl GROUP BY (last_name, first_name, sex); 72 | DROP TABLE person_tbl; 73 | ALTER TABLE tmp RENAME TO person_tbl; 74 | ``` 75 | 2. 使用索引和主键: 76 | ```SQL 77 | ALTER IGNORE TABLE person_tbl 78 | ADD PRIMARY KEY (last_name, first_name); 79 | ``` 80 | 81 | ## 2.4. 导出数据 82 | `SELECT...INTO OUTFILE "filename"`: 83 | 1. 用于导出数据,其中filename为写入的文件,要求FILE权限。 84 | 2. 输出不能是一个已存在的文件,防止文件数据被篡改。 85 | 86 | ## 2.5. 导入数据 87 | `LOAD DATA INFILE filename INTO TABLE tablename` 88 | 89 | SQL函数 90 | SQL运算符 91 | 92 | ## 2.6. explain 查询搜索计划 93 | 94 | **注意** 95 | 1. SQL对于大小写不敏感 96 | 2. null值的处理: 97 | >1. IS NULL:如果行值为null,返回true 98 | >2. IS NOT NULL:如果行值不为null,返回true 99 | >3. <=>:如果比较的两个值为null是返回true 100 | >4. 可以设定null初值,如果不设置的话就是null 101 | -------------------------------------------------------------------------------- /MySQL/MySQL 部分错误.md: -------------------------------------------------------------------------------- 1 | SQL的部分错误 2 | --- 3 | 4 | 5 | 6 | - [1. 缺省值问题](#1-缺省值问题) 7 | - [2. 语法问题](#2-语法问题) 8 | - [3. 插入语句失败问题](#3-插入语句失败问题) 9 | - [4. 语句中存放emoji表情失败的问题](#4-语句中存放emoji表情失败的问题) 10 | 11 | 12 | 13 | # 1. 缺省值问题 14 | >ERROR 1101 (42000): BLOB/TEXT column can’t have a default value 15 | 1. 问题背景:写SQL语句,创建库的时候设置DEFAULT中有不当值。 16 | 2. mysql 报错 ERROR 1101 17 | 18 | # 2. 语法问题 19 | >Caused by: java.sql.SQLSyntaxErrorException: You have an error in your SQL syntax; check the manual that corresponds to your MySQL server version for the right syntax to use near 'interval, is_loop, remarks, standard_id' at line 1 20 | 1. 问题背景:在数据库后,使用spring框架注入时出现问题 21 | 2. 问题解决:因为数据库列的名字和SQL中保留字发生冲突 22 | + 比如:like 23 | 24 | # 3. 插入语句失败问题 25 | >在我们使用mybatis框架下的插入语句的时候,我们发现无法进行插入,此时我们进行查找资料发现,condition作为列名是我们的MYSQL的保留字。 26 | 1. 解决方案:我们调整数据库列的名字不为SQL的保留字。 27 | 2. 比如:`order`、`rank` 28 | 29 | # 4. 语句中存放emoji表情失败的问题 30 | 1. 将对应字段的排序规则修改为:`utf8mb4_general_ci` 31 | 2. 将连接数据库的charset修改成:`utf8mb4` -------------------------------------------------------------------------------- /MySQL/img/procedure/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/MySQL/img/procedure/1.png -------------------------------------------------------------------------------- /MySQL/img/procedure/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/MySQL/img/procedure/2.png -------------------------------------------------------------------------------- /MySQL/img/procedure/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/MySQL/img/procedure/3.png -------------------------------------------------------------------------------- /MySQL/服务器端的数据库操作.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 服务器端执行sql脚本](#1-服务器端执行sql脚本) 4 | - [2. 查看数据库的相关信息](#2-查看数据库的相关信息) 5 | - [3. 参考](#3-参考) 6 | 7 | 8 | 9 | # 1. 服务器端执行sql脚本 10 | 1. 首先登陆进入数据库 11 | 2. 在Mysql控制台使用`source file_name`完成执行 12 | 13 | # 2. 查看数据库的相关信息 14 | 1. 以下命令是在`mysql >`下实行的部分 15 | 2. 查看数据库脚本的命令:`select @@version` 16 | 3. 查看数据库状态信息:`status` 17 | 4. 查看数据库当前连接数:`show status like '%thread_connected%';` 18 | 5. 查看当前最大连接数量:`show status like '%max_connections%'` 19 | 6. 查看默认编码信息:`show variable like '%char%'` 20 | 7. 查看超时、延时时间:`show varibale like '%timeout%'` 21 | 8. 查看缓存情况:`show status like '%cache%'` 22 | 9. 查看日志启动情况:`show variables like log_%` 23 | 24 | # 3. 参考 25 | 1. MySQL数据库常用命令大全 -------------------------------------------------------------------------------- /MySQL/高性能 MySQL/img/charpter1/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/MySQL/高性能 MySQL/img/charpter1/1.png -------------------------------------------------------------------------------- /MySQL/高性能 MySQL/img/charpter1/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/MySQL/高性能 MySQL/img/charpter1/2.png -------------------------------------------------------------------------------- /Neo4j/Neo4j Cypher.md: -------------------------------------------------------------------------------- 1 | Neo4j Cpyher 2 | --- 3 | Neo4j Cpyher是对该数据库进行操作的重要的语言,推荐如下几个阅读链接: 4 | 5 | 1. W3CSchool 6 | 2. Neo4j Cpyher where和return 7 | 3. Cypher的函数、模式、查询调优和执行计划 -------------------------------------------------------------------------------- /Neo4j/Neo4j Python操作.md: -------------------------------------------------------------------------------- 1 | Python 操作 Neo4j 2 | --- 3 | 4 | # 1. 相关Python的依赖库 5 | ```py 6 | import py2neo 7 | # or 8 | from py2neo import Graph, Node, Relationship, PropertyDict ... 9 | ``` 10 | 11 | - 查看py2neo的版本:`py2neo.__version__` 12 | 13 | # 2. 数据库连接 14 | ```py 15 | graph = Graph(host="127.0.0.1", auth=('username', 'password')) 16 | ``` 17 | 18 | # 3. 节点 19 | 20 | ## 3.1. 创建节点 21 | ```py 22 | node = Node("Node_Class", name="Node_Name", id="Node Id", ...) # properties in key-value form. 23 | # create the node 24 | graph.create(node) 25 | ``` 26 | 27 | ## 3.2. 匹配节点 28 | 29 | ### 3.2.1. 使用match查找匹配节点 30 | ```py 31 | # get node from node list 32 | graph.nodes[1] 33 | graph.nodes.get[1] 34 | # get node after match 35 | graph.match("Node_Class", name="Node_Name") 36 | graph.match("Node_Class", name="Node_Name").first() 37 | ``` 38 | 39 | ### 3.2.2. 使用Cypher查询 40 | ```py 41 | graph.run("MATCH(a: Node_Class) RETURN a.name").data() 42 | ``` 43 | 44 | ### 3.2.3. 使用Node Matching 45 | ```py 46 | matcher = NodeMatcher(graph) 47 | nodes = matcher.match(name="Node_Name").first() 48 | # 找到所有名字以Node开头的节点 49 | nodes = matcher.match().where("_.name=~'Node.*'") 50 | # 上述结果再根据name排序 51 | nodes = matcher.match().where("_.name=~'Node.*'").order_by("_.name") 52 | # 限制返回5条结果 53 | nodes = matcher.match().where("_.name=~'Node.*'").order_by("_.name").limit(5) 54 | ``` 55 | 56 | # 4. 关系 57 | 58 | ## 4.1. 创建关系 59 | ```py 60 | node1 = Node("Node_Class", name="Node_Name", id="Node Id", ...) 61 | node2 = Node("Node_Class", name="Node_Name", id="Node Id", ...) 62 | relation = Relationship(node1, 'relation_type', node2) 63 | # 添加关系的值 64 | relation["field"] = value 65 | graph.create(relation) 66 | ``` 67 | 68 | ## 4.2. 匹配关系 69 | ```py 70 | matcher = RelationMatcher(graph) 71 | # 查找所有关系 72 | relations = matcher.match() 73 | # 根据类型查找关系 74 | relations = matcher.match(r_type="type") 75 | # 将结果集进行排序 76 | relations = matcher.match(r_type="type").order_by() 77 | # 限制返回5条结果 78 | relations = matcher.match(r_type="type").order_by().limit(5) 79 | ``` 80 | 81 | # 5. 快速使用事务创建图 82 | ```py 83 | # 使用Subgraph, nodes和relations是对应的列表 84 | subgraph = Subgraph(nodes, relations) 85 | graph.create(subgraph) 86 | ``` 87 | 88 | # 6. 参考 89 | 1. python通过py2neo模块操作Neo4j图数据库 -------------------------------------------------------------------------------- /Neo4j/Neo4j 高级.md: -------------------------------------------------------------------------------- 1 | Neo4j 高级 2 | --- 3 | 4 | # 1. 索引的创建与删除 5 | ```cypher 6 | CREATE INDEX ON :LABEL_NAME(property) 7 | DROP INDEX ON :LABEL_NAME(property) 8 | ``` 9 | 10 | # 2. 如何清空Property Keys(V 3.5) 11 | 1. 我们使用数据清空命令后仅仅能清空数据,但是不能清空Property Keys 12 | 2. 我们只能通过暂停服务,然后到Neo4j的/data/databases路径下删除对应的graph.db命令来删除 13 | 14 | # 3. 快速数据导入(CSV文件导入) 15 | 1. Neo4j各种导入方式 16 | 2. CSV文件导入数据 -------------------------------------------------------------------------------- /Python/Python Flask/Flask HTTP.md: -------------------------------------------------------------------------------- 1 | Flask HTTP 2 | --- 3 | 4 | # 1. request 5 | 1. request:flask中代表请求的request对象 6 | 2. 作用:在视图函数中取出本次请求数据 7 | 3. 包:`from flask import request` 8 | 9 | ## 1.1. 常用属性 10 | | 属性 | 说明 | 类型 | 11 | | ------- | ------------------------ | -------------- | 12 | | data | 请求的数据,转换为字符串 | * | 13 | | form | 记录请求中的表单数据 | MultiDict | 14 | | args | 记录请求中的查询参数 | MultiDict | 15 | | cookies | 记录请求中的cookie信息 | Dict | 16 | | headers | 记录请求中的请求头 | EnvironHeaders | 17 | | method | 记录请求使用的HTTP方法 | GET/POST | 18 | | url | 记录请求的URL地址 | string | 19 | | files | 记录请求上传的文件 | * | 20 | | json | 记录请求的json数据 | json | 21 | 22 | ## 1.2. 应用 23 | ```py 24 | """获取客户端的请求""" 25 | @app.route("/request") 26 | def req1(): 27 | # http://127.0.0.1:5000/request?a=1&b=2 28 | query_string = request.args 29 | print(query_string) # ImmutableMultiDict([('a', '1'), ('b', '2')]) 30 | 31 | # http://127.0.0.1:5000/request?username=abcd 32 | username = request.args.get("username") 33 | print(username) # abcd 34 | 35 | # http://127.0.0.1:5000/request?username=xiaoming&love=吹牛&love=睡觉 36 | love = request.args.getlist("love") 37 | print(love)# ['吹牛', '睡觉'] 38 | 39 | # http://127.0.0.1:5000/request?username=xiaoming&love=吹牛&love=睡觉 40 | # 把传递过来的数据抓换成原生的字典 41 | data = request.args.to_dict() 42 | print(data) # {'username': 'xiaoming', 'love': '吹牛'} 43 | return "ok" 44 | 45 | @app.route("/request2",methods=["POST"]) 46 | def req2(): 47 | """获取post数据和请求头""" 48 | # 必须传 json 格式的数据 49 | print( request.data ) 50 | """打印结果: 51 | b'{\n\t"username":"xiaoming",\n\t"age":18,\n\t"sex":1\n}' 52 | """ 53 | # 方式一 54 | import json 55 | from flask import json 56 | data = json.loads(request.data) 57 | print(data) 58 | """ 59 | {'username': 'xiaoming', 'age': 18, 'sex': 1} 60 | """ 61 | # 方式二 62 | print(request.json) 63 | """ 64 | {'username': 'xiaoming', 'age': 18, 'sex': 1} 65 | """ 66 | 67 | # 获取请求行数据 68 | print( request.headers ) 69 | print( request.headers.to_list() ) 70 | 71 | # 获取上传文件 72 | print( request.files ) 73 | print( request.files.get("avatar") ) 74 | """ 75 | ImmutableMultiDict([('avatar', )]) 76 | 77 | """ 78 | 79 | return "ok" 80 | 81 | if __name__ == '__main__': 82 | app.run() 83 | ``` -------------------------------------------------------------------------------- /Python/Python Flask/Flask 响应.md: -------------------------------------------------------------------------------- 1 | Flask 响应 2 | --- 3 | 1. Flask支持两种响应方式 4 | 2. Flask支持自定义HTTP响应状态码 5 | 6 | # 1. 响应HTML文本 7 | ```py 8 | @app.route("/") 9 | def index(): 10 | # [默认支持]响应html文本 11 | return "" 12 | ``` 13 | 14 | # 2. 响应JSON数据 15 | ```py 16 | from flask import Flask, request, jsonify 17 | 18 | @app.route("/") 19 | def index(): 20 | # 也可以响应json格式代码 21 | data = [ 22 | {"id":1,"username":"liulaoshi","age":18}, 23 | {"id":2,"username":"liulaoshi","age":17}, 24 | {"id":3,"username":"liulaoshi","age":16}, 25 | {"id":4,"username":"liulaoshi","age":15}, 26 | ] 27 | return jsonify(data) 28 | ``` 29 | 30 | # 3. 响应重定向 31 | 32 | ## 3.1. 外部重定向 33 | ```py 34 | # 页面跳转响应 35 | from flask import Flask, request, jsonify, redirect 36 | @app.route("/user") 37 | def user(): 38 | # 页面跳转 redirect函数就是response对象的页面跳转的封装 39 | # Location: http://www.baidu.com 40 | return redirect("http://www.baidu.com") 41 | ``` 42 | 43 | ## 3.2. 内部重定向 44 | 45 | ### 3.2.1. 内部无参跳转 46 | ```py 47 | #使用url_for可以实现视图方法之间的内部跳转 48 | # url_for("视图方法名") 49 | from flask import Flask, request, jsonify, redirect, url_for 50 | @app.route("/login") 51 | def login(): 52 | return redirect( url_for("index") ) 53 | ``` 54 | 55 | ### 3.2.2. 内部有参跳转 56 | ```py 57 | # 路由传递参数 58 | @app.route('/user/') 59 | def user_info(user_id): 60 | return 'hello %s' % user_id 61 | 62 | # 重定向 63 | @app.route('/demo4') 64 | def demo4(): 65 | # 使用 url_for 生成指定视图函数所对应的 url 66 | return redirect(url_for('user_info', user_id=100)) 67 | ``` 68 | 69 | # 自定义状态码 70 | ```py 71 | @app.route('/demo4') 72 | def demo4(): 73 | return '状态码为 666', 400 74 | ``` -------------------------------------------------------------------------------- /Python/Python Flask/Flask 基础.md: -------------------------------------------------------------------------------- 1 | Flask 基础 2 | --- 3 | 1. 在做项目的过程中,机缘巧合下遇到了Flask,也就顺手准备开始写相关部分的笔记。 4 | 5 | # 1. Flask安装 6 | ```py 7 | pip install flask 8 | ``` 9 | 10 | # 2. 最简单的Flask-Hello World 11 | ```py 12 | from flask import Flask 13 | app = Flask(__name__) 14 | 15 | @app.route('/') 16 | def index(): 17 | return 'Hello World' 18 | 19 | if __name__ == '__main__': 20 | app.run() 21 | ``` 22 | 23 | # 3. 参考 24 | 1. Flask入门很轻松 (一) -------------------------------------------------------------------------------- /Python/Python Flask/Flask 状态.md: -------------------------------------------------------------------------------- 1 | Flask 状态 2 | --- 3 | 1. HTTP本身是无状态协议,可以通过Cookie和Session的方式来解决状态维持的问题。 4 | 5 | # 1. Cookie 6 | 1. 浏览器在请求某个网页的时候,会将本网站下的所有的Cookie信息提交给服务器,所以request中可以读取cookie的信息 7 | 2. Cookie是存储在浏览器的纯文本信息,建议不要存储敏感信息如密码 8 | 9 | ## 1.1. 设置Cookie 10 | ```py 11 | from flask imoprt Flask,make_response 12 | @app.route('/set_cookie') 13 | def set_cookie(): 14 | resp = make_response('this is to set cookie') 15 | resp.set_cookie('username', 'xiaoming', max_age=3600) 16 | # max_age 为cookie有效期,单位为秒 17 | return resp 18 | ``` 19 | 20 | ## 1.2. 获取cookie 21 | ```py 22 | from flask import Flask,request 23 | @app.route('/get_cookie') 24 | def resp_cookie(): 25 | resp = request.cookies.get('username') 26 | return resp 27 | ``` 28 | 29 | # 2. Session 30 | 1. Session是存储在服务器端进行状态保持的 31 | 2. Session依赖于Cookie 32 | 33 | ## 2.1. 设置Session 34 | ```py 35 | from flask import session 36 | @app.route('/set_session') 37 | def set_session(): 38 | session['username'] = 'xiaoming' 39 | return 'ok!' 40 | ``` 41 | 42 | ## 2.2. 获取session 43 | ```py 44 | @app.route('/get_session') 45 | def get_session(): 46 | return session.get('username') 47 | ``` -------------------------------------------------------------------------------- /Python/Python Flask/Flask 部署.md: -------------------------------------------------------------------------------- 1 | Flask 部署 2 | --- 3 | 1. Flask在部署到服务器的时候,需要配置类似Spring Boot的Tomcat的环境 4 | 2. 我们选择使用`gunicorn`来完成部署 5 | 6 | # 1. 配置环境 7 | ```py 8 | pip install gunicorn 9 | pip install gevent 10 | ``` 11 | 12 | 1. 之后可以根据自己的需要修改gunicorn的配置文件:`gunicorn.conf.py`,比如如下 13 | ```py 14 | workers = 2 # 定义同时开启的处理请求的进程数量,根据网站流量适当调整 15 | worker_class = "gevent" # 采用gevent库,支持异步处理请求,提高吞吐量 16 | bind = "0.0.0.0:7999" 17 | ``` 18 | 19 | # 2. 运行Flask 20 | 1. 使用如下命令即可运行:`gunicorn -D YourFileName:app -c gunicorn.conf.py` -------------------------------------------------------------------------------- /Python/Python Flask/Flask 配置.md: -------------------------------------------------------------------------------- 1 | Flask 配置 2 | --- 3 | 4 | # 1. 配置类 5 | ```py 6 | class Config(object): 7 | DEBUG = True 8 | SECRET_KEY = "abcccddgadsag" 9 | 10 | app.config.from_object(Config) 11 | ``` 12 | 13 | # 2. 指定服务器IP和端口 14 | ```py 15 | app.run(host="0.0.0.0", port=5000, debug = True) 16 | ``` -------------------------------------------------------------------------------- /Python/Python IO.md: -------------------------------------------------------------------------------- 1 | Python IO处理 2 | --- 3 | 1. 主要是记载了Python输入输出的一些情况,以及部分输入输出格式的部分 4 | 5 | 6 | 7 | - [1. 输出规格化](#1-输出规格化) 8 | - [2. *的特殊用法](#2-的特殊用法) 9 | - [3. 无说明长度的多行输入输出](#3-无说明长度的多行输入输出) 10 | - [4. tsv文件和csv文件的区别](#4-tsv文件和csv文件的区别) 11 | - [4.1. csv文件写入出现空行的解决办法](#41-csv文件写入出现空行的解决办法) 12 | 13 | 14 | 15 | # 1. 输出规格化 16 | 1. 对浮点数进行输入输出规格化 17 | 2. `print(" ".join(map('{:.2f}'.format,A)))` 18 | 19 | # 2. *的特殊用法 20 | 1. 第二种方式是利用 print() 本身的特性,它可以接受多个参数,然后两两间用一个空格隔开输出。所以你可以将一个可迭代对象使用 * 分解为 print() 的一个个参数: 21 | 22 | # 3. 无说明长度的多行输入输出 23 | ```py 24 | try: 25 | while True: 26 | inp = input() 27 | print(inp) 28 | except EOFError: 29 | pass 30 | ``` 31 | 32 | # 4. tsv文件和csv文件的区别 33 | 1. 读取csv文件我们需要调用csv的扩展包,或者是使用pandas包。 34 | 2. csv是用`,`分隔的数据,tsv是用`\t`分隔的数据。 35 | 36 | ## 4.1. csv文件写入出现空行的解决办法 37 | 1. 添加newline行即可 38 | ```py 39 | with open(file_path,'w',newline = "") as f: 40 | ... 41 | ``` -------------------------------------------------------------------------------- /Python/Python __name__.md: -------------------------------------------------------------------------------- 1 | __name__在python中的使用 2 | --- 3 | 4 | # 1. __name__的使用 5 | 1. __name__是一个变量,之所以有前后下划线,是因为是系统定义的名字。 6 | 2. __name__就是标识模块的名字的一个系统变量,当前的模块是主模块,那么这个模块是主模块,那么这个模块的名字就是__main__,否则如果是被import的模块,则这个模块名字为文件名字(不含.py)。 7 | 3. 不同情况: 8 | 1. 如果是被导入:__name__的值为模块名字 9 | 2. 如果是被直接执行:__name__的值是`__main__` -------------------------------------------------------------------------------- /Python/Python mysql连接.md: -------------------------------------------------------------------------------- 1 | Python mysql连接 2 | --- 3 | 4 | 5 | 6 | - [1. MYSQL连接原理](#1-mysql连接原理) 7 | - [2. MySQL连接代码实现](#2-mysql连接代码实现) 8 | - [3. 将csv格式的数据导入mysql](#3-将csv格式的数据导入mysql) 9 | - [4. 参考](#4-参考) 10 | 11 | 12 | 13 | # 1. MYSQL连接原理 14 | 1. 通过Python3连接MySQL 15 | 2. 获取MySQL数据集 16 | 3. 利用Python的相应库解析JSON(txt等)格式数据 17 | 4. 把解析好数据放到数据集,并放回到MySQL数据库 18 | 19 | # 2. MySQL连接代码实现 20 | ```py 21 | import pymysql 22 | conn1 = pymysql.connect(host="127.0.0.1",user="root",password="1234",db="mypydb") 23 | x = 'firsttitle' 24 | y = 'firstkeyword' 25 | sql = "INSERT INTO mytb(title,keywd) VALUES('%s','%s')"%(x,y) # sql语句 26 | conn1.query(sql) 27 | conn1.commit() 28 | ``` 29 | 30 | # 3. 将csv格式的数据导入mysql 31 | ```sql 32 | load data infile "文件路径.csv" 33 | into table table-name 34 | /*如果csv文件包含中文,添加"character set gb2313"*/ 35 | fields terminated by ',' optionally enclosed by '"' escaped by '"' 36 | lines terminated by '\r\n' 37 | ``` 38 | 39 | # 4. 参考 40 | 1. 如何用Python从数据库里面获取数据 41 | 2. 如何将csv格式数据导入mysql -------------------------------------------------------------------------------- /Python/Python 入门及介绍.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. 闲散知识点](#1-闲散知识点) 4 | - [2. python简介](#2-python简介) 5 | - [2.1. 什么是python](#21-什么是python) 6 | - [2.2. python历史](#22-python历史) 7 | - [2.3. python版本](#23-python版本) 8 | - [2.4. python应用](#24-python应用) 9 | - [3. Python包和库函数的使用](#3-python包和库函数的使用) 10 | - [3.1. 函数](#31-函数) 11 | - [3.2. 模块](#32-模块) 12 | - [3.3. 包](#33-包) 13 | - [3.4. 库](#34-库) 14 | - [3.5. 之间的关系](#35-之间的关系) 15 | 16 | 17 | # 1. 闲散知识点 18 | 1. //是整数出发 19 | 2. repr()将所有的转化成字符串 20 | 3. frozenset:不能改变的集合 21 | 22 | # 2. python简介 23 | 24 | ## 2.1. 什么是python 25 | 1. 优雅 26 | 2. 明确 27 | 3. 简单 28 | 29 | ## 2.2. python历史 30 | 1. 胶水语言 31 | 2. 脚本语言 32 | 3. 面向对象语言 33 | 34 | ## 2.3. python版本 35 | 1. 取决于你开发的时候用的类库是基于python2还是python3的 36 | 2. 本课程是基于python3来完成。 37 | 38 | ## 2.4. python应用 39 | 1. web开发 40 | 2. GUI开发 41 | 3. 操作系统 42 | 4. 多媒体 43 | 44 | 45 | # 3. Python包和库函数的使用 46 | 47 | ## 3.1. 函数 48 | 49 | 函数名|函数作用 50 | --|-- 51 | abs()|绝对值函数 52 | type()|类型函数 53 | round()|四舍五入函数 54 | floor()|向下取整 55 | 56 | 1. 查看内置名:命令dir(_builtins_) 57 | 2. 使用help(name)来查看具体的命令含义 58 | 3. 非模块函数需要提前导入相应的包 59 | 60 | ## 3.2. 模块 61 | 1. 一个完整的python文件即是一个模块 62 | 2. 导入多个模块,模块中导入指定的模块属性,也就是把指定名称导入当前作用域。 63 | 64 | ## 3.3. 包 65 | 1. 一个有层次的文件目录结构,定义了一个由模块和子包组成的python应用程序执行环境 66 | 2. 引用:包名/子包名/模块名 67 | 68 | 69 | ## 3.4. 库 70 | 1. 一组具有相关功能的模块的集合。 71 | 2. python的一大特色就是具有强大的第三方库、以及自定义模块。 72 | 3. 访问库中变量名可以用.来访问,比如math.pi 73 | 74 | ## 3.5. 之间的关系 75 | 1. 包包含模块或是库。 76 | 2. 模块或是库里面包含了很多的函数或是类。 -------------------------------------------------------------------------------- /Python/Python 快捷键.md: -------------------------------------------------------------------------------- 1 | # 1. Pycharm 2 | Pycharm常用快捷键 3 | 4 | # 2. Jupyter 5 | Jupyter快捷键 -------------------------------------------------------------------------------- /Python/Python 扩展库/Scipy.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. SciPy](#1-scipy) 4 | - [1.1. 包含的SciPy中的数据结构](#11-包含的scipy中的数据结构) 5 | - [1.2. SciPy核心库](#12-scipy核心库) 6 | - [1.3. 函数](#13-函数) 7 | - [2. shift](#2-shift) 8 | - [2.1. scipy.ndimage.interpolation.shift](#21-scipyndimageinterpolationshift) 9 | - [2.2. 官方文档](#22-官方文档) 10 | 11 | 12 | 13 | # 1. SciPy 14 | 1. 是一各基于python的软件生态圈。 15 | 2. 主要是为数学、科学和工程服务 16 | 3. 一共有6个库,主要介绍前三个: 17 | 1. NumPy 18 | 2. Matplotlib 19 | 3. pandas 20 | 4. Sympy 21 | 5. IPython 22 | 6. Scipy library 23 | 4. SciPy官网 24 | 1. NumPy手册 25 | 2. Matplotlib example 26 | 27 | 28 | ## 1.1. 包含的SciPy中的数据结构 29 | 1. ndarray:N维数组 30 | 2. Series:变长字典 31 | 3. DataFrame:数据框 32 | 33 | ## 1.2. SciPy核心库 34 | 1. 有效计算numpy矩阵,让NumPy和SciPy协同工作 35 | 2. 致力于科学计算中的常见问题的各个工具箱,其不同子模块有不同的应用,如插值、积分、优化和图像处理等。 36 | 37 | ## 1.3. 函数 38 | 1. 导入:`from scipy import linalg` 39 | 2. `linalg.det(arr)`计算行列式的值 40 | 41 | # 2. shift 42 | 1. 用来进行数据增强提高模型性能。 43 | 2. 官方文档 44 | 45 | ## 2.1. scipy.ndimage.interpolation.shift 46 | 1. 完成数组偏移,是对图像进行增强一种手段 47 | ```py 48 | from scipy.ndimage.interpolation import shift 49 | a = np.array([[1,2],[3,4]]) 50 | #array([[1, 2], 51 | # [3, 4]]) 52 | shift(a,shift=[1,1],cval=1) 53 | #array([[1, 1], 54 | # [1, 1]]) 55 | ``` 56 | 1. 第一个参数为输入,应为数组, 57 | 2. 第二个shift参数表示各个维度的偏移量[1,1]表示第一个第二个维度均偏移1, 58 | 3. 第三个参数cval表示偏移后原来位置以什么值填充。 59 | 60 | ## 2.2. 官方文档 61 | 1. `scipy.ndimage.interpolation.shift(input, shift, output_type=None, output=None, order=3, mode='constant', cval=0.0, prefilter=True)` 62 | 2. 描述:The array is shifted using spline interpolation of the requested order. Points outside the boundaries of the input are filled according to the given mode. The parameter prefilter determines if the input is pre-filtered before interpolation, if False it is assumed that the input is already filtered.(使用请求顺序的样条插值来移动阵列。输入边界外的点根据给定模式填充。参数prefilter确定输入是否在插值前预过滤,如果为False,则假定输入已过滤。) -------------------------------------------------------------------------------- /Python/Python 扩展库/argparse.md: -------------------------------------------------------------------------------- 1 | argparse 2 | --- 3 | 4 | # 1. argparse模块是啥 5 | 1. 涉及到从命令行直接读取参数的时候 6 | ```py 7 | import argparse 8 | parser = argparse.ArgumentParser()parser.add_argument("x", help="横坐标",type=int)parser.add_argument('y', help="纵坐标",type=int)args = parser.parse_args() 9 | ``` 10 | 11 | # 2. 函数 12 | 13 | ## 2.1. add_argument()函数 14 | 1. 可以看到上面这个函数中有三个参数, 15 | 2. 第一个是名称,就是为你读取的变量起一个名字,例如x,y,这个你随便起一个你自己要名字。 16 | 3. 第二个是help,这是提示信息,告诉你这个变量是啥东西,怎么看这些信息呢,在命令行输入:python no.py -h 17 | 18 | ## 2.2. optional arguments可选参数 19 | ```py 20 | import argparse import argparse 21 | parser = argparse.ArgumentParser() 22 | parser.add_argument("x", help="横坐标",type=int) 23 | parser.add_argument('y', help="纵坐标",type=int) 24 | parser.add_argument("-v",help="x翻倍",action="store_true") 25 | args = parser.parse_args() 26 | if args.v: 27 | args.x=args.x*2 28 | x=args.x 29 | y=args.y 30 | print(x,y) 31 | ``` 32 | 1. 如果加了参数 -v ,则x变为输入值的两倍。 33 | 34 | # 3. 参考 35 | 1. argparse 36 | 2. 更多的参考 -------------------------------------------------------------------------------- /Python/Python 扩展库/baidu-aip.md: -------------------------------------------------------------------------------- 1 | baidu-aip 2 | --- 3 | 1. baidu-aip是百度提供的调用其服务的SDK包 4 | 5 | # 1. 调用OCR 6 | 1. 首先需要登录百度云平台,在文字识别的应用列表中创建一个应用。 7 | 2. 然后编写如下的Python代码 8 | 9 | ```py 10 | # -*- coding: utf-8 -*- 11 | from aip import AipOcr 12 | import os 13 | 14 | #读取图片,path用于传入读取图片的名字 15 | dir = './img' 16 | def read_image(path): 17 | dir_i = dir + '\\' 18 | print(dir_i+path) 19 | with open(dir_i+path, 'rb') as f: 20 | image = f.read() 21 | return image 22 | 23 | api_key = 'Your_api_key' 24 | app_id='Your_app_id' 25 | secret_key = 'Your_secret_key' 26 | client=AipOcr(app_id,api_key,secret_key) 27 | fs=os.listdir(dir) 28 | file=open(r'output.txt','w',encoding='utf-8') 29 | for image in fs: 30 | i=read_image(image) 31 | inf=client.basicGeneral(i) 32 | for response in inf['words_result']: 33 | for words in response['words']: 34 | file.write(words) 35 | file.write('\n') 36 | print(inf) 37 | file.close() 38 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/bisect.md: -------------------------------------------------------------------------------- 1 | bisect模块 2 | --- 3 | 1. 模块导入:`import bisect` 4 | 5 | # 1. 方法 6 | 1. `insort(array,number)`:在array中插入number,并且不会破坏原来的排序。 7 | 2. `bisect(array,number)`:表示number即将插入到array的位置。但是并不执行插入 8 | 3. `bisect_left(array,number)`:表示number即将插入到array的位置,但是优先返回左侧(有重复) 9 | 4. `bisect_right(array,number)`:表示number即将插入到array的位置,但是优先返回右侧(有重复) -------------------------------------------------------------------------------- /Python/Python 扩展库/delorean.md: -------------------------------------------------------------------------------- 1 | delorean 2 | --- 3 | 4 | 5 | 6 | - [1. 什么是Delorean库](#1-什么是delorean库) 7 | - [2. 具体的使用](#2-具体的使用) 8 | - [2.1. 安装Delorean](#21-安装delorean) 9 | - [2.2. 导入](#22-导入) 10 | - [2.3. 使用](#23-使用) 11 | - [2.4. 转为国内时区](#24-转为国内时区) 12 | - [2.5. 可以打印datatime、date](#25-可以打印datatimedate) 13 | 14 | 15 | 16 | # 1. 什么是Delorean库 17 | 1. 是Python里一个很方便的日期时间库,可以让人更加简单省心的获取时间,而不必困于模块中的各种问题。 18 | 19 | # 2. 具体的使用 20 | 21 | ## 2.1. 安装Delorean 22 | `pip install Delorean` 23 | 24 | ## 2.2. 导入 25 | `from delorean import Delorean` 26 | 27 | ## 2.3. 使用 28 | ```py 29 | d = Delorean() 30 | print(d) 31 | Delorean(datetime = datetime(2018, 5, 10, 8, 52, 23, 560811), timezone='UTC') 32 | # 这里默认的是UTC时间 33 | ``` 34 | 35 | ## 2.4. 转为国内时区 36 | ```py 37 | d = d.shift("Asia/Shanghai") 38 | print(d) 39 | Delorean(datetime=datetime(2018, 5, 10, 16, 52, 23, 560718), timezone='Asia/Shanghai') 40 | ``` 41 | 42 | ## 2.5. 可以打印datatime、date 43 | ```py 44 | print(d.datetime, d.date) 45 | # 2018-05-10 16:58:22.397155+08:00 2018-05-10 46 | # datetime 完整时间 date 日期 47 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/docx-mailmerge.md: -------------------------------------------------------------------------------- 1 | docx-mailmerge 2 | --- 3 | 4 | 5 | - [1. 什么是docx-mailmerge](#1-什么是docx-mailmerge) 6 | - [2. 使用Word模板](#2-使用word模板) 7 | - [3. 具体python部分的设置](#3-具体python部分的设置) 8 | - [4. 完整源码](#4-完整源码) 9 | - [5. 参考](#5-参考) 10 | 11 | 12 | 13 | # 1. 什么是docx-mailmerge 14 | 1. 我们在项目开发中,会有一些生成Word文件的操作,比如获取到一些数据添加到Word。 15 | 16 | # 2. 使用Word模板 17 | 1. 在你需要插入数据的地方,我们选择"插入"->文档部件->域。 18 | 2. 在中间选择邮件合并,域名选择MergeField,域名可以理解为你在代码中的一个变量,将你要插入的数据赋值给一个变量,然后将你插入的数据赋值给这个变量,你的数据就会按照你设置好的地方插入到模板中,另外格式可以单独设置,若无则为默认格式。 19 | 结果如下。 20 | ![](img/docx-1.png) 21 | 22 | # 3. 具体python部分的设置 23 | 1. 以下的例子里面文件名称和域的名称是固定的。 24 | 2. 写入语句:`document_1.write('F:\\{}.docx'.format(emp_full_info.get("identity_card")))` 25 | 3. 编码问题的解决:`Year=year.decode(encoding='UTF-8', errors='strict')` 26 | 27 | # 4. 完整源码 28 | ```py 29 | from mailmerge import MailMerge # 打印模板 30 | template = "F:\\WorkingProve11.docx" # 创建邮件合并文档并查看所有字段 31 | document_1 = MailMerge(template) 32 | print("Fields included in {}: {}".format(template,document.get_merge_fields())) 33 | document_1.merge( 34 | people_name=u'勒布朗', 35 | identity_card_id='123456789', 36 | begin_work_year='2018', 37 | begin_work_month='7', 38 | department_name=u'洛杉矶湖人', 39 | job_name=u'联盟第一人' 40 | ) 41 | document_1.write('F:\\test666.docx') 42 | ``` 43 | 44 | # 5. 参考 45 | 1. python和word模板 -------------------------------------------------------------------------------- /Python/Python 扩展库/genism.md: -------------------------------------------------------------------------------- 1 | **genism** 2 | 3 | 4 | 5 | - [1. 什么是genism](#1-什么是genism) 6 | - [2. 训练模型](#2-训练模型) 7 | - [2.1. 训练](#21-训练) 8 | - [2.2. 模型导出](#22-模型导出) 9 | - [2.3. 模型导入](#23-模型导入) 10 | - [2.4. 增量训练](#24-增量训练) 11 | - [3. 参考](#3-参考) 12 | 13 | 14 | 15 | # 1. 什么是genism 16 | 1. genism是强大的自然语言处理工具,里面包括N多常见模型 17 | 2. 基本的语料处理工具 18 | + LSI 19 | + LDA 20 | + HDP 21 | + DTM 22 | + DIM 23 | + TF-IDF 24 | 25 | # 2. 训练模型 26 | 27 | ## 2.1. 训练 28 | ```py 29 | #encoding=utf-8 30 | from gensim.models import word2vec 31 | sentences=word2vec.Text8Corpus(u'分词后的爽肤水评论.txt') 32 | model=word2vec.Word2Vec(sentences, size=50) 33 | 34 | y2=model.similarity(u"好", u"还行") 35 | print(y2) 36 | 37 | for i in model.most_similar(u"滋润"): 38 | print i[0],i[1] 39 | ``` 40 | 1. 训练模型:`model=word2vec.Word2Vec(sentences,min_count=5,size=50)` 41 | + 第一个参数是训练语料,第二个参数是小于该数的单词会被剔除,默认值为5。 42 | + 第三个参数是神经网络的隐藏层单元数,默认为100 43 | 44 | ## 2.2. 模型导出 45 | ```py 46 | word2vec = gensim.models.word2vec.Word2Vec(sentences(), size=256, window=10, min_count=64, sg=1, hs=1, iter=10, workers=25) 47 | word2vec.save('word2vec_wx') 48 | ``` 49 | 50 | ## 2.3. 模型导入 51 | ```py 52 | model = gensim.models.Word2Vec.load('xxx/word2vec_wx') 53 | pd.Series(model.most_similar(u'微信',topn = 360000)) 54 | ``` 55 | 1. gensim.models.Word2Vec.load的办法导入 56 | 其中的Numpy,可以用numpy.load: 57 | ```py 58 | import numpy 59 | word_2x = numpy.load('xxx/word2vec_wx.wv.syn0.npy') 60 | ``` 61 | 2. 导入方式 62 | ```py 63 | from gensim.models.keyedvectors import KeyedVectors 64 | word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.txt', binary=False) # C text format 65 | word_vectors = KeyedVectors.load_word2vec_format('/tmp/vectors.bin', binary=True) # C binary format 66 | ``` 67 | 68 | ## 2.4. 增量训练 69 | ```py 70 | model = gensim.models.Word2Vec.load('/tmp/mymodel') 71 | model.train(more_sentences) 72 | ``` 73 | 74 | # 3. 参考 75 | 1. genism -------------------------------------------------------------------------------- /Python/Python 扩展库/img/docx-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Python/Python 扩展库/img/docx-1.png -------------------------------------------------------------------------------- /Python/Python 扩展库/img/jieba-1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Python/Python 扩展库/img/jieba-1.png -------------------------------------------------------------------------------- /Python/Python 扩展库/img/time/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Python/Python 扩展库/img/time/1.png -------------------------------------------------------------------------------- /Python/Python 扩展库/jieba.md: -------------------------------------------------------------------------------- 1 | jieba 2 | --- 3 | 4 | 5 | 6 | - [1. 什么是jieba](#1-什么是jieba) 7 | - [2. 安装jieba](#2-安装jieba) 8 | - [3. jieba库常用函数](#3-jieba库常用函数) 9 | - [3.1. 精准模式](#31-精准模式) 10 | - [3.2. 全模式](#32-全模式) 11 | - [3.3. 搜索引擎模式](#33-搜索引擎模式) 12 | - [3.4. 向分词词典增加新词](#34-向分词词典增加新词) 13 | - [其他具体示例](#其他具体示例) 14 | 15 | 16 | 17 | # 1. 什么是jieba 18 | 1. jieba是优秀的中文分词的第三方库 19 | 2. 中文分词需要通过分词获得单个的词语。 20 | 21 | # 2. 安装jieba 22 | 1. `pip install jieba` 23 | 24 | # 3. jieba库常用函数 25 | 1. 分词的三种模式 26 | 1. 精准模式:把文本精准地分开,不存在冗余。 27 | 2. 全模式:把文中所有可能的词语都扫描出来,存在冗余 28 | 3. 搜索引擎模式:在精准模式的基础上,再次对长词进行切分。 29 | 30 | ![](img/jieba-1.png) 31 | 32 | ## 3.1. 精准模式 33 | ```py 34 | >>> import jieba 35 | >>> jieba.lcut("中国是一个伟大的国家") 36 | ['中国', '是', '一个', '伟大', '的', '国家'] 37 | ``` 38 | 39 | ## 3.2. 全模式 40 | ```py 41 | >>> jieba.lcut("中国是一个伟大的国家",cut_all=True) 42 | ['中国', '国是', '一个', '伟大', '的', '国家'] 43 | ``` 44 | 45 | ## 3.3. 搜索引擎模式 46 | ```py 47 | >>> jieba.lcut_for_search("中华人民共和国是伟大的") 48 | ['中华', '华人', '人民', '共和', '共和国', '中华人民共和国', '是', '伟大', '的'] 49 | ``` 50 | 51 | ## 3.4. 向分词词典增加新词 52 | ```py 53 | >>> jieba.add_word("蟒蛇语言") 54 | >>> jieba.lcut("python是蟒蛇语言") 55 | ['python', '是', '蟒蛇语言'] 56 | ``` 57 | 58 | # 其他具体示例 59 | ```py 60 | import jieba 61 | if __name__ == '__main__': 62 | seg_list = jieba.cut("我来到北京清华大学", cut_all=True) #全模式 63 | print("Full Mode:" + "/".join(seg_list)) 64 | seg_list = jieba.cut("我来到北京清华大学", cut_all=False) #精确模式 65 | print("Default Mode:" + "/".join(seg_list)) 66 | seg_list = jieba.cut("他来到了网易杭研大厦", HMM=False) #不使用HMM模型 67 | print("/".join(seg_list)) 68 | seg_list = jieba.cut("他来到了网易杭研大厦", HMM=True) #使用HMM模型 69 | print("/".join(seg_list)) 70 | seg_list = jieba.cut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=False) #搜索引擎模式 71 | print("/".join(seg_list)) 72 | seg_list = jieba.lcut_for_search("小明硕士毕业于中国科学院计算所,后在日本京都大学深造", HMM=True) 73 | print(seg_list) 74 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/json.md: -------------------------------------------------------------------------------- 1 | Python中的json库 2 | --- 3 | 1. 主要是处理和生成非格式化数据 4 | 5 | 6 | 7 | - [1. Python读取和处理json](#1-python读取和处理json) 8 | - [2. Python保存为json字符串](#2-python保存为json字符串) 9 | 10 | 11 | 12 | # 1. Python读取和处理json 13 | ```py 14 | import json 15 | 16 | data1=json.loads(json_file) 17 | print(data1) # {} 18 | print(type(data1)) # dict 19 | ``` 20 | 21 | # 2. Python保存为json字符串 22 | ```py 23 | import json 24 | 25 | data={"name":"sunxiaomin","sex":"男","年龄":"26"} 26 | #将python字典类型变成json数据格式 27 | json_str=json.dumps(data) 28 | print(json_str) 29 | print(type(json_str)) # str 30 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/keras.md: -------------------------------------------------------------------------------- 1 | keras 2 | --- 3 | 4 | 5 | 6 | - [1. history](#1-history) 7 | - [2. 一些比较实用的函数](#2-一些比较实用的函数) 8 | - [2.1. pad_sequence函数](#21-pad_sequence函数) 9 | - [3. model搭建](#3-model搭建) 10 | - [3.1. 文本情感分析例子](#31-文本情感分析例子) 11 | - [4. 参考](#4-参考) 12 | 13 | 14 | 15 | # 1. history 16 | 1. 在python中,keras通过训练(fit_generator和fit)返回history对象。 17 | 2. history对象中记录了输出等信息,所以我们可以显示函数的损失和准确率等信息 18 | 19 | # 2. 一些比较实用的函数 20 | 21 | ## 2.1. pad_sequence函数 22 | ```py 23 | pad_sequences = tf.contrib.keras.preprocessing.sequence.pad_sequences 24 | keras.preprocessing.sequence.pad_sequences(sequences,maxlen=None,dtype='int32',padding='pre',truncating='pre', value=0.) 25 | ``` 26 | 1. sequences:浮点数或整数构成的两层嵌套列表 27 | 2. maxlen:None或整数,为序列的最大长度。大于此长度的序列将被截短,小于此长度的序列将在后部填0.在命名实体识别任务中,主要是指句子的最大长度 28 | 3. dtype:返回的numpy array的数据类型 29 | 4. padding:‘pre’或‘post’,确定当需要补0时,在序列的起始还是结尾补 30 | 4. truncating:‘pre’或‘post’,确定当需要截断序列时,从起始还是结尾截断 31 | 5. value:浮点数,此值将在填充时代替默认的填充值0 32 | 6. 返回形如(nb_samples,nb_timesteps)的2D张量 33 | 34 | # 3. model搭建 35 | 36 | ## 3.1. 文本情感分析例子 37 | ```py 38 | # 建立模型 39 | model = keras.Sequential() 40 | model.add(keras.layers.Embedding(vocab_size, 16)) 41 | model.add(keras.layers.GlobalAveragePooling1D()) 42 | model.add(keras.layers.Dense(16, activation=tf.nn.relu)) 43 | model.add(keras.layers.Dense(1, activation=tf.nn.sigmoid)) 44 | 45 | model.summary() 46 | # 编译模型 47 | model.compile(optimizer = 'adam', 48 | loss='binary_crossentropy', 49 | metrics=['accuracy']) 50 | # 评估模型 51 | results = model.evaluate(test_data, test_labels) 52 | ``` 53 | 1. Embedding layer(嵌入层) 54 | + 该层采用整数编码的词汇表,并查找每个词索引的嵌入向量。这些向量是作为模型训练学习的。向量为输出数组添加维度,生成的维度为:(batch, sequence, embedding)。 55 | 2. GlobalAveragePooling1D layer(全局平均池化层) 56 | + 通过对序列维度求平均,为每个评论返回固定长度的输出向量。这允许模型以最简单的方式处理可变长度的输入。 57 | 3. Dense layer(全连接层,稠密层) 58 | 4. 最后一层和输出节点连接,实用sigmoid激活函数 59 | 5. 编译模型: 60 | 1. loss:指的是损失函数(binary_crossentropy在处理概率上表现更好——它测量概率分布之间的"距离",或者测量真实分布和预测之间的"距离") 61 | 62 | 63 | # 4. 参考 64 | 1. pad_sequences序列预处理 65 | 2. 文本情感分析 -------------------------------------------------------------------------------- /Python/Python 扩展库/math.md: -------------------------------------------------------------------------------- 1 | # 1. math库 2 | 3 | ## 1.1. pow()方法 4 | 1. pow() 方法返回 xy(x的y次方) 的值。 5 | 2. 语法: 6 | ```python 7 | import math 8 | math.pow(x,y[,z]) 9 | ``` 10 | 3. 如果z存在,则对结果进行取模。 11 | 12 | ## 1.2. ceil(n) 13 | 1. 返回大于等于当前数字n的最小整数 14 | 15 | ## 1.3. radians(n) 16 | 1. 度数转弧度。 17 | 18 | ## 1.4. fabs() 19 | 1. 和abs()不同的是,fabs只适用于float和integer 20 | 21 | ## factorial() 22 | 1. 求阶乘 23 | 24 | ## log2() 25 | 1. 求以2为底的对数值 26 | 27 | ## gcd(a,b) 28 | 1. 返回最大公约数 -------------------------------------------------------------------------------- /Python/Python 扩展库/nltk.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. Python自然语言处理工具包NLTK](#1-python自然语言处理工具包nltk) 4 | - [1.1. 古腾堡语料库](#11-古腾堡语料库) 5 | - [1.2. 函数](#12-函数) 6 | - [1.3. 本地文本载入](#13-本地文本载入) 7 | - [1.4. Wordnet](#14-wordnet) 8 | - [1.4.1. 上位词和下位词](#141-上位词和下位词) 9 | - [1.4.2. 同义词和反义词](#142-同义词和反义词) 10 | - [1.4.3. 蕴涵关系](#143-蕴涵关系) 11 | - [1.4.4. 整体与部分](#144-整体与部分) 12 | - [1.4.5. 计算概念之间的距离](#145-计算概念之间的距离) 13 | - [2. 使用NLTK进行情感分析](#2-使用nltk进行情感分析) 14 | - [3. 参考](#3-参考) 15 | 16 | 17 | 18 | # 1. Python自然语言处理工具包NLTK 19 | 1. 包含古腾堡语料库等 20 | 2. 进行处理 21 | 22 | ## 1.1. 古腾堡语料库 23 | 1. 导入:`import nltk` 24 | 2. 下载语料库:`nltk.download()` 25 | 3. 进入下载器进行下载 26 | 4. 语料库下载到本地 27 | 5. 加载语料库:`from nltk.corpus import gutenberg` 28 | 6. 查看相应语料库的收录什么相应的书籍:`gutenburg.fileids()` 29 | 7. 列出书中的函数:`gutenburg.words()` 30 | 31 | ## 1.2. 函数 32 | 1. `.word('name.txt')`统计单词和标点的个数,返回的是一个列表 33 | 2. `.count(str)`:返回其出现次数 34 | 3. `FreqDist()`:创建一个所给数据的频率分布 35 | 4. `.B()`不同单词个数 36 | 5. `.N()`所有单词个数 37 | 6. `.tabulate(number)`将前number个数据按照表格显示出来 38 | 7. `fd3.freq(str)`计算出现频率 39 | 8. `ConditionalFreqDist()`条件频率统计函数 40 | + 研究类别间的系统差异 41 | 9. 去除停用词(the) 42 | 43 | ## 1.3. 本地文本载入 44 | 1. 本地文本语料库的载入只要使用NLTK中的**PlaintextCorpusReader()**函数。 45 | 2. 假设文件在D盘的data目录下,只要将函数参数corpus_root的值设置为这个目录,函数第二个参数可以用一个文件列表例如['name.txt', 'new/first.txt'],表示载入这个文件列表中的相应文件,也可以利用正则表达式指定要载入的文件,例如用'.*'表示目录下的所有文件。例如: 46 | ```python 47 | >>> from nltk.corpus import PlaintextCorpusReader 48 | >>> corpus_root = r'd:\data' 49 | >>> books = PlaintextCorpusReader(corpus_root, '.*') 50 | >>> books.fileids() 51 | ['test/万历十五年.txt', '三国演义.txt', '水浒传.txt', '红楼梦.txt', '西游记.txt'] 52 | ``` 53 | 54 | ## 1.4. Wordnet 55 | 1. WordNet是nltk的一个组件 56 | 2. 首先需要下载wordnet 57 | 58 | ```py 59 | import nltk 60 | nltk.download('wordnet') 61 | ``` 62 | 63 | ### 1.4.1. 上位词和下位词 64 | ```py 65 | hypernyms() # 上位(父类) 66 | hyponyms() # 下位(子类) 67 | ``` 68 | 69 | ### 1.4.2. 同义词和反义词 70 | ```py 71 | lemma_names() # 同义 72 | antonyms() # 反义 73 | ``` 74 | 75 | ### 1.4.3. 蕴涵关系 76 | ```py 77 | entailments() 78 | ``` 79 | 80 | ### 1.4.4. 整体与部分 81 | ```py 82 | part_meronyms() # 部分 83 | substance_meronyms() # 实质 84 | member_holonyms() # 成员 85 | ``` 86 | 87 | ### 1.4.5. 计算概念之间的距离 88 | ```py 89 | path_similarity() # 相似度 90 | lowest_common_hypernyms() # 在何种层面相似 91 | ``` 92 | 93 | # 2. 使用NLTK进行情感分析 94 | 1. 如果提示缺少某些包,则按照报错提示修正即可。 95 | 96 | # 3. 参考 97 | 1. 知识图谱之WordNet -------------------------------------------------------------------------------- /Python/Python 扩展库/pandas-profiling.md: -------------------------------------------------------------------------------- 1 | pandas-profiling(数据预览分析) 2 | --- 3 | 4 | # 1. 安装pandas-profiling安装与调用 5 | ```py 6 | pip install pandas-profiling 7 | import pandas as pd 8 | import pandas_profiling 9 | ``` 10 | 11 | # 2. 数据预览分析过程 12 | 13 | ## 2.1. 导入数据 14 | `data=pd.read_csv("model.csv")` 15 | 16 | ## 2.2. 直接查看 17 | `pandas_profiling.ProfileReport(data)` 18 | 19 | # 3. 数据概述 20 | 21 | ## 3.1. 总体数据 22 | 23 | ## 3.2. 警告信息 24 | 25 | ## 3.3. 单变量描述 26 | 27 | ## 3.4. 相关性分析 28 | 29 | ## 3.5. 生产HTML报告文件 30 | 31 | # 4. 参考 32 | 1. pandas-profiling -------------------------------------------------------------------------------- /Python/Python 扩展库/pytesseract.md: -------------------------------------------------------------------------------- 1 | pytesseract 2 | --- 3 | 1. 可以完成验证码的图像识别任务。 4 | 5 | # 1. 安装 6 | 1. 需要使用到pillow和pytesseract库,以及Tesseract-OCR.exe 7 | 2. 安装库: 8 | 1. `pip install pillow` 9 | 2. `pip install pytesseract` 10 | 3. 下载好5.0版本的Tesseract-OCR.exe并安装 11 | 4. 配置pytesseract库的配置 12 | 1. 在使用的python的安装目录下找到pytessact.py进行编辑 13 | 2. 找到:`tesseract_cmd=xxx`:将xxx的位置上的值替换成安装Tesseract-OCR后,文件夹中的tesseract.exe文件的位置 14 | 15 | # 简单的代码实现 16 | ```py 17 | import pytesseract 18 | from PIL import Image 19 | 20 | if __name__ == '__main__': 21 | text = pytesseract.image_to_string(Image.open("D:\\test.png"),lang="eng") 22 | print(text) 23 | ``` 24 | 25 | # 语言扩展包 26 | 1. tessdoc:官方扩展包 27 | 28 | # 官方文档 29 | 1. pytesseract官方文档 30 | 31 | # 2. 报错 32 | > pytesseract.pytesseract.TesseractError: (3221225477, ''):一般是设置环境变量结束后,由于版本不匹配问题出现的问题 33 | 34 | 1. Tesseract-OCR 5.0的下载地址: 35 | 1. 32位exe下载地址 36 | 2. 64位exe下载地址 37 | 38 | # 3. 参考 39 | 1. python 技术篇-使用pytesseract库进行图像识别之环境配置 40 | 2. pytesseract.pytesseract.TesseractError: (3221225477, '') 41 | 3. python 识别图片上的数字 -------------------------------------------------------------------------------- /Python/Python 扩展库/random.md: -------------------------------------------------------------------------------- 1 | random生成随机数 2 | --- 3 | 函数头|函数作用 4 | --|-- 5 | random.random()|生成0-1之间的随机浮点数 6 | random.uniform(a,b)|生成[a,b]之间的浮点数 7 | random.randint(a,b)|生成[a,b]之间的整数 8 | random.randrange(a,b,step)|在 9 | 指定的集合[a,b)中,以step为基数随机取一个数 10 | random.choice(sequence)|从特定序列中随机取一个元素,这里的序列可以是字符串,列表 -------------------------------------------------------------------------------- /Python/Python 扩展库/sh.md: -------------------------------------------------------------------------------- 1 | sh 2 | --- 3 | 1. 使用python运行.sh文件 4 | 5 | # 参数 6 | 1. Linux后台运行python.sh等程序 -------------------------------------------------------------------------------- /Python/Python 扩展库/ssl.md: -------------------------------------------------------------------------------- 1 | ssl 2 | 3 | 4 | - [1. ssl](#1-ssl) 5 | - [2. 参考](#2-参考) 6 | 7 | 8 | 9 | # 1. ssl 10 | 1. ssl是python的标准库,主要用来实现加密通信。 11 | 2. ssl低层使用openssl,做了面向对象化改造和简化。 12 | 13 | # 2. 参考 14 | 1. Python3+ssl通信 -------------------------------------------------------------------------------- /Python/Python 扩展库/statistics.md: -------------------------------------------------------------------------------- 1 | statistics 2 | --- 3 | 1. 该模块为数学(限定为实数)数据提供了计算数学统计量的函数。 4 | 5 | 6 | | 函数名 | 函数功能 | 备注 | 7 | | ---------------- | ---------------------------------------------- | ----------------------------------------------------------------------------------------------------- | 8 | | mean(list) | 平均值 | - | 9 | | harmonix_mean() | 数据的调和平均值 | (如果存在X1、X2……Xn,xi≠0、i=1,2,..,n,H= n/(1/X1+1/X2+……+1/Xn)。其中H即为X1、X2……Xn的调和平均值。) | 10 | | mode(list) | 众数 | - | 11 | | median() | 数据的中位数 | - | 12 | | median_low() | 数据的第一个中位数(总数为偶数时有两个中位数) | - | 13 | | median_high() | 数据的第二个中位数 | - | 14 | | median_grouped() | 分组数据的中位数的均值 | - | 15 | | mode() | 离散数据的模式(即数据中最常见的值)。 | - | 16 | | pstdev() | 数据总体的标准差 | - | 17 | | pvariance() | 数据总体的方差 | - | 18 | | stdev() | 数据样本的标准差 | - | 19 | | variance() | 数据样本的方差 | - | -------------------------------------------------------------------------------- /Python/Python 扩展库/subprocess.md: -------------------------------------------------------------------------------- 1 | subprocess 2 | --- 3 | 4 | # 1. 概述 5 | 1. subprocess模块允许你生成新的进程,连接它们的输入、输出、错误管道,并且获取它们的返回码。 6 | 2. 官方文档 7 | 8 | # 2. 关键的对象Popen构造 9 | 1. https://www.cnblogs.com/a13798508446/p/9619221.html 10 | 11 | # 3. 一个简单的例子 12 | > 本python文件运行了同级目录下的另一个py文件 13 | 14 | ```py 15 | # -*- coding: utf-8 -*- 16 | import subprocess 17 | 18 | sub = subprocess.Popen("python ./other.py", shell=True, stdout=subprocess.PIPE, stdin=0) 19 | sub.wait() 20 | print(sub.stdout.read().decode("utf-8")) 21 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/sys.md: -------------------------------------------------------------------------------- 1 | sys 2 | --- 3 | 1. 该模块提供对解释器使用或维护的一些变量的访问,以及与解释器进行交互的函数。 4 | 2. 以下简要介绍了sys的部分方法参数 5 | 6 | 7 | 8 | - [1. sys.argv](#1-sysargv) 9 | - [2. sys.byteorder](#2-sysbyteorder) 10 | - [3. sys.builtin_module_names](#3-sysbuiltin_module_names) 11 | - [4. 一个样例](#4-一个样例) 12 | - [5. 参考](#5-参考) 13 | 14 | 15 | # 1. sys.argv 16 | 1. 传递给Python脚本的命令行参数列表。 17 | 2. argv[0]是脚本名称(依赖于OS,无论是否是完整的路径) 18 | 3. 之后argv[]链表中为顺序向下排序的参数 19 | 20 | # 2. sys.byteorder 21 | 1. 本机自己顺序的指示符 22 | 2. big 23 | 3. big-endian:最重要的字符优先 24 | 4. little 25 | 5. little-endian:最不重要的字符优先 26 | 27 | # 3. sys.builtin_module_names 28 | 1. 一个字符串元组 29 | 30 | # 4. 一个样例 31 | ```python 32 | #-*- coding:utf-8 -*- 33 | import os 34 | import io 35 | from surprise import KNNBaseline 36 | from surprise import Dataset 37 | from surprise import Reader 38 | import logging 39 | import sys 40 | 41 | def getSimModle(file_path): 42 | reader = Reader(line_format="user item rating", sep ="|") # 分隔符为空白键 43 | data = Dataset.load_from_file(file_path, reader=reader) 44 | trainset = data.build_full_trainset() 45 | sim_options = {"name":'pearson_baseline','usr_based':False} 46 | algo = KNNBaseline(sim_options=sim_options) 47 | algo.fit(trainset) 48 | return algo 49 | 50 | def read_item_names(file_name): 51 | type_to_uid = {} 52 | uid_to_type = {} 53 | with io.open(file_name,'r',encoding = 'ISO-8859-1') as f: 54 | for line in f: 55 | line = line.split("|") 56 | uid_to_type[line[0]] = line[1] 57 | type_to_uid[line[1]] = line[0] 58 | return uid_to_type, type_to_uid 59 | 60 | def showSimilarMovies(algo, uid_to_type, type_to_uid): 61 | print(type_to_uid) 62 | type1_uid = type_to_uid["1"] 63 | logging.debug('raw_id='+type1_uid) 64 | 65 | type1_inner_uid = algo.trainset.to_inner_iid(type1_uid) 66 | logging.debug('inner_id = '+str(type1_inner_uid)) 67 | 68 | type1_neighbors = algo.get_neighbors(type1_inner_uid,2) 69 | logging.debug("neighbors_id = " + str(type1_neighbors)) 70 | 71 | neighbors_raw_ids = [algo.trainset.to_raw_iid(inner_id) for inner_id in type1_neighbors] 72 | neighbors_movies = [uid_to_type[raw_id ] for raw_id in neighbors_raw_ids] 73 | print('The 2 nearest_neighbors of 1 are:') 74 | for movie in neighbors_movies: 75 | print(movie) 76 | 77 | if __name__ == '__main__': 78 | file_name = sys.argv[1];#"D:/basic/data.txt" 79 | uid_to_type,type_to_uid = read_item_names(file_name) 80 | 81 | algo = getSimModle(file_name) 82 | 83 | showSimilarMovies(algo,uid_to_type,type_to_uid) 84 | ``` 85 | 86 | # 5. 参考 87 | 1. sys模块简介 88 | 89 | -------------------------------------------------------------------------------- /Python/Python 扩展库/tqdm.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. tqdm](#1-tqdm) 4 | - [2. 使用方法](#2-使用方法) 5 | 6 | 7 | 8 | # 1. tqdm 9 | 1. Tqdm是一个快速,可扩展的Python进度条,可以在Python长循环中添加一个进度显示信息,用户需要封装任意的迭代器tqdm的迭代器。 10 | 11 | # 2. 使用方法 12 | 1. tqdm(list)方法可以传入任意一种list,比如数组。或者string的数组。 13 | ```python 14 | from tqdm import tqdm 15 | for i in tqdm(range(1000)): 16 | #do something 17 | pass 18 | ``` 19 | 2. 使用trange:这个是tqdm(range(i))的简单写法 20 | ```python 21 | from tqdm import trange 22 | for i in trange(100): 23 | #do something 24 | pass 25 | ``` 26 | 3. 手动方法:使用for循环外部初始化tqdm,可以打印其他信息。 27 | ```python 28 | pbar = tqdm(["a", "b", "c", "d"]) 29 | for char in pbar: 30 | pbar.set_description("Processing %s" % char) 31 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/wget.md: -------------------------------------------------------------------------------- 1 | wget 2 | --- 3 | 4 | 5 | 6 | - [1. 什么wget呢?](#1-什么wget呢) 7 | - [2. 安装wget](#2-安装wget) 8 | - [3. 函数](#3-函数) 9 | 10 | 11 | 12 | # 1. 什么wget呢? 13 | 1. wget是一个网络上自动下载文件的自由工具。它支持HTTP,HTTPS和FTP协议,可以使用HTTP代理 14 | 15 | # 2. 安装wget 16 | 1. `pip install wget` 17 | 18 | # 3. 函数 19 | ```py 20 | # -*- coding: utf-8 -*- 21 | import wget, tarfileimport os # 网络地址 22 | DATA_URL = 'http://www.robots.ox.ac.uk/~ankush/data.tar.gz'# 本地硬盘文件# 23 | DATA_URL = '/home/xxx/book/data.tar.gz' out_fname = 'abc.tar.gz' wget.download(DATA_URL, out=out_fname)# 提取压缩包 24 | tar = tarfile.open(out_fname) 25 | tar.extractall() 26 | tar.close()# 删除下载文件 27 | os.remove(out_fname) 28 | ``` -------------------------------------------------------------------------------- /Python/Python 扩展库/wordcloud.md: -------------------------------------------------------------------------------- 1 | wordcloud 2 | --- 3 | 1. 本文主要记录了如何绘制词云的简单过程。 4 | 5 | 6 | 7 | - [1. 准备工作](#1-准备工作) 8 | - [2. 具体编码](#2-具体编码) 9 | - [不支持中文的解决方案](#不支持中文的解决方案) 10 | - [3. 参考文献](#3-参考文献) 11 | 12 | 13 | 14 | # 1. 准备工作 15 | ``` 16 | 以下是需要的扩展库 17 | re 18 | collections 19 | numpy 20 | jieba 21 | wordcloud 22 | PIL 23 | matplotlib.pyplot 24 | ``` 25 | 26 | 1. 我们打算统计的文件,命名为:`article.txt` 27 | 2. 我们打算使用做为背景的图片:`wordcloud.jpg` 28 | 29 | # 2. 具体编码 30 | ```py 31 | # 导入扩展库 32 | import re # 正则表达式库 33 | import collections # 词频统计库 34 | import numpy as np # numpy数据处理库 35 | import jieba # 结巴分词 36 | import wordcloud # 词云展示库 37 | from PIL import Image # 图像处理库 38 | import matplotlib.pyplot as plt # 图像展示库 39 | 40 | # 读取文件 41 | fn = open('article.txt') # 打开文件 42 | string_data = fn.read() # 读出整个文件 43 | fn.close() # 关闭文件 44 | 45 | # 文本预处理 46 | pattern = re.compile(u'\t|\n|\.|-|:|;|\)|\(|\?|"') # 定义正则表达式匹配模式 47 | string_data = re.sub(pattern, '', string_data) # 将符合模式的字符去除 48 | 49 | # 文本分词 50 | seg_list_exact = jieba.cut(string_data, cut_all = False) # 精确模式分词 51 | object_list = [] 52 | 53 | # 可以替换为从文件读入停用词 54 | remove_words = [u'的', u',',u'和', u'是', u'随着', u'对于', u'对',u'等',u'能',u'都',u'。',u' ',u'、',u'中',u'在',u'了',u'通常',u'如果',u'我们',u'需要'] # 自定义去除词库 55 | 56 | for word in seg_list_exact: # 循环读出每个分词 57 | if word not in remove_words: # 如果不在去除词库中 58 | object_list.append(word) # 分词追加到列表 59 | 60 | # 词频统计 61 | word_counts = collections.Counter(object_list) # 对分词做词频统计 62 | word_counts_top10 = word_counts.most_common(10) # 获取前10最高频的词 63 | print (word_counts_top10) # 输出检查 64 | 65 | # 词频展示 66 | mask = np.array(Image.open('wordcloud.jpg')) # 定义词频背景 67 | wc = wordcloud.WordCloud( 68 | font_path = 'C:/Windows/Fonts/simhei.ttf', # 设置字体格式 69 | mask = mask, # 设置背景图 70 | max_words = 200, # 最多显示词数 71 | max_font_size = 100 # 字体最大值 72 | ) 73 | 74 | wc.generate_from_frequencies(word_counts) # 从字典生成词云 75 | image_colors = wordcloud.ImageColorGenerator(mask) # 从背景图建立颜色方案 76 | wc.recolor(color_func = image_colors) # 将词云颜色设置为背景图方案 77 | plt.imshow(wc) # 显示词云 78 | plt.axis('off') # 关闭坐标轴 79 | plt.show() # 显示图像 80 | ``` 81 | 82 | # 不支持中文的解决方案 83 | 1. 我们还需要将使用jieba进行分词,然后字体需要设置ttf文件 84 | 85 | # 3. 参考文献 86 | 1. Python实现一个词频统计(词云)图 -------------------------------------------------------------------------------- /Python/Python 扩展库/zipfile.md: -------------------------------------------------------------------------------- 1 | zipfile 2 | --- 3 | 1. Python的用于解压压缩包的库 4 | 5 | 6 | 7 | - [1. 打开zip文件](#1-打开zip文件) 8 | - [2. 查看压缩包中的文件名问题](#2-查看压缩包中的文件名问题) 9 | - [3. 压缩包文件中文乱码问题](#3-压缩包文件中文乱码问题) 10 | - [4. 查看压缩包中的文件原始大小和压缩后大小](#4-查看压缩包中的文件原始大小和压缩后大小) 11 | - [5. 文件解压缩](#5-文件解压缩) 12 | - [5.1. 特定文件解压缩](#51-特定文件解压缩) 13 | - [5.2. 全部文件解压缩](#52-全部文件解压缩) 14 | - [6. 压缩文件](#6-压缩文件) 15 | - [6.1. 多个文件压缩](#61-多个文件压缩) 16 | - [6.2. 向已有压缩包添加文件](#62-向已有压缩包添加文件) 17 | - [7. 参考](#7-参考) 18 | 19 | 20 | 21 | # 1. 打开zip文件 22 | ```py 23 | import zipfile 24 | with zipfile.ZipFile('demo.zip','r') as zzz: 25 | print("Success") 26 | ``` 27 | 28 | # 2. 查看压缩包中的文件名问题 29 | ```py 30 | with zipfile.ZipFile('demo.zip','r') as zzz: 31 | print(zzz.namelist()) 32 | # 运行结果:['file1.txt', 'file2.txt', 'temp_file.png'] 33 | ``` 34 | 35 | # 3. 压缩包文件中文乱码问题 36 | ```py 37 | with zipfile.ZipFile('demo.zip','r') as zzz: 38 | for f_name in zzz.namelist(): 39 | print(f_name.encode('cp437').decode('gbk')) 40 | ''' 运行结果: 41 | file1.txt 42 | file2.txt 43 | temp_file.png 44 | 数据分析.PNG''' 45 | ``` 46 | 47 | # 4. 查看压缩包中的文件原始大小和压缩后大小 48 | ```py 49 | with zipfile.ZipFile('demo.zip','r') as zzz: 50 | for f_name in zzz.namelist(): 51 | f_info = zzz.getinfo(f_name) 52 | f_name = f_name.encode('cp437').decode('gbk') 53 | # 输出该文件的文件大小.file_size和压缩之后的大小compress_size 54 | print(f_name,f_info.file_size,f_info.compress_size) 55 | ''' 运行结果: 56 | file1.txt 98 47 57 | file2.txt 98 47 58 | temp_file.png 22061 18211 59 | 数据分析.PNG 178210 177931''' 60 | # 除了大小之外.getinfo()还可以读取出filename、compress_type、external_attr属性。 61 | ``` 62 | 63 | # 5. 文件解压缩 64 | 65 | ## 5.1. 特定文件解压缩 66 | ```py 67 | with zipfile.ZipFile('demo.zip','r') as zzz: 68 | zzz.extract('file1.txt',target_place) 69 | # 把压缩包里的file1.txt解压到当前目录 70 | # 如果压缩包里出现中文,则需要进行转码(所以在用Python压缩文件和解压的时候最好不要出现中文路径和文件名) 71 | ``` 72 | 73 | ## 5.2. 全部文件解压缩 74 | ```py 75 | with zipfile.ZipFile('Python.zip','r') as zzz: 76 | zzz.extractall('解压到这里',pwd=b'123456') 77 | ``` 78 | 1. 这里表示可以使用计算机暴力破解压缩包密码 79 | 80 | # 6. 压缩文件 81 | 82 | ## 6.1. 多个文件压缩 83 | ```py 84 | f_list = ['file1.txt','file2.txt','temp_file.png','./py/hello.py'] 85 | with zipfile.ZipFile('sample.zip','w') as z: 86 | for f_name in f_list: 87 | z.write(f_name) 88 | ``` 89 | 90 | ## 6.2. 向已有压缩包添加文件 91 | ```py 92 | 93 | f_list = ['temp_folder.png','./py/game.py'] 94 | with zipfile.ZipFile('sample.zip','a') as z: 95 | for f_name in f_list: 96 | z.write(f_name) 97 | ``` 98 | 99 | 1. `w`的方式表示是覆盖写 100 | 2. `a`的方式表示是添加写 101 | 102 | # 7. 参考 103 | 1. Python读取、创建和压缩ZIP -------------------------------------------------------------------------------- /Python/Python 文件路径.md: -------------------------------------------------------------------------------- 1 | python文件路径 2 | --- 3 | 4 | 5 | 6 | - [1. 文件路径](#1-文件路径) 7 | - [1.1. 绝对路径](#11-绝对路径) 8 | - [1.2. 相对路径](#12-相对路径) 9 | - [1.2.1. 参考](#121-参考) 10 | 11 | 12 | 13 | # 1. 文件路径 14 | 1. 既然需要处理文件,那我们不得不说,文件的相对路径和绝对路径是我们必须要解决的问题。 15 | 16 | ## 1.1. 绝对路径 17 | 1. 绝对路径很好理解,也就是在我们当前的文件系统下的绝对路径。 18 | 2. 但是存在相应的问题,在我们移植到服务器上的时候显然我们会出现找不到相应文件的问题。 19 | 20 | ## 1.2. 相对路径 21 | 1. "/":表示根目录,在windows系统下表示某个盘的根目录,如"E:\"; 22 | 23 | 2. "./":表示当前目录;(表示当前目录时,也可以去掉"./",直接写文件名或者下级目录) 24 | 3. "../":表示上级目录。 25 | 26 | ![](https://s2.ax1x.com/2020/01/01/lG60KS.png) 27 | 28 | ```py 29 | def checkfile(filepath): 30 | with open(filepath,'r') as f: 31 | print(f.read()) 32 | checkfile('./file1') 33 | checkfile('file1') 34 | checkfile('test3/file5') 35 | checkfile('../test2/file2') 36 | checkfile('../test2/test4/file6') 37 | checkfile('../file3') 38 | ``` 39 | 40 | ### 1.2.1. 参考 41 | 1. Python相对路径 42 | -------------------------------------------------------------------------------- /Python/Python 机器学习/Python 保存或加载模型.md: -------------------------------------------------------------------------------- 1 | Python保存和加载模型 2 | --- 3 | 1. 众所周知,我们将模型训练完成后,希望能够存储下来,在以后不必再次重复训练模型。 4 | 2. 同时在以后使用的时候,希望能够加载已经训练好的模型。 5 | 6 | 7 | 8 | - [1. sklearn](#1-sklearn) 9 | - [1.1. sklearn保存模型](#11-sklearn保存模型) 10 | - [1.2. sklearn加载模型](#12-sklearn加载模型) 11 | - [2. Keras](#2-keras) 12 | - [2.1. 保存h5模型](#21-保存h5模型) 13 | - [2.2. 加载h5模型](#22-加载h5模型) 14 | - [2.3. 保存h5模型](#23-保存h5模型) 15 | - [3. 参考](#3-参考) 16 | 17 | 18 | 19 | # 1. sklearn 20 | 21 | ## 1.1. sklearn保存模型 22 | ```py 23 | from sklearn.externals import joblib 24 | A=[[1,2,3],[4,5,6],[7,8,9]] 25 | B=A+A 26 | print(B) 27 | # 保存模型 28 | joblib.dump(B, 'saved_model/B.pkl') 29 | ``` 30 | 31 | ## 1.2. sklearn加载模型 32 | ```py 33 | from sklearn.externals import joblib 34 | B = joblib.load('saved_model/B.pkl') 35 | print(B) 36 | ``` 37 | 38 | # 2. Keras 39 | 40 | ## 2.1. 保存h5模型 41 | ```py 42 | 43 | ``` 44 | 45 | ## 2.2. 加载h5模型 46 | ```py 47 | from keras.models import load_model 48 | 49 | model_dir = 'xxx.h5' 50 | model = load_model(model_dir) 51 | model.summary() 52 | ``` 53 | 54 | ## 2.3. 保存h5模型 55 | ```py 56 | model.save_weights("./model/my_mnist_weights.h5") 57 | ``` 58 | 59 | # 3. 参考 60 | 1. sklearn模型 61 | 2. 如何加载保存好的keras神经网络h5模型 -------------------------------------------------------------------------------- /Python/Python 机器学习/Python 手写体识别.md: -------------------------------------------------------------------------------- 1 | Python 手写体识别 2 | --- 3 | 4 | # 1. Keras 实现手写体识别 5 | ```py 6 | # 导入Keras 7 | import keras 8 | # 从keras中导入mnist数据集 9 | from keras.datasets import mnist 10 | # 导入序贯模型 11 | from keras.models import Sequential 12 | # 导入全连接层 13 | from keras.layers import Dense 14 | # 导入优化函数 15 | from keras.optimizers import SGD 16 | 17 | # 训练 18 | if __name__ == '__main__': 19 | # 下载mnist数据集 20 | (x_train, y_train), (x_test, y_test) = mnist.load_data() 21 | 22 | # 将图片摊平,变成向量 23 | x_train = x_train.reshape(60000, 784) 24 | # 对测试集进行同样的处理 25 | x_test = x_test.reshape(10000, 784) 26 | 27 | x_train = x_train / 255 28 | x_test = x_test / 255 29 | y_train = keras.utils.to_categorical(y_train,10) 30 | y_test = keras.utils.to_categorical(y_test,10) 31 | 32 | # 构建一个空的序贯模型 33 | model = Sequential() 34 | # 添加神经网络层 35 | model.add(Dense(512,activation='relu',input_shape=(784,))) 36 | model.add(Dense(256,activation='relu')) 37 | model.add(Dense(10,activation='softmax')) 38 | model.summary() 39 | model.compile(optimizer=SGD(),loss='categorical_crossentropy',metrics=['accuracy']) 40 | 41 | # 此处直接将测试集用作了验证集 42 | model.fit(x_train, y_train, batch_size=64, 43 | epochs=100, validation_data=(x_test,y_test)) 44 | model.save_weights("./model/my_mnist_weights.h5") 45 | score = model.evaluate(x_test,y_test) 46 | print("loss:",score[0]) 47 | print("accu:",score[1]) 48 | ``` 49 | 50 | # 2. 参考 51 | 1. Python(TensorFlow框架)实现手写数字识别系统 -------------------------------------------------------------------------------- /Python/Python 机器学习/Python 聚类分析.md: -------------------------------------------------------------------------------- 1 | 聚类分析 2 | --- 3 | 1. 聚类是数据挖掘描述性任务和预测性任务的一个重要组成部分,他以相似性为基础,把相似的对象通过静态分类,分成不同的组别和子集。 4 | 5 | 6 | 7 | - [1. k-mean算法](#1-k-mean算法) 8 | - [2. Scikit-learn](#2-scikit-learn) 9 | - [2.1. K-Mean算法](#21-k-mean算法) 10 | - [2.2. 支持向量机算法](#22-支持向量机算法) 11 | 12 | 13 | 14 | # 1. k-mean算法 15 | 1. 任意选k个对象作为初识的聚类的中心 16 | 2. 接着对每个点确定他的聚类中心 17 | + 一般使用距离,使用均方差作为标准测度函数 18 | 3. 接下来确定每个新聚类的聚类中心,直到收敛。 19 | + 也就是知道确定的中心点不再改变 20 | 4. 原则特点:保证各聚类之间尽可能紧凑,各聚类之间尽可能的分开 21 | 5. SciPy的cluster模块中有一个vq,一个矢量量化包 22 | 6. k-means是局部最优解,而不是全局最优解 23 | ```python 24 | import numpy as np 25 | from scipy.cluster.vq import vq,kmeans,whiten 26 | list1 = [1,2,3] 27 | list2 = [2,3,4] 28 | list3 = [3,4,5] 29 | data = np.array([list1,list2,list3]) 30 | whiten = whiten(data)# 计算各列的标准差,形成新的数组 31 | centroids,_ = kmeans(whiten,2)# 对数据进行聚类,第二个参数(分为几类),返回一个元组,第二个_是占位符 32 | result,_ = vq(whiten,centroids)# 是一个矢量量化,对其中的每一个人进行分类获得结果 33 | result => [1,0,0,1,1,0] 34 | ``` 35 | 36 | 37 | # 2. Scikit-learn 38 | 1. 著名的机器学习包,提供了各种机器学习的接口 39 | 40 | ## 2.1. K-Mean算法 41 | ```python 42 | import numpy as np 43 | from sklearn.cluster import KMeans 44 | list1 = [1,2,3] 45 | list2 = [2,3,4] 46 | list3 = [3,4,5] 47 | data = np.array([list1,list2,list3]) 48 | kmeans = KMeans(n_cluster = 2).fit(data)# 对确定的数据解来进行聚类 49 | pred = Kmeans.predict(data)# 根据聚类结果来对数据集进行分类 50 | print(pred) 51 | ``` 52 | 53 | ## 2.2. 支持向量机算法 54 | ```python 55 | from sklearn import datasets 56 | from sklearn import svm 57 | clf = svm.SVC(gamma = 0.001,C= 100.) 58 | digits = datasets.load_digits() 59 | clf.fit(digits.data[:-1],digits.target[:-1]) 60 | clf.predict(digits.data[-1]) 61 | ``` -------------------------------------------------------------------------------- /Python/Python 爬虫/爬虫环境配置问题(部分).md: -------------------------------------------------------------------------------- 1 | 2 | # 1. 环境配置 3 | 1. 把下载好的chromedriver放到c:anaconda中去 4 | 2. path问题'chromedriver' executable needs to be in PATH问题 -------------------------------------------------------------------------------- /Python/Python 编码格式.md: -------------------------------------------------------------------------------- 1 | Python 编码格式的问题汇总 2 | --- 3 | 4 | 5 | 6 | - [1. UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position](#1-unicodeencodeerror-gbk-codec-cant-encode-character-xa9-in-position) 7 | - [2. 爬取网页的编码问题的解决方案](#2-爬取网页的编码问题的解决方案) 8 | - [2.1. 方法一:对之后的对象进行解码(不推荐,有问题)](#21-方法一对之后的对象进行解码不推荐有问题) 9 | - [2.2. 方法二:一开始就处理网页编码形式](#22-方法二一开始就处理网页编码形式) 10 | 11 | 12 | 13 | # 1. UnicodeEncodeError: 'gbk' codec can't encode character '\xa9' in position 14 | ```py 15 | temp = string.encode('gbk','ignore') 16 | print(temp.decode('gbk')) 17 | ``` 18 | 19 | 1. 通过直接ignore来完成避免(较为通用) 20 | 21 | # 2. 爬取网页的编码问题的解决方案 22 | 23 | ## 2.1. 方法一:对之后的对象进行解码(不推荐,有问题) 24 | ```python 25 | import requests 26 | from bs4 import BeautifulSoup 27 | r = requests.get("https://www.biquke.com/bq/59/59567/8131142.html") 28 | soup = BeautifulSoup(r.text,'lxml') 29 | r.encoding()# ISO-8859-1需要转码成utf-8 30 | pattern = soup.find_all('h1') 31 | for x in pattern: 32 | x_temp = x.string 33 | x = x_temp.encode('ISO-8859-1') 34 | print(" "+x.decode('utf-8')) 35 | ``` 36 | 37 | ## 2.2. 方法二:一开始就处理网页编码形式 38 | ```python 39 | import requests 40 | from bs4 import BeautifulSoup 41 | r = requests.get("https://www.biquke.com/bq/59/59567/8131142.html") 42 | r.encoding = 'utf-8' 43 | soup = BeautifulSoup(r.text,'lxml') 44 | r.encoding()# ISO-8859-1需要转码成utf-8 45 | pattern = soup.find_all('h1') 46 | for x in pattern: 47 | x_temp = x.string 48 | x = x_temp.encode('ISO-8859-1') 49 | print(" "+x.decode('utf-8')) 50 | ``` 51 | -------------------------------------------------------------------------------- /Python/Python 面向对象.md: -------------------------------------------------------------------------------- 1 | Python面向对象 2 | --- 3 | 1. 目前比较公认的面向对象特征来自斯坦福大学的John Mitchell的"concepts in programming languages",包括动态绑定、抽象、子类多态性和继承。 4 | 5 | 6 | 7 | - [1. 抽象](#1-抽象) 8 | - [2. 继承](#2-继承) 9 | - [2.1. 子类](#21-子类) 10 | - [2.1.1. 子类的重载](#211-子类的重载) 11 | - [2.1.2. 私有属性和方法](#212-私有属性和方法) 12 | 13 | 14 | # 1. 抽象 15 | 1. 类:抽象出来描述了对象的特征。 16 | 1. 如果类什么都没做,类则称为被作为名称空间(namespace) 17 | 2. 类属性:属于一个类,在类别创建后被使用,可以在类中方法和主程序方法中更新,和实例无关 18 | + 外部调用:`class_name.attr` 19 | + 内部调用:`self.attr` 20 | ```python 21 | class ClassName(odject):# 括号中是其超类,如果没有的话,就是object 22 | # 数据和行为 23 | count = 1 #类属性 24 | def setName(self,name): 25 | self.name = name 26 | def function(self):# 要求第一个参数必须是self,无对应 27 | action 28 | 29 | ``` 30 | 2. 对象:封装,类的实例 31 | 1. 实例:`dog = Dog()` 32 | 2. 对象的初识话方法:`__init__(self,)`:Python自动调用的第一个方法,构造方法 33 | 3. 程序入口:`if__name__ == '__main__'` 34 | 35 | # 2. 继承 36 | 1. 父类(基类)子类(派生类) 37 | + "is-a"关系 38 | 2. "has-a"关系 39 | 40 | ## 2.1. 子类 41 | 1. 定义:如果无继承则使用object 42 | ```python 43 | class SubClassName(ParentClass1[,ParentClass2,...]): 44 | class_suite 45 | ``` 46 | 2. 支持单继承和多继承 47 | 48 | ### 2.1.1. 子类的重载 49 | 1. 可以重写父类的相应方法:但是重写了初始化方法不会直接自动调用父类的初始化方法。 50 | 51 | ### 2.1.2. 私有属性和方法 52 | 1. 通过"访问控制符"来限定成员函数的访问 53 | 2. `__`双下划线:_var属性会被__classname_var替换,防止父类与子类中的同名冲突 54 | 3. `_`单下划线:防止模块属性被通过import进行加载 -------------------------------------------------------------------------------- /Python/img/path/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Python/img/path/1.png -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Tec-Be 2 | 后端技术学习 3 | -------------------------------------------------------------------------------- /Redis/Redis Key.md: -------------------------------------------------------------------------------- 1 | Redis Key 2 | --- 3 | 4 | 1. 大小写不敏感 5 | 2. EXPIRE进行过期设置 6 | 3. KEYS Pattern:查找对应键:keys * 7 | 8 | # 1. 详情 9 | Redis 键(key) -------------------------------------------------------------------------------- /Redis/Redis Rehash.md: -------------------------------------------------------------------------------- 1 | Redis Rehash 2 | --- 3 | 4 | 1. 正常情况下master到达满容后根据驱逐策略淘汰Key并同步给Slave,因此Slave在这种情况下也不会因满容触发驱逐 5 | 1. 集中排查思路聚焦Slave内存陡增的问题上 6 | 2. 包括客户端连接、输出/输出缓冲区、业务数据存取访问、网路抖动等导致Redis内存陡增的所有外部因素。 7 | 3. 而这容易导致线上集群发生大量淘汰,而导致主从不一致的问题,同时在业务层面也会发生大量超时,影响业务的可用性。 8 | 2. 案例描述:Redis满容状态下由于Rehash导致大量的Key被驱逐 9 | 3. 美团针对Redis Rehash机制的探索和实践 -------------------------------------------------------------------------------- /Redis/Redis 总述.md: -------------------------------------------------------------------------------- 1 | Redis 总述 2 | --- 3 | 4 | 5 | 6 | - [1. 什么是Redis](#1-什么是redis) 7 | - [2. Redis的特点](#2-redis的特点) 8 | - [3. Redis 优势](#3-redis-优势) 9 | - [4. Redis 配置](#4-redis-配置) 10 | - [5. 在线测试Redis](#5-在线测试redis) 11 | 12 | 13 | 14 | # 1. 什么是Redis 15 | 1. Redis是一个开源的使用ANSI C语言编写、遵守BSD协议、支持网络、可基于内存亦可持久化的日志型、**Key-Value**数据库,并提供多种语言的API。 16 | 2. 它通常被称为数据结构服务器,因为值(value)可以是 字符串(String), 哈希(Hash), 列表(list), 集合(sets) 和有序集合(sorted sets)等类型。 17 | 18 | # 2. Redis的特点 19 | 1. Redis支持数据的持久化,可以将内存中的数据保存在磁盘中,重启的时候可以再次加载进行使用。 20 | 2. Redis不仅仅支持简单的key-value类型的数据,同时还提供list,set,zset,hash等数据结构的存储。 21 | 3. Redis支持数据的备份,即master-slave模式的数据备份。 22 | 23 | # 3. Redis 优势 24 | 1. 性能极高 – Redis能读的速度是110000次/s,写的速度是81000次/s 。 25 | 2. 丰富的数据类型 – Redis支持二进制案例的 Strings, Lists, Hashes, Sets 及 Ordered Sets 数据类型操作。 26 | 3. 原子 – Redis的所有操作都是原子性的,意思就是要么成功执行要么失败完全不执行。单个操作是原子性的。多个操作也支持事务,即原子性,通过MULTI和EXEC指令包起来。 27 | 4. 丰富的特性 – Redis还支持 publish/subscribe, 通知, key 过期等等特性。 28 | 29 | # 4. Redis 配置 30 | Redis 配置 31 | 32 | # 5. 在线测试Redis 33 | 在线Redis -------------------------------------------------------------------------------- /Redis/Redis 扩展功能.md: -------------------------------------------------------------------------------- 1 | Redis 扩展功能 2 | --- 3 | 4 | 5 | 6 | - [1. Redis HyperLogLog](#1-redis-hyperloglog) 7 | - [2. 发布订阅](#2-发布订阅) 8 | - [3. 事务](#3-事务) 9 | - [4. 脚本](#4-脚本) 10 | - [5. 性能测试](#5-性能测试) 11 | 12 | 13 | 14 | # 1. Redis HyperLogLog 15 | 1. Redis HyperLogLog 是用来做基数统计的算法,HyperLogLog 的优点是,在输入元素的数量或者体积非常非常大时,计算基数所需的空间总是固定 的、并且是很小的。 16 | 2. 比如数据集 {1, 3, 5, 7, 5, 7, 8}, 那么这个数据集的基数集为 {1, 3, 5 ,7, 8}, 基数(不重复元素)为5。 基数估计就是在误差可接受的范围内,快速计算基数。 17 | 3. 更多参考 18 | 19 | # 2. 发布订阅 20 | 1. Redis发布订阅(pub/sub)是一种消息通信模式:发送者(pub)发送信息,订阅者(sub)接收信息。 21 | 2. Redis客户端可以订阅任何数量的客户 22 | 3. 满足了分布式的需求 23 | 4. 参考 24 | 25 | # 3. 事务 26 | 1. Redis事务可以可以依次执行多个命令,并且带有以下三个重要的保证。 27 | 1. 批量操作在发送 EXEC 命令前被放入队列缓存。 28 | 2. 收到 EXEC 命令后进入事务执行,事务中任意命令执行失败,其余的命令依然被执行。 29 | 3. 在事务执行过程,其他客户端提交的命令请求不会插入到事务执行命令序列中。 30 | 2. 事务从开始到执行会经历以下阶段: 31 | 1. 开始事务:`MULTI` 32 | 2. 命令入队:`具体命令`:会提示:`QUEUED` 33 | 3. 执行事务:`EXEC` 34 | 35 | # 4. 脚本 36 | 1. Redis 脚本使用 Lua 解释器来执行脚本。 Redis 2.6 版本通过内嵌支持 Lua 环境。执行脚本的常用命令为`EVAL` 37 | 2. 基本语法:`redis 127.0.0.1:6379> EVAL script numkeys key [key ...] arg [arg ...]` 38 | 3. 例子: 39 | 40 | ``` 41 | redis 127.0.0.1:6379> EVAL "return {KEYS[1],KEYS[2],ARGV[1],ARGV[2]}" 2 key1 key2 first second 42 | 43 | 1 "key1" 44 | 2 "key2" 45 | 3 "first" 46 | 4 "second" 47 | ``` 48 | 49 | # 5. 性能测试 50 | 1. `redis-benchmark [option] [option value]` 51 | 2. 测试命令:`$ redis-benchmark -n 10000 -q` 52 | 53 | 具体测试命令 -------------------------------------------------------------------------------- /Redis/Redis 数据与安全.md: -------------------------------------------------------------------------------- 1 | Redis 数据与安全 2 | --- 3 | 4 | 5 | 6 | - [1. 数据备份](#1-数据备份) 7 | - [2. 恢复数据](#2-恢复数据) 8 | - [3. 安全验证](#3-安全验证) 9 | 10 | 11 | 12 | # 1. 数据备份 13 | >`redis 127.0.0.1:6379> SAVE` 14 | 15 | 1. 默认被分到redis安全目录中创建的dump.rdb文件 16 | 17 | >`127.0.0.1:6379> BGSAVE` 18 | 19 | 2. 如上命令我们是在后台执行保存命令 20 | 21 | # 2. 恢复数据 22 | 1. 将备份文件(dump.rdb)移动到redis安装目录并启动服务即可。获取redis目录也可以使用CONFIG命令 23 | 24 | ``` 25 | redis 127.0.0.1:6379> CONFIG GET dir 26 | 1 "dir" 27 | 2 "/usr/local/redis/bin" 28 | ``` 29 | 30 | # 3. 安全验证 31 | 1. 查看是否设置了密码验证 32 | 33 | ``` 34 | 127.0.0.1:6379> CONFIG get requirepass 35 | 1 "requirepass" 36 | 2 "" 37 | ``` 38 | 39 | 2. 设置是否需要密码,以及密码 40 | 41 | ``` 42 | 127.0.0.1:6379> CONFIG set requirepass "runoob" 43 | OK 44 | 127.0.0.1:6379> CONFIG get requirepass 45 | 1 "requirepass" 46 | 2 "runoob" 47 | ``` -------------------------------------------------------------------------------- /Redis/Redis 数据类型.md: -------------------------------------------------------------------------------- 1 | Redis 数据类型 2 | --- 3 | 1. Redis支持五种数据类型:string、hash、list、set、zset 4 | 2. 操作返回为1表示成功,0则表示失败 5 | 6 | 7 | 8 | - [1. String(字符串)](#1-string字符串) 9 | - [2. Hash(哈希)](#2-hash哈希) 10 | - [3. List(列表)](#3-list列表) 11 | - [4. Set(集合)](#4-set集合) 12 | - [5. zset(sorted set:有序集合)](#5-zsetsorted-set有序集合) 13 | 14 | 15 | 16 | # 1. String(字符串) 17 | 1. key-value格式 18 | 2. 二进制安全(可以存储jpg图片或者序列化的对象) 19 | 3. 最大存储长度 512MB 20 | 4. 每个hash可以存储232-1键值对 21 | 22 | 更多命令 23 | 24 | ``` 25 | SET runnob "123" 26 | GET runnob 27 | ``` 28 | 29 | # 2. Hash(哈希) 30 | 1. Redis hash是一个键值(key-value)集合 31 | 2. 是一个string类型的field和value的映射表,hash特别适合存储对象 32 | 3. 要先删除之前存储的键才能进行基础存储 33 | 34 | 更多命令 35 | 36 | ``` 37 | HMSET runoob field1 "Hello" field2 "World" 38 | HGET runoob field1 39 | HGET runoob field2 40 | ``` 41 | 42 | # 3. List(列表) 43 | 1. Redis类表是简单的字符串列表,按照插入顺序排序。 44 | 2. 插入元素到列表左部:`lpush runnob redis` 45 | 3. 插入元素到列表右边:`rpush runnob mogo` 46 | 4. 开始查看元素:`lrange runnob 0 10` 47 | 48 | 更多命令 49 | 50 | # 4. Set(集合) 51 | 1. Set是string类型的无序集合 52 | 2. 集合是通过哈希表实现的,所以添加,删除,查找的复杂度都是O(1) 53 | 3. 如果为0表示已经在其中了 54 | 4. 插入元素:`sadd runoob redis` 55 | 5. 查看元素:`smembers runoob` 56 | 6. 集合可以存储232-1键值对 57 | 58 | 更多命令 59 | 60 | # 5. zset(sorted set:有序集合) 61 | 1. zset是不允许重复的,成员是唯一的但是score是可以重复的 62 | 2. 每一个元素都关联一个double的分数 63 | 3. Redis通过score完成集合中的排序 64 | 4. 添加命令:`zadd key score member` 65 | 5. 查看命令:`ZRANGEBYSCORE runnob 0 1000` 66 | 1. 按照分数从小到大排序 67 | 68 | 更多命令 -------------------------------------------------------------------------------- /Redis/Redis 连接.md: -------------------------------------------------------------------------------- 1 | Redis 连接 2 | --- 3 | 4 | 5 | 6 | - [1. Redis客户端的基本语法](#1-redis客户端的基本语法) 7 | - [2. 测试客户端的连通情况](#2-测试客户端的连通情况) 8 | - [3. 连接远程的redis服务](#3-连接远程的redis服务) 9 | - [4. Redis 服务器](#4-redis-服务器) 10 | - [5. 管道技术](#5-管道技术) 11 | - [6. 分区技术](#6-分区技术) 12 | 13 | 14 | 15 | # 1. Redis客户端的基本语法 16 | `$redis-cli` 17 | 18 | # 2. 测试客户端的连通情况 19 | ``` 20 | redis 127.0.0.1:6379> PING 21 | PONG 22 | redis 127.0.0.1:6379> AUTH "password" 23 | OK 24 | ``` 25 | 参考 26 | 27 | # 3. 连接远程的redis服务 28 | `$ redis-cli -h host -p port -a password` 29 | 30 | # 4. Redis 服务器 31 | Redis 服务器 32 | 33 | 1. 最大连接数: 34 | ``` 35 | config get maxclients 36 | 1 "maxclients" 37 | 2 "10000" 38 | ``` 39 | 40 | 2. 启动时设置最大连接数 41 | 42 | ``` 43 | redis-server --maxclients 100000 44 | ``` 45 | # 5. 管道技术 46 | 管道测试 47 | 48 | # 6. 分区技术 49 | Redis 分区 -------------------------------------------------------------------------------- /Spring Boot/Beanutils.md: -------------------------------------------------------------------------------- 1 | Beanutils 2 | --- 3 | 4 | 5 | 6 | - [1. BeanUtils的介绍](#1-beanutils的介绍) 7 | - [2. BeanUtils的用法](#2-beanutils的用法) 8 | - [2.1. 拷贝属性](#21-拷贝属性) 9 | 10 | 11 | 12 | # 1. BeanUtils的介绍 13 | 1. Beanuils提供了对Java的反射和自省API的包装。其主要目的是利用反射机制对JavaBean的属性进行处理 14 | 15 | # 2. BeanUtils的用法 16 | 17 | ## 2.1. 拷贝属性 18 | 1. 对于有较多相同属性的JavaBean,我们可以通过拷贝方法来完成。 19 | ```java 20 | UserActionForm uForm = (UserActionForm) form; 21 | User user = new User(); 22 | BeanUtils.copyProperties(uForm,user);//将值拷贝给后面的 23 | ``` 24 | 25 | 2. 对于不同属性的类则不会进行处理 -------------------------------------------------------------------------------- /Spring Boot/Lombok.md: -------------------------------------------------------------------------------- 1 | Lombok 2 | --- 3 | 4 | 5 | 6 | - [1. 遇见lombok](#1-遇见lombok) 7 | - [1.1. lombok简介](#11-lombok简介) 8 | - [1.2. 使用详情](#12-使用详情) 9 | - [1.3. 官方文档](#13-官方文档) 10 | - [2. 注意](#2-注意) 11 | - [3. lombok的坑](#3-lombok的坑) 12 | 13 | 14 | # 1. 遇见lombok 15 | 16 | ## 1.1. lombok简介 17 | 1. 使用简单的注释的形式来帮助我们简化消除一些必须有但显得很臃肿的java代码工具 18 | 2. 如何安装使用:在dependency中添加`lombok` 19 | 20 | ## 1.2. 使用详情 21 | 1. 我们需要引入相应的lombok包 22 | 23 | 标签名|意义|使用实例 24 | --|--|-- 25 | `@NonNull`|避免空指针|`@NonNull Person person` 26 | `@Cleanup`|自动帮我们调用close()方法来关闭流|`@Cleanup InputStream ...` 27 | `@Getter`|注解在属性上,为我们自动生成Getter方法|`@Getter private int age;` 28 | `@Setter`|注解在属性上,为我们自动生成Setter方法|`@Setter private int age;` 29 | `@NoArgsConstructor`|注解在类上,自动生成无参数构造函数|- 30 | `@AllArgsConstructor`|注解在类上,为我们生成全参数构造函数|- 31 | `@Data`|注解在类上,提供所有属性的getting和setting方法,此外提供了equals、canEqual、hashCode、toString方法|- 32 | `@Log4j`|注解在类上,为类提供一个属性名为log的log4j日志对象 33 | `@ToString`|使用lombok帮助你生成一个tostring的方法,默认打印类名和每个字段,并且保证用逗号进行分隔 34 | 35 | ## 1.3. 官方文档 36 | 查询更多标签 37 | 38 | # 2. 注意 39 | 1. 请务必注意引起注意的是Lombok虽然好用,但是lombok已经体现出了不可以被我们忽视的入侵性。 40 | 2. 为什么这么说呢?因为如果团队中有一个人使用lombok进行编程,则会导致所有团队成员必须使用并且配置lombok的插件,这就是为什么我们应该慎重使用lombok 41 | 42 | # 3. lombok的坑 43 | 1. 如果我们仅仅使用了@Data属性,而不使用@EqualsAndHashCode(callSuper = true) 44 | 2. 默认情况下为@EqualsAndHashCode(callSuper = false,这时候生成的equals()方法只会比较子类的属性,而不会考虑父类继承的属性,无论父类属性访问权限是否开放。 -------------------------------------------------------------------------------- /Spring Boot/Spring Banner.md: -------------------------------------------------------------------------------- 1 | Spring Banner 2 | --- 3 | 4 | 5 | 6 | - [1. Spring Banner](#1-spring-banner) 7 | - [2. 定制banner](#2-定制banner) 8 | 9 | 10 | 11 | # 1. Spring Banner 12 | 1. 启动的时候显示的是Spring boot的字符 13 | 2. 我们只需要在`resources`设置一个`banner.txt`中就可以 14 | 15 | # 2. 定制banner 16 | 1. 生成字符 17 | 2. 生成字符2 18 | 3. 生成字符3 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot & mondrian.md: -------------------------------------------------------------------------------- 1 | Spring Boot & mondrian 2 | --- 3 | 占位符 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot AOP.md: -------------------------------------------------------------------------------- 1 | AOP 2 | --- 3 | 1. AOP是Spring框架的一个重要内容 4 | 5 | 6 | 7 | - [1. 什么是AOP](#1-什么是aop) 8 | - [1.1. 什么是切面](#11-什么是切面) 9 | - [2. AOP的正式的相关概念](#2-aop的正式的相关概念) 10 | - [2.1. Aspect(切面)](#21-aspect切面) 11 | - [2.2. Joint point(连接点)](#22-joint-point连接点) 12 | - [2.3. Pointcut(切点)](#23-pointcut切点) 13 | - [2.4. Advice(增强)](#24-advice增强) 14 | - [2.5. Target(目标对象)](#25-target目标对象) 15 | - [2.6. Weaving(织入)](#26-weaving织入) 16 | - [3. Logger](#3-logger) 17 | - [3.1. logger参考](#31-logger参考) 18 | 19 | 20 | # 1. 什么是AOP 21 | 1. AOP(aspect oriented programming):面向切面编程,也就是通过预编译的方法和运行期动态代理实现程序功能的统一维护的一项技术。 22 | 2. AOP是OOP的延续,本身作为Spring框架中的一个重要内容,是函数式编程的一种衍生范型。 23 | 24 | ## 1.1. 什么是切面 25 | 1. 编程中,对象与对象之间,方法与方法之间,模块与模块之间都是切面 26 | 2. 将重复的部分提取出来,进行实现,然后将其作为具体的实现注入到框架中去 27 | 28 | # 2. AOP的正式的相关概念 29 | 30 | ## 2.1. Aspect(切面) 31 | 其声明类似于Java中的类声明,在Aspect中会包含一些Pointcut以及向对应的Advice 32 | 33 | ## 2.2. Joint point(连接点) 34 | 表明程序中有明确定义的点,典型的包括方法调用,对类成员的访问以及异常处理程序块的执行,自身可以嵌套Joint point 35 | 1. 多种类型: 36 | 1. 构造方法的调用 37 | 2. 字段的设置和获取 38 | 3. 方法的调用 39 | 4. 方法的执行:**spring支持** 40 | 5. 异常的处理执行 41 | 6. 类的初始化 42 | 43 | ## 2.3. Pointcut(切点) 44 | 表示一组joint point,这些joint point可以通过逻辑关系、统配、正则表达式等方式集中起来,定义了相应的Advice将要发生的位置。 45 | 46 | ## 2.4. Advice(增强) 47 | Advice定义了在Pointcut里面定义的程序点具体要做的操作,它通过before、after和around来区别是在每个joint point之前还是之后还是代替其他代码 48 | 1. 类型: 49 | 1. `before advice`:在join point前被执行的advice,除非出现异常,否则不能阻止join point的执行。 50 | 2. `after return advice`:在一个join point正常返回后执行的advice 51 | 3. `after throwing advice`:在一个join point抛出异常后执行的advice 52 | 4. `after(final) advice`:无论一个join point是否异常都会被执行的advice 53 | 5. `around advice`:在join point前后都会执行的advice,这个是最常见的 54 | 6. `introduction`:为原来的对象增加新的属性和方法 55 | ## 2.5. Target(目标对象) 56 | 织入Advice的目标对象 57 | 58 | ## 2.6. Weaving(织入) 59 | 将Aspect和其他对象关联起来,创建Advice odject的过程 60 | 61 | # 3. Logger 62 | 1. Logging框架写log步骤: 63 | 1. 引入Logger类和Logger工厂类 64 | 2. 声明Logger 65 | 3. 记录日志 66 | 67 | 68 | ## 3.1. logger参考 69 | Logger打印日志 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot HTTPS.md: -------------------------------------------------------------------------------- 1 | Spring HTTPS 2 | --- 3 | 1. 在正常的应用场景之下,HTTPS请求会使得我们的应用程序更加安全。 4 | 5 | 6 | 7 | - [1. SSL证书](#1-ssl证书) 8 | - [1.1. 自制HTTPS证书](#11-自制https证书) 9 | - [1.2. 阿里云等证书](#12-阿里云等证书) 10 | - [1.3. 证书的位置](#13-证书的位置) 11 | - [2. POM文件设置](#2-pom文件设置) 12 | - [3. HTTP自动转换HTTPS请求](#3-http自动转换https请求) 13 | - [4. 参考](#4-参考) 14 | 15 | 16 | 17 | # 1. SSL证书 18 | 1. SSL证书是使用HTTPS请求中必不可少的一部分 19 | 20 | ## 1.1. 自制HTTPS证书 21 | 1. KeyTool(Java自带):`keytool -genkey -alias tomcat -storetype PKCS12 -keyalg RSA -keysize 2048 -keystore keystore.p12 -validity 3650` 22 | 1. storetype 指定密钥仓库类型 23 | 2. keyalg 生证书的算法名称,RSA是一种非对称加密算法 24 | 3. keysize 证书大小 25 | 4. keystore 生成的证书文件的存储路径 26 | 5. validity 证书的有效期 27 | 28 | ## 1.2. 阿里云等证书 29 | 1. 阿里云、腾讯云等购买了服务器都可以申请免费SSL证书,免费证书大致是够用的 30 | 2. 阿里云免费ssl证书(PFX格式证书)安装 31 | 32 | ## 1.3. 证书的位置 33 | 1. 放置到项目的根目录上。 34 | 35 | # 2. POM文件设置 36 | ```yml 37 | server: 38 | port: 8000 # 默认HTTPS端口号 39 | ssl: 40 | key-store: keyname.suffix 41 | enabled: true 42 | key-store-password: password 43 | key-store-type: JKS 44 | ``` 45 | 46 | # 3. HTTP自动转换HTTPS请求 47 | ```java 48 | @RestController 49 | @SpringBootApplication 50 | public class TestApplication { 51 | 52 | public static void main(String[] args) { 53 | SpringApplication.run(TestApplication.class, args); 54 | } 55 | @Bean 56 | public EmbeddedServletContainerFactory servletContainer() { 57 | TomcatEmbeddedServletContainerFactory tomcat = new TomcatEmbeddedServletContainerFactory() { 58 | @Override 59 | protected void postProcessContext(Context context) { 60 | SecurityConstraint constraint = new SecurityConstraint(); 61 | constraint.setUserConstraint("CONFIDENTIAL"); 62 | SecurityCollection collection = new SecurityCollection(); 63 | collection.addPattern("/*"); 64 | constraint.addCollection(collection); 65 | context.addConstraint(constraint); 66 | } 67 | }; 68 | tomcat.addAdditionalTomcatConnectors(httpConnector()); 69 | return tomcat; 70 | } 71 | 72 | @Bean 73 | public Connector httpConnector() { 74 | Connector connector = new Connector("org.apache.coyote.http11.Http11NioProtocol"); 75 | connector.setScheme("http"); 76 | //Connector监听的http的端口号 77 | connector.setPort(8080); 78 | connector.setSecure(false); 79 | //监听到http的端口号后转向到的https的端口号 80 | connector.setRedirectPort(8081); 81 | return connector; 82 | } 83 | 84 | } 85 | ``` 86 | 87 | # 4. 参考 88 | 1. Spring Boot支持HTTPS请求 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot MongoDB.md: -------------------------------------------------------------------------------- 1 | Spring MongoDB 2 | --- 3 | 4 | 5 | - [1. 示例代码](#1-示例代码) 6 | - [2. 参考](#2-参考) 7 | 8 | 9 | 10 | # 1. 示例代码 11 | [Spring Boot 集成 MongoDB](https://github.com/stormbroken/Spring-Boot-And-MongoDB) 12 | 13 | # 2. 参考 14 | 1. windows下MongoDB的安装及配置 15 | 2. Spring Boot 中使用 MongoDB 增删改查 16 | 3. 菜鸟教程 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot ResponseEntity.md: -------------------------------------------------------------------------------- 1 | Spring ResponseEntity 2 | --- 3 | 1. ResponseEntity处理http响应 4 | 5 | 6 | 7 | - [1. ResponseEntity](#1-responseentity) 8 | - [1.1. 内嵌接口](#11-内嵌接口) 9 | - [1.2. 常见相应响应](#12-常见相应响应) 10 | - [1.2.1. status()的使用](#121-status的使用) 11 | - [1.3. 简单使用](#13-简单使用) 12 | - [1.4. 设置Http响应头](#14-设置http响应头) 13 | 14 | 15 | 16 | # 1. ResponseEntity 17 | 1. 标识了整个http响应:状态码、头部信息以及相应体内容 18 | 2. 如果要使用ReponseEntity,必须在请求点返回,通常在spring rest中实现。 19 | 20 | ## 1.1. 内嵌接口 21 | 1. HeadersBuilder:不能设置任何响应体属性 22 | 2. BodyBuilder(是上面的子接口) 23 | 24 | ```java 25 | @GetMapping("/hello") 26 | ResponseEntity hello() { 27 | return ResponseEntity.ok("Hello World!"); 28 | } 29 | ``` 30 | 31 | ## 1.2. 常见相应响应 32 | 1. BodyBuilder accepted(); 33 | 2. BodyBuilder badRequest(); 34 | 3. BodyBuilder created(java.net.URI location); 35 | 4. HeadersBuilder noContent(); 36 | 5. HeadersBuilder notFound(); 37 | 6. BodyBuilder ok(); 38 | 7. BodyBuilder status(HttpStatus status) 39 | 8. BodyBuilder status(int status) 40 | 41 | ### 1.2.1. status()的使用 42 | ```java 43 | @GetMapping("/age") 44 | ResponseEntity age(@RequestParam("yearOfBirth") int yearOfBirth) { 45 | if (isInFuture(yearOfBirth)) { 46 | return ResponseEntity.badRequest() 47 | .body("Year of birth cannot be in the future"); 48 | } 49 | 50 | return ResponseEntity.status(HttpStatus.OK) 51 | .body("Your age is " + calculateAge(yearOfBirth)); 52 | } 53 | ``` 54 | 55 | ## 1.3. 简单使用 56 | ```java 57 | @GetMapping("/age") 58 | ResponseEntity age(@RequestParam("yearOfBirth") int yearOfBirth) { 59 | if (isInFuture(yearOfBirth)) { 60 | return new ResponseEntity<>("Year of birth cannot be in the future", HttpStatus.BAD_REQUEST); 61 | } 62 | return new ResponseEntity<>("Your age is " + calculateAge(yearOfBirth), HttpStatus.OK); 63 | } 64 | ``` 65 | 66 | ## 1.4. 设置Http响应头 67 | ```java 68 | //方式一 69 | @GetMapping("/customHeader") 70 | ResponseEntity customHeader() { 71 | HttpHeaders headers = new HttpHeaders(); 72 | headers.add("Custom-Header", "foo"); 73 | return new ResponseEntity<>("Custom header set", headers, HttpStatus.OK); 74 | } 75 | //方式二 76 | @GetMapping("/customHeader") 77 | ResponseEntity customHeader() { 78 | return ResponseEntity.ok() 79 | .header("Custom-Header", "foo") 80 | .body("Custom header set"); 81 | } 82 | ``` 83 | 84 | 1. `.body()`返回的是ResponseEntity,而并不是BodyBuilder,需要在最后进行调用。 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot Service层.md: -------------------------------------------------------------------------------- 1 | Spring Service层 2 | --- 3 | 4 | 5 | 6 | - [1. Service层](#1-service层) 7 | - [2. Java SPI 机制浅析与简单示例](#2-java-spi-机制浅析与简单示例) 8 | - [2.1. SPI机制](#21-spi机制) 9 | - [2.2. SPI机制的约定](#22-spi机制的约定) 10 | - [2.3. 代码理解SPI机制](#23-代码理解spi机制) 11 | - [3. 参考](#3-参考) 12 | 13 | 14 | 15 | # 1. Service层 16 | ```java 17 | @Service 18 | public class StoryServiceImpl implements StoryService { 19 | @Autowired 20 | private StoryDao storyDao; 21 | @Override 22 | public void save();//需要重载 23 | } 24 | ``` 25 | 1. @Service对应业务层的Bean。 26 | 2. @Service注解是告诉Spring,Spring容器中会存在StoryServiceImpl的bean,当Controller需要使用StoryServiceImpl的的实例时,就可以将Spring创建好的bean注入。在Controller只需要声明一个变量storyService来接收,不用通过new StoryServiceImpl()实例化。接收方式如下 27 | ```java 28 | @RestController 29 | @RequestMapping("/story") 30 | public class StoryController { 31 | @Autowired 32 | private StoryService storyService; 33 | } 34 | ``` 35 | 3. @Autowired作用是自动装配bean,而无需再为field设置getter,setter方法。 36 | 37 | # 2. Java SPI 机制浅析与简单示例 38 | 39 | ## 2.1. SPI机制 40 | 1. SPI:Service Provider Interface(Service提供者接口) 41 | 2. 总体上来说,提供给厂商与扩展框架功能的开发者使用的接口 42 | 3. 这样子就可以保证我们不修改jar包的情况下修改实现。 43 | 44 | ## 2.2. SPI机制的约定 45 | 46 | ![](img/service/1.png) 47 | 48 | 1. 在META-INF/services/目录中创建以接口全限定名命名的文件该文件内容为Api具体实现类的全限定名 49 | 2. 使用ServiceLoader类动态加载META-INF中的实现类 50 | 3. 如SPI的实现类为Jar则需要放在主程序classPath中 51 | 4. Api具体实现类必须有一个不带参数的构造方法 52 | 53 | ## 2.3. 代码理解SPI机制 54 | 1. IOperation接口 55 | ```java 56 | public interface IOperation { 57 | public int operation(int numberA, int numberB); 58 | } 59 | ``` 60 | 2. PlusOperationImpl 61 | ```java 62 | public class PlusOperationImpl implements IOperation { 63 | public int operation(int numberA, int numberB) { 64 | return numberA + numberB; 65 | } 66 | } 67 | ``` 68 | 3. DivisionOperationImpl 69 | ```java 70 | public class DivisionOperationImpl implements IOperation{ 71 | public int operation(int numberA, int numberB) { 72 | return numberA / numberB; 73 | } 74 | } 75 | ``` 76 | 77 | # 3. 参考 78 | 1. Java的SPI机制浅析与简单示例 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot VO、PO.md: -------------------------------------------------------------------------------- 1 | spring boot之VO、PO理解 2 | --- 3 | 4 | 1. VO是一个值对象 5 | 1. VO是使用new关键字创建的,由GC进行回收的。 6 | 2. VO是的属性随业务变化而变化。 7 | 3. 其本质是独立的java Object 8 | 2. PO是一个持久对象 9 | 1. PO是有状态的,是物理数据的对象表示。需要实现序列化接口。 10 | 2. PO是向数据库中添加新数据时创建,删除数据库中数据消除,其只能存活在一个数据库连接中,断开连接即被销毁。 11 | 3. 每个属性代表它的状态。其属性名称和数据库表的字段一一对应。 12 | 4. 存活的目的是为了让我们的程序和数据解耦。 13 | 3. 上述两种都是一组属性和属性的get和set方法组成。 14 | 15 | -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 启动.md: -------------------------------------------------------------------------------- 1 | Spring boot 项目启动 2 | --- 3 | 4 | 5 | 6 | - [1. 全过程](#1-全过程) 7 | - [2. 参考](#2-参考) 8 | 9 | 10 | 11 | # 1. 全过程 12 | >`SpringApplication`的`run`方法的实现是我们启动SpringApplication的入口,该方法的主要流程大体可以归纳如下: 13 | 1. 如果我们使用的是`SpringApplication`的静态run方法,那么,这个方法里面首先要创建一个`SpringApplication`对象实例,然后调用这个创建好的`SpringApplication`的实例方法。在`SpringApplication`实例初始化的时候,它会提前做几件事情: 14 | 1. 根据`classpath`里面是否存在某个特征类(`org.springframework.web.context.ConfigurableWebApplicationContext`)来决定是否应该创建一个为Web应用使用的`ApplicationContext`类型。 15 | 2. 使用`SpringFactoriesLoader`在应用的classpath中查找并加载所有可用的`ApplicationContextInitializer`。 16 | 3. 使用`SpringFactoriesLoader`在应用的classpath中查找并加载所有可用的`ApplicationListener`。 17 | 4. 推断并设置main方法的定义类。 18 | 2. `SpringApplication`实例初始化完成并且完成设置后,就开始执行run方法的逻辑了,方法执行伊始,首先遍历执行所有通过`SpringFactoriesLoader`可以查找到并加载的`SpringApplicationRunListener`。调用它们的`started()`方法,告诉这些`SpringApplicationRunListener`,即将开始执行。 19 | 3. 创建并配置当前Spring Boot应用将要使用的`Environment`(包括配置要使用的`PropertySource`以及`Profile`)。 20 | 4. 遍历调用所有`SpringApplicationRunListener`的`environmentPrepared()`的方法,通知他们已经准备好了。 21 | 5. 如果`SpringApplication`的`showBanner`属性被设置为true,则打印banner。 22 | 6. 根据用户是否明确设置了`applicationContextClass`类型以及初始化阶段的推断结果,决定该为当前SpringBoot应用创建什么类型的`ApplicationContext`并创建完成,然后根据条件决定是否添加`ShutdownHook`,决定是否使用自定义的`BeanNameGenerator`,决定是否使用自定义的`ResourceLoader`,当然,最重要的,将之前准备好的Environment设置给创建好的`ApplicationContext`使用。 23 | 7. `ApplicationContext`创建好之后,`SpringApplication`会再次借助`Spring-FactoriesLoader`,查找并加载`classpath`中所有可用的`ApplicationContext-Initializer`,然后遍历调用这些`ApplicationContextInitializer`的`initialize(applicationContext)`方法来对已经创建好的`ApplicationContext`进行进一步的处理。 24 | 8. 遍历调用所有`SpringApplicationRunListener`的`contextPrepared()`方法。 25 | 9. 最核心的一步,将之前通过`@EnableAutoConfiguration`获取的所有配置以及其他形式的IoC容器配置**加载**到已经准备完毕的`ApplicationContext`。 26 | 10. 遍历调用所有`SpringApplicationRunListener`的`contextLoaded()`方法。 27 | 11. 调用`ApplicationContext`的`refresh()`方法,完成IoC容器可用的最后一道工序。 28 | 12. 查找当前`ApplicationContext`中是否注册有`CommandLineRunner`,如果有,则遍历执行它们。 29 | 13. 正常情况下,遍历执行`SpringApplicationRunListener的finished()`方法、(如果整个过程出现异常,则依然调用所有`SpringApplicationRunListener`的`finished()`方法,只不过这种情况下会将异常信息一并传入处理) 30 | 31 | # 2. 参考 32 | 1. SpringBoot入门之启动原理解析 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 处理跨域请求.md: -------------------------------------------------------------------------------- 1 | Spring设置Cors进行跨域请求 2 | --- 3 | 4 | 5 | 6 | - [1. 处理跨域请求的第一种方式](#1-处理跨域请求的第一种方式) 7 | - [2. 第二种跨域请求的方式](#2-第二种跨域请求的方式) 8 | 9 | 10 | 11 | # 1. 处理跨域请求的第一种方式 12 | ```java 13 | public class CorsFilter extends OncePerRequestFilter { 14 | 15 | static final String ORIGIN = "Origin"; 16 | 17 | protected void doFilterInternal( 18 | HttpServletRequest request, 19 | HttpServletResponse response, 20 | FilterChain filterChain) throws ServletException, IOException { 21 | 22 | String origin = request.getHeader(ORIGIN); 23 | 24 | response.setHeader("Access-Control-Allow-Origin", "*");//* or origin as u prefer 25 | response.setHeader("Access-Control-Allow-Credentials", "true"); 26 | response.setHeader("Access-Control-Allow-Methods", "PUT, POST, GET, OPTIONS, DELETE"); 27 | response.setHeader("Access-Control-Max-Age", "3600"); 28 | response.setHeader("Access-Control-Allow-Headers", "content-type, authorization"); 29 | 30 | if (request.getMethod().equals("OPTIONS")) 31 | response.setStatus(HttpServletResponse.SC_OK); 32 | else 33 | filterChain.doFilter(request, response); 34 | } 35 | } 36 | ``` 37 | 38 | # 2. 第二种跨域请求的方式 39 | ```java 40 | import org.springframework.context.annotation.Bean; 41 | import org.springframework.context.annotation.Configuration; 42 | import org.springframework.web.cors.CorsConfiguration; 43 | import org.springframework.web.cors.UrlBasedCorsConfigurationSource; 44 | import org.springframework.web.filter.CorsFilter; 45 | 46 | /** 47 | * @Author stormbroken 48 | * Create by 2020/03/23 49 | * @Version 1.0 50 | **/ 51 | 52 | @Configuration 53 | public class CORSConfig { 54 | private static String[] originsVal = new String[]{ 55 | "localhost:8080", 56 | "127.0.0.1:8080", 57 | "127.0.0.1", 58 | "localhost", 59 | //"172.19.144.143", 60 | //"172.19.144.143:8000" 61 | }; 62 | 63 | @Bean 64 | public CorsFilter corsFilter() { 65 | UrlBasedCorsConfigurationSource source = new UrlBasedCorsConfigurationSource(); 66 | CorsConfiguration corsConfiguration = new CorsConfiguration(); 67 | addAllowedOrigins(corsConfiguration); // 1 添加所有的允许访问的IP地址 68 | //corsConfiguration.addAllowedOrigin("*"); 69 | corsConfiguration.addAllowedHeader("*"); // 2,如果限制POST等等则需要自行更改 70 | corsConfiguration.addAllowedMethod("*"); // 3 71 | corsConfiguration.setAllowCredentials(true); // 跨域session共享 72 | source.registerCorsConfiguration("/**", corsConfiguration); // 4 73 | return new CorsFilter(source); 74 | } 75 | 76 | private void addAllowedOrigins(CorsConfiguration corsConfiguration) { 77 | for (String origin : originsVal) { 78 | corsConfiguration.addAllowedOrigin("http://" + origin); 79 | corsConfiguration.addAllowedOrigin("https://" + origin); 80 | } 81 | } 82 | } 83 | ``` -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 容器性能差异.md: -------------------------------------------------------------------------------- 1 | spring 容器性能 2 | --- 3 | 1. 本文主要记录了关于spring的容器的性能的比较。 4 | 5 | # 1. 部分关键数据的记录 6 | 1. 服务容器:tomcat、jetty、underflow、http异步 7 | 2. spring boot的默认服务器是Tomcat 8 | 9 | # 2. 参考 10 | 1. 后续之《SpringBoot服务器压测对比(jetty、tomcat、undertow)》 11 | 2. 进阶Spring Boot(二)---Tomcat与Undertow 吞吐量对比 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 时间.md: -------------------------------------------------------------------------------- 1 | Spring 时间 2 | --- 3 | 1. 主要涉及到LocalDateTime和TimeStamp之间的转换 4 | 5 | ```java 6 | @Component 7 | public class TimeUtil { 8 | public static LocalDateTime getLocalDateTime(long timestamp){ 9 | LocalDateTime time = LocalDateTime.ofEpochSecond(timestamp/1000,0, ZoneOffset.ofHours(0)); 10 | return time; 11 | } 12 | 13 | public static LocalDateTime getDefaultLocalDateTime(){ 14 | LocalDateTime time = LocalDateTime.ofEpochSecond(946656000/1000,0,ZoneOffset.ofHours(0)); 15 | return time; 16 | } 17 | 18 | //毫秒为单位 19 | public static long getTimeStamp(LocalDateTime localDateTime){ 20 | return localDateTime.toInstant(ZoneOffset.of("+8")).toEpochMilli(); 21 | } 22 | 23 | public static String dateToString(LocalDateTime localDateTime){ 24 | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd"); 25 | String dateTime = localDateTime.format(formatter); 26 | return dateTime; 27 | } 28 | 29 | public static String dateToAreaString(LocalDateTime localDateTime){ 30 | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("MM月dd日 HH:mm"); 31 | String dateTime = localDateTime.format(formatter); 32 | return dateTime; 33 | } 34 | 35 | public static String dateToVOString(LocalDateTime localDateTime){ 36 | DateTimeFormatter formatter = DateTimeFormatter.ofPattern("yyyy-MM-dd HH:mm"); 37 | String dateTime = localDateTime.format(formatter); 38 | return dateTime; 39 | } 40 | 41 | public static String preTime(){ 42 | return dateToVOString(LocalDateTime.now()) + " "; 43 | } 44 | 45 | public static LocalDateTime toDay(LocalDateTime input){ 46 | String time = dateToString(input); 47 | String[] temp = time.split("-"); 48 | return LocalDateTime.of(Integer.valueOf(temp[0]),Integer.valueOf(temp[1]), Integer.valueOf(temp[2]),0,0); 49 | } 50 | 51 | /** 52 | * 获取本周一 53 | * @return 54 | */ 55 | public static LocalDateTime weekFirstDay(){ 56 | LocalDateTime localDateTime = LocalDateTime.now(); 57 | int days_of_week = localDateTime.getDayOfWeek().getValue(); 58 | localDateTime = localDateTime.minusDays(days_of_week - 1); 59 | return toDay(localDateTime); 60 | } 61 | } 62 | ``` -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 松绑定.md: -------------------------------------------------------------------------------- 1 | Spring 宽松绑定规则 relaxed binding 2 | --- 3 | 1. 根据Spring的绑定属性规则,以下所有的属性都是等价的 4 | ```yml 5 | test.myTest=1 6 | test.mytest=1 7 | test.my_test=1 8 | test.my-test=1 9 | test.MY_TEST=1 10 | ``` -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 网络解释.md: -------------------------------------------------------------------------------- 1 | spring 网络解释 2 | --- 3 | 4 | 5 | 6 | - [1. spring解析URL参数的多种方式](#1-spring解析url参数的多种方式) 7 | - [1.1. 方式一:表单的参数写到方法形参](#11-方式一表单的参数写到方法形参) 8 | - [1.2. 方式二:HttpServletRequest](#12-方式二httpservletrequest) 9 | - [1.3. 方式三:通过Bean来接收](#13-方式三通过bean来接收) 10 | - [1.3.1. 方式四:通过@PathVariable获取路径中的参数](#131-方式四通过pathvariable获取路径中的参数) 11 | - [1.3.2. 方式五:适用@ModeAttribute注解获得POST请求的FORM表单数据](#132-方式五适用modeattribute注解获得post请求的form表单数据) 12 | - [1.3.3. 方式六:用注解@RequestParam绑定参数到方法入参](#133-方式六用注解requestparam绑定参数到方法入参) 13 | - [2. 参考](#2-参考) 14 | 15 | 16 | 17 | # 1. spring解析URL参数的多种方式 18 | 19 | ## 1.1. 方式一:表单的参数写到方法形参 20 | 1. 可以直接把表单的参数写到Controller的对应方法的形参中 21 | 2. 目前这种方式适用于get方式提交,不适用于post方式提交 22 | ```java 23 | @RequestMapping("/addUser1") 24 | public String addUser1(String username,String password) { 25 | ``` 26 | 27 | ## 1.2. 方式二:HttpServletRequest 28 | 1. 支持用post、get方式来进行。 29 | ```java 30 | @RequestMapping("/addUser2") 31 | public String addUser2(HttpServletRequest request) { 32 | ``` 33 | 34 | ## 1.3. 方式三:通过Bean来接收 35 | 1. 建立一个和表单参数对应的bean,用这个bean来接受(省去get和set方法) 36 | ```java 37 | public class UserModel { 38 | private String username; 39 | private String password; 40 | } 41 | @RequestMapping("/addUser3") 42 | public String addUser3(UserModel user) { 43 | } 44 | ``` 45 | ### 1.3.1. 方式四:通过@PathVariable获取路径中的参数 46 | ```java 47 | @RequestMapping(value="/addUser4/{username}/{password}",method=RequestMethod.GET) 48 | public String addUser4(@PathVariable String username,@PathVariable String password) { 49 | ``` 50 | 51 | ### 1.3.2. 方式五:适用@ModeAttribute注解获得POST请求的FORM表单数据 52 | 1. JSP表单部分: 53 | ```js 54 |
55 | 用户名: 
56 | 密  码: 
57 | 58 | 59 |
60 | ``` 61 | 2. java的Controller实现 62 | ```java 63 | @RequestMapping(value="/addUser5",method=RequestMethod.POST) 64 | public String addUser5(@ModelAttribute("user") UserModel user) { 65 | ``` 66 | 67 | ### 1.3.3. 方式六:用注解@RequestParam绑定参数到方法入参 68 | 1. username不存在的话,可以为这个元注解,添加required的参数,设置为false 69 | ```java 70 | @RequestMapping(value="/addUser6",method=RequestMethod.GET) 71 | public String addUser6(@RequestParam("username") String username,@RequestParam("password") String password) { 72 | ``` 73 | 74 | # 2. 参考 75 | 1. Spring中解析URL参数的两种方式 -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 获取Header参数.md: -------------------------------------------------------------------------------- 1 | Spring 获取Header参数 2 | --- 3 | 4 | 5 | 6 | - [1. 方法一:对应的部分加入@RequestHeader获取](#1-方法一对应的部分加入requestheader获取) 7 | - [2. 方法二:类级别注入HttpServletRequest](#2-方法二类级别注入httpservletrequest) 8 | - [3. 参考](#3-参考) 9 | 10 | 11 | 12 | # 1. 方法一:对应的部分加入@RequestHeader获取 13 | ```java 14 | @Controller 15 | public class HelloController { 16 | @RequestMapping(value = "/hello") 17 | public String hello(@RequestHeader(value="User-Agent") String userAgent){ 18 | } 19 | } 20 | ``` 21 | 22 | # 2. 方法二:类级别注入HttpServletRequest 23 | ```java 24 | @Controller 25 | @RequestMapping("/hello") 26 | public class HelloController { 27 | @Autowired 28 | private HttpServletRequest request; 29 | 30 | @RequestMapping(value="/printname/{name}", method=RequestMethod.GET) 31 | public String printName(@PathVariable String name, 32 | @RequestHeader HttpHeaders headers) { 33 | System.out.println("from request:" + request.getHeader("code")); 34 | System.out.println("from parameter:" + headers.getFirst("code")); 35 | return "hello"; 36 | } 37 | } 38 | ``` 39 | 40 | # 3. 参考 41 | 1. spring mvc获取header -------------------------------------------------------------------------------- /Spring Boot/Spring Boot 部署到Linux服务器.md: -------------------------------------------------------------------------------- 1 | 部署到linux服务器 2 | --- 3 | 4 | 5 | 6 | - [1. 将spring boot项目打包](#1-将spring-boot项目打包) 7 | - [2. 上传到服务器](#2-上传到服务器) 8 | - [3. 在服务器端挂起项目](#3-在服务器端挂起项目) 9 | - [4. 参考](#4-参考) 10 | 11 | 12 | 13 | # 1. 将spring boot项目打包 14 | 1. 以maven为例,首先用`maven clean`处理项目 15 | 2. 之后用`maven install`打包为jar 16 | 17 | # 2. 上传到服务器 18 | 1. 使用xftp进行数据上传。 19 | 20 | # 3. 在服务器端挂起项目 21 | 1. 使用nohup命令运行:`nohup java -jar filename.jar 2>&1 &` 22 | 2. 查看进程:`netstat -ntpl|grep java` 23 | + 使用命令`netstat -ntpl`查看所有在运行进程。 24 | 3. 彻底杀死进程:`kill -9 (pid)` 25 | 26 | # 4. 参考 27 | 1. spring boot打包部署 28 | 2. spring项目打包过程中的重定向问题 -------------------------------------------------------------------------------- /Spring Boot/Summary-Spring Boot推荐阅读.md: -------------------------------------------------------------------------------- 1 | Summary-Spring Boot推荐阅读方式 2 | --- 3 | 1. 本部分所有的资料均为手工整理,出自课堂、CSDN等多渠道,难免出现纰漏,请多谅解。 4 | 2. 如果觉得有用点个star和Follow再走 5 | 6 | # 1. Spring Boot 入门 7 | 1. [Spring Boot 基础](Spring%20Boot%20基础.md) 8 | 2. [Spring Boot 核心注解](Spring%20Boot%20核心注解.md) 9 | 3. Spring 分层关系 10 | 1. [Spring Boot Controller层](Spring%20Boot%20Controller层.md) 11 | 2. [Spring Boot Dao层](Spring%20Boot%20Dao层.md) 12 | 3. [Spring Boot Service层](Spring%20Boot%20Service层.md) 13 | 4. [Spring Boot VO、PO](Spring%20Boot%20VO、PO.md) 14 | 4. Spring 配置 15 | 1. [Spring Boot 松绑定](Spring%20Boot%20松绑定.md) 16 | 2. [Spring Boot 配置](Spring%20Boot%20配置.md) 17 | 5. Spring 网络 18 | 1. [Spring Boot 网络解释](Spring%20Boot%20网络解释.md) 19 | 2. [Spring Boot 获取Header参数](Spring%20Boot%20获取Header参数.md) 20 | 21 | # 2. Spring Boot 进阶 22 | 1. Spring 网络 23 | 1. [Spring Boot HTTPS](Spring%20Boot%20HTTPS.md) 24 | 2. [Spring Boot 发起HTTP请求](Spring%20Boot%20发起HTTP请求.md) 25 | 3. [Spring Boot 处理跨域请求](Spring%20Boot%20处理跨域请求.md) 26 | 4. [Spring Boot Token](Spring%20Boot%20Token.md) 27 | 5. [理解Token的实现机制](理解Token的实现机制.md) 28 | 2. Spring 数据库 29 | 1. [Spring Boot 事务](Spring%20Boot%20事务.md) 30 | 2. [Spring Boot mybatis](Spring%20Boot%20mybatis.md) 31 | 3. [Spring Boot 多源数据库问题](Spring%20Boot%20多源数据库问题.md) 32 | 3. [Spring Boot 时间](Spring%20Boot%20时间.md) 33 | 4. [Spring Boot Junit测试](Spring%20Boot%20Junit测试.md) 34 | 5. [Spring Boot ResponseEntity](Spring%20Boot%20ResponseEntity.md) 35 | 6. [Spring Boot Swagger2](Spring%20Boot%20Swagger2.md) 36 | 7. [Spring Boot 部署到Linux服务器](Spring%20Boot%20部署到Linux服务器.md) 37 | 38 | # 3. Spring Boot 高级 39 | * [Spring Boot AOP](Spring%20Boot%20AOP.md) 40 | * [Spring Boot Apache Tomcat](Spring%20Boot%20Apache%20Tomcat.md) 41 | * [Spring Boot MySDK](Spring%20Boot%20MySDK.md) 42 | * [Spring Boot 注解开关原理](Spring%20Boot%20注解开关原理.md) 43 | * [Spring Boot 容器性能差异](Spring%20Boot%20容器性能差异.md) 44 | * [Spring Boot websocket](Spring%20Boot%20websocket.md) 45 | 46 | # 4. Spring Boot 集成其他功能 47 | * [Spring Boot 微信](Spring%20Boot%20微信.md) 48 | * [Spring Boot OSS](Spring%20Boot%20OSS.md) 49 | * [Spring Boot Redis](Spring%20Boot%20Redis.md) 50 | * [Spring Boot Python](Spring%20Boot%20Python.md) 51 | * [Spring Boot SSM邮件](Spring%20Boot%20SSM邮件.md) 52 | * [Spring Boot MongoDB](Spring%20Boot%20MongoDB.md) 53 | 54 | # 5. Spring Boot 原理 55 | * [Spring Boot 启动](Spring%20Boot%20启动.md) 56 | * [ServletInitializer的理解](ServletInitializer的理解.md) 57 | * [Spring Boot IOC&DI](Spring%20Boot%20IOC&DI.md) 58 | 59 | # 6. Spring Boot 辅助工具 60 | 61 | ## 6.1. Spring Boot Bean 62 | * [Beanutils](Beanutils.md) 63 | * [Spring Boot Bean](Spring%20Boot%20Bean.md) 64 | 65 | ## 6.2. Spring Boot 其他辅助 66 | * [Lombok](Lombok.md) 67 | 68 | ## 6.3. Spring Boot 好玩的东西 69 | * [Spring Boot Banner](Spring%20Boot%20Banner.md) 70 | 71 | # 7. Spring Boot 框架问题 72 | * [Spring Boot 框架出现的问题](Spring%20Boot%20框架出现的问题.md) -------------------------------------------------------------------------------- /Spring Boot/img/Dao/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Dao/1.png -------------------------------------------------------------------------------- /Spring Boot/img/Dao/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Dao/2.png -------------------------------------------------------------------------------- /Spring Boot/img/Dao/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Dao/3.png -------------------------------------------------------------------------------- /Spring Boot/img/Junit/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Junit/1.png -------------------------------------------------------------------------------- /Spring Boot/img/MySDK/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/MySDK/1.png -------------------------------------------------------------------------------- /Spring Boot/img/MySDK/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/MySDK/2.png -------------------------------------------------------------------------------- /Spring Boot/img/MySDK/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/MySDK/3.png -------------------------------------------------------------------------------- /Spring Boot/img/MySDK/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/MySDK/4.png -------------------------------------------------------------------------------- /Spring Boot/img/SpringBoot框架学习/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/SpringBoot框架学习/1.png -------------------------------------------------------------------------------- /Spring Boot/img/SpringBoot框架学习/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/SpringBoot框架学习/2.png -------------------------------------------------------------------------------- /Spring Boot/img/SpringBoot框架学习/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/SpringBoot框架学习/3.png -------------------------------------------------------------------------------- /Spring Boot/img/Tomcat&Servlet/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Tomcat&Servlet/1.png -------------------------------------------------------------------------------- /Spring Boot/img/Tomcat&Servlet/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Tomcat&Servlet/2.png -------------------------------------------------------------------------------- /Spring Boot/img/Tomcat&Servlet/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Tomcat&Servlet/3.png -------------------------------------------------------------------------------- /Spring Boot/img/Transaction/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/Transaction/1.png -------------------------------------------------------------------------------- /Spring Boot/img/bean/1.bmp: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/bean/1.bmp -------------------------------------------------------------------------------- /Spring Boot/img/bean/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/bean/2.png -------------------------------------------------------------------------------- /Spring Boot/img/bean/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/bean/3.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/1.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/2.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/3.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/4.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/5.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/6.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/7.png -------------------------------------------------------------------------------- /Spring Boot/img/ioc/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/ioc/8.png -------------------------------------------------------------------------------- /Spring Boot/img/multiDatabase/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/multiDatabase/1.png -------------------------------------------------------------------------------- /Spring Boot/img/service/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/service/1.png -------------------------------------------------------------------------------- /Spring Boot/img/token/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/token/1.png -------------------------------------------------------------------------------- /Spring Boot/img/token/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/token/2.png -------------------------------------------------------------------------------- /Spring Boot/img/token/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/token/3.png -------------------------------------------------------------------------------- /Spring Boot/img/token/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/token/4.png -------------------------------------------------------------------------------- /Spring Boot/img/token/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Boot/img/token/5.png -------------------------------------------------------------------------------- /Spring Cloud/SpringCloud Feign.md: -------------------------------------------------------------------------------- 1 | SpringCloud Feign 2 | --- 3 | 4 | # 1. 访问时间超时 5 | ```yml 6 | feign: 7 | client: 8 | config: 9 | #default代表所有服务 10 | default: 11 | #feign客户端建立连接超时时间 12 | connect-timeout: 10000 13 | #feign客户端建立连接后读取资源超时时间 14 | read-timeout: 20000 15 | #而service-test表示当调用service-test这个服务时,用下面的配置 16 | service-test: 17 | connect-timeout: 10000 18 | read-timeout: 20000 19 | ``` 20 | 21 | # 2. 参考 22 | 1. springcloud feign设置超时时间(Spring boot2.0及以上) -------------------------------------------------------------------------------- /Spring Cloud/SpringCloud 问题.md: -------------------------------------------------------------------------------- 1 | SpringCloud 问题 2 | --- 3 | 4 | # 1. Feign Docker无法连接的问题 5 | 1. `eureka.instance.prefer-ip-address` 6 | 1. False(默认值),注册到Eureka中的IP地址则为本机IP地址(Docker不生效) 7 | 2. True,并且设置了`eureka.instance.ip-address`则将该IP地址注册到Eureka中,调用时请求目的地址为该IP地址。 8 | 3. 对应源代码:`return this.preferIpAddress ? this.ipAddress : this.hostname;` 9 | 10 | ## 1.1. 不同配置方式 11 | 1. IDEA调试运行服务: 12 | 13 | ``` 14 | eureka.instance.prefer-ip-address=true 15 | eureka.instance.ip-address=[localhost或者物理机内网IP地址] 16 | ``` 17 | 18 | 2. Docker运行(同一物理机):不同容器分配不同内网IP 19 | 20 | ``` 21 | eureka.instance.prefer-ip-address=true 22 | eureka.instance.ip-address=[localhost或者物理机内网IP地址或者物理机外网IP地址] 23 | ``` 24 | 25 | 3. docker运行不同物理机 26 | 27 | ``` 28 | eureka.instance.prefer-ip-address=true 29 | eureka.instance.ip-address=[物理机外网IP地址] 30 | ``` 31 | 32 | ## 1.2. 参考 33 | 1. spring cloud feign docker上无法连接的问题 -------------------------------------------------------------------------------- /Spring Cloud/img/first/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/1.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/10.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/11.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/12.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/13.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/14.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/2.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/3.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/4.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/5.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/6.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/7.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/8.png -------------------------------------------------------------------------------- /Spring Cloud/img/first/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring Cloud/img/first/9.png -------------------------------------------------------------------------------- /Spring/img/charpter1/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/Spring/img/charpter1/1.jpg -------------------------------------------------------------------------------- /云原生技术/Devops入门.md: -------------------------------------------------------------------------------- 1 | Lec04-Devops与测试 2 | --- 3 | 4 | # 1. 技术路线图 5 | ![](img/devops/1.png) 6 | 7 | 1. PMP和ScrumMaster认证 8 | 9 | # 2. 自动化测试 10 | ![](img/devops/2.png) 11 | 12 | 1. 企业级虚拟机 13 | 2. Shell:要求比较高 14 | 3. 测试工具会封装一些SDK,因为有的接口所有信息全是加密的 15 | 4. 什么是压测?有的在生产环境压测 16 | 1. 性能压测:保证性能的前提下,进行测试 17 | 2. 压力压测:慢慢逐渐增加,适当持续,到崩了的时候 18 | 3. 负载:大概80%左右,持续的运行较长的时间 19 | 5. 内部测100万,可能对外交付声明的是50万 20 | 21 | ## 2.1. 自动测试软件 22 | 1. Zabbix和Prometheus用来检测一些硬件指标,检查微服务是否正常 23 | 2. 在快速部署发布的条件下,如何进行高效测试是一个问题 24 | 25 | ## 2.2. UI测试自动化 26 | 1. 测试自动化的成本太高 27 | 2. 每次迭代,主流程若无太大变化,可考虑自动化方案 28 | 3. 太早进行是不好的(往往1.x版本是不稳定的) 29 | 30 | ## 2.3. 为什么选择Selenium? 31 | ![](img/devops/3.png) 32 | 33 | 1. 基本上支持大部分的浏览器和技术栈 34 | 2. Selenium模拟了用户操作,但是速度受限 35 | 3. 本身通过JS完成实现 36 | 4. WebDriver是代替人去操作的核心 37 | 38 | ![](img/devops/4.png) 39 | 40 | ## 2.4. RobotFrameWork 41 | ![](img/devops/5.png) 42 | ![](img/devops/6.png) 43 | 44 | ## 2.5. 测试过程 45 | ![](img/devops/7.png) 46 | ![](img/devops/8.png) 47 | 48 | ## 2.6. JMeter和Locast怎么选择? 49 | 1. JMeter使用的更多 50 | 51 | ![](img/devops/9.png) 52 | 53 | 2. Locast支持定制,JMeter则不支持 54 | 55 | # 3. Devops全链条 56 | ![](img/devops/10.png) 57 | 58 | ## 3.1. CI/CD工具 59 | ![](img/devops/11.png) 60 | 61 | 1. Jerkins的插件非常多 -------------------------------------------------------------------------------- /云原生技术/Docker/Tec1-Docker 部署 Vue 项目.md: -------------------------------------------------------------------------------- 1 | Tec1-Docker部署Vue项目 2 | --- 3 | > 推荐先将本地的docker源替换成国内镜像。 4 | 5 | # 1. nginx安装和配置 6 | 1. 获取nginx镜像:`docker pull nginx` 7 | 2. 创建nginx的config配置文件文件 8 | 9 | ```conf 10 | server { 11 | # 监听内部的端口号 12 | listen 80; 13 | # 修改为docker服务宿主机的IP或域名 14 | server_name localhost; 15 | 16 | location / { 17 | root /usr/share/nginx/html; 18 | index index.html index.htm; 19 | try_files $uri $uri/ /index.html =404; 20 | } 21 | 22 | error_page 500 502 503 504 /50x.html; 23 | location = /50x.html { 24 | root html; 25 | } 26 | } 27 | ``` 28 | 29 | 3. 首页指向到`/usr/share/nginx/html/index.html` 30 | 31 | # 2. 生成相应环境包 32 | 1. 安装依赖环境:`npm install` 33 | 2. 构建:`npm run build` 34 | 35 | # 3. 编写Dockerfile文件 36 | ```Dockerfile 37 | FROM nginx 38 | MAINTAINER name 39 | RUN rm /etc/nginx/conf.d/default.conf 40 | ADD default.conf /etc/nginx/conf.d/ 41 | COPY dist/ /usr/share/nginx/html/ 42 | ``` 43 | 44 | 1. `FROM nginx`:该镜像是基于nginx:latest镜像构建的 45 | 2. `MAINTAINER name`:添加说明 46 | 3. `RUN rm /etc/nginx/conf.d/default.conf`:删除目录下的default.conf文件 47 | 4. `ADD default.conf /etc/nginx/conf.d/`:将default.conf复制到/etc/nginx/conf.d/下,用本地的default.conf配置来替换nginx镜像里的默认配置 48 | 5. `COPY dist/ /usr/share/nginx/html/`:将项目根目录下dist文件夹(构建之后才会生成)下的所有文件复制到镜像/usr/share/nginx/html/目录下 49 | 50 | # 4. 构建docker镜像 51 | 1. 构建docker镜像:`docker build -t docker_name .` 52 | 2. 查看本地镜像:`docker images | grep docker_name` 53 | 3. 启动docker容器:`docker run -d -p 8080:80 --name container_name docker_name` 54 | 1. -d:后台方式启动 55 | 2. -p 8080:80: 端口映射,将宿主机的8080端口映射到容器的80端口 56 | 3. --name:容器名container_name 57 | 4. docker_name:要启动的镜像名称 58 | 4. 查看运行的容器:`docker ps`,检查刚刚启动的镜像是否正常运行,如果没有,使用`docker log`命令来查看报错进行修改。 59 | 60 | # 5. 补充:跨域设置 61 | 1. 创建nginx的config配置文件文件 62 | 63 | ```conf 64 | server { 65 | # 监听内部的端口号 66 | listen 80; 67 | # 修改为docker服务宿主机的IP或域名 68 | server_name localhost; 69 | 70 | location / { 71 | root /usr/share/nginx/html; 72 | index index.html index.htm; 73 | try_files $uri $uri/ /index.html =404; 74 | } 75 | location /pro-api{ # pro-api是vue项目里.env.production里的地址 76 | proxy_pass 1.1.1.1; # 这里写的是你后端接口的地址 77 | } 78 | 79 | error_page 500 502 503 504 /50x.html; 80 | location = /50x.html { 81 | root html; 82 | } 83 | } 84 | ``` 85 | 86 | 2. 项目中:`.env.production`中配置有这样一行:`VUE_APP_BASE_API = "/pro-api"` 87 | 88 | # 6. 参考 89 | 1. docker--部署vue项目 -------------------------------------------------------------------------------- /云原生技术/Tec01-Windows安装Kubernates.md: -------------------------------------------------------------------------------- 1 | Windows10上安装MiniKubernetes 2 | --- 3 | 4 | # 1. 安装VirtualBox 5 | 1. 官网:https://www.virtualbox.org/wiki/Downloads 6 | 2. 下载对应的Windows的Exe安装到本地即可 7 | 3. 可以通过打开这个虚拟机管理器来查看目前的虚拟机 8 | 9 | # 2. 安装MiniKube 10 | 1. MiniKube的文档:https://minikube.sigs.k8s.io/docs/start/ 11 | 2. 安装kubectl的文档:https://kubernetes.io/docs/tasks/tools/install-kubectl/ 12 | 1. 查看其中的Windows,下载Kubectl.exe 13 | 2. 配置环境变量 14 | 1. 添加KUBECRL变量为存放kuberctl.exe的路径 15 | 2. 在系统变量PATH中添加%KUBECRL%(或者绝对路径) 16 | 17 | # 3. 检查安装情况 18 | 1. 不翻墙的启动 19 | ``` 20 | minikube start --vm-driver=virtualbox --registry-mirror=https://ytsch4ca.mirror.aliyuncs.com --image-repository=registry.aliyuncs.com/google_containers --iso-url=https://kubernetes.oss-cn-hangzhou.aliyuncs.com/minikube/iso/minikube-v1.8.0.iso 21 | ``` 22 | 23 | # 4. 命令 24 | 25 | ## 4.1. Minikube 26 | 1. `minikube status`:查看状态 27 | 2. `minikube start`:启动 28 | 3. `minikube stop`:停止集群 29 | 4. `minikube dashboard`:启动可视化面板 30 | 5. `minikube ssh`:登录进入Linux虚拟机 31 | 32 | ## 4.2. Kubectl 33 | 1. `kubectl get nodes`:查看节点的情况,确认POD的启动请情况 34 | 35 | ### 4.2.1. 部署一下2048应用 36 | 2. `kubectl create deployment hello-minikube --image=daocloud.io/daocloud/dao-2048:latest`:创建一个Kubernetes的Deployment 37 | 3. `kubectl expose deployment hello-minikube --type=NodePort --port=80`:将服务进行暴露,通过80端口暴露 38 | 4. 获取暴露的Service的URL来查看:`minikube service hello-minikube --url`,之后可以通过接口访问 39 | 40 | # 5. 参考文档 41 | 1. Kubernates的安装和使用 -------------------------------------------------------------------------------- /云原生技术/Tec02-Windows卸载安装Docker.md: -------------------------------------------------------------------------------- 1 | Windows安装Docker 2 | --- 3 | 4 | # 1. 下载Docker安装程序 5 | 1. Docker官网 6 | 2. Docker Doc 7 | 8 | # 2. 进行下载 9 | 1. 双击进行下载 10 | 2. 过程中注意 11 | 12 | ![](img/tec02/1.png) 13 | 14 | 3. 安装成功后的界面: 15 | 1. 图形界面:Kitematic (Alpha) 16 | 2. 命令界面:Docker Quickstart Terminal 17 | 18 | ![](img/tec02/2.png) 19 | 20 | # 3. 查看安装情况 21 | 1. cmd界面输入:`docker-machine`,出现详情界面 22 | 23 | ![](img/tec02/3.png) 24 | 25 | # 4. 其他配置 26 | 1. 调整盘符+使用镜像都详见参考1 27 | 28 | # 5. Hello-world 29 | ![](img/tec02/4.png) 30 | 31 | # 6. 游戏:2048 32 | 1. 下载命令:`docker run -d -P daocloud.io/daocloud/dao-2048` 33 | 2. 查看运行中容器:`docker ps` 34 | 35 | ![](img/tec02/5.png) 36 | 37 | 3. 然后查看目前虚拟机的IP地址,结合ps信息中的端口号进行访问,本例则为IP/32789 38 | 39 | 40 | # 7. 参考 41 | 1. Windows安装Docker -------------------------------------------------------------------------------- /云原生技术/img/devops/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/1.png -------------------------------------------------------------------------------- /云原生技术/img/devops/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/10.png -------------------------------------------------------------------------------- /云原生技术/img/devops/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/11.png -------------------------------------------------------------------------------- /云原生技术/img/devops/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/2.png -------------------------------------------------------------------------------- /云原生技术/img/devops/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/3.png -------------------------------------------------------------------------------- /云原生技术/img/devops/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/4.png -------------------------------------------------------------------------------- /云原生技术/img/devops/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/5.png -------------------------------------------------------------------------------- /云原生技术/img/devops/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/6.png -------------------------------------------------------------------------------- /云原生技术/img/devops/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/7.png -------------------------------------------------------------------------------- /云原生技术/img/devops/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/8.png -------------------------------------------------------------------------------- /云原生技术/img/devops/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/devops/9.png -------------------------------------------------------------------------------- /云原生技术/img/docker/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/1.png -------------------------------------------------------------------------------- /云原生技术/img/docker/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/10.png -------------------------------------------------------------------------------- /云原生技术/img/docker/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/11.png -------------------------------------------------------------------------------- /云原生技术/img/docker/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/12.png -------------------------------------------------------------------------------- /云原生技术/img/docker/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/13.png -------------------------------------------------------------------------------- /云原生技术/img/docker/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/14.png -------------------------------------------------------------------------------- /云原生技术/img/docker/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/15.png -------------------------------------------------------------------------------- /云原生技术/img/docker/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/16.png -------------------------------------------------------------------------------- /云原生技术/img/docker/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/17.png -------------------------------------------------------------------------------- /云原生技术/img/docker/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/18.png -------------------------------------------------------------------------------- /云原生技术/img/docker/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/19.png -------------------------------------------------------------------------------- /云原生技术/img/docker/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/2.png -------------------------------------------------------------------------------- /云原生技术/img/docker/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/20.png -------------------------------------------------------------------------------- /云原生技术/img/docker/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/21.png -------------------------------------------------------------------------------- /云原生技术/img/docker/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/22.png -------------------------------------------------------------------------------- /云原生技术/img/docker/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/23.png -------------------------------------------------------------------------------- /云原生技术/img/docker/24.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/24.png -------------------------------------------------------------------------------- /云原生技术/img/docker/25.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/25.png -------------------------------------------------------------------------------- /云原生技术/img/docker/26.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/26.png -------------------------------------------------------------------------------- /云原生技术/img/docker/27.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/27.png -------------------------------------------------------------------------------- /云原生技术/img/docker/28.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/28.png -------------------------------------------------------------------------------- /云原生技术/img/docker/29.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/29.png -------------------------------------------------------------------------------- /云原生技术/img/docker/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/3.png -------------------------------------------------------------------------------- /云原生技术/img/docker/30.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/30.png -------------------------------------------------------------------------------- /云原生技术/img/docker/31.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/31.png -------------------------------------------------------------------------------- /云原生技术/img/docker/32.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/32.png -------------------------------------------------------------------------------- /云原生技术/img/docker/33.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/33.png -------------------------------------------------------------------------------- /云原生技术/img/docker/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/4.png -------------------------------------------------------------------------------- /云原生技术/img/docker/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/5.png -------------------------------------------------------------------------------- /云原生技术/img/docker/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/6.png -------------------------------------------------------------------------------- /云原生技术/img/docker/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/7.png -------------------------------------------------------------------------------- /云原生技术/img/docker/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/8.png -------------------------------------------------------------------------------- /云原生技术/img/docker/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/docker/9.png -------------------------------------------------------------------------------- /云原生技术/img/tec02/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec02/1.png -------------------------------------------------------------------------------- /云原生技术/img/tec02/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec02/2.png -------------------------------------------------------------------------------- /云原生技术/img/tec02/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec02/3.png -------------------------------------------------------------------------------- /云原生技术/img/tec02/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec02/4.png -------------------------------------------------------------------------------- /云原生技术/img/tec02/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec02/5.png -------------------------------------------------------------------------------- /云原生技术/img/tec03/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec03/1.png -------------------------------------------------------------------------------- /云原生技术/img/tec03/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/云原生技术/img/tec03/2.png -------------------------------------------------------------------------------- /服务器/Docker 安装neo4j.md: -------------------------------------------------------------------------------- 1 | Docker 安装 neo4j 2 | --- 3 | 4 | # 1. 安装过程 5 | 1. 拉取Neo4j的镜像:`docker pull neo4j:3.5` 6 | 2. 建立物理盘对应文件夹:`mkdir $HOME/neo4j/data` 7 | 3. 运行Neo4j容器:`docker run -it -d --publish=7474:7474 --publish=7687:7687 --volume=$HOME/neo4j/data:/data neo4j:3.5` 8 | 4. 访问Neo4j:`http://xxxx:7474/browser/`,按照指导,来设置连接,初始用户名和密码为`neo4j`,然后重置密码 9 | 10 | # 2. 参考 11 | 1. 使用docker安装neo4j 12 | 2. linux下docker安装neo4j -------------------------------------------------------------------------------- /服务器/SSH免密登陆.md: -------------------------------------------------------------------------------- 1 | SSH免密登陆 2 | 3 | # 1. 客户端生成公私钥 4 | 1. 本地客户端生成公私钥(如果没有特殊配置,只需要一路回车即可) 5 | 6 | ```sh 7 | ssh-keygen 8 | ``` 9 | 10 | 2. 在默认配置的情况下,会在用户目录的.ssh文件夹下创建公私钥 11 | 12 | ```sh 13 | cd ~/.ssh 14 | ls 15 | ``` 16 | 17 | 3. 然后你会发现,在这个文件夹下会创建出来`id_rsa`(私钥)和`id_rsa.pub`(公钥) 18 | 19 | # 2. 上传公钥到服务器 20 | 1. 假设对应上传的服务器为127.0.0.1,对应的用户为root,那么使用如下的命令上传公钥: 21 | 22 | ```sh 23 | ssh-copy-id -i ~/.ssh/id_rsa.pub root@127.0.0.1 24 | ``` 25 | 26 | 2. 查看服务器上的公钥信息 27 | 28 | ```sh 29 | cd ~/.ssh 30 | vim authorized_keys 31 | ``` 32 | 33 | # 3. 使用免密的方式登陆 34 | 在客户端上直接运行如下命令即可连接远程服务器。 35 | 36 | ```sh 37 | ssh root@127.0.0.1 38 | ``` -------------------------------------------------------------------------------- /编码格式/ReadMe.md: -------------------------------------------------------------------------------- 1 | 1. 本部分中的内容有很多是由学习小组共同整理的。 2 | 2. 贡献人:18 thl、lc、qrx、zzn、zzy、glh、zhy -------------------------------------------------------------------------------- /编码格式/img/1.jpg: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/1.jpg -------------------------------------------------------------------------------- /编码格式/img/1.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/1.png -------------------------------------------------------------------------------- /编码格式/img/10.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/10.png -------------------------------------------------------------------------------- /编码格式/img/11.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/11.png -------------------------------------------------------------------------------- /编码格式/img/12.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/12.png -------------------------------------------------------------------------------- /编码格式/img/13.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/13.png -------------------------------------------------------------------------------- /编码格式/img/14.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/14.png -------------------------------------------------------------------------------- /编码格式/img/15.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/15.png -------------------------------------------------------------------------------- /编码格式/img/16.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/16.png -------------------------------------------------------------------------------- /编码格式/img/17.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/17.png -------------------------------------------------------------------------------- /编码格式/img/18.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/18.png -------------------------------------------------------------------------------- /编码格式/img/19.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/19.png -------------------------------------------------------------------------------- /编码格式/img/2.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/2.png -------------------------------------------------------------------------------- /编码格式/img/20.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/20.png -------------------------------------------------------------------------------- /编码格式/img/21.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/21.png -------------------------------------------------------------------------------- /编码格式/img/22.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/22.png -------------------------------------------------------------------------------- /编码格式/img/23.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/23.png -------------------------------------------------------------------------------- /编码格式/img/3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/3.png -------------------------------------------------------------------------------- /编码格式/img/4.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/4.png -------------------------------------------------------------------------------- /编码格式/img/5.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/5.png -------------------------------------------------------------------------------- /编码格式/img/6.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/6.png -------------------------------------------------------------------------------- /编码格式/img/7.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/7.png -------------------------------------------------------------------------------- /编码格式/img/8.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/8.png -------------------------------------------------------------------------------- /编码格式/img/9.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/9.png -------------------------------------------------------------------------------- /编码格式/img/mp3.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/SpriCoder/Tec-Be/57b4592413b045d4e1f7c943388df22475d4df61/编码格式/img/mp3.png -------------------------------------------------------------------------------- /编码格式/压缩算法.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. ZIP](#1-zip) 4 | - [2. LZ编码](#2-lz编码) 5 | - [2.1. Sliding-Window Compression](#21-sliding-window-compression) 6 | - [3. Huffman树](#3-huffman树) 7 | - [3.1. Deflate树](#31-deflate树) 8 | - [3.2. 码表](#32-码表) 9 | - [3.2.1. 介绍码表](#321-介绍码表) 10 | - [3.2.2. 格式](#322-格式) 11 | - [4. Huffman树](#4-huffman树) 12 | - [5. 压缩结果解码](#5-压缩结果解码) 13 | 14 | 15 | 16 | # 1. ZIP 17 | 1. ZIP是无损压缩方法。其压缩格式教唆Deflate,采用了LZ编码思想,使用了Huffman树的结构。 18 | 2. ZIP经历了两次压缩,第一次基于LZ,第二次基于Huffman 19 | 20 | # 2. LZ编码 21 | 1. LZ77(sliding-window compression)滑动窗口 22 | 2. LZ78(dictionary) 23 | 3. LZW(Lempel–Ziv–Welch) 24 | 4. LZMA(Lempel-Ziv Markov chain Algorithm) 25 | 26 | 27 | ## 2.1. Sliding-Window Compression 28 | 1. length 29 | 2. diatance 30 | 3. literal(计入没见过的部分) 31 | + 0-255代表256个不同的literal 32 | + 256代表literal的结束 33 | + 从257开始代表长度 34 | 4. 滑动一遍后就已经生成了 35 | + ,容易。这四个字符进行存储 36 | + 这就是第一部分压缩 37 | 5. Eg. 生`,容易。`活`,容易。`生活,不`容易`。 38 | 6. ZIP中设置的滑动窗口是32KB 39 | ![](img/7.png) 40 | 41 | 42 | # 3. Huffman树 43 | 1. 给定N个权值作为N个叶子结点,构造一棵二叉树,若该树的带权路径长度达到最小,称这样的二叉树为最优二叉树,也称为哈夫曼树(Huffman Tree)。哈夫曼树是带权路径长度最短的树,权值较大的结点离根较近。 44 | ![](img/5.png) 45 | 46 | ## 3.1. Deflate树 47 | ![](img/6.png) 48 | 49 | 50 | ## 3.2. 码表 51 | 1. 对distance进行编码,其范围为1-32768 52 | 2. 如果1-32768都出现过且频率相同,如何编码? 53 | + 无符号原码 54 | + 15位 55 | + 如果只出现了其中的100个数,共出现200次,则需3000位 56 | 3. 频率不同:使用Huffman树进行编码 57 | ![](img/8.png) 58 | ![](img/9.png) 59 | 60 | ### 3.2.1. 介绍码表 61 | 1. 历史遗留问题,PK把distance又分成了30分。 62 | 他把distance划分成多个区间,每个区间当做一个整数来看,这个整数称为**Distance Code**。 63 | 2. deflate可以看作Huffman基础之上的一种编码 64 | 3. 对literal和length编码 65 | + length最小值认为是3 66 | + literal和length二者合二为一,共用一套码表 67 | 4. 0-255代表256个不同的literal 68 | 5. 256代表literal结束 69 | 6. 从**257开始代表**length 70 | 71 | ### 3.2.2. 格式 72 | 1. Code + Extra bits + Distance 73 | 2. Code只要有一个即可,所以不存在 74 | 3. Extra bits:表示有2Extra bits的可能 75 | 76 | # 4. Huffman树 77 | 1. 最优二叉树 78 | 2. 表示这些token需要每个3位,就是常用的值短一点,不常用的值长一点。 79 | + 插入手机图片 80 | 3. 数字上面的值是这个token出现的次数。 81 | ![](img/1.jpg) 82 | 83 | # 5. 压缩结果解码 84 | 1. 当解码器接收到一个比特流的时候,首先可以按照literal/length这个码表来解码,如果解出来是0-255,就表示未匹配字符,如果是256,那自然就结束,如果是257-285之间,则表示length,把后面扩展比特加上形成length后,后面的比特流肯定就表示distance,因此,实际上通过一个Huffman码表,对各类情况进行了统一,而不是通过加一个什么标志来区分到底是literal还是重复字符串。 85 | 2. (4,5)解码容易,(3,7)解码已经解码的(4,5) 86 | + 2代表3,根据之前的图,先读到256,然后读到length和从哪里找,2->3. 87 | + distance根据Extra bits来进行确定是对应哪个 88 | + 从头计算一次 89 | 3. Eg. 90 | ![](img/10.png) 91 | ![](img/11.png) -------------------------------------------------------------------------------- /编码格式/文件编码格式.md: -------------------------------------------------------------------------------- 1 | 文件编码格式 2 | --- 3 | 4 | 5 | 6 | - [1. 总体文件格式](#1-总体文件格式) 7 | - [1.1. 后缀名和编码格式](#11-后缀名和编码格式) 8 | - [1.2. 为什么需要编码?](#12-为什么需要编码) 9 | - [1.3. 存储资源的冲突](#13-存储资源的冲突) 10 | - [2. 计算资源的冲突](#2-计算资源的冲突) 11 | 12 | 13 | 14 | # 1. 总体文件格式 15 | 16 | ASCII|UTF-8|Unicode|GB2312 17 | --|--|--|-- 18 | RGB|CMYK(Cyan Magenta Yellow blacK)|-|- 19 | .txt|.doc|.md|- 20 | .jpg|.png|.ai|- 21 | .wav|.mp3|-|- 22 | .avi|.mp4|.flv|- 23 | 24 | 1. Unicode是字符集而不是编码集 25 | 2. CYMK(Cyan magenta yellow black)是一种彩色打印格式。 26 | + 为什么不仅仅是三原色?合成出来的黑色是不合适的。 27 | 28 | ## 1.1. 后缀名和编码格式 29 | 1. 你修改文件的后缀名只是让操作系统用什么软件来进行解码,而并没有修改文件的后缀名。 30 | 31 | ## 1.2. 为什么需要编码? 32 | 1. 矛盾:有限的存储资源和无限的需求之间的矛盾。 33 | + 有限的**存储资源**和不断增长的**存储**需求 34 | + 有限的**计算资源**和不断增长的**时间**需求 35 | 36 | ## 1.3. 存储资源的冲突 37 | 1. 想让单位**存储空间**存储的信息量更大 38 | 2. 信息熵更大: 39 | 40 | ![](img/2.png) 41 | 42 | 3. 编码的好处 43 | + 节省磁盘空间 44 | + 易于转移、上传 45 | + 安全 46 | + 有些编码可以在一定的破坏后依旧正常显示(二维码,图像压缩) 47 | + 如果没有特定的解码方式或解码器,无法打开文件(rar) 48 | 49 | 50 | # 2. 计算资源的冲突 51 | 1. 目的:我们想要文件的编码和解码速度更快。 52 | 2. 具体问题 53 | + 压缩视频 54 | + 压缩音频(.zip .7z) 55 | + 安装软件(.dmg .pkg tar.gz) -------------------------------------------------------------------------------- /编码格式/视频编码格式.md: -------------------------------------------------------------------------------- 1 | 视频 2 | --- 3 | 4 | 5 | 6 | - [1. MP4](#1-mp4) 7 | - [1.1. 什么是MP4](#11-什么是mp4) 8 | - [1.2. 视频编码方式](#12-视频编码方式) 9 | - [1.3. 视频编码方式的必然性](#13-视频编码方式的必然性) 10 | - [1.4. 视频部分基本概念](#14-视频部分基本概念) 11 | - [1.4.1. 分辨率](#141-分辨率) 12 | - [1.4.2. 帧率](#142-帧率) 13 | - [1.4.3. 码率](#143-码率) 14 | - [1.5. 压缩MP4大小](#15-压缩mp4大小) 15 | - [1.5.1. 实现有损图像压缩和解压](#151-实现有损图像压缩和解压) 16 | - [1.5.2. 实现宏块误差计算](#152-实现宏块误差计算) 17 | - [运动预测编码](#运动预测编码) 18 | - [块间相似度](#块间相似度) 19 | - [寻找具体实现块](#寻找具体实现块) 20 | - [1.5.3. 实现运动编码预测](#153-实现运动编码预测) 21 | - [1.5.4. 实现P帧编码](#154-实现p帧编码) 22 | - [1.5.5. 实现GOP生成](#155-实现gop生成) 23 | - [1.6. 其他备注](#16-其他备注) 24 | 25 | 26 | 27 | # 1. MP4 28 | 29 | ## 1.1. 什么是MP4 30 | 1. MP4是一套用于音频、视频信息的压缩编码标准, 由国际标准化组织(ISO)和国际电工委员会(IEC)下属的"动态图像专家组"(Moving Picture Experts Group, 即MPEG)制定。 31 | 32 | ## 1.2. 视频编码方式 33 | 1. 视频编码方式是指通过压缩技术,将原始视频格式的文件转换成另一种视频格式文件的方式。 34 | 2. 目标:减少占用空间 35 | 3. 方式:消除连续图像之间的冗余信息,抛弃一下与视频相关的信息,在解压缩进行回访时,创建原始的近似值。 36 | 37 | ## 1.3. 视频编码方式的必然性 38 | 1. 使通过互联网传输视频变得更加容易 39 | 2. 兼容性更强 40 | 3. 视频是连续的图像序列,由连续的帧组成,一帧借我一幅图像。由于人眼的视觉暂留效应,当帧序列以一定的速率进行播放的时候,我们看到的就是连续的视频。为了便于储存传输,我们需要对原始的视频进行编码压缩,以去除空间、时间的冗余 41 | 42 | ## 1.4. 视频部分基本概念 43 | 44 | ### 1.4.1. 分辨率 45 | 视频是由连续的图像构成的。每一张图像,我们称为一帧。图像则是由像素构成的,而一个图像有多少个像素,称为这个图像的分辨率。 46 | 47 | ### 1.4.2. 帧率 48 | 一个视频,每一秒由多少图像构成,称为这个视频的帧率。 49 | 50 | ### 1.4.3. 码率 51 | 码率 = 体积 / 时间 52 | ![](img/12.png) 53 | 54 | ## 1.5. 压缩MP4大小 55 | 56 | ### 1.5.1. 实现有损图像压缩和解压 57 | 1. 帧的类型: 58 | 1. I帧也称为关键帧,这是视频的全帧图像。创建i帧的次数越多,所需的空间就越多。 59 | 2. P帧预测帧的缩写,这是一个仅包含部分图像的增量帧。它将向后看向i帧或另一个p帧,以查看图像的一部分是否相同。如果是这样,将排除该部分以节省空间。 60 | 3. B帧双向预测帧的缩写,这是一个三角帧,也只包含一些图像。然而,这与p帧之间的区别在于,当选择在另一帧中存在的细节时,它可以向后或向前看其他delta帧或i帧。因此,B帧提供了改进的压缩,而不会影响观看体验。但是,它们确实需要更高的编码配置文件。 61 | 62 | ### 1.5.2. 实现宏块误差计算 63 | 运动预测编码 64 | --- 65 | ![](img/15.png) 66 | 67 | 块间相似度 68 | --- 69 | ![](img/16.png) 70 | 71 | 寻找具体实现块 72 | --- 73 | ![](img/17.png) 74 | 75 | ### 1.5.3. 实现运动编码预测 76 | ![](img/18.png) 77 | ![](img/19.png) 78 | ![](img/20.png) 79 | 80 | ### 1.5.4. 实现P帧编码 81 | ![](img/21.png) 82 | ![](img/22.png) 83 | 84 | ### 1.5.5. 实现GOP生成 85 | ![](img/23.png) 86 | 87 | ## 1.6. 其他备注 88 | 1. 对一个部分的图片的关键帧中找到相应的块,然后生成运动矢量。 89 | 2. 差分图:运动矢量计算出来的图片和真实的相应的图片的 90 | 3. 关键帧:数据S全部存储(I帧) 91 | + 其他的帧 92 | 4. 预测帧:保存相应的运行矢量即可。(P帧) 93 | 5. 双向预测帧:(B帧) 94 | 6. 如果预测加起来第一个帧的部分,如果大于之后体积,则选择为关键帧。 95 | 7. 比较相似度:就是通过做差,然后求和判断是否是一个相似的部分。 96 | + 两个图片进行做差 97 | + 以一个为中心进行四周扩展 98 | + 差分图如果差的比较多,那么从头开始进行变换,不然就是从上一个进行变换。 99 | -------------------------------------------------------------------------------- /编码格式/音频编码格式.md: -------------------------------------------------------------------------------- 1 | 2 | 3 | - [1. mp3](#1-mp3) 4 | - [1.1. mp3概述](#11-mp3概述) 5 | - [1.2. MPEG Layer3解编码的基本原理](#12-mpeg-layer3解编码的基本原理) 6 | - [1.3. 文件格式](#13-文件格式) 7 | - [1.3.1. ID3V2](#131-id3v2) 8 | - [1.3.2. 音频数据帧](#132-音频数据帧) 9 | - [1.3.3. ID3V1](#133-id3v1) 10 | - [2. MPEG](#2-mpeg) 11 | - [2.1. MPEG音频压缩基础](#21-mpeg音频压缩基础) 12 | - [2.1.1. MPEG-1音频](#211-mpeg-1音频) 13 | - [2.1.2. MPEG-2音频](#212-mpeg-2音频) 14 | - [3. 思维导图](#3-思维导图) 15 | - [4. 参考](#4-参考) 16 | 17 | 18 | 19 | # 1. mp3 20 | 1. mp3的进阶新版本是ACC 21 | 22 | ## 1.1. mp3概述 23 | 1. mp3动态影像专家压缩标准音频层面3 24 | 2. MP3是由帧(frame)构成 25 | 3. 有损压缩形式,压缩比例高(10:1) 26 | 27 | ## 1.2. MPEG Layer3解编码的基本原理 28 | 通常情况下,MP3压缩器将原始声音通过FFT(快速傅立叶变换)变化到频域,然后通过一定的算法算出何种频率声音可以携带更多的信息。而在还原时解码器所需要做的仅仅是将其从频域再变换回来。 29 | 30 | ## 1.3. 文件格式 31 | ### 1.3.1. ID3V2 32 | ### 1.3.2. 音频数据帧 33 | ### 1.3.3. ID3V1 34 | 1. 比较固定,限制了标签必须包含艺术家、标题、唱片集等 35 | 36 | # 2. MPEG 37 | 1. MPEG音频文件是MPEG1标准中的声音部分,根据压缩质量和编码复杂程度划分为三层,分别为layout1、layout2、layout3,其中第三层Layout3是mp3 38 | 39 | ## 2.1. MPEG音频压缩基础 40 | 41 | ### 2.1.1. MPEG-1音频 42 | 1. 1-2个声道 43 | 2. 采样频率 44 | 3. 位率 45 | 46 | ### 2.1.2. MPEG-2音频 47 | 1. 有1-2个MPEG-1的扩展 48 | 49 | # 3. 思维导图 50 | ![](img/mp3.png) 51 | 52 | # 4. 参考 53 | 1. 常见音频编码格式解析 --------------------------------------------------------------------------------