Java去除字符串中的空格(trim())

字符串中存在的首尾空格一般情况下都没有任何意义,如字符串“ Hello ”,但是这些空格会影响到字符串的操作,如连接字符串或比较字符串等,所以应该去掉字符串中的首尾空格,这需要使用 String 类提供的 trim() 方法。 trim() 方法的语法形式如下: 字符串名.trim() 使用 trim() 方法的示例如下: String str = " hello ";System.out.println(str.length()); // 输出 7System.out.println(str.trim().length()); // 输出 5 从该示例中可以看出,字符串中的每个空格占一个位置,直接影响了计算字符串的长度。 如果不确定要操作的字符串首尾是否有空格,最好在操作之前调用该字符串的 trim() 方法去除首尾空格,然后再对其进行操作。 注意:trim() 只能去掉字符串中前后的半角空格(英文空格),而无法去掉全角空格(中文空格)。可用以下代码将全角空格替换为半角空格再进行操作,其中替换是 String 类的 replace() 方法,《Java字符串的替换》一节会详细介绍这个方法。 str = str.replace((char) 12288, ' '); // 将中文空格替换为英文空格 str = str.trim(); 其中,12288 是中文全角空格的 unicode 编码。 更多学习及源码评论区扣:666。免费获取。 【Java300集】高淇老师讲解Java-最新版本-入门版基础教程-全集分享

解决EnvironmentNotWritableError: The current user does not have write permissions to the target

文章目录 一、问题描述二、解决方案 一、问题描述 其实是很简单的一个问题。。在某台服务器上用conda下载个包,报错没有写权限: EnvironmentNotWritableError: The current user does not have write permissions to the target environment. environment location: /usr/local/miniconda3 uid: 1001 gid: 1000 二、解决方案 如果在conda前加上sudo也没用。直接对报错提示的文件增加权限就好啦: sudo chmod 777 -R ./miniconda3

json串转复杂对象嵌套对象

import com.google.gson.Gson; import lombok.extern.slf4j.Slf4j; import java.lang.reflect.Type; @Slf4j public class GsonUtil { private GsonUtil() { } private static Gson gson = new Gson(); public static Gson getInstance() { return gson; } /** * 字符串转对象 * 带泛型的返回值类型 * * @param json json 字符串 * @param typeOfT 指定返回值类型。示例:new TypeToken<Map<Integer, Integer>>() { * }.getType() * @param <T> 返回值类型 * @return 对象 */ public static <T> T fromJson(String json, Type typeOfT) { return getInstance().fromJson(json, typeOfT); } } String json = "

Alarm介绍

一、背景 Alarm用于实现Android中的定时任务,在Android的各个架构层次都有广泛的应用,和timer不同的是,timer在系统休眠后不会触发,而alarm在系统休眠后,可以借助RTC唤醒系统。在功耗调试过程中,也会遇到alarm频繁唤醒系统导致功耗高的情况,所以梳理alarm的整体流程是有必要的。本文主要介绍alarm整体流程和从功耗角度关注的部分细节,如alarm唤醒类型,alarm对齐,alarm suspend处理等。 二、alarm整体架构 Alarm整体架构如下,framework层对外提供接口,对内实现具体功能和策略,如alarm创建、处理和对齐等,并通过jni与native通信,native层通过系统调用进入kernel层。不同类型的alarm,在framework层体现在参数不同,具体差异处理在kernel层,如对唤醒和非唤醒alarm的处理,在kernel层体现在是否设置alarm到RTC,具体流程在后面进行阐述。 三、alarm类型 根据是否可唤醒系统,使用相对时间或绝对时间,alarm type分为下面四类 对于这四类alarm的详细解释,参考代码中注释 RTC_WAKEUP: (wall clock time in UTC), which will wake up the device when it goes off RTC: (wall clock time in UTC). This alarm does not wake the device up; if it goes off while the device is asleep, it will not be delivered until the next time the device wakes up. ELAPSED_REALTIME_WAKEUP: (time since boot, including sleep), which will wake up the device when it goes off.

【纯干货!】Linux 内核经典面试题

内核经典面试题总览 主要有哪几种内核锁?Linux 内核的同步机制是什么? Linux 中的用户模式和内核模式是什么含义? 怎么申请大块内存?vmalloc 和 kmalloc 有什么区别? 进程间通信主要有哪几种方式? 伙伴系统申请内存的函数有哪些? 通过 slab 分配器申请内存的函数有哪些? Linux 的内核空间和用户空间如何划分的?进程地址空间布局图? vmalloc() 申请内存有什么特点? 用户程序使用 malloc() 申请的内存空间在什么范围? 在支持并使能 MMU 的系统中,Linux 内核和用于程序分别运行在物理地址模式还是虚拟地址模式? ARM 处理器是通过几级页表进行存储空间映射的? Linux 是通过什么组件来实现支持多种文件系统的? Linux虚拟文件系统的关键数据结构有哪些?(至少写出4个) 对文件系统的操作函数保存在哪个数据结构中? Linux 中的文件包括哪些? 创建进程的系统调用有哪些? 调用 schedule() 进行进程切换的方式有几种? Linux 调度程序是根据进程的动态优先级还是静态优先级来调度进程的? 进程调度的核心数据结构是哪个? 如何加载、卸载一个模块? 模块和应用程序分别运行在什么空间? Linux 中的浮点运算由应用程序实现还是内核实现? 模块程序能否使用可链接的库函数? TLB 中缓存的是什么内容 Linux 中有哪几种设备? 字符设备驱动程序的关键数据结构是哪个? 设备驱动程序包括哪些功能函数? 如何唯一标识一个设备? Linux 通过什么方式实现系统调用? Linux 软中断和工作队列的作用是什么? 小编推荐自己的Linux内核技术交流群: 【977878001】进群免费领取 内核资料包(含视频教程、电子书、实战项目及代码) 0x01 答案 1. 主要有哪几种内核锁?Linux 内核的同步机制是什么? 自旋锁:spin_lock 忙等,中断中使用 信号量:semxxx down/up write/read

逻辑结构分为4个类型

逻辑结构分为四个类型: 顺序结构: 事情发生的顺序是有计划的, 每个步骤都有它的前驱和后继。 选择结构: 根据某些条件, 可以选择执行不同的操作。 循环结构: 重复执行一系列操作, 直到满足某个条件为止。 分支结构: 根据某些条件, 可以执行不同的操作, 但是只会执行其中的一个。 这四种逻辑结构是计算机程序设计中常用的基本结构, 它们可以结合使用, 来构建复杂的程序。

通过Widows server backup实现共享文件夹定时备份

通过Widows Server Backup实现共享文件夹定时备份 客户需求:根据现场客户提出能否通过共享文件夹定时实现数据的备份。 实验环境:widows server 2012 widows server 2016 实验步骤: 打开服务器管理器,选择添加角色功能,安装Widows Server Backup服务。 创建远程登录共享文件夹的用户。 注:必须指定密码,否则创建备份计划登录远程文件夹时提示不符合策略登录失败。 需改隶属组,添加Administrator、Backup Operators组。 创建配置远程共享文件夹(存储备份文件的位置)的权限。 配置用户对文件夹的写入权限。 说明:创建文件夹(备份数据存储位置),选择高级共享添加用户并赋予相关权限并修改添加文件夹的权限。 测试,两边共享文件夹能否正常访问。 注:通过ipconfig命令查看两边IP地址并测试。 输入创建的远程登录用户名及密码。 注:以上结果,说明共享文件夹访问正常。(如:出现报错,无法访问,请检查防火墙策略及登录用户的权限问题) 创建备份计划。 第一步,选择备份类型,这边根据用户需求选择自定义。 第二步,选择,需要备份的文件夹添加到项目中。 第三步,选择,备份时间。 第四步,选择,备份到网络文件夹。 第五步,配置,备份位置。 注:该位置是共享文件夹的路径,用户名密码是创建的backup用户(两台设备都要创建该用户并赋予以上相应权限及隶属组),只有该用户对共享文件夹具有相应权限。 注:需要将备份的路径添加backup用户并赋予权限,否则将造成备份失败。 第六步,创建备份任务成功。 查看是否备份成功。 对端检查备份数据是否存在。 以上说明备份成功。 测试数据的恢复还原。 第一步,删除原始数据。 ​ 第二步,进行备份恢复操作。 第三步,选择远程共享文件夹。 第四步,指定文件路径。 第五步,选择上次备份的日期时间。 第六步,选择恢复的类型。 第七步,选择需要恢复的文件和文件夹。 第八步,选择恢复的位置。 注:因原文件夹已被删除,所以无法选择原始位置。 第九步,确认恢复文件。 第十步,恢复完成。 第十一步,检查是否恢复。 通过以上图文说明,已完成用户提出需求。用户发现每日一次备份太过频繁。提出新的需求问题,实现每周备份一次。 说明:实现每周备份一次,Widows Server Backup服务只支持一天一次或多次,所以我们需要借助任务计划程序实现该需求。 在服务器管理器中,找到并打开任务计划程序。 点击Microsoft-Windows-WindowsBackup名称右击选择属性并打开。 注:选择触发器并编辑,根据需求设置时间。 设置完成。 通过以上实验,满足了用户通过共享文件夹定时实现文件的备份及恢复的需求。如有问题请批评指正,谢谢!

线性时不变(LTI)系统

线性时不变(LTI)系统 典型系统 线性系统: 线性系统是指同时满足叠加性与齐次性的系统。所谓叠加性是指当几个输入信号共同作用于系统时,总的输出等于每个输入单独作用时产生的输出之和;齐次性是指当输入信号增大若干倍时,输出也相应增大同样的倍数。不满足叠加性和齐次性的系统即为非线性系统。 更加形象的表达就是 齐次性:任意 x ( t ) ⟶ 系统 y ( t ) x(t)\overset{系统}{\longrightarrow} y(t) x(t)⟶系统​y(t) ,有 a x ( t ) ⟶ 系统 a y ( t ) ( ∀ a ϵ R ) ax(t)\overset{系统}{\longrightarrow} ay(t) \left ( \forall a\epsilon R \right ) ax(t)⟶系统​ay(t)(∀aϵR) 。叠加性:任意 { x 1 ( t ) ⟶ 系统 y 1 ( t ) x 2 ( t ) ⟶ 系统 y 2 ( t ) .

无法将“XXX”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。怎么解决...

这个错误通常表示你在 Windows PowerShell 中输入的命令无法被识别。可能是因为拼写错误,也可能是因为所需的命令或程序不在你的系统上。 要解决这个问题,你可以尝试以下步骤: 确认你输入的命令拼写是否正确。可以使用 Get-Command 命令来查看可用的命令列表。 如果你输入的命令是一个脚本文件,请确保文件路径正确,并且文件本身是可执行的。 如果你输入的命令是一个可执行程序,请确保程序已安装在你的系统上,并且你在正确的目录中。 如果仍然无法解决问题,你可以尝试使用 Get-Command 命令来查找相似的命令。 例如: Get-Com

解决VMware中Ubuntu磁盘占用过大的问题

一直在 Windows VMware 中安装的 Ubuntu 虚拟机中做开发,有一次在将 window 的一个 2GB 的大文件拖入虚拟机时,虚拟机报错说是磁盘空间不足。 看了一下本地的磁盘空间,D 盘原本还剩 100GB 左右,结果现在只剩 20MB 了且已经飘红了! 再看虚拟机设置,当初只分配了 132GB 的空间: 结果现在显示占有 200 多 GB: 但进入虚拟机查看磁盘使用情况,却显示: dfl@webdev:~$ df -hl 文件系统 容量 已用 可用 已用% 挂载点 tmpfs 980M 2.2M 978M 1% /run /dev/sda3 129G 50G 73G 41% / tmpfs 4.8G 102M 4.7G 3% /dev/shm tmpfs 5.0M 4.0K 5.0M 1% /run/lock /dev/sda2 512M 5.3M 507M 2% /boot/efi tmpfs 980M 4.7M 975M 1% /run/user/1000 /dev/sr0 3.

POI通过模板导出excel(包含表头合并处理)

最近接触到比较多poi相关的需求,总结一下通过模板导出以及表头合并的一些复杂情况处理。 简单使用的话可以参考下我之前写的 POI实现导入导出excel 目录: 1、POI通过模板导出2、POI表头合并处理 1、POI通过模板导出 其实通过模板导出的原理,无非就是去获取到指定的模板文件,然后再去转换成文件流,最后填充自己的数据再转出excel文件。 先看下模板:(模板包含了一些样式,需要手动创建比较麻烦,所以采用模板转文件流的方式) 看下代码: public static void exportMain(String templatePath){ //获取模板 File file = new File(templatePath); InputStream is = null; XSSFWorkbook wb = null; XSSFSheet sheet = null; InputStream exportInput = null; try { is = new FileInputStream(file);// 将excel文件转为输入流 wb = new XSSFWorkbook(is);// 创建个workbook, // 获取第一个sheet sheet = wb.getSheetAt(0); //例子是第四行开始表头 XSSFRow row3 = sheet.getRow(3); //获取总列数 int cellNum = row3.getLastCellNum(); //获取第四行的列 for (int i=0;i<cellNum;i++){ XSSFCell cell = row3.

数据结构——查找的基本概念

——本节内容为Bilibili王道考研《数据结构》P68~71视频内容笔记。 目录 一、基本概念 1.查找 2.查找表(查找结构) 3.关键字 4.静态查找表 5.动态查找表 6.查找长度 7.平均查找长度ASL 8.查找算法的效率评价 二、顺序查找 1.顺序查找 2.顺序查找的实现 3.图示 4.补充解释 5.有序表的顺序查找 6.被查概率不相等的情况 三、折半查找 1.折半查找 2.思想 3.算法 4.例子 5.查找效率分析 四、分块查找 1.分块查找 2.查找步骤 3.折半查找索引表 4.查找效率分析 一、基本概念 1.查找 在数据集合中寻找满足某种条件的数据元素的过程称为查找。 2.查找表(查找结构) 用于查找的数据集合称为查找表,它由同一类型的数据元素(或记录)组成。 3.关键字 数据元素中唯一标识该元素的某个数据项的值,使用基于关键字的查找,查找结果应该是唯一的。 4.静态查找表 只进行查找符合条件的数据元素的操作,无需动态地修改查找表的查找表称为静态查找表。 5.动态查找表 需要动态地插入或删除的查找表称为动态查找表。 6.查找长度 在查找运算中,需要对比关键字的次数称为查找长度。 7.平均查找长度ASL 所有查找过程中进行关键字的比较次数的平均值,其数学定义为 式中,n是查找表的长度即元素个数;Pi是查找第i个数据元素的概率,一般认为每个数据元素的查找概率相等,即Pi=1/n;Ci是查找到第i个数据元素所需要进行的比较次数即查找第i个元素的查找长度。 ASL的数量级反映了查找算法时间复杂度。 8.查找算法的效率评价 (1)平均查找长度ASL; (2)通常考虑查找成功、查找失败两种情况下的ASL。 二、顺序查找 1.顺序查找 即从头到尾依次查找,不论怎么优化,其时间复杂度都为O(n)。 2.顺序查找的实现 typedef struct { //查找表的数据结构 int* elem; //元素存储空间基址,建表时按实际长度分配,0号单元留空 int TableLen; //表的长度 }SSTable; int Search_Seq(SSTable ST, int key) { ST.

Dnscat2实现DNS隐蔽隧道反弹Shell

目录 概述 dns简介 dnscat2简介 原理简述 漏洞复现 Dnscat2环境搭建 linux服务端搭建 linux客户端搭建 开启隧道 Dnscat2工具命令的使用 概述 dns简介 DNS是域名系统(Domain Name System)的缩写,是因特网的一项核心服务,它作为可以将域名和IP地址相互映射的一个分布式数据库,能够使人更方便的访问互联网,而不用去记住能够被机器直接读取的IP数串。 DNS Tunneling可以利用其中的一些记录类型来传输数据。例如A,AAAA,MX,CNAME,TXT,,MX,SOA,NS,NULL等。 A记录:A记录是用来指定主机名对应的ip地址记录,简单的说A记录是指定域名对应的IP地址。 AAAA记录:记录将域名解析到一个指定的ipv6的ip上CNAME记录,别名解析。可以将注册不同的域名解析到一个ip地址。 NS记录:域名服务器记录,用来指定该域名是由哪个DNS服务器进行解析。 MX记录:指向的是一个邮件服务器。 TXT记录:一般是指某个主机名或域名的说明 PTR记录:反向DNS DNS的解析过程可以分为两种类型:迭代查询和递归查询。通常本机到Local DNS Server的过程属于递归查询,而Local DNS Server对查询域名的解析过程属于迭代查询。为了减轻Local DNS Server的压力,提高解析速度,引入了缓存机制。缓存和TTL紧密相连,当TTL过期,Local DNS Server则会丢弃缓存的数据,重新从权威域名服务器上获取新的数据。 本地客户端---->Local DNS server---->根域服务器 Dns解析过程:系统发出dns解析之前会先看看本地是否保存了相关域名的解析,系统检测到hosts文件中没有响应的域名解析的时候会发送给本地dns解析服务器进行解析,解析之前会看看缓存中是否存在,如果没有,再将解析请求发给下一个dns服务器。结果返回后将该域名的解析结果保存到缓存中。 dnscat2简介 dnscat2是一个DNS隧道工具,通过DNS协议创建加密的命令和控制通道,它的一大特色就是服务端会有一个命令行控制台,所有的指令都可以在该控制台内完成。包括:文件上传、下载、反弹Shell……等功能。 原理简述 Dnscat2分为两部分:客户端和服务器。 客户端: 在受感染的计算机上运行。C语言编写的,具有最小可能的依赖性。 运行模式如大多DNS隧道工具一样:Dnscat2客户端->DNS服务商->Dnscat2服务端。 如果您没有购买域名,还可以在UDP/53上使用直连。它们会更快,但它在数据包中更明显(所有域名都以dnscat为前缀,除非你破解了源代码)。防火墙经常会阻止此模式。 服务端: Ruby语言编写,在服务器上运行。它除了监听在UDP/53上发送给它的消息之外,还要指定它应该监听哪个域名。(注意,监听端口可以更改) 当它接收其中一个域名的流量时,它会尝试建立DNS连接。如果它接收到其他流量,它默认忽略它,当然你也可以在上游转发它。 漏洞复现 Dnscat2环境搭建 kali linux(服务端,攻击机) kali linux(客户端,靶机) Dnscat2工具下载入口: https://github.com/iagox86/dnscat2 可以一起搭建,先操作服务端,因gem过程很慢。 linux服务端搭建 git clone https://github.com/iagox86/dnscat2.git (github下载慢,我已下载到本地) cd dnscat2/server/ gem install bundler apt-get install ruby-dev 会提示是否需要重启,点取消(我直接回车了)

hnu计网实验一-应用协议与数据包分析实验(使用Wireshark)

前言:这是个比较简单的实验,个人认为最难的不是分析部分,而是能否抓到一个好的包。为了抓到一个好的包我试了很多个网站,终于抓京东时抓到了令我个人最满意的包,因为没有其他各种杂乱的报文,就是那几条必要的报文,因此如果抓的包不满意的话可以多尝试几个不同的网站。 一、实验目的 通过本实验,熟练掌握Wireshark的操作和使用,学习对HTTP协议进行分析。 二、实验内容 1.HTTP 协议简介 HTTP 是超文本传输协议(Hyper Text Transfer Protocol)的缩写,用于WWW 服务。 (1)HTTP 的工作原理 HTTP 是一个面向事务的客户服务器协议。尽管HTTP 使用TCP 作为底层传输协议,但 HTTP 协议是无状态的。也就是说,每个事务都是独立地进行处理。当一个事务开始时,就在web客户和服务器之间建立一个TCP 连接,而当事务结束时就释放这个连接。此外,客 户可以使用多个端口和和服务器 (80 端口)之间建立多个连接。其工作过程包括以下几个阶段。 服务器监听TCP 端口 80,以便发现是否有浏览器 (客户进程)向它发出连接请求;一旦监听到连接请求,立即建立连接。浏览器向服务器发出浏览某个页面的请求,服务器接着返回所请求的页面作为响应。释放TCP 连接。 在浏览器和服务器之间的请求和响应的交互,必须遵循HTTP 规定的格式和规则。当用户在浏览器的地址栏输入要访问的HTTP 服务器地址时,浏览器和被访问HTTP 服务器的工作过程如下: ① 浏览器分析待访问页面的URL 并向本地DNS 服务器请求IP 地解析; ② DNS 服务器解析出该HTTP 服务器的IP 地址并将IP 地址返回给浏览器; ③ 浏览器与HTTP 服务器建立TCP 连接,若连接成功,则进入下一步; ④ 浏览器向HTTP 服务器发出请求报文 (含GET 信息),请求访问服务器的指定页面; ⑤ 服务器作出响应,将浏览器要访问的页面发送给浏览器,在页面传输过程中,浏览器会打开多个端口,与服务器建立多个连接; ⑥ 释放TCP 连接; ⑦ 浏览器收到页面并显示给用户。 2、HTTP 报文格式 HTTP有两类报文:从客户到服务器的请求报文和从服务器到客户的响应报文。 图1.1 HTTP 的请求报文和响应报文结构 在图1.1 中,每个字段之间有空格分隔,每行的行尾有回车换行符。各字段的意义如下: ① 请求行由三个字段组成:

线控转向量产商用的挑战与曙光

交流群 | 进“传感器群/滑板底盘群”请加微信号:xsh041388 交流群 | 进“汽车基础软件群”请加微信号:Faye_chloe 备注信息:群名称 + 真实姓名、公司、岗位 作者 | 张萌宇 线控转向有广义和狭义之分。广义的线控转向是指由电信号控制转向功能的转向系统,不一定取消转向轮和方向盘之间的机械连接;狭义的线控转向是指由电信号控制转向功能,并且取消了转向轮和方向盘之间的机械连接的转向系统。狭义的线控转向系统,又可以分为带方向盘的和不带方向盘的,假如带了方向盘,方向盘一般不随车轮转动——比如耐世特的静默方向盘线控转向系统。 在本文的语境中,如无特殊说明,线控转向均特指狭义的线控转向。 目前在乘用车上普遍使用的是电动助力转向系统(Electric Power Steering,EPS),属于“广义”线控转向的一种,其渗透率已超过90%。如上图所示,EPS是在驾驶员转动方向盘之后,转矩传感器记录转向扭矩并传输给电控单元,电控单元计算出转向助力控制伺服电机工作从而实现助力。 与电动助力转向系统不同的是,线控转向系统(Steering By Wire System,SBW)由电控单元控制的转向电动机驱动车轮转动,车轮和方向盘之间没有机械连接。 在线控转向系统中,车轮转向执行器增加了线控的接口,转向力矩完全依靠下转向执行器来输出,而下转向执行器输出力的方向和大小以及转动的速度都依赖于控制算法的信号。这意味着,转向系统可以完全由控制算法来接管,而无需依赖于手工转动方向盘,如此一来,自动驾驶功能的实现就具备了一项先决条件。 其实,线控转向并不是一个新的概念。早在20世纪50年代,TRW和Kasselmann就提出了线控转向的概念,不过当时仅仅停留在概念中。 到了1990年,德国奔驰公司开始了线控转向的研究,并于1996年将开发的线控转向系统应用于F200概念车上。此后很多研究机构、主机厂、零部件厂商例如日本国立大学、宝马、捷太格特等都对线控转向展开了研究,并陆续推出了一些代表性产品。 1999年,宝马汽车公司推出概念车BMWZ22。在应用了线控转向技术后,此款车能够实现可变传动比,方向盘需要转动的最大角度减少到了160度,极大降低了紧急转向时驾驶员的操作难度。 2016年,采埃孚(ZF)和天合汽车(TRW)合并后展示的一辆原型车上搭载了采埃孚天合的前后桥转向系统,该系统可实现纯电动操控。2018年,博世华域与奥迪合作的线控转向产品搭载于奥迪A3上在全国巡回展示。 然而,时至今日,线控转向产品尚未大规模应用在乘用车上。2013年,英菲尼迪旗下的Q50上市,此款车上搭载了带机械冗余的线控转向。然而2014年,英菲尼迪就对Q50实施了召回,原因是线控转向系统存在安全问题。此后,市面上一直没有真正意义上搭载了线控转向的汽车量产。 直到2022年4月,丰田旗下的bZ4X上市,海外版产品使用了捷太格特的线控转向系统One Motion Grip 。在此款产品上,方向盘和前轮之间没有机械连接,取而代之的是电线和电子系统,方向盘根据汽车行驶速度和车轮转向角度改变转向比和力反馈。 但很难说bZ4X的上市代表着线控转向在乘用车上成功地实现了量产应用。 2022年6月,因为轮毂问题,丰田在海外市场对bZ4X实施了召回,此时大部分bZ4X还未正式交付。10月,丰田在全球范围内再次召回bZ4X,原因仍然是轮毂问题。在中国市场,因为法规问题,bZ4X仍然采用了带机械连接的转向系统。所以目前仍然不能说线控转向在乘用车上成功地实现了量产应用。 有投资人表示短期内对线控转向的落地不太看好,理由是目前线控转向的性价比太低,成本高但无法给驾驶员带来明显的体验提升。但今年10月采埃孚与蔚来签订协议要共同研发线控转向产品,耐世特在2022年的中报上公告拿下了某主机厂金额达20亿元的线控转向系统订单。可见,即便之前的案例算不上成功,仍然有厂商在这一领域坚持研发。 1. 研发线控转向的价值 那么,大家为什么要研究线控转向?线控转向可以给用户带来哪些体验的提升呢? 1.1 底盘线控化的一部分 有投资人提到,智能化时代,汽车的电子电气架构由分布式向域集中式再向中央集成式发展。在这种背景下,转向作为底盘的一部分,随着上下车身的解耦以及高级别自动驾驶的实现,线控化是必然的趋势。 算法可以实现比人更快的响应速度以及更高的准确度,如今很多乘用车具备的车道紧急避障功能就依赖于算法的快速响应以及精准控制。随着高等级自动驾驶的落地,用算法来控制转向将成为刚需。 清华苏研院底盘所所长高峰认为“制动、转向、悬架的线控都是底盘域集中控制的一部分。制动会向IPB+RBU(<=L3)、EMB(L4&L5)发展。转向会从有机械耦合(<=L2), 向无机械耦合(L3&L4)、无方向盘采用底盘备用终端(L5)发展。” 1.2 车身设计更灵活 线控转向取消了方向盘和转向轮之间的机械连接,给车身设计带来了更多的灵活性。机械连接的取消一方面能够节省驾驶位的空间,驾驶员腿部可以更舒展;另一方面也使得方向盘和转向轮实现了解耦,因为方向盘和转向轮不必同时转动了。 解耦之后,方向盘就可以伸缩,也可以用来实现其他功能。假如未来L4级别的自动驾驶得以实现,除用于控制车辆行驶外,方向盘还可以支持娱乐功能。可以想象这么一个场景,把游戏的界面投影到HUD,方向盘充当手柄,用方向盘来控制游戏中的道具。此外,还可以在方向盘上做一些跟音乐相关的律动,给用户带来更加真实的体验。 另外,假如实现了>=L3级别的自动驾驶,在驾驶员不用接管的时候,方向盘因为机械连接的存在一直跟随车轮转动,驾驶员的体验会比较差。 1.3 传动比更灵活 汽车转向的时候,方向盘转动的角度和车轮转动的角度的比值叫做传动比。在传统的转向系统中,方向盘和车轮执行器有机械连接,传动比是固定的。然而,一旦把机械连接去掉,传动比就是可变的。 为什么需要可变传动比呢?主要是低速行车的时候调小传动比可以使转向操作更省力,以及在高速行车的时候调大传动比可以避免不小心偏离车道。 低速行车的状态下,转动方向盘会相对吃力。在需要掉头的时候,假如不调节传动比,方向盘需要转动较大的角度才能带动车轮转动相应的角度。若将低速行车时的传动比调小,那么方向盘仅需转动较小的角度就可以带动车轮转动掉头所需的角度,从而实现便捷掉头。 高速行车状态下,方向盘很容易转动,驾驶员不经意间的动作就可能带动方向盘转动可观的角度,假如车轮跟随方向盘也转动相应的角度,车辆有可能偏离车道造成危险。那么,将高速行车时的传动比调大,就能较好地规避因驾驶员误操作带来的风险。 此外,还可以根据场景做一些定制化设计。济驭科技总经理罗永昌提到,“虽然EPS也可以在设计时通过调节齿轮大小改变转向比,但一旦设计好之后就无法改变了;相比之下,线控转向就更加灵活,在上车之后也可以根据场景做定制化设计。” 某测评博主表示“bZ4X的转向是非常运动的设定。首先这台车的方向盘盘幅就比较小,握在手里非常有运动型车的味道,并且在转动方向盘时,车头会立即做出快速响应,随着转向角度的增加,回正的力度也会以极其线性、细腻的方式变重。在快速过弯时,bZ4X的转向系统也会呈现出相当强的中心感,驾驶者可以通过手上的回馈力感知到前轮转向角度的变化。而在日常驾驶时,bZ4X的转向手感轻重适中,并不会太过于轻飘导致没有安全感,但也不会过于沉重导致开起来很累。” 当前的EPS系统毕竟带着机械连接,在自由度上不及线控转向系统。比如上文的博主测评中提到的丰田bZ4X可以实现“在转动方向盘时,车头会立即做出快速的响应,随着转向角度的增加,回正的力度也会以极其线性、细腻的方式变重。”假如用EPS系统,恐怕就很难实现。 1.4 降低车身相撞的危害程度 汉鼎智能CEO刘泽金告诉笔者:“两辆汽车相撞的时候,在相撞力的作用下,转向系统的机械连接由于没有能量回收功能,会把方向盘往驾驶员的方向推,从而对驾驶员造成伤害。有数据显示,驾驶员在车祸中受伤,很多时候都是和方向盘的撞击造成的。假如转向系统是不带机械连接的,在碰撞的瞬间,方向盘和人之间的相对速度会大幅减小,相应地,冲击力也会大幅减小,驾驶员受到的伤害就会减轻很多。” 当然,安全气囊也可以实现类似的效果,只是线控转向可以从另外一个角度减轻两车相撞对驾驶员造成的伤害。 诚然,线控转向可能是未来的趋势,但在L4级别的自动驾驶何时能落地尚不明朗的当下,搭载线控转向有必要吗?从笔者目前了解到的信息来看,产业界人士、投资人还没有达成共识。 一方认为,在L4级别的自动驾驶到来之前,搭载线控转向是没有意义的。因为就目前的情形来看,线控转向给用户带来的体验提升很有限,顶多是锦上添花,远非雪中送炭。自动驾驶最刚需的功能——用电信号来控制转向轮,现有的EPS系统也可以实现。 而且在技术还不够成熟的情形下,线控转向还会带来一些额外的麻烦。比如拿掉机械连接后驾驶员会失去“路感”,——当前的路感模拟器的效果还没有到令人特别满意的程度。以现有的技术水平,路感模拟器还很难恰到好处地把需要反馈的信息反馈给驾驶员,同时把不需要的信息过滤掉。 另一方认为,那些认为“线控转向没必要”的观点,本质上还是仅仅把车作为出行工具来看待。智能底盘行业专家齐佳宁认为,随着智能化的演进,未来的汽车远远不止是一个代步工具,它可以是智能移动空间。从这个角度,能把方向盘解放出来发挥娱乐功能的重要性就大大增加了。而且在实现了>=L3级别的自动驾驶之后,假如没有线控转向,驾驶员不操控的时候,车轮通过机械连接带动方向盘转动就会让人感觉很别扭。 虽然从功能的角度看,线控转向好像不是刚需,但当基本的技术越来越成熟的时候,能给用户体验带来提升的东西都非常值得去尝试。手机当初被发明出来是因为人们需要通信,但在智能手机时代,几乎没有人会在买手机的时候去关注它的通话功能——人们更在乎的可能是各类app运行是否流畅,拍照是否好看等,而在智能手机被大众全面认可之前,这些都会被认为“不是刚需”。 2. 线控转向上车的阻碍因素 抛开上述关于线控转向“是否必要”的争论,从当前的实际情形来看,线控转向的量产确实有很多困难。为什么时至今日线控转向仍然没有成功的量产案例呢?阻碍线控转向上车的因素有哪些呢?

77%的本科毕业生起薪超过1万元,程序员的薪资到底有多高?

都说互联网行业进入了寒冬, 可实际上,程序员的薪资还是非常可观的啊! 最近拉勾招聘数据研究院发布一则报告《2022程序员群体职场洞察报告》针对程序员群体展开调研,呈现出当下程序员的职场生存状态、薪资水平以及职业选择。 报告显示,程序员薪资水平相对较高。77%的本科毕业生起薪超过1万元,其中74%的00后应届毕业生月薪在1-3万元区间,只有23%的00后程序员薪资在1万元以下。 当然,在拥有工作经验后的程序员薪资会更高。 其中按年龄分布情况,年满35周岁85年前出生的程序员作为积累了一定年资的技术人才,在这一年龄区间,竟有33%的程序员月薪达到5万元以上。 86-90年之间出生的程序员中,薪资在3-5万元区间的程序员比例高达64%,且在这一年龄段内,有10%的程序员月薪达到5万元以上。 90年-95年出生的程序员月薪主要集中在3-5万元区间。 就连95年-00年出生的程序员中,都有21%的程序员月薪达到3-5万元。 这足以说明程序员是个越老越吃香的职业。 早在今年7月份,Code Submit 统计了2022年全球20多个国家程序员的薪酬状况,分析软件工程行业薪酬情况。 数据显示,中国程序员的平均年薪为 23790 美元(约合人民币160418元)。 从这一数据来看,中国程序员平均月薪突破万元大关,薪酬具备竞争力。 那现在的程序员最想要从事什么行业呢? 报告显示,程序员最期待从事的行业是互联网/通信/电子行业(俗称IT行业),占比为63.7%,在“互联网+”的进程中,各行业对技术型人才尤其是程序员类的需求日益增加。 消费/制造、制药/医疗、金融/保险行业的人才吸引力有所提升,分别有38.7%、20%、18.3%的IT从业者看好行业前景并期待加入。 再来说说为什么互联网行业薪资会这么高吧,究其根本就是互联网行业主要的产品都是虚拟产品,如网游或者技术服务等,其成本主要为服务器及人工成本,其中人才是关键。 一家互联网企业的发展和崛起肯定离不开技术人才,所以对于人才的重视度会更加优于其他行业,给出的工资相对也较高。 毕竟它不是机械性,重复性的工作,很多需要思考,需要技术,需要研发解决。 作者:职场不靠谱攻略 链接:https://www.163.com/dy/article/HMN7HQKR0552RA8I.html

Mybatispuls查询指定字段的方式

原文地址:Mybatispuls查询指定字段的方式_好想学习呀的博客-CSDN博客_mybatisplus根据字段查询 当我使用Mybatisplus的时候发现每次查询都是数据库的整个列进行查询,后来查询资料发现.想要查询指定列可以使用如下的方式 QueryWrapper<User> queryWrapper=new QueryWrapper(); queryWrapper.select("email").eq("email","2268435763"); List<User> list = userdao.selectList(queryWrapper); System.out.println(list); 但是在结果集里面封装的时候还是会使用完整的JavaBean进行封装,只不过是字段用null填充了

Python-实战:基于白鲸BWO算法的VMD超参数优化

目录 1、白鲸优化算法 2、BWO优化VMD参数 3、实战 3.1 原始时间序列数据 3.2 VMD分解--直接设置参数 3.3 采用BWO优化VMD 4、代码 在博客的基础上,本文利用白鲸优化算法对VMD的参数进行优化,采用python实现。 1、白鲸优化算法 白鲸优化算法([Beluga whale optimization,BWO)是由是由 Changting Zhong 等于2022 年提出的一种群体智能优化算法。其灵感来源于白鲸的群体觅食行为,具有3个阶段,分别是:探索、开发、鲸落,如下 2、BWO优化VMD参数 时间序列越复杂,包络熵的计算值越大,反之亦然。因此,应用VMD对信号进行分解后,计算每个子序列的包络值,包络最小的序列为所分解序列的趋势项。 当分解数K较小时,可能导致信号分解不足,趋势项中混入其他干扰项,导致包络熵值变大。当取适当的K值时,趋势项的包络熵变小。因此,将分解出的IMF中的最小的那个熵(局部包络熵)最小化时,VMD分解为最佳。 那么如何去找到局部包络熵,就需要用到白鲸优化算法,当前其他的优化算法都是可以实现的。适应度函数如下: '''适应度函数,最小化各VMD分量的局部包络熵''' def fitness(pop,data): np.random.seed(0) K = int(pop[0]) alpha = int(pop[1]) #print(K,alpha) tau = 0 DC = 0 init = 1 tol = 1e-7 imf,res,u_hat,omega=VMD(data, alpha, tau, K, DC, init, tol) comp=np.vstack([imf,res.reshape(1,-1)]) SE = 0 se_imf=[] for i in range(comp.shape[0]): temp= BaoLuoShang(comp[i,:]) SE +=temp se_imf.append(temp) # fit = SE # fit = SE/K fit = min(se_imf) np.

%.2f

% .2f 是一个格式化字符串,用于在 Python 程序中格式化浮点数。 其中,% 表示这是一个格式化字符串,.2 表示保留两位小数,f 表示这是一个浮点数。 例如,在 Python 中可以使用如下代码将一个浮点数格式化为字符串: x = 3.1415926535 formatted_string = "%.2f" % x print(formatted_string) # Output: 3.14 在这里,x 是一个浮点数,我们使用 %.2f 将它格式化为保留两位小数的字符串。输出的字符串为 "3.14"。

如何设置OPENAI_API_KEY

要设置 OpenAI API Key,您需要按照以下步骤操作: 在 OpenAI 网站上注册账号,并确保已通过身份验证。 登录到您的 OpenAI 账号,并转到“API”页面。 在“API”页面上,单击“创建新的 API 密钥”按钮。 在弹出的对话框中,输入新的 API 密钥的名称,然后单击“创建”按钮。 在新的 API 密钥创建后,OpenAI 会显示一个新的密钥。 请将此密钥复制到剪贴板,然后将其粘贴到您的代码中,以便在调用 OpenAI API 时使用。 注意:请确保保留此 API 密钥的安全,因为它允许您访问您的 OpenAI 账户并使用 OpenAI 的服务。

【Python】编程注意事项

1. float要规定在6位小数,否则会出问题 python自己的float太长会有问题,如18.0会被保存为17.99999999999,在和某个阈值比较时,就会出错 #四舍五入保留6位小数 round(a,6)

信号的分类

信号的分类 什么是信号? 信号是运载消息的工具,是消息的载体。从广义上讲,它包含光信号、声信号和电信号等。例如,古代人利用点燃烽火台而产生的滚滚狼烟,向远方军队传递敌人入侵的消息,这属于光信号;当我们说话时,声波传递到他人的耳朵,使他人了解我们的意图,这属于声信号; 基于信号维度的分类 一维信号:声音信号,声音强度随时间变化。 例如:下面这段声音信号,我们利用Matlab将这段信号的强度随时间变化的图像绘制出来。 WAV文件 clc clear folder='C:\Users\gzq62\Desktop\12_26.wav';%输入文件路径 [X, Fs] = audioread(folder);%读入音频 X = X(:,1); %将音频数据从wav文件中读出 %X表示wav文件中的声音数据,Fs表示音频采样率(再wav文件头中有定义) T = 1/Fs; t = (T*Fs : size(X))*T; %将横坐标点数转换为时间%这里(T*Fs : size(y))是根据 %自己想要播放wav文件中哪个时间段自己修改 t = t'; X = 100*X(T* Fs : size(X)); %截取0秒到音频结束 plot(t,X); %音频时域绘图 title("声音时域图"); xlabel("时间"); ylabel("幅值"); sound(X, Fs); %播放音频 二维信号:图像信号,图像的横纵坐标的每个点用RGB编码,其中R、G、B个个分量用八位二进制表示,每个坐标点3*8位二进制数表示。 例如:将下面图片中每个像素点的RGB分量提取出来,图片的像素是1050*1680。 %读取一张图片,并显示 original_picture=imread('C:\Users\gzq62\Desktop\202212271737310.jpg'); subplot(2,2,1); imshow(original_picture); title('原始图像的直方图') %分别读取R、G、B的值,1代表R,2代表G,3代表B image_r=original_picture(:,:,1); image_g=original_picture(:,:,2); image_b=original_picture(:,:,3); subplot(222) imshow(image_r); title('R Part'); subplot(223) imshow(image_g); title('G Part'); subplot(224) imshow(image_b); title('B Part'); 下表能更清晰的表示R分量在每个像素点的值。

C#json字符串转对象

标题字符串转dataTable public static DataTable ToDataTable(string jsonStr) { DataTable table = new DataTable(); //JsonStr为Json字符串 JArray array = JsonConvert.DeserializeObject(jsonStr) as JArray;//反序列化为数组 if (array.Count > 0) { StringBuilder columns = new StringBuilder(); JObject objColumns = array[0] as JObject; //构造表头 foreach (JToken jkon in objColumns.AsEnumerable<JToken>()) { string name = ((JProperty)(jkon)).Name; columns.Append(name + ","); table.Columns.Add(name); } //向表中添加数据 for (int i = 0; i < array.Count; i++) { DataRow row = table.NewRow(); JObject obj = array[i] as JObject; foreach (JToken jkon in obj.

给定N个正整数,请统计奇数和偶数各有多少个?

输入格式: 输入第一行给出一个正整N(≤1000);第2行给出N个非负整数,以空格分隔。 输出格式: 在一行中先后输出奇数的个数、偶数的个数。中间以1个空格分隔。 输入样例: 9 88 74 101 26 15 0 34 22 77 输出样例: 3 6 #include<stdio.h> int main() { int N = 0; int n = 0; int j = 0; int s = 0; scanf("%d", &N); for (int i = 0; i < N; i++) { scanf("%d", &n); if (n % 2 == 0) { s++;//偶数的个数 } else { j++;//奇数的个数 } } printf("%d %d", j, s); return 0; } 运行结果:

微信开发者工具模拟扫描二维码调试

本文主要介绍如何在微信开发者工具中,模拟微信扫描二维码打开小程序的场景,进行调试。(小程序码不太一样) 小程序码调试可以看这篇文章:获取微信小程序码传递的参数 / 微信开发者工具模拟扫描小程序码调试 1. 添加编译模式 添加一个咱们自定义的编译模式 2. 输入模式名称 主要是方便后面的查找 3. 设置启动页面 这里填写的页面是扫描小程序二维码后要跳转到的页面地址(我这里就是首页了) 4. 设置启动参数 类似GET的方式设置参数,设置完成以后可以通过onLoad(options) 拿到(二维码的启动参数如同例子给的一样,但是小程序码的启动参数配置不太一样)。 5. 设置进入场景 这里就是选择通过什么方式进入了,可以选择二维码,也可以选择小程序码。 选择编译方式进行编译 每次项目重新编译后,都会自动进入扫描小程序码/二维码后我们设置的启动页面,同时自动传入设置的启动参数。 结果:这里我输出了拿到的参数

python+win10toast—实现PC端通知栏消息推送

import time from win10toast import ToastNotifier def pc_toast(): toaster = ToastNotifier() header = "晏殊《清平乐·红笺小字》" # 通知的标题 text = '红笺小字。说尽平生意。\n鸿雁在云鱼在水。惆怅此情难寄。\n斜阳独倚西楼。遥山恰对帘钩。\n人面不知何处,绿波依旧东流。' # 通知的内容 time.sleep(1) # 适当休息一下,避免出现提示秒弹的情况 toaster.show_toast(title=f"{header}", msg=f"{text}", duration=10, threaded=True, icon_path=None) while toaster.notification_active(): # toaster.notification_active()判断是否有活动通知显示 time.sleep(0.005) if __name__ == '__main__': pc_toast()

c++爱心代码

c爱心代码是一个使用c语言编写的程序,其输出一个爱心形状。这通常是一个用来表示爱意或友谊的符号。爱心代码的具体实现方式可能会有所不同,但通常都是使用字符或符号的组合来构建爱心的形状。例如,下面是一个使用c语言编写的爱心代码的示例: #include <stdio.h> int main() { printf("\n"); printf("\t * *\n"); printf("\t * *\n"); printf("\t * *\n"); printf("\t * *\n"); printf("\t * *\n"); printf("\t *\n"); return 0; } 这段代码使用了多行字符串以及转义字符来输出一个爱心形状。每个星号都是一个字符,而每个换行符则是一个转义字符,用于在控制台中换行。 希望这对你有帮助!

电脑录屏软件哪个好用,分享4款不限时长的录屏软件

不管是在学习上还是在工作中都有可能需要用到录屏软件。在互联网上有众多录屏软件,那电脑录屏软件哪个好用?今天给大家分享4款不限时长的录屏软件,这些录屏软件都可以满足日常录屏需要,感兴趣的朋友可以往下看看哦。 一、电脑360浏览器录屏工具 推荐使用:★★★ 录屏优缺点:网页自带、无法录制电脑桌面 现在大部分的浏览器都有电脑录屏的功能,例如我们经常使用到的360安全浏览器就有录屏的功能。电脑录视频用什么软件,如果不想安装第三方软件,在360浏览器上观看视频可以点击“录小窗口视频”功能来录屏,具体操作步骤如下: 步骤1:打开360安全浏览器设置功能,在“选项”中点击“高级设置”并将“在视频右上角显示工具栏”功能打开。 步骤2:在录制视频的上方出现“录制小视频”即可点击录屏; 二、电脑自带的录屏组件 推荐使用:★★★ 录屏优缺点:无需安装、操作界面复杂、无法录制电脑桌面 电脑自带的录屏功能是win电脑系统为游戏玩家设置在游戏系统里面的工具;电脑录制游戏视频软件哪个好,可以使用Xbox Game Bar来录屏,电脑自带的录屏功能主要是通过Xbox Game Bar实现录屏。 步骤1:开启设置游戏中的“Xbox Game Bar”,可以在键盘上使用快捷方式“Win+Alt+G”进入到录屏界面; 步骤2:录制视频,可以按下“捕获”上的圆点,即可录制视频; 三、电脑录屏软件——傲软录屏软件 推荐使用:★★★★ 录屏优缺点:可跨平台使用、无游戏录制模式、非会员仅限1分钟 傲软录屏软件是一款可以跨平台使用的录屏软件,支持Windows、Mac等系统录制,能够帮助您同步录制电脑桌面。但傲软电脑录屏软件没有游戏录制模式,如果没有付费,录制超过1分钟的视频无法正常保存。 步骤1:打开傲软录屏软件后,可以在界面上选择录屏方式; 步骤2:根据需求自定义录制区域,调整录影框大小。然后点击界面上的"REC"按钮,即可开始录屏; 四、电脑录屏软件——专业的录屏软件 推荐使用:★★★★★ 录屏优缺点:支持win7/8/10/11以及Mac OS系统、多种录制模式、SHUJU不限制录屏时长。 如果您对视频画质以及录制游戏画面有需求,那么您可以选择这款电脑不限时长的录屏软件。该录屏软件作为一款多功能的录屏软件,除了可以进行全屏的录制,还可以自定义区域的录制,同时还有摄像头录制、游戏录制、排除窗口录制以及跟随鼠标等多种录屏方式;操作界面也比较简单,安装软件之后点击【REC】按钮即可开始录制并保存。 步骤1:在网页上下载该软件录屏软件,大家可以自定义将软件安装在其他盘里; 步骤2:将软件运行后,在软件界面可以看到“视频录制”、“音频录制”、“游戏录制”三个基本录屏模式; 步骤3:如果您有更改录屏参数的需求,可以在“视频录制”界面点击“输出设置”,进行更改。 备注:如果您没有更改录屏需求,可以使用软件默认的参数录屏; 步骤4:回到“视频录制”界面会,可以选全屏录制或者自定义录制范围;根据个人录制声音需求,可以开启“扬声器”或者“麦克风”声源;随后,点击“REC”开始录屏; 备注1:电脑怎么自动录屏,可以在软件界面,点击“计划任务”添加录屏任务,可以选择在几年几月几日,还可以精确到秒开始录屏; 步骤5:点击停止录制按钮,自动跳转到预览窗口;在预览窗口后,观看录屏完的视频;然后,点击“完成”自动帮您保存视频,可以在“历史记录”上查看视频; 备注2:在录制完成后,或者您直接也可以在软件首界面点击【录制历史】,找到需要处理的视频文件,可对勾选中的视频进行压缩、合并以及格式转换等操作。 今天小编给大家分享4款不限时长的录屏软件,这些录屏软件都可以满足日常录屏需要。关于电脑录屏软件哪个好用这个问题,小编在这推荐大家使用这款录屏软件,该软件可以不限制录屏时长,大部分功能都是可以使用的,感兴趣的朋友可以去下载试试看哦。

圣诞树的雪花飘飘(结尾附源码)

写在前面:博主是一只经过实战开发历练后投身培训事业的“小山猪”,昵称取自动画片《狮子王》中的“彭彭”,总是以乐观、积极的心态对待周边的事物。本人的技术路线从Java全栈工程师一路奔向大数据开发、数据挖掘领域,如今终有小成,愿将昔日所获与大家交流一二,希望对学习路上的你有所助益。同时,博主也想通过此次尝试打造一个完善的技术图书馆,任何与文章技术点有关的异常、错误、注意事项均会在末尾列出,欢迎大家通过各种方式提供素材。 对于文章中出现的任何错误请大家批评指出,一定及时修改。有任何想要讨论和学习的问题可联系我:zhuyc@vip.163.com。发布文章的风格因专栏而异,均自成体系,不足之处请大家指正。 圣诞树的雪花飘飘(结尾附源码) 本文关键字:圣诞节、雪花、圣诞树、动画、前端 文章目录 圣诞树的雪花飘飘(结尾附源码)一、小编碎碎念二、代码效果1. 运行效果2. 核心代码3. 代码说明 三、源码直达 一、小编碎碎念 又是一年圣诞节,刚好赶上周末,狠狠的休息了两天。节日过了之后才起来看一下有没有什么活动,还好持续周期比较长,赶上年末,好些活动的时间都重叠在了一起。作为勋章收割机,一看到活动有勋章送,那肯定是不能错过,想来写一个雪花飘落❄️配上圣诞树🎄也是极好的~ 二、代码效果 由于使用前端实现,所以代码结构十分简单,参考了一些效果不错的代码,重新修饰了一下,雪中的圣诞树就出现了。 1. 运行效果 尝试画了一下圣诞树,但是感觉画来画去一直都是卡通系,最后还是直接找一张png图片来的快一点,整体效果还是不错的,顺便温习了一下前端知识,巴适的很~ 2. 核心代码 雪花的飘落效果主要是由js来控制,生成一个canvas,调整好定位方式,就可以覆盖整个网页,代码如下: <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <title>🌟🎄</title> <script src="js/jquery.js" type="text/javascript"></script> <script src="js/snowy.js" type="text/javascript"></script> <script src="js/Snow.js" type="text/javascript"></script> <style> * { margin: 0; padding: 0; } .snow-container { position: fixed; top: 0; left: 0; width: 100%; height: 100%; pointer-events: none; z-index: 999; } .img { width: 100%; height: 2000px; background-color: black; text-align: center; } .

Java 字符串转日期

在 Java 中,可以使用 SimpleDateFormat 类将字符串转换为日期。首先,需要创建一个 SimpleDateFormat 对象,并指定日期格式。然后,调用 parse 方法将字符串转换为日期对象。 例如,假设你有一个字符串 "2022-12-28",表示日期 2022 年 12 月 28 日,并使用 "yyyy-MM-dd" 格式。你可以这样转换: String str= "2022-12-28"; SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd"); Date date = sdf.parse(str); 注意:在使用 SimpleDateFormat 进行字符串转日期时,需要注意线程安全问题。在多线程环境下使用 SimpleDateFormat 时,建议使用 ThreadLocal 来维护单独的 SimpleDateFormat 实例,以避免出现线程安全问题。 另外,在 Java 8 中,也可以使用 java.time 包中的类来转换日期。例如,使用 LocalDate.parse 方法可以将字符串转换为 LocalDate 对象。

Spring @Transactional注解事务六大失效场景

@Transactional事务失效场景1:注解在非public修饰的方法上。 原因:Spring强制的要求。 代码示例: @Transactional private void createOrder(){ } @Transactional事务失效场景2:注解在被final关键字修饰的方法上。 原因:Spring的@Transactional注解事务是通过生成一个代理子类,通过重写父类方法方式实现事务的代理增强,被final关键字修饰的方法由于不能被子类重写,所以不能通过代理增强。 代码示例: @Transactional public final void createOrder(){ } @Transactional事务失效场景3:通过this调用方法 原因:这个跟第2个场景类似,由于this这个关键字在jvm中指当前类对象,而不是spring代理后的代理对象,所以不具备事务增强能力。 代理示例: public void methodA(){ //methodB方法如果抛出异常,事务不会回滚 this.methodB(); } @Transactional public void methodB(){ } @Transactional事务失效场景4:异常被try捕获。 原因:Spring事务默认只会回滚抛出RuntimeException类型异常,如果异常被try,那么事务就不会回滚。 代码示例: @Transactional public void method() { try { //business logic process } catch (Exception e) { e.printStackTrace(); } } @Transactional事务失效场景5:抛出非RuntimeException类型异常且没有指定rollbackFor。 原因:Spring 注解事务在没有手动指定rollbackFor参数的情况下,默认只会回滚抛出RuntimeException类型异常,可以通过手动指定rollbackFor参数来改变这个策略。 代码示例: //不会回滚 @Transactional public void methodA() throws Exception { try { //business logic process } catch (Exception e) { throw new Exception("

【CSS】 定位、锚点、透明

文章目录 【CSS】 定位、锚点、透明一. 为什么需要定位?二. 定位三要素三. position 定位属性和属性值四. 偏移属性五. 定位元素的层级属性六. 包含块的概念及作用七. 锚点链接的语法和应用场景八. 透明写法 【CSS】 定位、锚点、透明 一. 为什么需要定位? 定位可以让盒子自由的在某个盒子内移动位置或固定屏幕中的某个位置,并且可以压住其他盒子。 二. 定位三要素 确定目标元素坐标系定位流 三. position 定位属性和属性值 position 定位属性,检索对象的定位方式; 语法:position:static /absolute/relative/fixed/sticky/unset/inherit**(未设置是inherit和initial的结合)/initial(最初的,初始的)** 取值: static:默认值,无特殊定位,对象遵循HTML原则; 选择器{ position: static; } absolute:绝对定位,将对象从文档流中完全拖离出来,使用left/right/top/bottom等属性相对其最接近的一个并有定位设置(基于非static)的父元素进行绝对定位;如果不存在这样的父对象,则依据 “浏览器” 进行定位,而其层叠通过z-index属性定义 <!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8" /> <meta http-equiv="X-UA-Compatible" content="IE=edge" /> <meta name="viewport" content="width=device-width, initial-scale=1.0" /> <title>Document</title> <style> .grandfather { width: 800px; height: 600px; background-color: pink; } .father { width: 500px; height: 400px; background-color: blue; position: relative; top: 20px; left: 20px; } .

调用人脸识别绘制虚拟形象的python代码

首先,你需要准备一张带有人脸的图片,并且确保你已经安装了必要的 python 库,包括 dlib 和 OpenCV。 接下来,你可以使用 dlib 库中的人脸检测器来检测图片中的人脸。这里有一个简单的例子: import dlib# 使用 dlib 的人脸检测器 detector = dlib.get_frontal_face_detector() # 读取图片 image = cv2.imread("image.jpg") # 使用人脸检测器检测图片中的人脸 face_rects = detector(image, 1) # 遍历每一个检测到的人脸 for

MARL算法系列(1):IQL【原理+代码实现】

原文题目:Multiagent cooperation and competition with deep reinforcement learning 作者:Tampuu, Ardi and Matiisen, Tambet and Kodelja, Dorian等 发表时间:2017年 主要内容:相互独立的两个DQN智能体,竞争任务下学会了相互竞争的策略,合作任务下学会了合作策略。 文章目录 1 论文基本原理1.1 Abstract1.2 Introduction1.3 Methods1.4 实验结果 实验与代码分析 1 论文基本原理 1.1 Abstract 相互独立的两个DQN智能体,竞争任务下学会了相互竞争的策略,合作任务下学会了合作策略。 1.2 Introduction 第一段,简要介绍什么是强化学习。 第二段,简要介绍强化学习算法历史,重点介绍DQN。 第三段,属于relative study,介绍了博弈论领域的多智能体合作与竞争,动物群体的合作与竞争。 第三段、第四段,简要介绍如何在雅达利游戏Pong中训练两个DQN智能体,并发现不同奖励下智能体之间会学会竞争或者合作的策略。 1.3 Methods 先介绍什么是DQN。 然后介绍如何将DQN用到Multi-agent问题中,并表示最直接的方法就是,智能体把其他智能体喝环境看作整体,每个智能体之间的决策相互独立(用原文的话说就是each agent is controlled by an independent Deep Q-Network)。 介绍针对原始DQN代码的一些修改。 介绍为什么选择Pong游戏。 介绍奖励设置:完全竞争、完全合作、既有竞争又有合作 场景奖励设置完全竞争完全合作竞争+合作 介绍训练过程,50个epoch,每个epoch执行250000个step。探索率在一百万步内从1降到0.05然后不变。 介绍游戏的一些统计指标:平均拍数,平均撞到墙壁的次数,待机时间。 1.4 实验结果 这种直观的解释还是很有说服力的。 实验与代码分析 代码,这是参考这个实现:https://github.com/starry-sky6688/MARL-Algorithms。 import torch import os from network.base_net import RNN class IQL: def __init__(self, args): self.

WSL2安装(详细过程)

提示:文章写完后,目录可以自动生成,如何生成可参考右边的帮助文档 文章目录 前言安装WSL2步骤 为Linux启用子系统检查WSL2的要求启用虚拟机功能下载Liunx内核安装包将WSL2设置为默认版本安装选择的Linux发行版安装成功 前言 引用资料:https://learn.microsoft.com/en-us/windows/wsl/about 适用于 Linux 的 windows 子系统允许开发人员直接在 Windows 上运行 GNU/Linux 环境 -- 包括大多数命令行工具、实用程序和应用程序,无需修改,而无需传统虚拟机或dualbot设置的开销。 您可以: 在Microsoft商店中选择您喜爱的GNU/Linux发行版。运行常见的命令行工具,如grep、sed、awk或其他ELF-64二进制文件。运行Bash shell脚本和GNU/Linux命令行应用程序,包括:工具:vim、emacs、tmux。语言:NodeJS、Javascript、Python、Ruby、C/C++、C#和F#、Rust、Go等。服务:SSHD、MySQL、Apache、lighttpd、MongoDB、PostgreSQL。使用自己的GNU/Linux发行包管理器安装其他软件。使用类Unix命令行shell调用 Windows 应用程序。在Windows上调用 GNU/Linux 应用程序。运行直接集成到Windows桌面的 GNU/Linux 图形应用程序将GPU加速用于机器学习、数据科学场景等 安装WSL2步骤 1.为Linux启用子系统 检查windows功能是否开启了 适用于 Liunx 的 Windows 子系统 的设置(如果未开启,开启之后需要重启电脑) cmd命令 wsl -l -v 检查管理适用于 Liunx 的 Windows 子系统的分发,如果没有分发版的则执行: wsl -l -v dism.exe /online /enable-feature /featurename:Microsoft-Windows-Subsystem-Linux /all /norestart 如果只安装WSL1,那么现在可以重新启动计算机,然后转到第六步,安装您选择的Liunx发行版。 如果要更新到WSL2,则等待重新启动计算机,然后下一步。 (注意:需要开启 适用于 Liunx 的 Windows 子系统 的设置 才重新启动计算机 如果已开启,则不需要) 2.检查WSL2的要求 (对于64位系统,版本1903或更高,版本18362或更高。 对于ARM64系统:版本2004或更高,版本19041或更高。) 检查电脑版本 :win+r 在搜索框输入 winver 查看当前版本 19044比1903高符合要求

MYSQL性能分析

MYSQL性能分析 1.慢SQL查询 开启慢sql查询机制 set global slow_query_log=on set global long_query_time=2; set global log_queries_not_using_indexes=on slow_query_log:慢查询log日志记录 on(开启)/off(关闭); long_query_time:SQL语句执行时间超过2就被认为是慢查询语句; log_queries_not_using_indexes:查询未使用索引是否开启记录慢查询日志 on(开启)/off(关闭); 查询慢sql开启的状态 可以查看到慢sql日志已开启 以及慢sql日志文件位置 show variables like '%slow%'; 查看慢sql个数 show global status like '%slow%'; 优化策略: 参考慢sql个数,根据慢sql日志查看执行较慢的sql,针对慢sql进行sql优化。 2.mysql连接数设置不合理 开启mysql执行日志 use mysql; show variables LIKE '%general_log%' 查看mysql日志开启状态; set global general_log=ON; 开启mysql日志记录 on(开启)/off(关闭); (1)如果mysql日志中出现 Too many connections的情况,则更改最大连接数。 查看最大连接数 show variables like '%max_connections%'; 查看当前的连接数 show status like 'Threads%'; 如果当前运行的线程数大于最大线程数,则更改mysql最大连接数 set global max_connections=xxxx 进行设置 3.mysql线程死锁 输入SHOW ENGINE INNODB STATUS\G;出现lock关键字则表示存在线程死锁

h5中使用微信分享

1.需要 绑定域名: 先登录微信公众平台进入“公众号设置”的“功能设置”里填写“JS接口安全域名”(即访问前端项目对应的域名)。 2.在项目中引入sdk: 在需要调用 JS 接口的页面引入如下 JS 文件,(支持https):http://res.wx.qq.com/open/js/jweixin-1.6.0.js 3.调用获取验证签名的接口(获取appid,timestamp,nonceStr,signature 等信息) 获取签名的参数为当前访问页面的地址,需要这样处理:encodeURIComponent(window.location.href.split(‘#’)[0]) 4.通过 config 接口注入权限验证配置: wx.config({ debug: true, // 开启调试模式,调用的所有 api 的返回值会在客户端 alert 出来,若要查看传入的参数,可以在 pc 端打开,参数信息会通过 log 打出,仅在 pc 端时才会打印。 appId: '', // 必填,公众号的唯一标识 timestamp: , // 必填,生成签名的时间戳 nonceStr: '', // 必填,生成签名的随机串 signature: '',// 必填,签名 jsApiList: [] // 必填,需要使用的JS接口列表,所有JS接口列表见附录2 }); 5.通过 ready 接口处理成功验证,通过 error 接口处理失败验证 wx.ready(function(){ // config信息验证后会执行 ready 方法,所有接口调用都必须在 config 接口获得结果之后,config是一个客户端的异步操作,所以如果需要在页面加载时就调用相关接口,则须把相关接口放在 ready 函数中调用来确保正确执行。对于用户触发时才调用的接口,则可以直接调用,不需要放在 ready 函数中。 }); wx.error(function(res){ // config信息验证失败会执行 error 函数,如签名过期导致验证失败,具体错误信息可以打开 config 的debug模式查看,也可以在返回的 res 参数中查看,对于 SPA 可以在这里更新签名。 }); 6.

【Simulink】线性离散系统仿真分析-低通数字滤波器

线性离散系统仿真分析 随着数字信号处理技术的快速发展,尤其是以数字信号处理芯片为核心的数字系统的设计与使用,使得数字信号处理技术得到了广泛的应用。数字信号处理技术具有诸多模拟信号处理技术所不具备的优点,因此在很多领域都开始取代传统的模拟信号处理。下面以数字滤波器系统为例来介绍线性离散系统的仿真技术。 1.数字滤波器的数学描述 数字滤波器可以对系统输入的信号进行数字滤波。这里以低通数字滤波器为例说明线性离散系统的仿真技术。低通滤波器可以滤除信号中的高频部分,以获取信号中有用的低频信号,其使用非常广泛。下面给出一个低通数字滤波器的差分方程描述: y(n)-1.6y(n -1)+ 0.7y(n - 2) = 0.04u(n)+0.08u(n -1)+ 0.04u(n -2) 其中u(m)为滤波器的输入,y(n)为滤波器的输出。由线性系统的定义可知,此低通数字滤波器为一线性离散系统。线性离散系统往往在 Z 域进行描述,由滤波器系统的差分方程可获得系统的Z变换域描述: 2.建立数字滤波器系统模型 这里使用简单的通信系统说明低通数字滤波器的功能。在此系统中,发送方首先使用高频正弦波对一低频锯齿波进行幅度调制,然后在无损信道中传递此幅度调制信号; 接收方在接收到幅度调制信号后,首先对其进行解调,然后使用低通数字滤波器对解调后的信号进行滤波以获得低频锯齿波信号。 建立此系统模型所需要的系统模块主要有: (I) Sources 模块库中的 Sine Wave 块:用来产生高频载波信号 Carrier 与解调信号Carrierl . (2) Sources 模块库中的 Signal Generator 模块: 用来产生低频锯齿波信号 sawtooth。 (3) Discrete 模块库中的 Discrete Filter 模块:用来表示数字滤波器。 (4) Math 模块库中的 Product 模块: 用来完成低频信号的调制与解调。 此外,使用高频正弦波对低频锯齿波信号进行调制时,所采用的调制方法为双边带抑制载波调制: output=inputXcarrier,其中input 为低频信号,carrier 为高频载波信号,output为幅度调制信号。建立数字滤波器系统模型如图所示。 3,系统模块参数设置, 在数字滤波器系统模型建立之后,需要对模型中各个系统模块进行如下的参数设置: (1)正弦载波信号模块 Carrier 的参数设置:频率 Frequency 为 1000 rad/sec,其余设置为默认值。 (2)信号发生器模块 Signal Generator 参数设置: Wave form 设置为 sawtooth,幅值设置为 1(默认值)与频率设置为 5。

docker多主机管理环境搭建 docker-machine

0 目录 docker-machine安装与配置 创建machine 其他命令 1 概要 docker-machine是管理多主机docker部署还支持在本机执行其他主机docker命令等功能的一个包 2 docker-machine安装与配置 参考菜鸟教程命令直接安装,成功 安装完验证是否安装成功,执行命令docker-machine version 3 创建machine machine指的就是部署docker的host,创建machine就是指通过部署docker-machine的机器,在指定主机上部署docker 1 要部署docker的主机需要docker-machine的主机可以无密码登入,因此需要复制ssh key,执行ssh-copy-id target_host_ip 2 手动尝试登入target_host,发现root密码输入对了也ssh登不进去,百度发现可能原因是目标主机禁止使用root登入,而docker-machine在其他主机部署docker需要root权限,所以需要处理保证可以root ssh登入,好像是要改一个配置文件的内容,文件名可以搜下,内容是把PermitRootLogIn xxx改成 PermitRootLogin yes,记不太清了,自己搜下 3 改完发现ssh 用root登入目标主机一直报错,发现好像还需要安装一个openssl的东西,具体命令如下,需要在client和server都安装 apt-get install openssl-client openssl-server 4 这些都弄完就可以安装machine了,命令如下 docker-machine create --driver generic --generic-ip-address=192.168.1.1 hostaa 命令功能是给这个ip安装docker,hostaa是安装完后主机名,可以自己指定 4 其他命令 可以在docker-machine部署的主机登入其他部署docker的主机并执行命令 eval `docker-machine env hostaab` 执行结束后,当前控制台会切到目标主机的控制台,然后执行docker命令的效果和在目标主机执行效果是一样的 前提是需要在/$HOME/.bashrc下配置PS=`[\u@\h \W$(__docker_machine_ps1)]\$`·,这样跳到目标主机后,命令提示符会显示当前跳到的主机的主机名,如果不配这个可能不显示

【VUE】实现自动滚动

一、场景 当内容超出元素固定高度时可以进行自动滚动。 二、实现 首先,给需要自动滚动的元素设定统一的name,方便后续滚动方法获取元素的信息,我这里举例统一用scrollBox: <el-card class="text" name="scrollBox"> 文本内容 </el-card> 其次,给需要自动滚动的元素设置样式,要满足高度固定,超出高度时出现滚动栏: height: 600px; overflow: auto; 最后,就是自动滚动方法: scrollHeight为元素展开的全部高度,scrollTop为滚动滑块所在的位置高度,clientHeight为滚动滑块的高度。 updateScrollTop() { const scrollList = document.getElementsByName('scrollBox') for (let i = 0; i < scrollList.length; i++) { const x = scrollList[i] this.scrollThen(x).then() } }, async scrollThen(x) { do { await new Promise(resolve => { setTimeout(() => { resolve() }, 100) }) if (parseFloat(x.clientHeight / x.scrollHeight) < 0.8) { if (x.scrollHeight - x.scrollTop === x.clientHeight) { x.

Docker技术原理

一、Docker架构 Docker包括三个基本概念: 镜像(Image): Docker 镜像(Image),就相当于是一个 root 文件系统。比如官方镜像 ubuntu:16.04 就包含了完整的一套 Ubuntu16.04 最小系统的 root 文件系统。容器(Container):镜像(Image)和容器(Container)的关系,就像是面向对象程序设计中的类和实例一样,镜像是静态的定义,容器是镜像运行时的实体。容器可以被创建、启动、停止、删除、暂停等。仓库(Repository):仓库可看成一个代码控制中心,用来保存镜像。 Docker 容器通过 Docker 镜像来创建,容器与镜像的关系类似于面向对象编程中的对象与类。 Docker 使用客户端-服务器 (C/S) 架构模式,使用远程API来管理和创建Docker容器。TestContainer就是通过Docker Engine的API来创建和操作容器的。Docker架构模式结构如下图所示: 下表介绍了架构模式图中涉及到的概念: 概念说明Docker 镜像(Images)Docker 镜像是用于创建 Docker 容器的模板,比如 Ubuntu 系统。Docker 容器(Container)容器是独立运行的一个或一组应用,是镜像运行时的实体。Docker 客户端(Client)Docker 客户端通过命令行或者其他工具使用 Docker SDK (https://docs.docker.com/develop/sdk/) 与 Docker 的守护进程通信。Docker 主机(Host)一个物理或者虚拟的机器用于执行 Docker 守护进程和容器。Docker RegistryDocker 仓库用来保存镜像,可以理解为代码控制中的代码仓库。Docker Hub(https://hub.docker.com) 提供了庞大的镜像集合供使用。一个 Docker Registry 中可以包含多个仓库(Repository);每个仓库可以包含多个标签(Tag);每个标签对应一个镜像。通常,一个仓库会包含同一个软件不同版本的镜像,而标签就常用于对应该软件的各个版本。我们可以通过 <仓库名>:<标签> 的格式来指定具体是这个软件哪个版本的镜像。如果不给出标签,将以 latest 作为默认标签。Docker MachineDocker Machine是一个简化Docker安装的命令行工具,通过一个简单的命令行即可在相应的平台上安装Docker,比如VirtualBox、 Digital Ocean、Microsoft Azure。 二、Docker 镜像 我们都知道,操作系统分为 内核 和 用户空间。对于 Linux 而言,内核启动后,会挂载 root文件系统为其提供用户空间支持。而 Docker 镜像(Image),就相当于是一个 root文件系统。比如官方镜像 ubuntu:18.

[Ubuntu] [Gunicorn] 部署 flask-web项目 无反向代理 步骤记录

目录 系统环境python环境WEB环境 系统环境 sudo apt-get update sudo apt-get upgrade sudo apt-get dist-upgrade #安装相关依赖 sudo apt-get install build-essential python-dev python-setuptools python-pip python-smbus sudo apt-get install build-essential libncursesw5-dev libgdbm-dev libc6-dev sudo apt-get install zlib1g-dev libsqlite3-dev tk-dev sudo apt-get install libssl-dev openssl sudo apt-get install libffi-dev python环境 #获取python wget https://www.Python.org/ftp/python/3.10.0/Python-3.10.0.tgz #解压 并进入目录 tar -zxvf Python-3.10.0.tgz cd Python-3.10.0 # 编译安装(有permission相关报错的话命令之前加上 sudo) ./configure --prefix=/usr/local/python3 make make install #创建软连接(不建议覆盖ubuntu自带的2.x版本的python,有依赖问题) ln -s /usr/local/python3/bin/python3 /usr/bin/python3 ln -s /usr/local/python3/bin/pip3 /usr/bin/pip3 #为flask创建专属环境 pip3 install virtualenv cd flask项目目录 #创建虚拟环境 virtualenv 虚拟环境名 #激活 source 虚拟环境名/bin/activate #通过requirements.

信号与系统问题解答

(1)方波序列、正弦波序列(不同频率的,单一的、混合的)、高斯序列,这几种类型的信号做傅里叶变换,求仿真频谱和理论结算结果。对二者比对验证并分析误差和导致误差的原因; (2)利用N点复数序列计算两个N点实序列的FFT;利用N点复数序列计算2N点的实序列 1.方波序列的傅里叶变换结果是一条直线,斜率为2πf,截距为0。其中f是方波的频率。 正弦波序列的傅里叶变换结果是一条直线,斜率为2πf,截距为0。其中f是正弦波的频率。 如果是不同频率的正弦波序列,傅里叶变换结果是多条直线,斜率和截距都为0,每条直线对应一个频率。 如果是混合的正弦波序列,傅里叶变换结果是多条直线,斜率和截距都为0,每条直线对应一个频率。 高斯序列的傅里叶变换结果是一个高斯函数。 当进行仿真时,需要通过计算机程序模拟信号的变化,然后计算傅里叶变换。这样得到的结果就是仿真频谱。 理论结果是通过数学计算得到的。比较仿真频谱和理论结果时,可以通过观察频谱的形状和大小,分析频谱的误差和导致误差的原因。 通常情况下,仿真频谱和理论结果会存在一定的误差。 这个误差可能是由于计算机程序的误差或者是由于数值近似造成的。要想减小误差,可以使用更精确的计算机程序,或者使用更小的步长进行计算。 2.计算N点复数序列的FFT,可以使用Fast Fourier Transform (FFT)算法。FFT是一种用于计算复数序列傅里叶变换的快速算法。 使用FFT计算N点复数序列的FFT,可以使用以下代码: import numpy as np def fft(x): N = len(x) if N <= 1: return x even = fft(x[0::2]) odd = fft(x[1::2]) T = [np.exp(-2jnp.pik/N)*odd[k] for k in range(N//2)] return [even[k] + T[k] for k in range(N//2)] + [even[k] - T[k] for k in range(N//2)] 计算两个N点实序列的FFT,可以使用以下代码: import numpy as np def fft(x, y): N = len(x) X = fft(x) Y = fft(y) return [X[k]*Y[k] for k in range(N)] 计算2N点的实序列的FFT,可以使用以下代码:

module is not defined的原因

"module is not defined" 这个错误的原因通常是因为你在 JavaScript 代码中使用了 module 这个变量,但是没有在代码之前声明它。 在 JavaScript 中,module 不是一个内置的关键字,而是在使用某些模块加载器(如 CommonJS 和 AMD)时被定义的一个变量。如果你想在你的代码中使用 module 变量,那么你必须在使用之前声明它。 例如,你可以在你的代码开头使用如下代码声明 module 变量: var module; 或者,你也可以使用以下代码在你的代码中声明和初始化 module 变量: var module= {}; 或者,你也可以使用以下代码在你的代码中声明和初始化 module 变量: var module = { exports: {} }; 这样,你就可以在你的代码中使用 module 变量了。 有时,"module is not defined" 错误也可能是因为你在使用某些模块加载器(如 CommonJS 和 AMD)时忘记了在代码之前加载这些模块加载器。在这种情况下,你需要在你的代码之前引入这些模块加载器,才能在你的代码中使用 module 变量。

python对excel删除指定行

可以使用Python的第三方库pandas来操作Excel文件。 首先,需要使用pandas的read_excel()函数读取Excel文件: import pandas as pd df = pd.read_excel('文件路径/文件名.xlsx') 然后,可以使用df.drop()函数删除指定行: # 删除第3行 df = df.drop(2) # 删除第2行到第4行 df = df.drop(range(1, 4)) 最后,使用df.to_excel()函数将修改后的数据写回到Excel文件中: df.to_excel('文件路径/文件名.xlsx', index=False) 注意,删除操作是直接在原数据上进行的,如果希望保留原数据的话,需要先将原数据复制一份再进行删除操作。 希望这能帮到你!

如何查找项目的源代码

如何查找项目的源代码 前言一 github二 CSDN三 博客园二 前言 平时科研中,为了解决某个问题,我们需要写大量的代码,有的动辄上千行,自己编写显然不太现实。那么怎么在网上找到我们所需要的源代码呢? 一 github 进入首页 在搜索框中输入要搜索的内容 随便点进去一个搜索结果看一下 上半部分是代码,下半部分是代码的说明 如果觉得代码可以的话,可以直接下载代码:下载下来是一个zip格式的压缩包 搜索时的技巧:筛选规则 选择特定的编程语言:比如python 找精品的项目:搜索时添加“Awesome" 这里就搜索到了17个精品项目 对星标进行筛选: 比如:对大于100星的进行筛选。搜索:remote sensing stars:>=100 筛选在问题描述中出现”remote sensing“关键词的项目 “remote sensing stars:>=100 in:description” 要找中文资源,中国人写的代码:”remote sensing stars:>=100 location:China" 二 CSDN 打开首页进行搜索 点击下载,就出现一些可供下载的文本或者代码 点进去下载,里面的资源是需要花钱的 但是可以看其他不需要付费的资源 这些文本和博客是可以直接看的 三 博客园 如上图,可以在首页进行搜索,用中文或者英文搜索都可以。 二

(一)LTspice简介

文章目录 前言一、举例1.1、RC滤波1.2、仿真结果 二、软件安装总结 前言 LTspice®是一款高性能SPICE仿真器软件,包括原理图捕获图形界面。可探测原理图以产生仿真结果,通过LTspice内置波形查看器轻松探索。与其他SPICE解决方案相比,LTspice的增强功能和模型改善了模拟电路仿真。 有时候我们可以算出一些电路的传递函数,但是苦于没有合适的工具来画波特图,那么我们就可以通过LTspice画已知传递函数的波特图,我们还可以用来画电路的阻抗特性曲线图。 当然除了LTspice就可以通过传递函数画出波特图外,matlab也可以画,相对来说LTspice比较简单粗暴一点。 一、举例 1.1、RC滤波 比如下图最简单的RC低通滤波器,截止频率是 电阻的阻抗是R,电容的容抗是 ,为什么会有一个虚数j呢,原因是电容作为无功元件,本身不消耗功率,在频率w的交流电作用下将会出现电流相位超前电压相位90°的情况,因此引入j来表示这种相位关系,准确的来说电容的容抗应该为== -jwc== 令s=jw,w是频率,j包含了相位信息,所以以上的传递函数等于1/(1+sRC) 1.2、仿真结果 然后我们在软件中输入我们求出的传递函数,从而画出波特图,以单位为1的交流信号进行激励,得出响应。 实线是幅频特性,虚线是相频特性求出的截止频率也是非常准确的,有的同学就说了,那我直接放置元器件进行仿真不久行了,是的,结果是一样的,没有说哪种不行,只要能达到我们的目的即可,但是我们做电路分析一定要有理论支撑,不是说仿完就完了,我们要有公式作为理论基础,我们在仿真之前,一定要求出电路的传递函数,这样我们能准确定位问题,并且能够修改参数达到我们的目的,而不是乱改一通。 那么上面只是举个例子,告诉大家有这么一个功能,后续将告诉大家如何通过传递函数或者电路来进行仿真 二、软件安装 那么他的下载网址如下,他是ADI公司出品的一款电路仿真软件,号称免费,无限制,可以说很良心了。 https://www.analog.com/cn/design-center/design-tools-and-calculators/ltspice-simulator.html 那么打开网址我们可以找到软件的下载入口,我们下载64位的 那么下拉我们可以看到,还有相应的教学,很贴心 那么我们下载安装包好后,无脑安装就可以了。 那么装好之后打开软件就是下图这个界面,可以说非常的质朴,因为这是一款很老的软件了 经典并且功能强大~ 总结 主要是adi所有的常用器件都有模型,比multisim更有针对性。 实践出真实,时间出成果 LTspice学习视频1:https://www.bilibili.com/video/BV1Sy4y1m73e/?spm_id_from=333.999.0.0 LTspice官方教程:https://www.bilibili.com/video/BV14A411P7ku?p=1&vd_source=db313bdcb497719f6656b04c6ee88fd6 LTspice电路仿真从入门到精通、LTspice视频教程、LTspice中文教程:https://www.bilibili.com/video/BV1Sy4y1m73e/?spm_id_from=333.788.top_right_bar_window_history.content.click&vd_source=db313bdcb497719f6656b04c6ee88fd6

Vue项目里如何使用路由(一)

1.路由作用: 在我看来路由就是用来切换场景的,类似于tab栏切换的效果。但是它在一个页面里切换业务场景时整体页面不刷新页面,用户体验更好 数据传递容易, 开发效率高。 2.创建路由 2.1首写要清楚在vue中创建路由会出现以下两个文件夹 views文件是创建你切换页面要显示的组件 2.2路由创建有2种方式 安装路由依赖包---vue-router 1.1---创建vue项目时,直接选择vue-router安装路由 1.2---npm安装----npm install vue-router 要想知道自己是否安装成功可以打开package.json文件是否出现以下圈出内容 第一种是系统自动帮你配置好了,第二种是全程需要自己手动配置 以下创建路由的步骤是针对第二种手动 2.3导入路由依赖包 import { createRouter, createWebHashHistory } from 'vue-router' 在以下文件中导入 2.4配置路由(核心)----路由配置文件(也是在以上的文件中配置) 配置规则 路由对象实例化 导出路由配置文件 const routes = [ { path: '路由路径', name: '路由名称', component: 路径对象对应的组件对象 } ] 2.5配置路由地址与组件的映射关系 导入页面组件,即你在views文件夹中创建的组件 此段代码写在上一步配置规则前面 2.6导入路由配置文件和挂载路由对象 在main.js中精选导入和挂载 以上路由已经配置完成了 3.使用路由 3.1将根组件里面的a标签改为router-link,href属性改为to属性 3.2在想要实现页面组件的地方 写上router-view标签 4.效果 点击上面按钮,下面内容进行切换

第二讲:网线的制作方法及步骤

这几年《网络搭建与应用》专业技能大赛所需网线需要参赛学生自己制作,所以今天讲讲网线的制作方法及步骤。 所要原料:双绞线 RJ45水晶头 所需工具:双绞线压线钳 双绞线测试仪 在制作网线之前,我们先来了解双绞线的连接方法: 双绞线的连接方法有两种:直通连接和交叉连接。 直通连接是将双绞线的两端分别都依次按白橙、橙、白绿、蓝、白蓝、绿、白棕、棕色的顺序(这是国际EIA/TIA 568B标准)压入RJ45水晶头内。这种方法制作的网线叫直通线。 交叉连接是将双绞线的一端按国际标准EIA/TIA 568B标准压入RJ45水晶头内;另一端将芯线依次按白绿、绿、白橙、蓝、白蓝、橙、白棕、棕色的顺序(这是国际EIA/TIA 568A标准)压入RJ45水晶头内。这种方法制作的网线叫交叉线。 UTP线缆的使用范围 直通线使用范围 交叉线使用范围 PC-Hub PC-PC Hub普通接口-Hub级联接口 Hub普通接口- Hub普通接口 PC-交换机 PC-路由器 路由器-交换机 路由器-路由器 交换机普通接口-交换机UPLINK口 交换机普通接口-交换机普通接口 交换机UPLINK口-交换机UPLINK口 网线制作方法图解: 1、我们先准备好需要的材料。取一条适当长度的双绞线;若干个RJ45水晶头;一把双绞线压线钳;还有双绞线测试仪。 2、用压线钳将双绞线一端的外皮剥去3CM,然后按EIA/TIA 568B标准顺序将线芯撸直并拢。 3、将芯线放到压线钳切刀处,8根线芯要在同一平面上并拢,而且尽量直,留下一定的线芯长度约1.5CM处剪齐。 4、将双绞线插入RJ45水晶头中,插入过程均衡力度直到插到尽头。并且检查8根线芯是否已经全部充分、整齐地排列在水晶头里面。 5、用压线钳用力压紧水晶头,抽出即可。 6、一端的网线就制作好了,同样方法制作别一端网线。最后把网线的两头分别插到双绞线测试仪上,打开测试仪开关测试指示灯亮起来。如果正常网线,两排的指示灯都是同步亮的,如果有此灯没同步亮,证明该线芯连接有问题,应重新制作。 7、另外需要按照EIA/TIA 568A标准的,同样的方法只是线芯的排列顺序不一样了。 8、压线的细节标准;双绞线线芯完全与水晶头接触,并有水晶头卡住双绞线的外皮。就此一条出色的网线制作完成。 注意事项:剪线芯时,如果平行线芯的部分过长,芯线之间的相互干扰会增强,影响通信效率;如果太短,水晶头的金属片不能完全接触到芯线,容易导致接触不良。 特别注意:目前《网络搭建与应用》专业技能大赛所用设备连接全部用的是T568B标准做的直通线,所以大家重点练习T568B标准做的直通线就行了。 附:网络制作视频 网线制作视频