Spring框架:String配置

String配置 <?xml version="1.0" encoding="UTF-8"?> <beans xmlns="http://www.springframework.org/schema/beans" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans.xsd"> <!-- 将UserController交给Spring管理--> <!-- id:为这个bean起一个名字,要求唯一,一般是类名的小写--> <!-- class:类的全路径--> <bean id="userController" class="com.sky.controller.UserController"> <!-- property:告诉Spring我是有依赖对象的--> <!-- name:依赖对象,使用set注入方法的配置--> <!-- ref:依赖对象的数据类型是对象时使用--> <property name="service" ref="userService"></property> </bean> <!-- 将UserService交给Spring管理--> <bean id="userService" class="com.sky.service.UserService"> <property name="mapper" ref="userMapper"></property> </bean> <!-- 将UserMapper交给Spring管理--> <bean id="userMapper" class="com.sky.mapper.UserMapper"> <!-- value:依赖对象的数据类型是简单数据类型时使用--> <property name="hell" value="sss"></property> </bean> </beans> 测试 package com.sky.test; import com.sky.controller.UserController; import org.springframework.context.ApplicationContext; import org.springframework.context.support.ClassPathXmlApplicationContext; public class Test { public static void main(String[] args) { // 加载容器 ApplicationContext applicationContext = new ClassPathXmlApplicationContext("

图解把云服务器和办公环境服务器组成局域网

最近单位迭代一个平台,功能跟微信公众号有关联,要开发API接口受理微信调用。平台测试服务器在内网,一开始我觉得这事很容易,在单位路由器上做虚拟服务器就行了。没想到试了好几次都不成功,找运营商技术支持一问才知道,我们用的是5G上网,运营商不给开放访问端口,我也真是醉了。 后来想到:测试服务器能上公网,单位也有云服务器,如果把两者通过VPN组成一个局域网,然后在云服务器上用iptables把端口指向到测试服务器,应该就能解决问题了。 具体连接方式如下图: 确定方案之后就开始搭建VPN服务器,我使用的是开源的OpenVPN服务。首先要制作证书,从 https://github.com/OpenVPN/easy-rsa/tree/release/2.x 可以下载证书制作工具,下载后是easy-rsa-release-2.x.zip。把easy-rsa-release-2.x.zip解压缩之后上传到VPN服务器/root目录。如下图: 进入/root/easy-rsa-release-2.x/easy-rsa/2.0/,咱们制作证书的所有命令都在这个目录里。如下图: 在目录里有vars文件,可以配置制作证书的参数。编辑这个文件 vim vars ,咱们只要调整下面这些配置的值就可以了。 export KEY_COUNTRY="CN" export KEY_PROVINCE="BeiJing" export KEY_CITY="HaiDian" export KEY_ORG="XXXXXX" export KEY_EMAIL="XXXXXX@XXXXXX.XX" export KEY_OU="Beijing XXXXXXX Technology Co.,Ltd." 其他的都不用修改。如下图: vars改好之后保存,执行 source vars 使vars配置生效。如下图: 下面执行 ./clean-all 命令,执行后系统会在当前目录下自动创建一个keys目录,用来存放咱们生成的证书、私钥、连接文件等。如下图: 接下来开始生成根证书和密钥,执行 ./build-ca 命令。因为咱们之前已经在vars文件里把参数都配置好了,所以现在一直按回车就可以。如下图: 执行完成后,在keys目录下会生成根证书文件ca.crt和跟密钥文件ca.key。目录下的其他文件暂时用不上,忽略就行。如下图: 下面生成服务端证书和密钥,执行 ./build-key-server server 命令,命令中后面红色的server是服务端密钥的名称,可以根据自己的情况随意起名。执行命令后一路回车,遇到[y/n]就直接y。如下图: 执行完成后可以看到,keys目录下多了服务端证书文件server.crt、服务端私钥文件server.key和服务端请求文件server.csr。如下图: 下一步咱们制作客户端证书和密钥,执行 ./build-key client 命令。命令中后面红色的client是客户端密钥的名称,可以根据自己的情况随意起名。执行命令后一路回车,遇到[y/n]就直接y。如下图: 执行完成后可以看到,keys目录下多了客户端证书文件client.crt、客户端私钥文件client.key和客户端请求文件client.csr。如下图: 下面制作密钥交换文件,执行 ./build-dh 命令。这个执行时间比较长,耐心多等一会。如下图: 执行完成后,会在keys目录下出现密钥交换文件dh2048.pem。到此咱们要用到的所有证书就已经制作完成了,下面开始安装配置OpenVPN的服务器端。 在VPN服务器上,执行 yum -y install openvpn 命令,我安装的是2.4.12版本。如下图: 安装完成后,会在 /etc 下出现openvpn目录,里面有server和client两个子目录。我们执行 mkdir /etc/openvpn/keys 命令创建一个新的keys目录用来放置要用的各种证书和密钥文件。如下图: 接下来把要用到的证书和密钥文件复制到这个keys目录中。执行: cp /root/easy-rsa-release-2.x/easy-rsa/2.0/keys/server.crt /etc/openvpn/keys/ cp /root/easy-rsa-release-2.

LIO-SAM学习笔记-整体框架

开源SLAM系统:LIO-SAM源码解析 | 攻城狮の家 LIO-SAM在LEGO-LOAM上的改进 1. 由于支持手持设备,因此没有对地面点进行特殊处理 2. 紧耦合的lidar+imu融合模块,充分利用了imu数据,对快速旋转的场景有更好的鲁棒性 3. 融合GPS,全局地图可以在没有回环的情况下有更好的全局一致性 4. 框架易于扩展 其代码的组织结构来看,和LEGO-LOAM区别不大: imageProjection.cpp:点云投影成深度图,并分类,利用ring和time给每个点去畸变。featureExtraction.cpp:提取边缘点和平面点特征。mapOptmization.cpp:基于因子图,构建点线、点面约束,回环,GPS等各种因子,最后增量平滑全图位姿。imuPreintegration.cpp:联合优化激光odom和imu数据,估计IMU偏差,进行实时的里程计估算。 大多数IMU坐标系为NED(北、东、下),robot_localization假定的IMU数据使用ENU坐标系 当k时刻的状态发生变化,则通过imu积分得到的k+1时刻的状态也会发生相应变化,而基于滑动窗口的后端优化或者因子图优化中,这些状态量会经常进行调整,如果每次状态调整都要重新计算imu积分,计算量太大。发现预积分量和k以及k+1时刻的状态无关,因此当k时刻状态发生变化时,不需要将imu数据重新积分。 由于imu的零偏会随时间发生变化,因此零偏也是系统的优化变量之一,虽然预积分量与两帧之间的速度和姿态无关,但与零偏相关。为了避免零偏的变化导致预积分重新积分,考虑到零偏的变化在段时间内变化非常小,因此将零偏一阶泰勒展开近似。 预积分量关于零偏的雅克比矩阵会在预积分计算的时候一起计算,因此,当零偏被优化调整之后,根据计算好的雅克比矩阵对预积分量进行更新即可。 实际系统是离散的,因此,每收到一帧新的imu数据后更新一次预积分量,这是一个求和的过程 预积分如何使用? 预积分约束了相邻两帧的状态量,两帧之间的零偏几乎相等。imu累计会漂移,在VIO中imu预积分和重投影误差共同约束两帧之间的状态量。 蓝色圆圈代表关键帧位姿,蓝色矩形代表关键帧速度和零偏,橙色矩形代表 IMU 预积分约束,可 以看到,它可以约束相邻帧的位姿、速度和零偏,绿色矩形代表 lidar 里程记的帧间约束,其约束相邻两帧的位置和姿态 imu标定方法 【学习总结】Lidar与IMU标定_larry_dongy的博客-CSDN博客_lidar和imu标定 lidar坐标系与imu坐标系不一致。手眼标定算法,即使先计算出两帧 lidar 之间的旋转(通过 ICP 、 NDT 等点云配准算法),然后计算出两帧 IMU 之间的旋转( IMU 陀螺仪积分),然后通过手眼标定的方式求解出外参 lidar和imu之间的旋转外参比平移外参对性能的影响更大 。 以带有IMU加速计和gps信号的小车为例,用EKF滤波和图优化方法求解某一时刻小车行驶的位置(t=0时,位置为0) EKF: 假设已知IMU和gps传感器的噪声方差 预测。 假设已知t-1时刻小车的位置(后验),将其与(t-1)~t时间段内imu的积分相加,可以预测t时刻小车的位置(先验)更新。 计算卡尔曼增益,用t时刻的gps数据更新预测的位置,得到t时刻的位置(后验)。 (这里有点递归的感jio。。。) 图优化: 小车在t-1时刻的位置加上(t-1)~t时间段内的imu积分,得到t时刻预测的小车位置。将该值与t时刻gps观测数据相减后做平方和,得到一个代价函数,其中,小车位置是待优化变量。最后用最优化方法求解即可。

信创操作系统--麒麟Kylin桌面操作系统(项目九 实用工具软件:截图、字体、扫描、打印机)

信创操作系统–麒麟Kylin桌面操作系统 (项目九 实用工具软件:截图、字体、扫描、打印机) 目录 截图字体扫描打印机 截图 (1)在桌面左下角的【开始菜单】中找到【截图】工具,如图1-1所示。 图1-1 打开【截图】工具 (2)单击运行,即可拖动鼠标选择截图区域,如图1-2所示。 图1-2 选择截图区域 (3)将鼠标放到所选择的区域内,拖动鼠标可以移动选择区域;将鼠标放到所选区域的边界线上,可以放大或缩小选择区域;如图1-3所示。 图1-3 修改区域 (4)截图矩形区域下有工具栏,截图工具栏功能说明如图1-4所示。 图1-4 截图工具栏功能 (5)在截图选定区域下方的工具栏,可以以进行截图区域的编辑,如图1-5所示。 图1-5 编辑截图区域 (6)单击右上角的图标,将截图区域固定在桌面上,拖动鼠标可以移动截图,滑动鼠标轮可以放大或缩小截图;双击截图或单击【Esc】键可以取消固定,如图1-6、1-7所示。 图1-6 固定截图 图1-7 放大截图 (7)单击【保存】,在弹出的对话框中选择保存路径,输入图片名称,选择文件类型,单击【保存】,如图1-8、1-9所示。 图1-8 单击【保存】 图1-9 保存截图 字体 (1)在设置界面单击【个性化】,如图1-10所示。 图1-10 单击【个性化】 (2)在【个性化】界面单击【字体】,在【字体选择】的下拉菜单中选择切换字体,在【等宽字体】的下拉菜单中选择切换,如图1-11所示。 图1-11 字体切换 扫描 (1)麒麟扫描是一款方便快捷的扫描工具,可将纸质文档扫描保存至系统文件夹中,文档可进行编辑、剪裁,形成可操作的电子文档。在【开始菜单】中单击【扫描】,如图1-12所示。 图1-12 开始菜单 (2)运行扫描仪,默认界面如图1-13所示。连接扫描设备后,设置纸张和分辨率,单击上方黄色按钮“扫描”进行文档的扫描操作。扫描完毕后,可针对结果进行一键美化、纠偏和文档中的文字识别。电子文档可通过面板左下方的的“发送至邮件”和“另存为”按钮选择保存的方式和途径。 图1-13 文档扫描仪 打印机 (1)在设置界面单击【设备】,如图1-14所示。 图1-14 单击【设备】 (2)在【打印机】界面,单击【添加打印机和扫描仪】,在弹出的对话框中单击【添加】,如图1-15所示。 图1-15添加打印机1 (3)在选择设备界面,单击【网络打印机】,输入打印机的IP地址,单击【查找】,如图1-16所示。 图1-16 添加打印机2 (4)单击【前进】,进入下一个界面,默认选项,单击【前进】,如图1-17所示。 图1-17 选择驱动程序1 (5)在该界面默认选项,单击【前进】,如图1-18所示。 图1-18 默认打印机型号 (6)进入【描述打印机】界面,单击【应用】,如图1-19所示。 图1-19应用打印机 (7)在弹出的对话框中单击【打印测试页】,进入打印测试界面,如图1-20、1-21所示。 图1-20打印测试页 图1-21 成功添加打印机 制作成员: 梁文婷 排版: 裕新

前端导出word文件—包含canvas(echarts图表)

一、使用的插件 html-docx-js 二、整体思路 因为canvas是运行在内存中的,所以不能简单的通过dom获取canvas图片,需要手动的先将canvas转为image。 三、实现 先克隆要下载的DOM的副本。因为canvas是运行在内存中的,所以也不能通过cloneNode方法克隆下来(克隆下来是空的)。我们这里将原DOM中的canvas转成图片,然后插入到副本的对应位置,这样操作不会影响原DOM。将DOM副本传入插件,生成文件对象,并下载下来。 import htmlDocx from 'html-docx-js/dist/html-docx' /* 步骤1 :因为canvas是运行在内存中的,所以也不能通过cloneNode方法克隆下来(克隆下来是空的), 所以先克隆再在克隆的dom上进行操作是不可取的。所以需要在原DOM上生成img, 设置display: none从而使图片不影响页面展示,并插入到对应canvas元素之前(为了保证顺序不变)。 */ const app = document.getElementById('app') const cloneApp = app.cloneNode(true) const canvases = app.getElementsByTagName('canvas') const cloneCanvases = cloneApp.getElementsByTagName('canvas') const promises = Array.from(canvases).map((ca, index) => { return new Promise((res) => { const url = ca.toDataURL('image/png', 1) const img = new Image() img.onload = () => { URL.revokeObjectURL(url) res() } img.src = url // 插入clone的dom的canvas之前 cloneCanvases[index].parentNode.insertBefore(img, cloneCanvases[index]) }) }) /* 步骤2 :删除掉canvas元素 */ // 删除clone的dom中的所有的canvas const cloneCanvas = cloneApp.

MQ实际场景解决方案参考

一、基础概念 1、MQ持久化机制 如果我们生产者每发一条消息,都要MQ持久化到磁盘中,然后再发起ack或nack的回调。这样的话是不是我们MQ的吞吐量很不高,因为每次都要把消息持久化到磁盘中。写入磁盘这个动作是很慢的,在高并发场景下是不能够接受的,吞吐量太低了。 所以MQ持久化磁盘真实的实现,是通过异步调用处理的,他是有一定的机制,如:等到有几千条消息的时候,会一次性的刷盘到磁盘上面。而不是每来一条消息,就刷盘一次。 2、confirm机制的原理 (1)消息生产者把消息发送给MQ,如果接收成功,MQ会返回一个ack消息给生产者; (2)如果消息接收不成功,MQ会返回一个nack消息给生产者; 3、消息幂等 幂等性:就是用户对于同一操作发起的一次请求或者多次请求的结果是一致的,不会因为多次点击而产生了副作用,数据库的结果都是唯一的,不可变的。 只要保持幂等性,不管来多少条重复消息,最后处理的结果都一样,需要业务端来实现。 4、消息堆积 消息中间件的主要功能是异步解耦,还有个重要功能是挡住前端的数据洪峰,保证后端系统的稳定性,这就要求消息中间件具有一定的消息堆积能力,消息堆积分以下两种情况: 消息堆积在内存Buffer:一旦超过内存Buffer,可以根据一定的丢弃策略来丢弃消息,如CORBA Notification规范中描述。适合能容忍丢弃消息的业务,这种情况消息的堆积能力主要在于内存Buffer大小,而且消息堆积后,性能下降不会太大,因为内存中数据多少对于对外提供的访问能力影响有限。消息堆积到持久化存储系统中:例如DB,KV存储,文件记录形式。 当消息不能在内存Cache命中时,要不可避免的访问磁盘,会产生大量读IO,读IO的吞吐量直接决定了消息堆积后的访问能力。 二、如何避免消息丢失 1、丢失原因? 第一种情况:一般MQ中间件为了提高系统的吞吐量会把消息保存在内存中,如果不作其他处理,MQ服务器一旦宕机,消息将全部丢失。这个是业务不允许的,造成很大的影响。 第二种情况: 就是消息刚刚保存到MQ内存中,但还没有来得及更新到磁盘文件中,突然宕机了。这个场景在持续的大量消息投递的过程中,会很常见。 2、避免消息丢失 持久化:将MQ消息持久化; confirm机制:消息发送端接受MQ的confirm通知; 通过持久化和confirm机制,这样是不是就可以保障100%消息不丢失了呢? comfirm机制其实是一个异步监听的机制,是为了保证系统的高吞吐量,这样就导致了还是不能够100%保障消息不丢失,因为即使加上了confirm机制,消息在MQ内存中还没有刷盘到磁盘就宕机了,还是没法处理。 3、辅助手段 生产者在投递消息之前,可以在本地数据库建一张消息表,先把消息持久化到Redis或DB中,这样就可以利用本地数据库的事务机制。事务提交成功后,将消息表中的消息转移到消息队列中。 confirm机制监听消息是否发送成功?如ack成功消息,删除DB中此消息或者修改消息表状态。 如果nack不成功的消息,这个可以根据自身的业务选择是否重发此消息。也可以删除此消息,由自己的业务决定。 三、如何避免消息重复消费 1、重复消费的问题? 导致重复消费的原因可能出现在生产者,也可能出现在 MQ 或 消费者。 这里说的重复消费问题是指同一个数据被执行了两次,不单单指 MQ 中一条消息被消费了两次,也可能是 MQ 中存在两条一模一样的消费。 生产者:生产者可能会重复推送一条数据到 MQ 中,为什么会出现这种情况呢?也许是一个 Controller 接口被重复调用了 2 次,没有做接口幂等性导致的;也可能是推送消息到 MQ 时响应比较慢,生产者的重试机制导致再次推送了一次消息。MQ:在消费者消费完一条数据响应 ack 信号消费成功时,MQ 突然挂了,导致 MQ 以为消费者还未消费该条数据,MQ 恢复后再次推送了该条消息,导致了重复消费。消费者:消费者已经消费完了一条消息,正准备但是还未给 MQ 发送 ack 信号时,此时消费者挂了,服务重启后 MQ 以为消费者还没有消费该消息,再次推送了该条消息。 2、如何保证幂等性? 去重原则:使用业务端逻辑保持幂等性 去重策略:保证每条消息都有唯一编号(比如唯一流水号),且保证消息处理成功与去重表的日志同时出现。 建立一个消息表,拿到这个消息做数据库的insert操作。给这个消息做一个唯一主键(primary key)或者唯一约束,那么就算出现重复消费的情况,就会导致主键冲突,那么就不再处理这条消息。 消费者怎么解决重复消费问题呢?这里提供两种方法: 状态判断法:消费者消费数据后把消费数据记录在 redis 中,下次消费时先到 redis 中查看是否存在该消息,存在则表示消息已经消费过,直接丢弃消息。业务判断法:通常数据消费后都需要插入到数据库中,使用数据库的唯一性约束防止重复消费。每次消费直接尝试插入数据,如果提示唯一性字段重复,则直接丢失消息。一般都是通过这个业务判断的方法就可以简单高效地避免消息的重复处理了。 四、如何解决消息积压 1、消息积压处理办法 首要考虑临时紧急扩容,比如:利用K8s弹性扩容,增加消费者数量;

pom文件变成灰色解决方案

原因: 新建的模块名与之前删除过的模块重名了,此时IDEA会认为此Project中需要排除该Module,可能就会导致pom文件变成灰色。 解决方案: 路径:Setting→Build Tools→Maven->Ignored Files ,找到被打勾忽略的Module,然后将Ignored Files中的打勾去掉即可。

Xshell5 连接ssh报错Connection established.解决方法

①在/etc/ssh/sshd_config配置文件最后面添加下面一行: KexAlgorithms curve25519-sha256@libssh.org,ecdh-sha2-nistp256,ecdh-sha2-nistp384,ecdh-sha2-nistp521,diffie-hellman-group14-sha1 ②保存后,重启sshd服务 #systemctl restart ssh 装载自 (4条消息) ssh 服务器发送了一个意外的数据包 - CSDN

浅谈IEEE会议论文的不出席政策Non-Presented Paper(No-Show)Policy

一般来说,会议论文设计的初衷是让中稿者在现场口头展示论文(oral)或者在大会现场海报处值守介绍论文(poster),不过由于近年来疫情的形式,出于健康考虑要出国是比较难的,造成的结果可能就是去不了现场参会。那么对于不在现场参会这一行为,有的组委会不会管,而有的会议则管的比较严,例如: ICASSP 2023 论文将不会被出版。The paper will not be published by IEEE.论文的版权仍将收归IEEE所有。The copyright of these papers will belong to IEEE.笔者注:这实际上是IEEE SPS社区内自己的规则。ICASSP作为SPS旗下的会议,因此使用了上述出席规则。 EMBC 2022 作者将被列入黑名单至少两年,EMBS旗下的会议将会直接拒稿黑名单中的作者。Authors who are listed to the EMBS no-show list will be included on said list for a period of no less than 2 years. The list of no-shows will be made available to All EMBS Conference organizers, and said organizers may reject submissions from authors included on the no show list.

HFSS 3D LAYOUT TDR仿真

接下来进行TDR的仿真 ,TDR对于查看链路中阻抗的不连续是非常重要的。 ①如下建立叠层 ②创建微带线,长度设定为10mm,宽度0.18mm ③设定仿真条件,这里说下非常重要的点,以为TDR测试的信号都是ps级别的。所以fmax必须要设定的高点,建议放到75G以上。结果如下在62ohm和计算的结果类似。 ④进行线宽的扫描,可以看到随着线快的增大,阻抗再不断降低 ⑤接下来坐下渐变线的仿真,如下前10mm为0.18mm线宽,后10mm为0.5mm,结果如下 前面是33ohm,后面是57ohm,和计算结果偏小。如果想更精确,需要提高求解的精度。 比如可以把delta这个参数该小,当然相应的计算就更慢了。

导出功能测试规范

导出功能测试规范 1.1 导出功能全量测试规范 1.1.1 普通用户页面导出能力100%覆盖,且能力 1.1.2 **管理台导出能力100%覆盖,且能力正确 1.1.3 导出默认能力正确,即默认条件下导出能力正确 1.1.4 涉及查询条件时,各查询项单一能力和组合能力正确 1.1.5 导出数据内容正确性验证 u 单元格数据值正确与页面数据一致 u 合计值与页面合计数据一致导出文件格式正确 u 国际化背景下导出数据符合国际化要求,导出时数据时间按照本地时间 1.1.6 导出文件格式正确 u 各格式内容一致性验证 u 各格式间的数据一致性验证 u EXCEL格式中,单元格格式正确(非文本,用户可直接使用Excel计算) 1.1.7 边界场景的导出能力正确 u 数量边界:下限记录/上限记录 u 数据边界: 数值类内容上下限/文本类内容上下限/其他单元格式上下限 u 时间边界:承诺时间下限/承诺时间上限/跨时区时间边界 u 文件边界:导出文件大小边界验证/导出文件个数边界验证 u 前后台边界:页面提供的边界配合后台接口边界进行验证,保证前台边界大于后台边界控制 如一个订单对应多个订单行,那么页面订单条目数符合页面边界而后台订单行超出接口边界的场景需要保证两个边界的配合合理性 1.1.8 异常场景,如数据异常的导出场景 [ 回目录 ]1.2 导出基本功能测试规范 备注:建议100%页面+接口自动化覆盖测试规范 1.2.1 导出基本能力可用 u 页面导出按钮可用 u 导出接口能力可用 1.2.2 承诺的查询条件正确 u 涉及查询条件的导出可使用100%条件覆盖原则(每一项条件至少被覆盖) 1.2.3 导出内容条目数正确 u 符合导出条件的记录在导出文件中条目正确 1.2.4 承诺的边界能力正确 u 对外承诺导出条目上下限,系统可达到

Flutter--GestureDetector手势识别组件

一、GestureDetector 的介绍 GestureDetector:是手势识别的组件,可以识别点击、双击、长按事件、拖动、缩放等手势 二、GestureDetector的源码介绍 GestureDetector({ Key key, this.child, this.onTapDown,//按下时回调 this.onTapUp,//抬起时回调 this.onTap,//点击事件回调 this.onTapCancel,//点击取消事件回调 this.onSecondaryTap, this.onSecondaryTapDown, this.onSecondaryTapUp, this.onSecondaryTapCancel, this.onTertiaryTapDown, this.onTertiaryTapUp, this.onTertiaryTapCancel, this.onDoubleTapDown,//短时间内双击按下时回调 this.onDoubleTap,//短时间内双击回调 this.onDoubleTapCancel,//短时间内双击取消事件回调 this.onLongPress,//长按事件回调 this.onLongPressStart,//长按开始事件回调 this.onLongPressMoveUpdate,//长按移动事件回调 this.onLongPressUp,//长按抬起事件回调 this.onLongPressEnd,//长按结束事件回调 this.onSecondaryLongPress, this.onSecondaryLongPressStart, this.onSecondaryLongPressMoveUpdate, this.onSecondaryLongPressUp, this.onSecondaryLongPressEnd, this.onVerticalDragDown,//垂直滑动按下事件回调 this.onVerticalDragStart,//垂直滑动开始事件回调 this.onVerticalDragUpdate,//垂直滑动更新事件回调 this.onVerticalDragEnd,//垂直滑动结束事件回调 this.onVerticalDragCancel,//垂直滑动取消事件回调 this.onHorizontalDragDown,//水平滑动按下事件回调 this.onHorizontalDragStart,///水平滑动开始事件回调 this.onHorizontalDragUpdate,//水平滑动更新事件回调 this.onHorizontalDragEnd,//水平滑动结束事件回调 this.onHorizontalDragCancel,//水平滑动取消事件回调 this.onForcePressStart,//回调函数只会在有压力的设备上被触发 this.onForcePressPeak, this.onForcePressUpdate, this.onForcePressEnd, this.onPanDown,//按压时回调 this.onPanStart,//按压拖动开始回调 this.onPanUpdate,//按压拖动回调 this.onPanEnd,//按压拖动结束回调 this.onPanCancel,//按压拖动取消回调 this.onScaleStart,//缩放开始事件回调 this.onScaleUpdate,//缩放更新事件回调 this.onScaleEnd,//缩放结束事件回调 this.behavior,//手势检测器在触摸中应该如何工作 this.excludeFromSemantics = false, this.dragStartBehavior = DragStartBehavior.start, }) : assert(excludeFromSemantics != null), assert(dragStartBehavior != null), assert(() { final bool haveVerticalDrag = onVerticalDragStart !

树莓派实现温控风扇智能降温

树莓派带外壳,但是他一直转挺吵的,然后可以通过改造一下,让他可以变成一个可控的风扇,实现一个温控的功能 需要的材料 三极管S8550 PNP型:两块多五十个杜邦线母对母杜邦线公对母 这些tb都可以买到,有包邮的店铺 然后介绍一下这些东西 三极管把平面对着自己,有三个引脚,左到右分别是E、B、C。通俗说E是正极,C是负极,相当于二极管,基级B低电平才导通电路。 然后是树莓派引脚,有四十个引脚,这里可以看到有两种编码,在写代码的时候需要指定有什么编码方式,引脚的对应是把树莓派的网线插口朝下,对应的引脚顺序 接线方式 风扇的红色是正极,接在5V,4号引脚上 这里把三极管接在风扇的负极上,即风扇的黑色线连接三极管的C级 三极管的E级连接6号引脚,接地 三极管的基级B连接8号接口,也就是BCM编码的GPIO 14号引脚 连接好以后开机,在开机的过程中风扇好像会间歇性通电,问题不大。 开机以后,在python终端执行命令试试,首先需要安装一下库 apt install RPi.GPIO 执行python GPIO_OUT=14 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(GPIO_OUT,GPIO.OUT,initial=GPIO.HIGH) self.Status=False #启动 GPIO.output(GPIO_OUT,GPIO.LOW) #关闭 GPIO.output(GPIO_OUT,GPIO.HIGH) 然后可以执行下面的命令查看树莓派的温度,输出的值除以1000就是当前的温度值 cat /sys/class/thermal/thermal_zone0/temp 最后,这是一个脚本,可以根据温度对风扇进行控制,温度超过50的时候开启,低于45的时候关闭,可以自行设置,这里还可以设置一个 import subprocess import RPi.GPIO as GPIO import time class FanController: def __init__(self,GPIO_PIN): self.GPIO_OUT=GPIO_PIN GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(self.GPIO_OUT,GPIO.OUT,initial=GPIO.HIGH) self.Status=False def action(self,flag): if flag=='start': GPIO.output(self.GPIO_OUT,GPIO.LOW) self.Status=True elif flag=='stop': GPIO.output(self.GPIO_OUT,GPIO.HIGH) self.Status=False def getTemp(): Temp=subprocess.getoutput('cat /sys/class/thermal/thermal_zone0/temp') Temp=int(Temp)/1000 print(time.strftime('%Y-%m-%d %H:%M-%S')+'\ttemp is %s oC' % (str(Temp))) return Temp Fan=FanController(14) print('start temp controller program') while True: Temp=getTemp() if Temp>50 and not Fan.

ClickHouseV20.10 详细集群部署方案

基本介绍: ClickHouse 来自俄罗斯最大的搜索公司Yandex,配置文件中可以看到Yandex的样子,于2016年开源。 ClickHouse是面向OLAP的分布式列式DBMS,OLAP(在线联机分析)性能优秀,市场反应非常强烈。 面向列的数据库更适合于OLAP方案(大量查询场景,处理速度至少提升100倍),高逼格的ClickHouse在SSD上性能表现更佳。 官网地址:https://clickhouse.tech 源码地址:GitHub - ClickHouse/ClickHouse: ClickHouse® is a free analytics DBMS for big data 主要特性: 真正的面向列的DBMS实时数据更新SQL语法支持多核并行处理数据高效压缩分布式处理数据复制完整性丰富的索引集群式管理可直接读取MySQL数据适合于在线实时查询支持近似预估计算 目前缺点: 不支持二级索引不支持事物缺乏全面的UPDATE|DELETE的实现 应用场景: 海量数据分析、报表和监控 一、先来说一下,ClickHouse为啥快 ClickHouse有多少CPU,吃多少资源,所以飞快;ClickHouse不支持事务,不存在隔离级别。这里要额外说一下,有人觉得,你一个数据库都不支持事务,不支持ACID还玩个毛。ClickHouse的定位是分析性数据库,而不是严格的关系型数据库。又有人要问了,数据都不一致,统计个毛。举个例子,汽车的油表是100%准确么?为了获得一个100%准确的值,难道每次测量你都要停车检查么?统计数据的意义在于用大量的数据看规律,看趋势,而不是100%准确。IO方面,MySQL是行存储,ClickHouse是列存储,后者在count()这类操作天然有优势,同时,在IO方面,MySQL需要大量随机IO,ClickHouse基本是顺序IO。有人可能觉得上面的数据导入的时候,数据肯定缓存在内存里了,这个的确,但是ClickHouse基本上是顺序IO,用过就知道了,对IO基本没有太高要求,当然,磁盘越快,上层处理越快,但是99%的情况是,CPU先跑满了(数据库里太少见了,大多数都是IO不够用)。 环境配置描述: 服务器:CentOS Linux release 7.4.1708 (Core) * 5台 生产环境 安装依赖: yum install -y curl pygpgme yum-utils coreutils epel-release Yum安装: sudo yum -y install yum-utils sudo rpm --import https://repo.clickhouse.tech/CLICKHOUSE-KEY.GPG sudo yum-config-manager --add-repo https://repo.clickhouse.tech/rpm/stable/x86_64 yum -y install clickhouse-server clickhouse-client clickhouse-server-common clickhouse-compressor 运行clickhouse-server: systemctl restart clickhouse-server.service 或者 /etc/init.

华为机考攻略(python)--查找排序【7题】(第二题*HJ14字符串排序)

系列文章目录 文章目录 系列文章目录前言一、*HJ14字符串排序二、sound code总结 前言 一、*HJ14字符串排序 描述: 给定n个字符,请对n个字符串按照字典序排列 数据范围: 1<=n<=1000,字符串长度满足1<=len<=100 输入描述: 输入第一行为一个正整数n(1<=n<=1000),下面n个字符串(字符串长度<=100),字符串中只含有大小写字母。 输入描述: 数据输出n行,输出结果为按照字典序排列的字符串 示例: 输入: 9 cap to cat card two too up boat boot 输出: boat boot cap card cat to too two up 二、sound code 代码如下(示例): n = int(input()) a = [] for i in range(n): b = input() a.append(b) a.sort() for i in range(n): print(a[i]) 总结 分享: 命运是一条粗细曲折的弯道。命运赐给我们的只是一个小小的角色,与其怨天尤人,倒不如全力以赴。其实,即使是一个配角也可以成为主角—–把配角做到极致就是主角。

vue版本控制器nvm安装使用教程

1.nvm是什么 nvm全英文也叫node.js version management,是一个nodejs的版本管理工具。 nvm和n都是node.js版本管理工具,为了解决node.js各种版本存在不兼容现象可以通过它可以安装和切换不同版本的node.js。 2.为什么要使用nvm 在我们搭建项目框架的时候,我们所使用的nodjs的版本往往都不是我们项目所需要的,这时就需要对版本进行降级或者升级; 虽然我们可以使用npm进行版本控制,或者下载对应的node.js,但是这样子对于我们来说过于的麻烦了,我们不可能每次都去下载,降级,这是我们就需要nvm进行版本控制 nvm是可以通过下载nodejs并保存他进行版本控制,当我们需要哪个版本时,查看版本,如果没有,我们就下载保存它,并更换它,做到了一次下载,永久使用 3.怎么使用nvm 3.1.如何下载nvm 安装包下载地址:Releases · coreybutler/nvm-windows · GitHub,windows系统下载nvm-setup.zip安装包 3.2.如何安装nvm 1. 卸载之前的node后安装nvm, nvm-setup.exe安装版,直接运行nvm-setup.exe 2.选择nvm安装路径 3.选择nodejs路径 4.确认安装即可 5.安装完确认 打开CMD,输入命令 nvm version,查看版本号 3.3如何使用nvm nvm arch:显示node是运行在32位还是64位。nvm install <version> [arch] :安装node, version是特定版本也可以是最新稳定版本latest。可选参数arch指定安装32位还是64位版本,默认是系统位数。可以添加--insecure绕过远程服务器的SSL。nvm list [available] :显示已安装的列表。可选参数available,显示可安装的所有版本。list可简化为ls。nvm on :开启node.js版本管理。nvm off :关闭node.js版本管理。nvm proxy [url] :设置下载代理。不加可选参数url,显示当前代理。将url设置为none则移除代理。nvm node_mirror [url] :设置node镜像。默认是https://nodejs.org/dist/。如果不写url,则使用默认url。设置后可至安装目录settings.txt文件查看,也可直接在该文件操作。nvm npm_mirror [url] :设置npm镜像。https://github.com/npm/cli/archive/。如果不写url,则使用默认url。设置后可至安装目录settings.txt文件查看,也可直接在该文件操作。nvm uninstall <version> :卸载指定版本node。nvm use [version] [arch] :使用制定版本node。可指定32/64位。nvm root [path] :设置存储不同版本node的目录。如果未设置,默认使用当前目录。nvm version :显示nvm版本。version可简化为v。 4.实战:使用nvm下载并使用nodejs17.0.0 1.用管理员身份启动cmd 2.使用nvm list查看已下载的版本 3.使用nvm list available查看可下载的版本 4.

js正则匹配方法:match和exec

match是字符串方法,写法为:str.match(reg) exec是正则表达式方法,写法为:reg.exec(str) 一 相同点 match和exec在匹配成功时返回的都是数组,在没有匹配上时返回的都是null 二 不同点 1、全局匹配: 当不使用全局匹配时,两者的匹配效果是一样的,仅返回第一次匹配成功的结果: var s = "ha he ha"; var reg = /h[ae]/; // 没有g var match = s.match(reg); var exec = reg.exec(s); console.log(match); // [ "ha" ] console.log(exec); // [ "ha" ] 当使用全局匹配时,两者的匹配结果出现区别: var s = "ha he ha"; var reg = /h[ae]/g;//有g var match1 = s.match(reg); var match2 = s.match(reg); var exec1 = reg.exec(s); var exec2 = reg.exec(s); console.log("match1:",match1); // [ "

Excel表格设置下拉选项并应用到整列及清除下拉项设置

Excel表格设置下拉选项并应用到整列及清除下拉项设置 需求一、Excel设置下拉项1、选中要设置的表格,点击菜单栏中的“数据”,然后找到“数据验证”2、点击“数据验证”,按照下图操作3、当表格右侧出现下拉箭头就表示设置成功了4、点击箭头就可以直接选择内容了 二、将下拉选项应用到整列三、清除下拉项设置1、选中单元格,找到刚刚的“数据验证”2、点击“全部清除”3、设置成功,下拉项清除 总结 需求 Excel中设置下拉项,并且应用到整列中,及清除下拉项设置 一、Excel设置下拉项 以“证件号码”列只能选择列中固定的选项为例 1、选中要设置的表格,点击菜单栏中的“数据”,然后找到“数据验证” 2、点击“数据验证”,按照下图操作 (1)选择“序列” (2)将下拉项中的值填入“来源”中(多个选项之间用英文逗号隔开) 3、当表格右侧出现下拉箭头就表示设置成功了 4、点击箭头就可以直接选择内容了 二、将下拉选项应用到整列 直接将光标向下拉动(复制单元格),就行则整列都有下拉选项 三、清除下拉项设置 1、选中单元格,找到刚刚的“数据验证” 2、点击“全部清除” 3、设置成功,下拉项清除 总结 找到“数据验证”,设置“序列”及对应的选项值;直接复制单元格就可以批量设置该序列;点击“全部清除”即可取消序列

Git 可视化工具 Fork 使用指南

转载请标明出处:http://blog.csdn.net/zhaoyanjun6/article/details/125135486 本文出自【赵彦军的博客】 文章目录 前言1、打开项目2、切换分支3、创建分支4、本地已经改动的文件5、commit 文件6、回滚 Changes7、创建 patch8、Squash 合并多个 commit9、rebase 参数10、修改 commit 信息11、Drop 删除 commit12、Revert Commit, 还原 Commit13、查看 Commit 信息14、从一个 Changes ,查看多个修改15、查看 Chages16、Stash 暂存一个文件17、Rebase on 两个分支18、commit 节点过滤19、Cherry-pick20、打开命令终端、打开访达、打开 sublime21、merge 合并分支 前言 最近遇到一个新项目,经过数年的积累,大概有 30000 个分支,用可视化工具打开直接卡死。 由于分支实在是太多了,一般的可视化工具,直接卡死,比如 Sourcetree 就直接卡死,测试了很多软件,最终 Fork 脱颖而出,可以完全胜任几万分支的情况。 fork: 一款 git 可视化工具 官网:https://git-fork.com/ 下载:https://cdn.fork.dev/mac/Fork-2.18.dmg 1、打开项目 2、切换分支 3、创建分支 4、本地已经改动的文件 Unstaged : 未固定的,未支持的。在 git 里还没 add 就是 Unstaged , 也就是 modified状态Staged : 暂存的、阶段的、上演、层次。在 git 里,被 add 过,还没 commit 就是 Staged 把文件从 Unstaged 移动到 Staged 5、commit 文件 6、回滚 Changes Discard 丢弃; 抛弃;

去掉桌面快捷方式角标

在桌面新建文本文档,然后打开,粘贴以下内容 @echo off color 2 reg delete HKCR\lnkfile /v IsShortcut /f reg delete HKCR\piffile /v IsShortcut /f reg delete HKCR\InternetShortcut /v IsShortcut /f taskkill /f /im explorer.exe && explorer 粘贴好以后,就把文件另存为 1.bat 再点保存,最后双击打开该文件,任务执行了就可以了 效果图: