Jmeter聚合报告各参数详解

聚合报告如下: 各字段详解如下: 1、Lable:Http请求名称 2、#Samples:请求总数,如果线程数为100,循坏次数为10,则Sample为1000 3、Average:平均响应时间 4、Median,90% Line,95% Line, 99% Line:50%,90%,95%,99%用户的响应时间; 5、Min:最小响应时间; 6、Maximum:最大响应时间; 7、Error%:本次测试中出现的错误率,即错误的请求的数量/请求的总数; 8、Throughput:吞吐量——默认情况下表示每秒完成的请求数(Request per Second),当使用了 Transaction ; 9、Received KB/src:每秒从服务器端接收到的数据量; 10、Sent KB/src:每秒从客户端发送的请求的数量。 ps:本人小白,有什么错误的地方,请各位大佬提出,感谢~

Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.ut

java poi 生成word 并插入 表格 报错: Exception in thread "main" java.lang.IncompatibleClassChangeError: Found interface org.apache.poi.util.POILogger, but class was expected 原因: poi 引入的版本不一样 解决办法: 更换统一版本或兼容版本 代码会在 另一篇文章中,贴出来 我的pom: <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> <exclusions> <exclusion> <groupId>org.junit.vintage</groupId> <artifactId>junit-vintage-engine</artifactId> </exclusion> </exclusions> </dependency> <!--<dependency>--> <!--<groupId>org.apache.poi</groupId>--> <!--<artifactId>poi-ooxml</artifactId>--> <!--<version>3.14</version>--> <!--</dependency>--> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-excelant</artifactId> <version>3.14</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-examples</artifactId> <version>4.0.0</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml-schemas</artifactId> <version>3.10-FINAL</version> </dependency> <dependency> <groupId>org.apache.poi</groupId> <artifactId>poi-ooxml</artifactId> <version>4.0.0</version> </dependency> <!--Apache poi 在word中的表格中插入表格,图片等操作 开始--> <dependency> <groupId>org.

Spring的beanFactory和Application

Spring的beanFactory和Application BeanFactory和ApplicationContext联系 BeanFactory和ApplicationContext是Spring的两大核心接口,而其中ApplicationContext是BeanFactory的子接口。它们都可以当做Spring的容器,Spring容器是生成Bean实例的工厂,并管理容器中的Bean。 一、BeanFactory BeanFactory 是 Spring 的“心脏”。它就是 Spring IoC 容器的真面目。Spring 使用 BeanFactory 来实例化、配置和管理 Bean。 BeanFactory是IOC容器的核心接口, 它定义了IOC的基本功能,我们看到它主要定义了getBean方法。getBean方法是IOC容器获取bean对象和引发依赖注入的起点。方法的功能是返回特定的名称的Bean。 BeanFactory常用的实现类是DefaultListableBeanFactory,调用者只需要使用getBean()方法就可以获得指定的引用,无须关心Bean的实例化过程。创建Spring容器的实例时,必须提供Spring容器管理的Bean的详细配置信息。Spring的配置信息通常采用XML配置文件来设置,因此,创建BeanFactory实例时,应该提供XML配置文件作为参数。XML配置文件通常使用Resource对象传入。 如下: Resource isr = new ClassPathResource("beans.xml"); //Resource isr = new FileSystemResource("beans.xml"); DefaultListableBeanFactory beanFactory = new DefaultListableBeanFactory(); new XmlBeanDefinitionReader(beanFactory).loadBeanDefinition(isr); BeanFactory 是初始化 Bean 和调用它们生命周期方法的“吃苦耐劳者”。注意,BeanFactory 只能管理单例(Singleton)Bean 的生命周期。它不能管理原型(prototype,非单例)Bean 的生命周期。这是因为原型 Bean 实例被创建之后便被传给了客户端,容器失去了对它们的引用。 二、ApplicationContext 如果说BeanFactory是Spring的心脏,那么ApplicationContext就是完整的躯体了,ApplicationContext由BeanFactory派生而来,提供了更多面向实际应用的功能。在BeanFactory中,很多功能需要以编程的方式实现,而在ApplicationContext中则可以通过配置实现。 获取bean的方式: ApplicationContext ac = new ClassPathXmlApplicationContext("spring.xml"); BeanFactorty接口提供了配置框架及基本功能,但是无法支持spring的aop功能和web应用。而ApplicationContext接口作为BeanFactory的派生,因而提供BeanFactory所有的功能。而且ApplicationContext还在功能上做了扩展,相较于BeanFactorty,ApplicationContext还提供了以下的功能: 默认初始化所有的Singleton,也可以通过配置取消预初始化。继承MessageSource, 提供国际化的消息访问 。资源访问,如URL和文件 。继承自ResourceLoader(资源加载接口)。事件传播,即支持aop特性?。继承自ApplicationEventPublisher(应用事件发布接口)。同时加载多个配置文件。以声明式方式启动并创建Spring容器。 事件特性 基本上牵涉到事件(Event)方面的设计,就离不开观察者模式。不明白观察者模式的朋友,最好上网了解下。因为,这种模式在java开发中是比较常用的,又是比较重要的。 ApplicationContext的事件机制主要通过ApplicationEvent和ApplicationListener这两个接口来提供的,和java swing中的事件机制一样。即当ApplicationContext中发布一个事件的时,所有扩展了ApplicationListener的Bean都将会接受到这个事件,并进行相应的处理。 在Web应用中使用Spring容器,通常使用XmlWebApplicationContext、AnnotationConfigApplicationContext两个实现类。如果需要使用多个XML配置文件创建Spring容器,可以使用FileSystemXmlApplicationContext或者是ClassPathXmlApplicationContext。 三、BeanFactory和ApplicationContext区别 BeanFactroy采用的是延迟加载形式来注入Bean的,即只有在使用到某个Bean时(调用getBean()),才对该Bean进行加载实例化,这样,我们就不能发现一些存在的Spring的配置问题。而ApplicationContext则相反,它是在容器启动时,一次性创建了所有的Bean。这样,在容器启动时,我们就可以发现Spring中存在的配置错误,但是ApplicationContext 在系统创建前期会有较大的系统开销。当应用程序配置Bean较多时,程序启动较慢。但一旦ApplicationContext初始化完成,程序后面获取Singleton Bean实例时候将有较好的性能。也可以为bean设置lazy-init属性为true,即Spring容器将不会预先初始化该bean。BeanFacotry延迟加载,如果Bean的某一个属性没有注入,BeanFacotry加载后,直至第一次使用调用getBean方法才会抛出异常;而ApplicationContext则在初始化自身是检验,这样有利于检查所依赖属性是否注入;所以通常情况下我们选择使用 ApplicationContext。 BeanFactory和ApplicationContext都支持BeanPostProcessor、BeanFactoryPostProcessor的使用,但两者之间的区别是:BeanFactory需要手动注册,而ApplicationContext则是自动注册。(Applicationcontext比 beanFactory 加入了一些更好使用的功能。而且 beanFactory 的许多功能需要通过编程实现而 Applicationcontext 可以通过配置实现。比如后处理 bean , Applicationcontext 直接配置在配置文件即可而 beanFactory 这要在代码中显示的写出来才可以被容器识别。 )

专题九——数组类问题

例题1:已知数组a中的元素已按由小到大顺序排列,以下程序的功能是将输入的一个数插入数组a中,插入后,数组a中的元素仍然由小到大顺序排列 #include <stdio.h> int main() { int a[10] = {0,17,28,32,56,86,88}; int n,i,j; //j为元组的个数 j = 6; printf("Enter a number :"); scanf("%d",&n); a[0] = n ; //数组a[0]为工作单元 for(i = j;i>0;i--) { if(a[i]>n) a[i+1] = a[i]; else { a[i+1] = n; break; } } for(i=1;i<=j+1;i++) { printf("%d ", a[i]); } printf("\n"); return 0; } 例题2:通过键盘输入3名学生4门课程的成绩,分别求每个学生的平均成绩和每门课程的平均成绩。 #include <stdio.h> int main() { float a[4][5],sum1,sum2; int i,j; for(i=0;i<3;i++) { for(j=0;j<4;j++) { scanf("%d",&a[i][j]); } } for(i=0;i<3;i++) { sum1 = 0; for(j = 0;j<4;j++) { sum1 += a[i][j]; a[i][4] = sum1 / 4; } } for(j=0;j<5;j++) { sum2 = 0; for(i=0;i<3;i++) { sum2 += a[i][j]; a[3][j] = sum2/3; } } for(i=0;i<4;i++) { for(j=0;j<5;j++) { printf("

sqlmap报错注入

0x00 背景 学习记录一下报错型的注入,经各方整理和自己总结形成。 所有的注入原理都是一样,即用户输入被拼接执行。但后台数据库执行语句产生错误并回显到页面时即可能存在报错注入。 0x01概念 报错型注入的利用大概有以下3种方式: 复制代码 1:?id=2’ and (select 1 from (select count(*),concat( floor(rand(0)*2),(select (select (查询语句)) from information_schema.tables limit 0,1))x from information_schema.tables group by x )a )–+ 2:?id=2’ and updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)–+ 3:?id=1’ and extractvalue(1, concat(0x7e, (select 查询语句),0x7e))–+ 复制代码 对于1的分析: 复制代码 floor()是取整数 rand(0)*2将取0到2的随机数 floor(rand()2)有两条记录就会报错 floor(rand(0)2)记录需为3条以上,且3条以上必报错,返回的值是有规律的 count()是用来统计结果的,相当于刷新一次结果 group by 对数据分组时会先看看虚拟表里有没有这个值,若没有就插入,若存在则count()加1 group by 时floor(rand(0)*2)会被执行一次,若虚表不存在记录,插入虚表时会再执行一次 对于count()、rand()、group by 三者同时存在为什么会报错可以参考乌云tsafe的文章 复制代码 对于2的分析: 复制代码 函数的形式为:UPDATEXML (XML_document, XPath_string, new_value);、 第一个参数:XML_document是String格式,为XML文档对象的名称,文中为Doc 第二个参数:XPath_string (Xpath格式的字符串) , 第三个参数:new_value,String格式,替换查找到的符合条件的数据 作用:改变文档中符合条件的节点的值,即改变XML_document中符合XPATH_string的值 而我们的注入语句为:updatexml(1,concat(0x7e,(SELECT 查询语句),0x7e),1)

在Ubuntu18.04虚拟机下安装VMware-Tools工具

在Ubuntu18.04虚拟机下安装VMware-Tools 原始桌面 重新挂载虚拟光盘 选择“安装VMware Tools”,出现桌面上的图标 选择在终端打开 使用ls命令查看安装包 复制安装包到指定的文件目录下 进入/usr/local/bin目录下,ls查看是否复制完成 执行命令使其解压 ls查看 进入vmware-tools-distrib目录下,ls查看 执行安装命令 输入yes,一路敲击回车继续 安装成功!自动切换至全屏界面

12个前端必会 H5 问题及解决方法

前言 作为一个开发了多个 H5 项目的前端工程师,在开发过程中难免会遇到一些兼容性等爬过坑的问题。现在我将这些问题一一汇总一下,并在后面给出坑产生的原理,和现阶段常规的填坑方案。由此来做一个阶段性的总结。 问题 下面列举了我遇到的一些常规问题,如有遇到其他问题请在评论区补充,之后我也会实践后加以补充,感谢!(经常更新该文) 移动端 H5 相关问题汇总: 1px 问题响应式布局iOS 滑动不流畅iOS 上拉边界下拉出现白色空白页面件放大或缩小不确定性行为click 点击穿透与延迟软键盘弹出将页面顶起来、收起未回落问题iPhone X 底部栏适配问题保存页面为图片和二维码问题和解决方案微信公众号 H5 分享问题H5 调用 SDK 相关问题及解决方案H5 调试相关方案与策略 移动端 H5 相关基础技术概览 原理与实践 之前两篇文章已经详细的论述了1px 问题与 响应式布局 问题,并给出了原理和解决方案。 防止丢失,点赞收藏后跳转至快捷通道:1px通道与响应式布局通道 接下来呢,我们看看其他问题的原理和解决方案吧。 以下解决方案,均经过我测试成功,健康安全,请放下食用。由于篇幅原因,某些非核心解决方案的实现细节暂未谈论,需要自行研究。 iOS滑动不流畅 表现 上下滑动页面会产生卡顿,手指离开页面,页面立即停止运动。整体表现就是滑动不流畅,没有滑动惯性。 产生原因 为什么 iOS 的 webview 中 滑动不流畅,它是如何定义的? 最终我在 safari 文档里面寻找到了答案(文档链接在参考资料项)。 原来在 iOS 5.0 以及之后的版本,滑动有定义有两个值 auto 和 touch,默认值为 auto。 -webkit-overflow-scrolling: touch; /* 当手指从触摸屏上移开,会保持一段时间的滚动 */ -webkit-overflow-scrolling: auto; /* 当手指从触摸屏上移开,滚动会立即停止 */ 解决方案 1.在滚动容器上增加滚动 touch 方法 将-webkit-overflow-scrolling 值设置为 touch

c#中的Length和GetLength()的区别

文章目录 代码格式简明做一个小实验 仅作为操作记录,大佬请跳过。 代码格式 首先 Length直接,GetLength()需要用括号 Length是取所有的元素个数,GetLength()是取行数和列数 简明 假如一个数组:(两行三列) array= 1,2,3 4,5,6 Length是6; GetLength(0)是2,【GetLength(0)表示取行数】 GetLength(1)是3 做一个小实验 double[,] output = new double[,] { { 1, 2, 4 },{ 1,2,4} }; //实验getlength和Length //******************************* int arraylength = new int(); arraylength = output.Length; arraylength = output.GetLength(0); //*******************************

爬虫-抖音无水印视频下载

直接撸代码,复制即用 import re import requests class Douyin: def __init__(self,url): """ 初始化 :param url: 用手机分享的视频链接 """ self.headers = {"User-Agent": "Mozilla/5.0 (iPhone; CPU iPhone OS 11_0 like Mac OS X) AppleWebKit/604.1.38 (KHTML, like Gecko) Version/11.0 Mobile/15A372 Safari/604.1"} self.url = url # 获取拼接视频播放地址的参数,获取网页源代码中的参数 def get_url_data(self): res = requests.get(url=self.url, headers=self.headers).text try: parent_rid = re.findall('parent_rid: "(.*?)"', res)[0] itemId = re.findall('itemId: "(.*?)"', res)[0] uid = re.findall('uid: "(.*?)"', res)[0] dytk = re.findall('dytk: "(.*?)"', res)[0] authorName = re.

Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input l

Caused by: org.yaml.snakeyaml.error.YAMLException: java.nio.charset.MalformedInputException: Input length = 1 at org.yaml.snakeyaml.reader.StreamReader.update(StreamReader.java:218) at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:176) at org.yaml.snakeyaml.reader.StreamReader.ensureEnoughData(StreamReader.java:171) at org.yaml.snakeyaml.reader.StreamReader.peek(StreamReader.java:126) at org.yaml.snakeyaml.scanner.ScannerImpl.scanToNextToken(ScannerImpl.java:1177) at org.yaml.snakeyaml.scanner.ScannerImpl.fetchMoreTokens(ScannerImpl.java:287) at org.yaml.snakeyaml.scanner.ScannerImpl.checkToken(ScannerImpl.java:227) at org.yaml.snakeyaml.parser.ParserImpl$ParseImplicitDocumentStart.produce(ParserImpl.java:195) at org.yaml.snakeyaml.parser.ParserImpl.peekEvent(ParserImpl.java:158) at org.yaml.snakeyaml.parser.ParserImpl.checkEvent(ParserImpl.java:148) at org.yaml.snakeyaml.composer.Composer.checkNode(Composer.java:72) at org.yaml.snakeyaml.constructor.BaseConstructor.checkData(BaseConstructor.java:114) at org.yaml.snakeyaml.Yaml$1.hasNext(Yaml.java:543) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:160) at org.springframework.beans.factory.config.YamlProcessor.process(YamlProcessor.java:134) at org.springframework.boot.env.OriginTrackedYamlLoader.load(OriginTrackedYamlLoader.java:75) at org.springframework.boot.env.YamlPropertySourceLoader.load(YamlPropertySourceLoader.java:50) at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.loadDocuments(ConfigFileApplicationListener.java:562) at org.springframework.boot.context.config.ConfigFileApplicationListener$Loader.load(ConfigFileApplicationListener.java:518) ... 37 common frames omitted Caused by: java.nio.charset.MalformedInputException: Input length = 1 这个错误的原因是 配置文件编码导致的, 改为UTF-8就好

linux下最简单好用的的端口转发工具

官网地址http://www.rinetd.com/ 软件下载 wget http://www.rinetd.com/download/rinetd.tar.gz 解压安装 tar zxvf rinetd.tar.gz make make install 编辑配置 vi /etc/rinetd.conf 0.0.0.0 8080 172.19.94.3 8080 0.0.0.0 2222 192.168.0.103 3389 1.2.3.4 80 192.168.0.10 80 说明一下(0.0.0.0表示本机绑定所有可用地址) 将所有发往本机8080端口的请求转发到172.19.94.3的8080端口 将所有发往本机2222端口的请求转发到192.168.0.103的3389端口 将所有发往1.2.3.4的80端口请求转发到192.168.0.10的80端口 启动程序 pkill rinetd ##关闭进程 /usr/sbin/rinetd ##启动转发 把这条命令加到/etc/rc.local里面就可以开机自动运行 查看状态 netstat -antup 需要注意 1.rinetd.conf中绑定的本机端口必须没有被其它程序占用 2.运行rinetd的系统防火墙应该打开绑定的本机端口 例如: -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 1111 -jACCEPT -A RH-Firewall-1-INPUT -m state --state NEW -m tcp -p tcp --dport 2222 -jACCEPT

设计一个学生类 Student 包含姓名、成绩两个属性。定义一个无参的构造方法和一个接收两个参数的构造方法。

请按照以下要求设计一个学生类 Student,并进行测试。 要求如下: Student 类中包含姓名、成绩两个属性 分别给这两个属性定义两个方法,一个方法用于设置值,另一个方法用于获取值. Student 类中定义一个无参的构造方法和一个接收两个参数的构造方法,两个参数分别为姓名和 成绩属性赋值 在测试类中创建两个 Student 对象,一个使用无参的构造方法,然后调用方法给姓名和成绩赋值, 一个使用有参的构造方法,在构造方法中给姓名和成绩赋值 class Student { private String name; private double grade; public Student() { } public Student(String name, double grade) { this.name = name; this.grade = grade; } public String getName() { return name; } public void setName(String name) { this.name = name; } public double getGrade() { return grade; } public void setGrade(double grade) { this.grade = grade; } } public class Test01 { public static void main(String[] args) { Student stu1 = new Student(); stu1.

VM安装的虚拟机如何在局域网内互相访问

笔者在本地Win10操作系统安装环境如下: VM 15 Pro 安装CentOS7 本章主要实现安装好的虚拟机需要被局域网其它机子访问到,下面开始配置网络,首先VM支持3种网络适配器模式: 主机模式 桥接模式 NAT模式 如果要实现虚拟机被局域网其它机子访问到,那么这里我们要选择桥架模式,具体设置如下: 1、找到当前主机正常使用的网络适配器,右键右下角的wifi图标或网线图片 -> 打开网络和Interl设置,笔者这里出现如下图: 2、然后单机以太网 -> 更改适配器选项,笔者这里出现类似如下图: 3、右键适配器 -> 属性,出现类似如下图(勾选Bridge Protocol): 4、记住上面名称 5、回到VM,点击编辑 -> 虚拟网络编辑器,出现类似如下图: 6、点击更改设置,具体配置如下: 7、选择某个虚拟机 -> 编辑虚拟机设置 8、选择如下: 9、本地Win + R,输入cmd回车后,输入ipconfig 命名查看本地网卡信息: 9、开启虚拟机,登录进去后,编辑网卡,笔者这里网卡为ens33: vi /etc/sysconfig/network-scripts/ifcfg-ens33 10、输入如下内容: 修改项: BOOTPROTO="static" ONBOOT="yes" UUID="403bc27b-ed4b-4321-a0a7-cb98942ba5fd" #如果克隆出来的,这个要手动修改下为其它值 末尾添加项: IPADDR=192.168.1.101 #这里对应上面ipconfig输出的网段192.168.1.3 ~ 192.168.1.254范围随便选一个即可,但不要跟主机相同就行 NETMASK=255.255.255.0 GATEWAY=192.168.1.1 #这里对应上面ipconfig输出的默认网关 DNS1=8.8.8.8 11、重启网卡 systemctl restart network 12、现在局域网其它机子则可以直接ping该虚拟机进行测试 ---------------------- 正文结束 ------------------------ 长按扫码关注微信公众号 Java软件编程之家

Hugo博客部署到GitHub无法显示CSS、JS踩坑

背景 最近我跟着网上的教学搭建了一个Hugo的个人博客。 一路顺利,直到部署到GitHub后出了问题。 问题 那是遇到了什么问题呢? 我搭建好的个人博客在本地运行是这样的↓ 很完美,对吧。 可是部署到GitHub后,访问远端是这样的↓ 这就出大问题了呀,CSS样式没了。 然后浏览器F12看了下报错↓ 它是加载失败,并不是找不到文件,也就说并不是我代码路径有问题,那排除了代码问题,那应该就是我部署时出了问题,毕竟我也才接触的GitHub,部署都是按着网上的教学来的,出现问题是很正常的。 解决 于是我开始在网上找解决办法,可大多数都是说代码引用路径写错了,可我再三确认没有问题,于是接着找,功夫不负有心人,我找到了以下文章↓ https://www.daniao.org/5349.html 上面这篇文章是从将Hugo文件推到GitHub开始的,如果你已经知道如何推文件,只是不知如何解决无法显示CSS问题,请接着看我下面总结。 首先,新建仓库,登录自己的github账号,然后点击右上角的+号,选择new repository,如图: 进入刚刚新建的仓库,选择Settings,找到GitHubPages。 Theme Chooser随便选择一个提交就可以了,之后会给你username.github.io这样的网址就表示实在对了,因为我们用public推送必须要这样的网址形式,不然会不显示CSS样式。 去刚创建的仓库里的文件git到public文件夹中,里面有默认的配置文件,_config.yml、README.md必需要用到,下载下来之后复制到public文件夹中,之后就可以无障碍的push到你的项目中。 接下来将个人博客部署到GitHub上就能正常访问啦。 附上部署命令: hugo --theme=这里填你的主题名 --baseUrl=“这里填你的远端地址” --buildDraftscd publicgit initgit remote add origin https://github.com/你的github用户名/你的github用户名.github.io.gitgit add -Agit commit -m “我的hugo博客”git pull --rebase origin mastergit push -u origin master

Android Studio开发学习(五)——ImageView、ListView、GridView、ScrollView、HorizontalScrollView

一、前提 今天学习ImageView、ListView、GridView、ScrollView、HorizontalScrollView,也是很常见的控件 二、目标 ImageView(图像视图) ListView(列表控件) GridView(表格控件) ScrollView(竖直滚动条) HorizontalScrollView(水平滚动条) 三、内容 (一)ImageView 1、常用属性 大致相同 <ImageView android:id="@+id/imageview1" android:layout_width="200dp" android:layout_height="200dp" android:background="#FF9900" android:src="@drawable/hmbb" /> 我们注意到src属性是内容属性,可以在里面添加图片,当然background属性,也可以,这里我们为了方便测试 此时我们可以看到图片添加到了这个控件中,但我们发现,图片并没有铺满整个控件,而是还有一部分是背景颜色,此时我们就要使用到一个属性android:scaleType=“”这个属性用来调整图片,缩放类型 原图: android:scaleType=“fitXY”拉伸显示图片,不保持原始比例,铺满整个控件大小android:scaleType=“fitStart”按照比例放大或缩小图片高度,使其显示在控件顶部android:scaleType=“fitCenter”按照比例放大或缩小图片高度,使其显示在控件中间android:scaleType=“fitEnd”按照比例放大或缩小图片高度,使其显示在控件底部android:scaleType=“center”保持原图大小,显示在控件中心,多余的部分被裁掉android:scaleType=“centerCrop”以原图填满控件为目的,如果原图size大于控件的size,按比例缩小,居中显示在控件中。如果原图size小于控件的size,则按比例拉升原图的宽和高,填充控件居中显示android:scaleType=“centerInside”以原图正常显示为目的,如果原图大小大于控件的size,按比例缩小,居中显示在控件中。如果原图size小于控件的size,则不做处理居中显示图片android:scaleType=“matrix”不改变原图的大小,从ImageView的左上角开始绘制,超出部分做剪切处理 以至于最后一张图是白色的是因为matrix方式是从左上角开始绘制,我选取的图左上角刚好是白色,以上就是scaleType常见的所有绘制方式。 (二)ListView、GridView 重要问题:适配器 1、什么是适配器 ListView是一个列表控件,GridView是一个表格列表,用来显示数据,但ListView和GridView所展示的数据是有一定格式的,这时我们便要引进一个适配器,来建立数据源和ListView、GridView之间的适配关系,将数据源转换成ListView、GridView可以使用的格式进行显示,降低了程序的耦合性。在对于ListView、GridView来说有很多的适配器,我们就要最通用的适配器来完成——BaseAdapter 2、缓冲机制 ListView、GridView可以展示大量的数据信息,像是我们刷新闻刷空间,一条一条的都可用ListView、GridView实现,但假设ListView、GridView能存储50条信息,但屏幕最多显示5条,当我们向上滑动屏幕时第一条信息就会划出屏幕收回到缓冲池中,紧跟着第六条信息就会从缓冲池中取出放到布局文件中,设置数据进行显示,以此类推,这样,系统永远保持这5条数据,这便是缓冲机制,简单的来说就是,用则取出不用则收回,这样便可极大节约系统资源 3、设计 (1)首先设计布局文件,在activity_main添加一个ListView <ListView android:id="@+id/listview" android:layout_width="match_parent" android:layout_height="wrap_content" ></ListView> (2)新建一个布局文件,在布局文件中绘制每一行的显示样式,只用设计一个就可以 <ImageView android:id="@+id/iv" android:layout_width="100dp" android:layout_height="100dp" android:scaleType="centerCrop" android:background="#000000" /> <LinearLayout android:layout_width="match_parent" android:layout_height="match_parent" android:orientation="vertical" android:paddingLeft="10dp" > <TextView android:id="@+id/tv1" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="hello!" android:textSize="20sp" android:textColor="#00FFFF" /> <TextView android:id="@+id/tv2" android:layout_width="wrap_content" android:layout_height="wrap_content" android:text="My friend" android:textSize="20sp" android:textColor="#00FF00" android:layout_marginTop="10dp" /> <TextView android:id="

HTML引入另一个HTML-include方法

写在前面:不是很推荐静态页面引入另一个页面,因为这可能会造成你的页面内的一些js失效。慎入啊 QAQ https://www.jianshu.com/p/c4f18bea8cab 如上述教程所说,这里放一个include.js,这样就不需要用iis什么的了。 注意需要引用的那个界面格式改成.aspx 新建一个叫include.js的文件,然后把下面的代码复制,最后引入在用到的html界面就可以了。 (function(window,document,undefined){var Include39485748323=function(){};Include39485748323.prototype={forEach:function(array,callback){var size=array.length;for(var i=size-1;i>=0;i-=1){callback.apply(array[i],[i])}},getFilePath:function(){var curWwwPath=window.document.location.href;var pathName=window.document.location.pathname;var localhostPaht=curWwwPath.substring(0,curWwwPath.indexOf(pathName));var projectName=pathName.substring(0,pathName.substr(1).lastIndexOf('/')+1);return localhostPaht+projectName},getFileContent:function(url){var ie=navigator.userAgent.indexOf('MSIE')>0;var o=ie?new ActiveXObject('Microsoft.XMLHTTP'):new XMLHttpRequest();o.open('get',url,false);o.send(null);return o.responseText},parseNode:function(content){var objE=document.createElement("div");objE.innerHTML=content;return objE.childNodes},executeScript:function(content){var mac=/<script>([\s\S]*?)<\/script>/g;var r="";while(r=mac.exec(content)){eval(r[1])}},getHtml:function(content){var mac=/<script>([\s\S]*?)<\/script>/g;content.replace(mac,"");return content},getPrevCount:function(src){var mac=/\.\.\//g;var count=0;while(mac.exec(src)){count+=1}return count},getRequestUrl:function(filePath,src){if(/http:\/\//g.test(src)){return src}var prevCount=this.getPrevCount(src);while(prevCount--){filePath=filePath.substring(0,filePath.substr(1).lastIndexOf('/')+1)}return filePath+"/"+src.replace(/\.\.\//g,"")},replaceIncludeElements:function(){var $this=this;var filePath=$this.getFilePath();var includeTals=document.getElementsByTagName("include");this.forEach(includeTals,function(){var src=this.getAttribute("src");var content=$this.getFileContent($this.getRequestUrl(filePath,src));var parent=this.parentNode;var includeNodes=$this.parseNode($this.getHtml(content));var size=includeNodes.length;for(var i=0;i<size;i+=1){parent.insertBefore(includeNodes[0],this)}$this.executeScript(content);parent.removeChild(this);})}};window.onload=function(){new Include39485748323().replaceIncludeElements()}})(window,document);

web前端常用命令

vue模块化开发 1.全局安装webpack npm install webpack -g 2.全局安装vue脚手架 npm install -g @vue/cli-init 3.初始化vue项目 创建文件夹命名 cmd打开 vue init webpack appname : vue脚手架使用webpack模块化一appname项目 4.启动vue项目 项目的package.json中有script,代表我们能运行的命令 npm run dev 启动项目 npm run bulid 将项目打包 NPM安装 element-ui 推荐使用npm的方式安装,它能更好地和webpack打包工具配合使用。npm i element-ui -S 在main.js中写入以下内容: import Vue from ‘vue’; import ElementUI from ‘element-ui’; import ‘element-ui/lib/theme-chalk/index.css’; import App from ‘./App.vue’; Vue.use(ElementUI); new Vue({ el: ‘#app’, render: h => h(App) });

(一)【机器人路径规划】路径规划概述

文章目录 A 路径规划定义B 构型/位型空间(configuration Space)C 障碍物与构型空间C 环境模型建立D 欧氏距离与曼哈顿距离 A 路径规划定义 移动机器人依据某个或某些性能指标(如工作代价最小、行走路线最短、行走时间最短等),在运动空间中找到一条从起始状态到目标状态、可以避开障碍物的最优或者接近最优的路径。 路径规划分为全局路径规划和局部路径规划 全局路径规划:是宏观的规划,主要为机器人在运动中提供核心运动点,保证机器人安全到达目的地,但全局路径规划生成的可能不是一条轨迹,而是一些离散的点。局部路径规划:为了实现机器人的路线更加合理,还需要局部路径规划。它可以对机器人的速度、加速度等进行约束。 B 构型/位型空间(configuration Space) 构型/位型:能够反映机器人上每个点位置的变量 (a)中的 θ \theta θ角就是门的构型 (b)中的点的坐标就是点的构型 (c)旋转角度 θ \theta θ和坐标(x,y)构成硬币的构型。 机器人的自由度能反映构型。 构型/位型空间(C-space):包含机器人所有构型的n维空间 二自由度机械臂的两个关节角构成它的C-space,中间图为C-space的拓扑空间,最右为其坐标表示。 C 障碍物与构型空间 将构型空间障碍物 Q O 1 QO_1 QO1​定义为机器人与工作空间中的障碍物 W O 1 WO_1 WO1​相交的构型集合。 自由空间或自由构型空间 Q f r e e Q_{free} Qfree​是机器人不与任何障碍物相交的构型集合。 黄色为机器人;蓝色为障碍物。 例子: 圆为机器人,三角形为障碍物 由于机器人本身是有工作半径的,把三角形机器人半径宽的外环都划分为障碍物部分。则自由此例子的自由构型空间就是实际障碍物部分。 C 环境模型建立 定义:建立机器人所处环境中的各种物体,包括障碍、路标等的准确空间位置描述,即建立空间模型或地图。 两种建立环境模型方法: <1>栅格法 所谓栅格法,是将移动机器人需要工作的环境信息分割成等大小的正方形栅格,此方法是W.E.Howden提出的,并成为移动机器人路径规划最常用的地图建模方法。 如: 栅格法环境信息表示方法: 障碍物栅格赋值为1,自由空间栅格赋值为0。 重要参数:栅格大小: 栅格法建模,栅格大小的选取尤为重要,既要考虑机器人尺寸,也要考虑到整个环境的复杂程度。 较为理想的栅格单位长度为机器人的直径大小。 栅格法环境信息表示方法: 栅格地图的标识方法: 栅格地图建立模型后,需要将整个二维工作区内的栅格单元用序号法或直角坐标系法进行标识。这样有助于移动机器人对栅格单元位置的记录,分辨出是障碍物栅格还是可以通过的自由空间栅格。

Goland环境下同一个package下出现undefined

本人用Goland调试github.com/oliver006/redis_exporter源码的时候,竟然出现下列编译错误 随后发现函数NewRedisExporter、结构体Options均是处于main包下exporter.go文件中 这就很奇怪了,处于同一个包下肯定是可以找到的,随后用go build .命令跑了一下,确实是可以编译成功的,这个时候我就怀疑是Goland的问题了,应该是Goland按照文件级别来进行编译的。随后进行如图处理: 将Run kind设置为Directory就可以了编译成功了!

慎重搭建MobSF

前情提要 MobSF是一款移动安全框架。支持静态代码分析和动态分析,听说还能测试WebAPI接口。为什么是听说,因为我动态分析功能没搭成功。。。。。。 之前用docker搭好了,但是只能使用静态分析功能,想试试动态分析和webAPI接口的测试,需要本地搭 结合官网教程和网上安装博客 环境: centos7 64位,python3 python3 使用命令是python3,pip3 # 下载安装包 git clone https://github.com/MobSF/Mobile-Security-Framework-MobSF.git cd Mobile-Security-Framework-MobSF # 安装依赖 pip3 install -r requirements.txt 报错 raise ImproperlyConfigured(‘SQLite 3.8.3 or later is required (found %s).’ % Database.sqlite_version) django.core.exceptions.ImproperlyConfigured: SQLite 3.8.3 or later is required (found 3.7.17). MobSF的框架是django 2.2,对sqlite版本有需求,centos自带sqlite版本低,更新sqlite 官网查看最新版本链接 https://www.sqlite.org/download.html # 下载sqlite安装包 cd ~ wget https://www.sqlite.org/2019/sqlite-autoconf-3300100.tar.gz # 解压 tar zxvf sqlite-autoconf-3300100.tar.gz cd sqlite-autoconf-3300100/ ./configure make && make install # 替换旧的sqlite,进入home目录 cd ../ mv /user/bin/sqlite3 /usr/bin/sqlite3_old ln -s /usr/local/bin/sqlite3 /usr/bin/sqlite3 echo "

老掉牙的ArrayList解析它它它又来了

由于本人对多线程板块知识理解的深度不够,所以本文结合了网上面试题的同时略过了ArrayList与多线程结合的题目,或许那才是重点。不过咱们是初学者,先了解就行,不用深究。 文章目录 1、List概述2、ArrayList基本概述3、常见的ArrayList面试题3.1、ArrayList是如何进行扩容的3.2、为什么ArrayList获取集合的长度是使用size,而不是使用length3.3、ArrayList频繁扩容导致添加性能急剧下降,如何处理?3.4、如何复制一个ArrayList到另一个ArrayList中去3.5、 ArrayList和LinkedList区别?3.6、ArrayList是线程安全的么?如果不安全,又需要安全怎么办3.7、对于ArrayList和LinkedList如何选择使用? 写在前头 学完集合的源码,整个人都不好了。以前只知道List、Set、Map三种集合,然后就是对应的增删改查方法,哇,使用集合存数据方便极了,谁还用难用的数组!!!凡是多问几个为什么,你不问,面试官帮你问。好的,所以为了赶在面试官前面,我先来问问自己为什么。 于是就有了你看的这篇博客,当然这仅仅是来自一个初学ArrayList集合的人,知识体系也就不够完善,但是我会加油的,希望对你也有帮助!!! 不过不得不说ArrayList的源码要比HashMap简单很多,只有逻辑代码,很少涉及算法部分(那些二进制算法)。废话不多说,咱们开始吧!!! 建议本文可以配合源码食用 传送门 ArrayList源码剖析 1、List概述 Java 的 List 是非常常用的数据类型。List 是有序的 Collection。Java List 一共三个实现类: 分别是 ArrayList、Vector 和 LinkedList,所以ArrayList也是有序的。下面的图片分别是三种集合的类图,有兴趣的可以了解一下,当然后期我也会继续跟进,毕竟熟透框架 人人有责。 2、ArrayList基本概述 ArrayList是一个数组队列,相当于动态数组。与Java中的数组相比,它的容量能动态增长。它继承于AbstractList,实现了List,RandomAccess,Cloneable,java.io.Serializable这些接口 ArrayList 是最常用的 List 实现类,内部是通过数组实现的,它允许对元素进行快速随机访问。数组的缺点是每个元素之间不能有间隔,当数组大小不满足时需要增加存储能力,就要将已经有数组的数据复制到新的存储空间中。当从 ArrayList 的中间位置插入或者删除元素时,需要对数组进行复制、移动、代价比较高。因此,它适合随机查找和遍历,不适合插入和删除。 3、常见的ArrayList面试题 3.1、ArrayList是如何进行扩容的 当我们在使用add()方法时,如果我们没有指定对应的容量,系统就会采用默认的10作为集合的容量。(至于为什么是10,我觉得应该是作者综合考虑了很多因素才决定的吧,毕竟扩容挺浪费性能的)当集合的容量超过10以后,集合的容量就开始扩容,每次扩容为之前容量的1.5倍(oldCapacity + (oldCapacity >> 1))。当然,每次调用add()方法的时候,都会去进行容量的判断,继而确定是否扩容。 3.2、为什么ArrayList获取集合的长度是使用size,而不是使用length 在最开始接触集合的时候,老师就跟我们说,获取集合的长度是使用size(),而不是length。调用size()我们不难发现它也只是简单的返回一个size变量。那为什么就不能继续让length继续担任长度呢? public int size() { return size; } 其实在ArrayList中,有集合容量和集合长度一说。集合的容量就是使用的length(用于扩容),集合长度就是集合中真正的包含的元素使用size。并且我们ArrayList是不能够获取集合容量的,这也就是为什么我们的获取集合的长度是使用的size()而非length。 3.3、ArrayList频繁扩容导致添加性能急剧下降,如何处理? 我们分析源码可得,每次ArrayList集合在添加方法的时候,都会去进行集合容量的判定,继而确定是否需要进行扩容。如果我们能够指定出集合具体的恰当容量,那么系统就不会去扩容,直接使用我们设置的容量。这样就能够避免频繁扩容带来的性能损耗。 3.4、如何复制一个ArrayList到另一个ArrayList中去 1、由于ArrayList类实现了clone()接口,所以我们可以直接使用克隆的方式进行 2、在构造方法中传入集合对象,可以完成复制 3、使用addAll方法传入集合对象,可以完成复制 3.5、 ArrayList和LinkedList区别? ArrayList 基于动态数组的数据结构对于随机访问的get和set,ArrayList要优于LinkedList对于随机操作的add和remove,ArrayList并不一定比LinkedList慢 (虽然LinkedList在增删时拥有明显的优势,但是ArrayList底层由于是动态数组,因此并不是每次add和remove的时候都需要创建新数组) LinkedList 基于链表的数据结构对于顺序操作,LinkedList不一定比ArrayList慢对于随机操作,LinkedList效率明显较低(因为使用顺序访问只是在获取迭代器的时候进行了一次折半,然而随机操作每次都要去获取) 3.6、ArrayList是线程安全的么?如果不安全,又需要安全怎么办 ArrayList不是线程安全的,只能用在单线程环境下,多线程环境下可以考略使用Collections.synchronizedList(list)返回一个线程安全的ArrayList类。也可以使用ConcurrentLinkedQueue()来保证安全。 3.7、对于ArrayList和LinkedList如何选择使用? 时间复杂度上: 由于ArrayList是动态数组(动态就是可以自动扩容),所以改和查有明显的优势,但是增删由于涉及到扩容效率会相对差些,但并不是每次都会去扩容,所以ArrayList的增删效率差这种说法是有一定问题的。 LinkedList是一个双向链表,会出现在删除和修改上有明显的优势,但查找和修改就有一定的劣势,所以使用LinkedList一定要使用迭代器查找(具体原因在分析源码的时候,我已经说过)。

第一次启动journalnode,没有启动成功

sbin/hadoop-daemon.sh start journalnode 打开节点 然而并没有打开,估计是因为第一次配置文件,哪里配错了。 按照log地址去查看日志: 果然,core_site.xml 29行有错,删除后问题解决。

多线程读取+多进程保存多路摄像头图像

项目需要对多路在线视频采集数据保存,利用自己之前的两篇博客: (1)利用python多进程程或多线程实时读取远程IP摄像头视频 (2)Pyhon cv2.VideoWriter 保存视频 整合成如下代码,可以对多路网络摄像头图像实时采集并分别保存视频。或者自己改写代码,直接保存每路的实时图像也可以。 需要修改: (1)multithread_run()中自己的图像尺寸和帧率(帧率不一定跟源码流帧率一致) (2)主函数中的url,记得加上自己的帐号密码 from threading import Thread from collections import deque from multiprocessing import Process import cv2 ##################################################### def producer(cap, q): while True: # print('producer execuation') if cap.isOpened(): ret, img = cap.read() q.append(img) def consumer(camera_index, outVideo, q): print("Start to capture and save video of camera {}...".format(camera_index)) while True: if len(q) == 0: pass else: img = q.pop() # print('consumer execuation') img_res = cv2.resize(img, (int(img.

如何完全卸载Node.js,然后从头开始重新安装(Mac OS X)

本文翻译自:How do I completely uninstall Node.js, and reinstall from beginning (Mac OS X) My version of node is always v0.6.1-pre even after I install brew node and NVM install v0.6.19. 我的节点版本始终是v0.6.1-pre,即使我安装了brew节点并且NVM也安装了v0.6.19。 My node version is: 我的节点版本是: node -v v0.6.1-pre NVM says this (after I install a version of node for the first time in one bash terminal): NVM这样说(我在一个bash终端中第一次安装了一个版本的节点之后): nvm ls v0.6.19 current: v0.6.19 But when I restart bash, this is what I see: 但是当我重新启动bash时,这是我看到的: nvm ls v0.

iOS 13 如何删除SceneDelegate

Xcode11之后新创建的工程会多出两个文件SceneDelegate。那么我们如何让它变回之前的那样的工程呢。 一、将这两个文件删除。 会报错There is no scene delegate set. A scene delegate class must be specified to use a main storyboard file. 二、将Info.plist 中的 SceneMainSet 删除 三、将AppDelegate.m中的UISceneSession lifecycle注释掉或者删掉。 #pragma mark - UISceneSession lifecycle //- (UISceneConfiguration *)application:(UIApplication *)application configurationForConnectingSceneSession:(UISceneSession *)connectingSceneSession options:(UISceneConnectionOptions *)options { // // Called when a new scene session is being created. // // Use this method to select a configuration to create the new scene with. // return [[UISceneConfiguration alloc] initWithName:@"

Epic启动器里添加本地UE4版本

目录 一、目的: 1、Epic直接识别本地的UE4版本,无需重新下载 1、发现想在虚幻商城里的资源导入到我的UE4工程里面,Epic必须要识别ue4版本,所以想着Epic必须要识别本地的UE4版本,电脑里面已经有了对应的UE4版本,我不想重新下载UE4,所以使用这个方法能够轻松解决 1、想:电脑重做系统后,UE4可能需要重新下载了,之前下载的版本Epic无法识别到,所以想让Epic识别之前下载好的UE4 二、参考: 1、UE4启动器是否有办法添加本地版本 三、操作: 1、注意: 1、拿4.15.3测试(亲测:4.8.3、4.9.2、4.13.2、4.15.3、4.18.3、4.19.2、4.21.2成功) 一、目的: 1、Epic直接识别本地的UE4版本,无需重新下载 1、发现想在虚幻商城里的资源导入到我的UE4工程里面,Epic必须要识别ue4版本,所以想着Epic必须要识别本地的UE4版本,电脑里面已经有了对应的UE4版本,我不想重新下载UE4,所以使用这个方法能够轻松解决 1、想:电脑重做系统后,UE4可能需要重新下载了,之前下载的版本Epic无法识别到,所以想让Epic识别之前下载好的UE4 二、参考: 1、UE4启动器是否有办法添加本地版本 https://blog.csdn.net/chinahaerbin/article/details/51150536 总结:good:此方法尝试都可以添加本地,下面我的过程更加详细 三、操作: 1、注意: ①如果发现复制文件夹时候如此提示,任务管理器中找不到,可以注销电脑 1、拿4.15.3测试(亲测:4.8.3、4.9.2、4.13.2、4.15.3、4.18.3、4.19.2、4.21.2成功) ①选择安装版本:为了避免安装冲突,我将文件夹名字从UE_4.15改为了UE_4.15OLD 点击安装 ①然后目录下面就有了UE_4.15 ①等到文件夹中有.egstore文件时候,暂停、关闭安装,然后将UE_4.15OLD文件夹内容全部剪切到UE_4.15文件夹中 ①然后再次EPIC中点击继续,它自己就会安装、验证我们之前下载UE4版本,之后就是Epic识别本地的UE4版本了,过一段时间就好了,能够启动了

最详细的图解二叉排序树和平衡二叉树(定义,区别,构造)

二叉排序树(又称二叉查找树) 即左子树要比根大,而右子树要比根小 这棵树最好的情况就是形成一颗完全二叉树 这时候,他的高度是最低的,最多要查找的次数也是最少的,最差的情况就是高度为n(刚好n是所有节点数),完全就是一个线性结构的时候 这里就引出了平衡二叉树 二叉平衡树实际上是对不平衡的二叉排序树进行处理 如果不平衡要怎么办–进行平衡化处理 例子 上图从宏观上看:e的根节点会变成他的左子节点,而整棵树的根节点会变成他的右子节点 F比E小,比b大,所以就成了这样的位置 加了个g还是LR型怎么办, g比e大比a小所以加这个位置 搞个例子

实战02-selenium模拟QQ邮箱登录并批量爬取指定邮件的附件——体验版

实战02-selenium模拟QQ邮箱登录并批量爬取指定邮件的附件 1.功能需求2.直接上代码3.数据作证4.掉坑经历 1.功能需求 诞生的背景:作为一个学委,尤其受疫情影响,同学发的一大堆邮件单个下载非常耗时,而且无聊。 由此想到了用爬虫可以批量抓取,学了一天,果断四处找资源,终于可以解放收作业了(不过,还有待完善的地方,后面再贴出来) 这个爬虫脚本实现的功能:首先模拟用户登录(通过账号、密码)qq邮箱,然后进去收件箱后,获取已读/未读的邮件列表, 写了个正则表达式用于筛选指定的邮件(可按需你需求替换正则模板即可),接着点进去下载附件(也就是,这也有个隐式条件, 里面一定要有附件,且只下载一个,这也是不够完善的地方)。下载完后直接返回,如此循环遍历(怪我写的很粗糙:)批量下载指定的文件 2.直接上代码 from selenium import webdriver from selenium.webdriver.common.by import By from selenium.common.exceptions import TimeoutException from selenium.webdriver.support.ui import WebDriverWait from selenium.webdriver.support import expected_conditions as EC from config import * import time import re # 这里是浏览器驱动路径,也可防止系统环境变量就不用指定了 browser = webdriver.Chrome(executable_path="./chromedriver.exe") wait = WebDriverWait(browser, 10) # 设置下隐式等待时间10s def mail_qq_login(): try: browser.get("https://mail.qq.com/") browser.switch_to.frame("login_frame") login_bt = wait.until( EC.presence_of_element_located((By.CSS_SELECTOR, '#switcher_plogin')) ) login_bt.click() # 账号密码登录 qq_nb = wait.until( EC.presence_of_element_located((By.ID,"u")) ) qq_pw = wait.

Windows系列:解决win10 cannot initialize winsock library !

现象 chrome浏览器可以上网,其他软件都无法上网! 原因 某些原因导致注册表的winsock项被删除, 导致无法上网。 解决方法 重新创建winsock,下载允许即可重新创建。 链接:https://pan.baidu.com/s/1dIHwx5v3kLWY8T8bANP-uw 提取码:r6vv

什么是socket.Io

什么是socket.Io? SocketIO是在客户端和服务端之间建立的双向通信数据交换技术,底层使用EngineIO。SocketIO的的客户端使用Engine.IO-Client,服务端使用Engine.IO实现。 Socket.Io如何工作 当一个浏览器尝试建立SocketIO时,SocketIO首先使用xhr-polling创建一个长轮询。长轮询一旦建立,它将升级为WebSocket连接。 SocketIO底层是使用EngineIO库实现的,这个库使用WebSocket和XMLHttprequest封装了一套自己的Socket协议(暂时叫 EIO Socket)。一个完整的 EIO Socket 包括多个 XHR 和 WebSocket 连接. 客户端 EIO Socket 通过一个 XHR (XMLHttprequest) 握手。前端发送一个 XHR,告诉服务端我要开始 XHR 长轮询了。后端返回的数据里面包括一个 open 标志(数字 0 表示), 以及sid 和 upgrades 字段,ping时间间隔,ping超时时间。 0{ "sid": "8b7ab1ae-fbcf-4d23-8192-3c14a2a90721", "upgrades": [ "websocket" ], "pingInterval": 10000, "pingTimeout": 60000 } 服务端 服务端使用 ws 库实现 WebSocket 协议。http://socket.io 服务启动时,会先启动一个 ws 服务。http://socket.io 会监听 HTTP 服务器的 upgrade 和 request 事件。当 upgrade 事件触发时,说明可能是 WebSocket 握手,先简单校验下,然后把请求交给 ws 服务进行处理,拿到 WebSocket 对象。当 request 事件触发时,根据 url 路径判断是不是 http://socket.

关于nomogram核心函数的time.inc函数的设定

转载自品略图书馆 http://www.pinlue.com/article/2020/03/3020/5510072525626.html 建立一个模型后,我们常常会评价模型的区分度(discrimination)和校准度(calibration)。生存模型中,我们经常会看到使用calibration图来呈现模型的校准度。笔者近期查阅了网上许多绘制calibration图的R代码,发现很多代码忽略了time.inc参数的使用,甚至注释中提到了这个参数的重要性却仍然用错了。将愚见记录与此,若有理解错误,烦请大佬指正。 发现这个问题是源于丁香园中一个讨论(关于R语言做calibration curve的相关问题),其中一个人提出“需要注意的是cph()建立模型的时候,time.inc参数的数值应该和calibrate()函数中参数u保持一致,例如3年就都是36。” 笔者首先查阅网上的相关代码,有的代码中会注释到time.inc需与参数u一致,但是却将time.inc局限地理解为建立Nomogram时的利用predictor计算survival的生存函数中的time参数。实际上在建立cph()时就应该预先设定好相应的time.inc参数的值。之前笔者也不确定这个参数的设置是否真的这么重要,然后就在自己的数据中进行尝试和比较,发现得到的calibration图差别比较大,于是找到rms包的源代码,发现其中calibrate.cph.s文件中如下几行和这个问题相关: #获取生存预测模型的summary ssum <- fit$surv.summary if(!length(ssum)) stop('did not use surv=TRUE for cph( )') cat("Using Cox survival estimates at ", dimnames(ssum)[[1]][2], " ", unit, "s\n", sep="") #获取每个层的2nd time(即u时刻)的平均生存率S #注意:此处不是基线风险函数h0 surv.by.strata <- ssum[2, , 1] #2nd time= at u, all strata xb <- fit$linear.predictors #获取Cox模型的predictor #注意:这里线性部分是减去了均值的 if(length(stra <- fit$strata)) surv.by.strata <- surv.by.strata[stra] #根据公式计算每个样本的生存率 survival <- as.vector(surv.by.strata ^ exp(xb)) 其中我们看到,计算的基线生存函数,是u时刻的基线生存函数,但是这个u值却直接取自fit的模型的summary中,并非我们之后在调用calibrate方法时设置的u参数(这么做也是为了使整体源代码更简洁,但却容易造成用户误用)。 根据这些,笔者认为,正确的calibration应该这么绘制(以下举例,且忽略了nomogram的绘制) coxm <- cph(Surv(time, status==1)~Age.+Grade.+Stage.+Surgery.+Size.+Site., x=T,y=T,data=All.data, surv=T, time.

Altium designer -- 基本规则设置--间距设置Clearance

Altium designer – 基本规则设置 (1) 间距设置Clearance 硬件设计 软件 Altium designer 10PCB设计 间距设置 规则名称1:Clearance 一般间距 - 最小间距:6mil/8mil (优先考虑8mil) 规则1:All 规则2:All 规则名称2:Clearance_IsGND GND网络间距 - 最小间距:15mil/12mil(优先考虑12mil) 规则1:InNet(‘GND’) 规则2:All AD10界面

echarts 数据堆叠柱状图情况下设置圆角问题

前言 众所周知,echarts是前端最受欢迎的一个可视化图标库,几乎满足了前端构建图表的大部分需求,但是使用框架最大的问题可能就是框架的可扩展性,自定义性。不过主流框架也都很好的解决了这些问题,现在就echarts的柱状图数据堆叠怎么给最上面的数据设置圆角进行说明 属性说明 首先我们来看下正常情况下设置圆角: 这是官方示例,代码如下: 看下效果: 属性stack 官方说明: 示例代码: 效果: 问题与解决 现在像上面的柱状图堆叠情况下需要设置圆角,因为不能保证哪个数据是最后出现在柱状图中的,所以不能固定给 series-bar 的 itemStyle 设置圆角,这是我们注意到官方文档有这么一条: 对的,我们可以对数据进行个性化设置,我们只需要进行判断即可:我们从数组的最后一项,也就是最后一天往前依次去判断,如果当前项数据为0,则给当前项设置个性化参数 itemStyle ,如果不为0,则继续往前,直到第一项为止。 好了我们看下示例代码: 最终获得的数据即为个性化设置后的,我们使用即可: 结语 学习与使用echarts必须得学会去看它的配置项文档,有针对性的去查找跟本身问题相关的属性说明,一般都会得到问题的答案,希望这篇文章能够帮到你,有问题欢迎讨论与指正

git merge 忽略一个文件

实验环境: git version 1.8.3.1,centos7.6 背景:很多时候,由于特定的分支对应特定的环境,有特定的配置文件,希望合并分支的时候,保留各自的配置文件。 网上很多使用 .gitattributes 的方案,但是这个需要被忽略的文件merge 时产生冲突,否则无效 本实验方案如下:合并时忽略 myfile.txt git merge --no-ff --no-commit <merge-branch> git reset HEAD myfile.txt git checkout -- myfile.txt git commit -m "merged <merge-branch>" 参考文章 Git - Ignore files during merge

黑客游戏网址大全 – HACK GAME COLLECTION

原文链接:https://www.forece.net/post/2513.htm 不知道是不是很多人像我一样,很喜欢这类黑客解谜游戏,感觉很锻炼脑子,当时黑客防线推出那款黑客游戏,有一关,我想了足足8个小时,也不觉得累。后来华夏等网站相继推出黑客游戏,我是乐此不疲。在网上也找了很多国外的黑客游戏。这里是我收集的一些黑客游戏,有网页版的,有客户端版的。对于黑客游戏,不仅仅是锻炼自己的推理能力,而且还能让自己的思维更加活泼。不过电脑小白就不要玩了。。。。。。。很可能想爆了脑袋也过不去一关。这里需要很多的知识,Java, PHP, HTML, Javascript等网页语言,另外有的游戏还需要了解程序的加壳脱壳,加密与解谜,精通各种操作系统,游戏很多,大家自己随意玩吧。 Monyer系列(黑客游戏) 1. http://monyer.com/game/game1/ (中文) 2. http://monyer.com/game/game2/ (英文) Sunnyspeed系列(英文)- 解谜类 1. http://sunnyspeed.com/puzzle/ (英文) 2. http://sunnyspeed.com/secret/ (英文) 3. http://sunnyspeed.com/crazy/ (英文) Hack Forever(英文)- 实战攻防类 http://www.hackerforever.com Hacker Funny Game(英文) - 模拟实战攻防类 (FLASH GAME) http://www.funnygames.co.nz/play/hacker Hacker Skills(英文) - 网页过关类 http://www.hackerskills.com/ Uplink (英文) - 模拟 Linux 攻防 (需下载游戏) http://www.introversion.co.uk/uplink/ UPLINK 是一款基于Linux平台的黑客模拟游戏.玩家在其中扮演一位神通广大的黑客为UPLINK公司工作,窃取各大公司的数据库机密资料. 深受广大游戏玩家的喜爱. 游戏里不需要你懂得太多的专业知识,反而会教你许多东西,只要你英语过得去.你是作为UPLINK的一个黑客,注册了以后你会得到一笔初始的资金和初始的软 硬件.如果你熟悉黑客的知识,你可以自己去做,如果不会的话,会有一个教学模式一步一步的教你,我这个菜鸟也看得懂要做什么.然后你的等级会上升,你就可 以正式在UPLINK的SERVER上联系客户,接取工作,完成工作就会获得回报(当然是钱啦)等级越高,任务的难度就会越高.在SERVER里,你还可 以买到更厉害的软件和硬件,让你容易完成任务。 51CTO - 黑客游戏系列 (中文) - 实战攻防类 第一季【原创:黑客游戏Ⅰ】危险的telnet(http://bbs.51cto.com/thread-659015-1.html) 第二季【原创:黑客游戏Ⅱ】致命的SA权限(http://bbs.51cto.com/thread-659512-1.html) 第三季【原创:黑客游戏Ⅲ】神秘的远程桌面端口(http://bbs.51cto.com/thread-659854-1.html) MOX-X (英文)- 综合类 http://www.mod-x.co.uk/main.php Hacker Evolution (英文) - 模拟攻防类 (需下载游戏)

[Linux]Ubuntu安装vnc并解决花屏问题

原创文章,欢迎转载。转载请注明:转载自 祥的博客 原文链接:https://blog.csdn.net/humanking7/article/details/105203744 文章目录 @[toc] 0. 环境1.基本概念2. 安装设置vnc4serverstep1. 安装vnc4serverstep2. 设置密码step3. 修改xstartup文件step4. 安装gnomestep5. 重启系统,气动vnc服务step6. windows终端访问 3. 问题汇总解决1解决2 4. vncsever命令参考文献 Ubuntu安装vnc并解决花屏问题 0. 环境 Ubutun 16.04.06 LTS 1.基本概念 VNC:VNC (Virtual Network Console)是虚拟网络控制台的缩写。它 是一款优秀的远程控制工具软件,由著名的 AT&T 的欧洲研究实验室开发的。 Ubuntu 存储库中还有几种不同的 VNC 服务器,如 TightVNC , TigerVNC 和 x11vnc 。每个 VNC 服务器在速度和安全性方面都有不同的优点和缺点。 2. 安装设置vnc4server step1. 安装vnc4server apt-get install vnc4server step2. 设置密码 输入vncserver,初次启动的时候需要设置初始密码,密码最少6位。 root@x60s:~# vncserver You will require a password to access your desktops. password: Verify: New 'X' desktop is x60s:1 Starting applications specified in /root/.

Deepin v20安装过程详细步骤

Deepin v20安装步骤操作 版本选择: 1启动虚拟机,按回车键继续操作,如图1所示。 如图1所示 2、选择语言 “简体中文”,并勾选“我已仔细阅读并同意…”如图2所示。 如图2所示 3、点击继续安装 ,如图3所示 如图3所示 4、选择安装位置,点击“开始安装”,如图4所示。 如图4所示 5、点击继续,如图5所示 如图5所示 6、等待系统安装完成即可,大约10分钟左右地时间,如图6所示。 如图6所示 7、安装完成,按提示先移除安装介质,再重新启动,如图7所示。 如图7所示 8、选择时区,“上海”,点击“下一步”,如图8所示。 如图8所示 9、创建用户,如图9所示。 如图9所示 10、等待“优化系统配置”完成,如图10所示。 如图10所示 11、输入密码,如图11所示。 如图11所示 12、选择普通模式,如图12所示。 如图12所示 13、UOS系统安装完成,界面如下。如图13所示。 如图13所示。 至此,Deepin v20 安装完成! 效果展示

pycharm,IDLE,Win10快捷键

快捷键 IDLE的快捷键 Ctrl+N:在IDLE交互界面下,用来启动IDLE编辑器 Ctrl+Q:退出IDLE Shell 或 IDLE编辑器 Alt+3:在IDLE编辑器内,注释选定区域文本 Alt+4:在IDLE编辑器内,解除注释选定区域文本 Alt+Q:在IDLE编辑器内,将python代码进行格式化布局 F5:在IDLE编辑器内,执行python程序 pycharm的快捷键 Ctrl+Alt+T:surround with(代码前后添加if:,try…except…等) Ctrl+Shift+Delete:Remove(删除代码周围的语句) Ctrl+/:Comment(注释)再按一次取消注释 Ctrl+Alt+L:Reformat code(调整及规范代码) Ctrl+Alt+o:Optimize imports(优化导入的模块) Ctrl+Shift+向上箭头:Move statement up Ctrl+Shift+向下箭头:Move statement Down Alt+Shift+向上箭头:Move line up Alt+Shift+向下箭头:Move line Down Shift+enter : (任意位置换行) Tab/Shift+Tab :(缩进/取消缩进) Ctrl+D :(复制当前行) Ctrl+Q :(快速查看文档) Ctrl+左键 :(简介及代码定义) 双击Shift : (万能搜索,快速查找) Ctrl+Y : (删除选定的行) ToDo注释:#ToDo(作者):描述 jupyter notebook的快捷键 Tab : 代码补全或缩进 Shift+Tab : 提示 Ctrl+] : 缩进 Ctrl+[ : 解除缩进 Ctrl+Home : 跳到单元开头 Ctrl+Up : 跳到单元开头 Ctrl+End : 跳到单元末尾 Ctrl+Down : 跳到单元末尾 Ctrl+Left : 跳到左边一个字首 Ctrl+Right : 跳到右边一个字首 Win10快捷键 Win+Tab:时间轴,查看任务视图(也可以触控板三指向上划) Win+D/Win+M:显示桌面(也可以触控板三指往下划) Win+E:打开文件资源管理器 Win+L:锁屏,睡眠 Win+I:打开设置 Win+R:打开运行窗口 Win+S:打开搜索 Ctrl+p:快捷打印 Ctrl+Alt+Del:打开任务管理器菜单 Alt+Tab:任务切换 Ctrl+Win+D:创建虚拟桌面 Win+Ctrl:切换桌面

查找元素在数组中的索引 17

查找元素在数组中的索引 需求分析 已知一个数组 arr = {19, 28, 37, 46, 50}; 键盘录入一个数据,查找该数据在数组中的索引。并在控制台输出找到的索引值。如果没有查找到,则输出-1 步骤分析 1、定义一个数组。 2、接收用户输入一个数据。 3、定义一个方法接收数组和查询的数据,然后在方法中看是否在数组中存在,存在返回元素的索引值,不存在返回-1。 4、调用方法传入数组和数据,得到方法的返回结果。 注意:在方法中需要传进两个数据,一个是数组,一个是键盘录入的数据,不然键盘录入的数据在方法中会显示没有定义。 public class ExecDemo { public static void main(String[] args) { // 1、定义一个数组。 int[] arr = {19, 28, 37, 37, 46, 50} ; // 2、接收用户输入一个数据。 Scanner sc = new Scanner(System.in); System.out.print("请输入您要查找的数据:"); int data = sc.nextInt(); // 4、调用方法传入数组和数据,得到方法的返回结果。 int index = getDataIndex(arr , data); System.out.println(index); } // 3.定义一个方法等着该功能 public static int getDataIndex(int[] arr , int data){ // 5.

sysctl

sysctl命令用于运行时配置内核参数,这些参数位于/proc/sys/目录,可以使用sysctl修改系统变量,也可以通过编辑/etc/sysctl.conf文件来修改系统变量。 sysctl (选项) (参数) 选项 -n:打印值时不打印关键字; -e:忽略未知关键字错误; -N:仅打印名称; -w:当改变sysctl设置时使用此项; -p:从配置文件“/etc/sysctl.conf”加载内核参数设置; -a:打印当前所有可用的内核参数变量和值; -A:以表格方式打印当前所有可用的内核参数变量和值。 参数 变量=值:设置内核参数对应的变量值。sysctl变量的设置通常是字符串、数字或者布尔型。 临时改变某个系统参数的值,如果系统重启,或执行了 service network restart命令,所设置的值即会丢失。例如想启用IP路由转发功能, #echo 1 > /proc/sys/net/ipv4/ip_forward 或者 #sysctl -w net.ipv4.ip_forward=1 永久保留配置,可以修改/etc/sysctl.conf文件,并重新加载系统参数sysctl -p net.ipv4.ip_forward=1

tkinter 点击退出执行的程序

当点击右上角的差号时,程序进行弹框提示 from tkinter import Tk from tkinter import messagebox root = Tk() # 当点击右上角退出时,执行的程序 def on_closing(): if messagebox.askokcancel("Quit", "Do you want to quit?"): root.destroy() # WM_DELETE_WINDOW 不能改变,这是捕获命令 root.protocol('WM_DELETE_WINDOW', on_closing) root.mainloop()

常见的深度学习面试题及解答(一)

往期回顾 深度学习100问 精彩系列 常见的深度学习面试题及解答(二) 常见的深度学习面试题及解答(三) 1. 在训练过程中,若一个模型不收敛,那么是否说明这个模型无效?导致模型不收敛的原因有哪些? 不能说明这个模型就是无效的,造成模型不收敛的原因有很多,可能经过调整,模型效果很好。 原因: 数据分类的标注不准确,样本的信息量太大导致模型不足以fit整个样本空间。学习率设置的太大容易产生震荡,太小会导致不收敛。可能复杂的分类任务用了简单的模型。数据没有进行归一化的操作。 https://blog.csdn.net/weixin_35479108/article/details/96981548 2. 什么是梯度消失? 神经网络中,当前面隐藏层的学习速率低于后面隐藏层的学习速率,即随着隐藏层数目的增加,分类或识别准确率反而下降了。这种现象叫做消失的梯度问题。 3. 图像处理中锐化和平滑的操作? 锐化就是通过增强高频分量来减少图像中的模糊,在增强图像边缘的同时也增加了图像的噪声。 平滑与锐化相反,过滤掉高频分量,减少图像的噪声使图片变得模糊。 4. Relu比Sigmoid的效果好在哪里? Sigmoid的导数只有在0的附近时有较好的激活性,而在正负饱和区域的梯度趋向于0,从而产生梯度弥散的现象,而relu在大于0的部分梯度为常数,所以不会有梯度弥散现象。Relu的导数计算的更快。Relu在负半区的导数为0,所以神经元激活值为负时,梯度为0,此神经元不参与训练,具有稀疏性。 5. 请你简要描述一下,VGG使用3*3卷积核的优势是什么? 2个3*3的卷积核串联和5*5的卷积核有相同的感知野,前者拥有更少的参数。多个3*3的卷积核比一个较大尺寸的卷积核有更多层的非线性函数,增加了非线性表达,使判决函数更具有判决性。 https://www.cnblogs.com/zhangyang520/p/10969960.html 6. 防止过拟合的方法有哪些? 重新清洗数据增大数据量采用正则化方法dropout 面试之深度学习中的过拟合问题 7. 请你简要介绍一下RNN RNN的输出不仅是基于当前的输入,还会基于先前的隐态。RNN与普通神经网络的不同之处在于隐态中有一个循环,这表明是如何利用先前的隐态来计算输出的。由于每个输出的梯度不仅与当前的时间步有关,而且还取决于先前的时间步。因此,将反向传播过程称为基于时间的反向传播。 深度学习之循环神经网络(RNN) 8. 请你谈一下对于SGD,Momentum,Adagard,Adam原理的认识 (1). SGD: 随机梯度下降,每一次迭代计算数据集的mini-batch的梯度,然后对参数进行更新。 (2). Momentum: 参考了物理中动量的概念,前几次的梯度也会参与道当前的计算中,但是前几轮的梯度叠加在当前计算中会有一定的衰减。 (3). Adagard: 在训练过程中可以自动变更学习的速率,设置一个全局的学习率,而实际的学习率与以往的参数模的和的开方成反比。 (4). Adam: 利用梯度的一阶矩估计和二阶矩估计,动态调整每个参数的学习率,在经过偏置的校正后,每一次迭代后的学习率都有个确定的范围,使得参数比较平稳。 https://blog.csdn.net/weixin_42338058/article/details/93792205 9. 请你简要讲一下,当训练集中类别不均衡时,哪个参数最不准确?如何解决? 当训练集中类别不均衡时,参数 — 准确度(Accuracy) 最不准确。 解析:举例,对于二分类问题来说,正负样例比相差较大为99:1,模型更容易被训练成预测较大占比的类别。因为模型只需要对每个样例按照0.99的概率预测正类,该模型就能达到99%的准确率。 解决办法: 扩大数据集尝试其他分类指标: 混淆矩阵、精确度、召回率、F1得分(精确度与召回率的加权平均)对数据集进行重采样尝试不同的分类算法 (决策树往往在类别不均衡数据上表现不错) 10. 请你说一下,哪些神经网络中会发生权重共享? 卷积神经网络、循环神经网络会发生权重共享 所谓的权重共享就是说,输入一张图片,这张图片是用一个filter进行卷积操作的时候,图片中的每一个位置都被同一个filter进行卷积,所以权重是一样的,也就是共享。这个是在一个卷积层操作的时候的权重共享,另一个卷积层是利用另一个filter对图片进行扫描,实现权重共享的。 神经网络中权重共享的理解

数列求和-加强版 (20分)(C语言实现)

数列求和-加强版 (20分) 哈哈这个题太有意思了~~ 给定某数字A(1≤A≤9)以及非负整数N(0≤N≤100000),求数列之和S=A+AA+AAA+⋯+AA⋯A(N个A)。例如A=1, N=3时,S=1+11+111=123。 输入格式: 输入数字A与非负整数N。 输出格式: 输出其N项数列之和S的值。 输入样例: 1 3 输出样例: 123 c语言实现代码 #include<stdio.h> int main(){ int num[100002]={0}; int a,n,sum,tp; sum=0; scanf("%d %d",&a,&n); if(n==0) printf("0"); for(int i=0;i<n;i++){ sum=a*(n-i)+sum; num[i]=sum%10; sum=sum/10; } if(sum!=0) printf("%d",sum); for(int j=n-1;j>=0;j--) printf("%d",num[j]); return 0; } 这个有意思~~

图形学之图像信号处理

图像信号处理在图形学中有举足轻重的作用,这节博客对图像的采样、滤波和重构进行简要总结。 一、离散图像滤波 图像中最广泛的应用是使用简单的卷积滤波器。通过与一般的低通滤波器(从盒式滤波器到高斯滤波器)进行卷积,实现对图像的模糊化处理。例如下图中高斯模糊看起来很平滑,被广泛使用。 二、反走样技术 在图像合成中,对于连续数学公式表示的图像,常常需要产生一幅对应的采样图像(例如:光线追踪)。 对于连续的二维信号(图像),需要基于规则的二维点阵进行采样,否则容易出现各种走样情况。例如下图效果: 走样原因是图像中包含很多小尺度特征。在采样之前,需要滤波去掉这些特征。例如:盒式滤波器会改善突变边缘,但是仍会产生莫尔图案;高斯滤波抑制莫尔效果较好,但是会使图像整体偏向模糊。例如下图: 三、重构与重采样 当对滤波要求较高时,重采样是常见的图像运算之一。重采样就是改变图像大小。 高像素调整为低像素显示的两种方法: 看作是删除像素。在留下的像素之间去掉一个或者两个像素。可以实现压缩图像的目的,但是图像质量变低。对图像重采样。首先根据输入样本重构一个连续函数,然后对函数进行采样。为了避免走样,在每一步均要选择合适的滤波器。 例如下图示例,原始图像为\(12 \times 9\)像素,而新图像是\(8 \times 6\)像素。在每一维,输出像素数是输入像素数的 2/3,因此图像上的像素间隔是原始图像的 3/2。 ’空心黑圈‘ 为输入样本点,’实心黑点‘ 为输出样本点。 为了给每个输出样本赋值,需要计算样本之间的图像值。像素删除方法提供方法:取输入图像中与样本最近的值作为输出值(等价“用一个像素宽的盒式滤波器重构图像,再进行点采样”)。 重采样包括:重构滤波和采样滤波。因为序列中的两卷积滤波可以用单一的滤波器来代替,因此只需要重采样滤波器(同时起到重构和采样的作用)。

海思 强制销毁VB功能

插入hi35xx_base.ko时加上模块参数vb_force_exit=1,可允许用户在程序退出时不用手 动销毁VB,而由系统强制销毁VB。 注意: 此功能不是规范安全的做法,建议客户还是应该在退出程序时释放已申请的资源,禁 止在使用时强制销毁资源。

双端队列的实现——C语言

题目要求: 插入和删除元素只能在同一端进行,队列的插入操作和删除操作分别在两端进行,与它们不同的,有一种双端队列(deque),其插入和删除操作都可以在两端进行。写出4 个时间均为0(1)的过程,分别实现在双端队列的两端插人和删除元素的操作,该队列是用一个数组实现的。 解题思路: 利用数组来存储元素,设置两个变量head和tail,分别记录队列头部元素的下标和尾部“将要插入”元素的下标。从尾部入队时,tail+1,如果到了数组最后,则折返到0。从头部出队时,head+1,如果到了数组最后,则折返回0。从尾部出队时,tail-1,如果到了0再减则回到数组最后元素。从头部入队时,head-1,如果到了0再减则回到数组最后元素。 代码如下: #include<stdio.h> struct Deque{ int a[20]; int head;//第一个元素的下标 int tail;//将要插入元素的下标 }; void insert_head(struct Dequeue *q,int n){ if((q->tail+1)==q->head){ printf("Queue has no room!\n"); return; } q->head = (q->head-1)%20; q->a[q->head] = n; } void insert_tail(struct Dequeue *q,int n){ f((q->tail+1)==q->head){ printf("Queue has no room!\n"); return; } q->tail = (q->tail+1)%20; q->a[q->tail] = n; } int delete_head(struct Dequeue *q){ if(q->head == q->tail){ printf("Queue has no node!\n"); return -1; } int n = q->a[q->head]; q->head = (q->head+1)%20; return n; } int delete_tail(struct Dequeue *q){ if(q->head == q->tail){ printf("