Mybatis_plus使用过程中NoSuchBeanDefinitionException,大概率是因为不能扫描到mapper文件

IDEA报错: Caused by: org.springframework.beans.factory.UnsatisfiedDependencyException: Error creating bean with name ‘xxxxImpl’: Unsatisfied dependency expressed through field ‘baseMapper’; nested exception is org.springframework.beans.factory.NoSuchBeanDefinitionException: No qualifying bean of type ‘com.smile.cms.mapper.xxxxMapper’ available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {@org.springframework.beans.factory.annotation.Autowired(required=true)} 报错原因分析: 因为不能扫描到mapper文件,需要在启动类上加@MapperScan @MapperScan(“mapper的路径”) 注解来指定需要扫描的mapper文件的路径 不然不能够找到 @SpringBootApplication @Api(description = "banner管理") @ComponentScan(basePackages = {"com.smile"}) //会扫描所有这个路径下的类,包含父类中的这个路径 @MapperScan("com.smile.cms.mapper") public class CmsApplication { public static void main(String[] args) { SpringApplication.run(CmsApplication.class,args); } }

java项目中导入excel数据,使用EasyExcel框架

导入excel数据EasyExcel简介 ​ EasyExcel是阿里巴巴开源的一个excel处理框架,以使用简单,节省内存著称,EasyExcel在解析Excel时没有讲文件数据一次加载到内存中,而是从磁盘上一行一行读取数据,逐个解析。EsayExcel采用一行一行的解析模式,并将一行的解析结果以观察者的模式通知处理(AlaysisEventListener) EasyExcel进行读写操作 EasyExcel进行写操作 引入依赖 <dependencies> <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>4.1.2</version> </dependency> </dependencies> 创建实体类和excel数据对应 @Data public class WriteExcel { //设置excel表头名称 @ExcelProperty("学生编号") private Integer sno; @ExcelProperty("学生姓名") private String name; } 3.写入数据 /** * @author jia * @date 2022/9/8 * @description easyExcel 往excel写入数据 */ public class WriteExcelDemo { public static void main(String[] args) { //实现excel写的操作 // 1.设置写入文件夹地址和excel名称 String fileName = "F:\\write.xlsx"; //2.调用easyExcel里面的方法实现写操作 参数 文件路径 实体类名称 EasyExcel.write(fileName, WriteExcel.

web项目设置统一返回格式教程

21. 统一返回数据格式(JSON规则) 项目中将响应封装成json返回,一般我们会将所有的接口数据格式统一,使前端对数据的操作更一致,返回的数据格式包含状态码、返回消息、数据这部分 列表 { "success": true, "code": 200, "message": "成功", "data": { "items": [ { "id": "1", "name": "刘德华", "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余" } ] } } 分页 { "success": true, "code": 20000, "message": "成功", "data": { "total": 17, "rows": [ { "id": "1", "name": "刘德华", "intro": "毕业于师范大学数学系,热爱教育事业,执教数学思维6年有余" } ] } } 没有返回数据 { "success": true, "code": 20000, "message": "成功", "data": {} } 失败 { "success": false, "code": 20001, "message": "

项目中统一日志处理

统一日志处理 默认情况下springboot从控制台打印出来的日志级别只有INFO及以上的, 可以进行配置 日志等级 OFF , FATAL , ERROR , WARN , INFO ,DEBUG, ALL #日志级别设置 仅在控制台输出 logging.level.root = WARN 23.1 统一日志处理(logback) 删除配置文件中的日志配置 #设置日志级别 仅在控制台输出 #logging.level.root = INFO #mybatis日志 #mybatis-plus.configuration.log-impl=org.apache.ibatis.logging.stdout.StdOutImpl 2.resources文件中创建logback-spring.xml <?xml version="1.0" encoding="UTF-8"?> <configuration scan="true" scanPeriod="10 seconds"> <!-- 日志级别从低到高分为TRACE < DEBUG < INFO < WARN < ERROR < FATAL,如果设置为WARN,则低于WARN的信息都不会输出 --> <!-- scan:当此属性设置为true时,配置文件如果发生改变,将会被重新加载,默认值为true --> <!-- scanPeriod:设置监测配置文件是否有修改的时间间隔,如果没有给出时间单位,默认单位是毫秒。当scan为true时,此属性生效。默认的时间间隔为1分钟。 --> <!-- debug:当此属性设置为true时,将打印出logback内部日志信息,实时查看logback运行状态。默认值为false。 --> <contextName>logback</contextName> <!-- name的值是变量的名称,value的值时变量定义的值。通过定义的值会被插入到logger上下文中。定义变量后,可以使“${}”来使用变量。 --> <property name="log.path" value="D:/gulicollege/edu" /> <!-- 彩色日志 --> <!

信息打点-CDN绕过

目录 知识点 1、CDN知识-工作原理及阻碍 2、 CDN配置-域名&区域&类型 3、前置知识 4、CDN绕过-十种方法 5、CDN绑定HOSTS 案例演示 案例1-利用网站漏洞: 案例2-子域名 案例3-接口国外访问 案例4-邮件服务查询 案例5-FuckCDN 总结: 知识点 1、CDN知识-工作原理及阻碍 CDN:CDN是内容分发网络,使用户就近获取所需内容,降低网络堵塞,提高用户访问响应速度和命中率,CDN的关键技术是内容存储和分发技术。 通俗理解CDN:简单来说可以理解为A与C相隔很远,A访问C时速度肯定会较慢,那么如果在A和C中间添加一个B,而在B里面存在C信息的缓存,那么A只要访问距离自己B就可以较快的访问到C的数据。 CDN阻碍:在进行渗透测试时有可能测试的只是一个cdn节点服务器,无法获取真实服务器的数据。 2、 CDN配置-域名&区域&类型 加速域名:当某IP地址下的某个域名被加速,那么当用户访问时该域名时,它就是被加速访问的,存在cdn缓存中。 业务类型:服务器中被加速的资源。三种加速类型:页面加速、大文件下载加速,视频点播加速。也可以进行全站加速。 加速区域:指定特定的区域进行加速,加速效果只在区域内有效。 3、前置知识 1.传统访问:用户访问域名–>解析服务器IP–>访问目标主机 2.普通CDN:用户访问域名–>CDN节点–>真实服务器IP–>访问目标主机 3.带WAF的CDN:用户访问域名–>CDN节点(WAF)–>真实服务器IP–>访问目标主机 4、CDN绕过-十种方法 1、子域名:某些企业业务线较多,有些站点的主站或者部分域名使用了CDN加速,但是一些子域名并未使用加速服务,那么就可以通过子域名获取目标的真实IP。 2、利用网站漏洞:利用网站的漏洞让目标服务器去访问我们自己设置的资源,因为是目标主动出来访问,所以很大概率获取的是真实IP。 3、历史DNS记录:在目标域名还没有使用DNS的时候,有可能通过历史记录会查询到真实IP。 4、CDN本身入手:得到控制面板的账号密码,从而获取IP就容易许多。 5、邮件服务查询:站点一般都存在发送邮件的功能,一般邮件都是在内部,也有经过CDN解析,可能在邮件的源码里就包含服务器的真实IP。 6、国外请求:如果域名配置DNS加速区域时,没有配置国外或存在没配置的区域,那么可以在国外或者没配置的区域里访问域名,这样不会受到CDN加速服务的干扰同时可以访问到真实的IP。 7、探测扫描:利用fuckcdn工具 8、需要找 xiaix.me 网站的真实 IP,我们首先从 apnic 获取 IP 段,然后使用 Zmap 的 banner-grab 扫描出来 80 端口开放的主机进行 banner 抓取,最后在 http-req 中的 Host 写 xiaix.me。 9、网络空间引擎搜索法:常见的有以前的钟馗之眼,shodan,fofa。以fofa为例,只需输入:title:“网站的title关键字”或者body:“网站的body特征”就可以找出fofa收录的有这些关键字的ip域名,很多时候能获取网站的真实ip。 10、访问phpinfo.php:当服务器存在某种漏洞时,例如:文件上传,XSS等,可以利用漏洞去访问phpinfo.php文件,在下面会发现IP地址。通过百度查看IP地址是否是本地局域网,如果是区域网则证明目标有多个网卡获取的是内网IP,如果不是则成功发现真实IP。因为是通过内部文件发现的IP,所以属于反向链接。(该方法适用于没有内网网卡的服务器) 5、CDN绑定HOSTS 绑定之后在对页面进行安全测试就能预防CDN,这样就可以正常进行渗透测试 Windows:C:\Windows\System32\drivers\etc\hosts Linux: /etc/hosts 案例演示 案例1-利用网站漏洞: 该方法利用的网站的ssrf漏洞,利用服务器存在的ssrf漏洞去访问我们设置好的资源,因为是服务器内部向外部访问,所以获取IP为真实IP。 SSRF漏洞简单介绍:ssrf(服务器端请求伪造)是一种由攻击者构造形成由服务端发起请求的一个安全漏洞。攻击目标通常是从外网无妨访问到内部系统的服务器。正是因为是由服务器发起的,所以它能够请求到与它相连而与外网隔离的内部系统。ssrf漏洞可以利用服务器去加载网上的图片,那么该案例就可以利用ssrf漏洞去访问我们自己的服务器。

Swagger使用导入配置

Swagger 了解Swagger的概念及作用 了解前后端分离 在springboot中集成swagger Restful Api 文档在线自动生成器 => API 文档 与API 定义同步更新 直接运行,在线测试API 支持多种语言 (如:Java,PHP等) 官网:https://swagger.io/ SpringBoot集成Swagger SpringBoot集成Swagger => springfox,两个jar包 Springfox-swagger2springfox-swagger-ui 1 SpringBoot集成Swagger 新建一个SpringBoot + Web项目 导入相关依赖 <!--swagger 相关依赖--> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> <version>3.0.0</version> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-boot-starter</artifactId> <version>3.0.0</version> </dependency> 编写一个工程 配置Swagger==》config @Configuration @EnableOpenApi //开启swagger2 public class SwaggerConfig { } 测试运行 地址:Swagger UI 配置Swagger Swagger的bean实例Docket; //配置Swagger的Docket的bean实例 //enable(false)是否启动Swagger,如果为false,则不能在浏览器中访问 @Bean public Docket docket(){ return new Docket(DocumentationType.SWAGGER_2).apiInfo(apiInfo()).enable(true) .select() //RequestHandlerSelectors,配置要扫描接口的方式 //basePackage:指定要扫描的包 //any():扫描全部包 //none 都不扫描 //withClassAnnotation:扫描类上的方法 //withMethodAnnotation:扫描方法上的注解 .

Maven项目中如何导入外部包(IDEA)

1.方式一 导入包到IDEA 1.点击右边Maven 2.点击Execute maven Goal 3.输入下面内容 mvn install:install-file -Dfile=E:\Maven\gulicollege\lib\mybatis-plus-boot-starter-3.0.5.jar //存放jar包路径 -DgroupId=baomidou //可自定义 最后在maven仓库中生成的文件夹 -DartifactId=mybatis-plus //可自定义 -Dversion=3.0.5 //依赖的版本 -Dpackaging=jar //依赖的类型 4.在maven中输入dependency 2.方式一详解 jar包引入到项目中使用 先从官网下载需要的jar包 检查设备上maven环境变了是否配置 再使用maven命令进入下载的包的lib目录下 安装下载的包 mvn install:install-file -DgroupId=aom.aliyun -DartifactId=aliyun-sdk-vod-upload //生成的maven仓库中的文件路径 -Dversion=1.4.11 //依赖包版本 -Dpackaging=jar //依赖的类型 -Dfile=aliyun-java-vod-upload-1.4.14.jar ====================================== mvn install:install-file -DgroupId=com.aliyun -DartifactId=aliyun-sdk-vod-upload -Dversion=1.4.14 -Dpackaging=jar -Dfile=F:\EdgeDownloads\VODUploadDemo-java-1.4.14\VODUploadDemo-java-1.4.14\lib\aliyun-java-vod-upload-1.4.14.jar 方式二 引入Jar包。 如果您在Eclipse环境集成:在Eclipse中右击您的工程,选择****Properties** > *Java Build Path* > *Add JARs*。找到解压后的VODUploadDemo-java-1.4.14文件,并将lib目录下的所有jar**文件添加到您的项目中。如果您在IntelliJ IDEA集成:在IntelliJ IDEA中打开您的工程,选择****File** > *Project Structure* > *Modules*,单击右侧Dependencies**,然后单击**+,再单击JARs or directories**。找到解压后的VODUploadDemo-java-1.4.14文件,并将lib目录下的所有jar文件添加到您的项目中

C Sharp编写缓和曲线计算应用程序

上期分享了编写C Sharp圆曲线的应用程序,那么缓和曲线计算也是必不可缺的。 与圆曲线计算一样,缓和曲线的计算依然是定义参数,计算,检核,输出;但是需要注意缓和曲线有特殊点:HY and YH两点。 计算公式: Thyx = Xzh + (Hd - Hd * Hd * Hd / (40 * R * R)); Thyy = Yzh + (Hd * Hd) / (6 * R) - (Hd * Hd * Hd) / (336 * R * R * R); 依旧需要角度和弧度的相互转换(上期已经给出代码结构,这里就不作赘述。) Console.WriteLine("请输入缓和曲线长:"); double Hd = double.Parse(Console.ReadLine()); 此处定义的double HD就是我们计算中的L0。 多出的参数m,p,wet的计算公式这里也已给出。 桩位的任一点 ZH的x坐标: ZH的y坐标: 下面是主程序: namespace 缓和曲线计算 { class Program { public struct AtH1 { public double AtH2(double ang) { int fuhao = (int)(ang / Math.

765. 情侣牵手

目录标题 题目从题目获取信息错开的解释规律抽象结构题解 题目 n 对情侣坐在连续排列的 2n 个座位上,想要牵到对方的手。 人和座位由一个整数数组 row 表示,其中 row[i] 是坐在第 i 个座位上的人的 ID。情侣们按顺序编号,第一对是 (0, 1),第二对是 (2, 3),以此类推,最后一对是 (2n-2, 2n-1)。 返回 最少交换座位的次数,以便每对情侣可以并肩坐在一起。 每次交换可选择任意两人,让他们站起来交换座位。 示例 1: 输入: row = [0,2,1,3] 输出: 1 解释: 只需要交换row[1]和row[2]的位置即可。 示例 2: 输入: row = [3,2,0,1] 输出: 0 解释: 无需交换座位,所有的情侣都已经可以手牵手了。 提示: 2n == row.length2 <= n <= 30n 是偶数0 <= row[i] < 2nrow 中所有元素均无重复 从题目获取信息 (1) 要判断一对情侣是否牵手有两个条件 位置是 (2n-2, 2n-1)人的序号也是 (2n-2, 2n-1) 就是说位置在 (2n-2, 2n-1)上的两个人,ta们的序号也要在满足 (2n-2, 2n-1)

【Qt】自定义标题栏添加最小化、最大化(还原)和关闭按钮

创建界面时系统会自带一个标题栏,如果我们需要设计一个好看的界面,这个标题栏就会显得很突兀,所以我们需要自定义标题栏,隐藏原来的标题栏。 自定义标题栏,这些图标我们都可以自己设置,位置可以调整 具体步骤如下: 1.隐藏系统自带的标题栏 this->setWindowFlags(Qt::FramelessWindowHint);//隐藏边框 去掉标题栏会存在几个问题: ①界面会因为失去边框丢失调整大小的能力 ②去除边框后,界面内容将无法移动 ③原本自带的最小化、最大化、关闭按钮随着标题栏一起被隐藏了,所以接下来的步骤我们进行添加最小化、最大化、关闭按钮 2.创建最小化、最大化、关闭按钮 3.获取并设置按钮图标 4.设置按钮在界面的位置 5.设置提示信息,样式和信号槽 具体代码 //窗口标题栏设置 this->setWindowFlags(Qt::FramelessWindowHint);//隐藏边框 //构建最小化、最大化、关闭按钮 minButton = new QToolButton(this); closeButton= new QToolButton(this); maxButton= new QToolButton(this); //获取最小化、关闭按钮图标 QPixmap minPix = style()->standardPixmap(QStyle::SP_TitleBarMinButton); QPixmap closePix = style()->standardPixmap(QStyle::SP_TitleBarCloseButton); maxPix = style()->standardPixmap(QStyle::SP_TitleBarMaxButton);//最大化需要在事件中进行判断更换图标所以设置成数据成员 //设置最小化、关闭按钮图标 minButton->setIcon(minPix); closeButton->setIcon(closePix); maxButton->setIcon(maxPix); //设置最小化、关闭按钮在界面的位置 int wide = width();//获取界面的宽度 minButton->setGeometry(wide-65,5,20,20); closeButton->setGeometry(wide-25,5,20,20); maxButton->setGeometry(wide-45,5,20,20); //设置鼠标移至按钮上的提示信息 minButton->setToolTip(tr("最小化")); closeButton->setToolTip(tr("关闭")); maxButton->setToolTip(tr("最大化")); //设置最小化、关闭按钮的样式 minButton->setStyleSheet("background-color:transparent;"); closeButton->setStyleSheet("background-color:transparent;"); maxButton->setStyleSheet("background-color:transparent;"); //每个按钮对应的信号槽 connect(closeButton, SIGNAL(clicked()), this, SLOT(windowclosed())); connect(minButton, SIGNAL(clicked()), this, SLOT(windowmin())); connect(maxButton, SIGNAL(clicked()), this, SLOT(winmax())); 槽函数

CNN经典网络模型(三):VGGNet简介及代码实现(PyTorch超详细注释版)

目录 一、开发背景 二、网络结构 三、模型特点 四、代码实现 1. model.py 2. train.py 3. predict.py 4. spilit_data.py 五、参考内容 一、开发背景 VGGNet在2014年由牛津大学计算机视觉组VGG (Visual Geometry Group) 提出,斩获该年ImageNet竞赛中Localization Task (定位任务) 第一名和Classification Task(分类任务)第二名(第一名是GoogLeNet)。 VGGNet探索了卷积神经网络的深度与其性能之间的关系,成功地构筑了16~19层深的卷积神经网络,证明了增加网络的深度能够在一定程度上影响网络最终的性能,使错误率大幅下降,同时拓展性又很强,迁移到其它图片数据上的泛化性也非常好。到目前为止,VGG仍然被用来提取图像特征。 二、网络结构 VGGNet可以看成是加深版的AlexNet,把网络分成了5段,每段都把多个尺寸为3×3的卷积核串联在一起,每段卷积接一个尺寸2×2的最大池化层,最后面接3个全连接层和一个softmax层,所有隐层的激活单元都采用ReLU函数。 VGGNet包含很多级别的网络,深度从11层到19层不等。为了解决初始化(权重初始化)等问题,VGG采用的是一种Pre-training的方式,先训练浅层的的简单网络VGG11,再复用VGG11的权重初始化VGG13,如此反复训练并初始化VGG19,能够使训练时收敛的速度更快。比较常用的是VGGNet-16和VGGNet-19。VGGNet-16的网络结构如下图所示: 结构详解:VGG详解 三、模型特点 使用多个小卷积核构成的卷积层代替较大的卷积层,两个3x3卷积核的堆叠相当于5x5卷积核的视野,三个3x3卷积核的堆叠相当于7x7卷积核的视野。一方面减少参数,另一方面拥有更多的非线性变换,增加了CNN对特征的学习能力;引入1*1的卷积核,在不影响输入输出维度的情况下,引入更多非线性变换,降低计算量,​​​​​同时,还可以用它来整合各通道的信息,并输出指定通道数;训练时,先训练级别简单(层数较浅)的VGGNet的A级网络,然后使用A网络的权重来初始化后面的复杂模型,加快训练的收敛速度;采用Multi-Scale方法来做数据增强,增加训练的数据量,防止模型过拟合;VGGNet不使用局部响应归一化(LRN),这种标准化并不能在ILSVRC数据集上提升性能,却导致更多的内存消耗和计算时间。 四、代码实现 model.py :定义VGGNet网络模型train.py:加载数据集并训练,计算loss和accuracy,保存训练好的网络参数predict.py:用自己的数据集进行分类测试spilit_data.py:划分给定的数据集为训练集和测试集 1. model.py import torch.nn as nn import torch # 定义VggNet网络模型 class VGG(nn.Module): # init():进行初始化,申明模型中各层的定义 # features:make_features(cfg: list)生成提取特征的网络结构 # num_classes:需要分类的类别个数 # init_weights:是否对网络进行权重初始化 def __init__(self, features, num_classes=1000, init_weights=False): # super:引入父类的初始化方法给子类进行初始化 super(VGG, self).__init__() # 生成提取特征的网络结构 self.features = features # 生成分类的网络结构 # Sequential:自定义顺序连接成模型,生成网络结构 self.

c# 合并两个实体以及把实体当作属性给另一个实体

为了生成新的json传输,需要把原有实体进行改造 #region 一个实体作为属性加入到另一个实体中 JObject obj1 = (JObject)JToken.FromObject(orgInfo); JObject obj2 = JObject.Parse(@"{ 'Data': " + obj1.ToString () + @", 'orgName4': '机构名称', 'orgCode4': '机构代码', 'orgAge4': 15, 'orgDoor4':false }"); strJson = obj2.ToString(); #endregion #region 合并两个实体,并列关系 JObject obj1 = (JObject)JToken.FromObject(orgInfo); JObject obj2 = JObject.Parse(@"{ 'DATA': orgInfo, 'orgName5': '机构名称', 'orgCode5': '机构代码', 'orgAge5': 15, 'orgDoor5':false }"); obj1.Merge(obj2, new JsonMergeSettings { // union array values together to avoid duplicates MergeArrayHandling = MergeArrayHandling.Union }); strJson = obj1.ToString(); #endregion

最新if,elseif,else最清楚用法解释

1.数量关系 ①if与else:两者一一对应,一个if只能配一个else,而且是与else最近的if匹配。 (if数量:else数量=1:1) ②elseif:你用想几个用几个,有需要可用可不用。(elseif数量≥0) ③else:根据需要可用可不用,用的话,一个if只能有一个else(else数量=0或1) 2.位置关系 if位置在最前面,else位置在最后面,所有的elseif位置在两者之间。 3.执行顺序 流程:先看if条件,再按顺序看elseif条件,最后看else 执行规则:按顺序只要看到谁条件成立了,就只执行它就可以了,后面都不用管了,都不成立才执行else。 ①if:if条件成立,执行if,后面不看了。不成立就往下看elseif ②elseif:只要某个elseif成立,就只执行这个elseif,后面的不用管了。 ③else:当所有的条件都不成立,就执行else. 总之:if,elseif,else,三者语句只执行一条,谁的语句先为真就执行哪条,后面的条件的语句就不用管了。

【Linux】Ubuntu20.04更换国内源

什么是源? 源是 Linux 系统中的一个文件,可以说是 Linux 的灵魂,一个 Linux 配置的源文件决定了 Linux 系统可以获取哪些资源,获取哪些文件,源文件损坏意味着 Linux 系统无法下载 / 更新等 为什么要换源? 我们使用的国外的系统,类似于Ubuntu这一类系统,默认集成的源是国外的源,下载和更新速度十分缓慢;由于速度慢,可能会导致下载错误,下载停止等问题,并且换成国内源下载速度直接起飞,所以换国内源是很有必要的 具体步骤: 1.备份源列表 sudo cp /etc/apt/sources.list /etc/apt/sources.list.bak 2.命令行打开sources.list文件 vim打不开的用vi sudo vim /etc/apt/sources.list 3.更换源 按i进入编辑模式 注释掉原来的源,复制以下任意一个源进行更换,粘贴命令为Ctrl+Shift+v 然后Esc退出编辑模式,:wq保存 更换的清华源 清华源 deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal main restricted deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates main restricted deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates universe deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-updates multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-backports main restricted universe multiverse deb http://mirrors.tuna.tsinghua.edu.cn/ubuntu/ focal-security main restricted deb http://mirrors.

学习神经网络:搭建一个vgg-11模型在FashionMNIST训练

VGG-11 的模型如下: 根据上图设计vgg_block: 代码如下: def vgg_block(num_convs,in_channels,out_channels): layers=[] #创建一个空列表 for _ in range(num_convs): layers.append(nn.Conv2d(in_channels,out_channels,kernel_size=3, padding=1)) #卷积层 layers.append(nn.ReLU()) #激活函数 in_channels=out_channels layers.append(nn.MaxPool2d(kernel_size=2,stride=2)) return nn.Sequential(*layers) args: 1.num_convs:vgg块中的卷积层数 2.in_channels:卷积层输入通道数 3.out_channesl:卷积层输出通道数(即:卷积层中卷积核的个数) 返回一个nn.Sequential 根据vgg_block 实现vgg网络搭建: 代码如下: def vgg (conv_arch): '''通过块嵌套块的形式搭建vgg网络''' vgg_blks=[] in_channels=1 for num_conv,out_channels in conv_arch: vgg_blks.append(vgg_block(num_conv,in_channels,out_channels)) in_channels=out_channels return nn.Sequential(*vgg_blks,#进入全连接层之前要展开tensor nn.Flatten(), nn.Linear(out_channels*7*7,4096),nn.ReLU(),nn.Dropout(0.5), nn.Linear(4096,4096),nn.ReLU(),nn.Dropout(0.5), nn.Linear(4096,10) ) args: conv_arch:整个vgg网络的vgg_block骨架,其中元素含有num_conv 和 out_channels 整体代码: '''自定义一个vgg块''' import torch import torchvision from torch import nn from torch.utils.data import DataLoader from torchvision import transforms def try_gpu(i=0): '''尽量使用gpu提速''' if torch.

网络:TCP与UDP

IP层之上就是传输层,而传输层比较重要的两个协议:TCP和UDP。对于不从事底层开发的人员来讲,或者对于应用开发的人来讲,最常用的就是这两个协议、 TCP和UDP有哪些区别 TCP是面向连接的,UPD是面向无连接的。 那什么叫做面向连接,什么叫做无连接呢? 在互通之间,面向连接的协议会先建立连接。比如,TCP会三次握手,而UDP不会 为什么要建立连接呢?你TCP三次握手,我UDP也可以发三个包玩玩,有什么区别吗? 所谓的建立连接,是为了在客户端和服务端维护连接,而建立一定的数据结构来维护双方交互的状态,用这样的数据结构来保证所谓的面向连接的特性 比如,TCP提供可靠交互。通过TCP连接传输的数据,无差错、不丢失、不重复,并且按序到达。 IP包是没有任何可靠性保证的,一旦发出去,就像西天取经,走丢了,被妖怪吃了,都只能随它去了。但是TCP却能够保证可靠交付,而UDP继承了IP包的特性,不保证不丢失,不保证按顺序到达再如,TCP是面向字节流的。发送的时候发的是一个流,没头没尾。IP包可不是一个流,而是一个个IP包。之所以变成了流,这也是TCP自己的状态维护做的事情。而UDP继承了IP的特性,基于数据报的,一个一个的发,一个一个的接收TCP是可以有拥塞控制的。它意识到包被丢弃了会在网络的环境不好了,就会根据情况调整自己的行为,看看是不是发块了,要不要发慢点。UDP就不会,应用让我发,我就发,管它洪水滔天因而TCP其实是一个有状态服务,也就是说它是有脑子的,里面精确的记着发送了没有,接收到了没有,发送到哪个那,应该接收哪个了,错一点而都不行,而UDP是无状态服务,发出去了就发出了,不会去记忆 我们可以这样比喻,果MAC层定义了本地局域网的传输行为,IP层定义了整个网络端到端的传输行为,这两层基本定义了这样的基因:网络传输是以包为单位的,二层叫做帧,网络层叫做包,传输层叫做段。我们笼统的称为包,包单独传输,自行选路,在不同的设备封装解封装,不保证到达。基于这个基因,生下来的UDP完全集成了这些特性,几乎没有自己的思想。 UDP UDP 当我发送的UDP包到达目标机器后,发现MAC地址匹配,于是就取下来,将剩下的包传给处理IP层的代码。把IP头取下来,发现目标IP匹配,接下来呢?这里面的数据报是发给谁呢? 发送的时候,我知道我发的是一个UDP的包,收到的那台机器是如何知道的呢?所以在IP头里面有个8位协议,这里会存放,数据里面到底是TCP还是UDP,当然这里是UDP。于是,如果我们知道UDP头的格式,就能从数据里面,将它解析出来。解析出来以后呢?数据给谁呢? 处理完传输层的事情,内核的事情基本就干完了,里面的数据应该交给应用程序自己去处理,可是一台机器上跑着那么多的应用程序,应该给谁呢?无论是应用程序写的使用TCP传输数据,还是UDP传输数据,都要监听一个端口。正是这个端口,要不说端口不能冲突呢。两个应用监听同一个端口,到时候包给谁呀?所以,按理说,无论是TCP还是UDP包头里面都应该有端口号,根据端口号,将数据交给响应的应用程序。 当我们看到UDP包头的时候,发现的确有端口号,有源端口号和目标端口号。因为是两端通信嘛。你还会发现,UDP除了端口号,再没有其他的了。和TCP比起来,这个简单的一塌糊涂啊 UDP的三大特点 UDP就像小孩子一样,有这些特点: 第一,沟通简单,不需要一肚子花花肠子(大量的数据结构、处理逻辑,包头字段)。前提是它相信网络世界是美好的,相信网络通路默认是很容易送达的,不容易被丢弃的第二,亲信他人。它不会建立连接,虽然有端口号,但是监听在这个地方,谁都可以传给它数据,他也可以传给任何人数据,甚至可以同时传给多个人数据第三,愣头青,做事不懂权变。不知道什么时候该坚持,什么时候该退让。它不会根据网络的情况进行包的拥塞控制,无论网络丢包丢城啥样了,它该怎么发还是怎么发 UDP的三大场景 基于UDP的这些特点,我们可以考虑在下面场景中使用: 第一,需要资源少,在网络情况比较好的内网,或者对于丢包不敏感的应用。 比如DHCP就是基于UDP协议的。一般的获取IP地址都是内网请求,而且一次获取不到IP有没事,过一会儿还有机会。PXE可以在启动的时候自动安装操作系统,操作系统镜像下载的时候使用的TFTP也是基于UDP协议的。在还没有操作系统的时候,客户端拥有的资源很少,不适合维护一个复杂的状态机,而且因为是内网,一般也没啥问题 第二,不需要一对一沟通,建立连接,而是可以广播的应用。 UDP这种不面向连接的功能,可以使得承载广播或者多播的协议。DHCP就是一种广播的形式对于多播,IP地址中有一个D类地址,也就是组播地址,使用这个地址,可以将包组播给一批机器。当一个机器上的某个进程想监听某个组播地址的时候,需要发送IGMP包,所在网络的路由器就能收到这个包,知道有关机器上有个进程在监听这个组播地址。当路由器收到这个组播地址的时候,会将包转发给这台机器,这就实现了跨路由器对的组播 第三,需要处理速度快,时延低,可以容忍少数丢包,但是要求即使网络拥塞,也毫不推送,一往无前的时候 UDP简单、处理速度快,不像TCP那样,操这么多的心:各种重传、保证顺序、前面的收不到后面就没法处理呢。不然等这些事情做完了,时延早就上去了。而TCP在网络不好出现丢包的时候,拥塞控制策略就会主动的退缩,降低发送速度。当前很多应用都是要求低时延的,它们可不想用TCP如此复杂的机制,而是想根据自己的场景,实现自己的可靠和连接保证。比如,如果应用自己觉得,有些包丢了就丢了,没必要重传;有的比较重要,则应用自己重传,而不依赖于TCP;前面的包没到,后面的先到了,那就先给客户展示后面吗,干嘛非得到齐呢;如果网络不好,丢了包,那不能推送啊,要尽快传啊,速度不能降下来嘛,要挤占带宽,抢在客户失去耐心之前到达。由于UDP十分简单,基本什么都没干,也就是给了应用“城会玩”的机会 基于UDP的“城会玩”的五个例子 网页或者ARP的访问 原来访问网页和手机ARP都是基于HTTP协议的。HTTP协议是基于TCP的,建立连接都需要多次交互,对于时延比较大的目前的驻留的移动互联网来讲,建立一次连接需要的时间会比较长,然而既然是移动中,TCP可能还会断了重连,也是很耗时的。而且目前的HTTP协议,往往采用多个数据通道共享一个连接的情况,这样本来为了加速传输速度,但是TCP的严格顺序策略使得哪怕共享通道,前一个不来,后一个和前一个即便没有关系,也要等着,时延也会加大。 而QUIC(即Quick UDP Internet Connections,快速UDP互联网连接)是google提出的一种基于UDP改进的通信协议,其目的是降低网络通信的延迟,提供更好的用户互动体验。 QUIC在应用层上,会自己实现快速连接建立,减少重传时延,自适应拥塞控制,是应用层城会玩的代表 流媒体的协议 现在直播比较火,直播协议多使用RTMP,而RTMP协议也是基于TCP的。TCP的严格顺序传输要保证前一个收到了,下一个才能确认,如果前一个收不到,下一个就算包已经收到了,在缓存里面,也需要等着。对于直播来讲,显然是不合适的,因为老的视频帧丢了其实也就是丢了,就算在传过来用户也不在意了,他们要看新的了,如果老是没来就等着,卡顿了,新的也看不了,那就回丢失客户,所以直播,实时性比较重要,宁可丢包,也不要卡顿的。 另外,对于丢包,其实对于视频播放来讲,有的包可以丢,有的包不能丢,因为视频的连续帧里面,有的帧重要,有的帧不重要,如果必须要丢包,隔几个帧丢一个,其实看视频的人不会感知,但是如果连续丢帧,就会感知了,因而在网络不好的情况下,应用希望选择性的丢帧。 还有就是当网络不好的时候,TCP协议会主动降低发送速度,这对本来当时就卡的看视频来讲是要命的,应该应用层会马上重传,而不是主动让不去。因而,很多直播应用,都基于UDP实现了自己的视频传输协议。 实时游戏 游戏有一个特点,就是实时性比较高,快一秒你干掉别人,慢一秒你被别人爆头。因而,实时游戏中客户端和服务端需要建立长连接,来保证实时传输。但是游戏玩家很多,服务器却不多。由于维护TCP连接需要在内核维护一些数据结构,因而一台机器能够支撑的TCP连接数目是有限的,然后UDP由于是没有连接的,在异步IP机制引入之前,尝尝是应对海量客户端连接的策略。 另外还是TCP的强顺序问题,对战的游戏,对网络的要求很简单,玩家通过客户端发送给服务器鼠标和键盘行走的位置,服务器会处理每个用户发送过来的所有场景,处理完再返回给客户端,客户端解析响应,渲染最新的场景展示给玩家。 如果出现一个数据报丢失,所有事情都需要等待这个数据包重发,客户端会出现等待接收数据报,然而玩家并不关心过期的数据,激战中卡1s,等能动了就已经死了 游戏对实时要求较为严格的情况下,采用自定义的可靠UDP协议,自定义重传策略,能够把丢包产生的延时降到最低,尽量减少网络问题对游戏性造成的影响。 IoT物联网 一方面,物联网领域终端资源少,很可能只是个内存非常小的嵌入式系统,而维护TCP协议代价太大;另一方面,物联网对实时性要求也很高,而TCP还因为上面那些原因导致时延大。物联网协议thread就是基于UDP协议的 移动通信网络 在4G网络里面,移动流量上网的数据面对的协议GTP-U是基于UDP的,因为移动互联网比较复杂,而GTP协议本身就包含复杂的手机上线下线的通信协议。如果基于TCP,TCP的机制就显得非常多余。 TCP TCP不像UDP,相信“网之初,性本善,不丢包,不乱序”。它天然认为网络环境是恶劣的,丢包、乱序、重传、拥塞都是常用的事,一言不合就可能送达不了,因而要从算法层面来保证可靠性 面试题:TCP和UDP的区别 一句话概括:TCP是面向连接的、UDP是无连接的。为此,它引出了极大不同: TCP是可靠的,UDP是不可靠的TCP是报文流、UDP是数据报TCP有网络拥塞控制算法,UDP是应用让它发它就发TCP有状态,UDP无状态

【Qt】GraphicsView框架结构类似GIF的开机动画实现

根据QT中的GraphicsView框架,我们可以做一些简单的开机动画,如碰撞动画,或者是gif动画; 实现的效果类似下面这张gif 其实是将gif转成一帧又一帧的图片,然后用定时器发出信号多次调用槽函数,把每一帧图片加载出来,类似gif; 话不多说上源码,这个MyItem是我自定义的图元类,详情可以看我的另一篇文章,这边创建图元时可以不给第二个参数,这是之前做碰撞动画区分左右图片用的; 【QT】GraphicsView框架结构的碰撞开机动画实现流程_logani的博客-CSDN博客 MyViem::MyViem() { Scene = new QGraphicsScene(0,0,500,600); Item = new MyItem("icon/boot/bot-0.jpg",typeenum::LEFT);//创建图元 Item->setPos(250,300); setMask(QBitmap(Item->getPix().mask()));//抠除图像的白色区域实现不规则窗体 Scene->addItem(Item);//图元添加到场景中 this->setScene(Scene);//视图关联场景 count=0; timer = new QTimer(this); timer->start(70); connect(timer,SIGNAL(timeout()),this,SLOT(gifSlot()));//gif动画 } 下面是槽函数gifSlot的实现过程,定义一个count计数,每调用一次槽函数count+1,然后switch选择对应的图片路径进行创建,并刷新界面 void MyViem::gifSlot()//使用switch语句根据情况选择不同的图片 { QString picName; count++; if(count>13) { count=1; } switch(count) { case 1:picName="icon/boot/bot-0.jpg";break; case 2:picName="icon/boot/bot-1.jpg";break; case 3:picName="icon/boot/bot-2.jpg";break; case 4:picName="icon/boot/bot-3.jpg";break; case 5:picName="icon/boot/bot-4.jpg";break; case 6:picName="icon/boot/bot-5.jpg";break; case 7:picName="icon/boot/bot-6.jpg";break; case 8:picName="icon/boot/bot-7.jpg";break; case 9:picName="icon/boot/bot-8.jpg";break; case 10:picName="icon/boot/bot-9.jpg";break; case 11:picName="icon/boot/bot-10.jpg";break; case 12:picName="icon/boot/bot-11.jpg";break; case 13:picName="icon/boot/bot-12.jpg";break; default: break; } Item = new MyItem(picName,typeenum::LEFT);//创建图元 Item->setPos(250,300); Scene->addItem(Item);//图元添加到场景中 setMask(QBitmap(Item->getPix().

TCP和UDP在socket编程上的差异(总结)

文章目录 1. 服务端1.1 在服务端的区别总结: 2. 客户端2. 1 客户端的区别总结 1. 服务端 TCP服务端的socket编程: 使用socket函数创建用于监听的文件描述符使用setsockopt函数对监听的文件描述符设置属性(可选,可以设置端口复用之类的属性)使用bind函数设置监听的文件描述符究竟监听那个IP、哪个端口(一个电脑可能有多张网卡)使用listen函数对监听的文件描述符进行监听,看看有没有新消息、新连接到来使用accept函数创建和客户端的新连接使用recv函数收取消息,使用send函数发送消息(read函数/write函数也行)使用close函数关闭连接使用close函数关闭用于监听的文件描述符(服务器关闭时) UDP服务端的socket编程: 使用socket函数创建和客户端通信的文件描述符使用setsockopt函数对监听的文件描述符设置属性(可选,可以设置端口复用之类的属性)使用bind函数设置和客户端通信的文件描述符从哪个IP、端口接收消息使用recvfrom函数收取客户端的信息,使用sendto函数发送信息使用close函数关闭连接使用close函数关闭用于和客户端通信的文件描述符 1.1 在服务端的区别总结: UDP不需要监听(listen函数)UDP不需要创建连接(accept函数)UDP获取接收方的信息(IP、端口)是在recvfrom函数,而TCP是在accept函数。 2. 客户端 TCP客户端的socket编程: 使用socket函数创建可以和服务器通信的文件描述符使用setsockopt函数设置该文件描述符的属性(可选,非阻塞之类的属性)使用bind函数绑定发送信息的IP、端口号(可选,一般不选,让OS自己去决定)使用struct sockaddr_in结构体指定服务器的IP、端口号使用connect函数与服务器创建连接使用recv函数收取消息,使用send函数发送消息(read函数/write函数也行)使用close函数关闭连接 UDP客户端的socket编程: 使用socket函数创建和服务器通信的文件描述符使用setsockopt函数设置该文件描述符的属性(可选,非阻塞之类的属性)使用bind函数绑定发送信息的IP、端口号(可选,一般不选,让OS自己去决定)使用struct sockaddr_in结构体指定服务器的IP、端口号使用recv函数收取消息,使用send函数发送消息(read函数/write函数也行)使用close函数关闭连接 2. 1 客户端的区别总结 UDP不需要创建连接(connect函数)收发消息使用的函数不同

快速找内网IP泄漏的小技巧

web安全学习了解: web渗透测试 官网: 宣紫科技 快速找内网IP泄漏的小技巧: 打开chrome的开发者工具, 在search模块中搜索 ((25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))\.){3}(25[0-5]|2[0-4]\d|((1\d{2})|([1-9]?\d)))

Amap包装说明

目录 包含在AMAP包工具 AMAP - 应用程序映射:新一代的扫描工具pentesters web安全学习了解: web渗透测试 官网: 宣紫科技 阿马帕是第一个下一代扫描工具pentesters。它试图确定,即使它们是不同的端口比正常运行的应用程序。 它还可以识别非ASCII的应用程序。这是通过发送触发包,并查找响应响应字符串列表来实现。 包含在AMAP包工具 amapcrap - 发送随机的数据到UDP,TCP或SSL'ed端口非法响应 root@kali:~# amapcrap amapcrap v5.4 (c) 2011 by van Hauser/THC &lt;vh@thc.org&gt; Syntax: amapcrap [-S] [-u] [-m 0ab] [-M min,max] [-n connects] [-N delay] [-w delay] [-e] [-v] TARGET PORT Options: -S use SSL after TCP connect (not usuable with -u) -u use UDP protocol (default: TCP) (not usable with -c) -n connects maximum number of connects (default: unlimited) -N delay delay between connects in ms (default: 0) -w delay delay before closing the port (default: 250) -e do NOT stop when a response was made by the server -v verbose mode -m 0ab send as random crap:0-nullbytes, a-letters+spaces, b-binary -M min,max minimum and maximum length of random crap TARGET PORT target (ip or dns) and port to send random crap This tool sends random data to a silent port to illicit a response, which can then be used within amap for future detection.