详见B站视频【1.安装numpy、scipy、matplotlib-哔哩哔哩】 https://b23.tv/WRDdM91
3:25~5:20
目录
1. 树形结构可视化
2. 树形结构转为链表
此目标是要还原树形结构的所有路径。树形结构是一种常见的数据结构,它表示元素之间层次关系。在树形结构中,每个节点可能拥有一个或多个子节点,形成了一个分层的结构。为了还原树形结构的路径,我们需要找到从根节点到每个叶节点的所有可能路径。这可以通过深度优先搜索或广度优先搜索来实现。通过遍历树形结构,我们可以收集所有路径,从而完整地还原出整个树形结构。这些路径可以用于各种应用,例如路径规划、图形可视化等。因此,还原树形结构的所有路径是一项重要任务。
1. 树形结构可视化 import networkx as nx # pip install networkx import matplotlib.pyplot as plt # 构造树结构 tree = nx.Graph() # 单条边添加 # tree.add_edge('1', '2') # tree.add_edge('1', '3') # tree.add_edge('2', '4') # tree.add_edge('3', '5') # tree.add_edge('5', '6') # tree.add_edge('5', '7') # 批量边添加 lst = [(1, 2), (2, 3), (3, 4), (3, 5), (3, 6), (4, 7), (5, 8), (6, 9), (7, 10), (8, 11), (9, 12), (10, 13), (11, 13), (12, 13), (13, 14)] tree.
一、数据倾斜产生原因 数据倾斜就是部分task承担了过多的计算任务,导致整个stage都被卡。
可能产生数据倾斜的场景如下
操作场景join其中一个表比较小,但key值少join大表与大表,但key值中存在过多的特殊值,如0或nulljoinon条件包含key值过滤逻辑,导致部分数据被保留,部分被过滤,最终节点分布不均join多对多关系表join导致数据膨胀group by某个组合数量特别多count distinct需要集中最后一个reduce节点处理,特殊值多就会慢使用脚本或udf会存在强制数据分布在少量节点的可能distriute by存在值不均匀的可能读取上游文件数过少,单个文件过大 二、数据倾斜优化 2.1 调参优化 参数作用备注hive.map.aggr=truemap端部分聚合仅适用于hive引擎,不适用于spark。spark本身就支持map端的局部聚合hive.groupby.skewindata=true参数设置为true时,生成的查询计划会有2个MR job。第一个MR中,map的输出结果会随机分配到reduce中,每个reduce做部分聚合操作,并输出结果,这样相同的key会被分发到不同的reduce中,起到了负载均衡的目的,第二个MR再根据第一个MR预处理的结果,完成聚合操作仅适用于hive引擎,spark不支持此参数 2.2 代码优化 2.2.1 join类操作 如果是join操作,那么采用join key分布最均匀的表作为驱动表where类的操作在join前进行 2.2.1.1 小表join大表 使用 /*+mapjoin(a)*/ 让小的维度表先进内存,在map端完成reduce
使用此操作需要对小的维度表配置DQC数据量监控,以避免进入内存的维表数据过大
2.2.1.2 中表join大表 在维表大小中等,完全进入内存可能报错;但日志与维表关联部分出现某种行为的维值较少时,可以采用两次 mapjoin 的方式优化倾斜问题。例,有交易日志log,和维表dim,它们2次join示例如下
select /*+mapjoin(b)*/ a.*, b.* from log a left join ( select /*+mapjoin(d)*/ c.* from dim AS c join ( select dim_id from log group by dim_id ) AS d on c.dim_id = d.dim_id ) AS b on a.dim_id = b.dim_id 2.
开启 XXX proxy 软件后,mac 总是会提示 项目后台已添加,贼烦人,参考https://gitee.com/TonyLiu2ca/mac-scripts/ 修改配置文件
https://gitee.com/TonyLiu2ca/mac-scripts/ 采用的是横幅通知 以及通知中心通知
修改后的 仅在 通知中心通知
https://download.csdn.net/download/qq_33547169/88492858 仅在通知中心通知
什么是0day漏洞? 0day漏洞,是指已经被发现,但是还未被公开,同时官方还没有相关补丁的漏洞;通俗的讲,就是除了黑客,没人知道他的存在,其往往具有很大的突发性、破坏性、致命性。
0day漏洞之所以称为0day,正是因为其补丁永远晚于攻击。所以攻击者利用0day漏洞攻击的成功率极高,往往可以达到目的并全身而退,而防守方却一无所知,只有在漏洞公布之后,才后知后觉,却为时已晚。
“后知后觉、反应迟钝”就是当前安全防护面对0day攻击的真实写照!
为了方便大家理解,国科云为大家梳理当前安全防护模式下,一个漏洞从发现到解决的三个时间节点:
T0:此时漏洞即0day漏洞,是已经被发现,还未被公开,官方还没有相关补丁的漏洞,攻击者此时攻击如入无人之境,攻击效果最佳,持续时间几个月不等;
T1:此时漏洞即1day漏洞,漏洞信息已经被披露,某些勤快的系统管理员已经关注并使用了临时修补手段,但大部分受影响系统因官方补丁的缺失导致其脆弱性依然广泛存在,攻击者此时攻击有效性仍较高。
T2:此时漏洞即Nday漏洞,由于官方补丁已出,此时攻击者利用该漏洞进行攻击,有效性已降低。
从T0到T2,这个过程 ,往往需要几天,几个月不等!
在攻击中,黑客们往往目的明确,有的放矢,采用“社工+常规攻击+0day漏洞”或多种0day漏洞的组合式攻击,偷偷的来,偷偷的伤害,看不见的才是最可怕的,0day攻击正是如此。
被动防御,面对0day攻击,除了躺平,别无他法。而更加不幸的是,0day攻击时代,已经到来了。
国家信息安全漏洞平台显示,仅2020年上半年,0day漏洞的收录数量就达到了4582个,占比全部收录漏洞的41.4%,同步大幅增长了80.7%。
0day成为了黑客和安全防护博弈的重中之重。一方面黑市中通用的、可造成大范围影响的0day漏洞售价几万美元至几百万美元不等,令诸多黑客们对0day漏洞趋之若鹜;而另一方面,企业安全人员谈0day色变,面对0day漏洞攻击往往是束手无策,有的企业甚至采用了关机、拔网线、停业务等极端方式。
防而不护,就像纸老虎,敷衍自己罢了!
无延迟的防0day,成为了当前与未来安全防护的核心所在。
如何预防0day攻击? 预防:良好的预防安全实践是必不可少的。这些实践包括谨慎地安装和遵守适应业务与应用需要的防火墙政策,随时升级防病毒软件,阻止潜在有害的文件附件,随时修补所有系统抵御已知漏洞。漏洞扫描是评估预防规程有效性的好办法。
实时保护:部署提供全面保护的入侵防护系统(IPS)。在考虑IPS时,寻找以下功能:网络级保护、应用完整性检查、应用协议“征求意见”(RFC)确认、内容确认和取证能力。
计划的事件响应:即使在采用以上措施后,企业仍可能受到“零日漏洞”影响。周密计划的事件响应措施以及包括关键任务活动优先次序在内的定义的规则和规程,对于将企业损失减少到最小程度至关重要。
防止传播:这可以通过将连接唯一限制在满足企业需要所必须的机器上。这样做可以在发生初次感染后,减少利用漏洞的攻击所传播的范围。
近些年,0day攻击正在变得越来越频繁,虽然目前不能完全防范0day攻击,但是企业通过建设完善的检测防护体系,同时提升人员防范意识,可以减少网络系统被0day攻击的几率,降低0day攻击给自身企业造成的损失。
相关推荐:
*主流域名解析库曝重大DNS投毒漏洞,如何有效应对DNS投毒?
什么是WAF?WAF有哪些功能和优势?
2022上半年网络攻击事件播报
Apache Log4j2 远程代码执行漏洞被公开
新发现DNS安全漏洞影响巨大,政企如何做好DNS安全防护?*
一.配置git
1.下载git(Git),但推荐使用国内镜像下载(CNPM Binaries Mirror)
选好64和版本号下载,全部点下一步
下载完成后打开终端,输入
git --version
出现版本号则说明安装成功 然后继续在终端内操作
2.配置用户名:
git config --global user.name “你的用户名” 3.配置邮箱:
git config --global user.email “你的邮箱”
4.配置完成后检查配置:
git config -l
p.s. 如果有报错,查看一下环境变量有没有加上git下载路径
操作完要把终端,软件什么的都关掉再重启才能生效哦
二.与远程仓库连接
1.配置公钥 ssh-keygen -t rsa -C “你的邮箱”
出现enter的地方直接回车就好
出现上面的图就成功了,但是ssh是根目录中的一个隐藏文件
把这里面的内容保存一下
打开我们github的设置
在本地新建一个空文件夹,在这个文件夹内部右键打开此目录下的终端,输入
git init
然后输入
git clone “下面的ssh地址”
其他git相关命令 添加所有改动的文件到暂存区
git add .
给这次修改加备注,可以是中文,写你都做了哪些修改
git commit -m ‘modify’
上传自己的改动之前,先拉取当前最新的改动,看有没有和别人代码冲突
git pull
没问题就 git push
注意这里未来可能是git pull origin main(最后加的是远端分支名 如果你本地和远端是同一个分支就可以简写成上面的形式)
创建新分支
一、堆与非堆 按照官方的说法:“Java 虚拟机具有一个堆(Heap),堆是运行时数据区域,所有类实例和数组的内存均从此处分配。堆是在 Java 虚拟机启动时创建的。”“在JVM中堆之外的内存称为非堆内存(Non-heap memory)”。
二、堆与非堆的监控 我们怎么查看Java进程占用的堆内存有多大,非堆内存有多大呢?
public class Test { public static void main(String[] args) { //申请100M的空间 ByteBuffer buf = ByteBuffer.allocate(1024 * 1024* 100); //申请100M的空间 ByteBuffer buf2 = ByteBuffer.allocateDirect(1024 * 1024* 100); // 获取元空间的初始容量和最大容量等参数 MemoryUsage nonHeapMemoryUsage = ManagementFactory.getMemoryMXBean().getNonHeapMemoryUsage(); MemoryUsage heapMemoryUsage = ManagementFactory.getMemoryMXBean().getHeapMemoryUsage(); System.out.println("NonHeapMemoryUsage Used: " + (nonHeapMemoryUsage.getUsed() / 1024 / 1024) + " MB"); System.out.println("HeapMemoryUsage Used: " + (heapMemoryUsage.getUsed() / 1024 / 1024) + " MB"); } } 对应的输出为:
一般的,我们的RecyclerView是用来展示网络(后台)数据。遇到的情况,都是这样的:
先初始化好RecyclerView,然后给他绑定好LayoutManager,然后进行网络请求,最后再到UI线程去设置Adapter。
这么一套下来,很少遇到setAdapter导致的不显示问题。
对于这种常规的RecyclerView不显示的原因主要有3个:
忘记设置LayoutManager,比如: recyclerview.setLayoutManager(LinearLayoutManager(this)); 有些场景变化数据需要调用notifyDataSetChanged(), 但是如果你是调用setAdapter重新设置,其实是不需要Notify的。而且,如果DataList的地址没有变化也可能是不生效的。现在一般都使用增量更新。
参考如下: val insertIndex = datas.count() //现有数据长度 datas.addAll(insertIndex, addedDatas) //增量 if (notify) { notifyItemRangeInserted(insertIndex, data.count()) //通知增量更新 } createView方法错误
不要使用//错误 View view=View.inflate(parent.getContext(),R.layout.cell_normal,null); view1 = LayoutInflater.from(parent.getContext()).inflate(R.layout.cell_card,parent,false); 而最近,我遇到一个问题,在Fragment的onCreteView里面去设置静态数据,绑定Adapter不生效。
这个原因就与常规的原因不同了。
这里涉及到起手渲染的问题。
public void setAdapter(@Nullable Adapter adapter) { ... requestLayout(); } @Override public void requestLayout() { if (mInterceptRequestLayoutDepth == 0 && !mLayoutSuppressed) { super.requestLayout(); } else { mLayoutWasDefered = true; } } mInterceptRequestLayoutDepth,通过startInterceptRequestLayout()和stopInterceptRequestLayout()来成对出现控制++和–。
即,dispatchLayoutStep1,dispatchLayoutStep2,dispatchLayoutStep3三大步骤。
来源是归属于dispatchLayout()中的三个步骤。
进而分析来看:跟dispatchLayout()的完成执行,mFirstLayoutComplete置为true有很大关系。
private void dispatchLayoutStep1/2() { .
NAS(Network Attached Storage:网络附属存储)按字面简单说就是连接在网络上,具备资料存储功能的装置,因此也称为“网络存储器”。它是一种专用数据存储服务器。它以数据为中心,将存储设备与服务器彻底分离,集中管理数据,从而释放带宽、提高性能、降低总拥有成本、保护投资。其成本远远低于使用服务器存储,而效率却远远高于后者。
一,NAS有哪些类型? NAS分为两种:
Storage NAS:专注储存型;
Platform NAS:集成平台型,也就是说自带操作系统。常见只有群晖和威联通两个品牌,实际上销售nas的品牌非常多,一些品牌价格还很便宜,完全不输给那些已经涨价的矿渣。
二,常用NAS厂家 群晖(Synology)NAS存储
群晖(Synology)是来自台湾的网络存储服务器 (NAS) 品牌,成立于2000年,其产品线涵盖大型企业,中小型企业,家庭到公司工作组,家庭到小型办公室的NAS产品。
绿联(UGREEN)NAS存储
深圳市绿联科技股份有限公司成立于2012年,是一家集研发、设计、生产、销售于一体的国家级高新技术企业,是全球科技消费电子知名品牌企业。
西部数据(WD)NAS存储
西部数据公司(Western Digital Corp,WDC),是一家全球知名的硬盘厂商,成立于1970年,总部位于美国加州,在世界各地设有分支机构,为全球用户提供存储产品。
桦赋(色卡司Thecus)
鸿海集团其下子公司桦赋科技的NAS品牌,和群晖,威联通齐名的台湾省三大NAS厂商之一。其系统为基于linux的ThecusOS,原生支持Amazon S3云端备份功能,能通过Thecus Connect 及 http://Orbweb.me进行外网穿透。
软件生态上不比群晖和威联通弱,只是大陆没有电商自营渠道,穿透服务在大陆体验不佳,折腾的人比较少。
三,通常配置 安装NAS设置后,接通电源,连接网络,如果又专用软件会自动在局域网中搜到NAS设备
然后根据提示界面进行配置即可,设置账号,设置网络
设置好只好,通过web界面进行登录即可
最后根据需求进行设置即可
随着Easyexcel的应用,逐渐有了些复杂功能需要实现,如:动态表头、多个sheet页。本文记录下实现过程 首先,当然是引入依赖 <dependency> <groupId>com.alibaba</groupId> <artifactId>easyexcel</artifactId> <version>3.1.1</version> </dependency> 接下来是实现过程: (过程为实际的应用过程,实现了具体业务,过于繁琐,可直接去看总结)
一、动态表头 1.要导出的实体类添加关键注解 @ExcelProperty
public class IndmanageEntity implements Serializable { /** * 主键 */ @ExcelIgnore private Long id; /** * 指标编码 */ @ExcelProperty("指标编码") @ColumnWidth(20) private String typecode; /** * 指标名称 */ @ExcelProperty("指标名称") @ColumnWidth(20) private String typename; /** * 归属部门 */ @ExcelProperty("归属部门") @ColumnWidth(20) private String belongpart; /** * 归属业务线 */ @ExcelProperty("归属业务线") @ColumnWidth(20) private String belongbusline; /** * 指标来源 */ @ExcelProperty("指标来源") @ColumnWidth(20) private String indsource; /** * 指标来源报告 */ @ExcelProperty("
解决 eslint 的 Parsing error: Unexpected token 错误
问题描述:import动态导入,将js文件单独打包时,webpack打包错误
ERROR in ./src/js/main.js
Module Error (from ./node_modules/_eslint-loader@4.0.2@eslint-loader/dist/cjs.js
):
F:\workspace\javascript workspace\webpack\prj18_3\src\js\main.js
8:7 error Parsing error: Unexpected token (
✖ 1 problem (1 error, 0 warnings)
问题分析:禁用eslint,webpack打包正常,Parsing error 是eslint解析错误。
解决方案
1.eslint 配置 babel-eslint 插件
cnpm install babel-eslint --save
2.在package.json中配置 eslintConfig 属性
“eslintConfig”: {
“parser”: “babel-eslint”
}
————————————————
原文链接:https://blog.csdn.net/xzlAwin/article/details/109362849
在日常生活中,我们经常需要使用录屏工具来记录电脑屏幕上的操作过程,比如制作教程视频、分享游戏经验、展示软件功能等,一个优秀的录屏工具能帮上大忙。现在市面上有许多录屏工具可供选择,本文将详细介绍三种工具的使用方法和优势,帮助读者选择适合自己的工具。
录屏工具1:QQ录屏 QQ录屏是QQ聊天工具自带的一个录屏功能,使用方便,适合日常休闲使用。使用步骤如下:
步骤1:打开QQ聊天工具,登录上您的账号,按下“Ctrl+Alt+S”键,即可打开QQ内置录屏。
步骤2:在QQ内置录屏窗口中,可以选择全屏录制或区域录制。选择合适的录制区域后,点击“开始录制”按钮。
步骤3:开始录制后,可以操作电脑屏幕上的任何内容,QQ录屏会自动记录屏幕操作过程。在录制过程中,如果需要停止录制,可以点击“结束”按钮,视频会弹出预览,您可以手动保存到指定文件夹。
备注:QQ录屏虽然方便,但功能相对简单,适用于对录屏要求不高的日常场景。 录屏工具2:步骤记录器 步骤记录器是Windows系统内置的屏幕录制工具,可以轻松地记录电脑屏幕上的操作过程。以下是使用步骤记录器的具体步骤:
步骤1:按下“Win+R”键,输入“psr”,并按下回车键,即可打开步骤记录器。
步骤2:点击“开始记录”按钮,即可开始录制屏幕操作过程。
步骤3:停止录制后,步骤记录器会自动保存录制的视频文件,可以在指定文件夹中找到它。
备注:步骤记录器虽然功能简单,但胜在轻量,适合录制一些简短的教学视频或操作演示。 录屏工具3:专业录屏软件 如果您录制视频较频繁,且还想要录制电脑上不同的内容,比如窗口、桌面、应用程序等,可以考虑使用专业录屏工具——数据 蛙录屏软件。它可以录制超清流畅、不限时长的视频,满足您的多样化需求。
它支持Windows系统与Mac系统,拥有多种视频格式(WMV、MP4、GIF等),最高可以录制无损质量的视频文件。以下是使用数据 蛙录屏软件的具体步骤:
操作环境: 演示机型:联想GeekPro2020 系统版本:Windows 10 软件版本:数据 蛙录屏软件1.1.8 步骤1:前往数据 蛙录屏软件官网,根据提示下载并安装软件,打开它进入主页,在众多录屏选项中选择“视频录制”模式。
步骤2:在这里可以对录制的视频范围进行设置,您可以选择全屏录制或自定义录制,麦克风是电脑外部声音,扬声器是电脑内部声音,根据您的需求进行开启。
步骤3:录制过程中,可以使用控制栏上的相机图标进行截图,录制结束后,保存录制的视频文件或在软件上进行更多操作。
步骤4:在历史记录页面,选中两个视频文件,我们可以对它们进行合并,然后导出一个全新的视频。
录屏工具结论 总之,录屏工具已经成为人们生活中不可或缺的一部分,无论是娱乐还是工作,一个合适的录屏工具都能给我们带来诸多便利。希望通过本文,你能对QQ录屏、步骤记录器和数据 蛙录屏软件有更深入的了解。同时,也要注意保护个人隐私和信息安全,避免在录制过程中泄露敏感信息。
文章推荐:
mac录屏快捷键指南,轻松录制屏幕内容!https://blog.csdn.net/shujuwa__net/article/details/134133032?spm=1001.2014.3001.5502
电脑录像功能在哪?一文帮你轻松破解https://blog.csdn.net/shujuwa__net/article/details/134133751?spm=1001.2014.3001.5502
如何清除电脑缓存?简单几步,让你的电脑运行如飞!https://blog.csdn.net/shujuwa__net/article/details/134134442?spm=1001.2014.3001.5502
需求: 传统单体项目只有两台服务,项目与中间件都在同一台服务器上部署. 项目、数据库、ES、Redis等都在一个服务器上,使用keepalived生成虚拟IP供前段访问服务, 其他不讲 这个时候就需要保证两个服务器之间ES数据同步了,ES没有主备只有集群 最需要少三台服务器非偶数服务器, 这个时候就需要其他方案解决
解决方案
使用logstash 进行数据同步
第一种方案、使用[key: string]:string 形式为键名声明类型
声明类型: interface FormInfoData { [materialCode: string]: string materialName: string materialUnit: string materialItem: string materialOwnership: string materialclassCode: string materialclassName: string materialSpecification: string } 声明变量: const formInfoData = reactive<FormInfoData>({ materialCode: '', materialName: '', materialUnit: '', materialItem: '', materialOwnership: '', materialclassCode: '', materialclassName: '', materialSpecification: '' }) 使用遍历变量赋值: Object.keys(formInfoData).forEach((prop: string) => { formInfoData[prop] = prop in row ? row[prop] : '' }) 第二种方案、直接声明配置项
在tsconfig.json中compilerOptions里面新增忽略的代码,如下所示,添加后则不会报错
"suppressImplicitAnyIndexErrors": true
```python #coding=utf-8 import numpy as np class KMeans(object): """ - 参数 n_clusters: 聚类个数,即k initCent: 质心初始化方式,可选"random"或指定一个具体的array,默认random,即随机初始化 max_iter: 最大迭代次数 """ def __init__(self,n_clusters=5,initCent='random',max_iter=300): if hasattr(initCent, '__array__'): n_clusters = initCent.shape[0] self.centroids = np.asarray(initCent, dtype=np.float) else: self.centroids = None self.n_clusters = n_clusters self.max_iter = max_iter self.initCent = initCent self.clusterAssment = None self.labels = None self.sse = None #计算两点的欧式距离 def _distEclud(self, vecA, vecB): return np.linalg.norm(vecA - vecB) #随机选取k个质心,必须在数据集的边界内 def _randCent(self, X, k): n = X.shape[1] #特征维数 centroids = np.
文章目录 一、STM32F103系列芯片的地址映射和寄存器映射原理1、什么是寄存器(1)基本概念(2)举例说明(3)地址映射 2、地址映射和寄存器映射原理(1)存储器映射(2)寄存器映射 二、GPIO初始化设置步骤(时钟配置、输入输出模式设置、最大速率设置)(1)基本介绍(2)工作模式(3)初始化1. 首先配置时钟使能2. 配置为通用输出3. 设置输出值 三、解决两个问题四、解释嵌入式中常见的register和volatile 关键字1、register关键字(1)介绍(2)应用(3)示例代码 2、volatile关键字(1)介绍(2)应用(3)示例代码 总结参考文献 一、STM32F103系列芯片的地址映射和寄存器映射原理 1、什么是寄存器 (1)基本概念 现代的计算机主要包括三级存储,寄存器、内存储器和外存储器,存储数据的速率也依次递减。
寄存器是中央处理器内的组成部分。寄存器是有限存贮容量的高速存贮部件,它们可用来暂存指令、数据和地址。
存放数据的寄存器:如果你需要读取一个数据,直接到这个寄存器所在的地方来问问他,数据是多少就行了。问寄存器这个动作,叫做访问寄存器。不同的数据会存放在不同的寄存器,例如:引脚PA2与PB8的高低电平数据(1或0)肯定放在不同的寄存器里,那么怎么区分不同的寄存器呢?通过地址,不同的寄存器有不同的地址,就像老张行李寄存处在101号店铺,老王行李寄存处在258号店铺。
指令、地址寄存器与数据寄存器类似,里边存放的都是0和1,只是特别的规定下,数据寄存器里面存放的0和1表示数据,指令寄存器里存放的表示指令。
(2)举例说明 比如,我们找到 GPIOB 端口的输出数据寄存器 ODR 的地址是 0x4001 0C0C(至于这个地址如何找到可以先跳过,后面我们会有详细的讲解),ODR 寄存器是 32bit,低 16bit有效,对应着 16 个外部 IO,写 0/1 对应的的 IO 则输出低/高电平。现在我们通过 C 语言指
针的操作方式,让 GPIOB 的 16 个 IO 都输出高电平,具体见代码
通过绝对地址访问内存单元
// GPIOB 端口全部输出 高电平 *(unsigned int*)(0x4001 0C0C) = 0xFFFF; 0x4001 0C0C在我们看来是 GPIOB端口 ODR的地址,但是在编译器看来,这只是一个普通的变量,是一个立即数,要想让编译器也认为是指针,我们得进行强制类型转换,把它转换成指针,即(unsigned int *)0x4001 0C0C,然后再对这个指针进行 * 操作。刚刚我们说了,通过绝对地址访问内存单元不好记忆且容易出错,我们可以通过寄存器的方式来操作,具体见代码
通过寄存器别名方式访问内存单元
// GPIOB 端口全部输出 高电平 #define GPIOB_ODR (unsigned int*)(GPIOB_BASE+0x0C) * GPIOB_ODR = 0xFF; 为了方便操作,我们干脆把指针操作“*”也定义到寄存器别名里面,具体见代码
在博客中任意一篇博文中添加以下内容供我们验证(在已有博文中修改即可)
4f0e5053-6da7-4789-9643-99cc72542530
例如添加如下代码块:
var code = “4f0e5053-6da7-4789-9643-99cc72542530”
输入验证博文地址
var code = "4f0e5053-6da7-4789-9643-99cc72542530"
在PLC(可编程逻辑控制器)中,偏移量(Offset)通常是指访问或操作特定内存地址的相对位移。PLC的内存结构通常以字(Word)为单位,一个字通常包含16位二进制数据。每个位都可以通过相对于字节或字的偏移量来寻址和操作。
偏移量的计算可以根据PLC的内存结构和寻址方式而变化,但通常遵循以下规则:
字节偏移量:PLC内存通常以字节为单位组织。一个字节通常包含8位。如果要访问或操作一个特定字节内的位,你可以使用字节偏移量。偏移量通常从0开始,表示字节中的第一个位。例如,一个偏移量为3的位表示字节内的第4位。
字偏移量:有些PLC可以让你直接以字(Word)为单位访问内存,而不是字节。一个字通常包含16位。在这种情况下,偏移量通常从0开始,表示一个字内的第一个位。例如,一个偏移量为7的位表示一个字内的第8位。
地址寻址:PLC通常具有特定的内存地址寻址方式,这些地址可以根据PLC制造商的规范和型号而异。通常,地址由字(Word)和位(Bit)组成,如“W3.2”表示第3个字的第2个位。在这种情况下,字偏移量是3,位偏移量是2。
具体的PLC制造商和型号可能有不同的寻址和偏移量规则,应该参考PLC的文档和规范以了解如何正确计算和使用偏移量来访问内存中的位。在PLC编程中,正确计算偏移量非常重要,是以确保对特定位的读取和写入操作是准确的。
在西门子PLC中,一个DINT数据类型通常占据4字节(32位)的内存空间。因此,如果你的DINT的偏移量是192,那么它是192 * 4 = 768字节。
每个DINT数据类型包含32位的二进制数据,等于4字节的内存空间。你可以使用这个信息来计算偏移量的字节大小。所以,一个DINT数据类型的偏移量为192,等于768字节。
在西门子PLC中,DINT(Double Integer)数据类型通常占据4字节的内存空间。如果偏移量为192,那么它占据的字节偏移量为192 * 4 = 768字节。
在C#中,你可以使用 int 数据类型来表示带符号的32位整数,这是与DINT最接近的等效类型。在C#中,你可以使用 int 来表示一个DINT 数据。例如:
int myDintValue = 12345; // 表示一个32位整数,等效于 DINT 在Java中,你可以使用 int 数据类型来表示带符号的32位整数,也是与DINT最接近的等效类型。在Java中,你可以使用 int 来表示一个DINT 数据。例如:
int myDintValue = 12345; // 表示一个32位整数,等效于 DINT
阿里巴巴矢量图标库iconfont-阿里巴巴矢量图标库 1、单色图标库 示例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <link rel="stylesheet" href="./font-veafwwbvy/iconfont.css"> </head> <body> <i class="iconfont icon-anzhuoceshi"></i> </body> </html> 步骤 打开阿里巴巴矢量图标库,在素材库中选择单色图标库
选择一款单色图标并添加入库,点击进入购物车
下载所选择单色图标的代码
复制所下载的压缩文件夹
右击项目所在文件夹,点击在文件资源管理器中显示
粘贴压缩文件夹,并解压至项目文件夹中 ,如下图文件夹font-veafwwbvy
在VSCode中选择文件夹font-veafwwbvy下的iconfont.css中图标的类名,并复制类名,如下图
在html文件中,首先通过link引入iconfont.css的路径,其次,在class中粘贴图标类名 最终效果
2、多色图标库 1.在线引入 示例代码
<!DOCTYPE html> <html lang="en"> <head> <meta charset="UTF-8"> <meta name="viewport" content="width=device-width, initial-scale=1.0"> <title>Document</title> <script src="https://at.alicdn.com/t/c/font_4297416_g7ted2244pt.js"></script> </head> <body> <svg class="icon" aria-hidden="true"> <use xlink:href="#icon-a-Nodejs"></use> </svg> </body> </html> 步骤 打开阿里巴巴矢量图标库,在素材库中选择多色图标库 ,选择一款多色图标
将选择的多色图标添加入库,并且打开购物车
将购物车中选择的多色图标添加至项目
点击右上角新建文件图标,将多色图标添加到新建项目,点击确定 点击symbol,再点击查看在线链接
一、背景 场景一、
在实际生产环境中,我们的数据目录/data01 之前做了逻辑卷挂了100G到这个目录下,现在这个目录因为晚上日志切割备份,磁盘空间不够,导致在切割备份过程中产生告警。如果数据量增大会导致备份失败
场景二、
在生产环境中 ,我们的数据库目录/data01 现在做了逻辑卷挂在100G ,但是由于最近属于业务高峰期导致磁盘已经快满了 ,现在我们有两个选择:
1、更换数据目录,但这种情况一般不采取,因为我之前的软件或者数据可能到放在了/data 01如果现在换目录,就可能涉及软件重装或者数据迁移等等一系列的问题,
2、直接新增一块硬盘,做成逻辑卷挂在当前数据目录/data01下
往往在实际生产环境中 我们采用的都是第二种,因为使用第二种我们可以无限扩容或者缩容
本次我们讲的是给/data01盘扩容
二、确认磁盘是否添加 本次是用虚拟机模拟生产环境操作
[root@control ~]# lsblk #查看是否添加新磁盘
NAME MAJ:MIN RM SIZE RO TYPE MOUNTPOINT
sda 8:0 0 20G 0 disk
├─sda1 8:1 0 1G 0 part /boot
└─sda2 8:2 0 19G 0 part
├─centos-root 253:0 0 17G 0 lvm /
└─centos-swap 253:1 0 2G 0 lvm [SWAP]
sdb 8:16 0 20G 0 disk
└─sdb1 8:17 0 19G 0 part
通过ID来获取页面元素:document.getElementById(‘id’); <body> <div id="ce">测试</div> <script> let ce = document.getElementById('ce') console.log(ce); // <div id="ce">测试</div> </script> </body> 通过类名来获取页面元素:document.getElementsByClassName(‘类名’); <body> <div class="ce">测试</div> <script> let ce = document.getElementsByClassName('ce') console.log(ce[0]); // <div class="ce">测试</div> </script> </body> 通过标签名来获取页面元素:document.getElementsByTagName(‘标签名’); <body> <div>测试</div> <div>测试2</div> <script> let ce = document.getElementsByTagName('div') // 会获取页面所有的div标签 console.log(ce); // ce[0] <div class="ce">测试</div> ce[1] <div class="ce">测试2</div> </script> </body> 通过标签name属性获取页面元素:document.getElementsByName(‘name属性的值’); <body> <div name="ce">测试</div> <script> let ce = document.getElementsByName('ce') console.log(ce[0]); // <div name="ce">测试</div> </script> </body> H5新增的获取元素的方式:document.querySelector(‘选择器’); id带#,class带. <body> <div id="
try: file = open("test.txt") #会报错的东西 except FileNotFoundError as error: print("error:", error) #不报错 很喜欢小蓝的一句话:怎么报错!!怎么不报错!!
try: num_one = int(input("输入被除数:")) num_two = int(input("输入除数:")) print("结果:", num_one / num_two) except (ValueError, ZeroDivisionError) as error: #输入数为0,输入数为空 print("error:", error) 抛异常
try: raise IndexError("123") except: raise 限定上传文件格式
class OError(EOFError): def __init__(self, suffix): self.suffix = suffix picture = input("请上传图片:") for i in range(len(picture)): if picture[i] == ".": suffix = picture[i + 1:] try: if suffix != "jpg" and suffix !
打印机是跟win7的电脑连接的,然后试了很多方法,win11都没法添加该打印机去使用。
网上的方法乱七八糟啥都有,但试了以后,发现基本没什么用。
刚刚发现知乎上的一个回答是有用的,这里做记录以备后用。
1.打开控制面板的大图标里的“凭据管理器”
2.点击“windows凭据”,选择“添加windows凭据”
3.分别输入
(1)\对方主机名
(2)guest
(3)(这里是对方的guest账号的密码,空)
4.正常的添加打印机的方式
报错描述 在虚拟机中使用vim相关命令时,报错-bash: vim: 未找到命令
原因分析 不能使用vim,应该先查看是否安装
执行命令rpm -qa | grep vim
解决方法 缺少什么安装包就执行对应的命令
例如:yum -y install vim-enhanced、yum -y install vim-minimal等
如果都没有,则全部安装yum -y install vim*
目录 windows vlookup常见案例 同表查找同步数据跨表查找同步数据 windows vlookup常见案例 vlookup是在excel表格中查找处理数据的强大工具,准确来说他是一个函数
结构:=VLOOKUP(查找值,查找区域,列序数,匹配条件)解释:=VLOOKUP(找谁,在哪里找,第几列,0或1) 本随笔记录了日常所用到的案例,案例有很多,如果遇到新的后面会持续更新
同表查找同步数据 我们先构造一份数据 ,如下图,同一个表格内,A列和E列均为序列号,D列为期末分数,F列为最终分数。
我想根据序列号,同步期末分数到最终分数。这样期末分数修改的时候最终分数也会跟着修改
我们点一下F2部分的空格,也就是最终分数下面。然后鼠标放到fx旁边点击,输入函数
=VLOOKUP(E2,$A$1:$D$14,4,1) 当你输入=VLOOK的时候应该已经能看到excel自动弹出这个函数了,下面详细解释下上面这个函数
E2:见上面结构,第一个值为查找值,我们是根据序列号查的,所以这里填写E2 $A$1:$D$14:见上面结构,第二个值为查找范围,是指从A列的第1行到D列的第14行 4:见上面结构,第三个值为列序号,是指把哪一列的数据同步到我F2这一个空格来,因为我们要同步期末分数过来,所以选4,也就是D列 1:为0,表示精确匹配,为1,则代表近似匹配。 输入函数后回车,我们点击其他空格部分,会发现分数已经同步过去了
然后我们再次点击F2这个空格,细心点的可能会发现,这个表格右下角有个小点
我们按住Ctrl键,然后用鼠标点击这个小点并往下拉,直到最后一行,这样函数就会应用于下面所有行,数据都同步过来了
跨表查找同步数据 历史表格
上面我们讲了同表数据,如果跨表呢?接下来我们再构造一个表格,只有序列号,同样也有个最终分数,不过内容为空
我们要根据序列号,同步上面的期末分数,到下面新建表格的最终分数中
下面开始,我们在新建的表格中点击B2这个表格,然后点击上面的fx输入函数,这里一定要有逗号,表示我们没写完
=VLOOKUP(A2,) 然后,我们打开历史表格(第一个表格),可以看到这个表格的fx函数输入部分也有个 =VLOOKUP(A2,)
ok,到这里后,我们用鼠标选中A列到D列的所有数据,会发现上面公式会自动把这个表格的名字和列都加上去了
我们再输入逗号,因为我们要同步这个表格的期末分数到我们的新表格,期末分数是第4列,所以再输入4,所以最终公式是
=VLOOKUP(A2,[测试1.xlsx]Sheet1!$A$1:$D$14,4,1) 最后,我们点击切回我们新建的表格,可以发现数据已经同步过来了,然后我们如法炮制,按住ctrl点击B2空格右下角的小点向下拉,这样B列的数据就从历史表格的期末分数那一列同步过来了
扩展小点 # 如果我们想在新表格记录原先成绩的 10%,那么我们可以修改公式为 =VLOOKUP(A2,[测试1.xlsx]Sheet1!$A$1:$D$14,4,1)*0.1
MP4视频在本地可以播放,但是在html5的video多媒体标签不能正常播放,不显示图像,其实是编码的原因,虽然格式是MP4,但是html5只支持H.264的编码格式。
关于html5的video标签知识:
html4协议做网站时我们在网页播放视频使用flash播放,要么就是嵌入式页面实现html5网页可以使用video标签,使得多媒体文件很方便的在网页中播放 关于video标签所支持的视频格式和编码: MP4 = MPEG 4文件使用H264视频编解码器和AAC音频编解码器WebM = WebM文件使用VP8视频编解码器和Vorbis音频编解码器Ogg = Ogg 文件使用Theora视频编解码器和Vorbis音频编解码器 通过上面的信息我们会发现只有h264编码的MP4视频(MPEG-LA公司)、VP8编码的webm格式的视频(Google公司)和Theora编码的ogg格式的视频(iTouch开发)可以支持html5的<video>标签。 使用方法:
<video src="http://sp.ntaotu.com/localhost-wordpress-phpstudy.mp4" controls="controls" width="500"height="300"></video> 如果浏览器不支持video标签:
<video src="http://sp.ntaotu.com/localhost-wordpress-phpstudy.mp4" controls="controls" width="500"height="300">您的浏览器不支持播放该视频!</video> video标签的扩展参数详解:
<video width="500" height="250" controls="controls"> <source src="movie.ogg" type="video/ogg"> <source src="movie.mp4" type="video/mp4"> </video> autoplay :出现该属性意味着视频在就绪后将自动播放,用法:autoplay="autoplay"controls :出现该属性意味着向用户显示控件,如播放按钮等,用法:controls="controls"height:设置高度 width:设置宽度loop:自动重播,用法:loop="loop"preload:视频在页面加载时进行加载并预备播放,用法:preload="auto" - 当页面加载后载入整个视频;preload="meta" - 当页面加载后只载入元数据;preload="none" - 当页面加载后不载入视频。注意:若使用了autoplay,则忽略preloadsrc:要播放视频的url
使用 JD-GUI 工具
官网地址:Java Decompiler
1、下载 根据自己的需求下载
2、演示windows下载过程 3、解压缩,找到 jd-gui.exe 文件,然后双击执行 4、然后将准备好的class文件拖进去就可以了!
澄清:Qt对中文支持没啥问题,也不用什么特殊的函数,为了解决烦恼,必须了解下文件编码知识,比如utf-8可以不要bom,utf-32为啥需要bom等等。简单来说,所有源码文件,均保存为 UTF-8 无bom,基本不再有乱码,绝大多数情况下,根本不需要类似latin1等函数,用不到的!
无bom 无bom 无bom,非常重要!在各种文章的轰炸下,很多时候大家都知道选择UTF-8,但是一定要注意bom
Windows系统下,常用的编码有如下几种,这也是很多问题的起源。
直接用VS ide的话,默认的编码格式是GBK
用VS ide保存为UTF-8,很多人很多人保存成了UTF-8带BOM
Linux系统下,一般不存在这些问题,因为默认的编码都是 UTF-8不带bom
如果你的代码需要在Windows和Linux下都要运行的话,我建议直接用UTF-8不带bom
假设你用Qt Creator这个ide的话
1 在项目pro文件中加上这段代码,VS编译器默认使用GBK编码,需要特别配置
win32-msvc* { QMAKE_CXXFLAGS += /source-charset:utf-8 /execution-charset:utf-8 }
文章目录 Vision transformerSwin transformerConvolutional vision TransformerCross Attention Transformer Vision transformer 假设每个图像有 h ∗ w h*w h∗w 个patch,维度是 C C C
输入的图像 X X X ( 大小为 h w ∗ C hw* C hw∗C ),和三个系数矩阵相乘 ( 大小为 C ∗ C C*C C∗C ),得到 q k v qkv qkv 三个向量 ( h w ∗ C hw*C hw∗C ),复杂度为:
3 h w C 2 3hwC^2 3hwC2
q q q ( h w ∗ C hw*C hw∗C ) 和 k T k^T kT ( C ∗ h w C*hw C∗hw ) 相乘得到矩阵 A A A ( h w ∗ h w hw*hw hw∗hw ),复杂度为: ( h w ) 2 C (hw)^2C (hw)2C
1.快速入门: 创建两个对象打印小明小红的总成绩与平均成绩
package com.itheima.object; public class Text { public static void main(String[] args) { //创建一个学生对象,封装小红的数据 Student s1=new Student(); s1.name="小红"; s1.math=100; s1.chinese=96; s1.printTotalScore(); s1.printAverageScore(); //再创建一个学生对象,封装小明的数据 Student s2=new Student(); s2.name="小明"; s2.chinese=59; s2.math=90; s2.printTotalScore(); s2.printAverageScore(); } } package com.itheima.object; public class Student { String name; double chinese; double math; public void printTotalScore(){ System.out.println(name+"的总成绩是:"+(chinese+math)); } public void printAverageScore(){ System.out.println(name+"的平均成绩是:"+(chinese+math)/2.0); } } 2.深刻认识 对象在计算机中的执行原理:
Student s1=new Student();
每次new Student(),就是在堆内存中开辟一块内存区域代表一个学生
s1变量里面记住的是学生对象的地址
1.如何识别引用类型的变量?
Student s1=new Student();
如果在idea打开项目,可以参照下面这张图,如果不是,自行找到项目也行
在项目中找到.idea文件,左键点击打开,找到workspace.xml文件,右击编译,把下方代码放入即可(随便找到一个componet标签,在标签结束下粘贴即可)。
<component name="RunDashboard"> <option name="ruleStates"> <list> <RuleState> <option name="name" value="ConfigurationTypeDashboardGroupingRule" /> </RuleState> <RuleState> <option name="name" value="StatusDashboardGroupingRule" /> </RuleState> </list> </option> </component>
可以用rich,先创建样式a,然后在formatter中用{a|文字}的形式使用,就能将文字使用a样式了
英语老师小助手 Description 题目描述 英语老师要求学生按照如下规则写一串字母: 规则1、如果写了某个大写字母,下一个就必须写同个字母的小写,或者写字母表中前一个字母的大写(A的前一个字母是Z); 规则2、如果写了某个小写字母,下一个就必须写同个字母的大写,或者写字母表中下一个字母的小写(z的下一个字母是a)。 例如 zZzZYXWwxyYX 就是一个合法的字母串;而 wVUuvUTsR 就是非法的。 现在面对全班学生交上来的作业,老师请你写个程序自动批改。 Input 每行给出一位学生的作业,即仅由英文字母组成的非空字母串,长度大于2,小于200。 Output 对每位学生的作业,如果错误就输出 N及首个出错位置(位置从0开始); 如果正确就在一行中输出 Y和字符串的末位置(位从0开始计) Sample Input 1 zZzZYXWwxyYX Sample Output 1 Y 11 Sample Input 2 wVUuvUTsR Sample Output 2 N 1 Hint 字符串的长度小于200。输出位置从0开始计数。 用了很笨的方法
a=input() dui=0 for i in range(len(a)-1): if a[i].isupper(): if a[i]=='A': if a[i+1]==a[i].lower() or a[i+1]=='Z': dui=dui+1 else: print('N',i+1) break else: if a[i+1]==a[i].lower() or a[i+1]==chr(ord(a[i])-1): dui=dui+1 else: print('N',i+1) break elif a[i].islower(): if a[i]=='z': if a[i+1]==a[i].
文件类型识别 1、file命令
当文件没有后缀名,或者后缀名有而无法正常打开时,根据识别出的文件类型 来修改后缀名即可正常打开文件
使用场景:不知道后缀名,无法打开文件
格式:file myheart
myheart 为未知类型文件
2、winhex
通过winhex程序 可以查看文件头类型,根据文件头类型判断出文件类型
是用场景:Windows下通过文件头判断文件类型
各种类型文件对应文件头
JPEG (jpg),文件头:FF D8 FF E0
PNG (png),文件头:89 50 4E 47
GIF (gif),文件头:47 49 46 38 39 61 37 02 (实验吧,64格)
Windows Bitmap (bmp),文件头:42 4D
python反编译文件pyc的头:03 F3 0D 0A (实验吧,py的交易)
pyd的文件头:4D 5A 90 00
ZIP Archive (zip),文件头:50 4B 03 04 ascii码部分是PK,可以直接根据PK判断是zip文件,也有可能是doc文件
rar文件: 52 61 72 21
7z文件头:37 7A BC AF 27 1C (实验吧,有趣的文件)
MS Word/Excel (xls.or.doc),文件头:D0CF11E0
请尊重原创,转载本文需注明源出处!!! hello大家好!bootloader升级在MCU的程序设计中常常用到。那本篇主要根据官方例程 来说说 can通讯 UDS协议进行APP升级。
一、首先不管什么通讯进行升级,都要说明一下bootloader升级需要先了解的一些知识点: 1、向量表重映射: boot和APP各自有各自的中断向量表,而当 app启动后需要将 boot 程序的向量表切换为 app 程序自己的向量表。这里就涉及到如何去将向量表的初始值进行修改,那这里就是通过向 SYS_VECTOFF 赋值 app 程序偏移地址的方式实现重映射过程。
2、APP程序地址偏移: 因为IDE的编译默认是从0x00000000地址开始放置指令的,但是前面的地址已经被放置boot程序,故这里需要进行将APP程序初始地址进行偏移。具体设置方法如下:
(1)、ChipON IDE\KungFu32\ChiponCC32\scripting\ccr1_issue 找到对应芯片型号的 xxx.ld链接文件,将其复制到工程目录下。
(2)、打开 ld 文件后可以看到对应记录的 flash 起始地址和大
小。本此示例中将 boot 程序大小限制在 0x8000,所以将 app 的起始地址修改为 0x0000 8000。
(3)、最后,将修改好的 ld 文件在 IDE 中生效: 选中项目->右键->属性->C/C++构建->设置->通用设定->芯片脚本文件写入 -T"…/KF32F156MQV.ld" ->应用->确定。
**注意事项:**为了避免 boot 区程序超过界限,应当在 boot 程序中配置程序大小为 0x8000。
app的 ld 文件配置图示如下:
app的 工程属性 配置配置图示如下:
**这里有一个提醒:**就是从BOOT跳转到APP的时候,在 startup() 函数没有调整过的前提下,在app跑起来的时候会对ram进行初始化,但是对于boot程序配置的寄存器来说,是依然保留的。如果需要则可以进行保留,不需要挥着需要更改则可以进行该外设的重新初始化。
二、当我们把官方例程的BOOT和APP 程序编译完成后,即可进行升级流程的操作。这里篇幅问题就不说具体UDS流程部分的程序,感兴趣的可以自行研究。 实验所需:156demo板或者自己的板子均可,官方提供的boot和app程序,KF32烧录器,can卡(官网使用的是图莫斯,我这里使用的是周立功的can卡,上位机是ZCANPRO),连接线若干。 1、boot程序下载,将官方提供的boot程序编译完成后,将程序下载至demo板上,官方使用的使用的CANFD6进行升级的。USB端口可以打印串口数据至电脑端查看。当我们下载完成后,串口数据打印出来如下图: 2、先将APP程序进行编译。can卡和板子连接完好。然后对ZCANPRO进行配置,步骤:打开CANPRO软件,打开设备,设置成500k,其他不在赘述。连接完成后我们选择 高级功能 — ECU刷新 其他配置可以参考下图: 可以自行对照此流程在左边的方框内进行添加流程,配置文件下载时,加载HEX时按照图示配置即可。配置完成后点击 应用到执行器 , 弹出如下弹框后 点击 开始刷写 ,即可开始刷写。
来个元素CSS值
代码1:
通过javaScript执行脚本获取css值
String jsStr = "return document.getElementById(\"buyers\").style.getPropertyValue('width')"; Object o = ((JavascriptExecutor) driver).executeScript(jsStr); System.out.println(o.toString()); 代码2:
通过内置API获取元素属性值
//获取元素属性值 WebElement element=page.Buyers; String original_style = element.getAttribute("style"); System.out.println(original_style);
史上最全的立创元器件封装库导入AD详细教程 立创EDA 立创商城 打开立创商城网站https://www.szlcsc.com/ 步骤 搜索元器件 例如搜索STM32F103C8T6芯片 查看搜索结果,寻找下载文件 点击下载文件链接 出现如下图片情况,点击立即使用 出现了工程文件,记得注册账号,保存到自己的工程 如下图操作分别保存SCH,PCB文件到电脑本地文件中 点击 否 导出Altium,然后同意下载到本地电脑 下载到本地,重命名(最好) 打开AD软件,打开下载好的文件,生成库文件 生成SchLib,PcbLib文件 打开SchLIb文件添加PCB文件的封装库(我们不用这个方法) 新建一个Integrated_Library文件,填入名称路径 生成如下图文件 然后添加刚刚导出的文件SchLib,PcbLib 然后生成Integrated_Library文件 右边出现文件库(基本结束) 创建一个新的PCB工程看看是否成功能够使用 选择自己的库文件 生成PCB文件 到此为止,搞定(基本上没有问题,如果有问题可以去百度或者谷歌,我也是第一次搞,可能有没有注意的地方) 参考资料 立创商城网站https://www.szlcsc.com/学习AD绘制PCB 推荐一个哔哩哔哩UP主的视频(视频特点:简单 清晰 手把手教学)
https://www.bilibili.com/video/BV1zE411q72a立创EDA学习使用教程https://space.bilibili.com/430536057?from=search&seid=11621685439202966618
报错:
在获取元素的js属性时一直获取不到,报空指针,定位到元素时,发现是@FindBy的元素没有找到
解决方法:
在page类的构造函数中加上了 界面初始化,让元素先隐式加载,这样就不会出现返回元素为空的情况辣
PageFactory.initElements(driver,this); 调整后的代码:
* JoinPoint对象用于获取切面对象上下文信息,Aop将连接点的上下文信息封装为JoinPoint对象 * 通过JoinPoint对象可以获取到执行方法的相关信息,参数信息,代理对象的信息等。 * JoinPoint对象主要有以下几个方法 * getTarget():获取被代理的对象信息 * getThis():获取代理对象自己的信息 * getgetArgs():获取传入该方法的参数信息 * getSignature():获取执行方法的信息,通过该方法可以获取到方法名称,方法的类名和全类名,方法的声明类型等,如下 * getSignature().getName():获取方法名称 * getSignature().getModifiers():获取方法的声明类型 * getSignature().getDeclaringTypeName():获取执行方法所属类的类名 * getSignature().getDeclaringType().getSimpleName():取执行方法所属类的简单类名 * * 其中: * 环绕通知的参数为ProceedingJoinPoint,该对象是JoinPoint的子接口,新增了两个方法,proceed()和proceed(Object[] args) * 在环绕通知中,可以直接通过proceed()方法获取到方法执行之后的返回结果。 * 并且在环绕通知中,必须调用proceed()方法来执行目标方法,否则会造成通知执行了,目标方法没执行。 * 总的来说,在环绕通知中,目标方法是否执行, 你可以理解为是否调用了proceed()方法。 * 环绕通知的方法需要返回目标方法执行之后的结果。如果你在环绕通知中没有调用proceed()方法获取目标方法的返回值结果,会报空指针。 * 如果你使用了proceed(Object[] args)这个方法,它会使用args作为新的参数去执行目标方法。 package com.dong.aspect; import lombok.extern.slf4j.Slf4j; import org.aspectj.lang.JoinPoint; import org.aspectj.lang.ProceedingJoinPoint; import org.aspectj.lang.Signature; import org.aspectj.lang.annotation.*; import org.junit.jupiter.api.parallel.Execution; import org.springframework.stereotype.Component; import java.lang.reflect.Array; import java.lang.reflect.Modifier; import java.util.Arrays; import java.util.List; @Aspect @Slf4j @Component public class Longger { @Pointcut(value = "
如果您是一位经常使用PHP的开发者,那么您肯定会经常遇到需要上传文件夹的情况。PHP作为一种强大的服务器脚本语言,可以很轻松地实现上传文件的功能。但是,当需要上传一个包含多个文件的文件夹时,就需要一些特殊的技巧。
在PHP中,上传文件夹可以通过多种方式来实现。最简单的方法是使用Zip文件将文件夹压缩,然后通过PHP将Zip文件上传到服务器。然后解压该文件夹并逐个保存其中的文件。以下是一个简单的PHP代码示例,可以将Zip文件解压缩到指定的目录:
$zip = new ZipArchive; $res = $zip->open('example.zip'); if ($res === TRUE) { $zip->extractTo('/destination/path/'); $zip->close(); echo '文件解压成功!'; } else { echo '文件解压失败…'; } 此外,还有一种方法是使用PHP的递归函数来上传文件夹。递归函数是一种可以在函数内调用自身的函数,用于处理需要重复进行的操作。以下是一个简单的递归函数示例,可以将整个文件夹上传到服务器:
function upload_folder($folder, $remote_folder) { if ($handle = opendir($folder)) { while (false !== ($entry = readdir($handle))) { if ($entry != "." && $entry != "..") { if (is_dir("$folder/$entry")) { ftp_mkdir($conn_id, "$remote_folder/$entry"); upload_folder("$folder/$entry", "$remote_folder/$entry"); } else { ftp_put($conn_id, "$remote_folder/$entry", "$folder/$entry", FTP_BINARY); } } } closedir($handle); } } 使用递归函数来上传文件夹时,一定要注意考虑到文件夹路径的正确性,以及服务器上文件夹的权限问题。
一、VSCode安装 官网下载地址: https://code.visualstudio.com/
双击setup.exe运行安装程序,简易式安装,全点下一步就行,按需更改安装路径
二、插件安装 在插件商店中搜索以下插件并安装
配置Keil Asistant插件,在图示位置输入自己电脑上的Keil完整安装路径
配置完成后就可以打开Keil工程进行编辑(仅编辑,编辑完成后如需运行或编译生成可执行文件,还是需要在keil中进行)
三、“未定义标识符”问题解决 打开keil工程后,代码出现“未定义标识符”时,其中一个解决办法是添加以下代码
"C_Cpp.intelliSenseEngineFallback": "Disabled", "C_Cpp.intelliSenseEngine": "Tag Parser", 添加方式
第一步:创建一个文件上传表单
允许用户从表单上传文件是非常有用的。
请看下面这个供上传文件的 HTML 表单:
<html> <body> <form action="upload_file.php" method="post" enctype="multipart/form-data"> <label for="file">Filename:</label> <input type="file" name="file" id="file" /> <br /> <input type="submit" name="submit" value="Submit" /> </form> </body> </html> 请留意如下有关此表单的信息: 标签的 enctype 属性规定了在提交表单时要使用哪种内容类型。在表单需要二进制数据时,比如文件内容,请使用 “multipart/form-data”。
标签的 type=“file” 属性规定了应该把输入作为文件来处理。举例来说,当在浏览器中预览时,会看到输入框旁边有一个浏览按钮。
注释:允许用户上传文件是一个巨大的安全风险。请仅仅允许可信的用户执行文件上传操作。
第二步:创建上传脚本
“upload_file.php” 文件含有供上传文件的代码:
<?php if ($_FILES["file"]["error"] > 0) { echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "Upload: " . $_FILES["file"]["name"] . "<br />"; echo "Type: " . $_FILES["
随着互联网的发展,网络应用程序也变得越来越普及。WEB应用程序成为一种非常受欢迎的应用程序开发模式。而PHP语言是一种非常出色的WEB编程语言。随着PHP语言的发展,PHP的功能也越来越强大。其中,文件上传就是PHP语言中非常重要的一个功能。在PHP编写的WEB应用程序开发过程中,经常会出现文件上传的需求。本文将介绍使用PHP实现文件夹上传文件的方法,希望对大家有所帮助。
一、什么是文件上传?
文件上传是指将本地计算机上的文件传输到远程服务器上的过程。上传的文件可以是各种类型,例如文本文件、图像文件、音频文件、视频文件等等。在WEB应用程序中,通常需要实现浏览器端将文件上传到WEB服务器的功能,以满足用户上传文件的需求。
二、PHP实现文件上传的方式
PHP提供了两种方式来实现文件上传:
HTML表单提交方式
通过在HTML表单中添加一个type为"file"的元素,用户可以在浏览器中选择本地计算机上的文件,然后通过HTTP请求的方式将文件上传到WEB服务器上。PHP通过$_FILES数组可以获取上传的文件信息。上传的文件在服务器端会被保存到一个临时文件夹中,可以使用move_uploaded_file函数将文件转移到指定的文件夹中。
使用HTML表单提交方式实现文件上传的代码如下:
<form action="upload.php" method="post" enctype="multipart/form-data"> <input type="file" name="file" /> <input type="submit" value="上传文件" /> </form> <?php if($_FILES["file"]["error"] > 0){ echo "Error: " . $_FILES["file"]["error"] . "<br />"; } else { echo "上传文件名: " . $_FILES["file"]["name"] . "<br />"; echo "文件类型: " . $_FILES["file"]["type"] . "<br />"; echo "文件大小: " . ($_FILES["file"]["size"] / 1024) . " Kb<br />"; echo "临时文件名: " . $_FILES["file"]["tmp_name"] . "
1 Flask 1.1 认识Flask Web Application Framework( Web 应用程序框架)或简单的 Web Framework( Web 框架)表示一个库和模块的集合,使 Web 应用程序开发人员能够编写应用程序,而不必担心协议,线程管理等低级细节。
1.2 Pycharm安装与简单测试 1.2.1 安装 Pycharm 安装 Flask 框架
File → Settings → Project: [project name] → Project Interpreter
1.2.2 简单测试 运行下面代码,打开http://127.0.0.1:5000的链接
from flask import Flask # __name__:代表当前模块,app为类的实例 app = Flask(__name__) # 创建一个路由和视图函数的映射 @app.route('/') def hello_world(): return 'Hello World' if __name__ == '__main__': app.run() #app.run(host='0.0.0.0', port=5000) 1.2.3 Debug模式(热更新) Debug 模式从控制台可以看见
Pycharm 专业版开启方法:
右上角的项目名称 → Edit Configurations → 勾选FLASK_DEBUG选项 → 重启项目
python爬虫爬取一个免费的小说网站 首先,我们导入需要的包 import requests from bs4 import BeautifulSoup import re import json 创建header头 headers={ # 浏览器基本信息 'User-Agent': 'Mozilla/5.0 (Windows NT 10.0; Win64; x64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/118.0.0.0 Safari/537.36 Edg/118.0.2088.69' } 创建data参数,保证在点击下一面时得到要获取的数据 我们观察刷新后的两张图片,可以看出最后两项的数据不同,也就是data参数
data = { 'ajx': '1', 'menu': 'novel', 'id': '372513', 'action': 'intro', 'order': 'date', 'bookmark': '', 'page':f'{2+i}', '_':f'{1698588100098+i}' } 调用request函数并用json格式保存 url在表头获取
res=requests.get(f'https://mm.munpia.com/?ajx=1&menu=novel&id=372513&action=intro&order=date&bookmark=&page={i+2}&_={1698588100098+i}',headers=headers,data=data) # print(res.text) json_data = json.loads(res.text) 使用for循环从数组中获取每个子网址的ID,拼接网址,利用select获取需要的小说内容,最后写入txt文件中。
for item in json_data['list']: url='https://mm.munpia.com/?menu=novel&action=view&id=372513&entry_id='+(item['neSrl']) print(url) res = requests.get(url) bs = BeautifulSoup(res.
写在前面:
首先感谢兄弟们的订阅,让我有创作的动力,在创作过程我会尽最大能力,保证作品的质量,如果有问题,可以私信我,让我们携手共进,共创辉煌。
路虽远,行则将至;事虽难,做则必成。只要有愚公移山的志气、滴水穿石的毅力,脚踏实地,埋头苦干,积跬步以至千里,就一定能够把宏伟目标变为美好现实。
1.介绍 白鲸优化算法(Beluga whale optimization, BWO)是2022年提出的一种元启发式优化算法,其灵感来源于白鲸的生活行为。白鲸以成年鲸的纯白色而闻名,是高度群居的动物,它们可以成群聚集,有2到25个成员,平均有10个成员。与其他元启发式方法类似,BWO包含探索阶段和开发阶段,此外该算法还模拟了生物界中存在的鲸落现象。
论文:
Zhong C, Li G, Meng Z. Beluga whale optimization: A novel nature-inspired metaheuristic algorithm[J]. Knowledge-Based Systems, 2022, 109215.
2.算法流程 BWO流程图:
2.1 种群初始化 白鲸优化算法是基于种群的机制,将每条白鲸假设为一个候选解,并在优化过程中进行不断更新,则种群初始化位置为:
2.2 探索阶段 2.3 开发阶段 开发阶段的灵感来自于白鲸的捕食行为,白鲸可以根据附近白鲸合作觅食和位置移动。假设可以通过 Levy 飞行策略捕捉猎物,其公式为:
2.4 鲸鱼坠落 为了模拟每次迭代中鲸鱼坠落行为,从种群中选择一个鲸鱼坠落的概率,来模拟群体中的变化。白鲸要么转移到其它地方,要么被击落并掉入深海。为保证种群数量不变,通过利用白鲸位置和鲸鱼坠落步长更新鲸鱼位置,公式如下:
式中,鲸鱼坠落的概率从初始迭代的 0.1 下降到最后一次迭代的 0.05 ,说明当白鲸在优化过程中更接近食物源时,白鲸的就会危险降低。
3.代码 BWO代码:
import numpy as np import math from copy import deepcopy import matplotlib.pyplot as plt ''' 白鲸优化算法 参数 n:白鲸种群大小 tmax:最大迭代次数 lb:变量下限 ub:变量上限 nd:变量维数 fobj:目标函数 ''' # 白鲸优化算法 def bwo(n, tmax, lb, ub, nd, fobj): # 记录每轮更新最优解 best_fval = [] # 位置矩阵 x = lb + np.
说明:这是一个机器学习实战项目(附带数据+代码+文档+视频讲解),如需数据+代码+文档+视频讲解可以直接到文章最后获取。
1.项目背景 2019年Heidari等人提出哈里斯鹰优化算法(Harris Hawk Optimization, HHO),该算法有较强的全局搜索能力,并且需要调节的参数较少的优点。
本项目通过HHO哈里斯鹰优化算法寻找最优的参数值来优化CNN分类模型。
2.数据获取 本次建模数据来源于网络(本项目撰写人整理而成),数据项统计如下:
数据详情如下(部分展示):
3.数据预处理 3.1 用Pandas工具查看数据 使用Pandas工具的head()方法查看前五行数据:
关键代码:
3.2数据缺失查看 使用Pandas工具的info()方法查看数据信息:
从上图可以看到,总共有11个变量,数据中无缺失值,共2000条数据。
关键代码:
3.3数据描述性统计 通过Pandas工具的describe()方法来查看数据的平均值、标准差、最小值、分位数、最大值。
关键代码如下:
4.探索性数据分析 4.1 y变量柱状图 用Matplotlib工具的plot()方法绘制直方图:
4.2 y=1样本x1变量分布直方图 用Matplotlib工具的hist()方法绘制直方图:
4.3 相关性分析 从上图中可以看到,数值越大相关性越强,正值是正相关、负值是负相关。
5.特征工程 5.1 建立特征数据和标签数据 关键代码如下:
5.2 数据集拆分 通过train_test_split()方法按照80%训练集、20%测试集进行划分,关键代码如下:
5.3 数据样本增维 数据样本增加维度后的数据形状:
6.构建HHO哈里斯鹰优化算法优化CNN分类模型 主要使用HHO哈里斯鹰优化算法优化CNN分类算法,用于目标分类。
6.1 HHO哈里斯鹰优化算法寻找的最优参数 关键代码:
每次迭代的过程数据:
最优参数:
6.2 最优参数值构建模型 6.3 最优参数模型摘要信息 6.4 最优参数模型网络结构 6.5 最优参数模型训练集测试集损失和准确率曲线图 7.模型评估 7.1 评估指标及结果 评估指标主要包括准确率、查准率、查全率、F1分值等等。
从上表可以看出,F1分值为0.9412,说明模型效果较好。
关键代码如下:
7.2 分类报告 从上图可以看出,分类为0的F1分值为0.94;分类为1的F1分值为0.94。
7.3 混淆矩阵 从上图可以看出,实际为0预测不为0的 有19个样本;实际为1预测不为1的 有4个样本,整体预测准确率良好。
以往传统的 Redux 状态管理工具使用起来代码太过于复杂。
你需要通过纯函数触发 action 再去修改 data 中定义的数据,而且要通过接口请求数据还需要借助 redux - think 这个中间件才能完成。。。
更加方便使用的工具:Recoil ~ 由 facebook 推出契合 React 的状态管理
它的定义方式和 useState 这个 HOOK 非常像,你可以更加简化的完成你的全局数据共享
pnpm install recoil yarn install recoil npm install recoil
安装好这个工具之后直接开始使用,需要引入之后包裹你的根组件 import React from 'react'; // 引入 Recoil 在 main.tsx 中包裹住你的根组件 import { RecoilRoot, atom, selector, useRecoilState, useRecoilValue, } from 'recoil'; function App() { return ( // 此处包裹 <RecoilRoot> <CharacterCounter /> </RecoilRoot> ); } 这一步做好之后,你可以在 src 文件之下定义 store(仓库)文件夹,名字随便起,按照自己喜欢的来(前提取的名字不要太骚被你的领导叫去喝茶)
进行挂载时错误提示:
Failed to mount filesystem.
If you want the card to be formatted, set the EXAMPLE_FORMAT_IF_MOUNT_FAILED menuconfig option.
后面还有一条红字:
Failed to initialize the card Failed to initialize the card Make sure SD card lines have pull-up resistors in place. Make sure SD card lines have pull-up resistors in place. 这是提示我没有上拉的意思,但是我仔细检查了以下。明明上拉了呀。网上有人说是因为IO2引脚启动电平的问题,我看了下IO2引脚是悬空的,启动后进行上拉符合条件。。。。。就在我抓狂的时候,突然发现挂载点目录不对。格式错了,啊啊啊啊啊啊 没想到啊,差一个“/”也无法挂载。。。。。。。。。。
#define MOUNT_POINT "/sdcard"//正确挂载点 #define MOUNT_POINT "sdcard"//错误挂载点 把“/”符号加上,成功运行。
目录 引言方案一:基于LaTeX环境方案二:基于KaTeX(推荐) 方案三:基于Matplotlib写在最后 引言 近来,涉及到一些公式识别的项目,输入是公式的图像,输出是LaTeX格式的数学公式字符串。
这类项目一般都采用深度学习的方法来做,这就涉及到构造公式LaTeX字符串和对应渲染后图像的数据集。来训练模型。
经过调研,这种数据来源一般有两种,一是人工标注;二是合成。鉴于训练模型所需庞大的数据量,优先考虑合成这种数据。而合成这种数据集时,就需要将公式的LaTeX字符串渲染为公式的图像,如下图所示:
为此,我做了一些调研,寻求可以实现以上这种效果的方案。
方案一:基于LaTeX环境 该方案需要安装LaTeX环境,MacOS下的安装包大概有5.2G左右。
优点是支持所有的LaTeX文档的渲染,缺点是环境太占地了。
如果使用场景涉及到公式的复杂和多样性,则有必要安装这个环境,然后采用python调用渲染。
具体操作文档,大家可以去网上搜索一番,我这里就不在再赘述。
方案二:基于KaTeX KaTeX 是一个快速,易于使用的JavaScript库,用于在Web上进行TeX数学渲染。支持大部分LaTeX语法。
基于KaTeX方案合成训练所用数据集的方案,只是我的构想,可以单独启动一个支持公式渲染的KaTeX的服务,然后python调用这个服务,输入公式LaTeX字符串,返回渲染后的数学公式图像。
值得说明的是,我并没有真正尝试这种方案,但是是具有可行性的,同时我在Github上并没有找到这种方案的项目。
(推荐) 方案三:基于Matplotlib 基于Matlplotib的方案,我是比较倾向这种方案的,不用额外安装LaTeX环境,因为Matplotlib 实现了一个轻量级的 TeX 表达式解析器和布局引擎,Mathtext 是该引擎支持的 Tex 标记的子集。这一部分的详细介绍,可参见官方文档:Writing mathematical expressions
使用例子:
import matplotlib.pyplot as plt fig = plt.figure(figsize=(3, 3), linewidth=1, edgecolor='black') fig.text(.2, .7, "plain text: alpha > beta") fig.text(.2, .5, "Mathtext: $\\alpha > \\beta$") fig.text(.2, .3, r"raw string Mathtext: $\alpha > \beta$") 渲染结果如下:
不需要安装 TeX 即可使用 Mathtext,因为 Matplotlib 附带了 Mathtext 解析器和引擎。 Mathtext 布局引擎是对 Donald Knuth 的 TeX 中布局算法的相当直接的改编。