Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)
目录
什么是软件包
Linux 软件包管理器 apt
认识apt
查找软件包
安装软件
如何实现本地机器和云服务器之间的文件互传
卸载软件
Linux编辑器 - vim
vim的基本概念
vim下各模式的切换
vim命令模式下各指令汇总
vim底行模式个指令汇总
Linux编译器 - gcc/g++
gcc/g++的作用
预处理 (进行宏替换)
编译(生成机器可识别代码)
汇编(生成机器可识别代码)
连接(生成可执行文件或库文件)
在这里涉及到一个重要的概念:函数库
函数库一般分为静态库和动态库两种
Linux调试器-gdb
gdb命令汇总
Linux项目自动化构建工具-make/Makefile
make/Makefile的重要性
依赖关系和依赖方法
项目清理
Linux第一个小程序 - 进度条
进度条代码及效果展示
什么是软件包
在Linux下安装软件, 一个通常的办法是下载到程序的源代码, 并进行编译, 得到可执行程序.
但是这样太麻烦了, 于是有些人把一些常用的软件提前编译好, 做成软件包(可以理解成windows上的安 装程序)放在一个服务器上, 通过包管理器可以很方便的获取到这个编译好的软件包, 直接进行安装.
软件包和软件包管理器, 就好比 "App" 和 "应用商店" 这样的关系.
Linux 软件包管理器 apt
在linux下安装软件的方式大概有以下三种:
1)下载到程序的源代码,自行进行编译,得到可执行程序
2)获取rpm安装包,通过rpm命令进行安装(为解决安装包的依赖关系)
3)通过apt进行安装软件(经常使用的方式)
认识apt
apt(Advanced Package Tool)是Linux下非常常用的一种包管理器. 主要用于在 Ubuntu 、 Debian 和相关 Linux 发行版上
注意:一个服务器同一时刻只允许一个apt进行安装,不能在同一时刻安装多个软件
因为apt是从服务器上下载RPM包,所以在下载时必须联网,可以通过ping指令指令判断当前云服务器是否联网
查找软件包
使用apt list命令,它会罗列出可以下载的所有软件
这里我们以查找lrzsz为例
lrzsz可以将Windows当中的文件上传到Linux中,也可以将LInux当中的文件下载到Windows中,实现云服务器和本地机器之间进行学习胡川
使用apt list | grep lrzsz来得到lrasz软件信息
由于包的数量太多,所以我们可以使用grep指令筛选出我们所关注的包,这里我们以lrzsz为例
此时就会显示与lrasz相关的软件包
在ubantu上这里会报错,apt 没有稳定的 CLI 接口。在脚本中谨慎使用。
安装软件
指令:sudo apt install 软件名
apt会自动找到都有那些软件包需要下载,这时候敲 “y” 确认安装
注意事项:
1)安装软件时由于需要想系统目录中写入内容,一般需要sudo或者切换到root账户下才能完成
2)yum安装软件只能一个一个安装,正在使用apt安装一个软件的过程中,如果再尝试安装另一个软件,apt会报错
如何实现本地机器和云服务器之间的文件互传
如何已经安装了lrzsz,这里就顺便说一下lrzsz如何使用
指令: rz -E
通过该指令可选择需要从本地机器上传到云服务器的文件
指令:sz 文件名
该指令可以将云服务器上的文件下载到本地机器的指定文件夹
卸载软件
指令:sudo apt remove 软件名
apt会自动卸载该软件,这时候敲“y”确认卸载
注意:以上卸载安装指令在软件名前加上 -y 的意思是不需要询问直接卸载
Linux编辑器 - vim
vim的基本概念
vim在我们做开发的时候,主要解决我们编写代码的问题,本质上是一个多模式的文本编辑器
我们这里主要介绍vim最常用的三种模式:命令模式,插入模式,底行模式
1.命令模式(Normal mode)
在命令模式下,我们可以控制屏幕光标的移动,字符,字或行的删除,复制粘贴,剪贴等操作
2.插入模式(Insert mode)
只有在插入模式下才能进行文字的输入,该模式是我们使用最频繁的编辑模式
3.底行模式(Command mode)
在底行模式下,我们可以将文件保存或退出,也可以进行查找字符串等操作。在底行模式下我们还可以直接输入vim help-modes查看当前vim的所有模式
vim下各模式的切换
指令:vim 文件名
进入vim后默认是命令模式(普通模式),要输入文字需切换到插入模式
命令模式 切换至 插入模式
1)输入 i :当前光标处进入插入模式
2)输入 a :在当前光标的后一位置进入插入模式
3)输入 o :在当前光标处起一行进入插入模式
命令模式 切换至 底行模式
1)插入模式或是底行模式切换至命令模式都是直接按一下Esc键即可
vim命令模式下各指令汇总
【移动光标】
1)按 k : 光标上移
2)按 j : 光标下移
3)按 h : 光标左移
4)按 l :光标右移
5)按 gg : 定位到光标到最开始行
6)按shift + g(G): 定位光标到结尾行
7)按 n + shift + g(nG): 定位光标到任意行
8)按shift + $:定位光标到当前行结尾
9)按shift + ^ :定位光标到当前行开始
10)按w , e, b:光标按照单词进行行内跨行移动
w:光标从左往右,从上到下的跳到下一个字的开头
e:光标从左往右,从上到下的跳到下一个字的结尾
b:光标从右到左,从上到下的跳到下一个字的开头
【删除,复制,剪切】
11)按(n)yy:复制光标所在行(n行)
12) 按(n)dd:剪切,删除
13) 按(n)p: 粘贴(重复行)到光标所在行下一行
【撤销】
14) 按u:撤销
15)按ctrl + r:撤销之前的撤销
【大小写转换】
16)按shift + ~:大小写转换
按n + shift + ~:大小写转换,从光标所在位置一直往后n个字符进行大小写转换
【替换】
17)按(n)r:对光标之后的所有字符进行批量化替换
18)按shift + R:替换模式,对内容进行整体的替换 -> 第四种模式
19)按(n)x:对光标字符之后的字符进行删除
【更改】
21)按cw:将光标所在的位置开始到字尾的字符删除,并进入插入模式
22)按cnw:将光标所在位置开往后的n个字删除,并进入插入模式
【翻页】
23)按Ctrl+b:上翻一页
24)按Ctrl+f:下翻一页
25)按Ctrl+u: 上翻半页
26)按Ctrl+d: 下翻半页
vim底行模式个指令汇总
先使用shhit + ;
【保存退出】
1)w :保存文件
2)q :退出vim,如果无法离开vim,可在q后面跟一个!表示强制退出
3)wq :保存退出
【行号设置】
4)set nu:显示行号
5)set nonu:取消行号
【分屏指令】
6)vs 文件名:实现多文件的编辑
7)Ctrl + w + w:光标在多屏幕下进行切换
【执行指令】
8) !+指令:在不退出vim的情况下,可以在指令前面加上!就可以执行Linux的指令,例如查看目录,编译当前代码等
vim的简单配置
【配置文件的位置】
1)在目录/etc/下面,有个名为vimrc的文件,这是系统中公共的配置文件,对所有用户都有效
2)在每个用户的主目录/home/xxx下,都可以自己建立私有的配置文件,命名为“vimrc”,这是该用户的私有配置文件,仅对该用户有效
例如:普通普通用户在自己的主目录下建立了“.vimrc”文件后,在文件当中输入set nu指令并保存
,下一次打开vim的时候就会自动显示行号
Linux编译器 - gcc/g++
gcc/g++的作用
gcc和g++分别是GUN的C和C++的编译器
gcc和g++在执行的时候一般有以下四个步骤:
语法:gcc/g++ 选项 文件
常用选项:
1)-E 只进行预处理,这个不生成文件,你需要把他重定向到一个输出文件里面(否则将把预处理后的结果打印到屏幕上)
2)-S 编译到汇编语言,不进行汇编和链接,即只进行预处理和编译
3)-c 编译到目标代码
4)-o 将处理结果输出到指定文件,该选项后紧跟输出文件名
5)-static 此选项对生成的文件采用静态链接
6)生成调试信息(若不携带该选项则默认生成release版本)
7)-shared 此选项将尽量使用动态库,生成文件较小
8)-w不生成任何警告信息
9)Wall 生成所有警告信息
10)-O0/-O1/-O2/-O3 编译器优化选项的四个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高
预处理 (进行宏替换)
预处理功能主要包括宏定义,文件包含,条件编译,去注释等。
预处理指令是以#号开头的代码行。
实例: gcc –E test.c –o test.i
选项“-E”,该选项的作用是让 gcc 在预处理结束后停止编译过程。
选项“-o”是指目标文件,“.i”文件为已经过预处理的C原始程序。
编译(生成机器可识别代码)
在这个阶段中,gcc/g++首先检查代码的规范性,是否有语法错误等,以确定代码的实际要做的工作,在检查无误之后,将代码翻译成汇编语言
用户可以使用-S选项来进行查看,该选项只进行编译而不进行汇编,生成汇编代码
实例: gcc –S test.i –o test.s
汇编(生成机器可识别代码)
汇编阶段是把编译阶段生成的“xxx.s”文件转成目标文件
使用-c选项就可以得到汇编代码转换为“xxx.o”的二进制目标代码
实例: gcc –c test.s –o test.o
连接(生成可执行文件或库文件)
在成功完成以上步骤之后,就进入了链接阶段
链接的主要任务就是将生成的各个“xxx.o”文件进行链接,生成可执行文件
gcc/g++不带-E, -S, -c选项时,就默认生成预处理,编译,汇编,链接全过程的后的文件
若不使用-o选项指定生成文件的文件名,则默认生成的可执行文件名为a.out
实例:gcc test1.c -o test
可以看到test直接就生成了可执行文件,链接后生成的也是二进制文件
在这里涉及到一个重要的概念:函数库
我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,而 没有定义函数的实现,那么,是在哪里实“printf”函数的呢? 最后的答案是:系统把这些函数实现都被做到名为 libc.so.6 的库文件中去了,在没有特别指定时,gcc 会到 系统默认的搜索路径“/usr/lib”下进行查找,也就是链接到 libc.so.6 库函数中去,这样就能实现函 数“printf”了,而这也就是链接的作用
函数库一般分为静态库和动态库两种
静态库是指编译链接时,把库文件的代码全部加入到可执行文件中,因此生成的文件比较大,但在运行时也就不再需要库文件了。其后缀名一般为“.a”
动态库与之相反,在编译链接时并没有把库文件的代码加入到可执行文件中,而是在程序执行时由运行时链接文件加载库,这样可以节省系统的开销。动态库一般后缀名为“.so”,如前面所述的 libc.so.6 就是动态 库。gcc 在编译时默认使用动态库。完成了链接之后,gcc 就可以生成可执行文件,如下所示。 gcc hello.o –o hello
gcc默认生成的二进制程序,是动态链接的,这点可以通过file 命令验证。
动态库
优点:省空间(磁盘的空间,内存的空间),bin体积小,加载速度块
缺点:依赖动态库,程序可移植性较差
静态库
优点:不依赖第三方库,程序的可移植性较高
缺点:浪费空间
gcc和g++默认生成的二进制程序是动态链接的,我们可以使用file指令进行查看
其次我们还可以使用ldd指令查看动态链接的可执行文件所依赖的库
其中/lib/x86_64-linux-gnu/libc.so.6就是当前云服务器当中的C标准库
如果我们需要使用静态链接我们可以加上-static选项
这时生成的可执行文件就是静态链接了
我们可以查看相同的源代码,使用不同的链接方式,所生成的可执行文件大小
可以看到动态链接确实比较节省空间,静态链接比较浪费空间
在Linux下:静态库(.so),动态库(.a)
在windows下:静态库(.lib),动态库(.dll)
Linux调试器-gdb
1. 背景
程序的发布方式有两种,debug模式和release模式
Linux gcc/g++出来的二进制程序,默认是release模式
要使用gdb调试,必须在源代码生成二进制程序的时候, 加上-g选项
对同一份源代码分别生成其release版本和debug版本的可执行程序,并通过ll指令可以看到,debug版本发布的可执行的大小比release版本发布的可执行文件大小要大一点,其原因就是在debug版本中包含了更多的调试信息
gdb命令汇总
【进入gdb】
指令:gdb 文件名
【退出gdb】
退出: ctrl + d 或 quit 调试命令:
【调试】
r或run:运行程序。
n 或 next:单条执行。
s或step:进入函数调用
until 行号:跳转至指定行
finish:执行完当前正在调用的函数后停下来(不能是主函数)
continue或c:运行到下一个断点处
set var 变量=x:修改变量的值为x
【显示】
list/l 行号:显示binFile源代码,接着上次的位置往下列,每次列10行。
list/l 函数名:列出某个函数的源代码。
print/p 变量:打印变量的值
print/p &变量:打印变量的地址
print/p 表达式:打印表达式的值,通过表达式可以修改变量的值
display 变量:将变量的地址加入常显示
undisplay 编号:取消指定编号变量的常显示
bt:查看各级函数调用及参数
info/i locals:查看当前栈帧当中的局部变量的值
【断点】
break(b) 行号:在某一行设置断点
break 函数名:在某个函数开头设置断点
info break :查看断点信息。
delete breakpoints:删除所有断点
delete breakpoints n:删除序号为n的断点
disable breakpoints:禁用断点
enable breakpoints:启用断点
Linux项目自动化构建工具-make/Makefile
make/Makefile的重要性
- 会不会写Makefile,从一个侧面说明了一个人是否具备完成大型工程的能力
- 一个工程中的源文件不计数,其按类型、功能、模块分别放在若干个目录中,Makefile定义了一系列的 规则来指定,哪些文件需要先编译,哪些文件需要后编译,哪些文件需要重新编译,甚至于进行更复杂 的功能操作
- Makefile带来的好处就是——“自动化编译”,一旦写好,只需要一个make命令,整个工程完全自动编 译,极大的提高了软件开发的效率。
- make是一个命令工具,是一个解释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了,有了它们两的加入,这将大大的减少我们的工作量
make和Makefile的使用方法
步骤一:在源文件所在的目录下创建一个名为Makefile/makefile的文件
步骤二:编写Makefile
Makefile的编写格式是,先写出文件的依赖关系,然后下一行写出这些文件的依赖方法
根据自己需求可以写一个,也可以写多个
编写完Makefile之后保存退出,然后再命令行当中执行make指令便可以生成可执行程序,以及该过程产生的中间产物
Makefile文件的简写方法:
1.$@: 表示依赖关系的目标文件(冒号的左侧)
2.$^: 表示依赖关系中的依赖文件列表(冒号右侧全部)
3.$<: 表示依赖关系中依赖列表的第一个依赖文件(冒号左侧第一个)
使用以上符号简化上述操作:
说明:gcc/g++携带-c选项时,若不指定输出文件的文件名,则默认输出文件名为 xxx.o,所以这里也可以不用指定文件名
make原理:
1.make会在当前目录下寻找名字为“Makefile”或者“makefile”的文件
2.如果找到,它会找文件当中的第一个目标文件,在上面的例子中,它会找到mytest这个文件,并把这个文件当作最终的目标文件
3.如果mytest文件不存在,或是mytest所依赖的后面的test.o和main.o文件的文件修改时间比mytest文件新(如果比mytest老,make的操作就不会执行),那么它就会执行后面的依赖方法来生成mytest文件
4.如果mytest所依赖的test.o文件不存在,那么make会在Makefile文件中寻找目标为test.o文件的依赖关系,如果找到则在根据其依赖方法生成test.o文件(类似于堆栈的过程)
5.如果你的test.c文件和main.c文件是存在的,make会根据依赖方法生成test.o文件和main.o文件,然后使用这两个文件形成最后的可执行文件mytest
6.make会一层一层的取找文件的依赖关系,直到编译出第一个目标文件
7.在寻找的过程中,如果出现错误,例如最后被依赖的文件找不到,那么make就会直接退出并报错
项目清理
在我们每次生成可执行程序前,都将上一次生成的可执行程序时生成的一系列文件进行清理,除了我们手动清理之外,我们还可以借助 make 帮助我们进行清理,这时我们可以将项目清理的指令加入到Makefile文件当中
像clean这种,没有被第一个目标文件直接或间接关联,那么你直接使用make它不会自动执行,所以我们可以显示使用make执行
注:一般将clean这种目标文件设置为伪目标,使用.PHONY修饰,伪目标的特性是:总是被执行
Linux第一个小程序 - 进度条
行缓冲区的概念
首先我们来感受一下行缓冲区的存在,在LInux当中以下代码的运行结果如何?
对于以上代码,它的输出为:hello world,然后休眠三秒之后结束运行
我将第6行末尾的\n删除之后,其实代码的运行结果就已经改变了,现在的运行结果:先休眠3秒然后才会将hello world输出出来。休眠的3秒钟其实hello world被放到了行缓冲区中,这种现象其实就证明了行缓冲区的存在
显示器对应的是行刷新,即当缓冲区当中遇到‘\n’或是缓冲区被写满才会被打印出来,而在第二份代码当中并没有‘\n’,所以字符串hello world先被写到缓冲区当中去了,然后休眠3秒后,直到程序结束时才将 hello world 打印到显示器当中
\r 和 \n
\r: 回车,使光标回到本行行首
\n: 换行,使光标下移一格
在实际当中,其实我们通常使用的Enter键就等价于 \n + \r
接下来我们来做一个有趣的实验
既然\r是使光标回到本行行首,那么如果我们向显示器上写了一个数之后再让光标回到本行行首,然后再写一个数,不就相当于将前面一个数据给覆盖了吗?
注意:我们可以使用\n刷新缓冲区,也可以使用fflush函数刷新缓冲区,即将缓冲区当中的数据刷新到当前显示器当中
对此我们可以编写一个倒计时的程序
在以上代码的最后,我们使用printf("\n");进行刷新操作,不然最后的数据0会被命令行给刷新掉
进度条代码及效果展示
效果展示:
相关文章:

Linux环境基础开发工具的使用(apt, vim, gcc, g++, gbd, make/Makefile)
目录 什么是软件包 Linux 软件包管理器 apt 认识apt 查找软件包 安装软件 如何实现本地机器和云服务器之间的文件互传 卸载软件 Linux编辑器 - vim vim的基本概念 vim下各模式的切换 vim命令模式下各指令汇总 vim底行模式个指令汇总 Linux编译器 - gcc/g gcc/g的作…...

多模态论文笔记——ViViT
大家好,这里是好评笔记,公主号:Goodnote,专栏文章私信限时Free。本文详细解读多模态论文《ViViT: A Video Vision Transformer》,2021由google 提出用于视频处理的视觉 Transformer 模型,在视频多模态领域有…...

搜索与图论复习1
1深度优先遍历DFS 2宽度优先遍历BFS 3树与图的存储 4树与图的深度优先遍历 5树与图的宽度优先遍历 6拓扑排序 1DFS: #include<bits/stdc.h> using namespace std; const int N10; int n; int path[N]; bool st[N]; void dfs(int u){if(nu){for(int i0;…...

【数据结构】初识链表
顺序表的优缺点 缺点: 中间/头部的插入删除,时间复杂度效率较低,为O(N) 空间不够的时候需要扩容。 如果是异地扩容,增容需要申请新空间,拷贝数据,释放旧空间,会有不小的消耗。 扩容可能会存在…...

第11章:根据 ShuffleNet V2 迁移学习医学图像分类任务:甲状腺结节检测
目录 1. Shufflenet V2 2. 甲状腺结节检测 2.1 数据集 2.2 训练参数 2.3 训练结果 2.4 可视化网页推理 3. 下载 1. Shufflenet V2 shufflenet v2 论文中提出衡量轻量级网络的性能不能仅仅依靠FLOPs计算量,还应该多方面的考虑,例如MAC(memory acc…...

deepseek+vscode自动化测试脚本生成
近几日Deepseek大火,我这里也尝试了一下,确实很强。而目前vscode的AI toolkit插件也已经集成了deepseek R1,这里就介绍下在vscode中利用deepseek帮助我们完成自动化测试脚本的实践分享 安装AI ToolKit并启用Deepseek 微软官方提供了一个针对AI辅助的插件,也就是 AI Toolk…...

深入理解Flexbox:弹性盒子布局详解
深入理解Flexbox:弹性盒子布局详解 一、Flexbox 的基本概念二、Flexbox 的核心属性1. display: flex2. flex-direction3. flex-wrap4. justify-content5. align-items6. flex 三、Flexbox 的实际应用1. 创建响应式三列布局2. 实现垂直居中3. 复杂布局的嵌套使用 四、…...

android Camera 的进化
引言 Android 的camera 发展经历了3个阶段 : camera1 -》camera2 -》cameraX。 正文 Camera1 Camera1 的开发中,打开相机,设置参数的过程是同步的,就跟用户实际使用camera的操作步骤一样。但是如果有耗时情况发生时,会…...

仿真设计|基于51单片机的氨气及温湿度检测报警
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)LCD1602液晶第一行显示当前的氨气值,第二行显示当前的温度…...

关于EDGE IMPULSE的使用与适配,包含如何学习部署在对应的板子
创建好账号后,可以打开主页新建一个工程 跳出这个选no就可以不用标label直接整张图训练,要更改可以去dashboard》labeling method改 然后在这个工程中选择添加自己的照片等数据,他支持这些格式的数据我们现在一般是用在openmv opencv yolo 等…...

【Python蓝桥杯备赛宝典】
文章目录 一、基础数据结构1.1 链表1.2 队列1.3 栈1.4 二叉树1.5 堆二、基本算法2.1 算法复杂度2.2 尺取法2.3 二分法2.4 三分法2.5 倍增法和ST算法2.6 前缀和与差分2.7 离散化2.8 排序与排列2.9 分治法2.10贪心法1.接水时间最短问题2.糖果数量有限问题3.分发时间最短问题4.采摘…...

数据结构 前缀中缀后缀
目录 前言 一,前缀中缀后缀的基本概念 二,前缀与后缀表达式 三,使用栈实现后缀 四,由中缀到后缀 总结 前言 这里学习前缀中缀后缀为我们学习树和图做准备,这个主题主要是对于算术和逻辑表达式求值,这…...

【cocos官方案例改】跳跃牢猫
自制游戏【跳跃牢烟】 案例解析 案例需求,点击鼠标控制白块左右。 资源管理器部分 在body创建一个2d精灵用作玩家。 在地下在创建一个2d精灵用来代表地面。 在body下挂在脚本。 全部脚本如下 (在二次进行复刻时候,发现把代码复制上去无法…...

基于Python的药物相互作用预测模型AI构建与优化(上.文字部分)
一、引言 1.1 研究背景与意义 在临床用药过程中,药物相互作用(Drug - Drug Interaction, DDI)是一个不可忽视的重要问题。当患者同时服用两种或两种以上药物时,药物之间可能会发生相互作用,从而改变药物的疗效、增加不良反应的发生风险,甚至危及患者的生命安全。例如,…...

Day51:type()函数
在 Python 中,type() 是一个内置函数,用于返回对象的类型。它可以用于检查变量的类型,也可以用于动态创建新的类型。今天,我们将深入了解 type() 函数的使用方法。 1. 使用 type() 获取变量的类型 最常见的使用方式是将一个对象…...

因果推断与机器学习—用机器学习解决因果推断问题
Judea Pearl 将当前备受瞩目的机器学习研究戏谑地称为“仅限于曲线拟合”,然而,曲线拟合的实现绝非易事。机器学习模型在图像识别、语音识别、自然语言处理、蛋白质分子结构预测以及搜索推荐等多个领域均展现出显著的应用效果。 在因果推断任务中,在完成因果效应识别之后,需…...

计算机网络一点事(21)
第四章 网络层 功能:服务传输层,封装ip数据报(主机到主机) IP地址以32b表示,以8b为一组记十进制数 异构网络互连:网络结构,主机类型不同 路由器相互配合出IP数据报生成表,根据表…...

springboot使用rabbitmq
使用springboot创建rabbitMQ的链接。 整个项目结构如下: 1.maven依赖 <dependency><groupId>com.rabbitmq</groupId><artifactId>amqp-client</artifactId><version>3.4.1</version> </dependency>application.y…...

【微服务与分布式实践】探索 Eureka
服务注册中心 心跳检测机制:剔除失效服务自我保护机制 统计心跳失败的比例在15分钟之内是否低于85%,如果出现低于的情况,Eureka Server会将当前的实例注册信息保护起来,让这些实例不会过期。当节点在短时间内丢失过多的心跳时&am…...

Day48:获取字典键的值
在 Python 中,字典是一种无序的集合类型,它以键-值对的形式存储数据。字典的每个元素都有一个唯一的键,并且每个键都对应一个值。获取字典中的值是字典操作的常见任务,今天我们将学习如何从字典中获取键对应的值。 1. 使用方括号…...

Java锁自定义实现到aqs的理解
专栏系列文章地址:https://blog.csdn.net/qq_26437925/article/details/145290162 本文目标: 理解锁,能自定义实现锁通过自定义锁的实现复习Thread和Object的相关方法开始尝试理解Aqs, 这样后续基于Aqs的的各种实现将能更好的理解 目录 锁的…...

仿真设计|基于51单片机的温度与烟雾报警系统
目录 具体实现功能 设计介绍 51单片机简介 资料内容 仿真实现(protues8.7) 程序(Keil5) 全部内容 资料获取 具体实现功能 (1)LCD1602实时监测及显示温度值和烟雾浓度值; (2…...

文件读写操作
写入文本文件 #include <iostream> #include <fstream>//ofstream类需要包含的头文件 using namespace std;void test01() {//1、包含头文件 fstream//2、创建流对象ofstream fout;/*3、指定打开方式:1.ios::out、ios::trunc 清除文件内容后打开2.ios:…...

【后端开发】字节跳动青训营Cloudwego脚手架
Cloudwego脚手架使用 cwgo脚手架 cwgo脚手架 安装的命令: GOPROXYhttps://goproxy.cn/,direct go install github.com/cloudwego/cwgolatest依赖thriftgo的安装: go install github.com/cloudwego/thriftgolatest编辑echo.thrift文件用于生成项目&…...

SQL UCASE() 函数详解
SQL UCASE() 函数详解 在SQL中,UCASE() 函数是一个非常有用的字符串处理函数,它可以将字符串中的所有小写字母转换为大写字母。本文将详细介绍UCASE() 函数的用法、语法、示例以及其在实际应用中的优势。 一、UCASE() 函数简介 UCASE() 函数是SQL标准…...

99.23 金融难点通俗解释:小卖部经营比喻PPI(生产者物价指数)vsCPI(消费者物价指数)
目录 0. 承前1. 简述:价格指数对比2. 比喻:两大指数对比2.1 简单对比2.2 生动比喻 3. 实际应用3.1 价格传导现象 4. 总结5. 有趣的对比6. 数据获取实现代码7. 数据可视化实现代码 0. 承前 本文主旨: 本文使用小卖部比喻PPI和CPI,…...

【Elasticsearch】match_bool_prefix 查询 vs match_phrase_prefix 查询
Match Bool Prefix Query vs. Match Phrase Prefix Query 在 Elasticsearch 中,match_bool_prefix 查询和 match_phrase_prefix 查询虽然都支持前缀匹配,但它们的行为和用途有所不同。以下是它们之间的主要区别: 1. match_bool_prefix 查询…...

H. Mad City
题目链接:Problem - H - Codeforces 题目大意:给定一个带环的图, 以及a, b两点 判断再图上不断的移动, b想不与a相遇, a想捉到b, 并且二者只能移动一步。 若b跑不掉 NO 否则YES. 具体题目看链接 输入: …...

【图床配置】PicGO+Gitee方案
【图床配置】PicGOGitee方案 文章目录 【图床配置】PicGOGitee方案为啥要用图床图床是什么配置步骤下载安装PicGoPicGo配置创建Gitee仓库Typora中的设置 为啥要用图床 在Markdown中,图片默认是以路径的形式存在的,类似这样 可以看到这是本地路径&#x…...

《程序人生》工作2年感悟
一些杂七杂八的感悟: 1.把事做好比什么都重要, 先树立量良好的形象,再横向发展。 2.职场就是人情世故,但也不要被人情世故绑架。 3.要常怀感恩的心,要记住帮助过你的人,愿意和你分享的人,有能力…...