Keil芯片包下载及安装教程

(注:此为乐某学习记录,若有出错的地方欢迎各位指出!) 前言 建议安装迅雷,用迅雷来下载会快很多。如果网络好可以无视。 官网:https://www.keil.com/ 官方下载地址:https://www.keil.com/dd2/pack/ 一、迅雷下载教程 1.打开浏览器下载记录 2.右键弹出此窗口,点击复制下载链接 3.打开迅雷,点击新建 4.将下载链接复制进窗口后,点击立即下载 5.可以看到下载速度会比直接在浏览器下载快很多 二、下载教程 点击上方官网地址进入(若点击下载地址,可直接跳转至第五步) 点击Products 点击Arm Cortex-M 点击Public Software Packs 往下滑就可以看到STM32相关的芯片包了。另外还有国产芯片包,例如:华大、中微、GD系列。 三、Keil芯片包的安装 双击打开下载的芯片包 2.点击Next>> 3.正在安装 4.点击Finish,即完成安装 5.打开Keil,即可看到安装好的芯片包

【Anaconda学习】创建环境与切换环境

1. 创建环境 创建一个叫nerf的环境 conda create -n nerf 2. 查看所有环境 conda info --envs 我的显示如下 可以看到,我有两个环境,环境名为base和nerf,后面为相应的环境路径 有*号的环境说明目前是激活的 3. 切换环境 先关闭当前环境 conda deactivate 然后激活另一个环境 conda activate nerf 查看环境得到:

QT中的绘画工具与定时器工具实现简易时钟

作业要求:使用QT中的绘画工具与定时器工具实现简易时钟 #include "widget.h" #include "ui_widget.h" #include <QDebug> Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); } Widget::~Widget() { delete ui; } //重写绘制事件处理函数 void Widget::paintEvent(QPaintEvent *event) { //启动定时器 time = startTimer(1000); QPen pen; QPainter p(this); p.setPen(Qt::black); p.setFont(QFont("黑体",10)); p.setBrush(QColor("pink")); //设置刷子 p.translate(QPoint(width()/2,height()/2)); p.drawEllipse(QPoint(0,0),200,200); for (int i=0;i<360/6;i++) { pen.setWidth(1); p.setPen(pen); if(i%5==0) { pen.setWidth(2); p.setPen(pen); p.drawLine(QPoint(0,-199),QPoint(0,-190)); if(i==0) p.drawText(QPoint(-15,-160),QString::number(12)); else p.drawText(QPoint(-15,-160),QString::number((i/5))); } p.drawLine(QPoint(0,-199),QPoint(0,-190)); p.rotate(6); } QPainter p1(this); //秒针 p1.translate(QPoint(width()/2,height()/2)); pen.setWidth(2); pen.setColor(QColor("red")); p1.setPen(pen); p1.rotate(6*second); p1.drawLine(QPoint(0,-150),QPoint(0,5)); QPainter p2(this); //分针 p2.

基于QT的时钟表盘设计

基于QT设计根据电脑本地时间的时钟,要求具有时针,分针,秒针,而且根据时间产生对应的偏移 头文件 #ifndef WIDGET_H #define WIDGET_H #include <QWidget> #include <QPainter> #include <QPaintEvent> #include <QDebug> #include <QTimerEvent> #include <QTime> #include <QTimer> QT_BEGIN_NAMESPACE namespace Ui { class Widget; } QT_END_NAMESPACE class Widget : public QWidget { Q_OBJECT public: Widget(QWidget *parent = nullptr); ~Widget(); //重写画家虚函数 void paintEvent(QPaintEvent *event) override; private: Ui::Widget *ui; QTimer *time; QTime t; int hour; int minute; int second; }; #endif // WIDGET_H 源文件 #include "widget.h" #include "ui_widget.h" Widget::Widget(QWidget *parent) : QWidget(parent) , ui(new Ui::Widget) { ui->setupUi(this); //初始化实时绘制时钟连接 //初始化时钟与画家 time = new QTimer(this); connect(time,&QTimer::timeout,[&](){update();}); time->start(1000); } Widget::~Widget() { delete ui; } //定义画板 void Widget::paintEvent(QPaintEvent *event) { //准备画笔 QPainter p(this); p.

Java heap space怎么办

首先,要检查Java堆空间的配置,确保它满足程序的需求。如果配置不正确,可以增加Java堆空间的大小,以满足程序的需求。此外,还可以通过检查程序的代码,确定是否有内存泄漏,如果有,可以尝试修复内存泄漏,以解决Java堆空间不足的问题。

java中如何导入同一个包下其他类文件中的方法,举个例子

在 Java 中,可以使用 "import" 关键字导入同一个包下的其他类文件中的方法。 例如:假设在同一个包 "com.example" 下有两个类 "ClassA" 和 "ClassB",那么可以在 "ClassB" 中导入 "ClassA" 中的方法,代码如下: import com.example.ClassA; public class ClassB { ... ClassA a = new ClassA(); a.methodA(); ... } 在这个例子中,我们导入了 "com.example.ClassA" 中的方法,并在 "C

three.js学习笔记(一):THREE.Materail五种基础材质的使用

MeshBasicMaterial(网格基础材质):基础材质,用于给几何体赋予一种简单的颜色,或者显示几何体的线框。MeshDepthMaterial(网格深度材质): 这个材质使用从摄像机到网格的距离来决定如何给网格上色。MeshLambertMaterial(网格 Lambert 材质): 这是一种考虑光照影响的材质,用于创建暗淡的、不光亮的物体。MeshNormalMaterial(网格法向材质):这是一种简单的材质,根据法向向量计算物体表面的颜色。MeshPhongMaterial(网格 Phong 式材质):这是一种考虑光照影响的材质,用于创建光亮的物体。 一、材质的共有属性 three.js提供了一个THREE.Materail 材质的抽象基类,所有其他材质类型都继承了以下属性和方法: 1、基础属性 id(标识符):此材质实例的唯一编号,并在材质创建时赋值。第一个材质的值从 0 开始,每新加一个材质,这个值就增加 1。 uuid(通用唯一识别码):这是生成的唯一 ID,在内部使用。 name(名称):可以通过这个属性赋予材质名称,用于调试的目的。 opacity(不透明度): 定义物体的透明度。与 transparent 属性一起使用。该属性的赋值范围从 0 到 1。 transparent(是否透明):定义此材质是否透明,可以通过opacity属性来控制透明程度。 默认值为false,所以如果需要做透明渲染效果,需要设置transparent设置为true。 如果使用 alpha(透明度)通道的纹理,该属性应该设置为 true。 overdraw(过度描绘):当你使用 THREE.CanvasRender 时,多边形会被渲染得稍微大一点。当使用这个渲染器渲染的物体有间隙时,可以将这个属性设置为 true。 visible(是否可见):定义该材质是否可见。默认为true,如果设置为 false,那么在场景中就看不到该物体。 side(侧面):通过这个属性,可以定义几何体的渲染哪一面。 默认值为 THREE.FrontSide(前面),定义将要渲染材质的前面(外侧)。 设置为 THREE.BackSide(后面),定义将要渲染材质的后面(内侧)。 设置为 THREE.DoubleSide(双侧),定义将要渲染材质的内外两侧。 needsUpdate(是否更新):对于材质的某些修改,需要告诉 Three.js 材质已经改变了。如果该属性设置为 true,Three.js会使用新的材质属性更新它的缓存。 在使用过程中需要注意的有一下三点: (1)opacity和transparent需要一起搭配使用,在transparent为true时,opacity才会起作用,下面举例示范; // 创建材质 let color = new THREE.Color(Math.random(), Math.random(), Math.random()) // 未向材质中添加 transparent 属性 const material = new THREE.MeshBasicMaterial({ color: color, opacity: 0.

各类配置文件格式简介(ini,yaml,conf,xml...)和nb的Viper

目录 配置文件ini介绍语法demo库 json语法demo库 xml介绍语法&demo yamldemo tomlpropertiesHOCONplist(plist 是捆上了手脚的 xml) Viper(22k star)安装why viperSet默认值读取配置文件写入配置文件监控配置文件从io.Reader读取配置覆盖设置注册和使用别名使用环境变量使用Flagsflag接口 远程Key/Value存储支持远程Key/Value存储示例-未加密(etcd)远程Key/Value存储示例-加密(etcd)监控etcd中的更改-未加密从Viper获取值访问嵌套的键提取子树反序列化序列化成字符串单例viper使用多个viper实例使用Viper示例使用结构体变量保存配置信息 配置文件 适合人类编写:ini > toml > yaml > json > xml > plist 可以存储的数据复杂度:xml > yaml > toml ~ json ~ plist > ini ini 介绍 ini文件是一个无固定标准格式的配置文件。它以简单的文字与简单的结构组成,常常使用在Windows操作系统。ini文件的命名来源,是取自英文“初始(Initial)”的首字缩写,正与它的用途——初始化程序相应。 语法 一个ini文件是由多个section(段)组成。每个段中都包含多个option(数据项),以key=vlaue形式存储数据;注释 以 # 或者 ; 开头。 demo # config.ini [user_info] name = zhangsan age = 18 gender = 男 is_admin = true [connect] host = 127.0.0.1 user = db password = 123456 port = 1521 db = zet 库 python使用内置包 configparser对ini文件进行操作,不需要安装依赖包。 json JSON(JavaScript Object Notation)是一种轻量级的数据交换语言,以文字为基础,且易于让人阅读。尽管JSON是Javascript的一个子集,但JSON是独立于语言的文本格式,并且采用了类似于C语言家族的一些习惯。

doris和starrocks的区别

抱歉,我无法为您提供有关 "doris" 和 "starrocks" 的信息,因为我无法确定您所提到的两个术语代表什么意思。可能您想要问的是其他东西?请再次描述您的问题或提供更多的上下文,这样我才能帮助您。

springboot配置处理mybatis带有下划线数据库字段无法映射实体,解决驼峰命名映射问题

1.问题 接口请求后查询发现返回的部分数据为null,都是大小写字段驼峰命名的为空 [{"id":1,"userName":null,"phone":"13126789145","province":"03","userAccount":null,"userPassword":null}] 2.代码文件配置 (1)数据库设计字段为: create table DEMO_USER ( id NUMBER(10) not null, user_name VARCHAR2(100), phone VARCHAR2(30), province VARCHAR2(50), user_account VARCHAR2(50), user_password VARCHAR2(50) ) (2)对应实体: public class DemoUserEntity implements Serializable { private static final long serialVersionUID = 1L; /** * $column.comments */ private Integer id; /** * $column.comments */ private String userName; /** * $column.comments */ private String phone; /** * $column.comments */ private String province; /** * $column.comments */ private String userAccount; /** * $column.

TypeError: Cannot read properties of undefined (reading ‘JsonRpcProvider‘)

原因:ethers版本过高,第六版不支持ethers.providers.JsonRpcProvider()用法 解决方案: 方法1: 将ethers.providers.JsonRpcProvider()改为 ethers.JsonRpcProvider() 方法2: 将package.json中ethers版本号修改为5.4 "dependencies": { "ethers": "5.4" } 删除node_modules文件夹中的ethers文件夹 在终端使用npm install ethers@5.4或 yarn add ethers@5.4重新安装ethers 个人笔记,仅供参考!

SVG基础语法及使用

背景 前端开发过程中经常会接触SVG格式的图像,且相较于其他格式图像,SVG为代码形式。前端开发人员若掌握一些基本的SVG语法,可以在绘制一些页面上的图形时具有更高的效率,更少且可读性更高的代码。 概述 SVG意为可缩放矢量图形SVG使用XML格式定义图像SVG图像在放大或改变尺寸的情况下其图形质量不会有所损失SVG是W3C推荐标准 特征 相比JPEG、GIF等图像格式,尺寸更小,可伸缩性更强可伸缩,不因尺寸影响图形质量文本可选且可搜索可以与JavaScript技术一起运行是纯粹的XML(XML是什么) SVG元素 SVG根元素 <svg></svg> 常用属性 widthheight SVG矩形 <rect/> 常用属性 widthheightfill 矩形的填充颜色style css属性stroke 矩形边框颜色【stroke详情】 (stroke详情)rx ry 矩形圆角 示例 <svg width="500" height="100"> <rect x="10" y="10" width="150" height="50" rx="20" ry="20" fill="orange" stroke="red" /> </svg> SVG圆形 <circle/> 常用属性 cx cy 圆点坐标,若省略则为 (0, 0)r 圆的半径 示例 <svg width="500" height="100"> <circle cx="100" cy="50" r="40" stroke="red" stroke-width="2" fill="orange" /> </svg> SVG椭圆 <ellipse/> 常用属性 rx ry 椭圆的水平半径与垂直半径 示例 <svg width="500" height="100"> <ellipse cx="

macOS中虚拟机桥接模式分配静态ip

1.首先使用dhclient命令,在局域网中分配一个C类地址。 2.获得地址后,输入ifconfig,查看分配的地址。 3.然后编辑vi /etc/sysconfig/network-scripts/ifcfg-en***文件 在该配置文件中编辑,设置ONBOOT=yes,而后添加静态配置地址: IPADDR=192.168.0.117 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DNS1=192.168.1.1 DNS2=192.168.0.1 这里的IPADDR就是dhclient分配的C类地址 NETMASK子网掩码一般为255.255.255.0 网关地址是路由器的地址 然后再写上DNS的地址。这些信息均在macOS系统偏好的网络中能找到。 TYPE=Ethernet BOOTPROTO=dhcp DEFROUTE=yes PEERDNS=yes PEERROUTES=yes IPV4_FAILURE_FATAL=no IPV6INIT=yes IPV6_AUTOCONF=yes IPV6_DEFROUTE=yes IPV6_PEERDNS=yes IPV6_PEERROUTES=yes IPV6_FAILURE_FATAL=no NAME=eno16777736 UUID=828519be-5364-4cec-aefb-145432d241b8 DEVICE=eno16777736 ONBOOT=yes IPADDR=192.168.0.117 NETMASK=255.255.255.0 GATEWAY=192.168.0.1 DNS1=192.168.1.1 DNS2=192.168.0.1 设置完成以后,就剩下最后一步了。输入 systemctl restart network.service 重启网络设置。 通过以上的步骤就能设置Linux虚拟机的ip地址,不随着每次开关机变化啦。 贴一张今天实验的效果图吧~

win10系统下安装Linux系统

win10系统下安装Linux系统 准备工具:一个U盘、UItraISO、Linux系统镜像 下载UItraISO与Linux系统镜像 附上下载链接: 下载Linux系统镜像: https://mirrors.tuna.tsinghua.edu.cn/ 下拉找到最近几年发行的版本: 我这里下载的是Ubuntu 18.04.6 下载UItraISO https://cn.ultraiso.net/uiso9_cn.exe 开始前的准备工作 1.U盘中的内容最好先拷贝,后期制作Linux系统盘的时候会删除u盘中的所有数据; 2.事先查看自己U盘的格式与电脑磁盘格式是否一致,不一致要将u盘格式化为电脑的磁盘格式 右键u盘,单击属性,查看问文件系统,此处我的格式为:FAT32 查看磁盘格式: 右键单击我的电脑,点击管理,进入磁盘管理,查看磁盘格式:此处我的磁盘格式为 NTFS,接下来要将u盘格式化为NTFS,方法比较简单,自行网上查找。 制作Linux系统盘 打开UItraISO,点击文件,点击打开,打开下载的Linux系统镜像文件 点击:启动->写入硬盘映像(硬盘驱动器,选自己的u盘)->格式化->写入,之后会提示写入成功。 分盘 我这里之前有两个盘,分了大概40G给Linux系统,一共是三个盘。 网上有人说不能超过三个盘,否则后期给Linux分盘时会提示出错,这里我也不太清楚,大家多找几篇看看。 分盘自行网上查找方法 基本输入输出系统BIOS的快捷键 我的电脑是联想的ThinkPad,在开机启动时进入BIOS的快捷键是F1,有些电脑是F2,大家记得百度查看自己电脑的快捷键。 1.设置SecureBoot为Disabled 开机时进入BIOS,通过方向键,往右选择Security,再往下选择Security Boot,回车。设置选中SecureBoot并回车,+/-键更改为Disabled,回车选中。 2.StartUp->Boot,将 USB HDD…u盘名 该项通过 + -键调至第一位(目的是开机首选U盘中的系统) 如果在后续安装过程中出错,可在这里将Windows系统调至第一位(Windows Boot Manager),开机直接进入Windows系统。 安装Linux系统 按照开机提示安装Ubuntu,选择语言、键盘布局、安装类型等。 注意安装类型选择其他选项,也就是自己进行磁盘分区。 参考链接: https://yebd1h.smartapps.cn/pages/blog/index?blogId=120213231&_swebfr=1&_swebFromHost=bdlite

记录一些报错

1.random.sample函数 1.1错误提示 TypeError: Population must be a sequence. For dicts or sets, use sorted(d). 1.2 原因分析 是因为我们random.sample里面没有使用list,而是set 1.3 解决方法 用list()包起来即可 list(np.where(ytrue == 0)[0]) 2.数组形状不同,拼接出错 2.1 错误提示 ValueError: setting an array element with a sequence. ValueError: float() argument must be a string or a number, not ‘csr_matrix’ 2.2 原因分析 这里的特征矩阵是稀疏矩阵,输入到模型里的数据没严格转换成 np.arry()形式,要对其进行转换 使用 .toarray() 2.3 解决方法 model.fit(numpy.vstack((labeledX.toarray(), unlabeledX[uidx].toarray())), numpy.hstack((labeledy, unlabeledy_old[uidx]))) 3.XGBClassifier 3.1 错误提示 Starting in XGBoost 1.3.0, the default evaluation metric used with the objective ‘binary:logistic’ was changed from ‘error’ to ‘logloss’.

数据分享|R语言、SPSS基于主成分PCA的中国城镇居民消费结构研究可视化分析

全文链接:http://tecdat.cn/?p=31563 以全国31个省、市、自治区的城镇居民家庭平均每人全年消费性支出的食品、衣着、居住、家庭设备用品及服务、医疗保健、交通与通讯、娱乐教育文化服务、其它商品和服务等 8 个指标数据(查看文末了解数据免费获取方式)为依据, 利用SPSS和R统计软件, 采用主成分分析法对当前城镇居民消费结构进行分析(点击文末“阅读原文”获取完整代码数据)。 相关视频 结果显示: 娱乐教育文化服务、交通通讯、家庭设备用品、居住、食品是影响消费大小变动的主要因素, 而衣着、医疗保健、居住、食品是影响消费结构变动的主要因素; 各省市城镇居民消费大小与其经济发达程度密切相关; 相邻省市消费结构比较相似; 沿海地区与内地消费结构有较大的差别。 第一步:录入或调入数据 第二步:打开“因子分析”对话框。 沿着主菜单的“Analyze→Data Reduction→Factor”的路径(图2)打开因子分析选项框 第三步:选项设置。 首先,在源变量框中选中需要进行分析的变量,点击右边的箭头符号,将需要的变量调入变量(Variables)栏中(图3)。在本例中,全部8个变量都要用上,故全部调入(图4)。因无特殊需要,故不必理会“Value”栏。下面逐项设置 ⒈ 设置Descriptives选项。 单击Descriptives按钮(图4),弹出Descriptives对话框(图5)。 在Statistics栏中选中Univariate descriptives复选项,则输出结果中将会给出原始数据的抽样均值、方差和样本数目(这一栏结果可供检验参考);选中Initial solution复选项,则会给出主成分载荷的公因子方差(这一栏数据分析时有用)。 点击标题查阅往期内容 R语言主成分PCA、因子分析、聚类对地区经济研究分析重庆市经济指标 左右滑动查看更多 01 02 03 04 在Correlation Matrix栏中,选中Coefficients复选项,则会给出原始变量的相关系数矩阵(分析时可参考);选中Determinant复选项,则会给出相关系数矩阵的行列式,如果希望在Excel中对某些计算过程进行了解,可选此项,否则用途不大。其它复选项一般不用,但在特殊情况下可以用到(本例不选)。 设置完成以后,单击Continue按钮完成设置(图5)。 设置Extraction选项。 打开Extraction对话框(图6)。因子提取方法主要有7种,在Method栏中可以看到,系统默认的提取方法是主成分,因此对此栏不作变动,就是认可了主成分分析方法。 在Analyze栏中,选中Correlation matirx复选项,则因子分析基于数据的相关系数矩阵进行分析;如果选中Covariance matrix复选项,则因子分析基于数据的协方差矩阵进行分析。对于主成分分析而言,由于数据标准化了,这两个结果没有分别,因此任选其一即可。 在Display栏中,选中Unrotated factor solution(非旋转因子解)复选项,则在分析结果中给出未经旋转的因子提取结果。对于主成分分析而言,这一项选择与否都一样;对于旋转因子分析,选择此项,可将旋转前后的结果同时给出,以便对比。 选中Scree Plot(“山麓”图),则在分析结果中给出特征根按大小分布的折线图(形如山麓截面,故得名),以便我们直观地判定因子的提取数量是否准确。 主成分计算是利用迭代(Iterations)方法,系统默认的迭代次数是25次。但是,当数据量较大时,25次迭代是不够的,需要改为50次、100次乃至更多。对于本例而言,变量较少,25次迭代足够,故无需改动。 设置Scores设置。 选中Save as variables栏,则分析结果中给出标准化的主成分得分(在数据表的后面)。至于方法复选项,对主成分分析而言 选中Display factor score coefficient matrix,则在分析结果中给出因子得分系数矩阵及其相关矩阵。 选中Display factor score coefficient matrix,则在分析结果中给出因子得分系数矩阵及其相关矩阵。 其它。 对于主成分分析而言,旋转项(Rotation)可以不必设置;对于数据没有缺失的情况下,Option项可以不必理会。 Correlation Matrixa 消费支出食品烟酒衣著居住生活用品及服务交通通信教育文化娱乐医疗保健其他用品及服务Correlation消费支出1.000.873.499.960.838.872.860.715.906食品烟酒.8731.000.262.811.663.755.620.396.751 衣著.499.2621.000.377.646.424.355.606.649 居住.960.811.3771.000.774.761.825.657.861 生活用品及服务.838.663.646.7741.000.685.730.608.804 交通通信.872.755.424.761.6851.000.774.624.727

通过playwright获取某平台直播弹幕

声明: 本文仅供自己学习用,如有侵权请联系本人删除。 近期在学习研究中,发现一个很棒的东西,playwright,通过该库,可以完成各种数据的获取,但是也有优缺点。 先来讲优点: 无需研究各种算法、不用玩逆向等等之类的麻烦操作。 然后讲缺点: 只能做本地化,因为它需要打开浏览器(这点不知道为什么,java端就可以设置无头模式并且可以不用安装浏览器驱动就可以运行,但是py不行,还有待研究) 我们来看看某平台直播弹幕的获取吧 运行环境: python 3.7 playwright 1.29.0 protocbuf 3.19.4 代码,就不上了,该平台反正用的是标准的google的protocbuf进行数据传输的。然后用的gzip进行压缩。拿到数据后gizp解压,然后通过proto解析即可得到数据。实际运行结果如下图:

二维码如何制作?快速制作二维码的教程在这里

二维码如何制作?在我们的日常生活中总是会看到形形色色的二维码图片,在我们的日常生活中少不了需要时时接触二维码,除了系统自动生成二维码之外,其实我们还可以借助一些软件来进行二维码的生成,这里小编就来给大家介绍二维码生成的方式方法。 方法一:草料二维码 打开电脑上的网站,进入到网站的首页,点击选择文本、网址、文件或图片生成二维码,输入相应的内容之后,点击下方的【生成二维码】,我们可以在右侧查看到相应的二维码内容。可以对生成的二维码进行美化编辑,编辑好的二维码可以直接将其保存到本地。 方法二:书单视频助手 打开手机上的软件,进入到软件的首页,点击选择【制作二维码】选项,上传需要进行制作的二维码链接,上传好链接之后,点击进入到下一步,系统就会自动对链接进行识别生成相应的二维码,我们可以根据自己的喜好选择一个好看的二维码进行保存。 方法三:二维码生成助手 打开电脑上的软件,进入到软件的首页,点击选择文本/网址转二维码,选择好之后,输入相应的内容,我们可以点击预览相应的二维码,预览完成之后,点击生成二维码,我们可以在右侧查看到生成的二维码,编辑好之后即可将其保存到本地。 以上就是小编给大家介绍的二维码的制作方法,相信大家看完之后应该对于二维码的制作有所了解了,今天我们的分享就到这里了。

有没有好用的消除笔app?消除笔软件介绍给你

在我们日常的拍摄过程种,可能会遇倒一些行人乱入的现况。尤其是节假日的时候,人头攒动,基本上无法保证画面的症结。这个时候其实你也不用担心,我们直接使用消除笔,消除一些多余的背景即可完成。这里小编就来给大家介绍消除笔的使用办法,大家要仔细学习哦! 方法一:无痕消除笔 第一步 打开电脑上的软件,进入到软件的首页,点击选择【消除笔】选项。 第二步 选择好相应的选项之后,点击上传需要进行处理的图片文件。上传好图片文件之后,点击调整笔刷的代销,点击需要进行消除的位置等待系统进行处理。处理完成之后,直接将图片保存到本地即可。 方法二:书单视频助手 第一步 打开手机上的软件,进入到软件的首页,点击选择精选工具里面的【消除笔】选项。 第二步 选择好相应的选项之后,点击调整笔刷的粗细,并且将其涂抹到需要去除的部位,点击【完成】按钮,等待系统进行处理。处理完成后的图片我们可以直接看到效果。 以上就是小编给大家介绍的好用的消除笔软件了,大家下次拍照的时候背景杂乱就可以使用这个办法来解决哦,今天的分享就到这里啦!

python数学建模导论2.2 常微分方程符号解与数值解的计算(未放入章节为微分方程介绍章节,自行百度)

from sympy import * y = symbols('y', cls=Function) x = symbols('x') eq = Eq(y(x).diff(x,2)+2*y(x).diff(x,1)+y(x),x*x) print(dsolve(eq, y(x))) 结果 from sympy import * y = symbols('y', cls=Function) x = symbols('x') eq = Eq(y(x).diff(x,2)+4*y(x).diff(x,1)+29*y(x), 0) print(dsolve(eq, y(x))) C1=symbols('C1') C2=symbols('C2') f=(C1*sin(5*x) + C2*cos(5*x))*exp(-2*x) #第五行eq的解 print(f.diff(x,1)) #eq的一阶导的形式 ''' (0*C1+1*C2)*1=0 -2*(C1*0+C2*1)*1+(5*C1*1-5*C2*0)*1=15 '''

devServer详解

devServer: { host: '127.0.0.1', port: 5050, open: false, proxy: { '/api': { target: 'http://192.168.1.30:8085/', ws: true, changeOrigin: true, pathRewrite: { '^/api': '/', }, }, }, }, host:指定要使用的 host. vue默认配置为0.0.0.0,代表其他人也能访问,如果改为127.0.0.1之后,项目通过num run serve 运行起来之后其他人是不能访问的,只要自己可以访问. port:端口; open:true :open设置为true代表服务器已经启动后自动打开浏览器; proxy:代理 proxy.api :代表的意思是当我接口的请求为/api开头时才用代理; target:代理地址,这里设置的地址会代替axios中设置的baseURL changeOrigin:如果接口跨域,需要进行这个参数配置 pathRewrite:重写url, //pathRewrite: {'^/api': '/'} 重写之后url为 http://192.168.1.16:8085/xxxx //pathRewrite: {'^/api': '/api'} 重写之后url为 http://192.168.1.16:8085/api/xxxx

axios二次封装

axios二次封装 一、axios 官网 下载 引入使用,如下 axios.get('url?参数1=值&参数2=值'); axios.post('url',{ 参数:值, 参数2:值}); axios{{ url: '请求的路经',// `url` 是用于请求的服务器 URL method: '请求方法', // 默认值get // `method` 是创建请求时使用的方法 params: {} //get请求方法:前端给后端传递的数据 data:{} //post请求方法:前端给后端传递的数据 headers: {}, // 自定义请求头 timeout: 1000, // 默认值是 `0` (永不超时) // 如果请求时间超过 `timeout` 的值,则请求会被中断 //表示浏览器将要响应的数据类型 responseType: 'json', // 默认值 }); 二、axios的二次封装 util->request.js // 1. import axios from "axios"; /* 2 * 第1种根据环境变量区分接口的默认地址 */ const instance = axios.create({ // baseURL: 'http://testapi.xuexiluxian.cn', baseURL: process.env.VUE_APP_TITLE == "

Windows 对文件做MD5值校验

没想到Windows 自带MD5校验工具。 场景:使用MD5校验算法,检测文件的是否损坏或被修改过。 输入cmd,进入命令行界面 输入命令:certutil -hashfile 文件路径 md5 还支持其他的哈希算法: 实例 在D:\Desktop\temp路径下有两个文件。其中test2是由test1复制得到的。 输入命令:certutil -hashfile D:\Desktop\temp\test1.txt md5 内容不同的文件,得到的MD5值也是不一样的。 Linux 下查看文件的 MD5 值 md5sum <filename>

c语言实现u8、u16、u32相互转换

不同数据类型的转换,分大小端模式,下面分享我经常用的转换方式。 1、u8 to u16 u16 DataToUnshort(u8 *pBuffer, u8 uModeFlag) { u16 uShort = 0; uShort = *pBuffer++; if(USING_MODE_BIG == uModeFlag) { /* 大端模式 */ uShort = (uShort << 8) | (*pBuffer); } else { /* 小端模式 */ uShort |= (*pBuffer) << 8; } return uShort; } 2、u16 to u8 void DataToUnchar(u8 *pBuffer, u16 uShort, u8 uModeFlag) { if(USING_MODE_BIG == uModeFlag) { /* 大端模式 */ *pBuffer++ = (uShort >> 8) & 0xFF; *pBuffer = uShort & 0xFF; } else { /* 小端模式 */ *pBuffer = uShort & 0xFF; pBuffer++; *pBuffer = (uShort >> 8) & 0xFF; } } 3、u8 to u32

sudo: command not found 的解决方法

sudo 是 Linux 系统管理指令,是允许系统管理员让普通用户执行一些或者全部的 root 命令的一个工具,如 halt,reboot,su 等等。这样不仅减少了 root 用户的登录和管理时间,同样也提高了安全性。sudo 不是对 shell 的一个代替,它是面向每个命令的。 在 Linux 系统中,使用 sudo 命令时如果提示 “command not found”,我们应该如何解决呢? 首先执行以下命令看一下 /etc/sudoers.d 文件是否存在, find /etc/sudoers.d 1 1、如果返回 No such file or directory,就说明你的系统没有安装sudo,下面是安装命令 : apt-get install sudo 1 如果提示 E: Unable to locate package sudo 的错误,先执行下面的命令: apt-get update 1 再执行 sudo apt-get install 就可以了。 2、如果 /etc/sudoers.d 文件存在则说明系统已经安装了 sudo,只不过没有配置环境。 当你使用 sudo 去执行一个程序时,处于安全的考虑,这个程序将在一个新的、最小化的环境中执行,也就是说,诸如PATH这样的环境变量,在 sudo 命令下已经被重置成默认状态了。所以当一个刚初始化的 PATH 变量中不包含你所要运行的程序所在的目录,用 sudo 去执行,你就会得到 “command not found” 的错误提示。

XXL-JOB适配金仓kingbaseV8R3版本

1、版本信息 xxl-job:2.3.1 金仓kingbase:V8R3 已上传修改之后的版本到github,可以直接下载使用(包含xxl-job kingbase建表语句) bunnyml/xxl-job-kingbase: 基于xxl-job 2.3.1兼容kingbaseV8R3版本 (github.com) 2、需要修改的部分 2.1 xxl-job-admin包下的pom.xml,增加kingbase jar包,jar我已放在了上面github项目中 2.2 修改xxl-job-admin包下的application.properties文件中的数据库链接相关配置 2.3 修改xxl-job-admin包下mybatis-mapper中的所有xml文件,去掉了所有xml文件中的`号,以兼容kingbase,自行全局替换 2.4 修改XxlJobLogMapper.xml文件下的此语句 2.5 修改XxlJobRegistryMapper.xml中的这两个SQL以兼容kingbase语法 3. 其他使用配置请参考官方文档 分布式任务调度平台XXL-JOB (xuxueli.com) 部分修改参考了 Zheng.Zeng的博客(95条消息) XXL-JOB适配人大金仓数据库kingbase_Zheng.Zeng的博客-CSDN博客

win10 在线、离线安装microsoft store 版 WSL

实验环境: 操作系统:22H2 windows版本 10.0.19045.2486(网友说大于19045.2311也可) WSL版本:Microsoft.WSL_1.0.3.0_x64_ARM64.msixbundle 离线安装 获取WSL安装包,方法一: 在此页面获取发布网址: Microsoft Store 中适用于 Linux 的 Windows 子系统的发行说明 获取此页面后下载软件包: 发布 微软/WSL 获取WSL安装包,方法二: 从Microsoft Store搜索wsl,点击“分享”。 点击“复制链接”获取软件页面链接 使用解析网站获取下载链接: 微软商店链接解析下载网站:Online link generator for Microsoft Store. 安装WSL的.msixbundle包 双击软件包会有提示: powershell内以管理员权限执行: Add-AppxPackage WSL软件包绝对路径.msixbundle 在线安装 在Microsoft Store内搜索“WSL”,然后按页面提示安装。 如果因网络打不开microsoft store,可以使用“迅游加速器”之类的软件进行加速,从而连接微软。 迅游加速器:口令兑换,【白嫖迅游加速】可得5天加速时长。需要在迅游加速器内,搜索“microsoft store”,并开启它的加速才生效。 微软商店microsoft store打不开/进不去/登不上解决方法 异常问题 WIndows不适用此打包版本: Microsoft Store(大于19041版本)和官方手册(内部版本 19041 及更高版本)等是不准确的,起码我的19043是不支持打包版wsl的,需要升级到19045版本才能使用打包版。(不得不说是真的坑) 升级方法:设置->更新和安全->点击“立即更新”,会更新很多东西,直到完成“针对windows 10的功能更新,版本22H2”,Win+R输入winver查看系统版本。 相关参考: 手动下载安装微软商城中的软件

Python 中的 %.2f 是什么意思?

在 Python 中,有多种格式化数据类型的方法。 %f 专门用于格式化浮点值(带小数的数字)。 我们可以使用 %f 来指定浮点数向上舍入时要返回的十进制数。 如何在 Python 中使用 %f 在本节中,你将看到一些有关如何使用 %f 以及可用于返回不同结果的各种参数的示例。 这是第一个例子: floatNumber = 1.9876 print("%f" % floatNumber) # 1.987600 在上面的示例中使用 %f 为数字添加了两个零。但这并没有什么特别之处。我们很快就会看到我们还能做些什么来修改结果值。 请注意,%f 必须嵌套在引号内,并且应该通过模运算符(%)与它正在格式化的浮点数分隔:"%f" % floatNumber。 让我们看另一个例子。 floatNumber = 1.9876 print("%.1f" % floatNumber) # 2.0 在上面的代码中,我们在 %f 运算符的 % 和 f 之间添加了 .1,这意味着我们希望将数字四舍五入到小数点后一位。 请注意,如果你省略了我们在 % 和 f 之间传递的数字之前的句点/点符号(.),你将获得与第一个示例中类似的结果。 我们示例中的结果值为 2.0,当 1.9876 四舍五入到小数点后一位时返回。 让我们使用 %.2f 看看会发生什么。 floatNumber = 1.9876 print("%.2f" % floatNumber) # 1.99 正如预期的那样,浮点数(1.9876)被四舍五入到小数点后两位,即 1.

python数学建模导论1.5 整数规划与指派问题的求解

python数学建模导论1.5 整数规划与指派问题的求解 18:25 from scipy.optimize import linear_sum_assignment import numpy as np cost = np.array([[25, 29, 31, 42], [39, 38, 26, 20], [34, 27, 28, 40], [24, 42, 36, 23]]) row_ind, col_ind = linear_sum_assignment(cost) print(row_ind) # 开销矩阵对应的行索引 print(col_ind) # 对应行索引的最优指派的列索引 print(cost[row_ind, col_ind]) # 提取每个行索引的最优指派列索引所在的元素,形成数组print(cost[row ind,col ind].sum())#数组求和 print(cost[row_ind,col_ind].sum) optimize.linear_sum_assignment指派问题函数,详看链接文章: https://blog.csdn.net/qq_51570094/article/details/124020861

计算机网络概念——应用层email协议

1. email的工作方式。 电子邮件中有四个重要的组成部分:邮件服务器(电子邮件体系结构的核心,为其用户提供邮箱服务(管理、维护用户报文的服务),并起到邮件服务器间相互通信的作用)、用户代理(也就是用户在设备上的邮箱应用软件,用于用户使用自己的邮箱)、简单邮件传输协议(SMTP邮件报文发送规范)和邮件访问协议(POP3、IMAP或HTTP,主要是接收方服务器到接收方代理报文发送规范)。 电子邮件一般发送和接收步骤如图:(1)Alice首先打开自己的设备上的用户代理程序,然后编辑电子邮件内容,指定收件人邮箱地址,让她的用户代理发送;(2)Alice的用户代理将邮件内容和邮件收件人等封装成报文,通过SMTP协议发送到Alice的邮件服务器;(3)Alice的邮件服务器将该报文放到报文队列中,通过SMTP协议发送到接收方Bob的邮件邮件服务器中;(4)Bod的邮件服务器将该邮件放进Bob的邮箱中;(5)用户代理通过邮件访问协议操作邮箱中的邮件;(6)接收方查看设备上的用户代理程序,获取或操作邮件信息。 其中SMTP协议的基本流程如图,主要是连接建立、数据传输、连接释放。 其中邮件访问协议有POP3、IMAP和HTTP三种,IMAP与POP3流程(如图(上))类似,但是具有更多的操作功能,HTTP是基于WEB的电子邮件,其流程一般如图(下),图示例为持久非流水线式,非持久的HTTP完成一次HTTP后就会断开,流水线式可以一次多个HTTP request。 2. SMTP POP3 IMAP三者的关系。 (1)从邮件收发来看,SMTP是邮件发送的协议,而POP3和IMAP是邮件接收和处理的程序。(2)从采用的传输层协议来看,三个协议都使用的是TCP。(3)从服务阶段看,三者都有连接建立、数据传输、连接释放的阶段,但是POP3和IMAP有用户验证和邮件操作的阶段。(4)从协议使用的地方看,POP3和IMAP仅使用在接收方的服务器和用户代理之间,而SMTP可以用在整个过程中。 3. POP3 IMAP的不同。 IMAP是POP3的升级版。(1)从会话状态维持来说,POP3是无状态的,而IMAP是有状态的,即IMAP可以在多个用户代理中同时使用并同步操作,而POP3的邮件处理仅能在单个用户代理中,因此有标记已读等需要状态的功能。(2)从报文获取来看,POP3只能完整获取,而IMAP可以选择获取报文特定部分。(3)从功能上看,IMAP有广告、垃圾文件识别的新功能和远程文件夹管理创建等功能。

python数学建模导论1.3非线性规划及其python实现

python数学建模导论1.3非线性规划及其python实现 使用scipy求解 from scipy.optimize import minimize import numpy as np # 目标函数即min(FG1+FG2+FG3) def fun(x): return (4 + 0.3 * x[0] + 0.0007 * x[0] ** 2 + 3 + 0.32 * x[1] + 0.0004 * x[1] ** 2 + 3.5 + 0.3 * x[ 2] + 0.00045 * x[2] **2) def con(): # 约束条件 分为eq 和ineq # eq表示 函数结果等于e; ineg 表示 表达式大于等于0 cons = ({'type':'eq', 'fun':lambda x:x[0]+x[1]+x[2]-700}) # ['type':ineq','fun': lambda x: -x[2] + x2max]#如果有不等式约束 #cons=([con1,con2,con3,con4, con5,con6,con7,con8]) #如果有多个约束,则最后返回结果是这个#x[0] 其中的e 必须是具体数字,不能是t 等参数 #上下限约束 b1=(100,200) b2=(120,250) b3=(150,300) bnds = (b1,b2,b3) #边界约束 if __name__ == '__main__': cons = con() # 约束 # 设置x初始猜测值 x0 = np.

(day11) 自学Java——集合进阶(单列集合)

目录 1.集合体系结构 2.Collection集合 (1)迭代器 (2)增强for (3)lambda表达式 3.List集合 4.数据结构 5.ArrayList集合 6.LinkedList集合 7.泛型深入 8.数据结构(树) (1)二叉树 (2)平衡二叉树旋转机制 (3)红黑树 9.Set系列集合 (1) HashSet (2)LinkedHashSet (3)TreeSet 非原创,为方便后期复习 1.集合体系结构 2.Collection集合 1. List系列集合:添加的元素是有序、可重复、有索引。 (有序:“存”和“取”的顺序一样) 2. Set系列集合:添加的元素是无序、不重复、无索引。 (1)迭代器 (2)增强for (3)lambda表达式 3.List集合 4.数据结构 什么是数据结构? 计算机存储、组织数据的方式。 5.ArrayList集合 6.LinkedList集合 添加“aaa”,在LinkedList里的尾节点是null,所以l=last=null,尾结点last=newNode=0x0011,因为l==null,所以头结点为first=0x0011。 添加“bbb”,l=last=0x0011,尾结点last=newNode=0x0022,不满足l==null,所以l.next=newNode(就是0x0011.next=0x0022) 添加“ccc”,l=last=0x0022,尾结点last=newNode=0x0033,不满足l==null,所以l.next=newNode(就是0x0022.next=0x0033) 迭代器底层原理 7.泛型深入 1.泛型中不能写基本数据类型,因为数据在存入之后会变成Object类型,int无法转Object类型,要写成Integer包装类才可以转Object。 2.存入数据的时候,会检查数据类型,数据进入后会转成Object类型,取出时又强转回一开始的数据类型。 3.指定泛型类型后,可以传入该类类型或者子类类型。比如Animal类型,还可以传cat,dog类型。 4.如果不写泛型,就默认为Object类型。 泛型方法:1.在类名后面定义泛型(所有方法都能用) 2.在方法后面定义泛型(只有本方法能用) 练习:定义一个工具类:ListUtil,类中定义一个静态方法addAll,用来添加多个集合的元素 方式1:public class MyArrayList1 implements List<String>{} 类型可替换 方式2:public class MyArrayList2<E> implements List<E>{} 8.数据结构(树) (1)二叉树 1.普通二叉树,没有规律,只能遍历查找,麻烦。 2.二叉查找树,方便,查找方法,拿数据跟根节点比较,比根节点小/大,就跟左/右子节点比较...... 度<=2就是二叉树 普通二叉树,查找效率低,只能遍历。 二叉查找树,效率提升,但是存储时可能会造成左右子树的高度差很大,查询效率也降低。 平衡二叉树,任意节点子树的高度差不能超过1。 (2)平衡二叉树旋转机制 平衡二叉树缺点:添加节点时,旋转次数太多,导致添加节点时间浪费。

python数学建模导论1.1 线性代数知识的补充-线性规划方程求解方法

python数学建模导论1.1 线性代数知识的补充-线性规划方程求解方法 线性规划模型 线性规划模型 代码-使用numpy: import numpy as np A = np.array([[10,-1,-2],[-1,10,-2],[-1,-1,5]]) # A为系数矩阵 b = np.array([72,83,42]) #馁接b珞案虫常数列 inv_A = np.linalg.inv(A) # A的逆矩阵 x = inv_A.dot(b) # A的逆矩阵与b做点积运算 x = np.linalg.solve(A,b) # 5,6两行也可以用本行替代 print(x) 结果展示: 代码-使用sympy: from sympy import * x, y, z = symbols('x y z') eqs = [Eq(10 * x - y - 2 * z, 72), Eq(-x + 10 * y - 2 * z, 83), Eq(-x - y + 5*z, 42)] print(solve(eqs, [x, y, z])) 结果展示:

springboot 整合 ip2region

Ip2region是什么? ip2region - 准确率99.9%的离线IP地址定位库,0.0x毫秒级查询,ip2region.db数据库只有数MB,提供了java,php,c,python,nodejs,golang,c#等查询绑定和Binary,B树,内存三种查询算法。 ip2region 是Git开源项目:https://github.com/lionsoul2014/ip2region 第一步 将data目录下的ip2region.xdb 文件放到resources 目录下 第二步 引入maven依赖 <dependency> <groupId>org.lionsoul</groupId> <artifactId>ip2region</artifactId> <version>2.6.4</version> </dependency> 第三步 配置类 @Slf4j @Configuration public class Ip2RegionAutoConfiguration { @Bean public Ip2regionSearcher ip2regionSearcher() { InputStream ris = ClassPathResource.class.getClassLoader().getResourceAsStream("ipdb/ip2region.xdb"); // 空引用 Searcher searcher = null; try { // 创建 searcher = Searcher.newWithBuffer(IoUtil.readBytes(ris)); //注意:不能使用文件类型,打成jar包后,会找不到文件 //searcher = Searcher.newWithFileOnly(Objects.requireNonNull(this.getClass().getResource("/ipdb/ip2region.xdb")).getPath()); return new Ip2regionSearcher(searcher); } catch (IOException e) { log.error("解析ip地址失败,无法创建搜索器: {}", e); throw new RuntimeException(e); } } } 服务类

微服务理解、Nacos与Eureka、Feign和Gateway

目录 分布式架构 微服务是一种经过良好架构设计的分布式架构方案 SpringCloud是目前国内使用最广泛的微服务框架 服务拆分原则 Eureka Ribbon负载均衡 Ribbon负载均衡的原理 Ribbon负载均衡策略IRule Ribbon饥饿加载 Nacos注册中心 Nacos同集群优先的负载均衡 权重配置 环境隔离 Nacos与Eureka的区别 Nacos除了可以做注册中心,同样可以做配置管理来使用 配置热更新 配置共享的优先级 Feign远程调用 如何使用 自定义配置 Feign使用优化 最佳实践 Gateway服务网关 网关作用 断言 过滤器工厂 路由过滤器的种类 过滤器的作用是什么? 全局过滤器 过滤器执行顺序 Gateway解决跨域问题 解决跨域问题 分布式架构 根据业务功能对系统做拆分,每个业务功能模块作为独立项目开发,称为一个服务。 分布式架构的优缺点: 优点:1.降低服务耦合2.有利于服务升级和拓展 缺点:服务调用关系错综复杂 微服务是一种经过良好架构设计的分布式架构方案 微服务的架构特征: 单一职责:微服务拆分粒度更小,每一个服务都对应唯一的业务能力,做到单一职责 自治:团队独立、技术独立、数据独立,独立部署和交付 面向服务:服务提供统一标准的接口,与语言和技术无关 隔离性强:服务调用做好隔离、容错、降级,避免出现级联问题 微服务的上述特性其实是在给分布式架构制定一个标准 SpringCloud是目前国内使用最广泛的微服务框架 集成了各种优秀微服务功能组件 服务拆分原则 不同微服务,不要重复开发相同业务 微服务数据独立,不要访问其它微服务的数据库 微服务可以将自己的业务暴露为接口,供其它微服务调用 Eureka 1.搭建注册中心 2.服务注册,把服务注册eureka 3.服务发现,通过负载均衡挑选一个服务,实现远程调用 Ribbon负载均衡 SpringCloud底层其实是利用了一个名为Ribbon的组件,来实现负载均衡功能的 为什么我们只输入了service名称就可以访问了呢?之前还要获取ip和端口。 显然有人帮我们根据service名称,获取到了服务实例的ip和端口。它就是LoadBalancerInterceptor,这个类会在对RestTemplate的请求进行拦截,然后从Eureka根据服务id获取服务列表,随后利用负载均衡算法得到真实的服务地址信息,替换服务id Ribbon负载均衡的原理 SpringCloudRibbon的底层采用了一个拦截器,拦截了RestTemplate发出的请求,对地址做了修改。用一幅图来总结一下: 基本流程如下: 拦截我们的RestTemplate请求http://userservice/user/1 RibbonLoadBalancerClient会从请求url中获取服务名称,也就是user-service DynamicServerListLoadBalancer根据user-service到eureka拉取服务列表 eureka返回列表,localhost:8081、localhost:8082 IRule利用内置负载均衡规则,从列表中选择一个,例如localhost:8081 RibbonLoadBalancerClient修改请求地址,用localhost:8081替代userservice,得到http://localhost:8081/user/1,发起真实请求 Ribbon负载均衡策略IRule 默认的实现就是ZoneAvoidanceRule,是一种轮询方案

对称加密和非对称加密、公钥和私钥、单向认证和双向认证、数字签名、数字证书、根证书

文章目录 1. 什么是公钥和私钥?2. 加密算法2.1 对称加密2.2 非对称加密2.2.1 非对称加密的重要性质2.2.2 非对称加密算法应用2.2.2.1 应用1 加密通信2.2.2.1.1 单向认证和双向认证 2.2.2.1 应用2 数字签名 3. 数字签名3.1 数字签名用法演示3.1.1 最简单用法(校验数据的完整性)2.1.2 复杂用法(校验数据的完整性) 3.2 数字签名存在问题 4. 数字证书(Digital Certificate)4.1 创建数字证书4.1.1 举例,CA如何给我们签发一个有效证书和服务器如何发送证书: 4.2 数字证书究竟解决了什么问题4.2.1 如何攻击数字证书呢 参考: 1. 什么是公钥和私钥? 摘自《什么是公钥和私钥?》 公钥(Public Key)与私钥(Private Key)是通过加密算法得到的一个密钥对(即一个公钥和一个私钥,也就是非对称加密方式)。 公钥可对会话进行加密、验证数字签名,只有使用对应的私钥才能解密会话数据,从而保证数据传输的安全性。公钥是密钥对外公开的部分,私钥则是非公开的部分,由用户(一般是服务端)自行保管。 公钥和私钥起初均存储在服务器端。 私钥是非公开的,因此仅存放在服务端,而且要避免被窃取,比如存在某网站A的服务器端;公钥是大家都可以获取的,一般是用在客户端,客户端的公钥是从哪来的呢?需要从服务器端获得,比如浏览器就是 一个客户端,当访问网站的时候,需要通过握手协议从网站侧获取 通过加密算法得到的密钥对可以保证在世界范围内是唯一的。使用密钥对的时候,如果用其中一个密钥加密一段数据,只能使用密钥对中的另一个密钥才能解密数据。例如:用公钥加密的数据必须用对应的私钥才能解密;如果用私钥进行加密也必须使用对应的公钥才能解密,否则将无法成功解密。 2. 加密算法 摘自:《什么是非对称加密?》 密码学中有两种技术:一种叫对称加密,另外一种叫非对称加密。 这次咱们主要聊聊非对称加密,因为公钥和私钥就是非对称加密的成果,但是为了更好的理解非对称加密,我们也会简单介绍对称加密 2.1 对称加密 采用单钥密码系统的加密方法,同一个密钥可以同时用作信息的加密和解密,这种加密方法称为对称加密,也称为单密钥加密。 在对称加密算法中常用的算法有:DES、3DES、TDEA、Blowfish、RC2、RC4、RC5、IDEA、SKIPJACK等。 基本逻辑是这样。如果 Alice 想把一个信息传递给 Bob 。比如信息是一个数字 m ,Alice 不能把这个数字直接传递给 Bob ,因为互联网是一个不安全的环境,很容易被窃听。所以她可以通过一个加密算法,比如,通过给 m 加上一个数字 e ,得到一个数字 c ,这个 c 就叫做密文。这样 Bob 拿到密文 c ,再减去 e 就可以得到信息 m 了。

Matlab绘图(第四节-三维曲线)

三维图形相比二维图形具有更强的数据表现能力,三位曲线是三维图形的基本形式。 1.plot3函数 (1) 基本用法为plot3(x,y,z) 其中,参数x,y,z组成一组曲线的坐标。通常x,y,z为长度相同的向量。 例1:绘制一条空间折线 x=[0.2 1.8 2.5]; y=[1.3 2.8 1.1]; z=[0.4 1.2 1.6]; plot3(x,y,z) grid on%显示网格线 axis([0,3,1,3,0,2])%x轴范围为0~3,y为1~3,z为0~2 例2:绘制螺旋线 t=linspace(0,10*pi,200);%从0到10派等间距取200个点 x=sin(t)+t.*cos(t); y=cos(t)-t.*sin(t); z=t; plot3(x,y,z) (2) plot3(x,y,z) 当x,y,z为同型矩阵时。则以x,y,z所对应列元素绘制曲线。曲线条数等于矩阵列数。 当x,y,z中有向量也有矩阵时,向量的的长度应与矩阵相符。 例3:在空间不同位置绘制5条正弦曲线。 %方法一 t=0:0.01:2*pi;%生成行向量t,t的值为0~2*pi间距为0.01的点 t=t';%将行向量转化成列向量 x=[t,t,t,t,t]; y=[sin(t),sin(t)+1,sin(t)+2,sin(t)+3,sin(t)+4]; z=[t,t,t,t,t];%xyz是五列与t等长的列向量构成的矩阵 plot3(x,y,z) %方法二 t=0:0.01:2*pi; x=t; y=[sin(t),sin(t)+1,sin(t)+2,sin(t)+3,sin(t)+4]; z=t; plot3(x,y,z) (3) 含多组输入参数的plot3函数 plot3(x1,y1,z1,x2,y2,z2,...) 每一组x,y,z向量构成一组数据点的坐标,绘制一条曲线。 例4:绘制三条不同长度的正弦曲线。 t1=0:0.01:1.5*pi;%蓝色曲线 t2=0:0.01:1.5*pi;%棕色曲线 t3=0:0.01:1.5*pi;%黄色曲线 plot3(t1,sin(t1),t1,t2,sin(t2)+1,t2,t3,sin(t3)+2,t3) (4) 含选项的plot3函数。 plot3(x,y,z,选项) 选项用于指定曲线的线型,颜色和数据点标记。 例5:绘制空间曲线 t=0:pi/50:6*pi;%0到6*pi每隔pi/50取点 x=cos(t); y=sin(t); z=2*t; plot3(x,y,z,'p')%p代表各点形状为五角星 xlabel('X'),ylabel('Y'),zlabel('Z');%坐标轴添加标签 grid on%画网格线 2.fplot3函数 条件:当函数曲线由参数方程定义,且参数方程中只有一个自变量。 fplot3(funx,funy,funz,tlims) 其中,funx、funy、funz代表定义曲线x、y、z坐标的函数,通常采用函数句柄的形式。tlims为参数函数自变量的取值范围,用二元向量[tmin,tmax]描述,默认为[-5,5]。

el-upload上传图片与接收数据后图片的回显

<template> <div> <el-card> <el-form :model="ruleForm" :rules="rules" ref="ruleForm" label-width="100px" class="demo-ruleForm" @submit.native.prevent> <el-row :gutter="24"> <el-col :span="24"> <el-form-item label="受伤部位图片"> <el-upload :action="uploadUrl" :limit="5" list-type="picture-card" :file-list="fileList" :on-success="handleHeadSuccess" :before-upload="beforeFileUpload" :disabled="type==='查看检伤'" :on-remove="handleRemove" ref="headUpload" :on-preview="handlePictureCardPreview"> <i class="el-icon-plus"></i> </el-upload> <el-dialog :visible.sync="dialogVisibleimg" :append-to-body="true"> <img width="100%" :src="dialogImageUrl" alt=""> </el-dialog> </el-form-item> </el-col> </el-row> </el-form> </el-card> </div> </template> <script> export default { name: "prescription", data() { reurn{ uploadUrl: window.SITE_CONFIG['fileUploadURL'] + '/singleUpload', fileList: [], } }, method:{ setForm(form) { this.ruleForm = { ...form } this.

C#生成字符文字图标的代码

void SetIconX() { //by 2022/12/18 ChatGPT // 创建一个绘图对象 Graphics g = Graphics.FromHwnd(IntPtr.Zero); // 设置字体 Font font = new Font("Arial", 14, FontStyle.Regular); // 绘制文字 string text = "I'mAPPICON".Length>2?"I'mAPPICON".Substring(0,2):"I'mAPPICON"; SizeF size = g.MeasureString(text, font); // 创建图像 Bitmap bmp = new Bitmap((int)size.Width, (int)size.Height); // 创建绘图对象 Graphics g2 = Graphics.FromImage(bmp); // 使用 DrawString 方法将文字绘制到图像上 g2.DrawString(text, font, Brushes.Black, new PointF(0, 0)); // 创建图标 Icon icon = Icon.FromHandle(bmp.GetHicon()); // 使用 SetIcon 方法更改图标 this.Icon = (icon); }

CSS里面的transform 属性

transform 属性是 CSS 中一个用于转换元素形状、大小和位置的属性。它允许开发人员对元素进行以下转换: 平移 (translation)缩放 (scale)旋转 (rotation)拉伸 (skew)矩阵变换 (matrix) 例如,可以使用以下代码在水平方向上平移元素 100 像素: transform: translateX(100px); 使用 transform 属性可以创建很多有趣和令人印象深刻的效果,并且不会改变元素的布局和尺寸。 transform 属性的语法如下: transform: none|transform-functions|initial|inherit; 其中: none:没有任何转换效果。transform-functions:一个或多个转换函数,如 translate()、rotate()、scale() 等。initial:设置为初始值。inherit:从父元素继承该属性。 转换函数可以通过组合来实现复杂的转换效果,并且可以在动画中使用,以创建动态和交互式效果。 总的来说,transform 属性是 CSS 中一个非常强大且灵活的属性,能够在不改变元素的布局和尺寸的情况下,改变元素的形状、大小和位置。 需要注意的是,不同的浏览器对 transform 属性的支持可能略有不同。例如,早期版本的 Internet Explorer 不支持 transform 属性。因此,开发人员应该使用特定的前缀 (如 -webkit-、-moz-、-ms- 等) 来确保在所有浏览器中都能得到一致的效果。 另外,还有一个与 transform 相关的属性:transform-origin,它允许开发人员指定一个转换的基点。例如,可以使用以下代码将转换的基点改为元素的顶部中心: transform-origin: top center; 通过指定 transform-origin,可以更精确地控制转换的效果,从而创建更有趣和令人印象深刻的效果。 此外,在使用 transform 属性时,还有一个需要注意的事项:转换是相对于元素的初始位置的。也就是说,如果元素原来位于屏幕的左上角,则通过设置 transform: translate(100px, 100px) 将该元素移动到屏幕的右下角。 此外,对于需要保留动画效果的元素,还需要注意以下几点: 避免在动画过程中修改元素的布局(例如通过改变元素的大小或位置),因为这会导致动画的问题。使用流畅的动画曲线(例如 ease-in-out),以使动画更平滑。避免在动画过程中使用极限值(例如缩放到很大或很小的值),因为这可能导致性能问题。 通过了解这些要点,可以创建具有高性能、高可用性和高交互性的动画效果。

Visual Studio Code 中自定义vue模板文件的通用内容

打开文件后,复制下方内容保存即可,待保存完毕后,在vue文件中输入vue即可生成配置的通用模板 { "vue template": { "prefix": "vue", "body": [ "<template>", " <section class=\"wrap\"></section>", "</template>", "", "<script>", "export default {", " name: \"\",", " components: {},", " props: {},", " data() {", " return {};", " },", " computed: {},", " watch: {},", " created() {},", " mounted() {},", " beforeDestroy() {},", " methods: {},", "};", "</script>", "", "<style lang=\"scss\" scoped>", "@mixin boxSize($$h: 100%, $$w: 100%) {", " width: $$w;", "

小知识点:Airflow 安装部署

安装流程 一、Python 安装二、Airflow 安装三、Airflow 配置四、存在的坑 部分安装方法参考: Linux 虚拟机:大数据集群基础环境搭建(Hadoop、Spark、Flink、Hive、Zookeeper、Kafka、Nginx) 一、Python 安装 当前安装版本为 Python-3.9,使用源码包安装 下载源码包或者 wget 下载 wget https://www.python.org/ftp/python/3.9.6/Python-3.9.6.tgz 解压到指定目录 tar -zxvf Python-3.9.6.tgz 依赖环境安装 sudo yum -y install vim unzip net-tools && sudo yum -y install wget && sudo yum -y install bzip2 && sudo yum -y install zlib-devel bzip2-devel openssl-devel ncurses-devel sqlite-devel readline-devel tk-devel gdbm-devel db4-devel libpcap-devel xz-devel && sudo yum -y install libglvnd-glx && sudo yum -y install gcc gcc-c++ 预配置 cd Python-3.

Spring Security 0auth2 认证服务器和资源服务器实现

一,OAuth2开放授权协议/标准 OAuth(开放授权)是⼀个开放协议/标准,允许⽤户授权第三⽅应⽤访问他们存储在另外的服务提供者 上的信息,⽽不需要将⽤户名和密码提供给第三⽅应⽤或分享他们数据的所有内容。 允许⽤户授权第三⽅应⽤访问他们存储在另外的服务提供者上的信息,⽽不需要将⽤户名和密码提供给 第三⽅应⽤或分享他们数据的所有内容 client_id :客户端id(QQ最终相当于⼀个认证授权服务器,木瓜餐饮就相当于⼀个客户端了,所以会 给 ⼀个客户端id),相当于账号 secret:相当于密码 资源所有者(Resource Owner):可以理解为⽤户⾃⼰ 客户端(Client):我们想登陆的⽹站或应⽤,⽐如淘宝 认证服务器(Authorization Server):可以理解为微信或者QQ 资源服务器(Resource Server):可以理解为微信或者QQ 二、什么情况下需要使用OAuth2 第三⽅授权登录的场景:⽐如,我们经常登录⼀些⽹站或者应⽤的时候,可以选择使⽤第三⽅授权登录 的⽅式,⽐如:微信授权登录、QQ授权登录、微博授权登录等,这是典型的 OAuth2 使⽤场景。 单点登录的场景:如果项⽬中有很多微服务或者公司内部有很多服务,可以专⻔做⼀个认证中⼼(充当 认证平台⻆⾊),所有的服务都要到这个认证中⼼做认证,只做⼀次登录,就可以在多个授权范围内的 服务中⾃由串⾏。 OAuth2的颁发Token授权⽅式 1)授权码(authorization-code)2)密码式(password)提供⽤户名+密码换取token令牌 3)隐藏式(implicit) 4)客户端凭证(client credentials) 授权码模式使⽤到了回调地址,是最复杂的授权⽅式,微博、微信、QQ等第三⽅登录就是这种模式。我 们说接⼝对接中常使⽤的password密码模式(提供⽤户名+密码换取token)。 三、Spring Cloud OAuth2 + JWT 实现 Spring Cloud OAuth2 是 Spring Cloud 体系对OAuth2协议的实现,可以⽤来做多个微服务的统⼀认证 (验证身份合法性)授权(验证权限)。通过向OAuth2服务(统⼀认证授权服务)发送某个类型的 grant_type进⾏集中认证和授权,从⽽获得access_token(访问令牌),⽽这个token是受其他微服务 信任的。 注意:使⽤OAuth2解决问题的本质是,引⼊了⼀个认证授权层,认证授权层连接了资源的拥有者,在 授权层⾥⾯,资源的拥有者可以给第三⽅应⽤授权去访问我们的某些受保护资源 1,授权服务器 1,pom 导入 <!--导入spring cloud oauth2依赖--> <dependency> <groupId>org.springframework.cloud</groupId> <artifactId>spring-cloud-starter-oauth2</artifactId> <version>2.1.0.RELEASE</version> <exclusions> <exclusion> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> </exclusion> </exclusions> </dependency> <dependency> <groupId>org.springframework.security.oauth.boot</groupId> <artifactId>spring-security-oauth2-autoconfigure</artifactId> <version>2.

cmd有效,vscode无效——node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。 请检查名称的拼写,如果包括路径,请确保路径正确,然后再试一次。

分为两种情况,第一种是在cmd中能够查看版本而vscode中不行,第二种是在cmd中也无法查看。 第一步:在cmd中测试 1.在搜索中输入“cmd”,打开命令提示符 2.输入下面代码,回车 node -v npm -v 3.如果能如图显示版本号,说明安装没问题,符合第一种情况。如果这里也报错,则符合第二种情况 第二步:解决方法 情况1:cmd有效,vscode无效 将vscode以管理员方式打开即可 右键vscode图标–>属性 -->兼容性 -->将“以管理员身份运行程序”选中。 设置完重新进入vscode,再次尝试即可。 情况2:cmd无效 有很多博主写过解决方案,这里附上链接供参考 node : 无法将“node”项识别为 cmdlet、函数、脚本文件或可运行程序的名称。请检查名称的拼写,如果包括路径,请确保路径正 确,然后再试一次 的解决方案 个人笔记,仅供参考!

带你了解docker是什么----基础原理篇(一)

docker 容器是如何工作的?docker的架构docker 镜像常用命令base 镜像 镜像的分层结构 构建镜像dockerfile镜像的缓存特性dockerfile 构建镜像过程dockerfile 常用指令 RUN 、CMD和ENTRYPOINTshell 和Excel 格式 分发镜像 容器是如何工作的? docker的架构 docker的核心组件如下: docker的客户端:client。我们最常用的客户端就是docker命令。docker服务器:docker daemon ,一Linux后台服务的方式运行。运行在docker host 上,负责创建、运行、监控容器,构建、存储镜像。默认下,智能响应本地host的客户端的请求。docker镜像:imageregistrydocker容器:container 组件之间的联系如下图 docker采用的是client/server的架构。客户端向服务器发送请求,服务器负责构建、运行和分发容器。 客户端和服务器可以运行在同一个host上。(我们电脑中一般使用的就是这种情况),当然客户端也可以通过socket与远程的服务器通信。 docker 镜像 常用命令 docker images :查看镜像的信息docker run -it dockerID :运行指定ID的docker 镜像build :从 dockerfile 构建镜像tag:给镜像打tagpull : 从registry下载镜像push:将镜像上传到registryrmi:删除docker host 中的镜像search : 搜索docker hub 中的镜像images:显示镜像列表history:显示镜像构建历史commit :从容器创建新镜像 base 镜像 base镜像含义为:(1)不依赖其他镜像,从scratch构建;(2)其他镜像可以在该镜像基础上进行扩展。 通常情况下,能称为base镜像的是各种Linux发行版的docker镜像,如Ubuntu、centOS等 一般基础镜像会与我们实际的大小有所出入。比如一个centOS才200MB左右,当时平时我们按照一个centOS至少都有几个G。原因如下: Linux操作系统大致是由内核空间和用户空间组成。如下图,内核指的是一个提供设备驱动、文件系统、进程管理、网络通信等功能的系统软件,但一个内核并不是一套完整的操作系统,它只是操作系统的核心。一些组织或厂商将Linux内核与各种软件和文档包装起来,并提供系统安装界面和系统配置、设定与管理工具,就构成了Linux的发行版本。内核空间是kernel,Linux刚启动时会加载bootfs文件系统,之后bootfs会被卸载掉。用户空间的文件系统是rootfs,包含我们熟悉的 /dev 、 /proc、/bin等目录。如下图对于base镜像来说,底层直接使用host的kernel,自己只需要提供rootfs就可以了。(所以这也就解释了按照docker的时候,对于Windows操作系统需要安装一下一个Linux的一个发行版)。而对于一个精简的OS,rootfs可以很小,只需要包括最基本的命令、工具和程序就可以了。不同Linux发行版的区别主要就是rootfs,因此docker可以同时支持多种Linux镜像。同时,这也从侧面反映了主流的Linux发行版的内核是兼容的。什么说呢?比如我们在docker中有多个不同发行版的Linux,但是host中只有Ubuntu 的一个内核,那么其实,这些在docker中的Linux镜像使用的都是这个host中的内核。 镜像的分层结构 docker支持通过扩展现有镜像,创建新的镜像。 下图为一个具体的例子: 首先,这么做的一个好处就是共享资源。 比如,有多个镜像都从相同的base镜像构建而来的,那么docker host 只需要在磁盘上保存一份base镜像;同时内存中也需要加载一份base镜像就可以为所有容器服务了。而且,镜像的每一层都可以被共享。多个容器共享一份基础镜像,那么在修改的时候就需要进行一些技巧:在docker中使用的就是创建一个容器层。 所有对容器的改动,无论添加、删除,还是修改文件都只会发生在容器层中。只有容器层是可写的,容器层下面的所有镜像都是只读的。 构建镜像 对于Docker用户来说,最好的情况是不需要自己创建镜像。几乎所有常用的数据库、中间件、应用软件等都有现成的Docker官方镜像或其他人和组织创建的镜像,我们只需要稍作配置就可以直接使用。 当然,有的情况下我们还是需要自己来创建镜像的。docker提供了两种创建镜像的方法:①docker commit 命令(命令行方式);②使用dockerfile 构建文件。一般使用的是后者,因此,这篇介绍的是后者。

jQuery库的基本使用

目录 一:由来 二:下载 三:使用 1.引入:使用jQuery首先要引入脚本 2.元素选取:$("css选择器") 3.改变选取元素的样式:$('css选择器').css('属性', '属性值') 3.class类名的改变: 4.事件绑定 5.元素的显示与隐藏: 6.滑动效果的显示与隐藏 7.$()的重载 8.链式语法 9.动画animate() 10.读写标签属性 11. 封装的Ajax 12.事件委托 : on() 13.加载页面:$('css选择器').load('路径') 14.生成标签内容 一:由来 原生的document操作,由于其API过于复杂,书写比较繁琐,例如获取上一个兄弟元素: previousElementSibling,太长了!所以出现了jQuery库简化dom操作。 2006年出品了一个库 ---- jQuery :理念write less do more,在当时是非常好用的一个库。年代久远逐渐被替代。 二:下载 官方网站:https://jquery.com/ 下载:现在是2023-02-04 更新到了3.6.3版本 有两个版本 1. 开发板:有美化和注释,能够帮助学习人员更好的理解代码,体积大 2.产品版: 没有美化不利于阅读,体积小加载快 三:使用 1.引入:使用jQuery首先要引入脚本 2.元素选取:$("css选择器") 1. 该元素的下一个弟弟元素: next() 2. 该元素的上一个哥哥元素: prev() 3. 该元素的其他兄和弟元素: siblings() 不包括本身 4. 该元素在兄弟元素中的下标:index() 5.通过下标选取元素: eq() 6.该元素的父元素:parent() <body> <div class="parent"> <div class="son1"></div> <div class="son2"></div> <div class="son3"></div> </div> </body> <script src="