TiKV 新架构:Partitioned Raft KV 原理解析

导读 TiKV 推出了名为“partitioned-raft-kv”的新实验性功能,该功能采用一种新的架构,不仅可以显著提高 TiDB 的可扩展性,还能提升 TiDB 的写吞吐量和性能稳定性。 架构 以下是 TiKV 的架构。 图 1 TiKV 架构 —— 逻辑数据分区 一个 TiKV 集群由许多数据分区(也称为 Region)组成。每个 Region 负责特定的数据片段,由其起始和结束键范围决定。它在不同的 TiKV 节点上拥有 3 个或更多的副本,并通过 raft 协议进行同步。在旧的 raft 引擎中,每个 TiKV 中只有一个 RocksDB 实例用于存储所有 Region 的数据。partitioned-raft-KV 特性引入了一个新的物理数据布局:每个 Region 都有自己的 RocksDB 实例。 图 2:物理数据布局比较 旧 Raft KV 引擎面临的挑战 "Region" 是 TiKV 中的逻辑规模单元。每个数据访问和管理操作,如负载均衡、扩展和缩小都由 Region 进行分区。然而,在当前架构中,它是一个纯逻辑概念,物理上没有清晰的区域边界。这意味着: 1.当需要将一个 Region 的数据从一个 TiKV 移动到另一个 TiKV(也称为负载均衡)时,TiKV 需要在巨大的 RocksDB 实例中进行扫描以获取该 Region 的数据。这造成了读扩大。 2.当几个 Region 具有大量的写流量时,如果它们的键范围分散,那么很可能会触发 RocksDB 中的大型压缩,其中包括其他空闲 Region 的数据。这引入了读和写扩大。例如,SST11 是一个 1MB 大小的 SST,只有 region1 的数据,但包含相当大的键范围。当它被选中合并到 L2 时,SST21、SST22 和 SST23 都参与了压缩,它们包含了 region2、3、4 的数据。TiKV 的规模越大,读写扩大越大。

yolo数据集 标签格式转换以及数据集划分

1 xml格式转txt格式 import xml.etree.ElementTree as ET import pickle import os from os import listdir, getcwd from os.path import join import glob classes = ["", "", "", ""] #这里是需要改的第一个地方,写入自己的标签类型,不可多写,不可少写 def convert(size, box): dw = 1.0 / size[0] dh = 1.0 / size[1] x = (box[0] + box[1]) / 2.0 y = (box[2] + box[3]) / 2.0 w = box[1] - box[0] h = box[3] - box[2] x = x * dw w = w * dw y = y * dh h = h * dh return (x, y, w, h) def convert_annotation(image_name): in_file = open("

小米平板6 Max 14评测:4窗口显示就是爽 多任务体验可媲美PC

一、前言:小米发布新款14英寸超大屏平板 专注生产力体验 加上网课、居家办公的普及,再加上各大手机厂商都开始搭建起自家的生态,尤其平板这个以往不被重视的品类,也开始找到了它自身的定位。 尤其在2023年上半年发布的小米平板6 Pro,旗舰机配置、不俗的品质、实惠的售价,一经推出纷纷直呼“真香”! 时隔半年,小米又推出了这款尺寸更大的小米平板6 Max 14,在原有骁龙8+、LPDDR5X、UFS 3.1旗舰三件套的配置上,还引入了不少新功能。 1、高素质的14英寸至尊超大屏 从小米平板6 Max 14这个命名,14英寸屏幕主打的就是“巨无霸”,显示面积比自家11英寸的小米平板还要大了62%,比12.4英寸的小米平板还要大28%,极具视觉冲击力。 这款14英寸平板将屏幕做到更大的同时,每片屏幕都经过了出厂校色,2.8K分辨率、120Hz,还支持P3色域显示,HDR10、杜比世界,保证了出色的显示效果。 配合覆盖了高中低频的8扬声器系统,这也是小米有史以来外放效果最好的小米平板,在观影时可以带来更沉浸的视听感。 2、生产力更进一步 带来全新模式工作台 在生产力上,这款小米平板6 Max进一步挖掘出了它自身的潜力,带来了专为大屏打造的工作台模式。 这也是为了充分利用14英寸大屏的优势,毕竟日常生产力时,都是一个窗口运行多个任务,传统平板模式只能一个一个来回切换,这也是为什么效率自然不如PC。 而这工作台模式下,所有程序默认以窗口形式打开,可4个窗口同时显示,一边刷资讯一边做笔记一边查资料,这些都能在一个屏幕内实现,让娱乐性、生产力上的体验也取得了质的飞跃。 为了提升生产力,小米还将PC上的WPS移植到这款平板上,保留了PC用户最熟悉的操作,最大程度减少了用户的操作门槛。 3、全新键笔带来完全体形态 化身为二合一笔记本 既然主打生产力方面,搭配键笔套装也是必不可少,能够将平板化身为“二合一笔记本”,多变的形态足够灵活。 小米就为这款平板带来了全新的分体式智能触控键盘和焦点触控笔,从而实现PC级的操作,满足多种使用场需求需求,堪称是生产力神器。 接下来,快科技就对这款小米平板6 Max 14来体验一波。 二、外观:14英寸超大屏带来更沉浸体验 搭配键笔化身二合一笔电 小米平板6 Max正面搭载了14英寸的LCD屏,2880×1800的分辨率、120Hz的刷新率,最高亮度可达600nits。 每一块屏幕都经过了色彩校准,支持HDR10、杜比视界、专业原色显示。 可以与小米MIX Fold 3、小米13 Ultra、小米电视大师86"保持了高度的色彩一致性,显示效果自然不需要担心。 也因为屏幕更大,在日常玩游戏、看剧时,会让你更有沉浸感。 背面造型非常简约,仅有左上角的小米LOGO和 右上角5000万像素的摄像模组,边框和后盖都采用了全金属材质,极具质感。 顶部和底部中框一览,厚度仅有6.53mm,整机重约750g,虽然不算重,但尺寸太大了,并不算好拿,建议日常搭配磁吸键盘,可以自由摆放,使用时也不会太累手。 整机共有4个中低音单元+4个高音单元组成的8扬声器,支持杜比全景声、MiSound,带来极具沉浸感的听觉体验。 4麦克风可以在视频、语音时抑制环境噪音,只聚焦你的声音,更清晰的通话效果有助于提升双方沟通的效率。 配合磁吸键盘鼠标,就可以将小米平板6 Max化身为轻巧的可移动笔记本,还同时兼顾到支架和保护套的作用。 配合正面的TOF激光传感器,人来时可以亮屏解锁,人走就能自动锁屏,兼顾了便利和隐私,非常方便。 这智能触控键盘采用了触点和蓝牙双模连接,使用方式更加灵活。 后面的支架,在观影、办公、绘画时,都可以调到最舒服的角度。 我们收到的还有焦点触控笔,支持8192级压感、5nm低延迟,还是非常跟手的,平常不用时放在平板顶就可以自动充电,因为有磁吸,所以日常也不用担心会掉下来。 上面的按键分别是速记键、截图键、焦点键。 速记键点一下屏幕就能直接新建笔记,配合截图键,在APP内也能当做上下翻页键使用。 焦点触控笔可当做激光笔来使用,很合适在开会时这类场景演示时标注重点,动图体验在下面生产力章节部分。 为了带来更好的输入体验,小米的智能触控键盘使用了全尺寸大16mm大按键、19mm大间距、1.3nn键程,在体验上与笔记本差别并不大。 并且还带来了15个全新独立按键(顶部13个+底部语音输入键、任务键),从而实现一键禁用麦克风、切换屏幕亮度、音量大小、一键锁屏等操作。 底部的83.8㎡的触控板,也很接近PC触控板的大小,可通过多指手势来实现不同的操作。 比如可以双指向左右滑动可以返回上一级,三指下滑就实现截屏、三指上划停顿可以呼出最近任务。 三、生产力体验:工作台模式可实现4窗同时运行 照片编辑更专业直观 ——工作台模式 左为正常桌面,右为工作台模式。 在工作台模式下,与传统桌面不同的是,去掉了常规的干扰信息,仅保留了底部Dock栏,所有的应用都可以通过Dock栏的左下角的“全部应用”图标打开二级菜单。 工作台模式的桌面看起来更清爽的同时,也有PC级桌面那味道了。 在工作台模式中,交互也与传统平板模式有所不同。 在这个模式下,所有的应用以窗口形式打开,最多可实现3个窗口+1个浮窗,每个窗口都能独立运行。 而传统平板模式下,最多只能显示2个窗口,包括浮窗,应用以全屏形式打开。 这样的好处就是,你可以在小米平板6 Max上,一边聊天一边刷剧一边码字一边查资料,避免了应用之间来回切换。 笔者觉得在工作台模式下,与PC相同逻辑的多任务体验上也更便捷,操作也更高效,使用过程也更爽一些。

几个实用的JavaScript编写技巧(下)

下面继续我们JavaScript编写技巧的学习 5. 熟练地实现For循环 如果您仍在 JavaScript 中使用 C/C++ 风格的 for 循环,那么,您肯定需要提升您的技能。 下面的代码是没问题的,但是他还不够JavaScript const arr = ['Y', 'a', 'n', 'g'] for (let i = 0; i < arr.length; i++) { console.log(arr[i]) } // Y // a // n // g 在编写JavaScript代码中,推荐使用数组方法代理for循环 forEach forEach 方法非常适合迭代数组的元素: const author = [ 'Y', 'a', 'n', 'g' ]; author.forEach((c)=>{console.log(c)}) // Y // a // n // g map() 如果您阅读开源 JavaScript 程序,您可能会遇到 map() 函数。它是 JavaScript 中最流行的方法之一 const author = [ 'Y', 'a', 'n', 'g' ]; author.

基于javaweb+mysql的springboot在线小说阅读系统(前后端分离+java+vue+springboot+ssm+mysql+maven)

基于javaweb+mysql的springboot在线小说阅读系统(前后端分离+java+vue+springboot+ssm+mysql+maven) 运行环境 Java≥8、MySQL≥5.7、Node.js≥10 开发工具 后端:eclipse/idea/myeclipse/sts等均可配置运行 前端:WebStorm/VSCode/HBuilderX等均可 适用 课程设计,大作业,毕业设计,项目练习,学习演示等 功能说明 基于javaweb+mysql的SpringBoot在线小说阅读系统(前后端分离+java+vue+springboot+ssm+mysql+maven) 一、项目简述 本系统功能包括: 普通用户端登录注册,小说的分类,日榜,月榜,年榜, 小说的阅读,分章节,小说的评论,收藏,推荐等等,以 及后台小说的维护,上架,编辑等等。 二、项目运行 环境配置: Jdk1.8 + Tomcat8.5 + Mysql + HBuilderX (Webstorm也 行)+ Eclispe (IntelliJ IDEA,Eclispe,MyEclispe,Sts都支 持)。 项目技术: Springboot + Maven + Mybatis + Vue , B/S 模式+ Maven等等 @GetMapping("/count") @ApiOperation("查询Recommend") public ResponseObject getCount(Integer novel_id) { log.info("查询Recommend"); if (novel_id == null) { throw new ControllerException("novel_id不可为null"); } else { return new ResponseObject("200", "操作成功", recommendService.selectByNovel_id(novel_id).size()); } } @GetMapping("/novel") @ApiOperation("

linux开放端口-centos与unbutu

centos // 查看已开放的端口 firewall-cmd --list-ports // 开放端口(开放后需要要重启防火墙才生效) firewall-cmd --zone=public --add-port=3338/tcp --permanent // 重启防火墙 firewall-cmd --reload // 关闭端口(关闭后需要要重启防火墙才生效) firewall-cmd --zone=public --remove-port=3338/tcp --permanent // 开机启动防火墙 systemctl enable firewalld // 开启防火墙 systemctl start firewalld // 查看防火墙状态 firewall-cmd --state // 禁止防火墙开机启动 systemctl disable firewalld // 停止防火墙 systemctl stop firewalld unbutu // 开放端口 sudo ufw allow 7001/tcp //查看开放状态 sudo ufw status //关闭防火墙 sudo ufw disable //开启防火墙 sudo ufw enable

vue3.0 element-plus 不同版本 el-popover 循环优化

表格内循环el-popover 渲染以后的页面,数据量很大的时候页面会卡,生成的代码: 解决思路:将el-popover提出来,不参与循环,让el-popover只渲染一次 1、以1.1.0-beta.24版为例(低版本) 红色下划线部分是关键点 v-popover的值与el-popover的ref值要一致 2、以2.3.9版为例(当前新版本) 与低版本不同, v-popover被弃用了 以官方文档为例 :virtual-ref 可以直接传dom,这样变得更简单了,主需要把需要操作的控件对应的dom直接赋值给变量,传给:virtual-ref就行,举例:

STM32--数码管显示使用

STM32 – 数码管显示 简介 1.硬件部分 STM32F103C8T6 最小系统板 一位共阴数码管 2.软件部分 Keil软件编程 数码管码表 硬件部分 数码管 简介 数码管,也称作辉光管,是一种可以显示数字和其他信息的电子设备。玻璃管中包括一个金属丝网制成的阳极和多个阴极。大部分数码管阴极的形状为数字。管中充以低压气体,通常大部分为氖加上一些汞和/或氩。给某一个阴极充电,数码管就会发出颜色光,视乎管内的气体而定,一般都是橙色或绿色。 分类 数码管也称LED数码管,不同行业人士对数码管的称呼不一样,其实都是同样的产品。 按发光二极管单元连接方式可分为共阳极数码管和共阴极数码管。共阳数码管是指将所有发光二极管的阳极接到一起形成公共阳极(COM)的数码管,共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。共阴数码管是指将所有发光二极管的阴极接到一起形成公共阴极(COM)的数码管,共阴数码管在应用时应将公共极COM接到地线GND上,当某一字段发光二极管的阳极为高电平时,相应字段就点亮,当某一字段的阳极为低电平时,相应字段就不亮。 1.共阳数码管 共阳数码管在应用时应将公共极COM接到+5V,当某一字段发光二极管的阴极为低电平时,相应字段就点亮,当某一字段的阴极为高电平时,相应字段就不亮。 2.共阴数码管 对于共阴极数码管来说,当某个发光二极管的阳极为高电平时,发光二极管点亮,相应的段被显示。同样,共阳极数码管的阳极连接在一起,公共阳极接+5V,当某个发光二极管的阴极接低电平时,该发光二极管被点亮,相应的段被显示 数码管码表 unsigned char code smgduan[17] ={0xc0, 0xf9, 0xa4, 0xb0, 0x99, 0x92, 0x82, 0xf8, 0x80, 0x90, 0x88, 0x83, 0xc6, 0xa1, 0x86, 0x8e};//共阳数码管 unsigned char code smgduan[17]={0x3f,0x06,0x5b,0x4f,0x66,0x6d,0x7d,0x07, 0x7f,0x6f,0x77,0x7c,0x39,0x5e,0x79,0x71};共阴数码管 静态数码管硬件电路设计 实物 软件部分 /********************************************************************** * 文件名 :smg.c * 描述 :smg 应用函数库 * 硬件连接:----------------- * | PA0 - A | * | PA1 - B | * | PA2 - C | * | PA3 - D | * | PA4 - E | * | PA5 - F | * | PA6 - G | * | PA7 - DP | * ----------------- *********************************************************************/ #include "

Matlab评价模型--灰色关联度分析

评价模型–灰色关联度分析 灰色关联度分析 基本思想 灰色关联分析的基本思想 是根据序列曲线几何形状的相似程度来判断其联系是否紧密,曲线越接近,相应序列之间的关联度就越大,反之则越小。 此方法可用于 进行系统分析,也可应用于对问题进行综合评价。 分析主要,次要因素 一般的抽象系统,如社会系统、经济系统、农业系统、生态系统、教育系统等都包含有许多种因素,多种因素共同作用的结果决定了该系统的发展态势。人们常常希望知道在众多的因素中,哪些是主要因素,哪些是次要因素;哪些因素对系统发展影响大,哪些因素对系统发展影响小;哪些因素对系统发展起推动作用需强化发展,哪些因素对系统发展起阻碍作用需加以抑制;这些都是系统分析中人们普遍关心的问题。例如,粮食生产系统,人们希望提高粮食总产量,而影响粮食总产量的因素是多方面的,有播种面积以及水利、化肥、土壤、种子、劳力、气候、耕作技术和政策环境等。为了实现少投人多产出,并取得良好的经济效益、社会效益和生态效益,就必须进行系统分析。 案例分析 多因素指标,对于一个单因素指标的影响(灰色关联度分析) 原理分析 求解关联度大小 多因素指标,对于多因素指标的影响(灰色关联度分析) 在次案例中,5项投资是待比较数列亦即子因素,而6项收人则为参考数列亦即母因素。这里取分辨率p=0.5。 clc; close; clear all; % 控制输出结果精度 format short; % 原始数据 x=[308.58 310 295 346 367 195.4 189.9 187.2 205 222.7 24.6 21 12.2 15.1 14.57 20 25.6 23.3 29.2 30 18.98 19 22.3 23.5 27.655 170 174 197 216.4 235.8 57.55 70.74 76.8 80.7 89.85 88.56 70 85.38 99.83 103.4 11.19 13.28 16.82 18.9 22.

mybatis动态表名(分库分表)

//测试代码 @RestController public class UserController { @Resource private UserMapper userMapper; @Autowired MysqlTbNameUtil mysqlTbNameUtil; @GetMapping("/selectByAge") @ResponseBody public Object selectByAge() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, "tb001").selectByAge(27); // return userMapper.selectByAge(27); } @GetMapping("/selectByAge2") @ResponseBody public Object selectByAge2() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, "tb001").selectByAge2(27); // return userMapper.selectByAge2(27); } @GetMapping("/selectByAgeAndName") @ResponseBody public Object selectByAgeAndName() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, "tb001").selectByAgeAndName(1, "ctl"); // return userMapper.selectByAgeAndName(1, "ctl"); } @GetMapping("/selectByAgeAndName2") @ResponseBody public Object selectByAgeAndName2() { return mysqlTbNameUtil.getMapperPlus(UserMapper.class, "tb001").selectByAgeAndName2(1, "ctl"); // return userMapper.selectByAgeAndName2(1, "ctl"); } @GetMapping("

java POI 下载Excel自定义模板 导入Excel 导出Excel

一、应用场景 1.点击导入按钮,弹出导入框 2.点击下载模板,用户在模板中填入数据 3.导入模板数据 4.经过一系列处理后,根据模板导出数据 二、下载Excel模板 public void downloadTemplate(HttpServletResponse response) { String newFileName = null; try { // URLEncoder.encode可以防止中文乱码 newFileName = URLEncoder.encode("模板名称", "UTF-8").replaceAll("\\+", "%20"); } catch (UnsupportedEncodingException e) { e.printStackTrace(); } // 当客户端请求的资源是一个可下载的资源(这里的“可下载”是指浏览器会弹出下载框或者下载界面)时,对这个可下载资源的描述(例如下载框中的文件名称)就是来源于该头域。 response.setHeader("Content-disposition", "attachment;filename*=utf-8''" + newFileName + ".xlsx"); // 服务器告诉浏览器它发送的数据属于什么文件类型,也就是响应数据的MIME类型 response.setContentType("application/vnd.openxmlformats-officedocument.spreadsheetml.sheet"); response.setCharacterEncoding("utf-8"); // 关闭缓存(HTTP/1.1) response.setHeader("Cache-Control", "no-store"); // 关闭缓存(HTTP/1.0) response.setHeader("Pragma", "no-cache"); // 缓存有效时间 response.setDateHeader("Expires", 0); InputStream inputStream = null; OutputStream outputStream = null; try { // 自定义模板路径 当时位置为 resources/download.xlsx inputStream = new ClassPathResource("

vue js获取最近1周、最近1个月、最近3个月的日期范围

先上效果图: 一、封装的组件latelyTime.js: // 最近1周、最近1月、最近3个月 时分秒为00:00:00 // 明天的时间 var tomorrow = new Date() tomorrow.setTime(tomorrow.getTime() + 24 * 60 * 60 * 1000) var end = tomorrow // 今天的时间 // var end = new Date() var year = end.getFullYear() var month = end.getMonth() + 1 // 0-11表示 1-12月 var day = end.getDate() var dateObj = {} dateObj.start = null dateObj.end = year + '-' + month + '-' + day var endMonthDay = new Date(year, month, 0).

airflow的安装

文章目录 前言一、Airflow基本概念1.概念2. 名词 二、Airflow安装1.Airflow官网2.安装python环境3. 安装anaconda34. 创建airflow虚拟环境5. 安装Airflow1. 更改pip源2. 安装airflow3. 初始化airflow4. 查看版本5. 查看airflow安装的路径6.创建账号7. 启动airflow调度8. 启动airflow web 服务, 6. 安装后的细节问题1. 修改数据库为mysql2. 登录mysql, 并进行airflow数据库的相关配置3. 进行airflow的相关配置4. 重新初始化airflow, 启动相关服务5. 重新创建账号登录:6. 启动airflow, 并打开查看 总结 前言 随着任务的增多, 需要顺序的自动执行, 这个时候就需要有一款合适的框架, 对工作流进行执行和监控, 所以在这里选择了airflow的使用. 一、Airflow基本概念 1.概念 Airflow 是一个以编程方式编写,安排和监视工作流的平台。 使用 Airflow 将工作流编写任务的有向无环图(DAG)。Airflow 计划程序在遵循指定的依赖项,同时在一组工作线程上执行任务。丰富的命令实用程序使在 DAG 上执行复杂的调度变的轻而易举。丰富的用户界面使查看生产中正在运行的管道,监视进度以及需要时对问题进行故障排除变的容易。 2. 名词 (1)Dynamic:Airflow 配置需要实用 Python,允许动态生产管道。这允许编写可动态。这允许编写可动态实例化管道的代码。 (2)Extensible:轻松定义自己的运算符,执行程序并扩展库,使其适合于您的环境。 (3)Elegant:Airlfow 是精简的,使用功能强大的 Jinja 模板引擎,将脚本参数化内置于 Airflow 的核心中。 (4)Scalable:Airflow 具有模板块架构,并使用消息队列来安排任意数量的工作任务。 二、Airflow安装 1.Airflow官网 https://airflow.apache.org 2.安装python环境 Airflow 是由 Python 语言编写的 Web 应用,要求 Python3.8 的环境。

Mysql压力测试(sysbench)

目录 配置项目环境: 参考:采用sysbench压测mysql详解_dream21st的博客-CSDN博客 实验步骤: 1、安装sysbench工具 2、在master上创建用户和库,配置用户的权限可以使他可以访问库(Mysql的主从复制) 3、基于sysbench构造测试表和测试数据 4、创建我们需要的数据库里的数据 5、数据库读写性能测试(获取测试数据) 6、执行完成压测之后可以将run改成cleanup,清除数据 sysbench工具对Mysql数据库的其他测试代码: 数据库读性能测试: 数据库删除性能测试: 数据库更新索引字段性能测: 数据库更新非索引字段性能测试: 数据库插入数据性能测试: 数据库写性能测试: 数据库清除创建的测试数据: 配置项目环境: [root@ab ~]# cat /etc/redhat-release CentOS Linux release 7.9.2009 (Core) [root@mysql-1 ~]# mysql --version mysql Ver 14.14 Distrib 5.7.41, for linux-glibc2.12 (x86_64) using EditLine wrapper [root@mysql-1 ~]# 参考:采用sysbench压测mysql详解_dream21st的博客-CSDN博客 实验步骤: 1、安装sysbench工具 [root@ab ~]# yum install epel-release -y [root@ab ~]# yum install sysbench -y 已安装: sysbench.x86_64 0:1.0.17-2.el7 作为依赖被安装: ck.x86_64 0:0.5.2-2.el7 luajit.x86_64 0:2.0.5-1.20220913.46e62cd.el7 postgresql-libs.x86_64 0:9.

JS 统计字符串中每个字符出现次数

JS 字符串去重方法 新字符串进行遍历去重 var str = 'abcabcabcdef' var newStr = '' for (var i = 0; i < str.length; i++) { if (!newStr.includes(str[i])) { newStr += str[i] } } console.log(newStr) 利用对象去重 var str = 'abcabcabcdef' var obj = {} for(var i = 0;i<str.length;i++){ obj[str[i]] = str[i] } console.log(obj) var newStr = '' for(var k in obj){ newStr += obj[k] } console.log(newStr) ........................... 统计每个字符串中每个字符出现的次数 双循环 计数器 默认已经有去重的字符串 使用循环判断字符串每个字符 在原字符串中出现了几次 用计数器进行记录

【STM32】高效开发工具CubeMonitor快速上手

工欲善其事必先利其器。拥有一个辅助测试工具,能极大提高开发项目的效率。STM32CubeMonitor系列工具能够实时读取和呈现其变量,从而在运行时帮助微调和诊断STM32应用,类似于一个简单的示波器。它是一款基于流程的图形化编程工具,类似于LabView或者是Simulink。 通过此篇博文,可以快速上手STM32CubeMonitor。 下载链接: STM32CubeMonitor - 在运行时测试STM32应用的监控工具 - 意法半导体STMicroelectronics 注意:1.此工具仅支持通过 ST-LINK 的SWD或者JTAG接口连接到目标MCU,不支持J-LINK。 2.可以使用多个ST-LINK ,监控多个单片机。 下载安装完成进入的页面如下图所示: 使用教学: 1.采集输出节点,该节点用于配置选择一个仿真器,确定协议类型和频率。通过该节点可以打开和关闭与仿真器的连接。 2. 采集输入节点,该节点用于配置选择一个仿真器,通过仿真器接收数据,该节点后一般连接一个或者多个processing节点。 3. 图标节点,用于在图标上显示数据。 4. 处理节点,用于处理仿真器输入变量组的监测值。能够在变量监测值的基础上进行计算,还能够记录变量数据。 5. 变量节点,用于定义变量组,可以包含多个变量。变量是来自目标STM32中的全局变量或外设寄存器。 6. 写入面板节点,是修改变量时的输入组件。 示例基于项目:项目链接http://链接:https://pan.baidu.com/s/1q08GteijIO-cTTHuP59buA?pwd=1111 提取码:1111 示例要求:监视项目中的ad1和ad2 第一步,连接板子,并将程序烧录到开发板中。(使用的板子是正点原子的探索者,并将PA0和PA1分别连接到了5V和GND上,用于进行adc读取。) 第二步,添加仿真器。 图中的三角形意味着没有添加过仿真器,双击点开myProbe_Out,添加仿真器并配置协议和采样频率。 点击后面这个🖊。 最后点击完成。 当myProbe_Out上面出现了蓝色的小圆圈代表添加成功。 myProbe_In也做相同设置,添加仿真器。 第三步, 添加想要监视的变量组 双击myVariables,点击🖊,添加CubeMX生成的.axf文件路径。 点击右上角更新。 选择合适的采样频率,然后点击完成,完成变量组添加的设置。 第四步,对processing进行处理 双击processing节点,进入配置。 Log option 用来记录数据到文件中,根据自己需要进行选择。 Post-processing用来针对当前监视的变量进行处理。 根据需要进行配置,点击完成,实现配置。 第五步,完成部署,进行监视 点击右上角的DEPLOY按钮,然后点击DASHBOARD按钮。 点击START ,进行数据采集;STOP,数据采集停止;CLEAR,采集的数据清空。 IMPOART DATA,可以用来导入监测得到的数据。 此上,我们就快速上手了STM32CubeMonitor。但是需要注意的是,如果程序重新编译烧录,变量的地址可能发生变化,需要重新进行配置。

记录一个简单的计算校验和函数

unsigned char CheckSum(unsigned char *uBuff, unsigned char uBuffLen) { unsigned char i,uSum=0; for(i=0;i<uBuffLen;i++) { uSum = uSum + uBuff[i]; } uSum = (~uSum) + 1; return uSum; }

Python-时间

笔记 目录 一、获取当前时间 1.Datetime 模块 2.时间戳与time模块 二、字符串和时间转换 三、时间运算 一、获取当前时间 1.Datetime 模块 Python标准库中包含了datetime模块,该模块提供了非常强大的功能来处理日期和时间。 datatime模块是在time模块的基础上做了封装,提供了更多更好用的类,常用的类有date、time、datetime、timedelta、tzinfo date类主要用于处理年、月、日的日期数据;time类主要用于处理时、分、秒的时间数据;datetime类是date类和time类的综合使用,可以处理年、月、日、时、分、秒;timedelta类主要用于做时间的加减运算;tzinfo类是时区类 方法(属性)说明today()返回当地的日期fromtimestamp(timestamp)根据给定的时间戳,返回本地日期mindate所能表示的最小日期maxdate所能表示的最大日期 此外,常用的类方法包括today、year、month、day、strftime和strptime等。这些函数可以捕获具体的日期数据(例如:年、月、日)、进行日期和时间的加减运算、创建特定形式的日期字符串以及根据日期字符串创建datetime对象 [例]请利用Python获取当前日期 关键技术:可以利用datetime模块date类的today()方法将当前日期保存在变量中。 通过使用date.today(),可以创建一个date类对象,其中包含了日期元素,如年、月、日,但不包含时间元素,比如时、分、秒。最后,可以使用year、month和day来捕获具体的日期元素 import datetime as dt ct=dt.date.today() print(ct) print(ct.year) print(ct.month) print(ct.day) [例]请利用Python获取当前日期和时间 关键技术:可以利用datetime模块datetime类的today()方法将当前日期和时间保存在变量中。 通过使用datetime.today(),可以创建一个datetime类对象,其中包含了日期元素和时间元素,如年、月、日、时、分、秒。最后,可以使用year、month和day来捕获具体的日期元素,通过hour、minute和second来捕获具体的时间元素 import datetime as dt ct=dt.datetime.today() print(ct) print(ct.year) print(ct.month) print(ct.day) print(ct.hour) print(ct.minute) print(ct.second) [例]请利用Python获取当前时间 关键技术:可以利用datetime模块datetime类的now()方法将当前日期和时间保存在变量中 import datetime as dt ct=dt.datetime.now() ct 2.时间戳与time模块 时间戳是以格林威治时间1970年01月01日00时00分00秒为基准计算所经过时间的秒数,是一个浮点数。Python的内置模块time和datetime都可以对时间格式数据进行转换,如时间戳和时间字符串的相互转换 [例]请利用Python将当前系统时间加盖时间戳,进行转换 关键技术:可以采用Python的time模块提供的mktime()函数,对数据加盖时间戳。 可以通过time.time()获取到当前的时间,默认是一个时间戳浮点数。也可以通过time.localtime()获取到当前时间的元组,里面分别对应了当前时间的年、月、日、时、分、秒、一周的第几天(周一是0,0-6)、一年的第几天(从1开始,1-366)、夏时令(是夏时令1,不是0,未知-1) import time print(time.localtime()) [例]请利用Python将时间戳数据转换成系统时间 关键技术:可以利用time模块的strftime()函数可以将时间戳转换成系统时间 import time ct=time.strftime(('%Y-%m-%d %H:%M:%S'),time.localtime(2653967697)) ct 二、字符串和时间转换 [例]请利用Python将字符串'2022-01-15'转换成时间类型的数据格式 关键技术:在可以用strptime函数将日期字符串转换为datetime数据类型,可以用Pandas的to_datetime()函数将日期字符串转换为datetime数据类型。to_datetime()函数转化后的时间是精准到时分秒精度的 import datetime as dt datestr='2023-08-28' #strptime dt.

centos查看自启动服务

1,查看自启动服务? systemctl list-unit-files --type service |grep enabled 2,查看某服务的开机启动状态? systemctl list-unit-files --type service |grep service_name 3,启动(关闭,重启,查看)某个服务? (centos6系统): service service_name (start|stop|restart|status) (centos7系统): systemctl (start|stop|restart|status) service_name 注:centos7系统兼容centos6的启动命令(即7中可以使用6的命令)。 4,设置开机启动或者关闭某个服务? (centos6系统): 开机启动:chkconfig --add service_name 或者 chkconfig service_name on 开机关闭:chkconfig --del service_name 或者 chkconfig service_name off (centos7系统): 开机启动:systemctl enable service_name 开机关闭:systemctl disable service_name

vue.draggable浅尝

介绍 Vue.Draggable是一款基于Sortable.js实现的vue拖拽插件。支持移动设备、拖拽和选择文本、智能滚动,可以在不同列表间拖拽、不依赖jQuery为基础、vue 2过渡动画兼容、支持撤销操作,总之是一款非常优秀的vue拖拽组件。本篇将介绍如何搭建环境及简单的例子,使用起来特别简单对被拖拽元素也没有CSS样式的特殊要求。 官方网站 https://github.com/SortableJS/Vue.Draggable npm或yarn 安装方式 yarn add vuedraggable npm i -S vuedraggable UMD浏览器直接引用JS方式 <script src="https://www.itxst.com/package/vue/vue.min.js"></script> <script src="https://www.itxst.com/package/sortable/Sortable.min.js"></script> <script src="https://www.itxst.com/package/vuedraggable/vuedraggable.umd.min.js"></script> 属性说明 属性名称说明group :group= "name",相同的组之间可以相互拖拽 或者 { name: "...", pull: [true, false, 'clone', array , function], put: [true, false, array , function] }sort:sort= "true",是否开启内部排序,如果设置为false,它所在组无法排序,在其他组可以拖动排序delay:delay= "0", 鼠标按下后多久可以拖拽touchStartThreshold鼠标移动多少px才能拖动元素disabled:disabled= "true",是否启用拖拽组件animation拖动时的动画效果,还是很酷的,数字类型。如设置animation=1000表示1秒过渡动画效果handle :handle=".mover" 只有当鼠标移动到css为mover类的元素上才能拖动filter:filter=".unmover" 设置了unmover样式的元素不允许拖动draggable:draggable=".item" 那些元素是可以被拖动的ghostClass:ghostClass="ghostClass" 设置拖动元素的占位符类名,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成truechosenClass:ghostClass="hostClass" 被选中目标的样式,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成truedragClass:dragClass="dragClass"拖动元素的样式,你的自定义样式可能需要加!important才能生效,并把forceFallback属性设置成truedataIdAttrdataIdAttr: 'data-id'forceFallback默认false,忽略HTML5的拖拽行为,因为h5里有个属性也是可以拖动,你要自定义ghostClass chosenClass dragClass样式时,建议forceFallback设置为truefallbackClass默认false,克隆的DOM元素的类名allbackOnBody默认false,克隆的元素添加到文档的body中fallbackTolerance拖拽之前应该移动的pxscroll默认true,有滚动区域是否允许拖拽scrollFn滚动回调函数scrollSensitivity距离滚动区域多远时,滚动滚动条scrollSpeed滚动速度 完整例子 html <div id="app"> <div>{{drag?'拖拽中':'拖拽停止'}}</div> <draggable v-model="myArray" chosen-class="chosen" force-fallback="true" group="people" animation="1000" @start="onStart" @end="onEnd"> <transition-group> <div class="

苍穹外卖项目开发学习中的问题

1.MD5加密数据库密码 对前端传过来的明文密码加密,调用spring提供的工具类,DigestUtil //密码比对 // TODO 后期需要进行md5加密,然后再进行比对 //调用spring提供的工具类 password = DigestUtils.md5DigestAsHex(password.getBytes()); if (!password.equals(employee.getPassword())) { //密码错误 throw new PasswordErrorException(MessageConstant.PASSWORD_ERROR); } 新增功能时,就要将加密后的密码存进数据库!! 2.前后端分离流程 3.swagger的Knief4j(MVC集成swagger) 介绍: 使用Swagger你只需要按照它的规范去定义接口及接口相关的信息,就可以做到生成接口文档,以及在线接口调试页面。官网: https://swagger.io/ Knife4j是为Java MVC框架集成Swagger生成Api文档的增强解决方案 1.导入Knief4j依赖 <dependency> <groupld>com.github.xiaoymin</groupld> <artifactld>knife4j-spring-boot-starter</artifactld> <version>3.0.2</version> </dependency> 2.在配置类中添加配置Bean /** * 通过knife4j生成接口文档 * @return */ @Bean public Docket docket() { ApiInfo apiInfo = new ApiInfoBuilder() .title("项目接口文档") .version("1.0") .description("项目接口文档") .build(); Docket docket = new Docket(DocumentationType.SWAGGER_2) .apiInfo(apiInfo) .select() .apis(RequestHandlerSelectors.basePackage("com.sky.controller")) .paths(PathSelectors.any()) .build(); return docket; } 配置类:继承WebMvcConfigurationSupport类 3.设置静态资源映射,否则接口文档页面无法访问 /** * 设置静态资源映射 * @param registry */ protected void addResourceHandlers(ResourceHandlerRegistry registry) { registry.

计算机竞赛 opencv 图像识别 指纹识别 - python

0 前言 🔥 优质竞赛项目系列,今天要分享的是 🚩 基于机器视觉的指纹识别系统 🥇学长这里给一个题目综合评分(每项满分5分) 难度系数:3分工作量:3分创新点:4分 该项目较为新颖,适合作为竞赛课题方向,学长非常推荐! 🧿 更多资料, 项目分享: https://gitee.com/dancheng-senior/postgraduate 1 课题背景 指纹是指人类手指上的条状纹路, 它们的形成依赖于胚胎发育时的环境。“没有2个完全相同的指纹”这一观点已经得到公认。指纹识别已经有了很长一段历史。 据考古学家证实:公元前6 000年以前, 指纹作为身份鉴别的工具已经在古叙利亚和中国开始应用。到了20世纪80年代,、光学扫描这2项技术的革新, 使得它们作为指纹取像的工具成为现实, 从而使指纹识别可以在其他领域中得以应用。 现在, 随着取像设备的引入及其飞速发展, 生物指纹识别技术的逐渐成熟, 可靠的比对算法的发现都为指纹识别技术提供了更广阔的舞台。 本项目实现了一种指纹识别系统,通过过滤过程来确定用户指纹是否与注册的指纹匹配。通过过滤技术对捕获的指纹进行处理,以从捕获的图像中去除噪声。去除噪声后的最终结果与注册的指纹进行特征匹配,以确定它们是否相同。 2 效果展示 3 3 具体实现 3.1 图像对比过滤 图像融合是一种图像增强方法,这里先融合两个图像便于特征点对比。利用的是opencv封装的函数 ​ cv2.addWeighted() 相关代码 ​ def apply_Contrast(img): alpha = 0.5 # assigned weight to the first image beta = 0.5 # assigned weight to the second image img_second = np.zeros(img.shape, img.dtype) # second image, copy of first one contrast = cv2.

Windows Hyper-V Ubuntu 22.04 LTS安装

文章目录 Ubuntu准备Hyper-V启用虚拟化支持`services.msc` 打开服务列表,关注Hyper-V服务是否启动打开管理器创建虚拟机 启动备份 Ubuntu 下载Ubuntu-Desktop,这是个iso文件。 准备 20GB以上的磁盘空间,ubuntu安装后的虚拟磁盘文件超过15GB一个ssh客户端软件用于连接vm Hyper-V 启用虚拟化支持 services.msc 打开服务列表,关注Hyper-V服务是否启动 打开管理器 创建虚拟机 右键管理器》连接到服务器》连接到本地 快速创建 用到下载的ubuntu.iso文件来启动安装 选择本地源》更改安装源,选择iso文件 确认后如下图 编辑配置,默认配置 这个时候是不能从宿主机器访问的,无法通过ssh连接 添加网络适配器 选择对应的虚拟机右侧的操作【虚拟交换机管理器】,根据需要稍作调整即可 vlan id 勾选后可能会导致宿主机无法访问网络的情况,且在虚拟机设置页也有vlan id配置。 手动配置ip 找到与hyper-v虚拟交换机同名的网络适配器的子网配置,在ubuntu内手动配置 这样避免虚拟机重启改变ip的麻烦 启动 启动虚拟机按照提示选择安装模式,之后步骤并根据需要选择自动分配磁盘分区,或手动分区。 完成安装后会要求重启 进入系统 根据配置的用户名、密码进入系统,因为是桌面版本,有图形界面方便操作。net-tools ifconfig查看网络ip需要这个软件,sudo apt install net-toolsOpenSSH 安装openssh,sudo apt install openssh-server,配置文件/etc/ssh/sshd_config,执行sudo systemctl restart sshd.service启动服务,测试ssh客户端是否能正常连接 安装openssh-server后,启动sshd.service,外部客户端可以连接,可以查看文件,往外拖文件了。 对宿主机器的影响可参考资源管理器 vm的工作负载会对宿主机器有直接的影响 备份 常备份vm,环境配置到关键处,导出一份出来,后续需要时可以导入。 换机器导入没有条件去测试。

【Kafka】2.在SpringBoot中使用官方原生java版Kafka客户端

目 录 1. 新建一个消息生产者2. 新建一个消息消费者3. 测 试 在开始之前,需要先做点准备工作,用 IDEA 新建一个 Maven 项目,取名 kafka-study,然后删掉它的 src 目录,接着在 pom.xml 里面引入下面的依赖。这个项目的作用是作为整个工程的父项目,后面的项目都在此基础上新建 module 即可。 这里用到的环境信息如下: JDK1.8SpringBoot2.7.1IDEAMaven3.6.3 <?xml version="1.0" encoding="UTF-8"?> <project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd"> <modelVersion>4.0.0</modelVersion> <packaging>pom</packaging> <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.7.1</version> <relativePath/> </parent> <groupId>org.yuhuofei</groupId> <artifactId>kafka-study</artifactId> <version>1.0-SNAPSHOT</version> <name>kafka-study</name> <description>Study project for Kafka</description> <properties> <java.version>1.8</java.version> </properties> <dependencies> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-web</artifactId> </dependency> <dependency> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-test</artifactId> <scope>test</scope> </dependency> </dependencies> <build> <plugins> <plugin> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-maven-plugin</artifactId> </plugin> </plugins> </build> </project> 1. 新建一个消息生产者 使用 IDEA 在 kafka-study 的基础上新建一个 Maven 类型的 module ,命名为 producer-01,直至完成。接着,我们改造这个 module ,把它变成我们想要的消息生产者。

async 运行多线程时报错RuntimeError: There is no current event loop in thread ‘Thread-2(webui中也遇到)

原来使用: loop = asyncio.get_event_loop() task = asyncio.ensure_future(do_work(checker)) loop.run_until_complete(asyncio.wait([task])) st = task.result() 添加了 new_loop = asyncio.new_event_loop() asyncio.set_event_loop(new_loop) 添加后如下: new_loop = asyncio.new_event_loop() asyncio.set_event_loop(new_loop) loop = asyncio.get_event_loop() task = asyncio.ensure_future(do_work(checker)) loop.run_until_complete(asyncio.wait([task])) st = task.result() 然后会报RuntimeError: There is no current event loop in thread 'Thread-2 根本原因在源码中: def get_event_loop(self): """Get the event loop. This may be None or an instance of EventLoop. """ if (self._local._loop is None and not self._local._set_called and isinstance(threading.current_thread(), threading._MainThread)): self.set_event_loop(self.new_event_loop())

Kettle系列(一)下载安装与基础配置

Kettle系列(一)下载安装与基础配置 说明一、下载二、目录结构三、基础配置(1)环境变量(2)kettle配置 四、连接mysql8五、连接其他数据库六、总结 说明 更新时间:2023/08/13 17:47 本文记录了win10下的kettle的下载和配置,并进行了mysql8的数据库连接测试 本文仅为记录学习轨迹,如有侵权,联系删除 一、下载 官网地址:kettle官网,kettle的官网近期应该是调整过,进去之后发现没有kettle的下载地址,而是给了"The “/Data Integration” file could not be found or is not available. Please select another file."这样的提示语,截图如下 如果要找到最新的下载地址需要下载上面的"SourceForge Pentaho Summary.pdf"文件,里面有最新的地址 进入网站 下载后解压即可 备注:正常情况下直接下载即可,下面本人用了kettle9.0版本和kettle9.4两个版本进行测试 二、目录结构 解压后的目录结构如下 简单对目录结构的一些重点目录作一下说明 三、基础配置 (1)环境变量 kettle是用java开发的,熟悉java开发的一定知道需要先配置jdk的环境变量,这里也是,java的环境变量配置jdk8就可以了,需要自行配置,注意一点环境变量的名称为:JAVA_HOME kettle的环境变量,这个不配也没有关系,不影响使用,不过这里建议配置一下,配置的路径data-integration路径即可(即可以看到Spoon.bat文件的路径),环境变量名称为KETTLE_HOME (2)kettle配置 先看一下lib文件夹,这个是用来放置jar的地方,因为kettle是用的java开发的,所以一些jar的依赖都会放到这里面,后面我们有需要用到jar的地方也是放到这里,先找到“Spoon.bat”这个文件,我们需要改一下里面的一些内容 找到if "%PENTAHO_DI_JAVA_OPTIONS%"=="" set PENTAHO_DI_JAVA_OPTIONS="-Xms1024m" "-Xmx2048m"这句话,在它后面加上"-Dfile.encoding=UTF-8",不然后面链接数据库资源库的时候,如果连接的信息一旦有中文字符,会导致下次进来连接按钮丢失 保存即可 四、连接mysql8 备注:下面的测试用了9.4和9.0两个版本,内容基本差不多,但是在配置mysql8连接的时候有些区别 这里需要重点记录一下mysql8的配置,先点击Spoon.bat启动kettle,界面如下 点击转换 --> 输入 --> 表输入,双击进行数据库连接配置 发现连接失败,显示没有org.gjt.mm.mysql.Driver,简单说就是没有mysql的驱动,我们的数据库是mysql8所以就需要下载mysql8的驱动jar包,放到kettle安装路径data-integration里面的lib文件夹里面就可以了 重启kettle重复上面的连接步骤,如果显示连接成功,那么祝贺你,到此为止配置过程结束;如果还是报错的话继续往下走 事实上经过本人的测试,如果用的kettle9.4的话,在lib里面加上对应的mysql8驱动后是可以正常连接,但是如果用的kettle9.0的话还是会报错的,如下图是加了mysql8驱动后的报错截图 显示还是说找不到org.gjt.mm.mysql.Driver这个类,这个好分析,我们解压一下mysql8的驱动包,发现里面根本就没有org.gjt.mm.mysql.Driver这个类 我们再下载一下mysql5的驱动,并且解压,发现里面就有org.gjt.mm.mysql.Driver这个类 这也就是说,如果用的是mysql5.7数据库的话,在lib文件夹里面放上对应的驱动包就可以正常连接了,但是mysql8驱动包就没有这个类了,这个跟mysql的版本结构有关,这个时候如果还是想用mysql8的话,也有办法,需要在lib里面再引入一个jar包(mm.mysql-2.0.7.jar),降一下版本,该jar可以进maven中央库下载 再重启kettle,进行数据库连接,发现上面的错误不见了,但是悲剧了,出现了另一个错误,如图 不要慌,还差最后一步,因为mysql8是需要配置时区的,而kettle9.0在进行连接的时候本人猜测是没有配置时区的,可能内部默认是用的mysql5.7,mysql5.7是不用配置时区的,那么好办,找到mysql的配置文件my.ini,加个默认时区给它即可 保存,重启mysql服务,注意cmd命令行窗口需要用管理员权限运行 再度重启kettle进行连接测试,发现终于连接成功了 以上就是kettle9.0连接mysql8的操作,如果是kettle9.4的话,直接放mysql8的jar包到lib文件夹就可以了,如果还是不行,下面有一种通用的连接方法,更简单 五、连接其他数据库 kettle支持连接很多常见的数据库,甚至国产的达梦数据库也是支持连接的;如果上面的mysql8没连接成功,可以用一下这种方法,首先还是把mysql8的驱动包放到lib文件夹下面,然后连接的时候连接类型不要选择mysql,而是选择“Generic database”,再正确填写jdbc的配置即可 自定义连接URL填写自己数据库的连接即可

UEFI 基础教程 (二十一) — BIOS常见面试题

1. 介绍UEFI boot 大致流程 - 解释每个阶段的细节 - CAR(cache as ram), 如何配置 - Peicore会调用几次 2. UEFI Event 实现细节 3. OpenProtocol/HandleProtocol/LocateProtocol 区别 4. 描述下 Handle和Protocol的联系 5. PcdSetxx 和 gRT->SetVariable的区别 6. UEFI C state 、 P state 实现 7. ACPI S3/S5 实现 - Sleep时候调用哪些ACPI method, 比如 PTS 8. 如何配置 Nem(Non evict mode) 9. 操作 SATA/NVME 需要用到哪些Protocol - 如何发送数据给SATA Controller 10. 描述下 Intel MCA 11. 如何处理Memory CE、UCE 12. SMM的理解 13. HOB的理解 - SMM mode 下可以操作HOB嗎 - HOB有多大 - HOB空間是連續的嗎 14.

制作深度学习目标检测数据集、数据集格式的转化及训练集和验证集的划分(基于Yolov5的目标检测项目)

Anaconda、pycharm、PyTorch等环境的配置此篇不做讲解,可参考其他博主的文章进行环境搭建。特别提醒:搭建环境时注意版本问题。 制作自己深度学习目标检测数据集 有很多可以直接下载数据集网站如:飞桨AI Studio、人脸识别常用数据集大全、Stanford University、国外大牛SVETLANA LAZEBNIK的数据集,但这些数据集种类有限,因此要学会根据自己的项目需要去制作自己的数据集。 制作数据集的工具有Adobe Photoshop、LabelImg等很多工具,可自己随便选择,因为Adobe Photoshop是收费的,所以我为大家提供了下载链接,懂得都懂 链接:https://pan.baidu.com/s/1QOVPWcwR07ddxGoIJNilVA?pwd=9988 提取码:9988 使用LabelImg工具为图片打标签 准备工作 因为需要标注图片数量较多所以用一下代码可为图片依次进行重命名编号, 'F:\Yolov5\测试图片1',将路径替换为自己图片文件夹的路径 import os import shutil folder_path = 'F:\Yolov5\测试图片1' # 获取文件夹中的所有图片文件 images = [f for f in os.listdir(folder_path) if os.path.isfile(os.path.join(folder_path, f)) and f.lower().endswith(('.jpg', '.jpeg', '.png'))] # 排序文件列表 images.sort() # 设置开始命名时的数字,100会从101开始编号 start_number = 100 # 遍历图片并进行重命名 for i, image_name in enumerate(images): new_filename = '{:03d}.{}'.format(start_number + i + 1, image_name.split('.')[-1]) old_filepath = os.path.join(folder_path, image_name) new_filepath = os.path.join(folder_path, new_filename) shutil.

基于springBoot 的网上订餐系统 eattingwhat 实践项目

项目名称:eattingwhat(吃什么) 项目源码地址:eattingwhat: 为了更好适应互联时代,为了生活更加便捷,为了让消费者足不出门就可以享受到店家的美食。eattingwhat旨在拉近消费者和客户的距离,同时给消费者和店家搭建一个便捷的交易平台。 初始用户: 消费者“小a”:18475961111/123456 消费者“小b”:18475962222/123456 消费者“小c”:18475963333/123456 1、简介 基于SSM框架的 网上点餐 系统,整合spring + springmvc + mybatis + layui。 使用springBoot启动。包括有消费者模块、商家模块,订单管理模块,评价模块。 2、背景 为了更好适应互联时代,为了生活更加便捷,为了让消费者足不出门就可以享受到店家的美食。eattingwhat2旨在拉近消费者和客户的距离,同时给消费者和店家搭建一个便捷的交易平台。 3、功能如下 用户模块详情: ①登陆: 通过注册的手机号码登陆si ②登陆记住密码:js+cookie实现 ③注册:注册新用户,用户名重复校验,手机号码重复校验,基本格式验证 ④修改头像:用户可以自定义个性头像 ⑤查看个人信息 ⑥查看订单:可以查看 配送中订单,已送达待评价订单,所有订单 ⑦评价订单:可以给商店打分,上传食物图片,书写评价内容 ⑧查看我的所有评价 美食店模块详情: ①美食街:游览所有店铺 ②进店:可以游览当前店铺所有菜品,查看美食店详情,查看美食店评价 ③店铺查询:带Googlesuggest功能的搜索框(通过店名关键字搜索),目前只有火狐游览器支持该功能 订单模块详情: ①提交订单 ②订单确认送达 ③查看订单 评价模块详情: ①提交评价 ②查看消费猪评价 ③查看美食店评价 4、系统演示截图: 欢迎页面 登陆页面 美食街 访问受限,访问特定的页面需要先登陆 个人信息页面 店铺页面 店铺详情 我的订单 提交评价 查看我的评价 查看店家评价 带Googlesuggest功能的搜索框,目前只有火狐游览器支持该功能

我的512创作纪念日—感谢大家的陪伴

1.机缘 “等日出看彩虹 有幸再次遇见你,还记得 2022 年 …”。 正午,打开手机收到这条信息让我感到很温暖。在CSDN中,不仅能够进行学习互动认识很多伙伴、同大家敞开心扉的交流技术,更重要的是对每一阶段都有一个总结。 之前大多数的总结和实践则多集中于书本之上。俗话说:“好记性不如烂笔头”,记忆是过一段时间如果没有回想起来那时间长了可能就真的忘了。就像现在说一个 Vue结合ElementUI做一个简单的登录界面,那么对于表单的数据的校验、校验规则的添加、正则表达式的使用、JS函数书写时的数据校验等。或者说一个React结合Antd的父子组件传值同时子组件向父组件外显方法通过父组件传递数据和刷新子组件中某个表格的情况。都是需要间隔性总结才能更加熟悉过程和方式。 一个事情当我们想做的时候,也许没有多想,但是做出来了就是已经在开始。为能够总结遇到的各种问题同时能和大家一起学习探讨技术内容,便开始了与CSDN相约而行的过程。 2.收获 在分享的过程中,我获得了很多伙伴的认可,当有伙伴通过我的分享获取到帮助加快他们学习的步伐、减少他们少走的弯路时,感到非常开心。这让我想起伙伴们需要资源时会留言:“大佬,我需要链接。 我需要链接,谢谢。” ,其实只要大家需要,直接说需要链接就可以,也许是伙伴们都很谦逊,你们都是我学习的榜样。让我们从main() 出发,是高级语言还是汇编语言、机器语言都可,途径 各个 function() ,不管面向的是 “过程” 还是 “对象” ,亦或是 B/S、C/S,无论是MySQL还是Oracle等存储我们的交流内容,感谢伙伴们的陪伴,你们能够通过我的总结提高帮助的你们的学习就是我 “最大的收获”。 3.日常 其实,可以说创作已经成为了我生活的一部分,不仅仅是文字,它富有生命力。现在每天部分时间在新的技术使用和学习,创作方面确实有所延误。虽然迟迟没有更新创作的内容,但这件事一直放在心上,所谓厚积薄发,创作是在总结的同时帮助到大家,也是帮助自己经常性回想知识更快速,所以日常中现在就是多累积总结要耐得住实践的考验。 4.成就 过去时间里主要是对于Vue、React以及相关的ElementUI、ANTD等UI库进行学习应用,虽然是Java来的,通过JS、JSP、HTML串起了前后端,使用框架提高了整个过程的速度,独立开发了基于SpringBoot和JSP、Vue、ElemenUI的前后端项目,但是还有很多需要完善之处。除了Vue外另一方面就是使用React和ANTD正在写的一些功能,组件联动实现像我们使用JQuery一样在文本框中输入内容就能够立即响应异步更新表格数据。代码段还是存在优化的,下面举一例如对数组数据处理: const tempInfoMx = data['aiInfoData']; const infoMx = []; //获取到对象中所有的key,返回包含对象key的数组,根据key获取对应的值 const infoKeyArray = Object.keys(data['aiInfoData']) for (var i = 0; i < infoKeyArray .length; i++) { for (var j = 0; j < tempInfoMx [infoKeyArray [i]].length; j++) { infoMx .push({ "imageId": infoKeyArray [i], "

MATLAB如何利用DEM生成地形三维模型(DEM+Landsat_5+MATALB)

一、基础介绍 关于3维地形模型, 三维地形是描述地球表面及其特征的曲面模型。模型中的特征点和特征线都是三维的,可以直观测量或查询任意特征点的平面坐标和高程,模型能够真实的反映地表特征和地表现象。注意其和传统的DEM不同,DEM只具有地表空间特征但不具有地表属性特征,其只能反映地形,不能反映该处的样貌、色彩等。 下面简单列举一下能够作为建立模型的基础数据: 分类方法DEMDEM可以看作N×M个高程数据集Hij(i∈1,N,j∈1,M),MATLAB中是完全支持使用surf(DEM)进行绘制地形图,其转为地形图的原理可以参考我以前的文章,生成地形图之后,可以将有坐标系统的影像图或者其他纹理图进行浮动在地形图表面,实现建模。地表高程点高程点和DEM有异曲同工之处,但是相比于DEM这种二维数据,高程点可以看作是一维的。其可以表示为Hi(i∈1,N*M),而在MATLAB中也可以利用高程点进行绘制地形图,方法可以参考我以前的文章,其他和以上无异。激光点云激光点云比较特殊,其可以被用于精密场所的建模使用,在MATLAB中利用surf或者mesh类的函数显示,则会大大减小的其建模后的精度,因此在MATLAB中可以之间利用PCshow函数读取显示之后,将其所在地区的纹理图进行贴附,可以实现高精度建模。同样随着倾斜摄影测量的发展,其高精度的优势渐渐渗入到数字城市的建模中。其他NONE 其实上面所说的纹理图贴图类似于arcGIS中的按高程在表面浮动,其原理一样; 我们再看看matlab是如何进行纹理贴图的;首先P=surf(DEM),注意以下三个设置 接下来我们看看三个属性值分别表示的是什么: (1)Facecolor,所属于Surface的面属性,其下属有四个值,分别是‘Flat’、‘interp’、‘none’、‘texturmap’,本次只对第四个值进行说明;其主要是为了变化CData中的数据,使其符合曲面,可以理解为拉伸 (2)CData,所属于Surface的颜色属性,其分为二维和三维数组两种形式; 注意在此说明一下,我们将纹理图保存为JPG、PNG或者其他影像图时,其表面的颜色时对应于[R,G,B]颜色体,现在将其赋值给CDdata,使Surface其顶点的颜色为纹理图的颜色,若未赋值,则CData为默认值; (3)Linestyle,所属于Surface的边缘属性,本次就将其设置为‘none’,使其为空以至于其表面的线条隐藏。 二、代码段及其结果 1)读取显示DEM clc; clear all; %读取显示DEM数据,剔除边缘异常数据 [data,R1]=geotiffread("gansu.tif"); figure; datacop=data(8:432-8,7:603-7); imagesc(datacop); title('DEM显示图'); 2)读取显示以及合成Landsat_5影像 landsat_band_1=adapthisteq(geotiffread("landsat_b1.tif").*0.5); landsat_band_2=adapthisteq(geotiffread("landsat_b2.tif")); landsat_band_3=adapthisteq(geotiffread("landsat_b3.tif")); imag=cat(3,landsat_band_3,landsat_band_2,landsat_band_1); figure; imshow(imag); imwrite(imag,'landsat.jpg'); title('landsat合成图'); 3)读取显示山体阴影图 [data_shale,R2]=geotiffread("gansu_shale.tif"); datacop_shale=data_shale(8:432-8,7:603-7); figure; imagesc(datacop_shale); colormap("gray"); imwrite(datacop_shale,'datacop_shale.jpg'); title('山体阴影显示图'); 4)三维显示地形模型 figure; P=surf(datacop); colormap("gray"); map_data=imread("landsat.jpg"); P.CData=map_data; P.FaceColor = "texturemap"; P.LineStyle = "none"; title('真实地形3D模型图'); view(120,70) figure; P=surf(datacop); colormap("jet"); map_data=imread("datacop_shale.jpg"); P.CData=map_data; P.FaceColor = "texturemap"; P.LineStyle = "none"; title('山体坡向3D模型图(pitch-angle=45° direction-angle=225°)'); view(30,70)

【Kafka】1.Kafka简介及安装

目 录 1. Kafka的简介1.1 使用场景1.2 基本概念 2. Kafka的安装2.1 下载Kafka的压缩包2.2 解压Kafka的压缩包2.3 启动Kafka服务 1. Kafka的简介 Kafka 是一个分布式、支持分区(partition)、多副本(replica)、基于 zookeeper 协调的消息中间件,最大的特点是可以实时地处理大量数据以满足各种需求场景。例如:基于 Hadoop 的批处理系统、低延迟的实时系统、访问日志、消息服务等。它最初是由 Linkedin 公司用 scala 语言开发出来的,并在 2010 年贡献给了 Apache 基金会,成为 Apache 的顶级开源项目,后面引入了 java 语言的开发。 1.1 使用场景 日志收集:可以用 Kafka 将各种服务的 log 进行收集,然后通过 Kafka 以统一接口服务的方式开放给各种消费者,如 Hadoop、Solr等。消息系统:解耦生产者和消费者、缓存消息用户活动跟踪:Kafka 常被用来记录 web 用户或者 app 用户的各种活动,如浏览网页、搜索、点击等活动,这些活动被各个服务生产者发布到 Kafka 的 topic 中,订阅者通过订阅这些 topic 来做实时的监控分析,或者其它处理。运营指标:Kafka 也常用来记录运营监控数据,包括收集各种分布式应用的数据,生产各种操作的集中反馈,如报警和报告。 1.2 基本概念 如下表所示,是 Kafka 的一些基本概念。 名称释义Broker消息中间件处理节点,一个 Kafka 节点就是一个 Broker ,一个或者多个 Broker 可以组成一个 Kafka 集群,通俗点理解就是一个 Broker 就是一个 Kafka 服务端,多个 Kafka 服务端组成集群TopicKafka 根据 topic 对消息进行归类,发布到 Kafka 集群的每条消息都需要指定一个 topicProducer消息生产者,向 Broker 发送消息的客户端Consumer消息消费者,从 Broker 读取消息的客户端ConsumerGroup每个 Consumer 属于一个特定的 Consumer Group,一条消息可以被多个不同的 Consumer Group 消费,但是一个 Consumer Group 中只能有一个 Consumer 能够消费该消息Partition物理上的概念,一个 topic 可以分为多个 partition ,每个 partition 内部消息是有序的 2.

Java并发编程

目录 一、基本概念 1、进程与线程 2、并发与并行 3、应用 二、Java 线程 1、线程创建与运行 方法一:继承Thread类 方法二:实现Runnale接口 方法三:实现Callable接口 2、线程运行原理 3、Thread 的常见方法 1)start()与run() 2)sleep()与yield() 3)join() 方法 4)interrupt() 方法 5)sleep,yiled,wait,join 对比 6)不推荐的方法 7)守护线程 4、线程状态 结论 三、共享模型之管程 1、线程共享带来的问题 2、synchronized 解决方案 1)解决手段 2)synchronized 语法 3)synchronized 加在方法上 3、变量的线程安全分析 1)成员变量和静态变量的线程安全分析 2)局部变量线程安全分析 3)线程安全的情况 4)线程不安全的情况 5)不安全原因分析 6)解决方法 7)思考 private 或 final的重要性 8)常见线程安全类 线程安全类方法的组合 不可变类的线程安全 示例分析-是否线程安全 4、Monitor 概念 1)Java 对象头 2)Monitor 原理 5、synchronized 原理进阶 1)synchronized 用于同步代码块与同步方法原理 2)轻量级锁 3)锁膨胀 4)自旋优化 5)偏向锁 撤销偏向 6)批量重偏向 7)批量撤销 6、Wait/Notify 1)原理

Flutter 中,ListView 中需要放置 ListView 需要怎么处理才高效?

问题及场景 ListView 是 Flutter 开发者第一个学习到的 Widget,因为它可以滑动。一切都会运行得很好,直到 ListView 中的 Item 本身也是一个 ListView。你可能会看到 Flutter 建议你将内部的 ListView 的ShrinkWrap 属性设置为 True。虽然错误消除了,但是威胁还在。因为 ShrinkWrap 属性会将 ListView 一次性全部填充,算出所有高度,如果内部 ListView 的数据量比较大,那将产生性能问题,会有很大的风险掉帧、jank 和 stutters。 假设你遇到下面这样的场景 final outerListChildren = <ListView>[ ListView(children: <Wdiget>[...]), ... ]; return ListView.Builder( itemCount: outerListChildren.length, itemBuilder: (context, index) { return outerListChildren[index] } ) 然后我们按照 Flutter 的提示,将内部的 ListView 加上 shrinkWrap 和 physics 属性如下 final outerListChildren = <ListView>[ ListView( shrinkWrap: true, physics: const NeverScrollableScrollPhysics(), children: <Wdiget>[...] ), ... ]; return ListView.

大模型评测数据集:MMLU、MMCU、C-Eval

面对国内大语言模型万箭齐发的局面,如何更好地提升大语言模型对中文的理解能力,更好地服务于全球的中文用户,甲骨易AI研究院首创性地推出了高质量中文评测数据集——一款名为“超越”(Massive Multitask Chinese Understanding,简称MMCU)的大规模的多任务测试数据集,填补了中文大语言模型能力测试缺失的一大空白。 ChatGPT 的出现,使中文社区意识到与国际领先水平的差距。近期,中文大模型研发如火如荼,但中文评价基准却很少。在 OpenAI GPT 系列 / Google PaLM 系列 / DeepMind Chinchilla 系列 / Anthropic Claude 系列的研发过程中,MMLU / MATH / BBH 这三个数据集发挥了至关重要的作用,因为它们比较全面地覆盖了模型各个维度的能力。最值得注意的是 MMLU 这个数据集,它考虑了 57 个学科,从人文到社科到理工多个大类的综合知识能力。DeepMind 的 Gopher 和 Chinchilla 这两个模型甚至只看 MMLU 的分数,因此我们想要构造一个中文的,有足够区分度的,多学科的基准榜单,来辅助开发者们研发中文大模型。我们花了大概三个月的时间,构造了一个覆盖人文,社科,理工,其他专业四个大方向,52 个学科(微积分,线代 …),从中学到大学研究生以及职业考试,一共 13948 道题目的中文知识和推理型测试集,我们管它叫 C-Eval,来帮助中文社区研发大模型。 C-Eval: 构造中文大模型的知识评估基准_数据派THU的博客-CSDN博客

【STM32】FreeRTOS开启后,不再进入主函数的while(1)

开启freertos后,想在主函数的while(1)中实现led的翻转,发现无法实现。 int main(void) { /* USER CODE BEGIN 1 */ /* USER CODE END 1 */ /* MCU Configuration--------------------------------------------------------*/ /* Reset of all peripherals, Initializes the Flash interface and the Systick. */ HAL_Init(); /* USER CODE BEGIN Init */ /* USER CODE END Init */ /* Configure the system clock */ SystemClock_Config(); /* USER CODE BEGIN SysInit */ /* USER CODE END SysInit */ /* Initialize all configured peripherals */ MX_GPIO_Init(); MX_USART1_UART_Init(); /* USER CODE BEGIN 2 */ /* USER CODE END 2 */ /* Call init function for freertos objects (in freertos.

解决无法引入 mysql-connector-j 的问题

开发环境 Windows 10Oracle JDK 1.8Maven 3.8.8IntelliJ IDEA 2022.2.2 问题 在使用 Spring initializr 创建 Spring Boot 项目时,无法引入 mysql-connector-j 这个依赖,报错信息: com.mysql:mysql-connector-j:jar:unknown was not found in https://maven.aliyun.com/repository/public during a previous attempt. This failure was cached in the local repository and resolution is not reattempted until the update interval of aliyunmaven has elapsed or updates are forced pom.xml 文件 // 父依赖 <parent> <groupId>org.springframework.boot</groupId> <artifactId>spring-boot-starter-parent</artifactId> <version>2.5.14</version> <relativePath/> <!-- lookup parent from repository --> </parent> <dependencies> <dependency> <groupId>org.

Rea.js 一个适合用于写原生 demo 的极简响应式 j

题解 | #合并区间# import java.util.*;/* * public class Interval { * int start; * int end; * 华为od招聘将放开院校限制 2024年华为od招聘,将放开院校限制,由100所院校放宽到300-500所,有兴趣的大家可以开始准备了华为OD机考,一共3道题,100/100/200,共40 题解 | #牛群的危险路径# import java.util.*;public class Solution { /** * 代码中的类名、方法名、参数名已经指定,请勿修改, 科大讯飞(飞星计划)-深度学习框架和平台方向 一面 8.11上来先聊感兴趣的项目,介绍一下项目职责相关,接着问了几个面试官感兴趣的问题(深度学习训练平台相关问题),但不是我负责,只是按照自己的理解随便说了一 美团 美团内推来啦!欢迎大家用我的码社招&实习都可以用本次秋招 6000 HC,涵盖众多岗位,总有一个适合你!美团内推链接(手机端): https://zh 题解 | #合并区间# import java.util.*;/* * public class Interval { * int start; * int end; * 题解 | #合并区间# import java.util.*;/* * public class Interval { * int start; * int end; * 题解 | #牛群的危险路径#

解决ExcelProperty反射动态修改表头上线一段时间后失效

下面这段代码大家应该都搜到过了: /** * 动态修改Excel标题 * @param clzz * @param filedName * @param valueArr */ public static void setHeadValue(Class clzz, String filedName, String[] valueArr ) { try { //获取field Field filed = clzz.getDeclaredField(filedName); filed.setAccessible(true); //获取注解 ExcelProperty annotation = filed.getAnnotation(ExcelProperty.class); InvocationHandler invocationHandler = Proxy.getInvocationHandler(annotation); Field memberValues = invocationHandler.getClass().getDeclaredField("memberValues"); memberValues.setAccessible(true); Map<String, Object> map = (Map<String, Object>) memberValues.get(invocationHandler); map.put("value", valueArr); } catch (Exception e) { e.printStackTrace(); } } 但是大家可能发现最后在写excel时,实体xxxVo.class中还是之前的值。 哈哈哈我也遇到了这个问题,已经解决了,现在将原因和方法告诉大家。 实际上,反射修改的只是CLASS对象,并没有修改相应类的字节码。因此下面引入Javassist技术,修改类的字节码。 使用Javassist动态重新加载CLASS,需开启JDWP(-agentlib:jdwp),注意new HotSwapper()会建立长链接占用设置的端口(8000),如果是多次重新加载CLASS,HotSwapper只需实例化一次,所以设计成单例模式。

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装

使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装 受限于每篇文章最多只能贴9张图的限制,这个教程被拆分成了多篇文章连载发布,完整目录结构如下图x所示。后续会发布完整教程的pdf文件,敬请期待。 图x 完整教程文档的目录 文章目录 使用GUI Guider工具在MCU上开发嵌入式GUI应用 (1) - GUI Guider简介及安装LVGL和GUI Guider简介准备带有显示屏的开发板在PC上安装GUI Guider LVGL和GUI Guider简介 LVGL是一个开源免费(MIT许可)的嵌入式GUI组件(https://lvgl.io/),支持触摸屏操作,移植简单方便,开发者一直在不断完善更新。 LVGL的作者是来自匈牙利的Gabor Kiss-Vamosikisvegabor,LVGL用C语言编写,以实现最大的兼容性(与C ++兼容),模拟器可在没有嵌入式硬件的PC上启动嵌入式GUI设计,同时LVGL作为一个图形库,它自带着接近三十多种小工具可以供开发者使用。这些强大的构建块按钮搭配上带有非常丝滑的动画以及可以做到平滑滚动的高级图形,同时兼具着不高的配置要求以及开源属性,显著的优势使得LVGL蔚然成风,成为广大开发者在选择GUI时的第一选择。 LVGL自带了丰富的控件:窗口、按键、标签、列表、图表等,还可以自定义控 件;支持很多特效:透明、阴影、自动显示隐藏滚动条、界面切换动画、图标打开关闭动画、平滑的拖拽控件、分层显示、反锯齿、仅耗少量内存的字体等等。 图x 在MCU开发板上适配LVGL 同LVGL应用场景类似的主流的嵌入式GUI组件还有emWin、TouchGFX等,相比较而言,LVGL对于开发者更加友好,对比典型指标如表x所示。 表x 主流嵌入式GUI的关键指标对比 LVGLemWinTouchGFX商业使用免费收费收费可移植性多平台多平台主要为STM32开源程度源码开源不开源部分开源组件丰富度三十几种控件二十几种控件丰富开发文档较为丰富较为丰富一般 由于LVGL被广泛应用,也衍生了一些以LVGL为基础的开发工具,便于嵌入式系统开发者自定义自己的GUI应用。例如 GUI Guider、Square Line Studio、LVGL Windows Simulater等。其中: Square Line Studio是LVGL官方开发工具,面向个人和专业人士的UI编辑器,可快速轻松地为您的嵌入式设备设计和开发漂亮的UI,便捷地设计界面并一键生成代码导出,导出的代码在模拟器和嵌入式设备上都适用,但该软件商业使用需要付费。LVGL Windows Simulater是LVGL官方提供的轻量级的仿真器,使用 GNU GCC 编译器和 SDL 驱动库或 Windows API 在 PC 机上绘制界面,但需要用户自行编写源码设计UI。相对而言,GUI Guider开源,并且支持图形环境的设计和仿真功能,最具符合开发者全面需求。 表 x 常用LVGL模拟器的关键指标对比 GUI GuilderSquare Line StudioLVGL Windows Simulater使用难度功能丰富,上手简单较为复杂功能一般功能丰富度功能丰富功能丰富功能单一可视化设计支持支持不支持开发文档一般较为丰富一般同步调试支持不支持支持 GUI Guider是恩智浦提供的用户友好型图形用户界面开发工具,可通过开源LVGL图形库快速开发高品质的显示。GUI Guider的拖放编辑器可以轻松利用LVGL的众多特性,如小部件、动画和样式来创建GUI,而只需少量代码或根本无需任何代码。单击按钮,您可以在模拟环境中运行应用或将其导出到目标项目。可以很轻松地将GUI Guider生成的代码添加到MCUXpresso IDE或IAR Embedded Workbench项目中,从而加速开发过程,并允许无缝地将嵌入式用户界面添加到应用中。

vue 接口的4种请求方式

request封装,在接口访问的时候执行 import 'babel-polyfill' import axios from 'axios' import Cookies from 'js-cookie' import router from '@/router' import qs from 'qs' import { clearLoginInfo } from '@/utils' import isPlainObject from 'lodash/isPlainObject' const http = axios.create({ baseURL: window.SITE_CONFIG['apiURL'], timeout: 1000 * 180, withCredentials: true }) /** * 请求拦截 */ http.interceptors.request.use(config => { config.headers['Accept-Language'] = Cookies.get('language') || 'zh-CN' if (config.url !== '/oauth/token') { config.headers['Authorization'] = 'Bearer ' + Cookies.get('access_token') || '' } // 默认参数 var defaults = {} // 防止缓存,GET请求默认带_t参数 if (config.

Stable Diffusion AI绘图教学

课程介绍下载 这门课程将教授学生使用Stable Diffusion AI绘图工具进行数据可视化和图形设计。学生将学习基本的绘图原理、数据分析技巧,以及如何使用Stable Diffusion AI创建高质量的图表和可视化作品。通过实践项目和案例研究,学生将提升绘图技能,并学会有效传达数据和信息。

Java函数式编程Stream.collect()方法使用小结

steam():把一个源数据,可以是集合,数组,I/O channel, 产生器generator 等,转化成流。 Collectors(): 类实现了很多归约操作,例如将流转换成集合和聚合元素。通过stream().collect()方法可简单获得我们所需要的数据结构。 先创建一个prodList的集合数据 @Data public class Product { private Long id; private Integer num; private BigDecimal price; private String name; private String category; public Product(Long id, Integer num, BigDecimal price, String name, String category) { this.id = id; this.num = num; this.price = price; this.name = name; this.category = category; } } Product prod1 = new Product(1L, 1, new BigDecimal("15.5"), "面包", "零食"); Product prod2 = new Product(2L, 2, new BigDecimal("

【C++】快读&快写模板及火车头优化代码

快读快写简介 快读快写,顾名思义,就是提升输入和输出的速度。在这里简单介绍一下几种输入输出的优劣。 C++ cin / cout 输入输出:优点是读入的时候不用管数据类型,但是缺点就是比scanf/printf慢一些。 这里给一个关同步流的代码,可以显著优化 cin / cout 的速度: ios::sync_with_stdio(false); cin.tie(0), cout.tie(0); 需要注意的是,关了同步流之后就不能再用 scanf / printf 了。 C scanf / printf 输入输出:与 C++ 对比,比 cin / cout 快一些,但使用方法细节比较多,容易出锅。 快读/快写:只能处理整数读入 / 输出,但是要比标准输入输出函数都快得多。 一般来讲,快读快写在针对数据量不是很大的输入输出的时候显得比较无力,但如果是多组数据或者输入量较多,就可以显著提升效率。 开不开inline差不多。 还有一种更快的fread()函数型快读,比一般的快读都要快,这里主要给这种。 快读快写代码 char *p1, *p2, buf[N]; #define nc() (p1 == p2 && (p2 = (p1 = buf) +\ fread(buf, 1, N, stdin), p1 == p2) ? EOF : *p1 ++ ) LL read() { LL x = 0, f = 1; char ch = nc(); while (ch < 48 || ch > 57) { if (ch == '-') f = -1; ch = nc(); } while (ch >= 48 && ch <= 57) x = (x << 3) + (x << 1) + (ch ^ 48), ch = nc(); return x * f; } char obuf[N], *p3 = obuf; #define putchar(x) (p3 - obuf < N) ?

vue项目正确使用样式deep穿透

经常开发前端的程序员应该都知道前端一般都是组件化开发,为了避免样式污染通常会使用scoped添加属性选择器,此时如果我们想在父组件中修改子组件的样式便成了难题。其实,我们可以通过以下几种方式修改子组件样式, 组件样式穿透 我们可以直接在父组件调用子组件时给组件添加样式,此方案只能添加子组件最外一层样式,如下 <!--子组件--> <templete> <div class="child-test1"> <div class="child-test2"></div> </div> </templete> <script lang="ts" setup> defineOptions({ name:"childComponent" }) </script> <style scoped lang="scss"> .child-test1{ width:100px;height:100px;background:red; .child-test2{ width:50px;height:50px;background:green; } } </style> <!--父组件--> <templete> <div class="father-test1"> <test class="father-test2"></test> </div> </templete> <script lang="ts" setup> import test from 'test.vue' defineOptions({ name:"FatherComponent" }) </script> <style scoped lang="scss"> .father-test1{ width:200px;height:200px; .father-test2{ background:yellow; } } </style> deep样式穿透 通过deep穿透样式,我们可以更改子组件内部任意样式,如下 <!--父组件--> <templete> <div class="father-test1"> <test></test> </div> <!--错误示例-> <!--<div> <test class="father-test1"></test> </div>--> </templete> <script lang="

Maven的入门级——介绍,安装,导入项目,全网最最详细教程!!,包含可能会包的错误的已经指出来了

目录 一.Maven的基本介绍 二. Maven的使用过程 使用步骤: 三.Maven的安装 3.1 下载 3.2 配置环境步骤 3.3配置settings.xml文件 四.入门案列 4.1 配置Eclipse环境 4.2 介绍Maven项目的结构 4.3 运行测试项目 一.Maven的基本介绍 我们可以知道在程序员做项目的时候,我们会运用到多个框架,那么框架所需要的架包,就会非常可能出现架包重复等其他因素,而且我们所需要的架包需要去网上一个一个的找资料,而且会出现版本冲突,这样不仅麻烦还耗时间,而Maven就刚好解决了这些问题,不需要去网上一个一个的找,也不会出现架包重复的问题 1. Maven是一种用于构建和管理Java项目的强大工具。它提供了一个标准化的项目结构,可以帮助开发者自动化构建、测试和部署项目,并管理项目所需的依赖关系。使用Maven,开发者可以通过简单的配置文件定义项目的结构、依赖关系和构建过程。 2. Maven使用项目对象模型(Project Object Model,POM)来描述项目。POM是一个XML文件,定义了项目的元数据、依赖关系、构建配置等信息。通过指定项目依赖和插件,Maven可以自动下载所需的库文件,并在构建时自动解决依赖关系。 3. Maven提供了一系列标准的生命周期阶段(如编译、测试、打包、部署等),开发者可以根据需要执行相应的命令来完成特定的构建任务。Maven还支持丰富的插件生态系统,开发者可以使用插件扩展项目构建功能。 4. 总之,Maven是一个强大的构建工具,它简化了Java项目的构建和管理过程,提高了开发效率。 二. Maven的使用过程 这里给大家介绍3个仓库: mvnrepository:中央仓库私服(私人服务器):阿里云仓库私人电脑:本地仓库 使用步骤: 我们通过中央仓库地址mvnrepository.com 获取pom依赖字符串 讲字符串粘贴到maven工程的指定文件pom.xml中 从中央仓库将指定公司,项目,版本下载下来,下到本地仓库 将本地的 jar 在工程中进行引用 三.Maven的安装 3.1 下载 登入这个网站选择所需的版本下载解压即可 Maven – Download Apache Mavenhttp://maven.apache.org/download.cgi 3.2 配置环境步骤 第一步: 新建一个MAVEN_HOME,输入下载文件bin目录的路径即可 第二步:点击Path每个人的电脑名字都不一样,根据自己来 第三步:测试即可,打开cmd 输入mvn -version 出来一下代码即操作正确,并且配置成功!!! 3.3配置settings.xml文件 第一步:找到下方的这行代码,然后将它进行改变 第二步:换成第二张图片这样 四.入门案列 4.1 配置Eclipse环境 新增下载的路径,然后点击finish,最后勾选即可 然后只需要等待完成即可 配置好之后,在eclipse创建一个Maven项目即可

Redis过期键删除策略

如果一个键过期了,那么它什么时候会被删除呢? 这个问题有三种可能的答案,它们分别代表了三种不同的删除策略: 1.定时删除:在设置键的过期时间的同时,创建一个定时器(timer),让定时器在键的过期时间来临时,立即执行对键的删除操作。 2.惰性删除:放任键过期不管,但是每次从键空间中获取键时,都检查取得的键是否过期,如果过期的话,就删除该键;如果没有过期,就返回该键。 3.定期删除:每隔一段时间,程序就对数据库进行一次检查,删除里面的过期键。至于要删除多少过期键,以及要检查多少个数据库,则由算法决定。 在这三种策略中,第一种和第三种为主动删除策略,而第二种则为被动删除策略。 定时删除 定时删除策略对内存是最友好的:通过使用定时器,定时删除策略可以保证过期键会尽可能快地被删除,并释放过期键所占用的内存。 另一方面,定时删除策略的缺点是,它对CPU时间是最不友好的:在过期键比较多的情况下,删除过期键这一行为河能会占用相当一部分CPU时间,在内存不紧张但是CPU时间非常紧张的情况下,将CPU时间用在删除和当前任务无关的过期键上,无疑会对服务器的响应时间和吞吐量造成影响。 例如,如果正有大量的命令请求在等待服务器处理,并且服务器当前不缺少内存,那么服务器应该优先将CPU时间用在处理客户端的命令请求上面,而不是用在删除过期键上面。 除此之外,创建一个定时器需要用到Redis服务器中的时间事件,而当前时间事件的实现方式——无序链表,查找一个事件的时间复杂度为0(N)——并不能高效地处理大量时间事件。 因此,要让服务器创建大量的定时器,从而实现定时删除策略,在现阶段来说并不现实。 惰性删除 惰性删除策略对CPU时间来说是最友好的:程序只会在取出键时才对键进行过期检查,这可以保证删除过期键的操作只会在非做不可的情况下进行,并且删除的目标仅限于当前处理的键,这个策略不会在删除其他无关的过期键上花费任何CPU时间。 惰性删除策略的缺点是,它对内存是最不友好的:如果一个键已经过期,而这个键又仍然保留在数据库中,那么只要这个过期键不被删除,它所占用的内存就不会释放。 在使用惰性删除策略时,如果数据库中有非常多的过期键,而这些过期键又恰好没有被访问到的话,那么它们也许永远也不会被删除(除非用户手动执行FLUSHDB),我们甚至可以将这种情况看作是一种内存泄漏——无用的垃圾数据占用了大量的内存,而服务器却不会自己去释放它们,这对于运行状态非常依赖于内存的Redis服务器来说,肯定不是一个好消息。 举个例子,对于一些和时间有关的数据,比如日志(log),在某个时间点之后,对它们的访问就会大大减少,甚至不再访问,如果这类过期数据大量地积压在数据库中,用户以为服务器已经自动将它们删除了,但实际上这些键仍然存在,而且键所占用的内存也没有释放,那么造成的后果肯定是非常严重的。 定期删除 从上面对定时删除和惰性删除的讨论来看,这两种删除方式在单一使用时都有明显的缺陷: 定时删除占用太多CPU时间,影响服务器的响应时间和吞吐量。 惰性删除浪费太多内存,有内存泄漏的危险。 定期删除策略是前两种策略的一种整合和折中: 定期删除策略每隔一段时间执行一次删除过期键操作,并通过限制删除操作执行的时长和频率来减少删除操作对CPU时间的影响。 除此之外,通过定期删除过期键,定期删除策略有效地减少了因为过期键而带来的内存浪费。 定期删除策略的难点是确定删除操作执行的时长和频率: 如果删除操作执行得太频繁,或者执行的时间太长,定期删除策略就会退化成定时删除策略,以至于将CPU时间过多地消耗在删除过期键上面。 如果删除操作执行得太少,或者执行的时间太短,定期删除策略又会和惰性删除策略一样,出现浪费内存的情况。 因此,如果采用定期删除策略的话,服务器必须根据情况,合理地设置删除操作的执行时长和执行频率。 前面我们讨论了定时删除、惰性删除和定期删除三种过期键删除策略,Redis服务器实际使用的是惰性删除和定期删除两种策略:通过配合使用这两种删除策略,服务器可以很好地在合理使用CPU时间和避免浪费内存空间之间取得平衡。 接下来我们将对Redis服务器中惰性删除和定期删除的具体实现进行说明。 惰性删除策略的实现 过期键的惰性删除策略由db.c/expireIfNeeded函数实现,所有读写数据库的Redis命令在执行之前都会调用expireIfNeeded函数对输入键进行检查: 如果输入键已经过期,那么expireIfNeeded函数将输入键从数据库中删除。 如果输入键未过期,那么expireIfNeeded函数不做动作。 命令调用expireIfNeeded函数的过程如下图所示。 expireIfNeeded函数就像一个过滤器,它可以在命令真正执行之前,过滤掉过期的输入键,从而避免命令接触到过期键。 另外,因为每个被访问的键都可能因为过期而被expireIfNeeded函数删除,所以每个命令的实现函数都必须能同时处理键存在以及键不存在这两种情况: 当键存在时,命令按照键存在的情况执行。 当键不存在或者键因为过期而被expireIfNeeded函数删除时,命令按照键不存在的情况执行。 举个例子,下图展示了GET命令的执行过程,在这个执行过程中,命令需要判断键是否存在以及键是否过期,然后根据判断来执行合适的动作。 定期删除策略的实现 过期键的定期删除策略由redis.c/activeExpireCycle函数实现,每当Redis的服务器周期性操作redis.c/serverCron函数执行时,activeExpireCycle函数就会被调用,它在规定的时间内,分多次遍历服务器中的各个数据库,从数据库的expires字典中随机检查一部分键的过期时间,并删除其中的过期键。 整个过程可以用伪代码描述如下: #默认每次检查的数据库数量 DEFAULT DB NUMBERS = 16 #默认每个数据库检查的键数量 DEFAULT KEY NUMBERS = 20 #全局变量,记录检查进度 current_db = 0 def activeExpireCycle(); #初始化要检查的数据库数量 #如果服务器的数据库数量比 DEFAULT_DB_NUMBERS 要小 #那么以服务器的数据库数量为准 if server.dbnum < DEFAULT_DB_NUMBERS; db_numbers = server.

关于依赖注入出现空指针异常(kafkaTemplate NullPointerException)

今天在idea测试kafka推送的需求因为自己的粗心大意出现了一个Bug:在SpringBoot中的Resource Kafka template-Kafka应用程序抛出空指针,具体代码是这样的 public class KafkaProducer { @Resource private KafkaTemplate<String, String> kafkaTemplate; // 示例代码 public void sendMessage(Msg msg) { kafkaTemplate.send(msg); } } 后面开始查找问题,觉得是因为这里出错了 public class DirectoryWatcher { // 出错代码 KafkaProducer kafkaProducer = new KafkaProducer(); // 在该对象中调用某个方法 public void watchDirectory() { kafkaProducer.sendMessage(); } } 这里出错的原因是:在我的代码中,手动创建了一个 KafkaProducer 对象,而没有通过 Spring 的依赖注入来创建它。 以下就是我的解决方法 首先,将 KafkaProducer 类添加 @Component 注解,让它成为 Spring 管理的 Bean,如下所示: @Component public class KafkaProducer { } 接下来,将 KafkaProducer 注入到 DirectoryWatcher 类中,而不是手动创建新的对象。修改 DirectoryWatcher 类如下:

STM32 HAL 串口中断接收 记录

参考教程小记stm32实现串口接收的四种方法(hal库)_串口接收方式_Z980778982的博客-CSDN博客 首先在STM32 CubeMX中打开串口全局中断, stm32f1xx_it.c中需要修改,我设置了三个串口,触发RX非空中断后触发回调,如果不这么设置的话发送和接收会触发两次中断。 #include "main.h" #include "stm32f1xx_it.h" extern UART_HandleTypeDef huart1; extern UART_HandleTypeDef huart2; extern UART_HandleTypeDef huart3; extern TIM_HandleTypeDef htim3; void NMI_Handler(void) { /* USER CODE BEGIN NonMaskableInt_IRQn 0 */ /* USER CODE END NonMaskableInt_IRQn 0 */ /* USER CODE BEGIN NonMaskableInt_IRQn 1 */ while (1) { } /* USER CODE END NonMaskableInt_IRQn 1 */ } /** * @brief This function handles Hard fault interrupt. */ void HardFault_Handler(void) { /* USER CODE BEGIN HardFault_IRQn 0 */ /* USER CODE END HardFault_IRQn 0 */ while (1) { /* USER CODE BEGIN W1_HardFault_IRQn 0 */ /* USER CODE END W1_HardFault_IRQn 0 */ } } /** * @brief This function handles Memory management fault.