当前位置: 首页 > news >正文

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录

  • S07L32 Exercise 09 - Macros
    • 1 训练目标
    • 2 操作指令
      • 2.1. 打开 macros-practice.txt 文件
      • 2.2. 练习1:将旧版 Python 代码转换为新版写法
      • 2.3. 练习2:根据列表内容批量创建 Shell 脚本
      • 2.4. 练习3:对电话号码作格式化处理
      • 2.5. 练习4:从日志文件中提取重要数据
      • 2.6. 练习5:将多行数据压缩为一行
      • 2.7. 练习6:从 HTML 中提取数据
    • 3 退出 Vim
  • S07L33 Exercise 09 - Macros - Walkthrough

写在前面
Vim 宏这部分知识点不仅讲解起来篇幅最长,同步练习环节的作业量也是全套课程中最多的。宏在 Vim 操作中不可撼动的核心地位由此可见一般。虽然今天有事耽搁了笔记整理,到家后的第一件事仍然是一步一个脚印地先在本地做一遍所有习题,然后再对照讲义完成翻译。这个过程不可能很快,但也是掌握 Vim 宏相关要点不可或缺的重要环节。我用自己的亲身经历奉劝各位,切忌急于求成,尤其不要在该筑牢基础的地方吝惜自己的时间和精力。要相信水滴石穿的力量,相信玉汝于成,功不唐捐。同步练习中列举的几个典型案例值得大家反复琢磨与演练。

S07L32 Exercise 09 - Macros


1 训练目标

练习 Vim 中的宏(macro)的创建与使用。1

2 操作指令

2.1. 打开 macros-practice.txt 文件

Vim 打开源码包内的练习文件 macros-practice.txt(默认解压到 Downloads 文件夹下):

cd Downloads
cd vimclass
vim macros-practice.txt

2.2. 练习1:将旧版 Python 代码转换为新版写法

给定一组旧版 Python 代码(v2.6 及以前版本),试将其改为新版写法(v3.0 即以上版本):将 print 语句改为 print() 函数。也就是说,需要对以下各行作如下处理——

由修改前的:

print "Macros are very fun!"

统一改为:

print("Macros are very fun!")

下面用 Vim 宏来实现。顺便提一下,本练习无需了解 Python 语法,本例旨在提供一个实际案例来练习 Vim 宏的相关操作。

其中一种参考方案实现如下:

  • 光标定位到这一行:print "Macros are very fun!"
  • QA 启动宏录制并将其存入寄存器 "a
  • 0 对光标作标准化处理,统一定位到行首;
  • FSpace 将光标定位到下一处空格位置;
  • R( 将当前空格替换为左小括号;
  • ShiftA) 在行尾添加一个右小括号,再按 Escape 切回正常模式;
  • J 将光标下移一行,以便 Vim 宏快速重复操作;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "a 中的录制内容,可输入命令 :reg a + Enter。内容如下:

"a 0f r(A)^[j

键入 @A 即可对下一行运行录好的宏;若要重复执行上一次宏操作,按 @@ 即可。余下各行均可使用 @@ 重复宏的运行。

注意

上述实现仅供参考,并非唯一的解决方案。例如将 FSpace 改为 T",也能将光标定位到同一处空格。只要能实现最终的效果就行。


2.3. 练习2:根据列表内容批量创建 Shell 脚本

给定一个用户列表,要求对列表中的每个用户分别执行一组相同的操作。为此,可以将某个用户的一系列操作录制为一个 Vim 宏,然后对其余用户执行这个宏即可。最终目标是将如下这段文本:

jason
sophia
jack
emma
ava

统一改为以下形式:

passwd -l jason && echo jason >> locked_users.txt
passwd -l sophia && echo sophia >> locked_users.txt
passwd -l jack && echo jack >> locked_users.txt
passwd -l emma && echo emma >> locked_users.txt
passwd -l ava && echo ava >> locked_users.txt

这组命令用户锁定 Linux 系统中的指定用户帐号,并将其帐号名追加到一个 locked_users.txt 文件中。命令的含义无关紧要,关键在于 Vim 的用法。本练习旨在提供一个实际的应用场景。

其中一种参考方案实现如下:

  • 将光标定位到 jason 这一行;
  • QB 启动宏录制,并将其存入寄存器 "b
  • YAW 将用户名复制(yank)到默认寄存器;
  • ShiftI 从行首进入插入模式,并输入 passwd -l + Escape
  • ShiftA 从行尾进入插入模式,并输入 Space + && + Space + echo + Space + Escape 返回正常模式;
  • 接着,按 P 粘贴未命名寄存器(unnamed register)中的内容;
  • A,并输入 Space + >> + Space + locked_users.txt,再按 Escape 切回正常模式;
  • J 将光标下移一行,以便快速重复宏操作;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "b 中的录制内容,可输入命令 :reg b + Enter。内容如下:

"b yawIpasswd -l ^[A && echo ^[pa >> locked_users.txt^[j

对下一行执行宏操作,输入 @B 即可;后面三个类似的文本行,则可以用 3@B 轻松实现批量修改。


2.4. 练习3:对电话号码作格式化处理

接下来,创建一个 Vim 宏并存入寄存器 "p,实现将如下所示的电话号码:

2798265253

统一转换为符合美国人书写习惯的格式:

(279) 826-5253

其中一种参考方案实现如下:

  • 将光标定位到 2798265253 这一行(即待批量处理的第一行);
  • QP 启动宏录制,并将其存入寄存器 "p
  • ShiftI 从行首进入插入模式;
  • 输入左小括号 (,并按 Escape 回到正常模式;
  • 键入三次 L,让光标定位到 9 处;
  • A 在光标后添加文字,输入 )Space 后,按 Escape 返回正常模式。
  • 按三次 L 将光标移至 6 的下方;
  • A- 插入一个连字符,再按 Escape 回到正常模式;
  • J 将光标下移一行,以便快速重复宏操作;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "p 中的录制内容,可输入命令 :reg p + Enter。内容如下:

"p I(^[llla) ^[llla-^[j

鉴于要处理的电话号码很多,文本行超出了屏幕,难以轻易获知需要重置执行多少次宏;此外,单纯使用 @@ 来重复执行也很费时间。此时应该使用指定具体范围来应用宏操作。先用 :set nu 开启行号,再将光标定位到第 25 行;然后按 Ctrl + F 向下翻页,确定最后一个电话号码的行号为 73。

接着输入 :25,73 normal @p + Enter,通过 normal 命令指定具体范围并批量运行宏操作。之后再通过 Ctrl + B 上翻查看宏的执行情况。


2.5. 练习4:从日志文件中提取重要数据

下一组练习取材自 Linux 服务器的系统日志。这些内容是本地 Linux 防火墙阻止连接请求的日志记录。我们的目标是分别提取出时间戳、尝试连接的源 IP 地址以及目标端口。

其中,SRC= 字样后的内容即为源 IP 地址,例如:SRC=190.18.193.152

目标端口则位于 DPT= 字样后,例如:DPT=23

也就是利用 Vim 宏(假设录制到寄存器 "l)将下面这样的日志内容:

Jan 13 09:57:01 www1 kernel: [3947771.808744] [BLOCK] IN=eth0 OUT= MAC=e6:e9:2d:04:b6:95:3c:8a:b0:0d:6f:f0:08:00 SRC=190.18.193.152 DST=2.5.9.1 LEN=40 TOS=0x02 PREC=0x00 TTL=51 ID=25120 PROTO=TCP SPT=12502 DPT=23 WINDOW=4078 RES=0x00 SYN URGP=0

批量精简为如下版本,并以逗号分隔:

Jan 13 09:57:01,190.188.193.152,23

其中一种参考方案实现如下:

  • 将光标定位到以 Jan 13 09:57:01 开头的这一行;
  • QL 启动宏录制,并将其存入寄存器 "l
  • 0 对光标作标准化处理,统一定位到行首;
  • TW 将光标定位到时间戳后面的空格为止;
  • 输入 dtS 删除当前光标到 SRC= 之间的所有内容;
  • DW 删除 SRC
  • R,= 替换为逗号 ,
  • FSpace 将光标定位到 IP 地址后的空格处;
  • 输入 d/DPT + Enter 删除当前光标与 DPT= 之间的文字内容;
  • DW 删除 DPT
  • R, 再将 = 替换为逗号 ,
  • FSpace 将光标定位到端口号后面的空格处;
  • ShiftD 删除这一行当前光标及其后面的剩余内容;
  • J 将光标下移一行,以便快速重复宏操作;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "l 中的录制内容,可输入命令 :reg l + Enter。内容如下:

"l 0twdtSdwr,f d/DPT^Mdwr,f Dj

同样,还有其他方式可以实现上述任务。例如,要将 SRC= 改为 ,,除了用上面的 DWR 实现,还可以使用 2CW。不妨停下来思考一下类似的备选方案对录制的宏进行修改,看看能否达到同样的效果。

若要对下一行日志执行录制的宏,输入 @L 即可。如果没问题,就用 @@ 重复执行,直至处理完剩下的日志内容。


2.6. 练习5:将多行数据压缩为一行

再次强调,宏录制的是一系列按键操作。尽管我们一直在单行内容上练习宏的相关操作,宏也可以作用于多行。假如需要将下列三行通过录制的宏(假设存入寄存器 "c)按要求处理为一行,即从之前的:

Country China
1,380,950,000 people

处理为:

1,380,950,000;China

其中一种参考方案实现如下:

  • 将光标定位到以 Country China 开头的这一行;
  • QC 启动宏录制,并将其存入寄存器 "c
  • 0 对光标作标准化处理,统一定位到行首;
  • DW 删除单词 Country
  • J 将光标下移一行;
  • DShiftW 将数字存入未命名寄存器(unnamed register);
  • K 上移光标到刚才那行;
  • ShiftP 将数字粘贴到光标位置的前方;
  • R; 将空格替换为分号;
  • J 将光标下移一行;
  • 2DD 删除当前行与下一行内容;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "c 中的录制内容,可输入命令 :reg c + Enter。内容如下:

"c 0dwjdWkPr;j2dd

接着,可以通过引入数量词,即 4@C,将上述宏操作再重复执行四次,实现该组数据的批量处理。

同样,要在 Vim 中实现上述效果还有很多其他方案可供选择。


2.7. 练习6:从 HTML 中提取数据

下列这行文本为一组 HTML 链接列表(即 <a> 标签):

<a href="#">@armyspy.com</a><a href="#">@cuvox.de</a><a href="#">@dayrep.com</a><a href="#">@einrot.com</a><a href="#">@fleckens.hu</a><a href="#">@gustr.com</a><a href="#">@jourrapide.com</a><a href="#">@rhyta.com</a><a href="#">@superrito.com</a><a href="#">@teleworm.us</a>

最终需要通过 Vim 宏(假设存入寄存器 "q)处理成下列效果:

armyspy.com
cuvox.de
dayrep.com
einrot.com
fleckens.hu
gustr.com
jourrapide.com
rhyta.com
superrito.com
teleworm.us

其中一种参考方案实现如下:

  • 将光标定位到以 <a 开头的文本行;
  • QQ 启动宏录制,并将其存入寄存器 "q
  • DF@ 删除当前光标到 @ 之间(包含 @)的所有内容;
  • F< 将光标定位到下一处 < 位置;
  • CF> + Enter + Escape,将 </a> 替换为一个换行标记;
  • 最后,按 Q 停止宏录制。

要查看寄存器 "q 中的录制内容,可输入命令 :reg q + Enter。内容如下:

"q df@f<cf>^M^[

输入 @Q 即可运行这个宏。继续重复执行,按 @@ 即可,直至处理完其余链接内容。

3 退出 Vim

若要放弃文件变更以便下次重新练习,使用退出命令 :q! + Enter

S07L33 Exercise 09 - Macros - Walkthrough

本节为同步练习点评课,视频本身没有增补知识点。这里仅对实操过程中的几个问题进行复盘:

  • 除了宏录制前后需要注意光标的归一化处理(即回到行首、下移一行之类),还应将运行宏操作前的 内容查看环节 作为另一项最佳实践(上述练习均包含该步骤)。这样做,一来可以直观了解用到的特殊符号的写法;二来可以及时发现操作过程中出现的问题;
  • 在重复运行宏时,如果此前从未执行过宏,使用 @@ 可能会出错。最好先用 @{macro_name} 的形式运行宏;
  • 批量处理最容易出错的地方,往往不在待处理内容中间,而在 最后一个待处理项 上。例如练习 6 中的链接内容提取,第一次尝试录制宏时,在分离 </a><a> 时选择了先删除 </a> 再用 I 键插入一个回车符。处理到最后一个链接时,由于闭标签后没有下一个 <a>,再用 I 键插入回车符会让最后一个字符 s 与前面的内容分离。既然是批量操作,就应当一气呵成,切忌在这样的临界点位置拖泥带水。

  1. 本节练习另附精美排版 PDF 格式,阅读体验更佳,详见:vimclass/Exercise-09-Macros.pdf ↩︎

相关文章:

【Vim Masterclass 笔记16】S07L32 + L33:同步练习09 —— 掌握 Vim 宏操作的六个典型案例(含点评课内容)

文章目录 S07L32 Exercise 09 - Macros1 训练目标2 操作指令2.1. 打开 macros-practice.txt 文件2.2. 练习1&#xff1a;将旧版 Python 代码转换为新版写法2.3. 练习2&#xff1a;根据列表内容批量创建 Shell 脚本2.4. 练习3&#xff1a;对电话号码作格式化处理2.5. 练习4&…...

LabVIEW 实现线路板 PCB 可靠性测试

在电子设备制造领域&#xff0c;线路板 PCB&#xff08;Printed Circuit Board&#xff09;的可靠性直接影响产品的整体性能和使用寿命。企业在生产新型智能手机主板时&#xff0c;需要对 PCB 进行严格的可靠性测试&#xff0c;以确保产品在复杂环境下能稳定运行。传统的测试方…...

深入内核讲明白Android Binder【二】

深入内核讲明白Android Binder【二】 前言一、Binder通信内核源码整体思路概述1. 客户端向服务端发送数据流程概述1.1 binder_ref1.2 binder_node1.3 binder_proc1.4 binder_thread 2. 服务端的binder_node是什么时候被创建的呢&#xff1f;2.1 Binder驱动程序为服务创建binder…...

TextButton组件的功能与用法

文章目录 1 概念介绍2 使用方法3 示例代码 我们在上一章回中介绍了CircleAvatar Widget,本章回中将介绍Button这种Widget&#xff0c;闲话休提&#xff0c;让我们一起Talk Flutter吧。 1 概念介绍 关于Button相信大家都很熟悉&#xff0c;也就是我们常用的按钮。用户按下按钮后…...

HTML5+Canvas实现的鼠标跟随自定义发光线条源码

源码介绍 HTML5Canvas实现的鼠标跟随自定义发光线条特效源码非常炫酷&#xff0c;在黑色的背景中&#xff0c;鼠标滑过即产生彩色变换的发光线条效果&#xff0c;且线条周围散发出火花飞射四溅的粒子光点特效。 效果预览 源码如下 <!DOCTYPE html PUBLIC "-//W3C//D…...

AS自治系统

引言 通过前几天的学习&#xff0c;我们基本了解了静态路由&#xff0c;有静态就肯定有动态&#xff0c;那他们又有哪些区别呢&#xff1f; 静态路由&#xff1a;由网络管理员手工填写的路由信息。动态路由&#xff1a;所有路由器运行相同路由协议&#xff0c;之后&#xff0c;…...

PyQt6 与 REST API:如何实现桌面应用与 Web 服务的无缝对接

PyQt6 与 REST API&#xff1a;如何实现桌面应用与 Web 服务的无缝对接 今日水一篇 在当今互联网时代&#xff0c;数据交互无处不在。桌面应用与 Web 服务的结合&#xff0c;能够为用户提供更丰富、更实时的功能体验。本文将介绍如何利用 PyQt6 实现桌面应用与 REST API 的无…...

endnote x9 如何将参考文献和文中的应用格式由annotated变为编码,例[1],[2]

在 EndNote X9 中&#xff0c;将参考文献和文中引用格式更改为编码形式&#xff08;如 [1], [2]&#xff09;需要以下步骤&#xff1a; 1. 选择合适的输出样式 打开 EndNote X9。点击菜单栏的 "Edit" > "Output Styles" > "Open Style Manage…...

题解 CodeForces 430B Balls Game 栈 C/C++

题目传送门&#xff1a; Problem - B - Codeforceshttps://mirror.codeforces.com/contest/430/problem/B翻译&#xff1a; Iahub正在为国际信息学奥林匹克竞赛&#xff08;IOI&#xff09;做准备。有什么比玩一个类似祖玛的游戏更好的训练方法呢&#xff1f; 一排中有n个球…...

管理口令安全和资源(二)

DBMS_METADATA DBMS_METADATA 是 Oracle 数据库中的一个包&#xff0c;它提供了用于管理数据库元数据的工具和过程。元数据是关于数据的数据&#xff0c;它描述了数据库的结构&#xff0c;包括表、视图、索引、存储过程、用户和其他数据库对象的信息。DBMS_METADATA 包允许用户…...

【漏洞预警】FortiOS 和 FortiProxy 身份认证绕过漏洞(CVE-2024-55591)

文章目录 一、产品简介二、漏洞描述三、影响版本四、漏洞检测方法五、解决方案 一、产品简介 FortiOS是Fortinet公司核心的网络安全操作系统&#xff0c;广泛应用于FortiGate下一代防火墙&#xff0c;为用户提供防火墙、VPN、入侵防御、应用控制等多种安全功能。 FortiProxy则…...

Cadence笔记--原理图导入PCB

1、以PMU6050为例&#xff0c;首先在原理图双击PMU6050器件&#xff0c;在PCB_Footprint目录填写PCB封装名称并且保存&#xff0c;如下图所示&#xff1a; 2、确保原理图命名的名称不一样&#xff0c;否则会出错&#xff0c;这里PMU6050更改了NC等名称&#xff0c;如下图所示&a…...

TOSUN同星TsMaster使用入门——3、使用系统变量及c小程序结合panel面板发送报文

本篇内容将介绍TsMaster中常用的Panel面板控件以及使用Panel控件通过系统变量以及c小程序来修改信号的值&#xff0c;控制报文的发送等。 目录 一、常用的Panel控件介绍 1.1系统——启动停止按钮 1.2 显示控件——文本框 1.3 显示控件——分组框 1.4 读写控件——按钮 1.…...

Redis 缓存穿透、击穿、雪崩 的区别与解决方案

前言 Redis 是一个高性能的键值数据库&#xff0c;广泛应用于缓存、会话存储、实时数据分析等场景。然而&#xff0c;在高并发的环境下&#xff0c;Redis 缓存可能会遇到 缓存击穿、缓存穿透 和 缓存雪崩 这三大问题。这些问题不仅影响系统的稳定性和性能&#xff0c;还经常出…...

用Cursor生成一个企业官网前端页面(生成腾讯、阿里官网静态页面)

用Cursor生成一个企业官网前端页面 第一版&#xff1a; <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><…...

北京市房屋建筑物轮廓shp数据arcgis高度字段内容下载分析

标题中的“北京市房屋建筑物轮廓shp数据arcgis高度字段”涉及到的是地理信息系统&#xff08;GIS&#xff09;中的数据格式和属性字段。在GIS领域&#xff0c;SHP&#xff08;Shapefile&#xff09;是一种常见的矢量数据格式&#xff0c;用于存储地理空间特征&#xff0c;如点、…...

深度学习常见术语解释

正例与负例&#xff1a; 在分类任务中&#xff0c;通常将目标类别称为正例&#xff08;positive&#xff09;&#xff0c;非目标类别称为负例&#xff08;negative&#xff09;。 True Positives&#xff08;TP&#xff09;&#xff1a; 被正确地划分为正例的个数&#xff0c;…...

《内网穿透:网络拓展与安全防护的平衡艺术》

一、引言&#xff1a;开启内网穿透的大门 在当今数字化浪潮席卷全球的时代&#xff0c;网络已成为人们生活和工作中不可或缺的一部分。我们日常使用的网络&#xff0c;如同一个庞大而复杂的生态系统&#xff0c;其中内网和外网犹如两个相互关联却又有所区别的世界。 想象一下…...

文件读取和输入输出

文件指针 在C语言中&#xff0c;文件操作是通过文件指针来进行的。文件指针是一个指向 FILE 结构的指针&#xff0c;用于标识和操作一个文件。 FILE *fp; 常用的文件操作函数 fopen&#xff1a;打开文件。fclose&#xff1a;关闭文件。fread&#xff1a;从文件中读取数据。…...

【Linux系列】查看服务器是否使用了 SSD 的多种方法

&#x1f49d;&#x1f49d;&#x1f49d;欢迎来到我的博客&#xff0c;很高兴能够在这里和您见面&#xff01;希望您在这里可以感受到一份轻松愉快的氛围&#xff0c;不仅可以获得有趣的内容和知识&#xff0c;也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…...

基础入门-传输加密数据格式编码算法密文存储代码混淆逆向保护安全影响

知识点&#xff1a; 1、传输格式&传输数据-类型&编码&算法 2、密码存储&代码混淆-不可逆&非对称性 一、演示案例-传输格式&传输数据-类型&编码&算法 传输格式 JSON XML WebSockets HTML 二进制 自定义 WebSockets&#xff1a;聊天交互较常…...

通过idea创建的springmvc工程需要的配置

在创建的spring mvc工程中&#xff0c;使用idea开发之前需要配置文件包括porm.xml、web.xml、springmvc.xml 1、porm.xml 工程以来的spring库&#xff0c;主要包括spring-aop、spring-web、spring-webmvc&#xff0c;示例配置如下&#xff1a; <project xmlns"http:/…...

PyTest自学-认识PyTest

1 PyTest自学-认识PyTest 1.1 PyTest可以用来做什么&#xff1f; PyTest是一个自动化测试框架&#xff0c;支持单元测试和功能测试&#xff0c;有丰富的插件&#xff0c;如&#xff0c;pytest-selemium, pytest-html等。 1.2 安装pytest 使用pip install -U pytest。 1.3 py…...

JavaScript系列(31)--装饰器详解

JavaScript装饰器详解 &#x1f3a8; 今天&#xff0c;让我们深入探讨JavaScript的装饰器&#xff08;Decorators&#xff09;。装饰器是一种用于修改类和类成员的强大语言特性&#xff0c;它让我们能够以声明式的方式增强类的功能。 装饰器基础概念 &#x1f31f; &#x1f…...

培养未来:2024年少儿编程教育的实践与思考

目录 引言 &#xff1a; 正文&#xff1a; 一、Scratch教学的深化 二、代码编程的多样化 三、赛教融合驱动 四、社区互动与共同成长 结语 &#xff1a; 引言 &#xff1a; 在快速发展的科技时代&#xff0c;编程教育作为培养未来技术人才的重要环节&#xff0c;不断经历…...

ComfyUI-PromptOptimizer:文生图提示优化节点

ComfyUI-PromptOptimizer 是 ComfyUI 的一个自定义节点&#xff0c;旨在优化文本转图像模型的提示。它将用户输入的提示转换为更详细、更多样化、更生动的描述&#xff0c;使其更适合生成高质量的图像。无需本地模型。 1、功能 提示优化&#xff1a;优化用户输入的提示以生成…...

用户中心项目教程(三)---再谈nvm,nodejs和神器Geek

目录 1.昨日回顾 2.nodejs&&nvm使用 2.1问题抛出 2.2解决方案 3.geek的使用 3.1页面展示 3.2下载链接 3.3如何使用 4.按照官方文档操作 4.1官方文档 4.2我的演示 4.3可能出现的问题 1.昨日回顾 我依稀记得昨天的时候关于这个umi3相关的兼容性问题导致的这个…...

CSS布局新视角:BFC(块级格式化上下文)的作用与优势

在CSS布局的世界中&#xff0c;BFC&#xff08;Block Formatting Context&#xff0c;块级格式化上下文&#xff09;是一个既重要又神秘的概念。它不仅是解决复杂布局问题的关键工具&#xff0c;也是提升页面性能和用户体验的重要手段。本文将从新视角出发&#xff0c;深入探讨…...

智能化植物病害检测:使用深度学习与图像识别技术的应用

植物病害一直是农业生产中亟待解决的问题&#xff0c;它不仅会影响作物的产量和质量&#xff0c;还可能威胁到生态环境的稳定。随着人工智能&#xff08;AI&#xff09;技术的快速发展&#xff0c;尤其是深度学习和图像识别技术的应用&#xff0c;智能化植物病害检测已经成为一…...

Spring Boot Actuator 详细介绍

Spring Boot Actuator 详细介绍 1. 简介 Spring Boot Actuator 是 Spring Boot 提供的一个用于监控和管理应用程序的强大功能模块。它可以帮助我们了解应用程序的运行状况、指标收集、环境信息、日志级别管理等。 2. 添加依赖 2.1 在 pom.xml 中添加以下依赖&#xff1a; …...

微软确认Win10停更不碍Microsoft 365使用!未来是否更新成谜

快科技1月17日消息&#xff0c;微软澄清了关于Windows 10停止支持后Microsoft 365办公套件使用情况的误解。 前两天微软更新支持文档&#xff0c;表示2025年10月14日Windows 10停止支持之后&#xff0c;Microsoft 365应用程序将不再支持Windows 10设备&#xff0c;引发用户担忧…...

uniapp 微信小程序 editor 富文本编辑器

<view class"inp boxsizing"><view class"contentBox"><!-- 富文本编辑器 --><view classwrapper><view classtoolbar tap"format"><view :class"formats.bold ? ql-active : " class"iconfon…...

数据结构学习笔记——排序

排序 1. 排序相关概念 稳定性&#xff1a;关键字相同的数据记录&#xff0c;排序后相对顺序仍保持不变 例如&#xff0c;两个25&#xff0c;在排序完后&#xff0c;有*的25仍在后方&#xff0c;说明该排序算法是稳定的 内部排序&#xff1a;数据元素全部放在内存中的排序 外…...

CSS 样式 margin:0 auto; 详细解读

一、基本语法 margin 属性是用于设置元素的外边距&#xff0c;它可以接受一个、两个、三个或四个值。 margin:0 auto 是一种简洁的写法&#xff0c;其中包含了两个值。 二、值的含义 第一个值 0 表示元素的上下外边距为 0。这意味着该元素的顶部和底部与相邻元素或父元素之间…...

leetcode24-两两交换链表中的节点

leetcode 24 思路 本题仍然引入虚拟头节点来实现会更加简单&#xff0c;因为不用单独考虑对于头节点进行交换的场景对于边界条件考虑更少&#xff0c;交换的步骤按照下图中的步骤来 首先将dummy->22->11->3 但是在第一步的时候&#xff0c;dummy->2&#xff0c…...

项目开发实践——基于SpringBoot+Vue3实现的在线考试系统(六)

文章目录 一、考试管理模块实现1、添加考试功能实现1.1 页面设计1.2 前端功能实现1.3 后端功能实现1.4 效果展示2、考试管理功能实现2.1 页面设计2.2 前端功能实现2.3 后端功能实现2.3.1 后端查询接口实现2.3.2 后端编辑接口实现2.3.3 后端删除接口实现2.4 效果展示二、代码下载…...

flutter的web页面

有几个服务器 有几个后台 直接通过web端进去虽然说很方便&#xff0c;但… 于是把web页面镶嵌到应用里面去&#xff0c; 这样就换了个方式打开web页面了 比如这里有有个列表 这里是写死了&#xff0c;活的列表可以通过io去获取 import package:flutter/material.dart; imp…...

YOLOv10改进,YOLOv10检测头融合RFAConv卷积,添加小目标检测层(四头检测)+CA注意机制,全网首发

摘要 空间注意力已广泛应用于提升卷积神经网络(CNN)的性能,但它存在一定的局限性。作者提出了一个新的视角,认为空间注意力机制本质上解决了卷积核参数共享的问题。然而,空间注意力生成的注意力图信息对于大尺寸卷积核来说是不足够的。因此,提出了一种新型的注意力机制—…...

使用vue-next-admin框架后台修改动态路由

vue-next-admin框架是一个基于 Vue 3 和 Vite 构建的后台管理系统框架。它采用了最新的前端技术栈&#xff0c;旨在提供一个高效、灵活、现代化的管理后台解决方案。该框架主要用于构建功能丰富且易于定制的管理后台应用&#xff0c;适合各种中大型项目。 其主要特点包括&am…...

Windows蓝牙驱动开发-经典蓝牙音频

本文介绍 Windows 中的蓝牙经典音频功能。 蓝牙经典音频支持通过高级音频分发配置文件(A2DP)和单声道播放和通过免手配置文件(HFP)进行立体声音频播放。 Windows 支持各种音频编解码器和采样率&#xff0c;具体取决于 Windows 版本、耳机的功能以及音频设备的播放或捕获功能的当…...

力扣动态规划-3【算法学习day.97】

前言 ###我做这类文章一个重要的目的还是给正在学习的大家提供方向&#xff08;例如想要掌握基础用法&#xff0c;该刷哪些题&#xff1f;建议灵神的题单和代码随想录&#xff09;和记录自己的学习过程&#xff0c;我的解析也不会做的非常详细&#xff0c;只会提供思路和一些关…...

如何将本地电脑上的文件夹设置为和服务器的共享文件夹

将本地电脑上的文件夹设为与服务器共享的文件夹&#xff0c;通常是在本地开启文件共享&#xff0c;并配置相应的权限&#xff0c;使服务器可以访问该文件夹。以下以 Windows 系统为例说明具体操作步骤&#xff1a; 一、在本地电脑上设置共享文件夹 选择文件夹 找到需要共享的文…...

自己搭建远程桌面服务器-RustDesk(小白版)

1.RustDesk简介 此软件主要功能为远程各种设备&#xff08;其中包括Windows、macOS、Linux、iOS、Android、Web等&#xff09; 支持文件传输&#xff08;可直接拷贝远程电脑的文件&#xff0c;类似向日葵的远程文件&#xff09; 支持内网穿透&#xff08;支持端口映射&#…...

一文读懂服务器的HBA卡

什么是 HBA 卡 HBA 卡&#xff0c;全称主机总线适配器&#xff08;Host Bus Adapter&#xff09; &#xff0c;是服务器与存储装置间的关键纽带&#xff0c;承担着输入 / 输出&#xff08;I/O&#xff09;处理及物理连接的重任。作为一种电路板或集成电路适配器&#xff0c;HBA…...

Android SystemUI——CarSystemBar车载状态栏(九)

上一篇文章我们介绍了车载开发中的 CarSystemUI,而车载开发中的状态栏也被 CarSystemBar 所取代,这里我们就来看看一下车载系统中的状态栏——CarSystemBar。 一、车载状态栏创建 1、CarSystemBar 源码位置:/packages/apps/Car/SystemUI/src/com/android/systemui/car/sy…...

干货答疑分享记录:as导入问题,LSP含义,分屏进入SplashScreen

背景&#xff1a; vip学员群经常会有学员遇到一些常见的android framework开发问题&#xff0c;近期收集整理一些疑问&#xff0c;主要有以下3个&#xff1a; 1、android studio对源码进行导入时候&#xff0c;老是无法跳转到系统source code 2、学员在群里询问dumpOtherPro…...

WPS数据分析000001

目录 一、表格的新建、保存、协作和分享 新建 保存 协作 二、认识WPS表格界面 三、认识WPS表格选项卡 开始选项卡 插入选项卡 页面布局选项卡 公式选项卡 数据选项卡 审阅选项卡 视图选项卡 会员专享选项卡 一、表格的新建、保存、协作和分享 新建 ctrlN------…...

单独编译QT子模块

单独编译QT子模块 系统 win qt-everywhere-src-5.12.12 下载源码&#xff1a; https://download.qt.io/archive/qt/5.12/5.12.12/single/ 参考&#xff1a; https://doc.qt.io/qt-5/windows-building.html 安装依赖 https://doc.qt.io/qt-5/windows-requirements.html Per…...

Ubuntu20.4和docker终端指令、安装Go环境、安装搜狗输入法、安装WPS2019:保姆级图文详解

目录 前言1、docker、node、curl版本查看终端命令1.1、查看docker版本1.2、查看node.js版本1.3、查看curl版本1.4、Ubuntu安装curl1.5、Ubuntu终端保存命令 2、安装docker-compose、Go语言2.1、安装docker-compose2.2、go语言安装步骤2.3、git版本查看 3、Ubuntu20.4安装搜狗输…...

HarmonyOS NEXT应用开发边学边玩系列:从零实现一影视APP (五、电影详情页的设计实现)

在上一篇文章中&#xff0c;完成了电影列表页的开发。接下来&#xff0c;将进入电影详情页的设计实现阶段。这个页面将展示电影的详细信息&#xff0c;包括电影海报、评分、简介以及相关影人等。将使用 HarmonyOS 提供的常用组件&#xff0c;并结合第三方库 nutpi/axios 来实现…...