Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
目录
Linux软件包管理器 - yum
Linux下载软件的方式
认识yum
查找软件包
安装软件包
如何实现本地机器和云服务器之间的文件互传
卸载软件
Linux编辑器 - vim
vim的基本概念
vim下各模式的切换
vim命令模式各命令汇总
vim底行模式各命令汇总
Linux编译器 - gcc/g++
gcc/g++的作用
gcc/g++语法
预处理
编译
汇编
链接
静态库与动态库
Linux调试器 - gdb
gdb使用须知
gdb命令汇总
Linux项目自动化构建工具 - make/Makefile
make/Makefile的重要性
依赖关系和依赖方法
多文件编译
项目清理
Linux第一个小程序 - 进度条
行缓冲区的概念
\r和\n
进度条代码及效果展示
Linux软件包管理器 - yum
Linux下载软件的方式
在Linux下安装软件的方法大概有以下三种:
1)下载到程序的源代码,自行进行编译,得到可执行程序。
2)获取rpm安装包,通过rpm命令进行安装。(未解决软件的依赖关系)
3)通过yum进行安装软件。(常用)
认识yum
yum是一个在Fedora、RedHat以及CentOS中的前端软件包管理器,能够从指定的服务器自动下载RPM包并且安装,可以自动处理依赖性关系,并且一次安装所有依赖的软件包,无须繁琐地一次次下载、安装。(ubuntu安装软件使用apt)
注意:一个服务器同一时刻只允许一个yum进行安装,不能在同一时刻同时安装多个软件。
因为yum是从服务器上下载RPM包,所以在下载时必须联网,可以通过ping指令判断当前云服务器是否联网。
查找软件包
[hxh@hxh-alicloud~/linux-learning/lesson5]$ yum list
使用yum list指令,可以罗列出可供下载的全部软件。
因为其实我自己使用的是ubuntu,所以我这边用不了lrzsz
但我这边会找如何如何安装软件包以lrzsz的形式,并且我这边也会说如果用unbunt,要如何按照软件包
lrzsz可以将Windows当中的文件上传到Linux当中,也可以将Linux当中的文件下载到Windows当中,实现云服务器和本地机器之间进行信息互传。
[hxh@VM-0-15-centos lesson5]$ yum list | grep lrzsz
由于包的数量非常多,所以我们可以使用grep指令筛选出我们所关注的包,这里我们以lrzsz为例。
此时就只会显示与lrzsz相关的软件包。
Ubuntu按照lrzsz方法:
[hxh@hxh-alicloud~/linux-learning/lesson24]$apt search lrzsz
由于包的数量非常多,所以我们可以使用grep指令筛选出我们所关注的包,这里我们以lrzsz为例。
此时就只会显示与lrzsz相关的软件包。
安装软件包
指令: sudo yum install 软件名
[hxh@VM-0-15-centos yum.repos.d]$ sudo yum install lrzsz
yum会自动找到都有哪些软件包需要下载,这时候敲“y”确认安装,当出现“complete”字样时,说明安装完成。
注意事项:
1)安装软件时由于需要向系统目录中写入内容,一般需要sudo或者切换到root账户下才能完成。
2)yum安装软件只能一个装完了再装另一个,正在使用yum安装一个软件的过程中,如果再尝试用yum安装另外一个软件,yum会报错。
ubuntu下按照软件包:
指令: sudo apt install 软件包名
[hxh@hxh-alicloud~/linux-learning/lesson24]$sudo apt install lrzsz
如何实现本地机器和云服务器之间的文件互传
既然已经安装了lrzsz,这里就顺便说一下lrzsz如何使用。
指令: rz -E
通过该指令可选择需要从本地机器上传到云服务器的文件。
指令: sz 文件名
该指令可将云服务器上的文件下载到本地机器的指定文件夹。
将文件打包压缩
[hxh@hxh-alicloud~/linux-learning/lesson24]$tar -czvf hello.tar.gz hello.txt
sz 压缩包名:将内容下载到本地电脑上 (选项不需要带-r,不然可能解压会有报错)
卸载软件
指令: sudo yum remove 软件名
[cl@VM-0-15-centos yum.repos.d]$ sudo yum remove lrzsz
yum会自动卸载该软件,这时候敲“y”确认卸载,当出现“complete”字样时,说明卸载完成。
Ubuntu下卸载软件
指令:sudo apt remove 软件包名
Linux编辑器 - vim
vim的基本概念
vim在我们做开发的时候,主要解决我们编写代码的问题,本质上就是一个多模式的文本编辑器。我们这里主要介绍vim最常用的三种模式:命令模式、插入模式、底行模式。
1、命令模式(Normal mode)。
在命令模式下,我们可以控制屏幕光标的移动,字符、字或行的删除,复制粘贴,剪贴等操作。
2、插入模式(Insert mode)。
只有在插入模式下才能进行文字输入,该模式是我们使用最频繁的编辑模式。
3、底行模式(Command mode)。
在底行模式下,我们可以将文件保存或退出,也可以进行查找字符串等操作。在底行模式下我们还可以直接输入vim help-modes查看当前vim的所有模式。
vim下各模式的切换
【命令模式】切换至【插入模式】
1)输入「i」:在当前光标处进入插入模式。
2)输入「a」:在当前光标的后一位置进入插入模式。
3)输入「o」:在当前光标处新起一行进入插入模式。
【命令模式】切换至【底行模式】
1)输入「Shift+;」即可,实际上就是输入「:」。
【插入模式】或【底行模式】切换至【命令模式】
1)插入模式或是底行模式切换至命令模式都是直接按一下「Esc」键即可。
vim命令模式各命令汇总
1)按「k」:光标上移。
2)按「j」:光标下移。
3)按「h」:光标左移。
4)按「l」:光标右移。
5)按「$」:移动到光标所在行的行尾。(shirt+4)
6)按「^」:移动到光标所在行的行首。(shirt+6)
7)按「gg」:移动到文本开始。
8)按「Shift+g」:移动到文本末尾。
9)按「n+Shift+g」:移动到第n行行首。
10)按「n+Enter」:当前光标向下移动n行。
11)按「w」:光标从左到右,从上到下的跳到下一个字的开头。
12)按「e」:光标从左到右,从上到下的跳到下一个字的结尾。
12)按「b」:光标从右到左,从下到上的跳到上一个字的开头
【删除】
1)按「x」:删除光标所在位置的字符。
2)按「nx」:删除光标所在位置开始往后的n个字符。(包括自己在内)
3)按「X」:删除光标所在位置的前一个字符。
4)按「nX」:删除光标所在位置的前n个字符。(不包含自己)
5)按「dd」:删除光标所在行。
6)按「ndd」:删除光标所在行开始往下的n行。
【复制粘贴】
1)按「yy」:复制光标所在行到缓冲区。
2)按「nyy」:复制光标所在行开始往下的n行到缓冲区。
3)按「yw」:将光标所在位置开始到字尾的字符复制到缓冲区。
4)按「nyw」:将光标所在位置开始往后的n个字复制到缓冲区。
5)按「p」:将已复制的内容在光标的下一行粘贴上。
6)按「np」:将已复制的内容在光标的下一行粘贴n次。
【剪切】
1)按「dd」:剪切光标所在行。
2)按「ndd」:剪切光标所在行开始往下的n行。
3)按「p」:将已剪切的内容在光标的下一行粘贴上。
4)按「np」:将已剪切的内容在光标的下一行粘贴n次。
【撤销】
1)按「u」:撤销。
2)按「Ctrl+r」:恢复刚刚的撤销。
【大小写切换】
1)按「~」:完成光标所在位置字符的大小写切换。
2)按「n~」:完成光标所在位置开始往后的n个字符的大小写切换。
【替换】
1)按「r」:替换光标所在位置的字符。
2)按「R」:替换光标所到位置的字符,直到按下「Esc」键为止。
【更改】
1)按「cw」:将光标所在位置开始到字尾的字符删除,并进入插入模式。
2)按「cnw」:将光标所在位置开始往后的n个字删除,并进入插入模式。
【翻页】
1)按「Ctrl+b」:上翻一页。
2)按「Ctrl+f」:下翻一页。
3)按「Ctrl+u」:上翻半页。
4)按「Ctrl+d」:下翻半页。
vim底行模式各命令汇总
在使用底行模式之前,记住先按「Esc」键确定你已经处于命令模式,再按「:」即可进入底行模式。
【行号设置】
1)「set nu」:显示行号。
2)「set nonu」:取消行号。
【保存退出】
1)「w」:保存文件。
2)「q」:退出vim,如果无法离开vim,可在「q」后面跟一个「!」表示强制退出。
3)「wq」:保存退出。
【分屏指令】
1)「vs 文件名」:实现多文件的编辑。
2)「Ctrl+w+w」:光标在多屏幕下进行切换。
【执行指令】
1)「!+指令」:在不退出vim的情况下,可以在指令前面加上「!」就可以执行Linux的指令,例如查看目录、编译当前代码等。
Linux编译器 - gcc/g++
gcc/g++的作用
1)预处理(头文件展开、去注释、宏替换、条件编译)
2)编译(C代码翻译成汇编语言)汇编语言,机器也不认识,因此需要汇编这一步把汇编语言转换成二进制指令
3)汇编(汇编代码转为二进制目标代码)
4)链接(将汇编过程产生的二进制代码进行链接)xxx.o目标文件和标准库进行管理,构建可执行程序
gcc/g++语法
语法: gcc/g++ 选项 文件
常用选项:
1)-E 只进行预处理,这个不生成文件,你需要把他重定向到一个输出文件里面(否则将把预处理后的结果打印到屏幕上)。
2)-S 编译到汇编语言,不进行汇编和链接,即只进行预处理和编译。
3)-c 编译到目标代码
4)-o 将处理结果输出到指定文件,该选项后需紧跟输出文件名。
5)-static 此选项对生成的文件采用静态链接。
6)-g 生成调试信息(若不携带该选项则默认生成release版本)。
7)-shared 此选项将尽量使用动态库,生成文件较小。
8)-w 不生成任何警告信息。
9)Wall 生成所有警告信息。
10)-O0/-O1/-O2/-O3 编译器优化选项的四个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高。
预处理
[hxh@VM-0-15-centos lesson9]$ gcc -E test.c -o test.i
- 预处理功能主要包括头文件展开、去注释、宏替换、条件编译等。
- 预处理指令是以#开头的代码行。
- -E选项的作用是让gcc/g++在预处理结束后停止编译过程。
- -o选项是指目标文件,“xxx.i”文件为已经过预处理的原始程序。
编译
[hxh@VM-0-15-centos lesson9]$ gcc -S test.i -o test.s
- 在这个阶段中,gcc/g++首先检查代码的规范性、是否有语法错误等,以确定代码的实际要做的工作,在检查无误后,将代码翻译成汇编语言。
- 用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码。
- -o选项是指目标文件,“xxx.s”文件为已经过翻译的原始程序。
汇编
[hxh@VM-0-15-centos lesson9]$ gcc -c test.s -o test.o
- 汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件。
- 使用-c选项就可以得到汇编代码转化为“xxx.o”的二进制目标代码了。
链接
[hxh@VM-0-15-centos lesson9]$ gcc test.o -o test
- 在成功完成以上步骤之后,就进入了链接阶段。
- 链接的主要任务就是将生成的各个“xxx.o”文件进行链接,生成可执行文件。
- gcc/g++不带-E、-S、-c选项时,就默认生成预处理、编译、汇编、链接全过程后的文件。
- 若不用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out。
注意: 链接后生成的也是二进制文件。
静态库与动态库
函数库一般分为静态库和动态库两种:
- 静态库是指编译链接时,把库文件的代码全部加入到可执行文件当中,因此生成的文件比较大,但在运行时也就不再需要库文件了,静态库一般以.a为后缀。a(linux)lib(Windows)
- 动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件当中,而是在程序运行时由链接文件加载库,这样可以节省系统的开销,动态库一般以.so为后缀。so(linux)dll(Windows)
动态链接:
优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度快。
缺点:依赖动态库,程序可移植性较差。
静态链接:
优点:不依赖第三方库,程序的可移植性较高。
缺点:浪费空间。
gcc和g++默认生成的二进制程序是动态链接的,我们可以使用file指令进行查看。
file是用于识别文件时文本文件还是二进制文件或者压缩文件,若是可执行文件会告诉是动态链接还是静态链接
其次,我们还可以使用ldd指令查看动态链接的可执行文件所依赖的库。
ldd输出的是可执行文件依赖的动态库列表,包括库名,实践路径以在内存中加载的地址
(图中的/lib64/libc.so.6就是当前云服务器当中的C标准库)。
虽然gcc和g++默认采用的是动态链接,但如果我们需要使用静态链接,带上-static选项即可。
[hxh@VM-0-15-centos lesson9]$ gcc test.c -o test_s -static
此时生成的可执行文件就是静态链接的了。
我们可以查看源代码相同,但链接方式不同而生成的两个可执行程序test和test_s的大小。
这也证明了动态链接比较节省空间,而静态链接比较浪费空间。
Linux调试器 - gdb
gdb使用须知
程序发布方式:
1、debug版本:程序本身会被加入更多的调试信息,以便于进行调试。
2、release版本:不会添加任何调试信息,是不可调试的。
在Linux当中gcc/g++默认生成的可执行程序是release版本的,是不可被调试的。如果想生成debug版本,就需要在使用gcc/g++生成可执行程序时加上-g选项。
对同一份源代码分别生成其release版本和debug版本的可执行程序,并通过ll指令可以看到,debug版本发布的可执行程序的大小比release版本发布的可执行程序的大小要大一点,其原因就是以debug版本发布的可执行程序当中包含了更多的调试信息。
gdb命令汇总
【进入gdb】
指令: gdb 文件名
【调试】
1)「run/r」:运行代码(启动调试)。
2)「next/n」:逐过程调试。
3)「step/s」:逐语句调试。
4)「until 行号」:跳转至指定行。
5)「finish」:执行完当前正在调用的函数后停下来(不能是主函数)。
6)「continue/c」:运行到下一个断点处。
7)「set var 变量=x」:修改变量的值为x。
【显示】
1)「list/l n」:显示从第n行开始的源代码,每次显示10行,若n未给出则默认从上次的位置往下显示.。
2)「list/l 函数名」:显示该函数的源代码。
3)「print/p 变量」:打印变量的值。
4)「print/p &变量」:打印变量的地址。
5)「print/p 表达式」:打印表达式的值,通过表达式可以修改变量的值。
6)「display 变量」:将变量加入常显示(每次停下来都显示它的值)。
7)「display &变量」:将变量的地址加入常显示。
8)「undisplay 编号」:取消指定编号变量的常显示。
9)「bt」:查看各级函数调用及参数。
10)「info/i locals」:查看当前栈帧当中局部变量的值。
【断点】
1)「break/b n」:在第n行设置断点。
2)「break/b 函数名」:在某函数体内第一行设置断点。
3)「info breakpoint/b」:查看已打断点信息。
4)「delete/d 编号」:删除指定编号的断点。
5)「disable 编号」:禁用指定编号的断点。
6)「enable 编号」:启用指定编号的断点。
【退出gdb】
1)「quit/q」:退出gdb。
Linux项目自动化构建工具 - make/Makefile
make/Makefile的重要性
- 会不会写Makefile,从侧面说明了一个人是否具备完成大型工程的能力。
- 一个工程的源文件不计其数,按照其类型、功能、模块分别放在若干个目录当中,Makefile定义了一系列的规则来指定:哪些文件需要先编译,哪些文件需要后编译,甚至于进行更复杂的功能操作。
- Makefile带来的好处就是“自动化编译”,一旦写好,只需一个make命令,整个工程完全自动编译,极大的提高了软件开发的效率。
- mak是一个命令工具,是一个解释Makefile当中指令的命令工具,一般来说,大多数的IDE都有这个命令,例如:Delphi的make,Visual C++的nmake,Linux下GNU的make。可见,Makefile都成为了一种在工程方面的编译方法。
- make是一条命令,Makefile是一个文件,两个搭配使用,完成项目自动化构建。
依赖关系和依赖方法
在使用make/Makefile前我们首先应该理解各个文件之间的依赖关系以及它们之间的依赖方法。
依赖关系: 文件A的变更会影响到文件B,那么就称文件B依赖于文件A。
- 例如,test.o文件是由test.c文件通过预处理、编译以及汇编之后生成的文件,所以test.c文件的改变会影响test.o,所以说test.o文件依赖于test.c文件。
依赖方法: 如果文件B依赖于文件A,那么通过文件A得到文件B的方法,就是文件B依赖于文件A的依赖方法。
- 例如,test.o依赖于test.c,而test.c通过gcc -c test.c -o
test.o指令就可以得到test.o,那么test.o依赖于test.c的依赖方法就是gcc -c test.c -o test.o。
多文件编译
当你的工程当中有多个源文件的时候,应该如何进行编译生成可执行程序呢?
首先,我们可以直接使用gcc指令对多个源文件进行编译,进而生成可执行程序。
但进行多文件编译的时候一般不使用源文件直接生成可执行程序,而是先用每个源文件各自生成自己的二进制文件,然后再将这些二进制文件通过链接生成可执行程序。
原因:
- 若是直接使用源文件生成可执行程序,那么其中一个源文件进行了修改,再生成可执行程序的时候就需要将所有的源文件重新进行编译链接。
- 而若是先用每个源文件各自生成自己的二进制文件,那么其中一个源文件进行了修改,就只需重新编译生成该源文件的二进制文件,然后再将这些二进制文件通过链接生成可执行程序即可。
注意: 编译链接的时候不需要加上头文件,因为编译器通过源文件的内容可以知道所需的头文件名字,而通过头文件的包含方式(“尖括号”包含和“双引号”包含),编译器可以知道应该从何处去寻找所需头文件。
但是随着源文件个数的增加,我们每次重新生成可执行程序时,所需输入的gcc指令的长度与个数也会随之增加。这时我们就需要使用make和Makefile了,这将大大减少我们的工作量。
步骤一: 在源文件所在目录下创建一个名为Makefile/makefile的文件。
步骤二: 编写Makefile文件。
Makefile文件最简单的编写格式是,先写出文件的依赖关系,然后写出这些文件之间的依赖方法,依次写下去。
编写完毕Makefile文件后保存退出,然后在命令行当中执行make指令便可以生成可执行程序,以及该过程产生的中间产物。
Makefile文件的简写方式:
- make会在当前目录下找名字为“Makefile”或“makefile”的文件。
- 如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件作为最终的目标文件。
- 如果mytest文件不存在,或是mytest所依赖的后面的test.o文件和main.o文件的文件修改时间比mytest文件新(test.o或者main.o在生成可执行程序后还有修改过),那么它就会执行后面的依赖方法来生成mytest文件。
- 如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则再根据其依赖方法生成test.o文件(类似于堆栈的过程)。
- 当然,你的test.c文件和main.c文件是存在的,于是make会生成test.o文件和main.o文件,然后再用test.o文件和main.o文件生成最终的mytest文件。
- make会一层又一层地去找文件的依赖关系,直到最终编译出第一个目标文件。
- 在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出,并报错。
项目清理
在我们每次重新生成可执行程序前,都应该将上一次生成可执行程序时生成的一系列文件进行清理,但是如果我们每次都手动执行一系列指令进行清理工作的话,未免有些麻烦,因为每次清理时执行的都是相同的清理指令,这时我们可以将项目清理的指令也加入到Makefile文件当中。
像clean这种,没有被第一个目标文件直接或间接关联,那么它后面所定义的命令将不会被自动执行,但我们可以显示要make执行。
注: 一般将这种clean的目标文件设置为伪目标,用.PHONY修饰,伪目标的特性是:总是被执行。
Linux第一个小程序 - 进度条
行缓冲区的概念
首先,我们来感受一下行缓冲区的存在,在Linux当中以下代码的运行结果是什么样的?
对于此代码,大家应该都没问题,当然是先输出字符串hello world然后休眠3秒之后结束运行。那么对于以下代码呢?
可以看到代码中仅仅删除了字符串后面的’\n’,那么代码的运行结果还与之前相同吗?答案否定的,该代码的运行结果是:先休眠3秒,然后打印字符串hello world之后结束运行。该现象就证明了行缓冲区的存在。
显示器对应的是行刷新,即当缓冲区当中遇到’\n’或是缓冲区被写满才会被打印出来,而在第二份代码当中并没有’\n’,所以字符串hello world先被写到缓冲区当中去了,然后休眠3秒后,直到程序运行结束时才将hello world打印到显示器当中。(main函数结束后会主动刷新缓冲区)
\r和\n
\r: 回车,使光标回到本行行首。
\n: 换行,使光标下移一格。
而我们键盘上的Enter键实际上就等价于\n+\r。
既然是\r是使光标回到本行行首,那么如果我们向显示器上写了一个数之后再让光标回到本行行首,然后再写一个数,不就相当于将前面一个数字覆盖了吗?
但这里有一个问题:不使用’\n’进行换行怎么将缓冲区当中数据打印出来?
这里我们可以使用fflush函数,该函数可以刷新缓冲区,即将缓冲区当中的数据刷新当显示器当中。
对此我们可以编写一个倒计时的程序。
在输出下一个数之前都让光标先回到本行行首,就得到了倒计时的效果。
如果没有这行,那while函数中\r让屏幕的指针回到了首行,然后[hxh@hxh-alicloud~/lesson2]这一串就覆盖了原本的数字,所以最后程序运行后倒数的数字最终会消失。
进度条代码及效果展示
知道了\r这个概念我们就可以实现一个简单的进度条了。
相关文章:
Linux环境基础开发工具的使用(yum、vim、gcc、g++、gdb、make/Makefile)
目录 Linux软件包管理器 - yum Linux下载软件的方式 认识yum 查找软件包 安装软件包 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式各命令汇总 vim底行模式各命令汇总 Linux编译器 - gcc/g …...
5.11 - 5.12 JDBC+Mybatis+StringBoot项目配置文件
JDBC: 预编译SQL优点:安全,性能更高。 在cmd里面输入java-jar就可以运行jar包。 Mybatis: 持久层框架。用于简化JDBC的开发。 数据库连接池里面放置的是一个一个Connection连接对象。(连接池中的连接可以复用&#…...
判断一个数组有没有重复值
要判断一个数组是否包含重复值,你可以使用多种方法。以下是一些常用的方法: 方法 1:使用 Set Set 是一种集合数据结构,它只存储唯一的值。因此,你可以将数组转换为 Set,然后比较 Set 的大小与数组的长度。…...
51c大模型~合集127
我自己的原文哦~ https://blog.51cto.com/whaosoft/13905076 #Executor-Workers架构 图解Vllm V1系列2 本文详细介绍了vllm v1的Executor-Workers架构,包括Executor的四种类型(mp、ray、uni、external_launcher)及其适用场景ÿ…...
Spring急速入门
Spring 是 企业级开发的一站式框架,核心是 IOC(控制反转) 和 AOP(面向切面编程) 一、Spring 核心:IOC 理论 1. 什么是 IOC? IOC(Inversion of Control,控制反转&…...
#在 CentOS 7 中手动编译安装软件操作及原理
在 CentOS 7 中,手动编译安装软件(即从源代码编译安装)是一种高度灵活的方式,适用于需要定制化软件功能、优化性能或安装官方仓库未提供的软件版本的场景。以下是针对手动编译安装的详细说明,包括原理、步骤、注意事项…...
【Kubernetes】初识基础理论(第一篇)
前言 单机容器编排: docker-compose 容器集群编排: docker swarm、mesosmarathon、kubernetes 应用编排: ansible 一、Kubernetes概述 Kubernetes 是一个可移植的、可扩展的开源平台,用于管理容器化的…...
配置集群(yarn)
在配置 YARN 集群前,要先完成以下准备工作: 集群环境规划:明确各节点的角色,如 ResourceManager、NodeManager 等。网络环境搭建:保证各个节点之间能够通过网络互通。时间同步设置:安装 NTP 服务࿰…...
按钮导航组件 | 纯血鸿蒙组件库AUI
摘要: 按钮导航组件(A_ButtonNav):可设置导航数据(含文本及路由),可设置按钮颜色、导航标题及导航子标题。 一、组件调用方式 1.1.极简调用: 用 A_ButtonNav 调用“按钮导航组件”,只需要给属性 data (导…...
自适应主从复制模拟器的构建与研究
自适应主从复制模拟器的构建与研究 摘要: 本文旨在构建一个自适应主从复制模拟器,深入研究主从复制原理及优化方法。从研究者视角出发,详细阐述模拟器的设计、实现与实验过程,通过表格、图表及代码等辅助手段,逐步探讨如何在不同网络条件和负载下,自动调整主从复制参数和…...
015枚举之滑动窗口——算法备赛
滑动窗口 最大子数组和 题目描述 给你一个整数数组 nums ,请你找出一个具有最大和的连续子数组(子数组最少包含一个元素),返回其最大和。 原题链接 思路分析 见代码注解 代码 int maxSubArray(vector<int>& num…...
【Dv3Admin】工具视图配置文件解析
在开发后台管理系统时,处理复杂的 CRUD 操作是常见的需求。Django Rest Framework(DRF)通过 ModelViewSet 提供了基础的增删改查功能,但在实际应用中,往往需要扩展更多的功能,如批量操作、权限控制、查询优化等。dvadmin/utils/viewset.py 模块通过继承并扩展 ModelViewS…...
在MyBatis Plus里处理LocalDateTime类型
在MyBatis Plus里处理LocalDateTime类型 在MyBatis Plus里处理LocalDateTime类型时,你要确保数据库字段和Java实体类属性之间的类型映射是正确的。下面为你介绍处理这种情况的方法: 1. 数据库字段类型对应设置 要保证数据库字段类型和LocalDateTime相…...
编程技能:字符串函数03,strncpy
专栏导航 本节文章分别属于《Win32 学习笔记》和《MFC 学习笔记》两个专栏,故划分为两个专栏导航。读者可以自行选择前往哪个专栏。 (一)WIn32 专栏导航 上一篇:编程技能:字符串函数02,strcpy 回到目录…...
edge设置位IE模式打开网页
打开Edge浏览器->在浏览器工具栏右键->自定义工具栏->外观->选择要在工具栏上显示的按钮->找到“Internet Explorer 模式”按钮->开启,将其添加到工具栏中...
代码随想录训练营第二十二天| 101.对称二叉树 100.相同的树
101.对称二叉树: 文档讲解:代码随想录|101.对称二叉树 视频讲解:新学期要从学习二叉树开始! | LeetCode:101. 对称二叉树_哔哩哔哩_bilibili 状态:已做出 思路: 这道题目我初始做的时候想着使用…...
nvm管理node版本
To manage Node.js versions on Windows, I recommend using nvm-windows (Node Version Manager for Windows). Here’s how we can handle this: First, let’s install nvm-windows. I’ll propose a command to check if it’s already installed: nvm versionGreat! I s…...
智能手表测试计划文档(软/硬件)
📄 智能手表测试计划文档(软/硬件) 项目名称:Aurora Watch S1 文档编号:AW-S1-QA-TP-001 编制日期:2025-xx-xx 版本:V1.0 编写人:xxx(测试主管) 一、测试目标…...
基于大模型的原发性醛固酮增多症全流程预测与诊疗方案研究
目录 一、引言 1.1 研究背景与意义 1.2 国内外研究现状 1.3 研究目的与方法 二、原发性醛固酮增多症概述 2.1 疾病定义与发病机制 2.2 临床表现与诊断标准 2.3 流行病学特征 三、大模型预测原理与技术 3.1 大模型简介 3.2 预测原理与算法 3.3 数据收集与预处理 四…...
spring中的@Lazy注解详解
一、核心功能与作用 Lazy 注解是 Spring 框架中用于延迟 Bean 初始化的核心工具,通过将 Bean 的创建推迟到首次使用时,优化资源利用和启动性能。其核心功能包括: 延迟初始化 默认情况下,Spring 在容器启动时立即初始化所有单例 …...
Docker快速入门与应用
1. 什么是 Docker? Docker 就像一个“魔法箱子”,可以把你开发的应用(代码、环境、配置)打包成一个标准化的容器,这个容器可以在任何支持 Docker 的系统上运行,无需担心环境差异导致的问题。 类比…...
判断一个数是不是素数的最高效的算法
判断一个数是否是素数,有从简单到复杂多种方法。最高效的算法取决于输入规模(是几个亿以内的数,还是上百位的大整数),我会按实用场景分类讲解: ✅ 常规范围内(比如 ≤ 1e12)判断素数…...
《Head First 设计模式》第一章 - 笔记
本书是本人写的设计模式的笔记,写下核心要点,如果你掌握过设计模式,想快速阅读本书内容,这个笔记适合你阅读。如果你是新手,有 java 基础和 oo 设计原则基础,你适合跟我一样从零阅读本书。 第一章 策略模式…...
GPT系列:自然语言处理的演进与多模态的探索
GPT系列:自然语言处理的演进与多模态的探索 GPT系列的发展一、GPT-1 :通过生成式的预训练改进自然语言GPT-1的动机做一个预训练模型的难点GPT-1的微调模式GPT-1的训练数据Bert 二、GPT-2语言模型是非监督的GPT-2的动机引入promptGPT-2模型架构的改变GPT-…...
Linux驱动:驱动编译流程了解
要求 1、开发板中的linux的zImage必须是自己编译的 2、内核源码树,其实就是一个经过了配置编译之后的内核源码。 3、nfs挂载的rootfs,主机ubuntu中必须搭建一个nfs服务器。 内核源码树 解压 tar -jxvf x210kernel.tar.bz2 编译 make x210ii_qt_defconfigmakeCan’t use ‘…...
【MySQL】数据库基础
目录 1.什么是数据库2.见一见数据库3.服务器、表、库之间的关系4.MySQL架构5.sql语句分类6.查看MySQL存储引擎6.1 查看存储引擎6.2 常见存储引擎对比 1.什么是数据库 概念:数据库一般是指,在磁盘或者内存中存储的特定结构组织的数据 – 将来在磁盘上存储…...
1.1 文章简介
前因后果链 行业需求 → 技能断层 → 课程设计响应 (高薪岗位要求数学基础) → (符号/公式理解困难) → (聚焦原理与应用) 行业驱动因素 • 前因:机器学习/AI等领域的高薪岗位激增,但数学能力成为主要门槛 • 关键矛盾:算法论文中的数学…...
laravel 中使用的pdf 扩展包 laravel-snappy(已解决中文乱码)
Centos7 安装 wkhtmltopdf 1、先查看系统是 32 位的还是 64 位的 uname -a2、通过 composer 安装 wkhtmltopdf 32位: $ composer require h4cc / wkhtmltopdf-i386 0.12.x $ composer require h4cc / wkhtmltoimage-i386 0.12.x 64位: $ composer require h4cc/wkhtmltopdf-…...
java反序列化commons-collections链6
cc链6,最好用的cc链,因为它不受jdk版本的限制和cc版本的限制,前半段很像urldns链,后半段是cc1链 先来看一下它的利用链 Gadget chain:java.io.ObjectInputStream.readObject()java.util.HashSet.readObject()java.util.HashMap.p…...
WebSocket的原理及QT示例
一.WebSocket 介绍 1.概述 WebSocket 是一种在单个 TCP 连接上进行全双工通讯的协议,它在 2011 年被 IETF 定为标准 RFC 6455,并由 RFC7936 补充规范。与传统的 HTTP 协议不同,WebSocket 允许服务器和客户端之间进行实时、双向的数据传输&a…...
css 点击后改变样式
背景: 期望实现效果:鼠标点击之后,保持选中样式。 实现思路:在css样式中,:active 是一种伪类,用于表示用户当前正在与被选定的元素进行交互。当用户点击或按住鼠标时,元素将被激活,此…...
AI 在模仿历史语言方面面临挑战:大型语言模型在生成历史风格文本时的困境与研究进展
概述 在当今数字化时代,人工智能(AI)技术在诸多领域展现出了强大的能力,但在处理历史语言这一特定任务时,却遭遇了不小的挑战。美国和加拿大的研究人员通过合作发现,像 ChatGPT 这样的大型语言模型&#x…...
C++.Windows图形
Windows图形 1. 基础知识1.1 Windows图形编程基础1.2 GDI与GDI1.3 窗口消息处理2.1 注册窗口类2.2 创建窗口2.3 显示窗口3.1 创建按钮3.2 按钮消息处理4.1 设置窗口透明度4.2 透明窗口示例5.1 使用区域创建异形窗口5.2 异形窗口示例6.1 GDI抗锯齿设置6.2 抗锯齿绘图示例7.1 Dir…...
【Vue3】使用vite创建Vue3工程、Vue3基本语法讲解
一、什么是Vite Vite是新一代前端构建工具,官网地址:Vite中文网,vite的优势如下: 轻量快速的热重载(HMR),能实现极速的服务启动对TypeScript、JSX、CSS等支持开箱即用真正的按需编译ÿ…...
专题二:二叉树的深度优先搜索
以leetcode2331题为例 题目分析: 以第一个示例为例 算法原理分析: 从宏观角度,也就是我的算法之回溯的第一篇 我们发现我们在研究示例的时候,必须从下往上推 也就是我在研究一个结点是true还是false的时候,必须…...
Termius ssh连接服务器 vim打开的文件无法复制问题
你的问题是: • 在 Termius (macOS) SSH 连接到 VMware Ubuntu,使用 vim 打开 .cpp 文件时,可以复制文本; • 但在 Windows 10 上 SSH 到 VMware 的 Red Hat 6.4 时,复制操作无效。 ⸻ 🎯 初步分析 复制…...
搭建大数据学习的平台
一、基础环境准备 1. 硬件配置 物理机:建议 16GB 内存以上,500GB 硬盘,多核 CPU虚拟机:至少 3 台(1 主 2 从),每台 4GB 内存,50GB 硬盘 2. 操作系统 Ubuntu 20.04 LTS 或 CentOS…...
Matlab 模糊控制节水洗衣机模型
1、内容简介 Matlab 232-模糊控制节水洗衣机模型 可以交流、咨询、答疑 2、内容说明 略 3、仿真分析 略 4、参考论文 略...
如何找正常运行虚拟机
1.新建虚拟机。Linux centos7,给虚拟机改个名字不要放在c盘 2.安装操作系统。cd/dvd->2009.iso 启动虚拟机...
python二手书交易管理系统
目录 技术栈介绍具体实现截图系统设计研究方法:设计步骤设计流程核心代码部分展示研究方法详细视频演示试验方案论文大纲源码获取/详细视频演示 技术栈介绍 Django-SpringBoot-php-Node.js-flask 本课题的研究方法和研究步骤基本合理,难度适中…...
使用本地部署的 LLaMA 3 模型进行中文对话生成
以下程序调用本地部署的 LLaMA3 模型进行多轮对话生成,通过 Hugging Face Transformers API 加载、预处理、生成并输出最终回答。 程序用的是 Chat 模型格式(如 LLaMA3 Instruct 模型),遵循 ChatML 模板,并使用 apply…...
C++编程练习,认识面向对象权限,如何进行封装
#include <iostream> #include <string> using namespace std; /* 银行的账户是一个模板,是一个类,有存款人信息和账户额度,而具体的存款人视为一个对象, 一个对象不能私自修改账户额度,需要通过一个操作流…...
A Survey of Learning from Rewards:从训练到应用的全面剖析
A Survey of Learning from Rewards:从训练到应用的全面剖析 你知道大语言模型(LLMs)如何通过奖励学习变得更智能吗?这篇论文将带你深入探索。从克服预训练局限的新范式,到训练、推理各阶段的策略,再到广泛…...
电脑端音乐播放器推荐:提升你的听歌体验!
在快节奏的职场环境中,许多上班族都喜欢用音乐为工作时光增添色彩。今天要分享的这款音乐工具,或许能为你的办公时光带来意想不到的惊喜。 一、软件介绍-澎湃 澎湃音乐看似是个普通的播放器,实则藏着强大的资源整合能力。左侧功能栏清晰陈列着…...
小刚说C语言刷题—1149 - 回文数个数
1.题目描述 一个正整数,正读和反读都相同的数为回文数。 例如 22, 131, 2442 , 37073, 66,…… 所有 11位数都是回文数。 给出一个正整数 n ( 1≤n≤10000 ),求出 1,2…...
基于SpringBoot的博客系统测试报告
一、编写目的 本报告为博客系统测试报告,本项目模拟了csdn,实现了包括了用户登录,发布博客文章,查看博客等功能。 二、项目背景 博客系统采用前后端分离的方法来实现,同时使用了数据库来存储相关的数据,…...
Koa知识框架
一、核心概念 1. 基本特点 由 Express 原班人马开发的下一代 Node.js Web 框架 基于中间件的洋葱圈模型 轻量级核心(仅约 600 行代码) 完全使用 async/await 异步流程控制 没有内置任何中间件,高度可定制 2. 核心对象 Application (Ko…...
React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题
React Native踩坑实录:解决NativeBase Radio组件在Android上的兼容性问题 问题背景 在最近的React Native项目开发中,我们的应用在iOS设备上运行良好,但当部署到Android设备时,进入语言设置和隐私设置页面后应用崩溃。我们遇到了…...
RCE联系
过滤 绕过空格 ● 进制绕过 题目练习 数字rce 使用$0执行bash,<<<将后面的字符串传递给左边的命令。 例如: <?php highlight_file(__FILE__); function waf($cmd) { $whiteList [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, \\, \, $, <]; $cmd_ch…...
区块链大纲笔记
中心化出现的原因是由于网络的形成(不然就孤立了,这显然不符合现实,如,社会,计算机网路),接着由于网络中结点能力一般不对等同时为了便于管理等一系列问题,导致中心化网络的出现。&a…...