day43
今日内容
-
python操作MySQL(重要)
-
SQL注入问题(安全相关的xss,csrf)
-
视图(了解)
-
触发器(了解)
-
事务(重要)
-
存储过程(了解)
-
内置函数(了解,很多)
-
流程控制(了解)
-
索引(重点)
python操作MySQL
MySQL本身就是一款c/s架构,有服务端、有客户端,自身带了有客户端,mysql.exe
python这门语言成为了MySQL的客户端(对于一个服务端来说,客户端可以有很多)
操作步骤:
1.先连接MySQL
host、port、username、password、charset、库等
2.在python中书写SQL语句
3.开始执行SQL语句,拿到结果
4.在python中做处理(进一步对数据处理)
需要使用第三方一个模块:pymysql mysqldb mysqlclient
pip install pymysqlimport pymysql
1.先连接MySQL
conn=pymysql.connect(host='127.0.0.1,port=3306,user='root',password='1234',db='db8',charset='utf8',autocomit=True # 自动执行二次提交
)2.获取游标
cur=conn.cursor(cursor=pymysql.cursors.DictCursor)3.写SQL语句
sql='inseert into teacher(tid,tname) values (7,"ly1")4.开始执行SQL语句
affect_rows=cur.execute(sql) # 16 影响的行数
需要执行二次确认:除了查询之外都要二次确认提交
print(affect_rows)5.想获取到结果
#res=cur.fetchone() # 取单个
#res=cur.fetchmany(5) # 取指定个数
res=cur.fetchall() # 取所有 元组类型
print(res)for i in res:print(i.get("sid"))
SQL注入问题
import pymysqlconn = pymysql.connect(host='127.0.0.1',port=3306,user='root',password='123',database='db8',charset='utf8',autocommit=True
)cur = conn.cursor(cursor=pymysql.cursors.DictCursor)inp_name = input('username>>>:').strip()
inp_pwd = input('password>>>:').strip()sql = 'select * from userinfo where username="%s" and password="%s"' % (inp_name,inp_pwd)affect_rows=cur.execute(sql)res=cur.fetchone()
if res:print("登陆成功")
else:print("登陆失败")
SQL注入的原因是由于特殊符号的组合会产生特殊的效果
实际生活中 尤其是在注册用户名的时候 会非常明显的提示你很多特殊符号不能用 原因也是一样的
结论:设计到敏感数据部分 不要自己拼接 交给现成的方法拼接即可
在使用代码进行数据操作的时候,不同操作的时候 不同操作的级别是不一样的
针对查无所谓 针对增 改 删都需要二次确认
conn.commit()
视图
1.什么是视图
视图就是通过查询得到一张虚拟表,然后保存下来,下次直接使用即可
2.为什么要用视图
如果要频繁使用一张虚拟表,可以不用重复查询
3.如何使用视图
create view teacher2course as
select * from teacher inner jion course on teacher,tid = course.teacher_id;
创建好了之后 验证它的存在navicat验证 cmd终端验证
最后文件验证 得出下面的结论 视图只有表结构数据还是来源于之前的表
delete from teacher2course where id=1;
强调
1.在硬盘中,视图只有表结构文件,没有表数据文件
2.视图通常是用于查询,尽量不要修改视图中的数据
思考:开发过程中会不会去使用视图
不会!视图是mysql的功能,如果你的项目里面大量的使用到了视图,那意味着你后期想要扩张某个功能的时候这个功能恰巧又需要对视图进行修改,意味着你需要先在mysql这边将视图先修改一下,然后再去应用程序中修改对应的sql语句,这就涉及到跨部门沟通的问题,所以通常不会使用视图,而是通过重新修改sql语句来扩展功能
触发器
在满足对某张表数据的增、删、改的情况下,自动触发的功能称之为触发器
为何要用触发器
触发器专门针对我们对某一张表数据增insert、删delete、改update的行为,这类行为一旦执行就会触发触发器的执行,即自动运行另外一段sql代码
创建触发器语法
"""语法结构
create trigger 触发器的名字 before/after insert/update/delete on 表名 for each row
beginsql语句
end"""# 针对插入
create trigger tri_after_insert_t1 after insert on 表名 for each row
beginsql代码...
end
create trigger tri_after_insert_t2 before insert on 表名 for each row
beginsql代码...
end# 针对删除
create trigger tri_after_delete_t1 afer delete on 表名 for each row
beginsql代码...
end
create trigger tri_after_delete_t2 afer delete on 表名 for each row
beginsql代码...
end# 针对修改
create trigger tri_after_update_t1 after update on 表名 for each row
beginsql代码...
end
create trigger tri_after_update_t2 before update on 表名 for each row
beginsql代码...
end
需要注意 在书写sql代码的时候结束符是;而整个触发器的结束也需要分号;
这就会出现语法冲突 需要我们临时修改结束符号
delimiter $$
delimiter ;
该语法只在当前窗口有效
案例
mysql> CREATE TABLE cmd (-> id INT PRIMARY KEY auto_increment,-> USER CHAR (32),-> priv CHAR (10),-> cmd CHAR (64),-> sub_time datetime, #提交时间-> success enum ('yes', 'no') #0代表执行失败-> );
Query OK, 0 rows affected (0.03 sec)mysql> create table errlog(-> id int primary key auto_increment,-> err_cmd char(64),-> err_time datetime);
Query OK, 0 rows affected (0.02 sec)mysql> create trigger tri_after_insert_cmd after insert on cmd for each row-> begin-> if NEW.success = 'no' then # 新记录都会被MySQL封装成NEW对象-> insert into errlog(err_cmd,err_time) values(NEW.cmd,NEW.sub_time);-> end if;-> end $$
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;
mysql> insert into cmd (-> user,-> priv,-> cmd,-> sub_time,-> success-> )-> values-> ('egon','0755','ls -l /etc',NOW(),'yes'),-> ('egon','0755','cat /etc/passwd',NOW(),'no'),-> ('egon','0755','useradd xxx',NOW(),'no'),-> ('egon','0755','ps aux',NOW(),'yes');
Query OK, 4 rows affected (0.01 sec)
Records: 4 Duplicates: 0 Warnings: 0查询errlog表记录
mysql> select * from errlog;
+----+------------------------------------------------------------------+---------------------+
| id | err_cmd | err_time |
+----+------------------------------------------------------------------+---------------------+
| 1 | cat /etc/passwd | 2023-10-26 17:16:39 |
| 2 | useradd xxx | 2023-10-26 17:16:39 |
+----+------------------------------------------------------------------+---------------------+
2 rows in set (0.00 sec)删除触发器
mysql> drop trigger tri_after_insert_cmd;
Query OK, 0 rows affected (0.00 sec)
事务
什么是事务
开启一个事务可以包含一些sql语句,这些sql语句要么同时成功
要么一个都别想成功,称之为事务的有原子性
事务的作用
保证了对数据操作的数据安全性
举例:用交行的卡操作建行ATM机给工商的账户转钱
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
原子性(atomicity):一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么不做。
一致性(consistency):事务是必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。
隔离新(isolation):一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务时隔离的,并发执行的各个事务之间不能干扰。
持久性(durabili):持久性也称永久性(permanence),指一个事务一旦提交,他对数据库中数据的改变就是永久性的,接下来的其他操作或故障不应该对其有任何影响。
如何用
mysql> create table user(-> id int primary key auto_increment,-> name char(32),-> balance int-> );
Query OK, 0 rows affected (0.03 sec)mysql> insert into user(name,balance)-> values-> ('jason',1000),-> ('egon',1000),-> ('tank',1000);
Query OK, 3 rows affected (0.00 sec)
Records: 3 Duplicates: 0 Warnings: 0mysql> select * from user;
+----+----------------------------------+---------+
| id | name | balance |
+----+----------------------------------+---------+
| 1 | jason | 1000 |
| 2 | egon | 1000 |
| 3 | tank | 1000 |
+----+----------------------------------+---------+
3 rows in set (0.00 sec)mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)mysql> update user set balance=900 where name='jsaon';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0 Changed: 0 Warnings: 0mysql> update user set balance=1010 where name='egon';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> update user set balance=1090 where name='tank';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1 Changed: 1 Warnings: 0mysql> select * from user;
+----+----------------------------------+---------+
| id | name | balance |
+----+----------------------------------+---------+
| 1 | jason | 1000 |
| 2 | egon | 1010 |
| 3 | tank | 1090 |
+----+----------------------------------+---------+
3 rows in set (0.00 sec)mysql> rollback; # 回滚到上一个状态
Query OK, 0 rows affected (0.00 sec)mysql> commit; # 开启事务之后,只要没有执行commit操作,数据其实都没有真正刷新到硬盘
Query OK, 0 rows affected (0.00 sec)
站在python代码的角度,应该实现的伪代码逻辑
try:# 少了开事务...update user set balance=900 where name='jason'; #买支付100元update user set balance=1010 where name='egon'; #中介拿走10元update user set balance=1090 where name='tank'; #卖家拿到90元
except 异常:rollback;
else:commit;
存储过程
存储过程包含了一系列可执行的sql语句,存储过程存放于MySQL中,通过调用它的名字可以执行其内部的一堆sql,类似于python中的自定义函数
基本使用
mysql> delimiter $$
mysql> create procedure p1()-> begin-> select * from user;-> end $$
Query OK, 0 rows affected (0.01 sec)mysql> delimiter ;
mysql> call p1()-> ;
+----+----------------------------------+---------+
| id | name | balance |
+----+----------------------------------+---------+
| 1 | jason | 1000 |
| 2 | egon | 1000 |
| 3 | tank | 1000 |
+----+----------------------------------+---------+
3 rows in set (0.00 sec)Query OK, 0 rows affected (0.01 sec)
三种开发者模型
第一种
应用程序:只需要开发应用程序的逻辑
mysql:编写好存储过程,以供应程序调用
优点:开发效率,执行效率都高
缺点:考虑到人为因素、跨部门沟通等问题,会导致扩展性差
第二种
应用程序:除了开发应用程序逻辑,还需要编写原生sql
优点:比方式1,扩展性高(非技术性)缺点:
1.开发效率,执行效率都不如方式1
2.编写原生sql太过于复杂,而且需要考虑到sql语句的优化问题
第三种
应用程序:开发应用程序的逻辑,不需要编写原生sql,基于别人写好的框架来处理,ORM
优点:不用再编写纯生sql,这意味着开发效率比方式2高,同时兼容方式2扩展性高的好处
缺点:执行效率连方式2都比不过
创建存储过程
mysql> set @res=10;
Query OK, 0 rows affected (0.00 sec)mysql> delimiter $$
mysql> create procedure p2(-> in m int, # in表示这个参数必须只能是传入不能被返回出去-> in n int,-> out res int # out表示这个参数可以被返回出去-> )-> begin-> select tname from teacher where tid > m and tid < n;-> set res=0; # 用来标志存储过程是否执行-> end $$
Query OK, 0 rows affected (0.00 sec)mysql> call p2(1,5,@res);
+-----------------+
| tname |
+-----------------+
| 李平老师 |
| 刘海燕老师 |
| 朱云海老师 |
+-----------------+
3 rows in set (0.00 sec)Query OK, 0 rows affected (0.01 sec)# 针对res需要先提前定义
set @res=10; 定义
select @res; 查看
call p1(1,5,@res) 调用
select @res 查看
如何用存储过程
大前提:存储过程在哪个库下面创建的只能在对应的库下面才能使用!!!
1.直接在mysql中调用
set @res=10 # res的值是用来判断存储过程是否被执行成功的依据,所以需要先定义一个变量@res存储10
call p1(2,4,10); # 报错
call p1(2,4,@res);
查看结果
select @res;# 执行成功。@res变量值发生了变化
2、在python中调用
pymysql连接mysql
产生的游表cursor.callproc('p1',(2,4,10)) # 内部原理:@_p1_0=2,@_p1_1=4,@_p1_2=10;
cursor.execute('select @_p1_2;')
3、存储过程与事务使用举例(了解)
delimiter //
create PROCEDURE p5(
OUT p_return_code tinyint
)
BEGIN
DECLARE exit handler for sqlexception
BEGIN
-- ERROR
set p_return_code = 1;
rollback;
END;
DECLARE exit handler for sqlwarning
BEGIN
-- WARNING
set p_return_code = 2;
rollback;
END;START TRANSACTION;
update user set balance=900 where id =1;
update user123 set balance=1010 where id = 2;
update user set balance=1090 where id =3;
COMMIT;-- SUCCESS
set p_return_code = 0; #0代表执行成功
END //
delimiter ;
函数
注意与存储过程的区别,mysql内置的函数只能在sql语句中使用!
CREATE TABLE blog (id INT PRIMARY KEY auto_increment,NAME CHAR (32),sub_time datetime
);INSERT INTO blog (NAME, sub_time)
VALUES('第1篇','2015-03-01 11:31:21'),('第2篇','2015-03-11 16:31:21'),('第3篇','2016-07-01 10:21:31'),('第4篇','2016-07-22 09:23:21'),('第5篇','2016-07-23 10:11:11'),('第6篇','2016-07-25 11:21:31'),('第7篇','2017-03-01 15:33:21'),('第8篇','2017-03-01 17:32:21'),('第9篇','2017-03-01 18:31:21');+----+--------------------------------------+---------------------+
| id | NAME | sub_time | month
+----+--------------------------------------+---------------------+
| 1 | 第1篇 | 2015-03-01 11:31:21 | 2015-03
| 2 | 第2篇 | 2015-03-11 16:31:21 | 2015-03
| 3 | 第3篇 | 2016-07-01 10:21:31 | 2016-07
| 4 | 第4篇 | 2016-07-22 09:23:21 | 2016-07
| 5 | 第5篇 | 2016-07-23 10:11:11 | 2016-07
| 6 | 第6篇 | 2016-07-25 11:21:31 | 2016-07
| 7 | 第7篇 | 2017-03-01 15:33:21 | 2017-03
| 8 | 第8篇 | 2017-03-01 17:32:21 | 2017-03
| 9 | 第9篇 | 2017-03-01 18:31:21 | 2017-03
+----+--------------------------------------+---------------------+select count(*) from blog group by month;select date_format(sub_time,'%Y-%m'),count(id) from blog group by date_format(sub_time,'%Y-%m');
https://blog.csdn.net/GG_Bruse/article/details/131484538
流程控制
# if条件语句
delimiter //
CREATE PROCEDURE proc_if ()
BEGINdeclare i int default 0;if i = 1 THENSELECT 1;ELSEIF i = 2 THENSELECT 2;ELSESELECT 7;END IF;END //
delimiter ;# while循环
delimiter //
CREATE PROCEDURE proc_while ()
BEGINDECLARE num INT ;SET num = 0 ;WHILE num < 10 DOSELECTnum ;SET num = num + 1 ;END WHILE ;END //
delimiter ;
索引
数据都是存在硬盘上的,那查询数据不可避免的需要IO操作
索引就是一种数据结构,类似于书的目录。意味着以后再查数据应该先找目录再找数据,而不是用翻页的方式查询数据
索引在MySQL中也叫做’键‘,是存储引擎用于快速找到记录的一种数据结构
primary key、unique key、index key
注意:上面三种key前两种除了有加速查询的效果之外还有额外的约束条件(primary key:非空且唯一,unique key:唯一),而index key没有任何约束功能只会帮你加速查询
本质都是:通过不断地缩小想要获取数据的范围来筛选出最终想要的结果,同时把随机的事件变成顺序的事件,也就是说,有了这种索引机制,我们可以总是用同一种查找方式来锁定数据。
索引的影响
在表中有大量数据的前提下,创建索引速度会很慢(建表的时候,如果明显需要索引,就提前加上
以后实际添加索引的时候,尽量在空表的时候添加,在创建表的时候就添加索引,此时添加索引是最快的
如果表中数据已经有了,还需要添加索引,也可以,只不过创建索引的速度会很慢,不建议这样做
在索引创建完毕后,对表的查询性能会大幅度提升,但是写的性能会降低
但是,写的性能影响不是很大,因为在实际中,写的频率很少,大部分操作都是查询
如何添加索引?到底给哪些字段加索引呢?
'''没有固定答案,具体给哪个字段加索引,要看你实际的查询条件'''
select * from user where name='' and password='';
索引的使用其实是需要大量的工作经验,才能正确的判断出
'''不要一创建表就加索引,在一张表中,最多最多不要超过15个索引,索引越多,性能就会下降'''
如何数据量比较小,不需要加索引,100w一下一般不用加,mysql针对于1000w一下的数据,性能不会下降太多.
b+树
只有叶子结点存放真实数据,根和树枝节点存的仅仅是虚拟数据
查询次数由树的层级决定,层级越低次数越少
一个磁盘块儿的大小是一定的,那也就意味着能存的数据量是一定的。如何保证树的层级最低呢?一个磁盘块儿存放占用空间比较小的数据项
以后加索引的时候,尽量给字段中存的是数字的列加,我们使用主键查询速度很快
select * from user where name = ''
select * from user where id = '' # 主键查询的更快一些
思考我们应该给我们一张表里面的什么字段字段建立索引能够降低树的层级高度>>> 主键id字段
相关文章:
day43
今日内容 python操作MySQL(重要) SQL注入问题(安全相关的xss,csrf) 视图(了解) 触发器(了解) 事务(重要) 存储过程(了解) 内置函数(了解,很多) 流程控制(了解) 索引(重点) python操作MySQL MySQL本身就是一款c/s架构,有服务端、有客户端&…...
终端管理制度
1、总则 1.1、目的 为规范XXXXX单位员工在使用计算机终端过程中的行为,提高计算机终端的安全性,确保员工安全使用计算机终端,特制定本制度。 1.2、范围 本规定适用于在XXXXX单位使用计算机终端的所有员工,包括内部终端和外部终…...
视频相关学习笔记
YUV 和rgb一样是一种表示色彩的格式,Y表示亮度,UV表示色度(U是蓝色投影,V是红色投影),只有Y就是黑白的,所以这个格式的视频图片可以兼容黑白电视,所以彩色电视使用的都是YUV 存储方…...
神经网络中epoch、batch、batchsize区别
目录 1 epoch 2 batch 3 batchsize 4 区别 1 epoch 当数据集中的全部数据样本通过神经网络一次并且返回一次的过程即完成一次训练称为一个epoch。 当我们分批学习时,每次使用过全部训练数据完成一次Forword运算以及一次BP运算,称为完成了一次epoch。 epoch时期 = 所有训练…...
如何将Mysql数据库的表导出并导入到另外的架构
如何将Mysql数据库的表导出并导入到另外的架构 准备一、解决方法1.右键->导出->用mysqldump导出2.注意路径一般为:C:/Program Files/MySQL/MySQL Server 8.0/bin/mysqldump.exe和导出的sql文件位置3.右键->SQL脚本->运行SQL脚本4.找到SQL脚本并点击确定…...
【tio-websocket】9、服务配置与维护—TioConfig
场景 我们在写 TCP Server 时,都会先选好一个端口以监听客户端连接,再创建N组线程池来执行相关的任务,譬如发送消息、解码数据包、处理数据包等任务,还要维护客户端连接的各种数据,为了和业务互动,还要把这些客户端连接和各种业务数据绑定起来,譬如把某个客户端绑定到一…...
数据结构—线性表(下)
文章目录 6.线性表(下)(4).栈与队列的定义和ADT#1.ADT#2.栈的基本实现#3.队列的形式#4.队列的几种实现 (5).栈与队列的应用#1.栈的应用i.后缀表达式求值ii.中缀表达式转后缀表达式 #2.队列的应用 (6).线性表的其他存储方式#1.索引存储#2.哈希存储i.什么是哈希存储ii.碰撞了怎么…...
apisix之插件开发,包含java和lua两种方式
https://download.csdn.net/download/tiantangpw/88475630 有ppt和springboot程序包,可以运行...
【面试经典150 | 链表】合并两个有序链表
文章目录 Tag题目来源题目解读解题思路方法一:递归方法二:迭代 写在最后 Tag 【递归】【迭代】【链表】 题目来源 21. 合并两个有序链表 题目解读 合并两个有序链表。 解题思路 一种朴素的想法是将两个链表中的值存入到数组中,然后对数组…...
【linux】麒麟v10安装Redis主从集群(ARM架构)
安装redis单示例的请看:麒麟v10安装Redis(ARM架构) 安装环境 HostnameIP addressmaster192.168.0.1slave1192.168.0.2slave2192.168.0.3 下载安装包 (三台都操作) wget https://repo.huaweicloud.com/kunpeng/…...
解决k8s删除名称空间无法强制删除的问题
问题起因:删除k8s名称空间的时候(此时名称空间下还有很多pod)一直删不掉,被我强行ctrl c了, 问题表象:然后就出现下面这悲催的一幕了,两个名称空间一直处于Terminating了 [rootmaster02 ~]# ku…...
华为---DHCP中继代理简介及示例配置
DHCP中继代理简介 IP动态获取过程中,客户端(DHCP Client)总是以广播(广播帧及广播IP报文)方式来发送DHCPDISCOVER和DHCPREQUEST消息的。如果服务器(DHCP Server)和 客户端不在同一个二层网络(二…...
五、W5100S/W5500+RP2040树莓派Pico<UDP Client数据回环测试>
文章目录 1. 前言2. 协议简介2.1 简述2.2 优点2.3 应用 3. WIZnet以太网芯片4. UDP Client回环测试4.1 程序流程图4.2 测试准备4.3 连接方式4.4 相关代码4.5 测试现象 5. 注意事项6. 相关链接 1. 前言 UDP是一种无连接的网络协议,它提供了一种简单的、不可靠的方式来…...
死锁Deadlock
定义 死锁是指两个或多个线程互相持有对方所需的资源,从而导致它们无法继续执行的情况。如下图所示,现有两个线程,分别是线程A及线程B,线程A持有锁A,线程B持有锁B。此时线程A想获取锁B,但锁B需等到线程B的结…...
【spark客户端】Spark SQL CLI详解:怎么执行sql文件、注释怎么写,支持的文件路径协议、交互式模式使用细节
文章目录 一. Spark SQL Command Line Options(命令行参数)二. The hiverc File1. without the -i2. .hiverc 介绍 三. 支持的路径协议四. 支持的注释类型五. Spark SQL CLI交互式命令六. Examples1. running a query from the command line2. setting Hive configuration vari…...
虹科干货 | HK-TrueNAS版本大揭秘!一文教您如何选择合适的TrueNAS软件
文章来源:虹科网络基础设施 阅读原文:https://mp.weixin.qq.com/s/Iv0zDDmiDgE9vEGlAZs-sg 1.导语 TrueNAS是虹科iXsystems 设计和开发的NAS 操作系统,提供许多功能,例如文件存储、虚拟机 (VM) 和媒体服务器。它基于…...
前端html+css+js实现的2048小游戏,很完善。
源码下载地址 支持:远程部署/安装/调试、讲解、二次开发/修改/定制 逻辑用的是JavaScript,界面用canvas实现,暂时还没有添加动画。 视频浏览地址...
学习通签到
要在Vue中使用H5lock.js,首先需要将H5lock.js引入到项目中。可以通过以下步骤来使用: 1. 将H5lock.js文件保存到项目中的某个目录下,例如src/assets文件夹。 2. 在需要使用H5lock.js的组件中,通过import语句将H5lock.js引入进来…...
target采退、测评养号购物下单操作教程
1.点击右上角的Create account注册账号 2.填写账号信息 3. 进入自己需要购买的商品页面 点击pick it up购买 4. 进入购物车页面选择快递方式和地址后点击 check out按钮 5. 之后会提示绑定XYK,这里我是用虚拟XYK开卡平台进行支付的. 6. 确认订单无误后点击Place you…...
SEACALL海外呼叫中心系统的优势包括
SEACALL海外呼叫中心系统的优势包括 封卡封号问题解决 海外呼叫中心系统通过API开放平台能力,定制电话营销系统,提供多项功能如自动拨打、智能应答、真人语音交互等,帮助企业克服员工离职率高、客户资源流失严重等挑战。 - 高级管理者操控 …...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
生成xcframework
打包 XCFramework 的方法 XCFramework 是苹果推出的一种多平台二进制分发格式,可以包含多个架构和平台的代码。打包 XCFramework 通常用于分发库或框架。 使用 Xcode 命令行工具打包 通过 xcodebuild 命令可以打包 XCFramework。确保项目已经配置好需要支持的平台…...
华硕a豆14 Air香氛版,美学与科技的馨香融合
在快节奏的现代生活中,我们渴望一个能激发创想、愉悦感官的工作与生活伙伴,它不仅是冰冷的科技工具,更能触动我们内心深处的细腻情感。正是在这样的期许下,华硕a豆14 Air香氛版翩然而至,它以一种前所未有的方式&#x…...
STM32HAL库USART源代码解析及应用
STM32HAL库USART源代码解析 前言STM32CubeIDE配置串口USART和UART的选择使用模式参数设置GPIO配置DMA配置中断配置硬件流控制使能生成代码解析和使用方法串口初始化__UART_HandleTypeDef结构体浅析HAL库代码实际使用方法使用轮询方式发送使用轮询方式接收使用中断方式发送使用中…...
认识CMake并使用CMake构建自己的第一个项目
1.CMake的作用和优势 跨平台支持:CMake支持多种操作系统和编译器,使用同一份构建配置可以在不同的环境中使用 简化配置:通过CMakeLists.txt文件,用户可以定义项目结构、依赖项、编译选项等,无需手动编写复杂的构建脚本…...
Python训练营-Day26-函数专题1:函数定义与参数
题目1:计算圆的面积 任务: 编写一个名为 calculate_circle_area 的函数,该函数接收圆的半径 radius 作为参数,并返回圆的面积。圆的面积 π * radius (可以使用 math.pi 作为 π 的值)要求:函数接收一个位置参数 radi…...
倒装芯片凸点成型工艺
UBM(Under Bump Metallization)与Bump(焊球)形成工艺流程。我们可以将整张流程图分为三大阶段来理解: 🔧 一、UBM(Under Bump Metallization)工艺流程(黄色区域ÿ…...
解析“道作为序位生成器”的核心原理
解析“道作为序位生成器”的核心原理 以下完整展开道函数的零点调控机制,重点解析"道作为序位生成器"的核心原理与实现框架: 一、道函数的零点调控机制 1. 道作为序位生成器 道在认知坐标系$(x_{\text{物}}, y_{\text{意}}, z_{\text{文}}…...
ArcPy扩展模块的使用(3)
管理工程项目 arcpy.mp模块允许用户管理布局、地图、报表、文件夹连接、视图等工程项目。例如,可以更新、修复或替换图层数据源,修改图层的符号系统,甚至自动在线执行共享要托管在组织中的工程项。 以下代码展示了如何更新图层的数据源&…...
表单设计器拖拽对象时添加属性
背景:因为项目需要。自写设计器。遇到的坑在此记录 使用的拖拽组件时vuedraggable。下面放上局部示例截图。 坑1。draggable标签在拖拽时可以获取到被拖拽的对象属性定义 要使用 :clone, 而不是clone。我想应该是因为draggable标签比较特。另外在使用**:clone时要将…...
