三极管恒流源LED驱动电路(Proteus)

1 整流电路 整流电路如下,电压源参数设置为220v,50hz;设计整流桥对交流电整流 电流流经方向如图标注: 得到的整流电流如下: 黄色表示电压源信号,蓝色表示整流后的信号 将波形放大,发现存在部分截止,原因是二极管存在压降 2 恒流源驱动电路 设计如下 将整流电路中的R1电阻换成10uf的储能电容(一般选用耐压高的电解电容) 三极管处于放大状态,即Ube两端压降为0.6V左右,除以120欧电阻,得到Ie电流为5mA,所以Ic≈Ie=5mA; 【注意】记得给整流电路负端添加GND,否则Proteus仿真报错 用示波器检查波形,基本满足恒流 但仍带有部分纹波

DNS服务解析与原理笔记

引言DNS介绍DNS原理与解析DNS查询DNS服务搭建DNS劫持和污染计算机面试 or 真题DNS应用扩展参考与推荐 引言 我想很多人遇到过这样一种情况,电脑突然上不了网了,或者说可以登陆QQ,但是进不了网页,任何网页都会出现如下的类似截图: 有些浏览器可能还要再多一层,会弹出故障检测,然后再是DNS配置选项错误,这时候的解决方案,可以是用本地安装的电脑管家的工具箱里,找到“网页打不开”的故障维修功能,大概率是能修复的,当然,也可以手动去更新配置,见百度知道里的DNS修改步骤: 全部过程链接为:https://baijiahao.baidu.com/s?id=1726267633457240930&wfr=spider&for=pc 那么本篇就是想探究一下DNS的相关原理,更加系统的记录一下DNS从查询,搭建到扩展的应用,如下内容将主要使用Linux演示。 DNS介绍 DNS 是 Domain Name System(域名系统)的简称,DNS 是一个分层的分布式命名系统,用于连接到互联网或专用网络的计算机,服务或其他资源。它将各种信息与分配给每个参与实体的域名关联起来。 简单来说其最大的功能就是将域名翻译成 IP 地址,例如bilibili的 IP 地址就是一串毫无规则的数字,其中之一为110.43.33.47,或者ping www.bilibili.com后查询到的IP为157.148.134.11,这不利于记忆,且因为有CDN等因素外,并不唯一,同样,同个IP,也可以具有多个DNS,这个后续会解释原因,所以,还是直接输入B站的com域名更加方便。 域名是由多个部分构成的,跟人的名字一样,由姓氏与名字组合而成,构成域名的每个部分称为一个区域(zone),主要是这样分级的:主机名.二级域名.顶级域名. 这样通常就代表了一个IP,而域名的集合成的系统,可以看成是一个IP地址和域名相互映射的分布式数据库,就像一本家族的族谱。 如果需要查询得更快,本地会有一个local DNS服务器,Windows中的位置位于C:\Windows\System32\drivers\etc下的hosts文件: 而在Linux中,可直接用vim打开/etc/hosts文件查看所添加的DNS情况,比如我就在原来基础上加了一些我需要的,一般该文件存放常用的 DNS 记录与开发中测试使用的服务器记录: 127.0.0.1 localhost 140.82.114.4 github.com 199.232.69.194 github.global.ssl.fastly.net 140.82.112.10 codeload.Github.com 23.64.114.78 ngc.download.nvidia.cn # The following lines are desirable for IPv6 capable hosts ::1 ip6-localhost ip6-loopback fe00::0 ip6-localnet ff00::0 ip6-mcastprefix ff02::1 ip6-allnodes ff02::2 ip6-allrouters 可以看到,hosts文件中分为了两部分,IP地址 + 域名的部分即为访问时会优先查询的一些链接,第二部分主要是ipv4或ipv6对应的地址,比如这里的::1是 IPv6 的本地地址表示方式,后面的类似。 以上就是本地添加DNS映射的操作,这里再列举一些常用的DNS服务选择: 首选DNS 备用DNS百度180.76.76.76124.251.124.251114114.114.114.114114.114.115.115腾讯119.29.29.29182.254.116.116阿里云223.5.5.5223.6.6.6谷歌8.8.8.88.8.4.4openDNS208.67.222.222208.67.220.220FreeDJS37.235.1.17437.235.1.177 一般来讲,较大的厂都设置了自己的DNS服务器,该添加哪个,哪个更好这些其实因人而异,作为远程的服务器,速度受到距离、请求方式等等制约,也有可能今天我添加Google的DNS感觉速度很快,明天发现就很慢了,emmm。。。那就是时空的第四维度了,说不得准,不过这个跟网速一样是有测试工具的,我在查找资料的时候,找到在Windows平台下的一个工具为: DNSspeeder,这里Mark一下,但我没找到官网,感觉是作者闲着无聊时写得一个小工具吧,Linux下应该也有,不过我没有详细找了,测速能比较清晰的看到DNS速度的可视化,但平常也不会将很多的地址往里加,麻烦不说也意义不大,下面将分析DNS解析的原理与结构。

15【简单】删除有序数组中的重复项

一、题目描述 给你一个 升序排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。 由于在某些语言中不能改变数组的长度,所以必须将结果放在数组nums的第一部分。更规范地说,如果在删除重复项之后有 k 个元素,那么 nums 的前 k 个元素应该保存最终结果。 将最终结果插入 nums 的前 k 个位置后返回 k 。 不要使用额外的空间,你必须在 原地 修改输入数组 并在使用 O(1) 额外空间的条件下完成。 判题标准: 系统会用下面的代码来测试你的题解: int[] nums = [...]; // 输入数组 int[] expectedNums = [...]; // 长度正确的期望答案 int k = removeDuplicates(nums); // 调用 assert k == expectedNums.length; for (int i = 0; i < k; i++) { assert nums[i] == expectedNums[i]; } 如果所有断言都通过,那么您的题解将被 通过。

【JavaScript】Map对象

Map 对象存有键值对,其中的键可以是任何数据类型。 Map 对象记得键的原始插入顺序。 Map 对象具有表示映射大小的属性。 基本的 Map() 方法 MethodDescriptionnew Map()创建新的 Map 对象。set()为 Map 对象中的键设置值。get()获取 Map 对象中键的值。entries()返回 Map 对象中键/值对的数组。keys()返回 Map 对象中键的数组。values()返回 Map 对象中值的数组。 Map() 属性 PropertyDescriptionsize获取 Map 对象中某键的值。 创建 Map 对象 能够使用对象作为键是 Map 的一个重要特性。 实例 // 创建对象 const apples = {name: 'Apples'}; const bananas = {name: 'Bananas'}; const oranges = {name: 'Oranges'}; // 创建新的 Map const fruits = new Map(); // Add new Elements to the Map fruits.set(apples, 500); fruits.

docker mysql 重新设置binlog

【mysql5.7.x默认没有开启】docker mysql开启 log_bin日志(mysql5.7.x) mysql ---> 为mysql的docker容器的name,你也可以使用mysql的docker容器的id 开启log_bin的docker容器配置 docker exec mysql bash -c "echo 'server-id=1' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'sync_binlog=1' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'log-bin=/var/lib/mysql/mysql-bin' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'binlog_cache_size=256M' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'binlog_format=mixed' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'binlog-ignore-db=mysql,information_schema,performance_schema,sys' >> /etc/mysql/mysql.conf.d/mysqld.cnf" docker exec mysql bash -c "echo 'lower_case_table_names=1' >> /etc/mysql/mysql.

使用__attribute__((at()))来进行绝对定位

定位结构体地址 typedef struct { uint32_t magic_word; /*!< Magic word ESP_APP_DESC_MAGIC_WORD */ uint32_t secure_version; /*!< Secure version */ uint32_t reserv1[2]; /*!< --- */ char version[32]; /*!< Application version */ char project_name[32]; /*!< Project name */ char time[16]; /*!< Compile time */ char date[16]; /*!< Compile date*/ char idf_ver[32]; /*!< Version IDF */ uint8_t app_elf_sha256[32]; /*!< sha256 of elf file */ uint32_t reserv2[20]; /*!< --- */ } sprt_app_desc_t; /* MDK AC5 */ __attribute__((at(0x08000000))) const uint32_t cnt; //cnt 0x08000000 Data 4 main.

Dockerfile构建Tomcat镜像

Dockerfile构建Tomcat镜像 构建步骤1 编写Dockfile文件2 dockcer build构建镜像3 docker run运行容器4 使用容器卷挂载 搜索镜像的个数 docker search tomcat |wc -l 因此,需要根据自己的项目需求来针对性的构建镜像 构建步骤 1 编写Dockfile文件 看成在编写一个纯净的LInux系统的计算机拥有的功能 Dockerfile文件内容是: FROM java:8 MAINTAINER xxx<xxx@163.com> WORKDIR /opt ADD ./apache-tomcat-9.0.71.tar.gz /usr/local WORKDIR /usr/local ENV TOMCAT_HOME=/usr/local/apache-tomcat-9.0.71 ENV PATH=$PATH:$TOMCAT_HOME/bin EXPOSE 8080 CMD startup.sh && tail -F /usr/local/apache-tomcat-9.0.71/bin/catalina.bat 2 dockcer build构建镜像 docker build -t mytomcat:v1 . 注意,镜像的命名不能大写。。。 查看所有镜像 3 docker run运行容器 docker run --name mytomcatv1 -d -p 8080:8080 mytomcat:v1 成功启动容器。。 再进入容器 docker exec -it 55 /bin/bash 成功构建完成。。

深入理解JVM(十五)垃圾回收相关概念

一、System.gc()的理解 在默认情况下,通过 System.gc () 或者 Runtime.getRuntime().gc() 的调用,会显式触发 Full GC,同时对老年代和新生代进行回收,尝试释放被丢弃对象占用的内存。 System.gc() 调用附带一个免责声明,无法保证对垃圾收集器的调用(无法保证马上触发 GC)。 以下代码如果注掉 System.runFinalization() ,那么控制台不保证一定打印,证明了 System.gc() 无法保证 GC 一定执行。 public class SystemGCTest { public static void main(String[] args) { new SystemGCTest(); System.gc();//提醒jvm的垃圾回收器执行gc,但是不确定是否马上执行gc //与Runtime.getRuntime().gc()的作用一样。 System.runFinalization();//强制调用使用引用的对象的finalize()方法 } @Override protected void finalize() throws Throwable { super.finalize(); System.out.println("SystemGCTest 重写了finalize()"); } } 手动 GC 理解不可达对象的回收行为 首先说明一个问题:开启了逃逸分析,没有逃逸的对象一定会在栈中分配吗? 在 Hotspot 中采用的是解释器和编译器并行架构,所谓的混合模式,就是解释器和编译器搭配使用,当程序启动初期,采用解释器执行(同时会记录相关的数据,比如函数的调用次数,循环语句执行次数),节省编译的时间。在使用解释器执行期间,记录的函数运行的数据,通过这些数据发现某些代码是热点代码,采用编译器对热点代码进行编译,以及优化(逃逸分析就是其中一种优化技术),也就是当成为热点代码才会通过逃逸分析优化。 再具体一点,逃逸分析有两个条件 不能逃出当前方法,--不可逃逸条件这个方法执行了上万次,才会执行逃逸分析的逻辑判断 以下的代码满足不可逃逸条件,但是不满足执行次数,不要认为这些都在栈上分配 // 执行GC,引用未释放,survivor区放不下10M数据,直接放入old区 public void localvarGC1() { byte[] buffer = new byte[10 * 1024 * 1024];//10MB System.

@Valid与@Validated区别

1.@Valid与@Validated作用 @Valid与@Validated都是用来校验接收参数的。 @Valid是使用Hibernate validation的时候使用 @Validated是只用Spring Validator校验机制使用 说明:java的JSR303声明了@Valid这类接口,而Hibernate-validator对其进行了实现。 @Validated与@Valid区别: @Validated:可以用在类型、方法和方法参数上。但是不能用在成员属性(字段)上,不支持嵌套检测 @Valid:可以用在方法、构造函数、方法参数和成员属性(字段)上,支持嵌套检测 注意:SpringBoot使用@Valid注解需要引入如下POM <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-validation</artifactId> </dependency> 2.为什么要用@Valid或@Validated @Valid与@Validated都是用来校验接收参数的,如果不使用注解校验参数,那么就需要在业务代码中校验,这 样会增加很多的工作量并且代码不优美。 @RestController @RequestMapping("/valid") public class ValidControllerTest { public static final Logger logger = LoggerFactory.getLogger(ValidControllerTest.class.getName()); @PostMapping("/login") public String doLogin(@RequestBody LoginUser loginUser){ if(StringUtils.isEmpty(loginUser.getPhone())){ //抛出异常 logger.error("伪代码抛出异常---可以用全局异常捕获"); } if(StringUtils.isEmpty(loginUser.getPassWord())){ //抛出异常 logger.error("伪代码抛出异常---可以用全局异常捕获"); } return "数据校验通过"; } } 如果需要判断多个参数,那就需要写多个if判断,这样会增加编码工作量并且这样写的不优美。 3.使用@Valid或@Validated来做一个简单的案例 如果@Valid|Validated校验不通过,那么错误信息就会封装到BindingResult对象了,可以通过 BindingResult的相关方法获取详细的错误信息并返回给用户。 代码如下: public class LoginUser { @NotBlank(message = "手机号码不能为空") private String phone; @NotBlank(message = "密码不能为空") private String passWord; } @RestController @RequestMapping("

jmeter安装及环境配置

一、安装jdk,配置jdk环境 1、下载所需要版本的jdk并安装 下载地址:http://www.oracle.com/technetwork/java/javase/downloads/jdk8-downloads-2133151.html (注:JDK—JAVA开发工具包、JRE—JAVA运行时环境、JVM—JAVA虚拟机) 2、配置jdk环境变量 1)、我的电脑–鼠标右键单击–选择属性 2)点击高级系统设置—点击环境变量 3)系统变量中找到JAVA_HOME、PATH、CLASSPATH进行如下配置 JAVA_HOME:D:\Program Files (x86)\Java\jdk1.8.0_131(jdk安装在哪个盘就写哪个路径) Path:%JAVA_HOME%\bin;%JAVA_HOME%\jre\bin(ps:尽可能保证%JAVA_HOME%\bin在path最前面) CLASSPATH:%JAVA_HOME%\lib\dt.jar;%JAVA_HOME%\lib\tools.jar 4)配置完成,打开cmd,验证jdk安装和配置是否成功 输入java -version 验证版本号,出现如下所示说明安装成功 输入java 验证系统环境变量PATH配置,出现如下则表示环境已配好 二、下载Jmeter 1、下载地址: 最新版本:http://jmeter.apache.org/download_jmeter.cgi 历史版本:http://archive.apache.org/dist/jmeter Source 是源代码版,你需要自己编译成可执行软件。 Binaries是可执行版,直接下载解压就可以拿来用的,已经编译好的版本 zip格式是windows系统的,tgz格式是linux系统 下载后解压放到对应位置(我解压到D盘tool文件夹下) 2、JMETER环境配置 1)我的电脑–鼠标右键单击–选择属性–点击高级系统设置—点击环境变量进行如下配置 JMETER_HOME:D:\Tool\apache\apache-jmeter-5.4.1 CLASSPATH:%JMETER_HOME%\lib\ext\ApacheJMeter_core.jar;%JMETER_HOME%\lib\jorphan.jar; Path:%JMETER_HOME%\bin 2)检查环境配置是否成功 cmd 输入jmeter看是否能启动一个jmeterGUI,启动说明配置成功 3、JMETER目录介绍及启动 jmeter的目录结构: bin目录:该目录存放的是jmeter的主jar包、主配置文件、启动脚本等 ApacheJMeter.jar:该目录是jmeter的主jar包,可以通过下列命令启动jmeter(java -jar ApacheJMeter.jar) jmeter.bat/jmeter:该目录是jmeter的启动脚本,我们一般可以通过编辑的方式来修改jmeter启动时的JVM参数,根据需 要去调 整JVM中的heap(内存)大小 jmeter.properties:该目录是jmeter的主配置文件,jmeter中超过80%以上需要配置的内容在该文件中实现(ps:配置文件修改后需要重新启动才会生效) docs目录:该目录下存放的是jmeter的api文档,用于二次开发 extras目录:存放的是jmeter和其他工具集成所需要的文件 lib目录:该目录是jmeter启动时默认的classpath,这就意味着在使用jmeter进行测试的过程中,所以需要import操作(报错:xx class not found)的累必须打成jar包放入lib目录(ps:lib修改后,必须重启jmeter后才生效) lib\ext目录:该目录时用来存放jmeter的组件、地三方的组件和插件的。(ps:组件、插件是指集成了jmeter的GUI框架,在GUI模式可见的部分) printable_docs目录:该目录存放的是jmeter的官方帮助文档 找到jmeter文件—bin—jmeter.bat启动

使用Workbook读取表格问题总结

使用Workbook读取表格问题总结 一、Workbook类型二、问题总结1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到?2.读取表格 一、Workbook类型 Workbook分三种类型: 1.HSSFWorkbook 用于Excel2003版及更早版本(扩展名为.xls)的导出; 2.XSSFWorkbook 用于Excel2007版(扩展名为.xlsx)的导出; 3.SXSSFWorkbook:相对前面两种,会在导出数据达到万以上的数据,会报内存不足,导致失败的问题。这时就要用到sxssf,来导出较大数据量 注: HSSFWorkbook和XSSFWorkbook的Excel Sheet导出条数上限(<=2003版)是65535行、256列,(>=2007版)是1048576行,16384列,如果数据量超过了此上限,那么可以使用SXSSFWorkbook来导出。实际上上万条数据,甚至上千条数据就可以考虑使用SXSSFWorkbook了。 经测试,同样向表格中写入50w条数据,使用SXSSFWorkbook向Excel中写入50万条数据,只需要34秒左右,内存占用率最多在700M左右,CPU使用率在25%左右;使用XSSFWorkbook内存占用率最多在2.1个G左右(占用了很大的内存),CPU使用率在90%左右,最后内存溢出了。。。 二、问题总结 1.SXSSFWorkbook为什么我Create了一万行Row但是却获取不到? 这时要注意到SXSSFWorkbook的构造函数中的rowAccessWindowSize 这个参数,会指定一个sheet可读取的row数目,超过该数目的row,会被写入到磁盘文件中,进而不能在通过getRow访问到,通过这种方式,内存使用空间就缩小很多了。 需要注意的是,如果该值指定为-1,说明不限制行数,所有记录都写入内存中;该值不能取0,因为这意味着任何新row都会写入磁盘,进而不能访问 2.读取表格 读取表格时先要用XSSFWorkbook加载,再用SXSSFWorkbook 构造,代码如下(示例): InputStream fis = new FileInputStream(file); XSSFWorkbook xssfWorkbook = new XSSFWorkbook(fis); SXSSFWorkbook workbook = new SXSSFWorkbook(xssfWorkbook, -1); 而且读取内容、行数等时要先调用getXSSFWorkbook。因为所有的初始模板记录存在于XSSFWorkbook中,需要用sxssfWorkbook.getXSSFWorkbook()方法去获取初始模板的行数据。这也可以解释为什么其构造函数中有XSSFWorkbook了。例如下面获取sheet页行数的方法: /** * 返回sheet 中的行数 * * @param sheetIx 指定 Sheet 页,从 0 开始 * @return */ public int getRowCount(int sheetIx) { //xlsx格式。将SXSSFWorkbook转成XSSFWorkbook,再获取XSSFSheet if (isXlsx) { XSSFSheet sheet = ((SXSSFWorkbook) workbook).getXSSFWorkbook().getSheetAt(sheetIx); return sheet.

自学CSS总结

1.CSS的导入方式 1.1 行内样式 <!-- 行内样式: 在标签元素中, 编写一个style属性, 编写样式即可 --> <h1 style="color: blue;">行内样式</h1> 1.2 内部样式 <!-- 内部样式 --> <style> h1 { color: yellow; } </style> 1.3 外部样式 <!-- 外部样式 --> <link rel="stylesheet" href="css/sheet1.css"> 优先级: 外部样式 < 内部样式 < 行内样式 遵循就近原则. 拓展: 外部样式有两种写法: 链接式: <link rel="stylesheet" href="css/sheet1.css"> 导入式: CSS2.1 特有的 <style> @import url("css/sheet1.css"); </style> 2.选择器 作用: 选择页面的某一个或者某一类元素 2.1 基本选择器 1.标签选择器: 选择一类标签: {} /** 标签选择器: 会选到页面上所有的这个标签的元素 */ h1 { color: cadetblue; background-color: blue; border-radius: 24px;/**圆角的边框*/ } p { background-color: aquamarine; } 类选择器class : 选择所有class 属性值一致的标签, 跨标签 .

8【简单】寻找数组的中心下标

一、题目描述 给你一个整数数组 nums ,请计算数组的 中心下标 。 数组 中心下标 是数组的一个下标,其左侧所有元素相加的和等于右侧所有元素相加的和。 如果中心下标位于数组最左端,那么左侧数之和视为 0 ,因为在下标的左侧不存在元素。这一点对于中心下标位于数组最右端同样适用。 如果数组有多个中心下标,应该返回 最靠近左边 的那一个。如果数组不存在中心下标,返回 -1 。 二、解题思路过程 /** * @param {number[]} nums * @return {number} */ var pivotIndex = function(nums) { /** (a,b)=>a+b 等价于 function(a,b){ return a+b; } reduce()简单用法,两个参数: 第一个参数放用于执行数组元素的函数; 第二个参数为可选值,是传递给函数的初始值,相当于在吧total传递给函数之前,令total=0。 */ var total=nums.reduce((a,b)=>a+b,0); var sum=0; // 遍历数组 for(var i=0;i<nums.length;i++){ sum=sum+nums[i]; // 因为要找到数组的中心下标,所以total应当等于左边或右边加和的二倍和再加中心数 // 而这里先将nums[i]加入到sum之中,再进行判断,则sum中重复计算了一个nums[i],所以应当减掉一个nums[i] // 再使其与total相等 if(total-sum==sum-nums[i]){ return i; }; }; return -1; }; 三、复杂度分析 时间复杂度:,n为数组nums的长度。 空间复杂度:,使用的额外空间复杂度为常数。

解决Logitech G HUB卡在一直在加载问题解决方法

图文教程请参考我的个人博客: https://zy.itwk.cc/archives/209.html 今天遇到了G HUB一直在加载,怎么也进不去,一直在转可能是由于杀毒软件或其他优化的软件把罗技的自动更新服务关了,导致G Hub在启动的的时候一直等待服务启动。 解决方法: 启动 LGHUB Updater Service 服务 1、按下 “Windows+R”键 搜索 输入 services.mac 【回车】 或者 点开搜索框,搜索**“服务”** 然后打开 2、在弹出的服务管理窗口中 找到 一个名为 "LGHUB Updater Service"的服务 双机打开 3、将启动类型更改为自动 即可解决问题

【JavaScript】数组操作

一、改变原始数组的方法: 1、pop() 删除 arrayObject 的最后一个元素,把数组长度减 1,并且返回它删除的元素的值。如果数组已经为空,则 pop() 不 改变数组,并返回 undefined 值。arrayObject.pop() 。 2、push() push() 方法可把它的参数顺序添加到 arrayObject 的尾部。它直接修改 arrayObject,而不是创建一个新的数组,arrayObject.push(newelement1,newelement2,….,newelementX) 。 3、reverse() 该方法会改变原来的数组----将原来的数组倒序,而不会创建新的数组。arrayObject.reverse()。 4、shift() 删除数组的第一个元素,并返回第一个元素的值,如果数组是空的,那么 shift() 方法将不进行任何操作。 5、unshift() unshift() 方法可向数组的开头添加一个或更多元素,并返回新的长度。arrayObject.unshift(newelement1,newelement2,….,newelementX)返回arrayObject 的新长度。 6、sort() 对数组的引用。请注意,数组在原数组上进行排序,不生成副本。arrayObject.sort(sortby) (如果调用该方法时没有使用参数,将按字母顺序对数组中的元素进行排序,说得更精确点,是按照字符编码的顺序进行排序。要实现这一点,首先应把数组的元素都转换成字符串(如有必要),以便进行比较。 如果想按照其他标准进行排序,就需要提供比较函数,该函数要比较两个值,然后返回一个用于说明这两个值的相对顺序的数字。比较函数应该具有两个参数 a 和 b,其返回值如下: 若 a 小于 b,在排序后的数组中 a 应该出现在 b 之前,则返回一个小于 0 的值。 若 a 等于 b,则返回 0。 若 a 大于 b,则返回一个大于 0 的值。) 7、splice() splice() 方法可删除从 index 处开始的零个或多个元素,并且用参数列表中声明的一个或多个值来替换那些被删除的元素。 如果从 arrayObject 中删除了元素,则返回的是含有被删除的元素的数组 arrayObject.splice(index,howmany,item1,…..,itemX) 。 二、不改变原始数组的方法: 1、concat()

三种JS截取字符串方法 slice(),substring()和substr()

JS提供三个截取字符串的方法,分别是:slice(),substring()和substr(),它们都可以接受一个或两个参数: var stmp = “rcinn.cn”; 使用一个参数 alert(stmp.slice(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn" alert(stmp.substring(3));//从第4个字符开始,截取到最后个字符;返回"nn.cn" slice 语法 string.slice(start,end) 不包括end 参数 描述 start 必须。 要抽取的片断的起始下标,第一个字符位置为 0。如果为负数,则从尾部开始截取。 end 可选。 紧接着要截取的片段结尾的下标。若未指定此参数,则要提取的子串包括 start。 end到原字符串结尾的字符串。如果该参数是负数,那么它规定的是从字符串的尾部开始算起的位置。slice(-2)。 表示提取原数组中的倒数第二个元素到最后一个元素(包含最后一个元素)。 切割字符串 var a = 'stings'; console.log(a.slice()) //stings console.log(a.slice(1)) //tings console.log(a.slice(1,2)) // t console.log(a.slice(-1)) //s console.log(a.slice(1,-1)) // ting 切割数组 var arr = [1,2,3,4,5]; console.log(arr.slice(1));//[2,3,4,5] 选择序列号从1到最后的所有元素组成的新数组。 console.log(arr.slice(1,3))//[2,3] 不包含end,序列号为3的元素 substr 所有主要浏览器都支持 substr() 方法 语法 string.substr(start,length) 参数值 start 必需。要抽取的子串的起始下标。必须是数值。如果是负数,那么该参数声明从字符串的尾部开始算起的位置。也就是说,-1 指字符串中最后一个字符,-2 指倒数第二个字符,以此类推。 length 可选。子串中的字符数。必须是数值。如果省略了该参数,那么返回从 stringObject 的开始位置到结尾的字串。 var str="Hello world!"; console.log(str.substr()) //Hello world!

uniAPP-- IOS原生APP插件项目,使用pod引入第三方依赖。测试,打包过程。

1,改造原有IOS-APP主项目为pod 项目 需要使用Cocoapods, Cocoapods 的安装,请自行百度。 打开终端,CD到APP主项目所在的目录。 终端中 输入 pod init 回车。 在项目所在目录会产生一个podfile文件,如下。 打开podfile文件中 添加依赖。 具体添加方法,参考下方示例说明。 # swift语言的版本 ENV['SWIFT_VERSION'] = '5' # 支持的平台 platform :ios, '13.0' target 'HBuilder' do # Comment the next line if you don't want to use dynamic frameworks use_frameworks! # Pods for HBuilder 添加第三方依赖 pod '依赖名称', '版本' end 添加第三方依赖后,继续在之前的终端(注意终端路径应在项目所在位置),输入 pod install 回车。 这时候会自动安装下载依赖。 成功后,会多出下面的一个后缀为xcworkspace的文件。 然后,打开这个后缀为xcworkspace的文件,即便完成了pod项目的改造。 2,插件项目中使用第三方依赖,以及构建插件包。 需要注意pod已经把第三方依赖添加到了IOS-APP主项目中。 不需要在插件项目中再次引用。 插件中使用 直接 #import 包含对应的.h文件即可。 插件测试开发测试完成,构建插件包的时候,需要把pod依赖的第三方库,放到插件包对应的ios文件夹下,并根据规范编辑package.json文件。

查找可用串口(Windows+Linux平台)

# 查找可用串口(Windows+Linux平台) def serial_ports(): """ Lists serial port names :raises EnvironmentError: On unsupported or unknown platforms :returns: A list of the serial ports available on the system """ if sys.platform.startswith('win'): ports = ['COM%s' % (i + 1) for i in range(256)] elif sys.platform.startswith('linux') or sys.platform.startswith('cygwin'): # this excludes your current terminal "/dev/tty" ports = glob.glob('/dev/tty[A-Za-z]*') elif sys.platform.startswith('darwin'): ports = glob.glob('/dev/tty.*') else: raise EnvironmentError('Unsupported platform') result = [] for port in ports: try: s = serial.

方差分析-单因素方差分析示例 (Between Subjects)

目录 1、从一个例子出发 2、建立零假设 3、什么是MSE和MSB 4、样本大小 5、计算MSE 6、计算MSB 7、比较MSE和MSB 8、分析差异的来源 本文将从一个例子(“微笑宽容实验”)出发,详细介绍单因素方差分析的原理。 1、从一个例子出发 有证据表明,微笑可以减弱人们对他人错误行为的判断,比如在法院上被告的微笑可能带来更少的惩罚。”微笑宽容实验“就是来研究不同类型的微笑带来的宽容程度是否有差异。在这个研究中,136名受试者被分到了4个不同的组,每组受试者会被展示不同微笑类型的图片(false、felt、miserable和neutral)。每位受试者都会给图片打一个score,用来代表受试者对图片里微笑的宽容程度。数据源在此。 2、建立零假设 方差分析的零假设为所有组别的总体均值都相等,即: 其中H0代表零假设,k代表组别。在“微笑宽容实验”中,k=4,并且零假设为: 如果零假设被拒绝,则表明至少有一个组的总体均值与其他组是不同的。 3、什么是MSE和MSB 方差分析是通过分析方差来检测均值差异的一种统计学方法。这种检测方法基于两种对总体均值()的估计。一种估计是基于分组内部得分的差异,被称为组内均方或误差均方(Mean Square Error,MSE)。无论零假设是否为真(总体均值相等),MSE都可以用来估计。另一种估计是基于组间均值之间的差异,被称为组间均方(Mean Square Between,MSB)。只有在总体均值相等时,MSB才能准确估计。如果总体均值不想等,MSB的估计值将会大于。因此,如果MSB比MSE大得多,那么总体均值是不太可能相等的。但是,如果MSB和MSE的值差不多,那么总体均值相等的零假设是成立的。 在计算MSE和MSB之前,需要先介绍方差分析的前提假设: 1)方差齐性(homogeneity of variance):总体方差是相等的。 2)正态分布(normally distributed):总体服从正态分布。 3)样本独立(independent sample):每一个样本值都是独立与其他样本值的。这个假设要求每名受试者只能提供一个样本值,因为如果一名受试者提供了两个样本值,那么这两个值必然不是独立的(这属于within-subjects ANOVA,不在本节内容中)。 以上假设对于双样本t检验也是一样的。 在“微笑宽容实验”中,首先需要计算4个组别的均值和方差: ConditionMeanVarianceFalse5.3683.338Felt4.9122.825Miserable4.9122.113Neutral4.1182.319 表1 “微笑宽容实验”各组的均值和方差 4、样本大小 后续方差分析的前提是每组受试者的数量是相等的(不相等的分析不在本篇考虑内)。我们用n来表示每组的受试者数量,用N来表示所有的受试者数量。在“微笑宽容实验”中,受试者被分到了4个组别,每个组别都是34人,所以我们有n=34,N=136。 5、计算MSE 我们前面做了方差齐性的假设,即假设每个组别的总体方差()都是相等的。这个就是MSE的估计值,我们可以通过计算样本方差的均值来得到: 6、计算MSB 对于样本均值抽样分布的方差(),有以下公式: 其中n是每组的样本数量。通过变换,可以得到: 因此,如果我们知道了,再乘以n就得到了总体方差。尽管我们不知道样本均值抽样分布的方差,我们可以通过样本均值的方差来估计它。对于“微笑宽容实验”,4个样本均值的方差为: 这里VAR.S()表示计算样本方差。 总结一下MSB的计算步骤: 1)计算样本均值 2)计算样本均值的方差 3)样本均值的方差乘以n 扼要重述 如果总体均值是相等的,那么MSE和MSB都可以认为是的准确估计,并且二者的值应当是相等的。当然,二者不会完全相等,因为他们是通过数据的不同角度计算得出的:MSB通过样本均值计算得出,而MSE通过样本方差计算得出。 当总体均值不相等时,MSE仍可以有效的估计,因为MSE是通过样本方差计算得到的,而总体均值的差异不会影响样本方差。但是,总体均值的差异会影响MSB对的估计,因为总体均值的差异与样本均值之前的差异是相关的。因此,如果样本均值之间的差异越大,MSB也会越大。 简而言之,无论总体均值是否相等,MSE都可以用来估计。然而,只有在样本均值相等的条件下,MSB才可以用来估计,并且当总体均值不相等时,MSB的估计值会偏大。 7、比较MSE和MSB 比较MSE和MSB是方差分析中至关重要的一步。既然当总体均值不相等时,MSB会比MSE的估计值更大,那么当计算出的MSB值比MSE值更大时,也就说明了总体均值是不相等的。但是即使当总体均值是相等的时候,也会偶然地发生MSB比MSE要大的情况,所以想要得到可靠的结论,MSB必须比MSE大的足够多。但是多大的MSB才算大呢?对于“微笑宽容实验”的数据来说,MSB 和MSE分别为9.178和2.649,这个差异足够大吗?为了回答这一问题,我们需要知道如果总体均值是相等的,达到这一差距或更大差距的概率是多少。统计学家Fisher从数学上回答了这一问题。尽管与Fisher最初的公式形式略有不同,但是确定概率的标准方法是都是基于MSB与MSE的比率。这个比率以Fisher命名,称为 F ratio。 对于“微笑宽容实验”的数据,F ratio为: 因此,MSB是MSE的3.465倍。如果所有组别的总体均值都是相等的,有可能得到这个结果吗?回答这个问题还要考虑样本数量。当样本数量很小时,得到这样的结果不足为奇,因为结果是不稳定的。可是,当样本数量很大时,MSB和MSE的值基本是不会改变的,所以F ratio为3.465或者更大是反常的。图1展示了“微笑宽容实验”的样本数量下,F的抽样分布。可以看到,分布是正偏态的。 图1 F的分布 从图1可以看出,3.465或更大的F ratio是反常现象。3.465右侧黑色区域的面积,代表得到此F或者更大F的概率,这个概率值为0.018。换句话说,零假设“总体均值是相等的”的概率值(p value)为0.018,所以我们可以拒绝零假设。于是,我们得到结论:至少有一个组的总体均值是不同于其他组的。 F分布的形状取决于样本数量。更准确地说,分布的形状取决于两个自由度(df):一个是分子的自由度(MSB),另一个是分母的自由度(MSE)。我们都知道方差估计值的自由度等于样本数量减一,MSB是k个均值的方差估计,所以它的自由度为k-1。MSE是k个方差的均值,每个方差的自由度都是n-1,所以MSE的自由度为k(n-1)=N-k,其中N代表总样本数量,n代表每组的样本数量,k代表组数。总结如下: 对于“微笑宽容实验”,我们有:

Java 互相关联的实体无限递归问题的解决

Java 互相关联的实体无限递归 今天在测试的时候出现了一个bug,在把关联实体序列化返回的过程中报错了,提示 Caused by: java.lang.StackOverflowError: null 这个是堆栈溢出错误,根据错误线索查找,最后发现Column和Table实体互相关联,也就是说 Column实体中有Table属性,Table实体中也有Column属性,导致了在序列化的过程中出现了死循环,无限递归,以至堆栈溢出报错。 在Jackson2.0以前的解决办法是 在关联的属性上添加 @JsonBackReference 或者 @JsonIgnore 注解中的一个即可。但是从Jackson2.0以后的版本开始,提供@JsonIdentityInfo注解实现这个问题的解决,在实体类前加注解 @JsonIdentityInfo(generator=ObjectIdGenerators.IntSequenceGenerator.class, property="@id") 好好理解Java中的递归 递归的思想 把规模大的问题转化为规模小的相似的子问题来解决。在函数实现时,因为解决大问题的方法和解决小问题的方法往往是同一个方法,所以就产生了函数调用它自身的情况。另外这个解决问题的函数必须有明显的结束条件,这样就不会产生无限递归的情况了。 一句话总结:递归就是自己调用自己。 递归的条件要素 1、递归有两个重要条件 可以通过递归调用来缩小问题规模,且新问题与原问题有着相同的形式。(自身调用) 存在一种简单情境,可以使递归在简单情境下退出。(递归出口) 2、递归的三要素 尝试将一个问题化简到更小的规模 父问题与子问题不能有重叠的部分 一定有一种可以退出程序的情况 递归的算法结构 递归的常用算法伪代码如下: func( mode){ if(endCondition){ //递归出口 end; }else{ func(mode_small) //调用本身,递归 } } 递归实战举例 递归讲起来还是有点小抽象,我们直接来看代码 1、斐波那契数的递归实现 斐波那契数列的递推公式:Fib(n)=Fib(n-1)+Fib(n-2),生成数列(1、1、2、3、5、8...)。 public static int fib(int n) throws Exception { if (n < 0){ throw new Exception("请输入正确的参数"); } else if (n == 0 || n == 1){ return n; } else { return fib(n - 1) + fib(n - 2); // 调用自己 } } 2、99乘法表的递归实现

node.js爬虫

一、node.js爬虫 爬虫: 表示通过服务器端抓取或者获取前端网页中的数据,以下是node.js爬虫的步骤 1.nodejs 爬取网页数据利用http模块中的get方法,http.get(‘爬取的网页url地址’,(req)=>{}) 2.爬取的网页需要借助第三方的一个插件cheerio,该插件可以将网页中的数据拿出来,npm install cheerio 二、代码 const http = require('http'); const cheerio = require('cheerio'); const fs = require('fs'); const app = http.createServer((req, res) => { http.get('http://www.17989.com/xiaohua/', (newReq) => { let str = '' newReq.on('data', (chunk) => { str += chunk }) newReq.on('end', () => { let $ = cheerio.load(str) //1. 定义一个数组,将数据存放到数组中 let arr = []; //[{title:'笑话标题',content:'笑话内容'},{title:'笑话标题',content:'笑话内容'}] $('.hd').each((i, v) => { arr.push({ 'title': $(v).text(), "content": $(v).next().text() }) }); // 2.

JS如何实现勾选全部复选框和不全选复选框

前言 在一些后台管理系统里面,针对全选,复选框是一个很常见的操作,复选框可以执行多项选择的一种控件,有时,为了方便用户选中所有的复选框,网页界面 会提供一个选中所有复选框的功能,怎么实现一个复选框全部被选中的效果呢 示例效果 allcheckbox 原生Js 实现全选的效果,复选框是否被勾选,是由它的checked属性决定的,因此,实现本例效果的关键就是找到所有对应的复选框,然后将其它的checked属性设置为true或false实现全选或全不选 如下实现一个简易的全选功能 // 选择所有函数 function checkAll(c) { var arr = document.getElementsByTagName("myname"); if(c) { // 遍历所有的复选框 for(var i = 0;i<arr.length;i++) { arr[i].checked = true; // 选中 } }else { // 遍历所有的复选框 for(var i = 0;i<arr.length;i++) { arr[i].checked = false; // 不选中 } } } 如下是html <input type="checkbox" name="mayall" onclick="checkAll(this.checked)" />全选<br /> <input type="checkbox" name="myname" />前端&nbsp;&nbsp; <input type="checkbox" name="myname" />后端&nbsp;&nbsp; <input type="checkbox" name="myname" />小程序 Vue版本实现

常用git命令总结大全

目录 一、常用命令 1、git init 2、git add 文件名 3、git commit -m “备注” 4、git status 与 git diff 5、git show commit_id 查看某次修改 6、git log 与 git reflow 7、git pull (--rebase) 8、git push (-u) 与 git branch (-u) 9、git reset --hard 与 git cherry-pick 10、git checkout与git 分支 11、git help 与 git gui 二、撤销修改 1、撤销工作区修改(尚未add,尚未commit) 2、撤销暂存区修改(已经add,尚未commit) 3、撤销版本库修改(已经commit,尚未推送到远程) 4、版本回退 三、删除文件 四、远程仓库 1、连上远程库 2、本地向远程推送内容 3、远程库的所有内容推送到本地库上 五、分支管理 1、基础命令 2、解决冲突 3、分制管理策略(禁掉快进模式) 4、BUG分支 5、Feature分支 6、多人协作 六、忽略上传 1、忽略上传 2、忽略更新上传

51单片机的温湿度检测控制系统(仿真+程序+报告+原理图)

1、主要功能 该系统由AT89C51单片机+LCD1602模块+DHT11温湿度传感器模块+DS1302时间模块+电机驱动模块+报警模块构成。 可实现功能: 1、LCD1602显示温度+湿度+时间 2、DHT11采集温湿度数据 3、DS1302采集时间数据 4、通过按键来调整温湿度上下限报警值 5、超出限制时蜂鸣器和LED光电报警,对应继电器驱动电机转动,进行加热/降温/除湿/加湿 2、仿真 protues 仿真使用的是8.10版本,由于该软件版本迭代原因,不能确保其他版本软件能够正常运行,请安装好对应软件(版本一致或者高于这个版本都可以) 3、程序代码 只是放上来了部分代码,仅供参考。 /****************************************************** ** 函数名:key_scan ** 描述 :按键扫描 ** 输入 :无 ** 输出 :无 ******************************************************/ void key_scan(void) { static unsigned char key_in_flag = 0;//按键按下标志 unsigned char key_l;//存储扫描到行列值。 key_value = 20;//按键值清除 if((P3 & 0x0f) != 0x0f)//按键按下 { delay_ms(1);//按键消抖动 if(((P3 & 0x0f) != 0x0f) && (key_in_flag == 1)) { key_in_flag = 0;//松手检测防止一直触发 P3 = 0x0f; //delay_ms(1);//按键消抖动 key_l = P3;//扫描得到按键值 switch(key_l) { //获取按键值 case 0x0e: { key_value = 1; } break; case 0x0d: { key_value = 2; } break; case 0x0b: { key_value = 3; } break; //case 0x70: //break; } } } else { key_in_flag = 1;//(按键松开标志) } } /******************************************************************************* * 函 数 名 : LcdWriteCom * 函数功能 : 向LCD写入一个字节的命令 * 输 入 : u8com * 输 出 : 无 *******************************************************************************/ void lcd_wri_com(unsigned char com) //写入命令 { E = 0; //使能清零 RS = 0; //选择写入命令 RW = 0; //选择写入 DB = com; delay_ms(1); E = 1; //写入时序 delay_ms(5); E = 0; } void main(void) { get_1302(time_1302);//获取时间 change(); //时间转换 init_all_hardware();//初始化硬件,IO和定时器 while(1) { get_1302(time_1302);//获取时间 change(); //时间转换 if(temp ==0) { wri_string(1,0,times);//初始化显示 } key_scan();//按键扫描 key_service();//按键服务处理函数 time_service();//时间处理函数 } } 4、原理图 5、参考报告 内含5k字,21页的相关报告一份,纯手打,内容一致

slcan 协议 脚本 测试

文章目录 slcan 协议kernel slcancan-utils slcanptycan-utils slcandcan-utils slcan_attachpython slcan slcan 协议 slcan, 基于文本 ASCII 的协议, 也是 LAWICEL 硬件设备的协议, CAN Tools by LAWICEL 有两种硬件设备: CANUSB: 目前是 2011 年的 Version 1.0DCAN232: 目前是 2023 年的 Version 3.0B 协议有细微差别, 整体不大, 以 CANUSB 为例: 所有命令 \r 结尾, 大小写敏感, 设备一般会返回 信息 或者 状态 ( \r 表示 OK, 或者 \b 表示 ERROR)Sn\r, 设置 Setup 标准 CAN 的位速率, 其中 n 取 0~8, 对应 10,20,50,100,125,250,500,800,1000Kbit/s, 如想设置 500Kbit/s, 只需要通过串口给 slcan 设备发 S6\r 即可, 设备会返回 \r 表示 OK, 或者 \b 表示 ERRORO\r, 打开 Open CAN 通道, 返回值同上C\r, 关闭 Close CAN 通道, 返回值同上tiiildd.

C++使用sort排序

对于一个数组,通过对数组中的元素进行交换,我们可以将数组中的元素从小到大或从大到小进行顺序排列。当我们希望对数组中的元素进行排序时,我们可以使用C++为我们提供的工具-——sort。有了它,你再也不用纠结如何完成排序了。 sort是一个C++已经为我们实现好的工具,使用时,需要先引入一个算法的库——<algorithm>。需要说明的是,sort可以排序任何类型的元素,包括我们自己定义的结构体。 #include<iostream> #include<algorithm> using namespace std; int main(){ int arr[]={2,4,5,3,5}; return 0; } 通过写: sort(arr,arr+5); 我们可以将arr数组前五个元素进行由大到小的排序。 而如果写: sort(arr+i,arr+j); 那么被排序的将会是arr[i]到arr[j]的元素,其他元素将保持原来位置。 如果希望是由大到小排,可以传入第三个参数——“排序方法”: sort(arr,arr+5,greater<int>()); 其中greater是更大的意思,<int>表示待排序的数组元素类型。 完整代码为: #include<iostream> #include<algorithm> using namespace std; int main(){ int arr[]={2,4,5,3,5}; sort(arr,arr+5); for(int i=0;i<5;i++){ cout<<arr[i]; } cout<<endl; sort(arr,arr+5,greater<int>()); for(int i=0;i<5;i++){ cout<<arr[i]; } cout<<endl; return 0; } 例题1: 老师希望知道办理的学生水平,将同学成绩分为三个等级A(80-100),B(60-80),C(0-60),输入十个学生的成绩,并由大到小进行排序,在计算出前个同学的总成绩,最后统计三个等级的学生人数。 #include<iostream> #include<algorithm> using namespace std; int main(){ int arr[10]; int sum=0; int A=0,B=0,C=0; for(int i=0;i<10;i++){ cin>>arr[i]; } sort(arr,arr+10,greater<int>()); for(int i=0;i<10;i++){ cout<<arr[i]<<"

LoongArch上正常使用`pip install`

原创:你在使用loongarch架构操作系统时,是否遇到pip install 安装失败的情况? 刷到这篇文章,大家可添加评论或者私信我,及时满足大家的需求 那么,下面讲一下如何配置loongarch架构的pip 仓库及开发原理 如何配置龙芯搭建的python仓库?(LoongArch架构) 官方文档: http://docs.loongnix.cn/python/python.html 龙芯python官方仓库: http://pypi.loongnix.cn/ 手动配置: 方式一: loongson@loongson-pc:~$ mkdir -p ~/.pip loongson@loongson-pc:~$ touch ~/.pip/pip.conf loongson@loongson-pc:~$ cat ~/.pip/pip.conf [global] timeout = 60 index-url = https://pypi.loongnix.cn/loongson/pypi extra-index-url = https://pypi.tuna.tsinghua.edu.cn/simple [install] trusted-host = pypi.loongnix.cn pypi.tuna.tsinghua.edu.cn 方式二: loongson@loongson-pc:~$ pip3 install pandas -i https://pypi.loongnix.cn/loongson/pypi --trusted-host pypi.loongnix.cn --extra-index-url https://pypi.org/simple --trusted-host pypi.org 龙芯python仓库的整体情况 截至2023.1.30日,龙芯python仓库支持python3.6、3.7、3.8及少量的python2.7、3.9,当前旧世界abi的国产操作系统(龙芯、uos、麒麟)默认带的python版本为3.6、3.7、3.8。 软件包适配优先级,以客户反馈及常用软件包为主 工作原理 采用的是devpi继承代理的方式进行搭建,会优先下载龙芯python仓库中的wheel包,若龙芯的python仓库中的软件包不是最新版本,会在官网下载(速度可能会慢或者pip install时直接失败)。这时你需要查看龙芯python仓库的版本,指定版本进行安装pip3 install numpy== (test9) [conda@py-4 python3.8]$ pip3 install numpy== Looking in indexes: https://pypi.loongnix.cn/loongson/pypi, https://pypi.

b站直播弹幕

结构: WebSocketConfig: @Configuration public class WebSocketConfig extends ServerEndpointConfig.Configurator { @Bean public ServerEndpointExporter serverEndpointExporter(){ return new ServerEndpointExporter(); } } SocketController: @RestController @RequestMapping(value = "/socket") public class SocketController { private static final Logger logger = LoggerFactory.getLogger(SocketController.class); @Autowired private ClientSocket clientSocket; @ApiOperation(value = "获取bilibili弹幕") @PostMapping(value = "/open") public Result open(@ApiParam(value = "房间号") @RequestParam(value = "roomId", required = false) Integer roomId) { try { clientSocket.start(roomId); } catch (Exception e) { logger.error(" ===> 获取bilibili弹幕错误:{}", e.

基于Springboot的影视管理系统

影城管理系统的主要使用者分为管理员和用户,实现功能包括管理员:首页、个人中心、用户管理、电影类型管理、放映厅管理、电影信息管理、购票统计管理、系统管理、订单管理,用户前台:首页、电影信息、电影资讯、个人中心、后台管理、在线客服等功能。由于本网站的功能模块设计比较全面,所以使得整个影城管理系统信息管理的过程得以实现。 本系统的使用可以实现本影城管理系统管理的信息化,可以方便管理员进行更加方便快捷的管理,可以提高管理人员的工作效率。 开发语言:Java 框架:springboot JDK版本:JDK1.8 服务器:tomcat7 数据库:mysql 数据库工具:Navicat11 开发软件:eclipse/myeclipse/idea Maven包:Maven 本影城管理系统结构图如图4-2所示。 图4-2 系统功能结构图 效果图 目 录 摘 要 I 1 绪论 1 1.1研究背景 1 1.2研究现状 1 1.3研究内容 2 2 系统关键技术 3 2.1 Spring Boot框架 3 2.2 JAVA技术 3 2.3 MYSQL数据库 4 2.4 B/S结构 4 3 系统分析 5 3.1 可行性分析 5 3.1.1 技术可行性 5 3.1.2经济可行性 5 3.1.3操作可行性 5 3.2 系统性能分析 5 3.3 系统功能分析 6 3.4系统流程分析 7 3.4.1登录流程 7 3.4.2注册流程 8

Qt·.·.解决QString转cv::string并format格式化

Qt·.·.QString转cv::string并format格式化 经常需要将一系列的cv::Mat图像保存至硬盘里。 设置QString路径并指定序号index后,生成带不同序号的cv::string文件名。 输入条件: foldName = QString::fromLocal8Bit("D:\\Images\\test\\中文LightTraceCalibrated2\\"); index = 9; 序号固定长度为2(9变成为09),期望结果: fileName = "D:\\Images\\test\\中文LightTraceCalibrated2\\09.bmp"; cv::string的format函数与C++的printf()函数的说明符与使用方式一致。 错误方法:直接格式化 对字符进行格式化转换的说明符为%s,但后缀变量中,直接使用字符变量时,返回的结果为:”\x1“ // 失败:后缀直接使用字符变量 foldName = QString::fromLocal8Bit("D:\\Images\\test\\中文LightTraceCalibrated2\\"); // 结果错误: // "\x1" fileName = cv::format("%s", foldName); 错误方法:利用函数toLocal8Bit()转换 // <失败>:利用函数toLocal8Bit()转换后再格式化 foldName = QString::fromLocal8Bit("D:\\Images\\test\\中文LightTraceCalibrated2\\"); // 结果错误: // "\x1" fileName_tLocal8Bit = cv::format("%s", foldName.toLocal8Bit()); . 正确方法:利用两项函数toLocal8Bit().constData()级联转换 // 【成功】:利用两项函数toLocal8Bit().constData()级联转换后再格式化 foldName = QString::fromLocal8Bit("D:\\Images\\test\\中文LightTraceCalibrated2\\"); // 结果正确: // "D:\\Images\\test\\中文LightTraceCalibrated2" fileName_toLocal8Bit_constData = cv::format("%s", foldName.toLocal8Bit().constData()); 所有对比代码 // 路径(包含中文,使用函数fromLocal8Bit()以防产生乱码) QString foldName = QString::fromLocal8Bit("D:\\Images\\test\\中文LightTraceCalibrated2\\"); // 图像序号 for (int index = 9; index < 23; index++) { // 使用cv::format("

高德地图js2.0使用MarkerCluster聚合点及添加点击事件

之前的博客中我便提过了在版本变化的趋势下,高德地图也在不断迭代,目前2.0以下版本已经在iOS15 beta版本不适用了,而且2.0以下版本由于卡顿等问题也不在符合用户的使用需要,升级迫在眉睫,但2.0对于标记的聚和与之前版本有较大区别,在此将写法记录一下,也希望能帮到大家。 2.0以前对于标记的处理是将标记全部在地图上画出来之后通过MarkerClusterer聚合,不仅对标记的修改较为复杂,还会导致严重的卡顿问题。而在升级到2.0后,标记的聚合便是通过MarkerCluster将标记的坐标打在地图上,然后直接渲染的方式了,如下所示: this.cluster = new AMap.MarkerCluster(this.map, this.allLnglat, { styles: styles, renderMarker: this.renderMarker }); 其中只列举出了最重要的几个参数: this.map:当前渲染的地图 this.allLnglat:所有的标记坐标,例如:[{ lnglat: [117.366,36.577] }] styles: 聚合点上显示的图标,例如: [{ url: 'https://a.amap.com/jsapi_demos/static/images/blue.png', size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16) },{ url: 'https://a.amap.com/jsapi_demos/static/images/green.png', size: new AMap.Size(32, 32), offset: new AMap.Pixel(-16, -16) }] renderMarker:非聚合点上显示的标记,也就是单个点显示的标记,和2.0版本前我们定义的marker是一个东西,可以自定义样式添加点击事件等,例如: renderMarker(context) { //显示点的经纬度context.data[0].lnglat //此处应有逻辑,通过遍历所有点的经纬度来识别当前标记对应的数据 //此处content为设置当个标记的样式 context.marker.setContent(content); //此处为设置标记在地图上的偏移,根据标记物大小处理 context.marker.setOffset(new AMap.Pixel(-20, -20)); //此处为设置标记是否显示在最上方,一般只有选中的标记在最上方 context.marker.setTop(top); //此处为设置标记携带的数据,点击事件会使用 context.marker.setExtData({ id: id }); //此处为添加单个标记点击事件 context.marker.on('click', ev => { //当前标记居中 this.

在前端实现excel导入,在线编辑,导出,打印等功能

后台实现excel的导入导出很简单,在线编辑通过使用第三方平台集成也不复杂,那怎么在前端实现exel导入导出、打印、在线编辑功能呢? 在此,我们需要知道几个第三方库:luckySheet,luckyExcel,vue-print-nb,exceljs luckySheet:luckySheet是当前比较火的excel在线编辑开源的前端第三方插件,暂时不支持导入、导出、打印 luckyExcel:luckyExcel是和luckySheet同一家开发的用于将excel文件导入luckySheet的插件 vue-print-nb:vue-print-nb的开源的封装好的打印插件,底层实现便是我们常见的window.print方法 exceljs:exceljs是用于自定义生成excel文件的开源插件 具体实现: 一、引入依赖 1、引入luckyExcel、vue-print-nb、exceljs插件 cnpm i vue-print-nb --save cnpm i exceljs --save cnpm i luckyexcel --save 2、引入luckySheet依赖 使用cdn引入: <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/css/pluginsCss.css' /> <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/plugins.css' /> <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/css/luckysheet.css' /> <link rel='stylesheet' href='https://cdn.jsdelivr.net/npm/luckysheet/dist/assets/iconfont/iconfont.css' /> <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/plugins/js/plugin.js"></script> <script src="https://cdn.jsdelivr.net/npm/luckysheet/dist/luckysheet.umd.js"></script> 本地引入(具体资源文件在项目中): <link rel='stylesheet' href='./luckysheet/plugins/css/pluginsCss.css' /> <link rel='stylesheet' href='./luckysheet/plugins/plugins.css' /> <link rel='stylesheet' href='./luckysheet/css/luckysheet.css' /> <link rel='stylesheet' href='./luckysheet/assets/iconfont/iconfont.css' /> <script src="./luckysheet/plugins/js/plugin.js"></script> <script src="./luckysheet/luckysheet.umd.js"></script> 二、使用(基于Vue) 1、集成luckySheet ①定义标签的id: <div id="editSheet" class="

网站建设 之 用js写wasm

为什么要这么做?编译js比解释js更快是必然的 wasm是什么? 我期望是一个二进制文件 WebAssembly(又名wasm)是一种高效的,低级别的编程语言。 它让我们能够使用JavaScript以外的语言(例如C,C ++,Rust或其他)编写程序,然后将其编译成WebAssembly,进而生成一个加载和执行速度非常快的Web应用程序。 WebAssembly被设计为针对Size和Load Time进行优化的格式,可以在各个硬件平台上以native speed运行; 安全性:WebAssembly是运行在沙盒内的,甚至可以和当前的Java虚拟机共享一套环境,并且也遵守浏览器各种跨域不跨域的规章制度; 开放性:WebAssembly开放标准,不受任何一家厂商控制,并且被设计为可以和Java API和Context交互 短期上 WASM 显然无法替代 JS——工具链调试困难、包体积庞大冗余、调 OpenGL 都要走回 JS 到 WebGL,性能未必有保证等。我们的团队踩过移植 C++ 原生渲染引擎的坑,这东西不深度掌握的话,目前只适合保证一个原生 App 在 Web 上原汁原味地凑合能用。要想做到好用,或是封装成完整的引擎级 API 在上层用 JS 深度开发,保证让人难受。我也不知道 WASM 为什么能这么巧妙地卡在原生团队和 Web 团队各自的边界之外,在完整从下到上搞 UI 的正经前端项目上(而不是音视频等特殊场景)让两边用起来都这么费劲。 V8 几乎是这个星球上最先进的工业级脚本语言引擎。别管你代码怎么梭,只要你能让 V8 走在 Happy Path 上,那妥妥都是原生级性能。 ES 规范在不断演化。这门语言向下兼容性极佳并且仍然在进化。技术圈内独家的转译玩法,让隔壁还有人为 2 还是 3 站队的时候,前端们都在用 Chrome 明年才会支持的语法特性了。 NPM 背后那个巨大的娱乐圈,哦不,社区支持。 V8 的技术路线很可能已经到达瓶颈了——不少数据显示,这条路线的综合性能上限,大约相当于纯原生应用的 1/20,而 WASM 能优化到原生的 1/4 左右。问题在于,大多数前端应用是事件驱动的,JS 完全不会 60fps 执行,甚至初级开发者还常常随手 setTimeout 几十毫秒而不影响体验。对一个 3Ghz 的 CPU 来说,在 50ms 内它就能执行 1.

KVM虚拟化技术学习笔记10

虚拟机镜像管理 学习目标: 能够了解KVM虚拟机支持的镜像格式 能够使用qemu-img实现镜像创建 能够使用qemu-img实现镜像查看 能够使用qemu-img实现镜像格式转换 能够了解后备镜像的作用 能够了解差量镜像的作用 能够基于后备镜像制作差量镜像 能够使用差量镜像创建KVM虚拟机 能够使用guestfish实现镜像管理 1、qemu支持的镜像格式: qemu-img -h Supported formats:vmdk、vdi、ssh等等。 vmdk VMware镜像格式 vdi VirtualBox镜像格式 raw 简单的二进制镜像文件,一次性占用分配的磁盘空间,支持稀疏文件。 qcow2 copy on write 写时复制技术 第二代的QEMU写时复制格式,QEMU推荐的镜像格式,支持稀疏文件,支持AES加密,支持基于zlib的压缩,支持snapshot,支持后备镜像。 稀疏文件就是在文件中留有很多空余空间,留备将来插入数据使用。如果这些空余空间被ASCII码的NULL字符占据,并且这些空间相当大,那么,这个文件就被称为稀疏文件,而且,并不分配相应的磁盘块。 这样,会产生一个问题,文件已被创建了,但相应的磁盘空间并未被分配,只有在有真正的数据插入进来时,才会被分配磁盘块,如果这时文件系统被占满了,那么对该文件的写操作就会失败。为防止这种情况,有两种办法:不产生稀疏文件或为稀疏文件留够空间。 在计算机科学方面,稀疏文件是文件系统中的一种文件存储方式,在创建一个文件的时候,就预先分配了文件需要的连续存储空间,其空间内部大多都还未被数据填充现在有很多文件系统都支持稀疏文件,包括大部分的Unix和NTFS 。 稀疏文件被普遍用来磁盘镜像,数据库快照,日志文件,还有其他科学运用上。 [root@vm1 ~]# dd if=/dev/zero of=/home/disk01.img bs=10M count=100 100+0 records in 100+0 records out 1048576000 bytes (1.0 GB) copied, 5.65007 s, 186 MB/s 后备镜像 前端镜像:qcow2,云平台大部分都是这个。 2、创建磁盘: [root@localhost ~]#qemu-img create disk1.raw 10G #raw格式 [root@localhost ~]#qemu-img create disk2.qcow2 -f qcow2 10G #qcow2格式 raw是一个普通的二进制的文件格式,支持稀疏格式。一般我们不用这种格式。

3-2 找出不是两个数组共有的元素(C#写法)

3-2 找出不是两个数组共有的元素(PTA题目C#写法) 给定两个整型数组,本题要求找出不是两者共有的元素。 输入格式: 输入分别在两行中给出两个整型数组,每行先给出正整数N(≤20),随后是N个整数,其间以空格分隔。 输出格式: 在一行中按照数字给出的顺序输出不是两数组共有的元素,数字间以空格分隔,但行末不得有多余的空格。题目保证至少存在一个这样的数字。同一数字不重复输出。 输入样例: 10 3 -5 2 8 0 3 5 -15 9 100 11 6 4 8 2 6 -5 9 0 100 8 1 输出样例: 3 5 -15 6 4 1 C#源代码(这个是C#创建的控制台写的) using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; namespace ConsoleApplication34 { class Program { static void Main(string[] args) { string[] arr1 = Console.ReadLine().Split(' '); string[] arr2 = Console.ReadLine().Split(' '); int a = int.

Hikari数据源项目启动后覆盖为新数据源【多库】

【适用场景:动态切换数据库(单库或者多库)。 切换新库完成后可不改配置,重启也能直接连新库】 方案:启动时多连接两个新库,即初始化4个库。在切换时,是通过实现protected abstract DataSource determineDataSource();的方法,进行数据源的决策,动态切换到新库。 项目情况:本身使用hikari的数据源,且连接了两个库。 现在希望运行中动态切换为另外两个数据库。项目本身就使用了dynamic-datasource-spring-boot-starter多数据源连接。 项目在启动时,就会读取下方配置,创建动态数据源对象:com.baomidou.dynamic.datasource.DynamicRoutingDataSource,内部的map存储了多个数据源。 /**所有数据库*/ private Map<String, DataSource> dataSourceMap = new LinkedHashMap<>(); 使用时默认使用的master主数据源,需要切换时,在具体的service实现类或者mapper上,加上注解:@DS("second")即可使用从数据源的链接。 本次功能项目新增结构: 启动连接配置,是从nacos配置读取的(原本的配置) spring: main: allow-bean-definition-overriding: true datasource: driver-class-name: com.mysql.cj.jdbc.Driver type: com.zaxxer.hikari.HikariDataSource hikari: maximum-pool-size: 10 idle-timeout: 180000 connection-timeout: 60000 validationQuery: SELECT 1 FROM DUAL testWhileIdle: true dynamic: #修改默认数据源名称,默认值是master primary: master datasource: master: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://x1111111:3306/db_master?characterEncoding=UTF-8&zeroDateTimeBehavior=convertToNull&useSSL=false&serverTimezone=Asia/Shanghai username: u1111111 password: p1111111 second: type: com.zaxxer.hikari.HikariDataSource driver-class-name: com.mysql.cj.jdbc.Driver url: jdbc:mysql://x2222222:3306/db_second?characterEncoding=UTF-8&amp&zeroDateTimeBehavior=convertToNull&serverTimezone=Asia/Shanghai username: u2222222 password: p2222222 ## 注意:如果原本是单库,也需要调整为这种格式的多库配置。不过此时需要额外引入dynamic-datasource-spring-boot-starter的jar包 配置调整:

AttributeError: module ‘sipbuild.api‘ has no attribute ‘prepare_metadata_for_build_wheel‘

在Ubuntu中安装pyqt5时报错: Collecting pyqt5 Downloading PyQt5-5.15.6.tar.gz (3.2 MB) ━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━━ 3.2/3.2 MB 44.6 kB/s eta 0:00:00 Installing build dependencies ... done Getting requirements to build wheel ... done Preparing metadata (pyproject.toml) ... error error: subprocess-exited-with-error × Preparing metadata (pyproject.toml) did not run successfully. │ exit code: 1 ╰─> [35 lines of output] Querying qmake about your Qt installation... /usr/bin/qmake -query Traceback (most recent call last): File "/usr/local/lib/python3.7/dist-packages/pip/_vendor/pep517/in_process/_in_process.py", line 156, in prepare_metadata_for_build_wheel hook = backend.

CSS完整笔记

Css 一 css的语法 选择器名称{ 属性名称1:属性的值1; } 二 css的引入方式 CSS有三种方式: 内联式:在html头标签添加style 添加样式 不推荐 内部式CSS :在head里面 style标签里面添加 外链式CSS:新建css 用link引用样式 五 什么是选择器 用于选择需要添加样式的目标对象。 六 选择器的基本语法 选择器名称 { 属性名称1:属性的值1; ... } 四 选择器 基本选择器:通用选择器* :作用于html上的所有元素 标签选择器:必须是固定的标签 不能使用自己的定义名称 选择网页的 指定标签 类选择器:以点为前缀。通过标签的class属性调用选择器 以标签的class作为样式的引用依据(调用多个选择器用空格隔开 不能数字开头) Id选择器:以#作为前缀 通过id属性进行名称匹配 选择器分组:将同样的样式应用于多个选择器,可以将选择符以逗号分 隔的方式并为组 伪类选择器:动态伪类选择器:E:hover:鼠标悬停时的样式 E:active:在鼠标点击与释放之间发生的事件时的样 式 鼠标的四种状态:E:link 未访问的链接 E:visited 已访问的链接 E:hover 鼠标悬停状态 E:active 选定的激活状态 层次选择器: E F包含选择符 E>F子选择符 E+F相邻选择器 E~F相邻全部选择器 伪类选择器: E:first-childirst-child必须是兄弟中的第一个 last-child first-child必须是兄弟中的第一个 only-child 仅有的一个子元素E E:nth-child(n) 父元素的第n个子元素E。 E:nth-last-child(n) 父元素的倒数第n个子元素E。

RGBLED灯编程,显示全部颜色

RGBLED灯编程,显示全部颜色 通过之前的学习,我们已经了解了RGBLED灯的。工作原理以及接线方式。我们这一节继续来探究它的编程,通过编程来改变这个RGBLED灯的颜色,或者说打开它的使用说明书。好了,我们继续分享这一节的内容吧。 我们先从无内置芯片的四个引脚RGBLED开始,我们如何点亮呢?对了相信很多小伙伴们通过对电路图的接线了解一定已经会了,就是公共端和开发板电源相连,共阳极就连开发板的vcc共阴极就连开发板的GND,然后将RGB这三个引脚分别连入开发板的模拟量输出端口,之前已经介绍过了如何选择端口这里就不再赘述了。连接时确认下是否接入了限流电阻,如果不接有被烧坏的风险呢。如果选用模块这个问题就轻松避免了。这样一来我们的硬件连接部分就轻松的搞定了,然后打开米思齐编程软件找到输入输出模块中的模拟量输出模块,这里需要三个这个模块进行设置,因为有三个引脚,这里还有一件事要注意那就是编写程序前一定要先写注释后再编程,点击注释模块输入备注, 我是这样写的(无内置芯片RGBLED灯程序探究,正控,R红色接13号引脚,G绿色接14号引脚,B蓝色接15号引脚。备注写好了,我们千万不要嫌麻烦节省时间不写备注,那样的话过段时间你再打开这个程序你就会有一种似曾相识又陌生的感觉,还得全都看一遍才能知道我们之前做的是啥,这样一来更浪费了您的宝贵时间。而且这样备注后还有利于我们的编程工作,比如说我们想编写蓝色直接看备注即可,无需再去查看接线硬件部分,想要组成复合颜色只要找到对应端口进行RGB设置颜色信息即可.是不是很简单?我们可以试着让他分别显示七种颜色试试。(这里最好选择模拟量输出引脚,虽说数字引脚也可以生成七种颜色,但是不利于后期其他颜色的生成的编程工作)。 接下来聊一聊内置ws2812芯片类的RGBLED灯带如何进行编程工作。 第一步在米思齐软件中先选择好引脚做好备注, 第二步找到执行器模块中的找到RGB灯模块。 这里需要记住,需要点击这里的三个编程模块,他们分别设置成功后才可以进行编程。因为这三个是一个小组合缺一不可。我们找到执行器。找到控制RGB部分的编程模块,这三个同时在的情况下才可以控制RGB灯带。还得注意的是这三模块端口信息一定要改为我们用到的那个端口号,否则错一个也不会生效的。 我们先用一种办法就是设置RGB的数值来控制灯RGB灯产生不同的颜色。 这里有一个类型。大多数都是RGB类型 ,因为厂家的不同,它生产出来的顺序是不一样的。这里需要注意,我们要根据所使用的RGB型号进行选择相对的型号进行编程不然颜色是不对的。 我们通过。改变RGB的值。比如说红色,我们将R值设置成255G值和B值设置成0,这样写入开发板就是输出红色。如果B值255,R值和G值为零的时候,就是蓝色。 那这些到底怎么区分呢?总不能除了七种颜色都去试一遍吧别着急,这里有一个RGBLED值和颜色的对照表, 我们可以根据这张表格的。 RGB颜色对照表.rar (676.26 KB) 所显示的颜色来进行区分以及设置。 使用内置芯片RGBLED的好处就是只占用一个端口就可以轻松控制RGBLED显示出全部的颜色。 怎么样RGBLED通过米思齐编程显示全部颜色是不是很简单?。 --------------------- 作者:起点116 链接:https://bbs.21ic.com/icview-3275560-1-1.html 来源:21ic.com 此文章已获得原创/原创奖标签,著作权归21ic所有,任何人未经允许禁止转载。

Flink必知必会系列之回撤流(RetractStream)源码解读

👉 全网最全大数据面试提升手册!2023年持续更新! 1. 定义 Flink中,Kafka Source是非回撤流,Group By是回撤流。所谓回撤流,就是可以更新历史数据的流,更新历史数据并不是将发往下游的历史数据进行更改,要知道,已经发往下游的消息是追不回来的。更新历史数据的含义是,在得知某个Key(接在Key BY / Group By后的字段)对应数据已经存在的情况下,如果该Key对应的数据再次到来,会生成一条delete消息和一条新的insert消息发往下游。 2. 示例 public class RetractDemo { public static void main(String[] args) throws Exception { // set up execution environment StreamExecutionEnvironment env = StreamExecutionEnvironment.getExecutionEnvironment(); env.setParallelism(1); // use blink planner in streaming mode EnvironmentSettings settings = EnvironmentSettings.newInstance() .inStreamingMode() .build(); StreamTableEnvironment tEnv = StreamTableEnvironment.create(env, settings); // 用fromElements模拟非回撤消息 DataStream<Tuple2<String, Integer>> dataStream = env.fromElements(new Tuple2<>("hello", 1), new Tuple2<>("hello", 1), new Tuple2<>("hello", 1)); tEnv.registerDataStream("tmpTable", dataStream, "

could not transfer artifact com...

中文翻译就是不能传输项目,这就是maven下载不下来jar包。或者是maven镜像没配上,或者是server的账号密码错了。 也可以登录settings中的server服务器上看看到底有没有这个jar包,如果没有,那就是服务器的问题,联系管服务器jar包的人。和项目没关系。

HoloLens2的彩色和深度数据流通过主机获取

关于HoloLens 2设备提供了研究者模式,便于开发者访问传感器的原始数据,进行科研开发,本博客根据github项目在线获得图像数据,但是目前达不到实时传输的效果,延迟很高,期望以后的深入学习可以解决。 文章目录 一、实验准备1、实验条件2、下载Github工程3、打开HoloLens 2研究者模式 二、配置过程1、配置VS环境2、注释工程项目中Eigen库2、生成解决方案3、更换Lib库 三、配置Unity项目1、新建Unity的3D项目2、将项目切换到Universal windows patform平台3、新建路径4、将前面编译好的文件拷贝到新建的Plugins文件夹下5、新建一个StreamerHL2.cs6、将脚本随便挂在在一个对象上,我挂载的是主相机7、设置Unity 项目的兼容性8、编译unity工程9、配置package文件中的兼容性10、将如下字段添加到 Package 中11、在Package这一行中,找到"IgnorableNamespaces"的属性,添加“rescap”字段12、在 Capabilityes添加如下字段 四、VS编译与部署1、打开下载好的github工程中的hololens2_simpleclient.py文件2、修改局域网IP 五、连接运行1、将PC与HoloLens 2连接至同一局域网2、vs部署HoloLens 2项目3、选择项目配置4、部署到HoloLens 2上5、运行hololens2_simpleclient.py文件6、查看结果 一、实验准备 1、实验条件 Windows 10 SDK 10.0.18362.0HoloLens 2 设备Unity 2020.3.31f1c1配置好MRTK混合现实开发包Visual Studio 2019Python3.9(opencv-python) 2、下载Github工程 HoloLens2-Unity-ResearchModeStreamer 3、打开HoloLens 2研究者模式 二、配置过程 1、配置VS环境 设置项目属性为release 和ARM64 Release+ARM64 2、注释工程项目中Eigen库 2、生成解决方案 3、更换Lib库 lib库里放了Opencv4.X的库,根据需要把附加依赖项直接换成opencv_world341.lib,这个文件包括项目所需所有lib 三、配置Unity项目 1、新建Unity的3D项目 2、将项目切换到Universal windows patform平台 3、新建路径 4、将前面编译好的文件拷贝到新建的Plugins文件夹下 E → HoloLens2-Unity-ResearchModeStreamer-master → HL2RmStreamUnityPlugin → ARM64 → Release → HL2RmStreamUnityPlugin 5、新建一个StreamerHL2.cs 复制下面代码到脚本里面 在这里插入代码片 6、将脚本随便挂在在一个对象上,我挂载的是主相机 7、设置Unity 项目的兼容性 勾选 InternetClient, InternetClientServer, PrivateNetworkClientServer, WebCam, SpatialPerception 5个位置

(附源码)springboot学生宿舍管理系统 毕业设计161542

摘要 本论文主要论述了如何使用springboot开发一个宿舍管理系统,本系统将严格按照软件开发流程进行各个阶段的工作,采用B/S架构,面向对象编程思想进行项目开发。在引言中,作者将论述宿舍管理系统的当前背景以及系统开发的目的,后续章节将严格按照软件开发流程,对系统进行各个阶段分析设计。 宿舍管理系统的主要使用者分为管理员、宿管员和学生,实现功能包括管理员:首页、用户管理(管理员、学生用户、员工用户)更多管理(学生信息、宿舍管理、入住信息、出入登记、人员来访)等功能;员工:学生信息、宿舍管理、入住信息、出入登记、人员来访等功能;学生:学生信息、入住信息、出入登记等功能。由于本网站的功能模块设计比较全面,所以使得整个宿舍管理系统信息管理的过程得以实现。 本系统的使用可以实现本java宿舍管理系统的信息化,可以方便管理员进行更加方便快捷的管理,可以提高宿舍管理系统的管理效率。 关键词:springboot ;mysql数据库;宿舍管理系统 Abstract This paper mainly discusses how to use springboot to develop a dormitory management system. This system will carry out the work of each stage in strict accordance with the software development process, and adopt B / S architecture and object-oriented programming idea for project development. In the introduction, the author will discuss the current background of the dormitory management system and the purpose of system development.

方差分析-基本概念阐述

目录 方差分析的作用(ANOVA) 因子和等级(Factors and Levels) 受试者之间或受试者内部因子(Between- and Within-Subjects Factors) 多因子设计(Multi-Factor Designs) 方差分析的作用(ANOVA) 方差分析(Analysis of Variance,ANOVA)是用来检验两组或两组以上均值是否存在差异的统计学方法。可能令人困惑的是,既然此方法是检验均值的,那为什么不叫作“均值分析”而叫作“方差分析”。随着对方差分析原理的深入,我们会了解到这是因为均值是否差异的结论是通过分析方差得出的。 因子和等级(Factors and Levels) 方差分析中有两个重要的概念,因子(factors)和等级(levels)。比如评估受教育程度对工资影响的实验中(简称“工资实验”),人群按受教育程度分为高中、本科、研究生、博士,通过观察这些不同群体毕业后工资的差异性来得到实验结论。在这个实验中,factor指的是受教育程度,它是一个独立变量。实验一共评估了4种不同类型的受教育程度,所以该factor有4个levels。 只有一个factor的方差分析被称为one-way ANOVA,有两个factors的方差分析被称为two-way ANOVA。比如有一个用来评估年龄和性别对于阅读速度影响的实验(简称“阅读实验”),年龄被分为3组(8岁,10岁和12岁),性别被分为2组(男性和女性)。我们可以说,factors为年龄和性别,且年龄有3个levels,性别有2个levels。 受试者之间或受试者内部因子(Between- and Within-Subjects Factors) 当factor的不同levels是由不同受试者组成的,则称这个factor为受试者之间因子(between-subjects factor或者between-subjects variable)。比如“工资实验”中,不同受教育程度的人群是由4组不同的受试者产生的,则受教育程度这个factor就是between-subjects factor。 当factor的不同levels是由相同受试者组成的,则称这个factor为受试者内部因子(within-subjects factor or within-subjects variable)。比如“药物实验”中,每一位受试者都服用了4种剂量的药物(0, 0.15, 0.30, 0.60 mg/kg),则剂量这个factor就是within-subjects factor。 多因子设计(Multi-Factor Designs) 通常实验的factors不止一个,比如“阅读实验”评估了8岁、10岁和12岁的男性和女性阅读速度的差异,受试者被分为以下6个组(表1): GroupGenderAge1Female82Female103Female124Male85Male106Male12 表1 Gender(2) x Age(3) Factorial Design 这个实验有2个factors,即Age和Gender,Age有3个levels,Gender有2个levels。所有levels的组合都被考虑在内的设计被称为因子设计(factor design)。准确的讲,上面这个因子设计应当被称为Gender(2) x Age(3) factorial design。复杂的因子设计通常不止2个factors,而且可能是between- and within-subjects factors的组合。 参考资料:https://onlinestatbook.com/2/analysis_of_variance/intro.html

(附源码)Springboot小区物业管理系统 毕业设计 051745

Springboot小区物业管理系统 摘 要 随着互联网趋势的到来,各行各业都在考虑利用互联网将自己推广出去,最好方式就是建立自己的互联网系统,并对其进行维护和管理。在现实运用中,应用软件的工作规则和开发步骤,采用Java技术建设小区物业管理系统。 本设计主要实现集人性化、高效率、便捷等优点于一身的小区物业管理系统,完成小区动态管理、小区管理、停车位管理、业主车辆管理、物业报修管理、投诉信息管理、收费管理、小区人数管理等功能模块。系统通过浏览器与服务器进行通信,实现数据的交互与变更。只需通过一台电脑,动动手指就可以操作系统,实现数据通信管理。整个系统的设计过程都充分考虑了数据的安全、稳定及可靠等问题,而且操作过程简单。本系统通过科学的管理方式、便捷的服务提高了工作效率,减少了数据存储上的错误和遗漏。 小区物业管理系统使用Java语言,采用基于Springboot框架、Java技术进行开发,使用 MyEclipse 2017 CI 10 编译器编写,数据方面主要采用的是微软的MySQL关系型数据库来作为数据存储媒介,配合前台HTML+CSS 技术完成系统的开发。 关键词:数据通信;Java语言;关系型数据库;数据存储 Springboot community property management system Abstract With the advent of the Internet trend, all walks of life are considering using the Internet to promote themselves. The best way is to establish their own Internet system and maintain and manage it. In practical application, according to the working rules and development steps of the application software, Java technology is used to build the community property management system.

群晖挂载Unraid NFS文件夹

最近将黑群晖资料转移到了Unraid上,但群晖的Drive和Photo等套件还是比较好用。为了保持同步,计划在群晖上挂载Unraid的NFS共享文件夹。国内的教程基本上是教如何在Unraid挂载群晖的共享文件夹,查找相关页面后得到解决方法如下: Unraid共享文件夹设置 NFS 安全设置>安全性:私有 NFS 安全设置>规则:10.0.0.91(sec=sys,rw,sync,no_subtree_check,no_root_squash,anongid=100,anonuid=99) (红字部分改为群晖的IP) Unraid共享文件夹设置 此后在群晖FileStation正常挂载NFS文件夹即可。

简易温度检测器电路原理

在日常生活中,对温度的及时检测能够减免火灾的发生,所以今天就说说温度检测器。 实际功能 在常温下显示数字0,随着温度的升高,数码管逐步显示1、3、8,分别代表三档温度,并且在显示8的时候,LED灯开始闪烁,代表温度过高而报警,当温度下降时,数码管的显示状态也要随之改变。至于为什么是显示1、3、8,而不显示1、2、3,是因为这个实际上是电子设计制作大赛的题目,会考虑到整体的难易程度,这里选择显示1,3,8是为了降低难度,并不是说1,2,3不能实现。 上面是电路原理图和实物图 ,电路图中两线相交未必就代表它们的真的相连了,只有它们相交,并且交点为黑色圆圈才代表两线相连,电流才能通过。 整体思路 电路原理图包含了电源部分、测温部分、显示部分、报警部分。看上去比较复杂,但实际上板块界限清晰,能把文章看完都能理解。电源部分提供直流电和断电开关(复位用的),测温部分就是比较电压,然后决定是否输出高电平,输出的高低电平决定显示部分显示的数字,报警部分在最高温度才有,同样是根据测试部分的输出作为信息源,用一个ne555能得到一个闪烁的LED。 电源模块 我们都知道民用电的电压的220V的交流电,但给我们的电路板要用的是8~15v直流电,所以就需要这个电源模块。 测温模块 整体思路:首先热敏电阻的阻值会随着温度的改变而改变,这时线性关系,所以温度与阻值是一一对应的关系,如果我们将热敏电阻与阻值选好的电阻进行串联,通过热敏电阻对温度变化的感应,让热敏电阻的阻值改变,串联电路中一个电阻阻值改变那么分压情况也一定改变,这时知道温度与阻值与电压三者都是一一对应的关系,当温度变化时,热敏电阻串联的电路的电压分配也会变化。我们再找出三个挡位所要的温度它对应的分压情况,再用两个阻值固定的电阻串联得到这个温度对应的电压,再找一个能比较电压的芯片,比较热敏电阻所串联线路的分压情况和我们自己根据温度对应电压所串联的线路,比较会出现三种结果,大于等于小于,这种比较器再根据结果输出高低电平用来控制数码管显示和报警指示灯的闪烁。 图中RV1就是热敏电阻,这里是NTC型,随着温度的升高电阻减小,还有一种是PTC,电阻随着温度升高而升高。在图中还有三条横线,对应三个比较器的反向输入端(就是图中的等边三角形),比较器就是LM393芯片,或者说LM393就是比较类型的芯片,一个393内涵两个比较器,所以图中有三个393的标注,但实际上只用两个芯片,这也可以解释出U1的A和B都有4和8脚,它们实际上是一个,连接实物的话连接一个就欧克了。LM393可以对输入口的电压进行比较,输入口分正向输入端和反向输入端,这没什么不同,就是区分两个输入端,它们在等边三角形(也就是393的符号)里用+、- 号标注了。具体的比较规则是正向输入的电压高于反相输入的电压时,LM393的输出脚输出高电平(也就是有电出来)。这个输出脚一个LM393芯片有两个,分别对应两个比较器的输出引脚,它们是1和7。 第一档: 了解完比较基本的规则,现在看看具体该怎么设置。我们都知道从电源负正极到电源负极,电压会逐渐降低,具体的降低速度根据电阻的大小而不同,但前半部分的电阻要是小,那么它之后还会剩余很多电压,如果前半部分的电阻比较大,后面的电压也就小了。知道这个后我们来看看几对电阻,R6和R2,R14和R4,R7和R13,它们就是我们自己设置的串联线路,分别对应了一个比较器,每一个比较器又对应了测温的温度阈值。这里以第一档为例,电源为15V的情况下,R6与R2的电阻都为10K,它们各得7.5v的电压,那么U1A的2脚输入了7.5V的电,由于阻值固定,所以这个电压也是固定的。这个是反相输入的电压7.5v,再来看看正向输入的电压,那就要看RV1和R1了,RV1为NTC,在在环境温度25摄氏度及一下的温度环境中,实际阻值为最大阻值,这里的阻值就为10K,那么在这时RV1=R1=10K,所以三号引脚同样为7.5v的电压,可这时温度升高,热敏电阻的阻值随之减小,那这时三号引脚得到的电压会如何变化呢,刚刚有说过,在前半部分电阻较小的时候,后半部分就将得到更多的电压以保证电流一样,而三号引脚的电压是谁的呢,是满电通过RV1之后剩余的电压,由于热敏电阻阻值减小,前半部分无法再占据7.5v的电压,也就是说后半部分的电压大于7.5v,具体是多少不知道,但肯不止置7.5v,那么3号引脚的电压就会大于2号引脚的标准7.5v,根据比较规则,1号引脚将会输出高电平,至于这个高电平会产生什么效果待会看,总之,这就是温度检测器第一档温度检测的原理(在常温时是显示0,第一档时显示1)。此时一二三比较器分别输出高电平、低电平、低电平。 第二档: 在第二档的时候不光需要第一个比较器输出高电平,还需要第二个比较器输出高电平,与此同时,三号比较器要输出低电平。观察发现,其实二号比较器输出高电平的时候,一号比较器也一定会输出高电平,温度未达到一定高度时三号比较器也一定是输出低电平的。观察图中的红线,不难发现三个比较器的正向输入端是相连的,再根据R6和R2,R14和R4,R7和R13的阻值,计算出反向输入端的固定电压分别是1/2,4/7,2/3,为明确表达这里用的分数形式,代表反相输入端所占电压的比值。再根据温度越高,热敏电阻阻值越小,R1所占电压越高,那么正向输入端的电压就越高,这样一来就有点像闯关游戏了,温度升高好比打游戏投入的时间,投入的多技术也得到了提升,所以正向电压升高,得到的回报就是能够打到更后的关卡。 第三档: 目前我们知道,三个比较器会随着温度升高逐个输出高电平,输出的这个高电平是用来去编码显示档数的,这里随着温度的升高逐步显示0,1,3,8。0是常温下显示的,这个待会还会说。第三档的高电平有着多个任务要完成,首先要让4511显示器显示出8,其次,由于在第三档的时候三个比较器都是输出高电平,这样一来显示器实际上是得到了输出12的信号(1+2+8),这很明显无法显示,就乱码了,这时我们就需要屏蔽掉一号比较器和二号比较器输出的高电平。 想要屏蔽掉一个高电平,无非就是用低电平,但目前为止我们只有一个高电平,如何才能得到低电平呢,这里用个简简单单的逻辑门即可。【数电,逻辑门八门全开!】https://www.bilibili.com/video/BV1bt4y1H7de?vd_source=d65838e71b096f0dab245117c585fd9d 这里圈出的是4011芯片,我们现在并不知道它有什么功能,但我们可以猜出来。或与非三种逻辑门,或和与门都是有两个输入端的,当两个输入端给出不同的组合,得到的结果也是不同的。或门:有1得1,全0得0,与门:有0得0,全1得1,非门:输出与输入相反。之后还有或非门,与非门,原理都是一样的,比如或非门,先套用或门的规则(真值表),再套用非门的规则。如果有不确定或者这里头晕的朋友,可以先看上面的视频连接,视频非常的清楚明白。 回到我们的电路图,我们只有一个高电平,也就是1,要得到低电平,也就是0。直接用非门当然可以得到0,可我们现在有一个1,如果将两个输入端相连就相当于有两个1,那就是全1,可无论是与门还是非门,全1都为1,再加个非门能得到1,这里用的4011就是与非门。有人会问了为什么不直接用非门呢?这个电路图实际上是电子设计制作大赛的题目,只能用所给出的芯片进行设计,这里也就用的是4011这个与非门芯片,与门的规则是全1得1,那么与非门就是全1得0了,这里有不清楚可以多看两眼,也可以看视频。现在我们得到低电平了,那么这个低电频通过D1,D2两个二极管将比较器1和2传送过来的高电平给“带偏”了,这个高电平是没办法再传输到4511了,有朋友要问了,为什么要个二极管,直接连上不就可以了吗?与非门,全0得1,在第二三档的时候三号引脚输出的高电平通过4011会产生高电平而影响正常输出,所以利用一下二极管的单向导通性防止倒灌。U4:A和U4:B用来控制数码管的闪烁,这个待会还会说。 报警部分 这个模块讨论两个芯片,一个是老朋友NE555,另外一个是4040。NE555就两个功能,一个是定时,一个是延时。这里显然是定时,4号引脚接到了三号比较器的输出端,而4号引脚又是低电工作的复位端,正常工作4号引脚得是高电平,意思是NE555只能在4号引脚接收到高电平的时候才能正常工作,那也正好对应了第三档的时候要有灯闪烁。NE555的3号引脚是输出端,输出的周期T=0.7*(R15+2R16)*C1,电容电阻周期的单位是法拉,欧姆,秒。就这样电脉冲输出到了4040的10引脚。关于4040,除了Q0~Q11,还有CLK和MR,Q0~Q11是12个输出引脚,CLK是时钟输入端,MR是复位端。4040的4号引脚输出信号连接到了一个4011的引脚(U4:B),当4号引脚输出是通过4011接到了数码管的阴极,这时4011给出的是低电平(大家自己根据前面的知识判断如何输出的低电平),这样就使得数码管熄灭,但是4号引脚输出高电平只是一瞬间的事情,很快就轮到后面的引脚输出高电平,正因为这样达到了数码管一亮一灭的效果,同时也让LED灯D3能在第三档的时候闪烁。 总结 整个电路图看上去是比较复杂的,但拆分看都有自己完整的逻辑,而弄懂各个板块之后,把他们联系在一起也不是什么难事了。

for命令详解(3)

for介绍 一.基本格式二.FOR参数1.参数/D详解2.参数/R详解3.参数/L详解4.参数/F详解(掺杂个人理解) 一.基本格式 FOR %variable IN (set) DO command [command-parameters] %variable 指定一个单一字母可替换的参数 (set) 指定一个或一组文件,可以施一公通配符 command 指定对每个文件执行的命令 command-parameters 为特定命令指定参数或命令行开关 二.FOR参数 1.参数/D详解 定义: FOR /D %variable IN (set) DO command [command-parameters] 如果集中包含通配符,则指定与目录名匹配,而不与文件名匹配 解析: 如果集合(set)包含通配符("*"和"?"),将对与集合(set)相匹配的每一个目录(不是指目录中的文件组) 执行指定的Command,这个参数主要用于目录搜索,不是搜索文件 实例: @echo off echo C盘根目录下所有目录名: for /d %%x in (c:*) do ( echo %%x ) pause>nul 2.参数/R详解 定义: FOR /R [[drive:]path] %variable IN (set) DO command [command-parameters] 检查以[drive:]path为根的目录树,指向每个目录中的FOR语句. 如果在/R后没有指定目录规范,则使用当前目录,如果仅为一个单点(.)字符,则枚举该目录树 解析: 通过/D参数知道,/D参数显示指定路径或者当前路径下的目录名,/R也是跟目录有关 /R参数可以把指定路径下或者当前目录下的文件名全部读取,注意是文件名,不是目录名 实例1: echo 查看当前目录和目录下文件夹名 for /r %%x in (.