avatar
文章
64
标签
80
分类
27
前端
  • HTML
  • CSS
  • Vue教程
  • Vue项目
服务器
  • Linux
  • Nginx
  • AWS
归档
标签
分类
关于
Anthony的技术博客Aliyun
搜索
前端
  • HTML
  • CSS
  • Vue教程
  • Vue项目
服务器
  • Linux
  • Nginx
  • AWS
归档
标签
分类
关于

Aliyun

发表于2022-11-19|更新于2022-12-03|Cloud
|总字数:21|阅读时长:1分钟|浏览量:

服务器硬盘扩容

在线硬盘扩容

阿里云OSS+AWS Cloudfront

CloudFront加速Vercel

云服务器阿里云硬盘
cover of previous post
上一篇
AWS
AWS基本教程场景是:在把22端口关闭了,无法再连上服务器的情况 解决办法:关闭服务器,点击操作->实例设置->编辑用户数据 1234567#!/bin/bash# 允许 SSH 端口iptables -P INPUT ACCEPTiptables -P OUTPUT ACCEPTiptables -P FORWARD ACCEPTiptables -Fiptables -A INPUT -p tcp --dport 22 -j ACCEPT 再启动服务器 AWS升级配置1.先停止实例,不是终止实例 2.修改实例类型 重启公网IP可能会改变 服务器局域网互通需要把局域网 想要互通的服务器,加入一个公共的的默认安全组 选择default安全组 要看服务器部署在哪里 JavaSDK上传图片到S3123456789101112131415161718192021222324252627282930313233343536@RestController@Slf4j@Api(tags = "上传接口")public class UploadController { @Value("${S3.accessKey}") String accessKey; @Value("${S3.secretKey}") String secretKey; @Value("${S3.endPoint}") String endPoint; @Value("${S3.bucketName}") String bucketName; @PostMapping("/upload") @ApiOperation("上传") @NotNeedAuth public Response<String> upload(@RequestParam("file") MultipartFile file) { String originalFilename = file.getOriginalFilename(); if (!Constant.PHOTO_LIST.contains(originalFilename.substring(originalFilename.lastIndexOf(".") + 1))) { return Response.fail(CodeConstant.CODE_095); } String newImageName = ThreadLocalRandom.current().nextInt(10000) + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); String fileName = "lxdt/dt/" + Constant.DIRECTORY_TIME_FORMAT.format(LocalDateTime.now(Constant.TIME_ZONE)) + newImageName; try { S3Util.uploadFileByFile(accessKey, secretKey, endPoint, bucketName, fileName, file); } catch (Exception e) { log.error("上传失败", e); return Response.error(""); } return Response.successData(fileName); }} 12345678910111213141516public class S3Util { /** * 图片上传 */ public static void uploadFileByFile(String accessKey, String secretKey, String endPoint, String bucketName, String folderName, MultipartFile file) throws IOException { ClientConfiguration clientConfig = new ClientConfiguration(); clientConfig.setProtocol(Protocol.HTTPS); AmazonS3 amazonS3 = AmazonS3Client.builder().withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, Region.getRegion(Regions.AP_SOUTHEAST_1).getName())) .withClientConfiguration(clientConfig).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) .disableChunkedEncoding().withPathStyleAccessEnabled(true).withForceGlobalBucketAccessEnabled(true).enablePathStyleAccess().build(); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentType(file.getContentType()); objectMetadata.setContentLength(file.getSize()); amazonS3.putObject(new PutObjectRequest(bucketName, folderName, file.getInputStream(), objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead)); }} S3桶策略公开访问桶策略 123456789101112{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ]} 印象中有遇到这种情况: ​ 第一次操作桶的时候,桶里面的文件是能正常共享出来的 ​ 很久之后没有操作了,再上传一个新文件,上传的这个文件就不能共享了 第二次出现这样情况的时候,我文件的url搞错了,是可以正常共享的 PicGO+S3创建存储桶红框里不要勾选 创建文件夹,设置公开 开启静态托管 新建IAM用户访问创建IAM页面 创建使用者 创建使用者详情 创建使用者权限,点击下一步,然后就能看到key和密钥了 PicGO配置PicGO软件许要下再S3插件,然后再配置文件里粘贴这个 1234567"aws-s3": { "accessKeyID": "AKIA2Q6ZSIPP7MKZOFHR", "secretAccessKey": "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", "bucketName": "mmzcg.com", "uploadPath": "blog/{year}/{fullName}", "acl": "public-read"} 参考S3教程 PicGoS3教程 CloudFront加速Vercel1.找到vercel自动分配的域名 2.aws 创建分配 3.选择源 不要选择源,输入vercel分配的域名 4.选择全部https,其它可以默认 5.选择证书 备用域名:比如vercel默认分配的是xxx.vercel.app你想加速的域名是 abc.blog,备用域名就填abc.blog 自定义SSL证书:用aws自带的证书申请工具 点击保存,回到CloudFront首页 6.cname 看上次修改时间这一列,如果显示的时间,就表示刚才的配置已经生效了,如果显示在部署中…就等一会 CloudFront这一列会分配一个域名,在域名解析那里Cname指向这个域名就可以了 AWS S3和Hexo1.安装插件 12# 装置npm install hexo-deployer-aws-s3 --save-dev 2.改_config.yml 12345678deploy:# - type: 'git'# repo: [email protected]:aaaaaaanthony/aaaaaaanthony.github.io.git# branch: master type: 'aws-s3' # 写死 region: ap-east-1 # 区域名 bucket: mmzcg.com # 桶名 如果要部署多个地方,每个仓库的type前面要加一个- 如果只有一个,就只用type开头就行 3.执行环境变量 123export AWS_ACCESS_KEY_ID=AKIA2Q6ZSIPP7MKZOFHRexport AWS_SECRET_ACCESS_KEY=ZifJfUmVVGMq37hd8Itozp4fws5O97dVlwgMgtCYsource /etc/profile 4.部署 1234hexo cleanhexo algolihexo d -g 发现报错,The bucket does not allow ACLs,还需要在存储中开启 ACLs 接下来要关闭「阻止共有访问操作」 部署成功后,开启静态网站托管功能 RDS创建RDS选择mysql社区版本 AWS的RDS开启慢查询日志到cloudwatch中 快照导出到S3 参考文档 接下来的页面是需要的设置 导出标识符,就是导出任务的名字 导出的数据,这里测试就简单点,导出全部表,要是选部分表,文档里有导出规则 S3 目标, 选一个存储桶 接下来的两个是难点,IAM角色,和加密 先看加密,先创建ARN,找到配置的选项卡 点击下面的链接 在客户管理的秘钥,创建一个秘钥, 客户管理的密钥和AWS托管的密钥是有区别的,要选对 创建完之后,再回到 密钥列表的页面,点密钥ID,进入到详情页 复制ARN刚刚才导出的页面,角色权限什么的,各种尝试下就可以了 front清空缓存API12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import boto3import datetimedef create_invalidation(distribution_id, paths): # 创建一个CloudFront客户端并提供凭证 client = boto3.client('cloudfront',aws_access_key_id='AKIA2UC26S7767GSGKJQ',aws_secret_access_key='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') # 创建一个唯一的无效请求ID caller_reference = str(datetime.datetime.now()) # 格式化路径 items = paths if isinstance(paths, list) else [paths] # 构建无效请求 invalidation_batch = { 'Paths': { 'Quantity': len(items), 'Items': items }, 'CallerReference': caller_reference } # 创建无效请求 response = client.create_invalidation( DistributionId=distribution_id, InvalidationBatch=invalidation_batch ) return response# distribution_id 列表,包含ID、说明和类型distribution_info = [ ["EX123AFBG", "生产环境", "生产", "baidu.com"],]# 要使失效的路径paths_to_invalidate = ['/*']# 循环遍历每个distribution_idfor info in distribution_info: distribution_id = info[0] print(f"Creating invalidation for Distribution ID: {distribution_id}, Description: {info[1]}, Type: {info[2]}") response = create_invalidation(distribution_id, paths_to_invalidate) print(response) print("================")print("刷新完成")
cover of next post
下一篇
C++
基础注释作用:在代码中加一些说明和解释,方便自己或其他程序员程序员阅读代码 123// 单行注释/* 多行注释 */ 提示:编译器在编译代码时,会忽略注释的内容 变量作用:给一段指定的内存空间起名,方便操作这段内存 语法:数据类型 变量名 = 初始值; 12345678910111213141516#include<iostream>using namespace std;int main() { //变量的定义 //语法:数据类型 变量名 = 初始值 int a = 10; cout << "a = " << a << endl; system("pause"); return 0;} 注意:C++在创建变量时,必须给变量一个初始值,否则会报错 常量作用:用于记录程序中不可更改的数据 C++定义常量两种方式 #define 宏常量: #define 常量名 常量值` 通常在文件上方定义,表示一个常量 const修饰的变量 const 数据类型 常量名 = 常量值 通常在变量定义前加关键字const,修饰该变量为常量,不可修改 1234567891011121314151617//1、宏常量#define day 7int main() { cout << "一周里总共有 " << day << " 天" << endl; //day = 8; //报错,宏常量不可以修改 //2、const修饰变量 const int month = 12; cout << "一年里总共有 " << month << " 个月份" << endl; //month = 24; //报错,常量是不可以修改的 system("pause"); return 0;} 标识符命名规则 标识符不能是关键字 标识符只能由字母、数字、下划线组成 第一个字符必须为字母或下划线 标识符中字母区分大小写 sizeof关键字**作用:**利用sizeof关键字可以统计数据类型所占内存大小 语法: sizeof( 数据类型 / 变量) 1234567891011121314int main() { cout << "short 类型所占内存空间为: " << sizeof(short) << endl; cout << "int 类型所占内存空间为: " << sizeof(int) << endl; cout << "long 类型所占内存空间为: " << sizeof(long) << endl; cout << "long long 类型所占内存空间为: " << sizeof(long long) << endl; system("pause"); return 0;} 整型结论:short < int <= long <= long long 浮点型作用:用于表示小数 浮点型变量分为两种: 单精度float 双精度double 两者的区别在于表示的有效数字范围不同。 12345678910111213141516171819202122int main() { float f1 = 3.14f; double d1 = 3.14; cout << f1 << endl; cout << d1<< endl; cout << "float sizeof = " << sizeof(f1) << endl; cout << "double sizeof = " << sizeof(d1) << endl; //科学计数法 float f2 = 3e2; // 3 * 10 ^ 2 cout << "f2 = " << f2 << endl; float f3 = 3e-2; // 3 * 0.1 ^ 2 cout << "f3 = " << f3 << endl; system("pause"); return 0;} 字符串型作用:用于表示一串字符 两种风格 C风格字符串: char 变量名[] = "字符串值"示例: 123456789int main() { char str1[] = "hello world"; cout << str1 << endl; system("pause"); return 0;} 注意:C风格的字符串要用双引号括起来 C++风格字符串: string 变量名 = "字符串值"示例: 123456789int main() { string str = "hello world"; cout << str << endl; system("pause"); return 0;} 注意:C++风格字符串,需要加入头文件==#include== 布尔类型**作用:**布尔数据类型代表真或假的值 bool类型只有两个值: true — 真(本质是1) false — 假(本质是0) 1234567891011121314int main() { bool flag = true; cout << flag << endl; // 1 flag = false; cout << flag << endl; // 0 cout << "size of bool = " << sizeof(bool) << endl; //1 system("pause"); return 0;} 数据的输入作用:用于从键盘获取数据 **关键字:**cin 语法: cin >> 变量 12345678910111213141516171819202122232425262728293031323334int main(){ //整型输入 int a = 0; cout << "请输入整型变量:" << endl; cin >> a; cout << a << endl; //浮点型输入 double d = 0; cout << "请输入浮点型变量:" << endl; cin >> d; cout << d << endl; //字符型输入 char ch = 0; cout << "请输入字符型变量:" << endl; cin >> ch; cout << ch << endl; //字符串型输入 string str; cout << "请输入字符串型变量:" << endl; cin >> str; cout << str << endl; //布尔类型输入 bool flag = true; cout << "请输入布尔型变量:" << endl; cin >> flag; cout << flag << endl; system("pause"); return EXIT_SUCCESS;} if语句12345678910111213141516171819202122int main() { //选择结构-单行if语句 //输入一个分数,如果分数大于600分,视为考上一本大学,并在屏幕上打印 int score = 0; cout << "请输入一个分数:" << endl; cin >> score; cout << "您输入的分数为: " << score << endl; //if语句 //注意事项,在if判断语句后面,不要加分号 if (score > 600) { cout << "我考上了一本大学!!!" << endl; } system("pause"); return 0;} 123456789101112131415161718192021int main() { int score = 0; cout << "请输入考试分数:" << endl; cin >> score; if (score > 600) { cout << "我考上了一本大学" << endl; } else { cout << "我未考上一本大学" << endl; } system("pause"); return 0;} 1234567891011121314151617181920212223242526272829 int main() { int score = 0; cout << "请输入考试分数:" << endl; cin >> score; if (score > 600) { cout << "我考上了一本大学" << endl; } else if (score > 500) { cout << "我考上了二本大学" << endl; } else if (score > 400) { cout << "我考上了三本大学" << endl; } else { cout << "我未考上本科" << endl; } system("pause"); return 0;} switch语句12345678910111213141516171819202122232425262728293031323334int main() { //请给电影评分 //10 ~ 9 经典 // 8 ~ 7 非常好 // 6 ~ 5 一般 // 5分以下 烂片 int score = 0; cout << "请给电影打分" << endl; cin >> score; switch (score) { case 10: case 9: cout << "经典" << endl; break; case 8: cout << "非常好" << endl; break; case 7: case 6: cout << "一般" << endl; break; default: cout << "烂片" << endl; break; } system("pause"); return 0;} while循环语句12345678910111213int main() { int num = 0; while (num < 10) { cout << "num = " << num << endl; num++; } system("pause"); return 0;} do…while123456789101112131415int main() { int num = 0; do { cout << num << endl; num++; } while (num < 10); system("pause"); return 0;} for1234567891011int main() { for (int i = 0; i < 10; i++) { cout << i << endl; } system("pause"); return 0;} break12345678910111213141516171819int main() { //在嵌套循环语句中使用break,退出内层循环 for (int i = 0; i < 10; i++) { for (int j = 0; j < 10; j++) { if (j == 5) { break; } cout << "*" << " "; } cout << endl; } system("pause"); return 0;} continue123456789101112131415int main() { for (int i = 0; i < 100; i++) { if (i % 2 == 0) { continue; } cout << i << endl; } system("pause"); return 0;} goto123456789101112131415161718int main() { cout << "1" << endl; goto FLAG; cout << "2" << endl; cout << "3" << endl; cout << "4" << endl; FLAG: cout << "5" << endl; system("pause"); return 0;} 一维数组123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051int main() { //定义方式1 //数据类型 数组名[元素个数]; int score[10]; //利用下标赋值 score[0] = 100; score[1] = 99; score[2] = 85; //利用下标输出 cout << score[0] << endl; cout << score[1] << endl; cout << score[2] << endl; //第二种定义方式 //数据类型 数组名[元素个数] = {值1,值2 ,值3 ...}; //如果{}内不足10个数据,剩余数据用0补全 int score2[10] = { 100, 90,80,70,60,50,40,30,20,10 }; //逐个输出 //cout << score2[0] << endl; //cout << score2[1] << endl; //一个一个输出太麻烦,因此可以利用循环进行输出 for (int i = 0; i < 10; i++) { cout << score2[i] << endl; } //定义方式3 //数据类型 数组名[] = {值1,值2 ,值3 ...}; int score3[] = { 100,90,80,70,60,50,40,30,20,10 }; for (int i = 0; i < 10; i++) { cout << score3[i] << endl; } //数组名用途 int arr[10] = { 1,2,3,4,5,6,7,8,9,10 }; cout << "整个数组所占内存空间为: " << sizeof(arr) << endl; cout << "每个元素所占内存空间为: " << sizeof(arr[0]) << endl; cout << "数组的元素个数为: " << sizeof(arr) / sizeof(arr[0]) << endl; system("pause"); return 0;} 函数12345678910111213141516171819202122232425//函数定义int add(int num1, int num2) //定义中的num1,num2称为形式参数,简称形参{ int sum = num1 + num2; return sum;}int main() { int a = 10; int b = 10; //调用add函数 int sum = add(a, b);//调用时的a,b称为实际参数,简称实参 cout << "sum = " << sum << endl; a = 100; b = 100; sum = add(a, b); cout << "sum = " << sum << endl; system("pause"); return 0;} 值传递12345678910111213141516171819202122232425262728293031void swap(int num1, int num2){ cout << "交换前:" << endl; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; int temp = num1; num1 = num2; num2 = temp; cout << "交换后:" << endl; cout << "num1 = " << num1 << endl; cout << "num2 = " << num2 << endl; //return ; 当函数声明时候,不需要返回值,可以不写return}int main() { int a = 10; int b = 20; swap(a, b); cout << "mian中的 a = " << a << endl; cout << "mian中的 b = " << b << endl; system("pause"); return 0;} 函数的声明告诉编译器函数名称及如何调用函数。函数的实际主体可以单独定义。 函数的声明可以多次,但是函数的定义只能有一次 123456789101112131415161718192021//声明可以多次,定义只能一次//声明int max(int a, int b);int max(int a, int b);//定义int max(int a, int b){ return a > b ? a : b;}int main() { int a = 100; int b = 200; cout << max(a, b) << endl; system("pause"); return 0;} 函数的分文件编写函数分文件编写一般有4个步骤 创建后缀名为.h的头文件 创建后缀名为.cpp的源文件 在头文件中写函数的声明 在源文件中写函数的定义 123456//swap.h文件#include<iostream>using namespace std;//实现两个数字交换的函数声明void swap(int a, int b); 123456789101112//swap.cpp文件#include "swap.h"void swap(int a, int b){ int temp = a; a = b; b = temp; cout << "a = " << a << endl; cout << "b = " << b << endl;} 123456789101112//main函数文件#include "swap.h"int main() { int a = 100; int b = 200; swap(a, b); system("pause"); return 0;} 指针变量的定义和使用123456789101112131415161718192021int main() { //1、指针的定义 int a = 10; //定义整型变量a //指针定义语法: 数据类型 * 变量名 ; int * p; //指针变量赋值 p = &a; //指针指向变量a的地址 cout << &a << endl; //打印数据a的地址 cout << p << endl; //打印指针变量p //2、指针的使用 //通过*操作指针变量指向的内存 cout << "*p = " << *p << endl; system("pause"); return 0;} 指针变量和普通变量的区别 普通变量存放的是数据,指针变量存放的是地址 指针变量可以通过” * “操作符,操作指针变量指向的内存空间,这个过程称为解引用 总结1: 我们可以通过 & 符号 获取变量的地址 总结2:利用指针可以记录地址 总结3:对指针变量解引用,可以操作指针指向的内存 指针所占内存空间1234567891011121314151617int main() { int a = 10; int * p; p = &a; //指针指向数据a的地址 cout << *p << endl; //* 解引用 cout << sizeof(p) << endl; cout << sizeof(char *) << endl; cout << sizeof(float *) << endl; cout << sizeof(double *) << endl; system("pause"); return 0;} 总结:所有指针类型在32位操作系统下是4个字节 空指针和野指针空指针:指针变量指向内存中编号为0的空间 **用途:**初始化指针变量 **注意:**空指针指向的内存是不可以访问的 示例1:空指针 12345678910111213int main() { //指针变量p指向内存地址编号为0的空间 int * p = NULL; //访问空指针报错 //内存编号0 ~255为系统占用内存,不允许用户访问 cout << *p << endl; system("pause"); return 0;} 示例2:野指针 123456789101112int main() { //指针变量p指向内存地址编号为0x1100的空间 int * p = (int *)0x1100; //访问野指针报错 cout << *p << endl; system("pause"); return 0;} 总结:空指针和野指针都不是我们申请的空间,因此不要访问。 const修饰指针const修饰指针有三种情况 const修饰指针 — 常量指针 const修饰常量 — 指针常量 const即修饰指针,又修饰常量 示例: 123456789101112131415161718192021222324int main() { int a = 10; int b = 10; //const修饰的是指针,指针指向可以改,指针指向的值不可以更改 const int * p1 = &a; p1 = &b; //正确 //*p1 = 100; 报错 //const修饰的是常量,指针指向不可以改,指针指向的值可以更改 int * const p2 = &a; //p2 = &b; //错误 *p2 = 100; //正确 //const既修饰指针又修饰常量 const int * const p3 = &a; //p3 = &b; //错误 //*p3 = 100; //错误 system("pause"); return 0;} 技巧:看const右侧紧跟着的是指针还是常量, 是指针就是常量指针,是常量就是指针常量 指针和数组**作用:**利用指针访问数组中元素 示例: 1234567891011121314151617181920int main() { int arr[] = { 1,2,3,4,5,6,7,8,9,10 }; int * p = arr; //指向数组的指针 cout << "第一个元素: " << arr[0] << endl; cout << "指针访问第一个元素: " << *p << endl; for (int i = 0; i < 10; i++) { //利用指针遍历数组 cout << *p << endl; p++; } system("pause"); return 0;} 指针和函数**作用:**利用指针作函数参数,可以修改实参的值 示例: 12345678910111213141516171819202122232425262728293031//值传递void swap1(int a ,int b){ int temp = a; a = b; b = temp;}//地址传递void swap2(int * p1, int *p2){ int temp = *p1; *p1 = *p2; *p2 = temp;}int main() { int a = 10; int b = 20; swap1(a, b); // 值传递不会改变实参 swap2(&a, &b); //地址传递会改变实参 cout << "a = " << a << endl; cout << "b = " << b << endl; system("pause"); return 0;} 总结:如果不想修改实参,就用值传递,如果想修改实参,就用地址传递 结构体定义和使用语法:struct 结构体名 { 结构体成员列表 }; 通过结构体创建变量的方式有三种: struct 结构体名 变量名 struct 结构体名 变量名 = { 成员1值 , 成员2值…} 定义结构体时顺便创建变量 示例: 1234567891011121314151617181920212223242526272829303132333435//结构体定义struct student{ //成员列表 string name; //姓名 int age; //年龄 int score; //分数}stu3; //结构体变量创建方式3int main() { //结构体变量创建方式1 struct student stu1; //struct 关键字可以省略 stu1.name = "张三"; stu1.age = 18; stu1.score = 100; cout << "姓名:" << stu1.name << " 年龄:" << stu1.age << " 分数:" << stu1.score << endl; //结构体变量创建方式2 struct student stu2 = { "李四",19,60 }; cout << "姓名:" << stu2.name << " 年龄:" << stu2.age << " 分数:" << stu2.score << endl; stu3.name = "王五"; stu3.age = 18; stu3.score = 80; cout << "姓名:" << stu3.name << " 年龄:" << stu3.age << " 分数:" << stu3.score << endl; system("pause"); return 0;} 总结1:定义结构体时的关键字是struct,不可省略 总结2:创建结构体变量时,关键字struct可以省略 总结3:结构体变量利用操作符 ‘’.’’ 访问成员 结构体指针**作用:**通过指针访问结构体中的成员 利用操作符 >可以通过结构体指针访问结构体属性 示例: 1234567891011121314151617181920212223//结构体定义struct student{ //成员列表 string name; //姓名 int age; //年龄 int score; //分数};int main() { struct student stu = { "张三",18,100, }; struct student * p = &stu; p->score = 80; //指针通过 -> 操作符可以访问成员 cout << "姓名:" << p->name << " 年龄:" << p->age << " 分数:" << p->score << endl; system("pause"); return 0;} 总结:结构体指针可以通过 -> 操作符 来访问结构体中的成员 选择创建新项目–>空项目 函数 如果不体现生命,main方法 在函数的前面就会报错 有了函数的声明,main方法,可以写在函数的前面 函数的民生,可以写很多次,但是实现(定义)只能写一次 123456789101112131415161718192021222324#include <iostream>using namespace std;// 提前告诉编译器// 函数的民生,可以写很多次,但是实现(定义)只能写一次int max(int num1, int num2);int max(int num1, int num2);int max(int num1, int num2);int main(){ int sum = max(1, 2); cout << "计算器的结果:" << sum << endl; system("pause"); return 0;}int max(int num1, int num2) { int sum = num1 + num2; return sum;} 常量指针 特点:指针的指向可以改,指针指向的值不可以改 123const int * p = &a;*0 = 20 错误p = &b 对的 指针常量 特点:指针的指向不可以改,指针指向的值可以改 123int * const p = &a;*0 = 20 对的p = &b 错误 const 同时修饰指针和常量 123const int * const p = &a;*0 = 20 错的p = &b 错误 例子: 12345678910111213141516171819202122232425262728293031323334#include <iostream>using namespace std;int main(){ int a = 10; int b = 20; int* p = &a; cout << "第一个测试指针a地址:"<<p << "===" << *p << endl; int* p111 = &b; cout << "第一个测试指针b地址:"<< p111 << "===" << *p111 << endl; // const 修饰指针 const int* p1 = &a; // *p=20 错误 cout << "第二个测试指针地址:" << p1 << "===" << *p1 << endl; p1 = &b; cout << "第二个测试指针地址:" << p1 << "===" << *p1 << endl; // const 修饰常量 int* const p2 = &a; cout << "第三个测试指针地址:" << p2 << "===" << *p2 << endl; *p2=30; // p = &b; 错误 cout << "第三个测试指针地址:" << p2 << "===" << *p2 << endl; // const 修饰指针和常量 const int* const p3 = &a; system("pause"); return 0;}
相关推荐
cover
2022-11-19
AWS
AWS基本教程场景是:在把22端口关闭了,无法再连上服务器的情况 解决办法:关闭服务器,点击操作->实例设置->编辑用户数据 1234567#!/bin/bash# 允许 SSH 端口iptables -P INPUT ACCEPTiptables -P OUTPUT ACCEPTiptables -P FORWARD ACCEPTiptables -Fiptables -A INPUT -p tcp --dport 22 -j ACCEPT 再启动服务器 AWS升级配置1.先停止实例,不是终止实例 2.修改实例类型 重启公网IP可能会改变 服务器局域网互通需要把局域网 想要互通的服务器,加入一个公共的的默认安全组 选择default安全组 要看服务器部署在哪里 JavaSDK上传图片到S3123456789101112131415161718192021222324252627282930313233343536@RestController@Slf4j@Api(tags = "上传接口")public class UploadController { @Value("${S3.accessKey}") String accessKey; @Value("${S3.secretKey}") String secretKey; @Value("${S3.endPoint}") String endPoint; @Value("${S3.bucketName}") String bucketName; @PostMapping("/upload") @ApiOperation("上传") @NotNeedAuth public Response<String> upload(@RequestParam("file") MultipartFile file) { String originalFilename = file.getOriginalFilename(); if (!Constant.PHOTO_LIST.contains(originalFilename.substring(originalFilename.lastIndexOf(".") + 1))) { return Response.fail(CodeConstant.CODE_095); } String newImageName = ThreadLocalRandom.current().nextInt(10000) + System.currentTimeMillis() + originalFilename.substring(originalFilename.lastIndexOf(".")).toLowerCase(); String fileName = "lxdt/dt/" + Constant.DIRECTORY_TIME_FORMAT.format(LocalDateTime.now(Constant.TIME_ZONE)) + newImageName; try { S3Util.uploadFileByFile(accessKey, secretKey, endPoint, bucketName, fileName, file); } catch (Exception e) { log.error("上传失败", e); return Response.error(""); } return Response.successData(fileName); }} 12345678910111213141516public class S3Util { /** * 图片上传 */ public static void uploadFileByFile(String accessKey, String secretKey, String endPoint, String bucketName, String folderName, MultipartFile file) throws IOException { ClientConfiguration clientConfig = new ClientConfiguration(); clientConfig.setProtocol(Protocol.HTTPS); AmazonS3 amazonS3 = AmazonS3Client.builder().withEndpointConfiguration(new AwsClientBuilder.EndpointConfiguration(endPoint, Region.getRegion(Regions.AP_SOUTHEAST_1).getName())) .withClientConfiguration(clientConfig).withCredentials(new AWSStaticCredentialsProvider(new BasicAWSCredentials(accessKey, secretKey))) .disableChunkedEncoding().withPathStyleAccessEnabled(true).withForceGlobalBucketAccessEnabled(true).enablePathStyleAccess().build(); ObjectMetadata objectMetadata = new ObjectMetadata(); objectMetadata.setContentType(file.getContentType()); objectMetadata.setContentLength(file.getSize()); amazonS3.putObject(new PutObjectRequest(bucketName, folderName, file.getInputStream(), objectMetadata).withCannedAcl(CannedAccessControlList.PublicRead)); }} S3桶策略公开访问桶策略 123456789101112{ "Version": "2012-10-17", "Statement": [ { "Sid": "PublicReadGetObject", "Effect": "Allow", "Principal": "*", "Action": "s3:GetObject", "Resource": "arn:aws:s3:::your-bucket-name/*" } ]} 印象中有遇到这种情况: ​ 第一次操作桶的时候,桶里面的文件是能正常共享出来的 ​ 很久之后没有操作了,再上传一个新文件,上传的这个文件就不能共享了 第二次出现这样情况的时候,我文件的url搞错了,是可以正常共享的 PicGO+S3创建存储桶红框里不要勾选 创建文件夹,设置公开 开启静态托管 新建IAM用户访问创建IAM页面 创建使用者 创建使用者详情 创建使用者权限,点击下一步,然后就能看到key和密钥了 PicGO配置PicGO软件许要下再S3插件,然后再配置文件里粘贴这个 1234567"aws-s3": { "accessKeyID": "AKIA2Q6ZSIPP7MKZOFHR", "secretAccessKey": "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", "bucketName": "mmzcg.com", "uploadPath": "blog/{year}/{fullName}", "acl": "public-read"} 参考S3教程 PicGoS3教程 CloudFront加速Vercel1.找到vercel自动分配的域名 2.aws 创建分配 3.选择源 不要选择源,输入vercel分配的域名 4.选择全部https,其它可以默认 5.选择证书 备用域名:比如vercel默认分配的是xxx.vercel.app你想加速的域名是 abc.blog,备用域名就填abc.blog 自定义SSL证书:用aws自带的证书申请工具 点击保存,回到CloudFront首页 6.cname 看上次修改时间这一列,如果显示的时间,就表示刚才的配置已经生效了,如果显示在部署中…就等一会 CloudFront这一列会分配一个域名,在域名解析那里Cname指向这个域名就可以了 AWS S3和Hexo1.安装插件 12# 装置npm install hexo-deployer-aws-s3 --save-dev 2.改_config.yml 12345678deploy:# - type: 'git'# repo: [email protected]:aaaaaaanthony/aaaaaaanthony.github.io.git# branch: master type: 'aws-s3' # 写死 region: ap-east-1 # 区域名 bucket: mmzcg.com # 桶名 如果要部署多个地方,每个仓库的type前面要加一个- 如果只有一个,就只用type开头就行 3.执行环境变量 123export AWS_ACCESS_KEY_ID=AKIA2Q6ZSIPP7MKZOFHRexport AWS_SECRET_ACCESS_KEY=ZifJfUmVVGMq37hd8Itozp4fws5O97dVlwgMgtCYsource /etc/profile 4.部署 1234hexo cleanhexo algolihexo d -g 发现报错,The bucket does not allow ACLs,还需要在存储中开启 ACLs 接下来要关闭「阻止共有访问操作」 部署成功后,开启静态网站托管功能 RDS创建RDS选择mysql社区版本 AWS的RDS开启慢查询日志到cloudwatch中 快照导出到S3 参考文档 接下来的页面是需要的设置 导出标识符,就是导出任务的名字 导出的数据,这里测试就简单点,导出全部表,要是选部分表,文档里有导出规则 S3 目标, 选一个存储桶 接下来的两个是难点,IAM角色,和加密 先看加密,先创建ARN,找到配置的选项卡 点击下面的链接 在客户管理的秘钥,创建一个秘钥, 客户管理的密钥和AWS托管的密钥是有区别的,要选对 创建完之后,再回到 密钥列表的页面,点密钥ID,进入到详情页 复制ARN刚刚才导出的页面,角色权限什么的,各种尝试下就可以了 front清空缓存API12345678910111213141516171819202122232425262728293031323334353637383940414243444546474849import boto3import datetimedef create_invalidation(distribution_id, paths): # 创建一个CloudFront客户端并提供凭证 client = boto3.client('cloudfront',aws_access_key_id='AKIA2UC26S7767GSGKJQ',aws_secret_access_key='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') # 创建一个唯一的无效请求ID caller_reference = str(datetime.datetime.now()) # 格式化路径 items = paths if isinstance(paths, list) else [paths] # 构建无效请求 invalidation_batch = { 'Paths': { 'Quantity': len(items), 'Items': items }, 'CallerReference': caller_reference } # 创建无效请求 response = client.create_invalidation( DistributionId=distribution_id, InvalidationBatch=invalidation_batch ) return response# distribution_id 列表,包含ID、说明和类型distribution_info = [ ["EX123AFBG", "生产环境", "生产", "baidu.com"],]# 要使失效的路径paths_to_invalidate = ['/*']# 循环遍历每个distribution_idfor info in distribution_info: distribution_id = info[0] print(f"Creating invalidation for Distribution ID: {distribution_id}, Description: {info[1]}, Type: {info[2]}") response = create_invalidation(distribution_id, paths_to_invalidate) print(response) print("================")print("刷新完成")

评论
avatar
Anthony
anthony的技术博客,记录开发,运维的笔记
文章
64
标签
80
分类
27
目录
  1. 1. 服务器硬盘扩容
  2. 2. 阿里云OSS+AWS Cloudfront
最新文章
Dapp
Dapp2025-05-29
Draw.io
Draw.io2025-05-23
好用的软件
好用的软件2025-05-23
Mac Apple芯片安装Win11
Mac Apple芯片安装Win112025-05-06
ESM
ESM2025-05-05
©2016 - 2025 By Anthony
框架 Hexo 7.3.0|主题 Butterfly 5.3.5