Matlab Runtime的使用入门

一、Matlab Runtime的介绍 一句话介绍: Matlab Runtime的作用是在未安装MATLAB的计算机上运行打包好的MATLAB应用程序。 在Matlab官网中可以看到有关Matlab Runtime的介绍,链接地址: MATLAB Runtime- MATLAB & Simulink- MathWorks 中国 翻译: MATLAB Runtime(MCR)是一个共享库、MATLAB代码和其他文件的集合,可以在没有安装MATLAB版本的系统上执行编译和打包好的MATLAB应用程序。想要在没有MATLAB的情况下运行这些应用程序的普通用户必须安装MATLAB Runtime或指定MATLAB Runtime网络安装的位置。 要创建包含MATLAB Runtime的应用程序安装程序,必须下载与用于创建安装程序的MATLAB版本和更新级别相匹配的MATLAB Runtime安装程序。要在没有安装程序的情况下分发打包的MATLAB应用程序,最终用户必须以相同或更新的更新级别下载与用于编译应用程序的MATLAB版本相匹配的MATLAB Runtime安装程序。有关详细信息,请参阅安装和配置MATLAB运行时。 使用Matlab Runtime的人群主要分为两种情况: 情况1: 你只是运行别人使用Matlab开发的APP情况2: 你需要用Matlab自己开发、发布APP 为了方便描述,后续我们将情况1的用户称之为用户群A,情况2的用户称之为用户群B。 二、下载Matlab Runtime 根据用户群的不用,下载Matlab Runtime也分为两种情况,可以根据自己的需要阅读指定篇章即可。 2.1. 用户群A下载Matlab Runtime 对于用户群A,可以从Matlab网进行下载对应的运行时,官方的下载路径:MATLAB Runtime - MATLAB Compiler - MATLAB Matlab官方在上面的链接中,提供了主流的版本,你必须安装比构建该APP更高版本的Runtime。 比如,我自己的Matlab使用的是R2022b, 64位系统,所以下载的运行时如下: 我2023年3月30日下载后的文件: “MATLAB_Runtime_R2022b_Update_5_win64.zip” 解压后下载的Runtime版本号: 打开后,可以看到该Runtime支持的Matlab版本号: 说明一下: 用户群A一般不用关心小版本号,只用关心主版本号。 2.2. 用户群B下载Matlab Runtime 对于用户群B,不能再使用针对用户群A的方法进行下载。 这是因为构建APP时候,Matlab会仔细匹配主程序的版本号(包括小版本号)与运行时的版本号,如果两个不一致,则会报错: 比如,我的Matlab版本号,注意其中的小版本号: 而在情况1中我们可以看到,我当时下载的小版本号是2193358,与Matlab主程序的小版本号不一致,所以会报错。 如果你是需要用Matlab开发、编译、打包自己的APP,有两种方式可以下载与你电脑中Matlab完全匹配的Runtime。 方法1: 命令行中执行“compiler.runtime.download”,会在线下载方法2: 先获取下载路径,然后在使用其他工具下载。 获取下载路径使用的命令“com.mathworks.toolbox.compiler.MatlabRuntimeUtils.getMCRInstallerDownloadURL()” 由于国内的网络可能不好,有时候会下载失败,所以我个人更推荐离线下载: 三、安装Matlab Runtime 3.1. 用户群A安装Matlab Runtime 用户群A安装Matlab Runtime比较简单,下载万解压后如下:

Java集群实战:单体架构升级到集群架构(六)分布式缓存REDIS

系列文章目录 Java集群实战:单体架构升级到集群架构(一)使用NGINX建立集群 Java集群实战:单体架构升级到集群架构(二)实现session共享 Java集群实战:单体架构升级到集群架构(三)上传文件的共享 Java集群实战:单体架构升级到集群架构(四)使用REDIS分布式锁 Java集群实战:单体架构升级到集群架构(五)定时任务 目录 源码地址 缓存有效期、缓存预热和缓存击穿 缓存穿透 热点数据重建缓存和双重检测锁 双写不一致 读写锁 缓存雪崩 ​​​​​​​ 缓存在高并发的场景下可以大大提升读取数据的性能。缓存的工作原理是先从缓存中读取数据,如果有数据则直接返回给用户;如果没有数据则从数据库中读取实际数据并且将数据放入缓存,最后将数据返回给用户。 在高并发场景下,缓存的使用有点复杂。我们这里写的代码比较适合高并发场景,如果您的业务没有高并发海量数据的话,就可以写简单一些。 我们用一个简单的商品数据库为例子,来讨论缓存REDIS的使用。 源码地址 整个项目的代码在GITHUB: https://github.com/Dengxd/JavaCluster 所有源码都在这里,GitHub经常连不上,要多刷新几次 主要的业务功能都是在类GoodsServiceImpl中,所以我们重点介绍这个类 缓存有效期、缓存预热和缓存击穿 先看代码,这是类GoodsServiceImpl中的一个方法: public static Integer getExp(){ Random r =new Random(); return REDIS_EXP+r.nextInt(3600); } 这段代码生成一个36000到39600之间的随机数,做为缓存有效期,单位是秒。当然具体的数值大家可以根据自己的业务情况改变。 数据库中,经常被访问的数据我们称为“热点数据”,没人访问的数据就称为“冷门数据”。缓存中的冷门数据过了有效期就被自动删除,而热点数据被访问的时候我们会更新它的有效期,所以保留在缓存中的大多数都是热点数据,这样可以节省空间。 为什么使用随机数,不使用固定数值呢?一般我们在系统启动的时候,会把热点数据从数据库中读取出来,放到缓存中,这个叫做“缓存预热”。如果使用固定数值做为有效期,有效期一到,这些热点数据就可能同时被自动删除。那么大量访问热点数据的请求,都要去数据库中取数据,加大了数据库的压力。这个就是“缓存击穿”。缓存击穿指的是数据库中有数据,但是缓存中没有数据。如果使用随机数就不会在同一时刻出现大量的缓存击穿。 缓存穿透 缓存穿透是指查询不存在的数据,因为缓存和数据库中都没有这个数据,所以缓存和数据库都要查一次。如果有黑客发出大量的这种查询请求,数据库可能就撑不住了。 解决方法就是当数据库也找不到数据时,在缓存中加入一个空对象,如下所示: goods = this.getById(id); //到数据库中查找这个id if (goods != null) {//数据库找到数据 //加入缓存 bucket.set(JSON.toJSONString(goods), getExp(), TimeUnit.SECONDS); } else { //数据库中找不到数据 //对这个ID,在缓存中加入空对象“{}” bucket.set(NODATA, getNoDataExp(), TimeUnit.SECONDS); } 这段代码在类GoodsServiceImpl的get方法中。比如用户查询ID为0的商品,我们数据库中没有,我们就把ID为0空对象“{}”加入缓存中。 下次用户再发起ID为0的查询请求,我们在缓存中找到这个ID,发现缓存中的数据是“{}”,我们就返回一个新对象,所有字段都是NULL,不用再去查数据库,减轻了数据库的负担。这段代码在类GoodsServiceImpl的getFromRedis方法中,如下所示: if(NODATA.equals(strGood)){ //缓存中的数据是“{}” bucket.expire(getNoDataExp(),TimeUnit.SECONDS);//更新有效期 return new Goods();//返回一个新对象,所有字段都是NULL } 热点数据重建缓存和双重检测锁 我们来考虑一个特殊场景,一个大V有众多粉丝,他向粉丝推荐了一款冷门商品(没在缓存中),成千上万的粉丝立刻查询这款商品,缓存查不到,于是都到数据库中查(又是缓存击穿),查到数据之后,再往缓存中写。同时来一千个用户,就查一千次数据库,再写一千次缓存,是不是很过份?所以我们要加一个分布式锁,只让第一个用户查数据库,写缓存,写完缓存之后,其他用户就全部到缓存中取数据了。

保存图片到MySQL&从MySQL读取图片

🍉接上次 爬取坤坤表情包 ,这次我们直接将表情包存到MySQL数据库而不是本地。🍉 🥭1. 创建数据库 首先创建一个数据库,数据库名为ikun,表名为img,3个字段分别为id(图片id)、img(二进制码)、date(存储时间) 其中,二进制码的存储格式应该为 BLOB类型,下面为不同类型对应的最大存储空间 TINYBLOB 255个字节BLOB 65535字节MEDIUMBLOB 16MLONGBLOB 4G USE ikun; CREATE TABLE `img` ( `id` int NOT NULL AUTO_INCREMENT, `img` mediumblob NOT NULL, `date` date NOT NULL, PRIMARY KEY (`id`) ) ; 🍈2. 保存图片到数据库 将图片转为二进制流 对于图片的输入和输出,我们更多使用BufferedInputStream或者BufferedOutPutStream public static void saveInMySQL(String url) throws IOException { //获得连接对象 Connection con = DBUtil.getConnection("root","******","ikun"); PreparedStatement pre = null; //获取图片信息,做输出流 InputStream in = getEntityByHttpGetMethod(url).getContent(); BufferedInputStream inputStream = new BufferedInputStream(in); try { String sql = "

Java中的Switch语句

1.switch语句格式 switch(表达值){ --首先计算表达式的值 switch(想吃的水果){ case 值1: --与case值对比 case “苹果”; 语句体1; --执行对应语句体 “吃苹果”; break; break;//若输入苹果则输出吃苹果, case值2: 若不是苹果进入下一个case比较,遇到break结束 语句体2; 若所有case不符合则进入default; break; case值3: 语句体3; break; default: 语句体4; break;} 1.1练习,用switch语句录入星期数,显示今天的减肥活动。周一,跑步;周二,游泳;周三,跳绳;周四以后大吃一顿。 import java.util.Scanner; public class Java{ public static void main(String[] agrs){ Scanner sc=new Scanner(System.in);//键盘输入 System.out.println("请输入星期数"); int week=sc.nextInt();//键盘输入的值赋值给week switch(week){ case 1: System.out.println("跑步"); break; case 2: System.out.println("游泳"); break; case 3: System.out.println("跳绳"); break; default: System.out.println("大吃一顿"); break;} } 另外一种写法,case中不用·break case 1->{ System.out.println("跑步"); } case 2)->{ System.out.println("游泳"); } default->{ System.

imx6ull配置uboot kernel rootfs

uboot uboot 关键参数配置文件 (CONFIG 定义及引脚配置,lcd配置) /home/xly/Desktop/uboot-imx6ull-2019.04/include/configs/mx6ullevk.h/home/xly/Desktop/uboot-imx6ull-2019.04/board/freescale/mx6ullevk/mx6ullevk.c VMware 网络配置 注网在ubuntu下不同的IP段设置了网关地址是无法ping通,或者两个网卡下相网段,也会导致另一个网卡无法ping通,(特别原来是不同网段的是没有问题,wifil连接成相同网段后,会导致无法连通) #define CONFIG_ENV_OFFSET SZ_2M 配置环境变量保存位置,太小会覆盖uboot. 网口配置: ```c mx6ullevk.h #ifdef CONFIG_FEC_MXC #define CONFIG_CMD_MII #define CONFIG_FEC_ENET_DEV 0 // 0激活网卡eht0 1 激活网卡eth1 #if (CONFIG_FEC_ENET_DEV == 0) #define IMX_FEC_BASE ENET_BASE_ADDR #define CONFIG_FEC_MXC_PHYADDR 0x0 #define CONFIG_FEC_XCV_TYPE RMII #define CONFIG_ETHPRIME "eth0" #elif (CONFIG_FEC_ENET_DEV == 1) #define IMX_FEC_BASE ENET2_BASE_ADDR #define CONFIG_FEC_MXC_PHYADDR 0x1 #define CONFIG_FEC_XCV_TYPE RMII #define CONFIG_ETHPRIME "eth1" #endif 修改uboot env ethact=ethernet@02188000 ethernet@020b4000 ethprime=eth0 /eth1 uboot 环境变量配置 setenv ipaddr 192.

Windows10神州网信版的安装

在大约20天里面我完成了Windows10神州网信版72台的安装,有些2009~2014年的计算机完成安装后做一般的办公应用也能流畅运行。买一台新的计算机至少要好几千,通过更换固态硬盘和内存条可以达到旧物新用的目的。 一、安装过程 1、检查硬件 一般情况下,2010年以前的计算机不安装,部分计算机例外。2012年以后的计算机一般都可以通过简单升级内存和更换固态硬盘来安装神州网信版的Windows10。 一般计算机至少保证8G内存和使用固态硬盘,但是2011年以前的计算机(特别是一体机)只安装4G或8G/固态硬盘【提醒注意数据安全】。 系统盘必须安装在固态硬盘上。 ⑴ 加装内存条 ◎ 如果是2G,计算机比较旧,就加装至4G即可; ◎ 2015年以后的计算机安装至8G,部分计算机根据需要安装16G。 ⑵ 换装固态硬盘 ◎ 如果只有1T的机械硬盘就安装1个120G固态硬盘做启动盘; ◎ 对于500G机械硬盘换掉换一个512G的固态硬盘,分区3个(GUID),启动盘100G。 ⑶ 一般情况下去掉光驱和机械硬盘(重要岗位不能) 2、做启动U盘(老毛桃、老山桃、U盘魔术师、大白菜、老白菜) 拷贝GHOST源文件、驱动以及要安装的办公软件 3、使用启动U盘进入系统 一般按F12进入菜单选择系统项目,有的需要修改CMOS,HP是按F9,DELL按DEL或者F11; 一般选择EFI方式。老式计算机可以选择传统模式。 4、分区 一般选择GUID分区,选择4K对齐。 5、GHOST 为了GHOST完成后自动安装,可以在BIOS里面设置硬盘为第一启动项,然后勾选GHOST完成后自动重启。 6、重新启动 卸载系统自带的程序,如2345、爱奇艺等软件,保留360安全卫士; 拷贝安装软件(TOOLS目录)到D盘; 选择高性能模式,去掉电脑休眠。 7、安装驱动 使用驱动总裁的驱动安装包。 8、软件 ⑴ 正版WPS、OA、ERP(64位版本)、掌上新油; ⑵ 微信和钉钉(设置代理)、腾讯会议; ⑶ 安装360安全浏览器并做设置; ⑷ 安装网站的证书。 9、清理垃圾文件、IE或其他浏览器的插件、系统启动项目、系统服务项目,磁盘碎片整理 10、设置IP地址上网,设置代理、激活Windows10神州网信版 ◎ 设置浏览器; ◎ 浏览常用网站,并做好收藏夹的整理; ◎ 设置启用麦克风/摄像头、屏幕保护、登录页选项。 11、删除360安全卫士个人版 12、安装奇安信天擎。 13、创建还原点。 14、登记信息。 二、最有可能遇到的问题及解决办法 1、设备驱动问题。 有些老式驱动不好找,计算机多了不好一一安装,可以使用驱动精灵安装好一台后备份驱动后在另外一台上去还原。安装完成后卸载驱动精灵。 有些驱动实在不好找,安装无线网卡驱动,安装驱动精灵或者360硬件大师进行安装。 2、老式计算机GHOST还原后无法启动。 硬盘模式AHCI或者更改分区模式为MBR即可解决。 3、反复GHOST无效。 第一种解决办法:在BOIS里面禁止安全启动并且重置为工厂模式,一般可以解决; 第二种解决办法:将系统自带的M.2固态硬盘更换连接外置固态硬盘。 例外:今天遇到联想主机M910t-NO76,以前我是按照上面的方法重装了好多台,今天却不行,是英文版的BOIS,按照与中文版的方法操作不一定成功,只能反复试参数后反复启动,最终还是成功了。真是个大坑!!!【2023年2月7日补充】 4、逐台的安装效率低下了,怎样提高GHOST效率? ⑴、在120G的固态硬盘上ghost好系统,直接安装,这样最快; ⑵、可以安装到一台,GHOST到一个文件,直接还原到分区;

使用Python从逐月降水量数据中获取某位置的全年降水量

1 数据下载 可以在中国科技资源共享网中进行下载1km分辨率逐月降水量数据集。 2 数据说明 该数据为.nc格式,里面有lat、lon、time和pre四个数据块,其中lat、lon是[H, W]形状的矩阵,每一个像素代表该像素对应坐标的经纬度;time有12个,分别为1-12月;pre是对应的降水数据块,形状为[12, H, W],代表某个像素12个月的降雨量。 3 数据处理 我们需要的是获取一些经纬度点的12个月降雨量,因此可以使用Python的netCDF4进行读取,然后进行处理,代码如下: import numpy as np import netCDF4 as nc class WaterReader: def __init__(self, nc_path): self.src = nc.Dataset(nc_path) self.data = np.asarray(self.src["pre"]) self.rang = self._get_range() self.lon_step = (self.rang[1] - self.rang[0]) / len(self.src["lon"]) self.lat_step = (self.rang[3] - self.rang[2]) / len(self.src["lat"]) def _get_range(self): return ( np.min(self.src["lon"]), np.max(self.src["lon"]), np.min(self.src["lat"]), np.max(self.src["lat"])) def _get_rowcol_by_lonlat(self, lon, lat): lon_min, lon_max, lat_min, lat_max = self.rang if lon < lon_min or lon > lon_max or lat < lat_min or lat > lat_max: raise ValueError("

Git自动提交脚本

Git自动提交脚本 前言我的初步实现写在最后 前言 最近碰到一个有意思的想法,由于每次更新博客都要提交代码,每次都要git add、git commit、git push,显得比较繁琐,于是写了一个交互式提交脚本。 我的初步实现 #!/bin/bash usage() { echo "" echo -e "\e[91m缺少必要的参数:\e[0m" echo "* 参数说明 *" echo " commit 本地提交代码" echo " pull 拉取远程代码" echo " push 推送本地代码" echo "" echo "" } # 查看当前仓库有无提交,验证其是否为一个合法的 git 仓库 check() { git status if [ $? == "0" ] then $1 else echo -e "\n\e[91m当前目录不是git仓库,请将脚本移动到git仓库下执行\e[0m\n" exit -1 fi } # 确认是否先本地提交代码 confirm() { echo "" read -p "

深入理解高级数据结构之红黑树

目录 一、为什么要有红黑树? 二、什么是“平衡二叉查找树”? 三、红黑树的定义 四、为什么说红黑树是“近似平衡”的? 五、红黑树为什么综合性能好? 六、实现红黑树 1、插入操作的平衡调整 2、删除操作的平衡调整 1. 针对删除节点初步调整 2. 针对关注节点进行二次调整 3、小结 六、红黑树的应用场景 红黑树已经落地的场景 一、为什么要有红黑树? 二叉查找树是最常用的一种二叉树,它支持快速插入、删除、查找操作,各个操作的时间复杂度跟树的高度成正比,理想情况下,时间复杂度是 O(logn)。 但是,在已经有了性能不错的二叉搜索树,为什么还需要引入红黑树呢? 那是因为,二叉查找树在频繁的动态更新过程中,可能会出现树的高度远大于 log2n 的情况,从而导致各个操作的效率下降。极端情况下,二叉树会退化为链表,时间复杂度会退化到 O(n)。 而且,我们希望树的结构具有关联性,即相邻版本之间,比如说第一次插入,和第二次插入时,树的结构不能发生太大变化,应该可以经过O(1)次数就可以变化完成。对于AVL树来说,插入是满足这个条件的,删除却不满足这个条件。 要解决这两个问题,我们需要设计一种平衡二叉查找树,也就是今天要讲的红黑树。 二、什么是“平衡二叉查找树”? 平衡二叉树的严格定义是这样的:二叉树中任意一个节点的左右子树的高度相差不能大于 1。从这个定义来看,上一节我们讲的完全二叉树、满二叉树其实都是平衡二叉树,但是非完全二叉树也有可能是平衡二叉树。 平衡二叉查找树不仅满足上面平衡二叉树的定义,还满足二叉查找树的特点。最先被发明的平衡二叉查找树是AVL树,它严格符合我刚讲到的平衡二叉查找树的定义,即任何节点的左右子树高度相差不超过 1,是一种高度平衡的二叉查找树。 但是很多平衡二叉查找树其实并没有严格符合上面的定义(树中任意一个节点的左右子树的高度相差不能大于 1),比如我们下面要讲的红黑树,它从根节点到各个叶子节点的最长路径,有可能会比最短路径大一倍。 我们学习数据结构和算法是为了应用到实际的开发中的,所以,我觉得没必去死抠定义。对于平衡二叉查找树这个概念,我觉得我们要从这个数据结构的由来,去理解“平衡”的意思。 发明平衡二叉查找树这类数据结构的初衷是,解决普通二叉查找树在频繁的插入、删除等动态更新的情况下,出现时间复杂度退化的问题。 所以,平衡二叉查找树中“平衡”的意思,其实就是让整棵树左右看起来比较“对称”、比较“平衡”,不要出现左子树很高、右子树很矮的情况。这样就能让整棵树的高度相对来说低一些,相应的插入、删除、查找等操作的效率高一些。 所以,如果我们现在设计一个新的平衡二叉查找树,只要树的高度不比 log2n 大很多(比如树的高度仍然是对数量级的),尽管它不符合我们前面讲的严格的平衡二叉查找树的定义,但我们仍然可以说,这是一个合格的平衡二叉查找树。 三、红黑树的定义 红黑树的英文是“Red-Black Tree”,简称 R-B Tree。它是一种不严格的平衡二叉查找树,我前面说了,它的定义是不严格符合平衡二叉查找树的定义的。那红黑树究竟是怎么定义的呢? 顾名思义,红黑树中的节点,一类被标记为黑色,一类被标记为红色。除此之外,一棵红黑树还需要满足这样几个要求: 每个结点要么是红的要么是黑的。根结点是黑的。 每个叶子节点都是黑色的空节点(NIL),也就是说,叶子节点不存储数据; 如果一个结点是红的,那么它的两个儿子都是黑的。对于任意结点而言,其到叶结点树尾端NIL指针的每条路径都包含相同数目的黑结点。 四、为什么说红黑树是“近似平衡”的? 平衡二叉查找树的初衷,是为了解决二叉查找树因为动态更新导致的性能退化问题。所以,“平衡”的意思可以等价为性能不退化。“近似平衡”就等价为性能不会退化的太严重。 二叉查找树很多操作的性能都跟树的高度成正比。一棵极其平衡的二叉树(满二叉树或完全二叉树)的高度大约是 log2n,所以如果要证明红黑树是近似平衡的,我们只需要分析,红黑树的高度是否比较稳定地趋近 log2n 就好了。 红黑树与AVL树相似,但提供更快的实时有界最坏情况下的插入和删除性能(分别达到最多两轮和三轮以平衡树),但速度稍慢(但仍为O(log n))查找时间; 红黑树和AVL树一样都对插入时间、删除时间和查找时间提供了最好可能的最坏情况担保。这不只是使它们在时间敏感的应用,如实时应用(real time application)中有价值,而且使它们有在提供最坏情况担保的其他数据结构中作为基础模板的价值;例如,在计算几何中使用的很多数据结构都可以基于红黑树实现。 红黑树相对于AVL树来说,牺牲了部分平衡性以换取插入/删除操作时少量的旋转操作,整体来说性能要优于AVL树。 五、红黑树为什么综合性能好? 在《算法(第4版)》 中说过, 红黑树等价于2-3树, 换句话说,对于每个2-3树,都存在至少一个数据元素是同样次序的红黑树。在2-3树上的插入和删除操作也等同于在红黑树中颜色翻转和旋转。这使得2-3树成为理解红黑树背后的逻辑的重要工具,这也是很多介绍算法的教科书在红黑树之前介绍2-3树的原因,尽管2-3树在实践中不经常使用。 其中2-节点 等价于普通平衡二叉树的节点,3-节点 本质上是非平衡性的缓存。 当需要再平衡(rebalance)时,增删操作时,2-节点 与 3-节点间 的 转化会吸收不平衡性,减少旋转次数,使再平衡尽快结束。 在综合条件下,增删操作相当时,数据的随机性强时,3-节点的非平衡性缓冲效果越明显。因此红黑树的综合性能更优。

c# Process.Start()找不到系统文件

【参考1】https://www.cnblogs.com/iamlucky/p/5998086.html 【参考2】https://www.bbsmax.com/A/mo5kj04KJw/ 问题描述 vs1027在X64应用程序下执行process.start()时,OK;但是在X86应用程序下执行process.start(),报错:找不到系统文件 if (kbpr.HasExited) { kbpr = Process.Start(@"C:\Windows\System32\osk.exe"); } 网上搜索良久,发现原因为:windows重定向搞得鬼 在64位的Windows操作系统中,为了兼容32位程序的运行,64位的Windows操作系统采用重定向机制。目的是为了能让32位程序在64位的操作系统不仅能操作关键文件文夹和关键的注册表并且又要避免与64位程序冲突;因此,32位应用程序的运行是通过WOW64的模拟器来实现的。WOW64 是一个由操作系统提供的兼容性环境,它使得 32 位应用程序能够在 Windows 64 位操作系统上运行,在系统的Windows目录下,存在System32和SysWOW64两个文件夹: System32文件夹下存放的是64位DLL SysWOW64文件夹下存放的是32位DLL 因此,如果我们用32位程序去访问c:\windows\system32,不管我们用硬编码还是其它的方式,系统都会自动地给我们转向到C:\windows\syswow64下面。 禁止系统的重定向的解决办法是调用下面的API函数 禁用系统重定向用下面的函数: BOOL Wow64DisableWow64FsRedirection(PVOID OldValue); 恢复系统重定向用下面的函数: BOOL Wow64RevertWow64FsRedirection(PVOID OldValue); 解决办法 具体代码如下: // 关闭64位(文件系统)的操作转向 [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool Wow64DisableWow64FsRedirection(ref IntPtr ptr); // 开启64位(文件系统)的操作转向 [DllImport("Kernel32.dll", CharSet = CharSet.Auto, SetLastError = true)] public static extern bool Wow64RevertWow64FsRedirection(IntPtr ptr); IntPtr oldWOW64State = new IntPtr(); Wow64DisableWow64FsRedirection(ref oldWOW64State); // 关闭64位(文件系统)的操作转向 Wow64RevertWow64FsRedirection(oldWOW64State); // 开启64位(文件系统)的操作转向 注1 网上还有中办法,将路径c:\windows\system32\改为c:\windows\sysnative\,但是我尝试,好像不管用;可能是需要注册表或者哪里设置过吧

linux 用户组 权限

一 用户 组 用户 #添加用户 wang adduser wang #删除用户 userdel userdel wang #给用户设置密码 密码Paic! passwd user1 组 #添加组 group1 groupadd group1 #删除组 groupdel group1 #为用户(wang)分配组(group1) usermod -g group1 wang # 查看group1用户所在的组,以及组内成员 groups group1 三 文件权限 vim hello.sh #! /bin/bash var="测试权限文件" echo ${var} #改变文件所有者 chown wang3 hello.sh:改变hello.sh的所有者为wang3 ls -l [root@localhost wang1]# ls -l 总用量 4 -rwxrwx--- 1 wang3 group1 94 3月 31 14:25 hello.sh - 10个字符确定不同用户能对文件干什么 - 第一个字符代表文件(-)、目录(d),链接(l) - 其余字符每3个一组(rwx),读(r)、写(w)、执行(x) - 第一组rwx:文件所有者的权限是读、写和执行 - 第二组rw-:与文件所有者同一组的用户的权限是读、写但不能执行 - 第三组r--:不与文件所有者同组的其他用户的权限是读不能写和执行 也可用数字表示为:r=4,w=2,x=1 因此rwx=4+2+1=7 - 1 表示连接的文件数 - wang3 表示用户 - group1表示用户所在的组 - 94 表示文件大小(字节) - 3月 31 14:25 表示最后修改日期 - hello.

No.016 <软考>《(高项)备考大全》【第01章】信息化与信息系统(第6部分)

(第6部分)十四五规划、最新法规、IT新技术 3 知识点3.11 十四五规划、最新法规、IT新技术3.11.1 《十四五规划和2035年远景目标纲要》3.11.2《“十四五”软件和信息技术服务业发展规划》3.11.3 《“十四五”国家信息化规划》3.11.4 《“十四五”数字经济发展规划》3.11.5 《“十四五”信息化和工业化深度融合发展规划》3.11.6 《关键信息基础设施安全保护条例》3.11.7 《关于加快推进国有企业数字化转型工作的通知》3.11.8 《5G应用“扬帆"行动计划(2021-2023年)》3.11.9 《中华人民共和国个人信息保护法》3.11.10 《关于构建更加完善的要素市场化配置体制机制的意见》3.11.11 《中华人民共和国网络安全法》3.11.12 《中华人民共和国数据安全法》3.11.13 《国家标准化发展纲要》3.11.14 《IT新技术》1.新基建\元宇宙\东数西算2.北斗系统\数字经济\VSS3.数字孪生\边缘计算\泛在计算\量子计算4.群智协同计算\工业互联网5.智能防疫员\可穿戴设备\信息物理系统(CPS)6.数字化供应链\5G\6G(第六代移动通信技术)7.新四化\绿色制造\上云8.新技术名词 参考答案 3 知识点 3.11 十四五规划、最新法规、IT新技术 3.11.1 《十四五规划和2035年远景目标纲要》 知识点 1、坚定不移贯彻创新、协调、绿色、开放、共享的新发展理念。 2、展望2035年,我国将基本实现社会主义现代化。关键核心技术实现重大突破,进入创新型国家前 列。基本实现新型工业化、信息化、城镇化、农业现代化,建成现代化经济体系。(高21上5) 3、坚持创新在我国现代化建设全局中的核心地位,把科技自立自强作为国家发展的战略支撑,面向世界 科技前沿、面向经济主战场、面向国家重大需求、面向人民生命健康,深入实施科教兴国战略、人才强国战略、创新驱动发展战略,完善国家创新体系,加快建设科技强国。 4、新一代人工智能:前沿基础理论突破,专用芯片研发,深度学习框架等开源算法平台构建,学习推理与决策、图像图形、语音视频、自然语言识别处理等领域包新。 5、重大科技基础设施 6、完善技术创新市场导向机制,强化企业创新主体地位,促进各类创新要素向企业集聚,形成以企业为主体、市场为导向、产学研用深度融合的技术创新体系。(中21上6-7) 7、深入实施制造强国战略:坚持自主可控、安全高效,推进产业基础高级化、产业链现代化,保持制造业比重基本稳定,增强制造业竞争优势,推动制造业高质量发展。 8、深入实施智能制造和绿色制造工程,发展服务型制造新模式,推动制造业高端化\智能化\绿色化。培育先进制造业集群,推动集成电路、航空航天、船舶与海洋工程装备、机器人、先进轨道交通装备、先进电力装备、工程机械、高端数控机床、医药及医疗设备等产业创新发展。(中21下6) 9、制造业核心竞争力提升 (1)北斗产业化应用:突破通信导航一体化融合等技术,建设北斗应用产业创新平台,在通信、金融、能源、民航等行业开展典型示范。推动北斗在车载导航、智能手机、穿戴设备等消费领域市场化规模化应用 (2)新能源汽车和智能(网联)汽车:突破新能源汽车高安全动力电池、高效驱动电机、高性能动力系统等关键技术,加快研发智能(网联)汽车基础技术平台及软硬件系统、线控底盘和智能终端等关键部件。 10、发展壮大战略性新兴产业:着眼于抢占未来产业发展先机,培育先导性和支柱性产业,推动战略性新兴产业**融合化、集群化、生态化**发展。 11、构筑产业体系新支柱:聚焦新一代信息技术、生物技术、新能源、新材料、高端装备、新能源汽车、绿色环保以及航空航天、海洋装备等战略性新兴产业 12、加快建设新型基础设施:围绕强化数字转型、智能升级、融合创新支撑,布局建设信息基础设施、融合基础设施、创新基础设施等新型基础设施。建设高速泛在、天地一体、集成互联、安全高效的信息基础设施,增强数据感知、传输、存储和运算能力。加快5G网络规模化部署,用户普及率提高到56%,推广升级千兆光纤网络。前瞻布局6G 网络技术储备。 13、畅通国内大循环:依托强大国内市场,贯通生产、分配、流通、消费各环节,形成需求牵引供给、供给创造需求的更高水平动态平衡,促进国民经济良性循环。 14、迎接数字时代,激活数据要素潜能,推进网络强国建设,加快建设数字经济、数字社会、数字政府,以数字化转型整体驱动生产方式、生活方式和治理方式变革。(高21下1) 15、打造数字经济新优势:充分发挥海量数据和丰富应用场景优势,促进数字技术与实体经济深度融合,赋能传统产业转型升级,催生新产业新业态新模式,壮大经济发展新引擎。 16、加快推动数字产业化:构建基于5G的应用场景和产业生态,在智能交通、智慧物流、智慧能源、智慧医疗等重点领域开展试点示范。鼓励企业开放搜索、电商、社交等数据,发展第三方大数据服务产业。促进共享经济、平台经济健康发展。 17、推进产业数字化转型:深入推进服务业数字化转型,培育众包设计、智慧物流、新零售等新增长点。加快发展智慧农业,推进农业生产经营和管理服务数字化改造。 18、数字经济重点产业 (1)云计算:加快云操作系统迭代升级,推动超大规模分布式存储、弹性计算、数据虚拟隔离等技术创新,提高云安全水平以混合云为重点培育行业解决方案、系统集成、运维管理等云服务产业。 (2)大数据:推动大数据采集、清洗、存储、挖掘、分析、可视化算法等技术创新,培育数据采集、标注、存储、传输、管理、应用等全生命周期产业体系,完善大数据标准体系。 (3)物联网:推动传感器、网络切片、高精度定位等技术创新,协同发展云服务与边缘算服务,培育车联网、医疗物联网、家居物联网产业。 (4)区块链:推动智能合约、共识算法、加密算法、分布式系统等区块链技术创新,以联盟链为重点发展区块链服务平台和金融科技、供应链管理、政务服务等领域应用方案,完善监管机制。 (5)人工智能:建设重点行业人工智能数据集,发展算法推理训练场景,推进智能医疗装智能运载工具、智能识别系统等智能产品设计与制造,推动通用化和行业性人工智能开放平台建设。 19、提高数字政府建设水平:(1)加强公共数据开放共享(2)推动政务信息化共建共用(3)提高数字化政务服务效能 20、营造良好数字生态:坚持放管并重,促进发展与规范管理相统一,构建数字规则体系,营造开放、健康、安全的数字生态。 21、建立健全数据要素市场规则:统筹数据开发利用、隐私保护和公共安全,加快建立数据资源产权、交易流通、跨境传输和安全保护等基础制度和标准规范。 22、完善宏观经济治理:健全以国家发展规划为战略导向,以财政政策和货币政策为主要手段,就业、产业、投资、消费、环保、区域等政策紧密配合,目标优化、分工合理、高效协同的宏观经济治理体系。 23、走中国特色社会主义乡村振兴道路,全面实施乡村振兴战略,强化以工补农、以城带乡,推动形成工农互促、城乡互补、协调发展、共同繁荣的新型工农城乡关系,加快农业农村现代化。 习题 【例1-中21上】“十四五”规划提出:提升企业技术创新能力,形成以(6)为主体,(7)为导向、产学研用深度融合的技术创新体系。 (6)A.政府 B.市场 C.高校 D.企业 (7)A.政府 B.市场 C.高校 D.企业 【例2-高21上】根据“十四五”规划和2035年远景目标纲要,到2035年,我国进入创新型国家前列,基本实现新型工业化、信息化、城镇化、()。

MongoDB统一数据查询钩子

MongoDB统一数据查询钩子 1.前提 使用go-zero模板生成MongoDB的查询操作不满足我们,需要生成一个带钩子的查询 2.问题分析 查询钩子经常用于业务,现在需要把查询钩子写入go-zero模板中,使每次生成都带有查询钩子 3.解决方案 通过修改go-zero模板里面的model文件,然后再使用修改后的模板进行生成代码 1.在接口里面增加一个方法 FindHook(ctx context.Context,id string,bf beforeFind,af afterFind) (*{{.Type}}, error) 2.定义钩子函数 type beforeFind func(string) type afterFind func(string) 3.实现查询钩子 func (m *default{{.Type}}Model) FindHook(ctx context.Context,id string,bf beforeFind,af afterFind) (*{{.Type}}, error) { if bf != nil { bf(id) } ​ oid, err := primitive.ObjectIDFromHex(id) if err != nil { return nil, ErrInvalidObjectId } ​ var data {{.Type}} {{if .Cache}}key := prefix{{.Type}}CacheKey + id{{end}} err = m.conn.FindOne(ctx, {{if .

10个你需要知道的SpringBoot参数验证的技巧

前言 参数验证很重要,是平时开发环节中不可少的一部分,但是我想很多后端同事会偷懒,干脆不错,这样很可能给系统的稳定性和安全性带来严重的危害。那么在Spring Boot应用中如何做好参数校验工作呢,本文提供了10个小技巧,你知道几个呢? 1.使用验证注解 Spring Boot 提供了内置的验证注解,可以帮助简单、快速地对输入字段进行验证,例如检查 null 或空字段、强制执行长度限制、使用正则表达式验证模式以及验证电子邮件地址。 一些最常用的验证注释包括: @NotNull:指定字段不能为空。@NotEmpty:指定列表字段不能为空。@NotBlank:指定字符串字段不得为空或仅包含空格。@Min 和 @Max:指定数字字段的最小值和最大值。@Pattern:指定字符串字段必须匹配的正则表达式模式。@Email:指定字符串字段必须是有效的电子邮件地址。 具体用法参考下面例子: public class User { @NotNull private Long id; @NotBlank @Size(min = 2, max = 50) private String firstName; @NotBlank @Size(min = 2, max = 50) private String lastName; @Email private String email; @NotNull @Min(18) @Max(99) private Integer age; @NotEmpty private List<String> hobbies; @Pattern(regexp = "[A-Z]{2}\d{4}") private String employeeId; 复制代码 2 使用自定义验证注解 虽然 Spring Boot 的内置验证注释很有用,但它们可能无法涵盖所有情况。如果有特殊参数验证的场景,可以使用 Spring 的 JSR 303 验证框架创建自定义验证注释。自定义注解可以让你的的验证逻辑更具可重用性和可维护性。

前端面试题整理(Vue篇)

1.vue中hash和 history的区别 首先最大的区别是带#和不带#的区别hash是利用 onhashchange()方法监听location.hash的改变 ,history是使用pushState()改变url但是不发送请求和replaceState()方法读取浏览器历史栈并对;浏览器历史进行修改。history需要后端的支持 ,每个url地址需要在后端中配置路径 如果找不到的话 就会返回404 ,所以后端资源中得有一个是覆盖所有页面的候选资源 前端得配置一个404页面。 注意: 浏览器输入一个url发生了什么? 2.浏览器输入一个url 后发生了什么? 1.首先解析域名 ,DNS对域名进行解析 ,解析成一个ip地址 2.进行 三次握手 发送端向接收端发送一个带有SYN的数据包 , 接收端收到服务包以后返回给发送端一个SYN /ACK 的数据包 , 发送端接收到以后 再返回给接收端一个ACK数据包 3.客户端发送HTTP 请求 带有请求头请求体之类的 4.渲染页面 5. 有可能会四次挥手 有可能是会复用连接 3.简述一下虚拟dom 虚拟dom是用JavaScript描述的一个dom节点 ,是对dom的一层抽象描述 。 我们每次操作页面的时候如果频繁的操作dom元素会对性能造成影响,所以我们造成抽象dom 在patch的过程中,尽可能的将差异一次性的更新到dom中,这样dom不会出现性能很差的情况 他的设计初衷一开始是为了跨平台 ,比如 node就没有虚拟dom ,所以要实现服务端渲染就要借助虚拟dom 它本身就是JavaScript对象 4. 说一下回流和重绘 重绘:当我们对 DOM 的修改导致了样式的变化、却并未影响其几何属性(比如修改了颜色或背景色)时, 浏览器不需重新计算元素的几何属性、直接为该元素绘制新的样式(跳过了上图所示的回流环节)。 回流: 任何会改变元素几何信息(元素的位置和尺寸大小)的操作,都会触发回流, 当我们对 DOM 的修改引发了 DOM 几何尺寸的变化(比如修改元素的宽、高或隐藏元素等)时, 浏览器需要重新计算元素的几何属性(其他元素的几何属性和位置也会因此受到影响), 然后再将计算的结果绘制出来。这个过程就是回流(也叫重排) 注意: 如何避免回流重绘: 1.尽量少使用style改变样式,使用class来改变样式 2.对于动画尽量放在display:absolute 或者fixed上 3.对于resize 或者 scroll这种要进行 防抖/节流

mmrotate:详细解读eval_map.py里面的计算TP和FP的代码,并计算虚警率和漏警率

如果需要计算虚警率和漏警率,那么就需要详细了解这个函数:tpfp_default。 在原始的代码中写了注释,方便大家阅读: def tpfp_default(det_bboxes, gt_bboxes, gt_bboxes_ignore=None, iou_thr=0.5, area_ranges=None): """Check if detected bboxes are true positive or false positive. 先明白,这里的det已经是检测框了!这里的框已经经过了nms,也就是已经被nms的阈值过了一遍了,已经是最终结果了!所以这里的框要不就是对的,要不就是错的,不存在没用的这个选项! Args: det_bboxes (ndarray): Detected bboxes of this image, of shape (m, 6). gt_bboxes (ndarray): GT bboxes of this image, of shape (n, 5). gt_bboxes_ignore (ndarray): Ignored gt bboxes of this image, of shape (k, 5). Default: None iou_thr (float): IoU threshold to be considered as matched. Default: 0.5. area_ranges (list[tuple] | None): Range of bbox areas to be evaluated, in the format [(min1, max1), (min2, max2), .

React 中 setState 对数组、对象更改数据的操作

React 中 setState 对数组、对象更改数据的操作 // 1、修改object中某项 this.setState({ object: {...object, key: value} }); // 2、删除数组首位 array.splice(0, 1); this.setState({ array }); // 3、删除数组尾部 array.splice(array.length - 1); this.setState({ array }); // 4、删除数组任意一项 array.splice(index, 1); this.setState({ array }); // 5、数组尾部添加一项 this.setState({ array: [...array, item] }); // 6、数组头部添加一项 this.setState({ array: [item, ...array] }); // 7、数组任意位置添加一项 array.splice(index, 0, item); this.setState({ array }); // 8、修改数组中任意一项中值 function updateArrayItem(index, key, value) { this.setState({ array: array.map((item, _index) => _index == index ?

如何下载VMware17 Pro并安装

一、下载VMware虚拟机 1、进入到官网下载 官网:https://www.vmware.com/products/workstation-pro.html 2、进入官网首页的Products(产品)页面 3、下滑找到Overview(概述)里面的DOWNLOAD TRIAL(下载试用版) 4、点击DOWNLOAD TRIAL(下载试用版)后下滑找到DOWNLOAD NOW,点击即可下载 二、安装VMware 1、找到下载的VMware安装包位置 2、双击即可开始安装 3、勾选(我接受许可协议中的条款) ,下一步 4、安装位置可以更改,尽量不要选择C盘,这里我选择E盘,勾选(增强型键盘驱动程序) 5、一直下一步 6、稍等片刻安装完成后,点击许可证 7、将秘钥输入到文本框,点击输入 8、点击完成 9、安装完成后,会要求重启 10、重启后,双击进入VMware 11、查看许可证信息(帮助——>关于VMware Workstation——>许可信息) 如上图所示,就代表已经成功激活VMwera 17 Pro 至此我们完成了VMwera 17 Pro的下载与安装!!! 

vue打包时报错 npm ERR! Missing script: “build“

vue 打包项目时报错 run npm fund for details npm ERR! Missing script: “build” npm ERR! npm ERR! To see a list of scripts, run: npm ERR! npm run npm ERR! A complete log of this run can be found in: C:\Users\Lenovo\AppData\Local\npm-cache_logs\2023-03-31T02_19_40_340Z-debug-0.log 解决方式: 修改package.json文件,添加了下图中红框内容就可以了 “serve”: “vue-cli-service serve”, “build”: “vue-cli-service build”

Ubuntu 18.04 安装docker【亲测可用】

前言 本地部署的Ubuntu系统之后,本地部署docker,要实现的课程⽬标有以下 3 个: 部署docker换国内源测试拉去镜像,运行镜像正常使用 接下我们⼀个⼀个来看。 一、部署docker 1.卸载 sudo apt-get remove docker docker-engine docker.io containerd runc 2.安装Docker sudo apt-get update # 安装依赖包 sudo apt-get install apt-transport-https ca-certificates curl gnupg-agent software-properties-common # 添加 Docker 的官方 GPG 密钥 curl -fsSL https://download.docker.com/linux/ubuntu/gpg | sudo apt-key add - # 验证您现在是否拥有带有指纹的密钥 sudo apt-key fingerprint 0EBFCD88 # 设置稳定版仓库 sudo add-apt-repository "deb [arch=amd64] https://download.docker.com/linux/ubuntu $(lsb_release -cs) stable" 3.安装 Docker Engine-Community # 更新 $ sudo apt-get update # 安装最新的Docker-ce sudo apt-get install docker-ce # 启动 sudo systemctl enable docker sudo systemctl start docker 4.

APP、PC客户端抓包、小程序\公众号

APP、小程序、公众号抓包 一、APP抓包(一)BurpSuite抓取手机HTTP数据包1、配置代理IP与端口2、测试 (二)BurpSuite抓取手机HTTPS数据包1、安装证书2、测试 (三)抓不到包?1、原因2、解决思路3、解决过程 二、抓取PC端第三方软件数据包流程演示:1、安装证书2、搭建配置Proxifier3、测试 三、BurpSuite抓取微信小程序/公众号数据包流程演示:1、安装证书2、Proxifier搭建3、测试 一、APP抓包 (一)BurpSuite抓取手机HTTP数据包 思路:本地主机作为手机的代理服务器,手机APP发送的数据包会直接发给代理服务器,再由代理服务器进行转发。 准备工作:手机与本地主机连上同一wifi 1、配置代理IP与端口 查看主机IP 可以在主机使用win+R调出运行框,输入命令cmd进入命令提示符界面,输入ipconfig查看IP: 查看手机IP是否正常配置 测试连通性 在手机上设置代理: 在BurpSuite设置拦截经过本地主机的数据包: 打开BurpSuite依次点击:Proxy - Options - Add 添加一个监听IP与端口(端口和IP与手机端添加的代理一致) 设置好了后,在“Proxy - Intercept 下开启“Intercept is on”就可以对安卓APP的网络数据进行抓包了 2、测试 手机端随便打开一个app,就会发现数据已经抓到,可以在HTTP history查看 (二)BurpSuite抓取手机HTTPS数据包 抓取HTTPS包需要导入Burp的证书。特别注意:一个Burp对应一个证书,就是用哪个Burp抓包就导出哪个的证书,并将该证书在手机上安装。 1、安装证书 有两种方法导出证书: 一是直接在BurpSuite导出证书,二是手机端直接访问代理服务器的IP加端口 方法一: 依次点击 Proxy - Options 选中代理项,点击import\export CA 选择第一个,然后点击Next 选择保存CA证书的路径,注意文件后缀命名为.cer,因为手机只能安装.cer的证书类型,默认的der格式是不能被识别安装的。 方法二: 手机访问代理服务器192.168.1.5:8888,点击CA Certificate 进行证书的下载 在手机端下载完证书后,依次点击 设置 - 安全 - 从SD卡安装 找到证书下载的位置点击进行安装 安装完成后可以在 设置 - 安全 - 信任的凭据 看到。 2、测试 随便打开一个APP或者用HTTPS协议访问任意网站 成功抓取到数据包 (三)抓不到包? 参考文档 https://www.

【C】文件操作(fopen等函数)

文件操作 1. 为什么使用文件2. 什么是文件2.1 程序文件2.2 数据文件2.3 文件名 3. 文件的打开和关闭3.1 文件指针3.2 文件的打开和关闭 4. 文件的顺序读写fputcfgetcfputsfgetsfscanffprintffreadfwrite 5. 文件的随机读写fseekftellrewind 6. 文本文件和二进制文件7. 文件读取结束的判定feof 8. 文件缓冲区 1. 为什么使用文件 在我们平时在vs上写的代码,程序运行起来之后的所有数据都是放在内存中的,当程序退出了之后,我们通过键盘输入的所有的数据就消失了,等我们再次执行程序后,又得要重新从键盘上敲,这样当程序的数据比较多的时候是非常麻烦的。 所以我们如果想要保留我们输入的数据的时候,只有我们自己选择删除数据的时候,数据才才会被删除。 这就涉及到了数据持久化的问题,我们一般数据持久化的方法有:把数据存放在磁盘文件、存放到数据库等方式。 使用文件我们可以将数据直接存放在电脑的硬盘上,做到了数据的持久化。 2. 什么是文件 磁盘上的文件是文件。 就比方说我们C盘和D盘中的文件,后缀为.png的图片文件,后缀为.exe的等等。 但是在程序设计中,我们一般谈的文件有两种:程序文件、数据文件(从文件功能的角度来分类的)。 2.1 程序文件 包括源程序文件(后缀为.c),目标文件(windows环境后缀为.obj),可执行程序(windows环境后缀为.exe)。 就比如说我现在写了一个冒泡排序,我创建了一个test.c,还创建了一个bubbleSort.c,又创建了一个bubbleSort.h,这三个文件就都是程序文件,执行之后又在对应目录下自动创建了一个test.exe的可执行程序,这些都是程序文件。 2.2 数据文件 文件的内容不一定是程序,而是程序运行时读写的数据,比如程序运行需要从中读取数据的文件,或者输出内容的文件。 接着上面的,我在对应的目录下创建了一个data.txt的文件,然后可以通过test.exe来对data.txt进行读(输入)数据和写(输出)数据。 而在以前我们没有创建专门的读写文件的时候,所处理数据的输入输出都是以终端为对象的,即从终端的键盘输入数据,运行结果显示到显示器上。 其实有时候我们会把信息输出到磁盘上,当需要的时候再从磁盘上把数据读取到内存中使用,这里处理的就是磁盘上文件。 2.3 文件名 一个文件要有一个唯一的文件标识,以便用户识别和引用。 文件名包含3部分:文件路径+文件名主干+文件后缀 例如: c:\code\mycode\test.txt 这里的c:\code\mycode\就是文件路径,test就是文件名主干,.txt就是文件后缀。 文件中不能包含这些字符:/ \ * ? " < > | : 文件的后缀名决定了一个文件的默认打开方式 文件路径指的是从盘符到该文件所经历的路径中各符号名的集合 为了方便起见,文件标识常被称为文件名。 3. 文件的打开和关闭 3.1 文件指针 缓冲文件系统中,关键的概念是“文件类型指针”,简称“文件指针”。 每个被使用的文件都在内存中开辟了一个相应的文件信息区,用来存放文件的相关信息(如文件的名字,文件状态及文件当前的位置等)。这些信息是保存在一个结构体变量中的。该结构体类型是由系统声明的,取名FILE。 下面我们可以创建一个FILE*的指针变量: FILE* pf;//文件指针变量 什么是文件信息区?

记录acwing蓝桥杯每日一题

3956.截断数组 思路:好吧从j循环那边我就有点想不到,y总的思路就是固定第二个分割点,枚举第一个分割点的位置 3729.改变数组元素 思路:主要就是差分,记录一下差分模板,差分可以用来处理对某一区间的数据同时加上或者减去一个数 1460.我在哪? 先放上一个暴力算法(遇到估计我也只能暴力了,能拿几分是几分了) y总的优化思路:使用二分,且用哈希表 很好哈希表又是我还不会的东西 unordered_set<string> hash//定义一个哈希表 string类型中substr(i,j)函数可以截取区间i-j的字符串 1497.树的遍历 思路:把后序中序分为三段:根节点、左子树、右子树 感觉数据结构经常用到这样的递归,记住是怎么做的吧orz 1249.亲戚 终于有一道我会做的了,但是没想到习惯用的cin cout会被判超时(果然还是要用scanf吗) 2058. 笨拙的手指 #include <bits/stdc++.h> using namespace std; const int N=1e9; int base(string s,int a){ int ans=0; for (int i=0;i<s.size();i++){ ans=a*ans+s[i]-'0'; } return ans; } int main(){ string x,y; cin>>x>>y; unordered_set<int> hash; for (int i=0;i<x.size();i++){ string s=x; s[i]^=1; if(s.size()>1&&s[0]=='0') continue; hash.insert(base(s,2)); } for (int i=0;i<y.size();i++){ for (int j=0;j<3;j++){ if(y[i]-'0'!=j){ string s=y; s[i]=j+'0'; if(s.size()>1&&s[0]=='0') continue; int n=base(s,3); if(hash.

软件开发的复杂性与效能提升

一、问题 每当我们被安排维护或者升级一个已有的软件时,恰当地理解原有的系统成为关键。毫无疑问,我们没有足够的时间完全理解它,但是我们一定要找到那个见鬼的合适地方以加入我们的修改。那么是什么阻碍了我们快速理解一个软件呢? 二、软件的复杂性 复杂性就是任何使得软件难于理解和修改的因素,而复杂性是由两个因素引起的:模糊性与依赖性。模糊性产生了最直接的复杂度,让我们很难读懂代码真正想表达的含义,无法读懂这些代码,也就意味着我们更难去改变它;而依赖性又导致了复杂性不断传递,不断外溢的复杂性最终导致系统的无限腐化,一旦代码变成意大利面条,几乎不可能修复,成本将成指数倍增长 三、复杂的症状 3.1 变化的放大 一个看似简单的变化却需要在不同的地方修改。比如给某个网站内的子页面颜色修改成风格一致。 3.2 认知负荷 开发人员需要多少知识才能完成一项任务,比如一个专长于系统开发的资深工程师对于一个游戏引擎也是一筹莫展。 3.3 未知的未知数 不清楚必须修改哪些代码才能完成任务,开发人员必须获得哪些信息才能成功地执行任务。 四、解决之道 1、编写合适的软件文档,在系统的早期就尽可能的降低问题复杂度,使系统逐渐明朗。 2、在每次迭代中,尽量设计通用性的接口,花一定的时间修改或调整系统设计,让后期迭代更加顺畅。 3、模块设计与系统分层,合理使用设计模式。 3、各开发人员都要保持统一的风格,包括变量命名,注释,接口设计。 参考: 造成软件复杂性的原因_导致软件复杂性的主要原因有哪些?_旭波的博客-CSDN博客 百度安全验证 A Philosophy of Software Design 软件设计哲学 - 知乎

第十一届“泰迪杯”数据挖掘挑战赛——B 题:产品订单的数据分析与需求预测程序思路与图片(代码较长,需者私信)

目录 一、多角度分析数据 Question1产品的不同价格对需求量的影响; Question2产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性; Question3不同销售方式(线上和线下)的产品需求量的特性; Question4不同品类之间的产品需求量有何不同点和共同点; Question5不同时间段(例如月头、月中、月末等)产品需求量有何特性;​编辑 Question6节假日对产品需求量的影响 Question7促销(如 618、双十一等)对产品需求量的影响; Question8季节因素对产品需求量的影响​编辑 二、建立模型 Daypred Weekpred Monthpred Conclusion​ 一、多角度分析数据 Question1产品的不同价格对需求量的影响; Question2产品所在区域对需求量的影响,以及不同区域的产品需求量有何特性; Question3不同销售方式(线上和线下)的产品需求量的特性; Question4不同品类之间的产品需求量有何不同点和共同点; Question5不同时间段(例如月头、月中、月末等)产品需求量有何特性; Question6节假日对产品需求量的影响 Question7促销(如 618、双十一等)对产品需求量的影响; Question8季节因素对产品需求量的影响 二、建立模型 Daypred Weekpred Monthpred Conclusion

01源码安装httpd

源码安装httpd 一、环境准备 安装环境 [root@CentOS7-4 ~]# yum -y install gcc gcc-c++ make pcre-devel apr-devel expat-devel libdb-devel cyrus-sasl-devel openldap-devel apr-util-devel 检测编译环境 [root@CentOS7-4 ~]# gcc --version gcc (GCC) 4.8.5 20150623 (Red Hat 4.8.5-44) Copyright © 2015 Free Software Foundation, Inc. 本程序是自由软件;请参看源代码的版权声明。本软件没有任何担保; 包括没有适销性和某一专用目的下的适用性担保。 [root@CentOS7-4 ~]# make --version GNU Make 3.82 Built for x86_64-redhat-linux-gnu Copyright (C) 2010 Free Software Foundation, Inc. License GPLv3+: GNU GPL version 3 or later <http://gnu.org/licenses/gpl.html> This is free software: you are free to change and redistribute it.

记Flutter windows桌面端开发实战

前言 从今年1月份开始项目落实后开始使用flutter进行windows桌面应用开发,到现在出了第一个大版本,历时大致2个半月,项目组主要成员2个,后边面临开发压力先后又有2位开发加入完成一小部分溢出功能。 开发前准备 调研了大量flutter windows方面的开发小部件、注意事项、插件依赖库等,以下列出主要用到的插件: UI框架使用:fluent_ui(符合Microsoft Windows UI 准则且flutter官方推荐的ui框架) UI交互(状态管理)使用:Provider(Flutter 官方推荐的状态管理方式) 网络请求使用:dio(flutter中最受欢迎的网络请求插件) 数据库使用:sqlite3、sqlite3_flutter_libs(flutter packages 网站上使用量靠前的数据库插件) 国家化使用:intl(flutter官方力荐) 完整的pubspec.yaml依赖如下: fluent_ui: git: https://github.com/bdlukaa/fluent_ui.git system_theme: ^2.1.0 flutter_acrylic: ^1.1.0+1 window_manager: ^0.3.0 provider: ^6.0.5 dio: ^5.0.0 sqlite3: ^1.9.1 sqlcipher_flutter_libs: ^0.5.4 worker_manager: ^5.0.0 # flutter_nsd: ^1.3.3 flutter_nsd: path: ./packages/flutter_nsd logging: ^1.1.1 universal_disk_space: ^0.2.3 freezed: ^2.3.2 device_info_plus: ^8.1.0 synchronized: ^3.0.1 crypto: ^3.0.2 sprintf: ^7.0.0 number_paginator: ^0.2.3 multi_image_picker_view: ^0.0.15 expandable: ^5.0.1 path: ^1.8.3 shelf: ^1.4.0 shelf_router: ^1.1.3 network_info_plus: ^3.

毕业设计-基于深度学习的模糊文字识别方法

目录 前言 课题背景和意义 实现技术思路 一、相关理论基础 二、实验数据集准备 三、基于生成对抗网络的图像超分辨率重建 实现效果图样例 最后 前言 📅大四是整个大学期间最忙碌的时光,一边要忙着备考或实习为毕业后面临的就业升学做准备,一边要为毕业设计耗费大量精力。近几年各个学校要求的毕设项目越来越难,有不少课题是研究生级别难度的,对本科同学来说是充满挑战。为帮助大家顺利通过和节省时间与精力投入到更重要的就业和考试中去,学长分享优质的选题经验和毕设项目与技术思路。 🚀对毕设有任何疑问都可以问学长哦! 选题指导: https://blog.csdn.net/qq_37340229/article/details/128243277 大家好,这里是海浪学长毕设专题,本次分享的课题是 🎯毕业设计-基于深度学习的模糊文字识别方法 课题背景和意义 文字作为人类思想和情感的重要传播工具,在社会生活生产中扮演着重要角色。 在日常场景中,文字信息更是无处不在,如路标、广告牌、横幅等。这些场景文字图 像比起其他信息传播方式更直观更形象,通过对文字图片的分析,人们能更好了解图 片所传达的意义,从而思考和规划行为目的。因此,对自然场景中的文本文字进行分 析和识别具有重要的科学和社会意义。以当下来讲,随着科学方法和硬件设备的飞速 发展和迭代更替,越来越多的领域系统用到了文字图像识别技术。早期的光学字符识别(Optical Character Recognition,OCR)技术经过长时间的 沉淀,在识别文本文档图像上达到了较为理想的效果。但场景文字图像特有的复杂 性使得该类识别不能如以往的文字工作顺利进行。背景复杂程度、图像质量、文字 字型多样、文字排布多样的几类问题导致自然场景下文字识别的困难徒增。生产生活的需 要使得该类文字识别的研究加紧。因此对此开展研究并创新发明具有良好鲁棒性以 适应复杂多样的场景的算法模型成为了当前重要的课题。 实现技术思路 一、相关理论基础 神经网络基础知识 1、卷积神经网络原理 卷积神经网络是一类包含卷积计算且具有一定形状和层次结构的前反馈神经网 络。经典卷积神经网络LeNet5由卷积层、池化层和全连接层组成(如图所示)。 该网络所展现的层的设计思想成为现如今卷积神经网络结构选择的基础。 一系列的卷积运算在卷积层内展开,实际上这是一种简单的数学矩阵乘法和求和运算。如图所示,假定存在一个矩阵维度为3×3,卷积核大小为2×2,卷积核移动步长为1,从每行起向右侧依次滑动。将矩阵中像素值与对应卷积核中的权重值进行相乘,并将结果相加形成新的矩阵大小输出。 2、循环神经网络原理 在传统神经网络中,上一层与下一层能够得到充分地连接建立起关系网,但每层 各个节点之间缺少信息传递。在文字图片中,文字之间往往存在语义关系,所以设计 处理序列化关系的循环神经网络尤显重要。在一些常见检测(CTPN检测模块)和 识别(CRNN)算法中都引入了序列学习模型并获得了优异的表现。 循环神经网络通过使用带子反馈的神经元进行任意长度的序列处理。如图 3、生成对抗网络原理 在机器学习中,生成模型可以建立起变量间的条件概率分布。生成对抗网络就是 在依靠生成模型上引入对抗博弈的思想。 假设有一个生成模型(Generator)负责生成一张比较真实的图像,同时还有一个 辨别模型(Discriminator),以判别图像是生成的还是真实图像。于是我们可以将该生 成和判断过程抽象为以下步骤:(1)生成模型生成虚假图像(2)辨别模型二分类学习 辨别真假图像。(3)生成模型根据辨别模型结果增强生成图像的能力,生成新的虚假 图像。(4)辨别模型继续学习辨别真假图像的能力。直到二者收敛,此时生成模型和 辨别模型达到预期目标。其逻辑过程如图: 实验基础模型介绍 1、VGG网络 VGGNet由牛津大学的几何视觉组(Visual Geometry Group)于2014年提出并 在当年ImageNet比赛上取得优异成绩。作为深度卷积神经网络的代表之一,VGG 系列网络证明了小卷积核的优秀特征提取能力和网络加深对性能一定程度提升的可 行性。如今仍以其优秀的实用性活跃在涉及神经网络的领域中。 2、门控记忆单元 GRU门控记忆单元是一种特殊的RNN网络,在获取长序列文字前后语义关系时 能有更好的表现。与普通版RNN相比,GRU内部对输入信息进行了筛选,满足了进 行长时间记忆和重点记忆的需求。其网络内部存在两个门来控制隐藏状态的计算:重 设门(Reset Gate)和更新门(Update Gate)。 如图所示,GRU中的重设门和更新门的输入同普通版RNN一样都是当前输 入𝑋𝑡和上一时间状态ℎ𝑡−1,激活函数𝜎同为Sigmoid。

快速区分append()和extend()函数

1、append()函数 1.0 功能: append()是Python中的内置函数,作用是在列表的结尾追加数据。 1.1 特点: 一次只能追加一个数据,该数据可以是任何类型,包括数值(整型、浮点型)、字符串、元组、列表、集合、字典。 示例1: list1 = ["张三", "李四", "王五"] list1.append("赵六") print("追加字符串的结果是:", list1) list1.append(123) print("追加数值的结果是:", list1) 运行结果如下: 追加字符串的结果是: [‘张三’, ‘李四’, ‘王五’, ‘赵六’] 追加数值的结果是: [‘张三’, ‘李四’, ‘王五’, ‘赵六’, 123] 1.2 注意事项: 如果追加的数据是元组、列表、集合、字典,该函数会将他们当作一个整体追加到原来的列表中。 示例2: list1 = ["张三", "李四", "王五"] list1.append(("赵六", "pig")) print("追加元组的结果是:", list1) list1.append({456, "pig"}) print("追加集合的结果是:", list1) 运行结果如下: 追加元组的结果是: [‘张三’, ‘李四’, ‘王五’, (‘赵六’, ‘pig’)] 追加集合的结果是: [‘张三’, ‘李四’, ‘王五’, (‘赵六’, ‘pig’), {456, ‘pig’}] 2、extend()函数 2.0 功能: extend()是Python中的内置函数,作用是在列表的结尾追加数据。 2.1 特点: 一次只能追加一个数据,该数据必须是“可迭代的”对象,如:字符串、元组、列表、集合、字典,该函数会将可迭代对象中的元素逐一添加到原列表中,单独的数值(整型、浮点型)是不可以用extend函数的。

vue 项目设置全屏,使用screenfull插件

vue 项目设置全屏 一、使用screenfull插件1. npm安装screenfull插件2. 在vue文件中引入screenfull插件3. vue文件demo4. 监听F11和手动的全屏、退出全屏事件 二、快速了解screenfull插件1. 使用方法2. API3. 使用注意事项 一、使用screenfull插件 1. npm安装screenfull插件 npm install screenfull --save 提示:在vue项目中导入screenfull插件,出现编译错误,错误如图所示: 原因分析: 安装的screenfull插件版本过高 解决方法: 降低插件版本 npm install screenfull@4.2.0 --save 2. 在vue文件中引入screenfull插件 import screenfull from 'screenfull' 3. vue文件demo <template> <div> <ul> <li @click="clickFun">{{isFullFlag?'退出全屏':'全屏'}}</li> <li @click="clickFun1">{{isFullFlag1?'退出部分全屏':'部分全屏'}}</li> </ul> <!--需要全屏展示的内容--> <div id="content"></div> </div> </template> <script> import screenfull from 'screenfull' export default { name: "HelloWorld", data() { return { isFullFlag: false, isFullFlag1: false, } }, mounted() { // 监听页面全屏 window.

Flink 流批一体方案在数禾的实践

摘要:本文整理自上海数⽲信息科技有限公司⼤数据架构师杨涵冰,在 Flink Forward Asia 2022 流批一体专场的分享。本篇内容主要分为六个部分: 序传统方案与流批⼀体数据的流批一体方案逻辑的流批一体方案数据一致性方案流、批、调用一体方案 点击查看直播回放和演讲 PPT 一、序 1.1. 一些问题 我们在整个实时流模型开发的过程中,经常会遇到一些问题: 在对现有模型策略精耕细作之前,还有没有什么数据没有被使⽤?离线特征逻辑是否已经⾜够完整,为什么实时特征逻辑需要重新梳理与补充逻辑?不确定使⽤场景,⽆法区分点查和跑批,能不能同时覆盖?流式处理逻辑难以理解,为什么要流 Join,不能直接“取数”吗?实时模型策略空跑测试需要很⻓时间,能不能缩短?模型策略开发训练很快,上线时开发所需的实时特征却需要很久,能不能加速?特别是当我们要进行一些深度学习模型开发的时候,我们需要的实时数据会很多,且结构复杂,这个时候就更加难以使用传统实时特征的方式来进行解决。那么我们要如何将它上线呢? 1.2. 一些方案 针对以上的问题,我们提出了一些方案: 数据上,存储所有状态变化数据,还原任意时刻的数据切片状态。逻辑上,使用 Flink 流批一体,以流为主,逻辑一致,无需验证口径。执行上,使用流、批、调用一体化方案,自适应不同的场景。开发上,使用“取数”而不是流合并,封装实时流特有概念,降低实时开发门槛。测试上,支持任意时间段回溯测试,增加实时开发测试速度。上线上,自助式的流批一体模型开发上线,减少沟通环节,增加上线效率。 二、传统方案与流批一体 有两个很经典的传统方案分别是 Lambda 架构和 Kappa 架构。 Lambda 架构拥有实时链路和离线链路两个不同的数据链路。其中,实时链路是一个实时作业,它会将数据实时写入 Serving DB。离线链路则是一个离线作业,它会通过批处理的方式将数据写入 Serving DB。最后线上应用通过 Serving DB 进行访问。 Kappa 架构的实时链路和离线链路都使用了相同的流式处理系统,最后线上应用也是通过 Serving DB 进行访问。 那么 Lambda 和 Kappa 有什么优缺点呢? Lambda 架构的优点包括架构简单;很好的结合了离线批处理和实时流处理的优点;稳定且实时计算成本可控;离线数据易于订正。缺点包括实时、离线数据难以保持一致结果,需要维护两套系统。 Kappa 架构的优点包括只需要维护实时处理模块;可以通过消息重放进行数据回溯;无需离线和实时数据合并。缺点包括强依赖于消息中间件缓存能力;实时数据处理时存在丢失数据可能。 Kappa 在抛弃了离线数据处理模块的时候,同时也抛弃了离线计算更稳定可靠的特点。Lambda 虽然保证了离线计算的稳定性,但双系统的维护成本高且两套代码的运维很困难。 在数据源来自于 Kafka 的场景下,Kappa 看上去没有什么太多问题。但在互联网金融场景下,我们主要的数据源都来自事务性数据,比如说 MySQL,它的实时流数据可以通过 Binlog 进行同步,但最终数据还是要以 MySQL 内存储的数据为准。如果使用 Kappa,整个链路就会变成一个纯增量链路,累积的误差将难以进行修正。此时我们需要 Lambda 架构的离线修正能力。 我们提出的方案是 Lambda+Kappa,左边是 Lambda,右边是 Kappa。

ant-design-vue的form表单全局禁用问题

使用ant-design-vue如何像使用element-ui那样为form组件设置disabled属性来统一管理表单项是否禁用 实际使用ant-design-vue在开发表单的时候或许会遇到编辑与查看的需求, 但是查看的时候表单不允许编辑,ant-design-vue的官方是没有像element 一样提供全局disabled属性的,但是我们对一个一个的form-item去添加 又有一些麻烦,所以我使用了一个全局css属性才设置。 <Form v-model:value="data" :class="{ disable: type === 1 ? true : false }"> <FormItem label="角色名称"> <Input v-model:value="data.roleName" placeholder="请输入角色名称" allow-clear /> </FormItem> </Form> 定义一个可接收的参数来判断是否为disabled,然后为dom添加class属性 给class设置一个样式就可以 .disable { pointer-events: none; }

ESP8266模块GPIO16使用方式

本次开发ESP8266的环境是AiThinker_IDE,在设计一块电路板的时候,因为ESP8266模块原理图直接给出GPIO16,于是在程序没有去验证的情况下直接当做普通GPIO使用。 当实际情况使用时,发现GPIO16并不能直接使用,GPIO16作为时钟引脚是可以唤醒时钟的。 但当我们非要当做普通IO需要怎么使用呢? 首先,需要添加GPIO16开发专用库文件(.c .h)。 如图,将GPIO16的文件复制到SDK的相应目录下, 包含头文件: #include "driver/gpio16.h"。 然后调用函数初始化: gpio16_output_conf(); gpio16_output_set(0);//初始电平设置为0 就可以直接调用API来设置GPIO16的状态了。 void gpio16_output_set(uint8 value) 说了这么多,,起始网上最不好找的就是这个GPIO16.c和GPIO16.h了。我也是找了很久才找到,放在这里供大家下载。 这里是GPIO16.c文件 #include "ets_sys.h" #include "osapi.h" #include "driver/gpio16.h" void ICACHE_FLASH_ATTR gpio16_output_conf(void) { // mux configuration for XPD_DCDC to output rtc_gpio0 WRITE_PERI_REG(PAD_XPD_DCDC_CONF, (READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); //mux configuration for out enable WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //out enable WRITE_PERI_REG(RTC_GPIO_ENABLE, (READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe) | (uint32)0x1); } void ICACHE_FLASH_ATTR gpio16_output_set(uint8 value) { WRITE_PERI_REG(RTC_GPIO_OUT, (READ_PERI_REG(RTC_GPIO_OUT) & (uint32)0xfffffffe) | (uint32)(value & 1)); } void ICACHE_FLASH_ATTR gpio16_input_conf(void) { // mux configuration for XPD_DCDC and rtc_gpio0 connection WRITE_PERI_REG(PAD_XPD_DCDC_CONF,(READ_PERI_REG(PAD_XPD_DCDC_CONF) & 0xffffffbc) | (uint32)0x1); //mux configuration for out enable WRITE_PERI_REG(RTC_GPIO_CONF, (READ_PERI_REG(RTC_GPIO_CONF) & (uint32)0xfffffffe) | (uint32)0x0); //out disable WRITE_PERI_REG(RTC_GPIO_ENABLE,READ_PERI_REG(RTC_GPIO_ENABLE) & (uint32)0xfffffffe); } uint8 ICACHE_FLASH_ATTR gpio16_input_get(void) { return (uint8)(READ_PERI_REG(RTC_GPIO_IN_DATA) & 1); } 这是.

PyQt 设置背景图片以及设置全局背景不影响其他控件

如何设置控件背景 控件背景简单,直接在样式表中添加以下代码: self.textEdit.setStyleSheet("border-image:url(./icon.jpg);") 坑:注意背景图片设置是 border-image,不是 background-image background-image不拉伸,不自动适应页面大小 效果如图: 如何设置全局背景不影响其他控件 如果我们给全局设置背景图片会怎么样? 如图,我直接给全局设置背景,很明显,其他控件也被填充了背景图片。 解决办法: 看对象查看器,记住这里的名字 centralwidget 然后我们到全局布局 MainWindow的 背景样式表里, 将原代码: self.MainWindow.setStyleSheet("border-image:url(./icon.jpg);") 修改为: self.MainWindow.setStyleSheet("#centralwidget{border-image:url(./icon.jpg);}") 效果如图: 可以看到,其他控件没有受到影响。

MAT: Mask-Aware Transformer for Large Hole Image Inpainting论文阅读笔记

-CVPR 2022 -实例: Image Inpainting任务中,建立像素远距离相互作用,建立上下文信息之间的关系尤为重要。但现有的工作存在以下问题: ①堆叠卷积层来扩大感受野。这种方法在重纹理图像(森林,水)上表现得很好,但在结构复杂的图像上则表现不佳。 ②注意力模块进行远距离建模。由于计算能力有限,注意力模块只在小尺寸特征上进行应用,远距离建模没有充分利用。 ③Transformer远距离建模。受复杂度影响,现有Transformer只能通过恢复低分辨率图像进行结构预测。 本文贡献: ①提出一种新的框架Mask-aware Transformers(MAT),处理高分辨率图像。 ②提出多头上下文注意力模块,只对有效的token进行计算。 ③提出改进的Transformer block,提高训练稳定性。 ④提出风格操作模块,使得修复结果多元化。 网络结构: 整体结构由 卷积头、Transformer Body、卷积尾和风格操作模块组成。 结合了卷积和Transfomer的优点,对图像进行修复。 -卷积头: 卷积头主要由四个卷积层构成,其中一个卷积层用于改变输入的维度,其他三个卷积层进行下采样操作。以此产生原图八分之一大小分辨率大小的特征图用作输入Transforer块的Tokens。 使用卷积头的两个原因: ①使用卷积层加入局部归纳先验 ②下采样以降低计算成本 -Transformer Body ①改进的transformer 块 ① 删除Layer Normalization层归一化:在大面积缺失的情况下,大部分的token是无效的,层归一化会放大这些无效token ②删除残差连接,改为concat:残差连接鼓励模型学习高频信息,在训练初期,没有低频的基础,很难直接学习高频细节。 ②多头上下文注意力模块 利用动态掩模版的方式,只对有效的token进行计算,该部分可表示为: 动态掩模版的更新方式: 更新规则: 只要当前窗口有一个token是有效的,经过注意力后,该窗口的所有token都会更新为有效的。 如果一个窗口中的所有token都是无效的,经过注意力后,他们仍然无效。 ③Style Manipulation Module SMM通过额外的噪声输入以及改变卷积层的权重归一化来操作输出。为了增强噪声输入的表示能力,图像的条件风格从图像特征X和噪声中进行学习。 -Loss Function

python闯红灯检测斑马线检测红绿灯检测车速检测车流量统计车牌识别智慧交通系统

本项目是使用pytorch作为深度学习框架的智能交通检测系统。可以识别并处理路口交通状况,目前完成的功能有: 车辆、行人、摩托车、斑马线检测识别。 红绿灯检测识别 车辆跟踪 车速判断,超速行为识别,交通拥堵状况识别。 车流量统计 车牌检测识别 行人、车辆闯红灯检测 未按导向行驶、车辆压线 交通检测数据可视化 违规行为抓拍 目录 1 引言............................................................................................................................ 4 1.1 编写目的......................................................................................................... 4 1.2 背景................................................................................................................. 4 1.3 参考资料......................................................................................................... 4 1.4 参考开源项目................................................................................................. 4 2. YOLO-v5 目标检测................................................................................................. 4 2.1 结构解析......................................................................................................... 4 2.1.1 概要...................................................................................................... 4 2.1.2 Focus..................................................................................................... 7 2.1.3 BottleneckCSP...................................................................................... 8 2.1.4 SPP...................................................................................................... 13 2.1.5 PANET................................................................................................ 14 2.2 迁移学习....................................................................................................... 15 2.2.1 准备数据集........................................................................................ 16 2.2.2 环境设定............................................................................................ 20 2.2.3 配置/修改文件和目录结构............................................................... 20 3. 基于DeepSORT算法的目标跟踪........................................................................ 22 3.1算法介绍........................................................................................................ 22 3.1.1 MOT主要步骤................................................................................... 22

7天涨粉百万,老九好茶爆火出圈,他做对了什么?

“说卖普洱挣钱,你懂普洱吗?这一片888,光成本都得20” 视频中的@老九好茶一脸严肃的讲述着行业搞笑段子,该账号将茶行业的内幕,通过“脱口秀”形式呈现出来,获得不少网友的喜欢,近7天涨粉135.43w,涨粉率980.8%。 更多达人粉丝变化数据,可前往新抖数据查看 7天涨粉百万 老九好茶为何突然走红? 22年年底@老九好茶账号开始运营,从近90天概览数据来看,账号初期直播占比较多,在常规直播带货模式下,账号数据平平,粉丝增长缓慢,直到3月下旬才凭借行业揭秘段子,爆火出圈。 ▲ 新抖-抖音号搜索-数据概览 在粉丝暴涨期间,@老九好茶共发布了4条视频,其中3月21日发布的“当战歌想起,请保护好你的钱包”预估播放超过950w,点赞19.89w,对比3月初期,数据增长至少10倍;开启的3场带货直播也获得不错数据,场均在线人数增长近34倍。 ▲ 新抖-抖音号搜索-直播分析 回溯账号出圈内容,@老九好茶视频以单人出境的口播为主,视频内容反讽行业现象,语言辛辣风趣,金句频出,通过几条视频就打造出独属自己的人设,增强观众记忆点。 ▲ 达人抖音画面 更有趣的是老九本是一位年轻小伙,通过抖音特效将自己变成60岁的老头,年龄加上专业知识更增加了视频内容的可信度。 在众多同类账号中,@老九好茶的内容又有何魅力呢? 什么内容 才能引爆粉丝增长? 茶行业常见视频内容多为茶艺展示、茶叶科普、冲泡教程,整体风格优雅闲静,彰显茶文化的独特魅力,体现产品的价值。@老九好茶却反其道而行之,通过辛辣的反讽内容脱颖而出,这样的差异化降低了观众的记忆门槛,当提到与茶相关的达人时,第一时间就能想起他。 有趣的脚本和声情并茂的表演方式,也帮助@老九好茶快速吸粉,大批观众曾多次在评论中表示“把其视频当作段子看”。泛娱乐内容虽然没有较强的实用价值,但却为观众提供情绪价值,更易被用户所接受。 ▲ 新抖-抖音号搜索-短视频作品-评论词云 满足观众好奇心也是@老九好茶视频爆火的关键,老九说的内容多为茶行业的“内幕信息”,这一点与“绝命毒师”辛吉飞类似,他触摸到了很多人不知情的东西,用直白的语言把专业知识具象化,让人大开眼界,这种感觉是他受到追捧的核心,且该“内幕”还直接与茶叶利润相关,进一步满足了观众好奇心。 通过优质内容@老九好茶狂揽百万粉丝,在流量突然暴涨的情况下,该如何承接,完成商业变现呢? 爆火出圈后 如何更好地实现流量转化? @老九好茶拥有自己的线下店铺,直播带货本就是为了转移线下销售压力,随着粉丝的增长,直播间销售额也开始攀升。 以3月28日的直播为例,直播近5小时,共吸引114.98w人围观,直播预估销量超7.5w,销售转化率6.62%,远高于传统茶艺品牌直播间,可以看出@老九好茶粉丝虽经常在短视频里留言“只看不买”,但其实还是具有较强购买意愿和购买能力的。 ▲ 新抖-抖音号搜索-直播分析 进入@老九好茶直播间,可以看到直播场地选在发货仓库,营造真实氛围;直播间基础人员配置为3人,采取主播出镜副播场外协助的模式;在讲解产品时常结合茶类科普知识,展示主播专业度;带货强调产品生产地并现场开包展示,增加用户信任度。 ▲ 达人抖音画面 从商品层面来看,主播带货产品都来源于自己的“华九岭茶叶供应链个体店”,单价为&nbsp;<50&nbsp;的商品销量最高,提供多种试喝小样茶,以“3元”低价产品打开销路,在用户真实体验后可以有效提高复购率,降低产品退货率。 ▲ 新抖-抖音号搜索-带货商品 除了直播带货外,@老九好茶也会建立自己的粉丝群,通过私域运营来有效触达用户,完善的售后服务、优惠活动都能有效提升粉丝粘性,提升品牌忠诚度,实现口碑传播,带来更多复购机会。 有了坚实的粉丝群体,也能为短视频、直播预告引流,为商业变现打下基础。 ▲ 达人抖音视频截图 通过抖音短视频和直播,@老九好茶实现了线下门店向线上转型,以内容驱动消费,他的成功让更多同类商家看到了新的营销模式和内容创作方向,在以兴趣电商为主导的抖音,内容引流的作用不可忽视。 如果您也想入局这个赛道,打造爆款视频,实现粉丝增长,可借助新抖数据平台,洞察行业创作生态,学习爆款创作技巧。

[object Object],[object Object]‘. This may cause an update error.报错解决方法

Vue.js写v-for循环语句时,出现[Vue warn]: Duplicate keys detected: '[object Object],[object Object],[object Object],[object Object]'. This may cause an update error.错误,是因为缺乏标识。 解决此类问题,:key=itme中加上:key=item.id就可以了,好比一个队伍加上一个领队,队伍就有头了。 成功改正

el-cascader 获取label值

<el-cascader v-model="postValue" :options="postOptions" :props="props" ref='postSelectRef' @change='postValueChange($event)'></el-cascader> postValueChange(value) { console.log(this.$refs["postSelectRef"].getCheckedNodes()); console.log( this.$refs["postSelectRef"].getCheckedNodes()[0].data.label ); },

使用jquery.qrcode生成二维码

1、首先在页面中加入jquery库文件和qrcode插件。 <script type="text/javascript" src="jquery.js"></script> <script type="text/javascript" src="jquery.qrcode.min.js"></script> 2、在页面中需要显示二维码的地方加入以下代码: <div id="code"></div> 3、生成二维码 qrcode支持canvas和table两种方式进行图片渲染,默认使用canvas方式,效率最高,当然要浏览器支持html5。直接调用如下 $('#code').qrcode("http://www.helloweba.com"); //任意字符串 也可以通过以下方式调用: $("#code").qrcode({ render: "table", //table方式 width: 200, //宽度 height:200, //高度 text: "www.helloweba.com" //任意内容 }); 这样就可以在页面中直接生成一个二维码,你可以用手机“扫一扫”功能读取二维码信息。 执行这个方法之后会在页面上渲染一个canvas标签。 识别中文 我们试验的时候发现不能识别中文内容的二维码,通过查找多方资料了解到,jquery-qrcode是采用charCodeAt()方式进行编码转换的。而这个方法默认会获取它的Unicode编码,如果有中文内容,在生成二维码前就要把字符串转换成UTF-8,然后再生成二维码。您可以通过以下函数来转换中文字符串: function toUtf8(str) { var out, i, len, c; out = ""; len = str.length; for(i = 0; i < len; i++) { c = str.charCodeAt(i); if ((c >= 0x0001) && (c <= 0x007F)) { out += str.charAt(i); } else if (c > 0x07FF) { out += String.

Java开发Twitter爬虫抓取图片和视频并保存到本地

零、目标 使用Java开发爬虫,爬取Twitter状态下评论中的图片和视频,并将其保存到本地。 一、调研爬虫框架 Twitter4J: https://github.com/Twitter4J/Twitter4J 这是一个基于Java开发的框架,使用Twitter官方API接口。在使用之前,需要使用自己的账号申请秘钥。 WebMagic: https://github.com/code4craft/webmagic 这是一个由国人开发的Java爬虫框架,拥有很好的中文文档:http://webmagic.io/docs/zh/ 此外,还有一些使用WebMagic开发的项目,地址为:https://github.com/topics/webmagic 在这里,有一个使用WebMagic编写的Twitter爬虫TwitterCrawler,其地址为:https://github.com/casolxia/TwitterCrawler。因此,我选择基于这个爬虫进行二次开发。 二、爬虫使用方法与问题记录 接下来,将TwitterCrawler Fork到我的Github仓库:https://github.com/wayss000/TwitterCrawler,然后将其clone到本地并进行启动调试。 启动遇到的问题记录: 问题1:无法访问org.apache.http.annotation.ThreadSafe。 原因:参考博客https://blog.csdn.net/lvyuan1234/article/details/103774766,是因为ThreadSafe这个类在httpcore-4.4.4.jar以后就被去掉了,而这里引用的是httpcore-4.4.14.jar。 解决方法:将httpcore版本改为4.4.4。 问题2:报错:javax.net.ssl.SSLException: Received fatal alert: protocol_version。 原因:参考https://stackoverflow.com/questions/16541627/javax-net-ssl-sslexception-received-fatal-alert-protocol-version,是因为在Java 1.8中,默认的TLS协议是v1.2。在Java 1.6和1.7中,默认的协议是已过时的TLS1.0。我在Java 1.8上遇到了这个错误,因为URL使用了旧的TLS1.0(如你所见 ClientHello, TLSv1)。为了解决这个错误,你需要重写Java 1.8的默认设置。 解决方法:将WebMagic克隆到本地,运行mvn install webmagic,然后在TwitterCrawler中引用本地编译的WebMagic版本,而不是pom.xml中的0.7.3版本。 问题3:Unable to start ServletWebServerApplicationContext due to missing ServletWebServerFactory bean. 原因:@SpringBootApplication annotation missing in your spring boot starter class. 解法:在启动类上,增加@SpringBootApplication注解 问题4:Error creating bean with name ‘dataSource’ defined in class path resource 原因:springboot缺少数据源的配置。 解法:之前TwitterCrawler的项目用了数据库保存爬取的数据,但我这里不需要,因此删除与数据源相关的配置。 三、开发爬取Twitter图片、视频的代码 这里遇到了阻塞性问题:”Twitter使用JavaScript来生成其内容或者进行重定向,那么爬虫程序会收到“不支持JavaScript”的错误信息。这是因为爬虫程序默认情况下不会执行JavaScript代码,而是只会读取HTML文档中的静态内容。如果网站的内容是由JavaScript生成的,那么爬虫程序将无法正确解析这些内容。解决这个问题的方法是使用一个支持JavaScript执行的爬虫框架,比如Selenium或Puppeteer。这些框架可以模拟一个真实的浏览器环境,执行JavaScript代码并获取生成的内容。不过,使用这些框架会增加程序的复杂性和运行时间。” 暂时放弃自己开发的想法。 四、整理一些知识 写web自动化测试代码,一般用的技术框架?

VSCode调试C++代码的多种方案

以下内容均针对 Linux 操作系统(包括Windows的Linux子系统WSL2)。 本文是对Linux系统中使用VSCode编译调试C++代码的系列文章的总结,前面三篇文章如下: 详解C/C++代码的预处理、编译、汇编、链接全过程Linux环境使用VSCode调试简单C++代码Linux环境使用VSCode调试CMake工程 1. 根本逻辑 在VSCode中编译调试C++代码的本质逻辑: tasks.json 指定如何生成二进制可执行文件 可以直接通过g++编译器生成可以通过CMake生成可以通过脚本.sh生成 launch.json负责配置gdb调试器,包括:指定可执行文件名、命令行参数,以及预执行任务(prelaunchTask) 2. 方案一:直接调用g++编译器生成可执行文件 具体过程在这篇文章中详细解释:Linux环境使用VSCode调试简单C++代码 这里简要概括重点内容。 第一步:将*.cpp源代码文件通过g++编译器生成一个可调试的可执行二进制文件 如果不在VSCode中运行,而是在终端中运行,需要运行下面的指令: g++ -g hello.cpp -o hello 那么将这一步配置在VSCode的tasks.json中,tasks.json中的内容应该如下(具体过程可以参考上面的链接): { "version": "2.0.0", "tasks": [ { "type": "cppbuild", "label": "C/C++: g++ 生成活动文件", "command": "/usr/bin/g++", "args": [ "-g", "${file}", "-o", "${fileDirname}/${fileBasenameNoExtension}" ], "options": { "cwd": "${fileDirname}" }, "problemMatcher": [ "$gcc" ], "group": { "kind": "build", "isDefault": true }, "detail": "编译器: /usr/bin/g++" } ] } 第二步:调用gdb调试器对可执行文件进行调试 如果不在VSCode中运行,而是在终端中运行,需要运行下面的指令:

STM32 SPI+DMA 驱动 SRAM LY68L6400SLIT 应用笔记

关键词:库函数,STM32F407,SPI+DMA ,SPI-DMA,SRAM , LY68L6400SLIT,STM32CubeMX 编 辑:大黄蜂 说明:本笔记记录 基于 STM32F407 + RT RTOS 采用 SPI接口和 SPI+DMA接口 调试 SRAM LY68L6400SLIT (8M 字节 SRAM) 重点:STM32 HAL SPI 库函数;STM32CubeMX SPI 配置;STM32CubeMX SPI 配置+DMA配置;SPI+DMA 读写SRAM 项目测试平台:STM32F407核心板 + LY68L6400SLIT (8M 字节 SRAM)+ rt-thread4.0.2 调试心得: 1:调试 SRAM 时最开始用的是 STM32CubeMX 配置的 SPI 配置代码和 SPI 库函数,先期调试还算顺利,但测试时发现代码在读写大数据量,例如写满8M 耗时不记得了,读完8M耗时在14s左右。 2:希望优化 SRAM的读写速度,所以使用 SPI + DMA 读写,这个调试过程从最开始的读写错误,到后面发现有部分数据是准确的,再到读写不稳定,最后读写彻底稳定,连续读写15小时无错误。 3:发生SPI + DMA 调试不顺的问题主要是忽略了 DMA 发送数据的机制,DMA发送是需要时间的,一开始的测试代码都是执行了 DMA发送代码就立即 关掉了SRAM的使能。代码从执行了DMA读写后就立刻关掉了使能,这时DMA实际上正在执行读写操作,从而导致了DMA读写错误。 4:优化,在发现 DMA 收发都需要时间这一问题后,对此做了判断 DMA 状态的优化,读写DMA都先判断DMA就绪后再进行下一步操作,从而完成了SPI + DMA 对 SARM的读写测试。

Ubuntu系统安装在移动固态硬盘,实现在不同电脑即插即用

Ubuntu系统安装在移动固态硬盘,实现在不同电脑即插即用 一、前期准备二、制作系统启动盘2.1 Ubuntu20.04系统下载2.2 制作U盘启动盘 三、 磁盘分区(重点)四、Ubuntu系统安装(常规)五、boot-repair(重要)六、关键点汇总七、参考教程 一、前期准备 一个用于制作系统启动盘的U盘UltraISO软件:直接百度搜索,下载试用版即可DiskGenius软件(用于磁盘分区)待安装系统的移动固态硬盘SSD 二、制作系统启动盘 2.1 Ubuntu20.04系统下载 到Ubuntu官网找到自己想要的版本,比如20.04.5版本,下载对应的 ubuntu-20.04.5-desktop-amd64.iso 文件。 如果下载太慢,可以到清华镜像源网站下载,速度会快很多 下载完Ubuntu系统文件后,开始制作U盘启动盘。 2.2 制作U盘启动盘 打开UltraISO软件,点击左上角 “文件” -> “打开…” -> 找到并选择刚刚下载的Ubuntu镜像文件(.iso文件)镜像文件加载完成后,点击左上角“启动”→“写入硬盘映像”弹出提示框,选择自己的U盘,然后点击“写入”就开始制作系统启动盘,等待一段时间后提示制作完成。 三、 磁盘分区(重点) 打开DiskGenius软件,选中自己准备装系统的磁盘(根据型号确定),比如我这里是SamsungPSSDT7。选中磁盘,鼠标右键选择 “转换分区表类型为GUID模式”(这一步很关键,决定了移动硬盘上的Ubuntu系统插在不同电脑上都能运行)磁盘分区,可以分四个区: ESP(0)分区 :文件系统类型为FAT32,大小我分配为1.0GB。该分区用于Linux系统的 /boot引导分区,后续启动 Ubuntu 系统的引导文件将会放在这个分区下的EFI目录,所以这个分区很重要。分区(1):文件系统类型为Linux swap partition,大小我分配为16.0GB。该分区用于Linux系统的swap交换空间。分区(2):文件系统类型为EXT4,大小我分配为64GB。该分区用于Linux系统的 “/” 目录。分区(3) :文件系统类型为EXT4大小我分配为320 GB。该分区用于Linux系统的 “/home” 目录。我这里是将系统安装在1T的移动固态硬盘,除了上述4个分区外,还剩530G左右,剩下的这部分可以当作一个正常的存储硬盘来用。 特别提醒:个人测试的情况是,只有 转换分区表类型为GUID模式,且硬盘的最开始位置是ESP分区(EFI格式) 才能保证移动硬盘上安装的Ubuntu系统插在不同的电脑上都能运行。 四、Ubuntu系统安装(常规) 在电脑上同时插入U盘启动盘和准备安装系统的移动固态硬盘;重启电脑进入BIOS(我的电脑型号为联想拯救者 REN-7000K,开机按F2进入BIOS)进入BIOS后,设置启动优先级为U盘启动优先接下来的过程比较常规,安装Ubuntu -> 选择语言 -> 正常安装 -> 安装类型为“其他选项” -> 安装启动引导器的设备(一定要选择 /boot 对应的分区ESP0, 不然启动不了) -> 选择地区 -> 用户名、密码设置 -> 等待安装完成 这部分的具体过程(图文详细)可以参考以下两个教程: - 在移动硬盘上安装Ubuntu20.04教程 - 新手安装 Ubuntu 操作系统步骤教程

数字图像处理【2】对比度亮度精准调节、常用灰度变换、直方图均衡化

图像对比对和亮度的调节 上一节认识了图像颜色模型HSI,最后提到了对比度和亮度。这两个参数对于图像质量评价来说是最直观且重要的一组参考变量。譬如在拍摄到一些不太理想的状态的图片,那么为了得到一幅更高质量的图像,就需要一些图像处理的方法,对这个图像进行调节以得到更好的对比度,得到更好的一个亮度水平,从而提高这个图像的质量。 首先如何定义图像对比度:它表示这个图像的动态范围,即HSI模型当中的强度I。在全图像范围内,用最大的强度值和最小的强度值,两者直接确定一个范围,即当前图像的对比度范围,范围越大对比度越好。 那这一节就讲讲图像灰度的变换算法。 在实际工作当中,我们希望有一个精准的调节,譬如说希望把对比度提高20%,亮度降低20%,这样的一个精准调节是如何实现了,如上图分成5个步骤,已经说明的很详细了。 最后补充一下,我们时常调整对比度和亮度的时候,亮度是直接加一个系数,并没有考虑到当前对比度的,这样是其实是会影响到对当前像素的对比度和亮度精准把控。以上公式就不会影响了,做到了对比度和亮度的精准调节。 灰度变换应用1——对数变换 对数变换的一个变换过程,用以上公式来表达:r为输入图像灰度,再对进行一个log运算的一个变化。log变换有什么作用:有时候输入原图的动态范围太大,已经超出某些显示设备的允许的动态范围(如HDR),如何直接用原图进行显示,那么图像里面的一些高光细节就会显示不出来,造成信息丢失。 解决方法就是对这个原图的高光部分进行一个灰度压缩,比如说我们就用这里的对数变换。 譬如上图a是一幅0~1.5*10^6的傅里叶频谱图的反转变换(黑白反转),这个动态范围非常大,在这个8位深的显示设备上,它的这个中心点特别亮,次低频细节看不清存在丢失信息的现象。图b是使用了对数变换处理过的一个结果,明显细节信息丰富了,能够更加清晰地显示出来。 总结:对数变换,尽可能保留低光部分,把高光部分进行灰度等级压缩。 灰度变换应用2——伽马变换 介绍另外一个更常用的变换,伽马变换。f是原图的(灰度)输入,然后进行(γ)伽马次方的运算。其中右边是伽马取不同值,输入输出的关系曲线图。由图分析可知,当伽马γ < 1的时候,较暗的输入会迅速爬升,但不会超出1,较亮的输入会比较平滑的回归到1。这个意味着把暗区进行了拉伸的变换,把亮区进行一个压缩,那么原来图像暗的区域会变亮。当伽马γ > 1的时候效果就相反,把暗区进行了压缩的变换,把亮区进行一个拉伸。 以上看两个实例,就是一个很好的伽马变换说明。第一个是医学镜像图,很明显的看出使用伽马小于1的变换进行处理后,信息量得到提升。而第二个是飞行仪在空中的抓拍,由于日光的照射,输入图像整体偏亮,进行伽马大于1后的变换处理,路面信息得到明显的增强效果。所以伽马变换的取值,要根据输入图像的情况区别处理。 灰度变换应用3——灰度直方图、均衡化 前面介绍的几种灰度变换算法,它都是需要人为的定义一些辅助参数进行调节,而接下来介绍的直方图均衡化算法,它是一个不需要辅助参数,可以说是一个全自助动的图像处理方法。如何理解?也就是说处理效果,和原输入有莫大的关系。 首先来对直方图做一个定义:对于范围再【0,L-1】的灰度图像,(这里的L就是8bit显示位深的表示最大范围256,灰度等级就是0~255)对于这样一副数字图像,对它的灰度等级进行一个数量统计。譬如在像素总个数为n的数字图像中,灰度等级在r(k)=255的像素个数共有n(k)个。利用n(k) / n就可以得出灰度等级r(k)在这副数字图像中的灰度密度函数p,统计所有灰度等级的密度就可以绘制出直方图。直白的说灰度直方图就是数字图像灰度的密度分布函数。 有了直方图的定义,再观察右边的4张图像和对应的灰度直方图,图4效果是最符合人类观察的,它对应的直方图分布是最均匀的,从4张图像的直方图对比可以总结,如果直方图处于均衡的状态,那么对应的数字图像具有更好的对比度。那么可以从修改它的直方图这个角度入手,把直方图均衡化,从而达到图像增强的目的。 那么希望找到一个变换,记s=T(r),r为输入图像的灰度值,s是变换以后的灰度值。变换后的图像灰度直方图(相比原输入图像的直方图)是均匀的。而且还需要满足以上两个条件。 条件1、s在区间0≤r≤1中大于0且单调递增。此条件保证了原图各灰度等级在变换后仍保持从黑到白的排列顺序。 条件2、当0≤r≤1时,0≤s≤1。保证变换前后灰度值的动态范围一致性。 设变换前图像的密度函数为p(r),变换后的密度函数为p'(s),灰度变换函数为s=T(r)。 由概率论可知,原概率密度函数 对变换前原图像的灰度等级进行统计 和 变换后概率密度函数 对变换后图像的灰度等级进行统计,两者是相等的(图像像素个数相等)即: p(r) * deta(r) = p’(s) * deta(s) 而经过变换的图像灰度密度函数p'(s)是一个均匀分布,均匀分布的一个特性就是: p = 1/(b-a),[a,b] 结合两个公式,也就是转换成: deta(s) = p(r) * deta(r) 在[0,1]区间 对两边同时积分 T(r) = s = ∫ p(t) dt 在[0, r]范围内 从这一步我们看到转换函数T(r)就是对原来的概率密度函数,做一个累积分布函数的计算。 而对于离散的数字图像,我们是无法做积分的,可以使用以上的累加代替积分。如何理解这个公式,S(k)等于变换后的灰度值,等于原灰度等级的概率进行累加计算,等于当前所有灰度等级的范围内,概率密度的积分。 下面看一个例子 这里假设一幅64*64的数字图像,位深为3,共有8个灰度等级,原灰度分布如左图统计所示。有了这个统计可以推出原来的直方图,根据介绍的直方图均衡化公式,原输入灰度r1变换后的灰度值s1,当前输入灰度等级是1,那么对于当前的灰度等级,s1等于r0到r1的概率密度的积分,等于r0到r1灰度等级概率的累加计算,等于7*(0.19+0.25)=3.08取整为3;其他灰度等级的计算如此类推。 介绍了直方图均衡化以后,还要说说它的具体应用——直方图的匹配,也叫直方图规定化。比如说现在有两幅输入图像1和2,直方图1我是满意的,希望图像2能有图像1这样的或者相似的直方图,那就相当于要把这个直方图做一个匹配或者说做一个规范映射。 此时我们可以先把直方图1进行均衡化后,得到一个直方图1到均匀直方图的映射关系,再把直方图2也作均衡化处理,此时就可以利用均匀的直方图作一个桥梁,链接直方图1和2,达到一个映射的关系。

[blender]拖拽新建、合并窗口

拖拽新建窗口 打开BLENDER,移动鼠标如下图所示位置,鼠标光标变为如下图所示的光标,按住鼠标左键 不放 向左进行拖拽, 松开鼠标左键,就可以获得新的窗口 拖拽合并窗口 移动鼠标如下图所示位置,鼠标光标变为如下图所示的光标,按住鼠标左键 不放 向左进行拖拽, 当按住鼠标左键不放,进行拖拽的时候,移动到窗口边缘的位置,如下图所示的位置,松开鼠标左键,就可以合并窗口 

iOS SafeArea安全区域

1. 前言 本文的出发点是对iOS设备的适配, 我们之前的适配只是考虑设备的尺寸, 设备的方向, 而在iPhoneX出来之后呢, 我们又多了一种考量, 那就是刘海和底部横条(HomeIndicator), 我们通过UIKit11.0之后新增的API来解决这个问题, 达到不同设备尺寸, 不同设备方向的完美适配。 2. 之前的做法 注: 该方法只适用于设备的竖屏, 如果是横屏就会出现问题 我们是用宏, 来解决这个问题的, 像这样: /** 设备屏幕宽度 */ #define LCLScreenWidth [[UIScreen mainScreen] bounds].size.width /** 设备屏幕高度 */ #define LCLScreenHeight [[UIScreen mainScreen] bounds].size.height /** iPhoneX判断 */ #define LCLIsIphoneX (CGSizeEqualToSize(CGSizeMake(375.f, 812.f), UIScreen mainScreen].bounds.size) || CGSizeEqualToSize(CGSizeMake(812.f, 375.f), [UIScreen mainScreen].bounds.size)) /** 状态栏高度 */ #define LCL_StatusBar_Height ((LCLIsIphoneX) ? 44 : 20) /** 导航栏高度 */ #define LCL_NavBar_Height ((LCLIsIphoneX) ? 88 : 64) /** 标签栏高度 */ #define LCL_TabBar_Height ((LCLIsIphoneX) ?

Linux 集群时钟不同步导致的问题

1、Linux 集群时钟不同步导致的问题 时钟此处指服务器时间,如果集群中各个服务器时钟不⼀致势必导致⼀系列问题,试想 “集群是各个服务器⼀起团队化作战,⼤家工作都不在⼀个点上,岂不乱了套!” 举⼀个例⼦,电商网站业务中,新增⼀条订单,那么势必会在订单表中增加了⼀条记录,该条记录中应该会有“下单时间”这样的字段,往往我们会在程序中获取当前系统时间插⼊到数据库或者直接从数据库服务器获取时间。那我们的订单⼦系统是集群化部署,或者我们的数据库也是分库分表的集群化部署,然⽽他们的系统时钟缺不⼀致,⽐如有⼀台服务器的时间是昨天,那么这个时候下单时间就成了昨天,那我们的数据将会混乱!如下 2、集群时钟同步配置 集群时钟同步思路 分布式集群中各个服务器节点都可以连接互联网 场景一:各个节点都可以访问互联网,各自同步国家授时中心/时间服务器 操作⽅式: #使⽤ ntpdate 网络时间同步命令 ntpdate -u ntp.api.bz #从⼀个时间服务器同步时间 windows 有计划任务 Linux 也有定时任务,crond,可以使⽤ linux 的定时任务,每隔 10 分钟执⾏⼀次 ntpdate 命令 分布式集群中某⼀个服务器节点可以访问互联网或者所有节点都不能够访问互联网 场景二和场景三:把 node1 作为局域网内的时间服务器,其他服务器从 node1 上同步时间 操作⽅式: 1)选取集群中的⼀个服务器节点 A(172.17.0.17)作为时间服务器(整个集群时间从这台服务器同步,如果这台服务器能够访问互联网,可以让这台服务器和网络时间保持同步,如果不能就⼿动设置⼀个时间) ⾸先设置好 A 的时间把 A 配置为时间服务器(修改/etc/ntp.conf ⽂件) 1、如果有 restrict default ignore,注释掉它 2、添加如下⼏⾏内容 restrict 172.17.0.0 mask 255.255.255.0 nomodify notrap # 放开局域网同步功能,172.17.0.0是你的局域网网段 server 127.127.1.0 # local clock fudge 127.127.1.0 stratum 10 3、重启⽣效并配置ntpd服务开机⾃启动 service ntpd restart chkconfig ntpd on 集群中其他节点就可以从 A 服务器同步时间了

Flutter完整开发实战详解(一、Dart语言和Flutter基础)

前言 在如今的 Fultter 大潮下,本系列是让你看完会安心的文章。本系列将完整讲述:如何快速从0开发一个完整的 Flutter APP,配套高完成度 Flutter 开源项目 GSYGithubAppFlutter。同时也会提供一些Flutter的开发细节技巧,并针对开发过程中可能遇到的问题进行填坑。 一、基础篇 本篇主要涉及:环境搭建、Dart语言、Flutter的基础。 1、环境搭建 Flutter 的环境搭建十分省心,特别对应 Android 开发者而言,只是在 Android Stuido 上安装插件,并下载flutter Sdk到本地,配置在环境变量即可。其实中文网的搭建Futter开发环境 已经很贴心详细,从平台指引开始安装基本都不会遇到问题。 这里主要是需要注意,因为某些不可抗力的原因,国内的用户需要配置 Flutter 的代理,并且国内用户在搜索 Flutter 第三方包时,也是在 https://pub.flutter-io.cn 内查找,下方是需要配置到环境变量的地址。(ps Android Studio下运行 IOS 也是蛮有意思的(◐‿◑)) ///win直接配置到环境编辑即可,mac配置到bash_profile export PUB_HOSTED_URL=https://pub.flutter-io.cn //国内用户需要设置 export FLUTTER_STORAGE_BASE_URL=https://storage.flutter-io.cn //国内用户需要设置 2、Dart语言下的Flutter 在跨平台开领域被 JS 一统天下的今天,Dart 语言的出现无疑是一股清流。作为后来者,Dart语言有着不少Java、kotlin 和 JS 的影子,所以对于 Android 原生开发者、前端开发者而言无疑是非常友好的。 官方也提供了包括IOS开发者,React Native 等开发者迁移到 Flutter 上的文档,所以请不要担心,Dart语言不会是你掌握 Flutter 的门槛。甚至作为开发者,就算你不懂 Dart 也可以看着代码摸索。 Come on,下面主要通过对比,简单讲述下 Dart 的一些特性,主要涉及的是 Flutter 下使用。 基本类型 var 可以定义变量,如 var tag = "

vscode连接远程服务器 + Tensorflow2环境配置 + 深度学习训练

参考:vscode连接远程服务器(傻瓜式教学) 配置服务器pytorch/TensorFlow环境+远程连接vscode 在远程服务器安装anoconda并创建tensorflow-gpu环境并运行jupyter 【vscode连接远程服务器】 step 1:测试服务器连接 win+R 进入 cmd,在命令行输入以下命令,并根据提示输入密码 ssh username@severIP # 用户名@服务器IP地址 step 2:安装 ssh 插件 打开 vscode,在左侧菜单栏的 Extensions 中搜索 remote - SSH 插件,点击 Install 安装 安装完成后,在左侧的菜单栏里会新增加一个 Remote Explorer step 3:添加服务器连接 点击“+”添加新的服务器连接,在提示框输入 ssh username@severIP, 回车,将其保存至配置文件 C:\Users\xxx\.ssh\config 中(若已有多个服务器,再次添加新的后,记得在 REMOTE 右边刷新一下) step 4:连接服务器 右键想要连接的远程服务器,点击“Connect in Current Window...”,并根据提示输入密码 左下角显示连接成功 step 4:查看服务器文件 在左侧菜单栏的 Explorer 中点击 username [SSH: ip] 查看远程服务器目录下的文件 【Tensorflow2环境配置】 step 5:Anaconda 环境 连接成功后,在终端 TERMINAL 的右上角点击‘+’打开一个新的终端 我拿到的服务器已经安装过了 minianaconda(教程可参考置顶的链接) 配置 conda 镜像源(参考:conda安装Tensorflow和pytorch经验) conda config --set show_channel_urls yes conda config --add channels https://mirrors.