扬仔的杂货铺

分享微不足道的经验,记录稀奇古怪的玩意

0%

程序运行时产生的数据都属于临时数据,成语西单运行结束都会被释放

通过文件可以将数据持久化

C++中对文件操作需要包含头文件<fstream>

文件类型分为两种:

  1. 文本文件

    文本以文本的ASCII码形式存储在计算机中

  2. 二进制文件

    文件以文本的二进制形式存储在计算机中,用户一般不能直接读懂它们

操作文件的三大类:

  1. ofstream: 写操作
  2. ifstream: 读操作
  3. fstream: 读写操作

文本文件

写文件

写文件步骤如下:

阅读全文 »

GateWay跨域问题解决(双重)

原文链接:https://www.jianshu.com/p/bf997c524a58

gateway中全局的跨域问题解决两种方式,一种是创建配置类不推荐,如有需要可以自己查询相关资料;另一种是使用配置文件,相对简单,如下:

1
2
3
4
5
6
7
8
9
10
11
spring:
cloud:
gateway:
# gateway的全局跨域请求配置
globalcors:
corsConfigurations:
'[/**]':
allowedHeaders: "*"
allowedOrigins: "*"
allowCredentials: true
allowedMethods: "*"

上述属性值可以根据自己的需要配置,”*”表示所有。

正常情况下基于以上配置即可,但是由于目前的项目的下游微服务也配置了可以跨域的相关配置,这就导致返回的ResponseHeader中有多重属性,这个多重属性浏览器是不认的。所以基于此的处理方法,把下游的所有配置都取消,但是下游服务数量又太多,所以通过查询找到了以下的方案,参考https://github.com/spring-cloud/spring-cloud-gateway/issues/728

1
2
3
4
5
6
7
8
9
10
11
12
13
spring:
cloud:
gateway:
# gateway的全局跨域请求配置
globalcors:
corsConfigurations:
'[/**]':
allowedHeaders: "*"
allowedOrigins: "*"
allowCredentials: true
allowedMethods: "*"
default-filters:
- DedupeResponseHeader=Access-Control-Allow-Origin Access-Control-Allow-Credentials Vary, RETAIN_UNIQUE

在配置文件中添加上面的过滤器,这个过滤器的作用是剔除重复的响应头。gateway的内置的过滤器可以参考这篇文章:https://blog.csdn.net/tuyong1972873004/article/details/107123254
内置的过滤器有很多,可以根据自己的实际需求去配置。

正常情况下以上配置就可以解决上述的问题,但是发现后台报错,错误信息提示无法找到DedupeResponseHeaderGateWayFilter。后来查询资料才发现,这个过滤器是GreenwichSR2版本提供的新特性,当前的springcloud版本太低。所以最后没有办法,只能手动实现一个和DedupeResponseHeaderGateWayFilter功能相同的过滤器。代码如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
import org.springframework.cloud.gateway.filter.GatewayFilterChain;
import org.springframework.cloud.gateway.filter.GlobalFilter;
import org.springframework.cloud.gateway.filter.NettyWriteResponseFilter;
import org.springframework.core.Ordered;
import org.springframework.http.HttpHeaders;
import org.springframework.stereotype.Component;
import org.springframework.web.server.ServerWebExchange;
import reactor.core.publisher.Mono;
import java.util.ArrayList;


@Component("corsResponseHeaderFilter")
public class CorsResponseHeaderFilter implements GlobalFilter, Ordered {

@Override
public Mono<Void> filter(ServerWebExchange exchange, GatewayFilterChain chain) {
return chain.filter(exchange).then(Mono.defer(() -> {
exchange.getResponse().getHeaders().entrySet().stream()
.filter(kv -> (kv.getValue() != null && kv.getValue().size() > 1))
.filter(kv -> (kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_ORIGIN)
|| kv.getKey().equals(HttpHeaders.ACCESS_CONTROL_ALLOW_CREDENTIALS)))
.forEach(kv -> {
kv.setValue(new ArrayList<String>() {{
add(kv.getValue().get(0));
}});
});

return chain.filter(exchange);
}));
}

@Override
public int getOrder() {
// 指定此过滤器位于NettyWriteResponseFilter之后
// 即待处理完响应体后接着处理响应头
return NettyWriteResponseFilter.WRITE_RESPONSE_FILTER_ORDER + 1;
}
}

加上以上配置类后,问题解决。

本阶段主要针对C++面向对象编程技术做详细讲解,探讨C++中的核心和精髓。

内存分区模型

C++程序再执行时,将内存大方向划分为4个区域

  • 代码区:存放函数体的二进制代码,由操作系统进行管理的
  • 全局区:存放全局变量和静态变量以及常量
  • 栈区:由编译器自动分配释放,存放函数的参数值,局部变量等
  • 堆区:由程序员分配和释放,若程序员不释放,程序结束时由操作系统回收

内存四区意义:

不同区域存放的数据,赋予不同的声明周期,给我们更大的灵活编程

程序运行前

在程序编译后,生成了exe可执行程序,未执行该程序前分为两个区域

代码区:

存放CPU执行的机器命令

代码区是共享的,共享的目的是对于频繁被执行的程序,只需要在内存中有一份代码即可

代码区是只读的,使其只读的原因是防止程序意外地修改了它的指令

全局区:

全局变量和静态变量存放在此

全局区还包含了常量区,字符串常量和其他常量也存放在此

该区域的数据在程序结束后由操作系统释放。

阅读全文 »

系统需求

通讯录是一个可以记录亲人、好友信息的工具。

本教程主要利用C++来实现一个通讯录管理系统

系统中需要实现的功能如下:

  • 添加联系人:向通讯录中添加信任,信息包括(姓名、性别、年龄、联系电话、家庭住址)最多记录1000人
  • 显示联系人:显示通讯录中所有联系人信息
  • 删除联系人:按照姓名进行删除指定联系人
  • 查找联系人:按照姓名查看指定联系人
  • 修改联系人:按照姓名重新修改指定联系人
  • 清空联系人:清空通讯录中所有信息
  • 退出通讯录:退出当前使用的通讯录

创建项目

创建项目步骤如下:

  • 创建新项目
  • 添加文件

菜单功能

功能描述:用户选择功能的界面

阅读全文 »

第一个C++程序

1
2
3
4
5
6
#include <iostream>

int main (){
std::cout << "Hello World!" << std::endl;
return 0;
}

变量

变量存在的意义:方便我们管理内存空间

变量创建的语法:

1
2
3
数据类型 变量名 = 变量初始值;

int a = 10;

常量

作用:用于记录程序中不可更改的数据

C++定义常量的两种方式

阅读全文 »

ubuntu更换软件安装源(ARM)

/etc/yum.repos.d/CentOS-Base.repo的文件修改为以下内容(修改前注意备份)

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
deb http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse

deb http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-security main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-updates main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-proposed main restricted universe multiverse

deb-src http://mirrors.aliyun.com/ubuntu-ports/ focal-backports main restricted universe multiverse

两个相同字符之间的最长子字符串

题目详情

给你一个字符串s,请你返回两个相同字符之间的最长子字符串的长度,计算长度时不含这两个字符。如果不存在这样的子字符串,返回-1

子字符串是字符串中的一个连续字符序列。

示例 1

1
2
3
输入:s = "aa"
输出:0
解释:最优的子字符串是两个 'a' 之间的空子字符串。

示例 2

1
2
3
输入:s = "abca"
输出:2
解释:最优的子字符串是 "bc" 。

示例 3

1
2
3
输入:s = "cbzxy"
输出:-1
解释:s 中不存在出现出现两次的字符,所以返回 -1 。

示例 4

1
2
3
输入:s = "cabbac"
输出:4
解释:最优的子字符串是 "abba" ,其他的非最优解包括 "bb" 和 "" 。

解题方法

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
class Solution {
public int maxLengthBetweenEqualCharacters(String s) {
// 最后结果保存
int result = -1;
// 字符串转换成char类型数组
char[] chars = s.toCharArray();
for (int i = 0; i < chars.length; i++) {
// 如果结果已经大于数组的剩余长度,直接返回(就算有解肯定也不能大于result)
if (result > chars.length - i - 1){
break;
}
// 从后向前查找i开始剩下的字符串是否有相同字符
int i1 = s.substring(i).lastIndexOf(chars[i]) + i;
// 如果找到,计算之间的长度
if (i1 > 0){
int temp = i1 - i - 1;
if (temp > result){
result = temp;
}
}
}
return result;
}
}

使用Maven进行打jar包的pom.xml文件配置

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
<build>
<plugins>
<plugin>
<!-- NOTE: 不须要设置groupId,由于默认为org.apache.maven.plugins -->
<artifactId>maven-assembly-plugin</artifactId>
<version>3.2.0</version>
<configuration>
<descriptorRefs>
<descriptorRef>jar-with-dependencies</descriptorRef>
</descriptorRefs>
<!-- 指定jar包名称,需appendAssemblyId和finalName配合使用 -->
<appendAssemblyId>false</appendAssemblyId>
<finalName>${project.artifactId}-full</finalName>
<archive>
<manifest>
<!-- 设置主类-->
<mainClass>tech.nosql.MainTask</mainClass>
<!-- 将版本信息写入MANIFEST.MF -->
<addDefaultImplementationEntries>true</addDefaultImplementationEntries>
</manifest>
</archive>
</configuration>
<executions>
<execution>
<!-- this is used for inheritance merges -->
<id>make-assembly</id>
<!-- 将assembly绑定到package阶段 -->
<phase>package</phase>
<goals>
<goal>single</goal>
</goals>
</execution>
</executions>
</plugin>
</plugins>
</build>

Github项目路径

我的Gitee保存的项目路径

1
2
3
4
5
# 通过本地文件读取binlog生成sql文件
./my2sql -mode file -local-binlog-file ./mysql-bin.000030 -start-file mysql-bin.000030 -work-type rollback -user root -password 123456 -port 3306 -host 127.0.0.1 -databases hwzxoa -tables briefing -output-dir ./sql2/

# 使用运行中的数据库读取binlog文件
./my2sql -start-file mysql-bin.000030 -work-type rollback -user root -password 123456 -port 3306 -host 127.0.0.1 -databases hwzxoa -tables briefing -output-dir ./sql2/