【寻找Linux的奥秘】第三章:基础开发工具(上)
请君浏览
- 前言
- 1. 软件包管理器
- 1.1 linux中安装软件
- 1.2 yum的具体操作
- 1.2.1 查找软件包
- 1.2.2 安装软件
- 1.2.3 卸载软件
- 1.3 小结
- 2. 编辑器vim
- 2.1 vim的基本概念和操作
- 2.2 命令模式的命令集
- 光标定位
- 其他命令
- 模式切换(常用的)
- 2.3 末⾏模式的命令集
- 2.4 小结
- 2.5 使用sudo指令(补)
- 3. 编译器gcc
- 3.1 gcc编译选项
- 3.1.1 预处理
- 3.1.2 编译
- 3.1.3 汇编
- 3.1.4 链接
- 3.2 动静态链接和动静态库
- 尾声
前言
本专题将介绍关于Linux操作系统的种种,那么基于上一章讲述的是对于linux中的权限的概念,本章将讲解关于Linux中的基本开发工具编辑器vim与编译器gcc。(本章节默认使用的环境是centos 7.8)
俗话说的好——“工欲善其事,必先利其器”。想要真正学会一款操作系统,那么合理的利用各种工具(也就是我们所说的软件)是必不可少的。但是想要用这些工具,我们首先要下载安装这些软件,下面先让我们来看一看在Linux下如何下载安装软件。
1. 软件包管理器
1.1 linux中安装软件
这里我们所说的工具其实就是各种可以给我提供帮助的软件。在windows系统中,我们想要安装软件可以在浏览器上搜索对应的软件进行下载安装,也可以在对应的应用商店中进行下载安装,那么在Linux中我们该如何去下载呢?在Linux中安装软件的方案常见的有三种:
-
使用源代码安装。
首先我们知道,每一个软件都是通过各种代码编译出来的,那么只要我们有了相应软件的源代码后进行编译,便可以得到可执行程序。这是一个在Linux下安装软件的通用方式,但是这样在面对一个大型软件或者闭源的软件时会很麻烦。除非在某些极端情况下只能使用它,一般情况下不推荐使用。
-
rpm包安装。
在我们下载安装一个软件时,我们并不是只安装一个可执行程序,还需要安装它所对应的各类插件、库等,我们把这些称作依赖,也就是说当我们下载A软件时不仅要下载A软件,还需要下载它所需要的各种依赖,这样它才以正常运行。举一个简单的例子,当我们编译运行C语言代码时需要用到各种库,我们要成功运行这些代码就需要有这些库,没有的话代码就无法运行。例如在windows中一个普通的画图软件,如下图所示,除了对应的可执行程序,剩下的我们都可以理解为它的依赖,如果有的依赖缺失轻则软件功能缺失,重则软件直接无法运行:
在Linux中把我们要下载的软件打了一个包,叫做rpm包,但是在这些rpm包中只有对应的应用程序,而没有对应的依赖。因此如果使用rpm包进行下载我们还需要去自己下载它所依赖的各种库,特别麻烦,所以也不推荐使用。
-
包管理器进行安装–
yum/apt
。yum(Yellow dog Updater, Modified)
是Linux下⾮常常⽤的⼀种包管理器. 主要应⽤在Fedora, RedHat, Centos等发⾏版上。Ubuntu:主要使⽤
apt(Advanced Package Tool)
作为其包管理器。apt同样提供了⾃动解决依赖关系、下载和安装软件包的功能。在Linux中我们最常用的安装工具(虽然它也是工具,但在我们使用的这些发行版中是提前预装好的)就是包管理器,在Centos下是yum,在Ubuntu下是apt,它们的指令与功能基本上是一样的,只有在一些地方右细微的差别。使用包管理器安装软件是我们在Linux中安装软件最常用的方法。
在上面三种安装方式中最为简单以及方便的就是使用包管理器了,软件的发布者通常会把⼀些常⽤的软件提前编译好, 做成软件包(可以理解成windows上的安装程序,包含了各种依赖)放在⼀个服务器上, 通过包管理器可以很⽅便的获取到这个编译好的软件包, 直接进⾏安装,软件包与包管理器之间我们可以理解为App和应用商店之间的关系。要知道我们下载的软件都是在远端的服务器上的,应用商店有执行搜索、下载安装的功能,非常的便捷方便。
我们知道,Linux是国外所创造的操作系统,那么对应的软件包服务器也在国外,由于一些限制,我们没法直接进行访问,那么该怎么办呢?国内很多公司以及高校提供了很多的Linux发行版的镜像,所谓的镜像,简单理解为完全拷贝到国内,这样我们在进行下载安装便不会受到阻碍
如果我们使用的是各类云服务器的话,它内置的配置文件已经把国外的软件源替换为了国内的镜像源,但如果使用的虚拟机的话我们需要手动更改对应的yum源或者是apt源。
这里博主使用的华为云的云服务器,所以yum的配置文件中已经替换为了华为自己的镜像源。
简单来说,我们在Linux下安装软件需要使用到yum或者apt这种包管理器工具,它们会根据对应的配置文件去寻找对应的服务器下载对应的软件。我们需要把这些配置文件切换为国内的镜像源才能正常的使用。云服务器在发行前自己已经切换了,而虚拟机则需要自己手动切换,这是清华大学的开源软件镜像站,感兴趣的可以了解一下。
1.2 yum的具体操作
那么我们该如何使用包管理器安装软件(这里用yum来演示)呢?下面来演示一下:
1.2.1 查找软件包
我们下载一个软件的前提是我们要知道下载什么软件,也就是说我们要知道软件的名字,通过 yum list
命令可以罗列出当前⼀共有哪些软件包。由于包的数⽬可能⾮常之多, 这⾥我们需要使⽤ grep
命令只筛选出我们关注的包.。例如我们想要安装一个叫做sl的软件:
在上图所示中第一列是软件的名字,第二列则分别对应主版本号.次版本号.源程序发行号-软件包的发行号.主机平台
"x86_64"
后缀表⽰64位系统的安装包, “i686” 后缀表⽰32位系统安装包. 选择包时要和系统匹配。"el7"
表⽰操作系统发⾏版的版本。 “el7” 表⽰的是 centos7/redhat7. “el6” 表⽰ centos6/redhat6。- 最后⼀列, base 表⽰的是 “软件源” 的名称, 类似于各类品牌的应用商店这样的概念。
1.2.2 安装软件
安装软件也就是把软件拷贝到指定的系统目录下,要修改系统目录,所以我们需要用到root账户或者使用sudo命令进行指令提权。那么让我们来安装一下sl,需要用到yum install
命令:
安装软件我们需要用到install
选项,-y
是强制安装,不加入该选项在安装时系统找到目标软件包时会再次询问你是否安装该软件,最后出现Complete!
则表示软件已经安装成功。
在Linux下我们安装的这些软件也就是可执行程序都在/user/bin目录下,下面我们来运行一个该程序,直接输入sl,和使用我们的指令一样,前面也讲过,所谓的各类指令就是可执行程序:
这是一个简单好玩的小程序,运行后会出现一辆小火车行驶而过。
在Linux中,我们安装了程序之后这些程序是在系统目录中的,所以每个用户都可以去使用,也就是说软件只需要安装一次都可以使用(除非是某个用户安装到自己的家目录中等情况)。
需要注意的是:yum/apt安装软件只能⼀个装完了再装另⼀个。正在yum/apt安装⼀个软件的过程中,如果再尝试⽤yum/apt安装另外⼀个软件,yum/apt会报错。
1.2.3 卸载软件
卸载软件需要用到的指令是yum remove
,例如:
与安装一样,可以添加-y
选项直接强制删除,不再询问,当出现Complete!
表示已经删除成功。
1.3 小结
使用yum命令的三板斧(需要使用root账号或者使用sudo进行指令提权):
- 查找:
yum list | grep name
。(apt中查找需要使用apt search
命令) - 安装:
yum install [-y] name
。 - 卸载:
yum remove [-y] name
。
在使用包管理器时需要保证主站网络畅通。这是一个包含各种有意思的小程序网站,感兴趣的可以了解一下。
软件源有标准源和扩展源之分,我们可以理解为打游戏时的正式服和体验服,一个是稳定的,而另一个则是新出的还并不稳定,处于测试阶段。我们可以安装扩展源去体验一些软件,使用sudo yum install -y epel-release
命令就可以安装扩展源。像上面我们演示的sl就是在扩展软件源中的。
2. 编辑器vim
在Linux中我们最常见编写代码的工具就是编辑器vim,它支持多模式编写。它是系统中自带的编辑器。
2.1 vim的基本概念和操作
首先,vim一共拥有14种模式:七种基本模式和七种额外模式(seven BASIC modes and seven ADDITIONAL modes)。不过我们最常用的模式只有三种,只需要掌握好这三种模式便可以熟练的使用vim,它们分别是:命令模式、插入模式、末行模式,各模式的功能区分如下:
- 命令模式(command mode):控制屏幕光标的移动,字符、字或⾏的删除,移动复制某区段及进⼊Insert mode下,或者到 last line mode。
- 插入模式(Insert mode ):只有在Insert mode下,才可以做⽂字输⼊,按「ESC」键可回到命令⾏模式。该模式是我们后⾯⽤的最频繁的编辑模式。
- 末行模式(last line mode ):⽂件保存或退出,也可以进⾏⽂件替换,找字符串,列出⾏号等操作。
模式之间可以进行切换。打开vim编辑器我们默认所在的模式为命令模式。
如果要查看你的所有模式:打开 vim,在底⾏模式中直接输⼊help vim-modes
即可查看。
我们用vim打开一个文件,使用命令vim filename
,若是打开一个不存在的文件在我们保存退出后会自动创建该文件:
进入之后默认处于命令模式:
我们需要切换到插入模式才能够输入文字,进行编写。从命令模式切换到插入模式有三种办法,分别是按下a、i、o键:
- a键:进⼊插⼊模式后,是从⽬前光标所在位置的下⼀个位置开始输⼊⽂字;
- i键: 进⼊插⼊模式后,从光标当前位置开始输⼊⽂字;
- o键:进⼊插⼊模式后,在光标所在行下插⼊新的⼀⾏,从⾏⾸开始输⼊⽂字;
不论在哪种模式下,我们要想回到命名模式,只需要无脑按Esc键即可。想要退出vim编辑器,需要进入末行模式输入:
w
(保存当前⽂件)wq
(输⼊「wq」,存盘并退出vim)q!
(输⼊q!,不存盘强制退出vim)
2.2 命令模式的命令集
对于插入模式来说就是正常的编写,不会涉及到各种命令,同时,我们在插入模式中编写时也没办法进行复制粘贴等操作,这些操作必须在命令模式中输入内容当作命令的方式来进行,可以理解为命令模式中的命令就是在windows下那些我们所熟悉的快捷键。命令模式存在的意义就是为了提高编辑效率
光标定位
vim可以直接⽤键盘上的光标来上下左右移动,但正规的vim是⽤⼩写英⽂字⺟「h」、「j」、「k」、「l」
,分别控制光标左、下、上、右移⼀格
- gg:光标定位到文件第一行的行首
- num+gg:光标定位到num行的行首
- shift+g:光标定位到文件最后一行的行首
- num+shift+g:光标定位到num行的行首
- shift+4:光标定位到行尾
- shift+6:光标定位到行首
- w:光标以单词为单位向后移动(这里的单词指的是被vim当作一个独立块的单词,不是英语上的单词)
- b:光标以单词为单位向前移动
在我们打开vim的时候,我们可以通过vim+filename+num进入vim后光标直接定位到num行。对于光标的定位还有其他的各类命令,不过上面的命令已经可以满足我们的日常需求了。
其他命令
- yy:复制当前行
- num+yy:复制从当前行开始往下数num行
- p:粘贴到当前行的下一行
- num+pp:粘贴到当前行的下一行num次
- dd:剪切当前行
- num+dd:剪切从当前行开始往下数num行(也可以用作删除)
- x:删除光标之后的字符,包括光标(也可以批量化,前面加数字)
- shift+x:删除光标之前的字符(也可以批量化,前面加数字)
- shift+~:快速大小写切换
- r:小范围的文本替换。选中光标所在内容,输入要替换的字符(也可以批量化,前面加数字)
- u:撤销上一次操作
- ctrl+r:对u进行撤销(只要不退出vim,可以一直进行撤销)
- shift+zz:保存并退出vim
模式切换(常用的)
-
shift+;:进入末行模式
-
a、i、o:进入插入模式
-
shift+r:进入替换模式,进行批量化替换
-
ctrl+v:进入视图模式,进行批量化编辑(常用于注释代码和去注释)
hjkl移动光标+shift+i+//+Esc:批量化注释
hjkl移动光标+shift+d:批量化去注释
2.3 末⾏模式的命令集
在使⽤末⾏模式之前,请记住先按「ESC」键确定已经处于命令模式,再按shift+;
即可进⼊末⾏模式。
- set nu:列出行号
- num:跳转到文件的num行
- /+关键字:从文件开头开始查找字符,按n键一直往后查找
- ?+关键字:从文件末尾开始查找字符,按n键一直往前查找
- q:退出,如果⽆法离开vim,可以输入去
q!
强制离开vim。 - w:保存,一般配合q使用,
wq
,这样在退出的时候还可以保存⽂件。 - !+命令:在不退出vim的情况下执行命令行的命令
- vs+filename:进行分屏操作。切换光标
ctrl+ww
- %s+/a/b/g:把文件中所有的a替换为b
2.4 小结
在vim
对于vim的使用没有什么技巧,有的只是熟能生巧,只要大家熟练练习,就一定能够掌握vim。
在我们使用裸vim写代码时没有缩进、语法高亮等功能,会使我们写代码时很难受,我们可以通过更改vim的配置文件来使它符合我们的使用习惯。
在⽬录 /etc
下⾯,有个名为vimrc
的⽂件,这是系统中公共的vim配置⽂件,配置后对所有⽤⼾都有效。
⽽在每个⽤⼾的主⽬录下,都可以⾃⼰建⽴私有的配置⽂件,命名为:.vimrc
。用vim打开该文件,输入需要的配置选项即可,例如:
- 设置语法⾼亮: syntax on
- 显⽰⾏号: set nu
- 设置缩进的空格数为4: set shiftwidth=4
当然,如果你想使vim拥有更多的功能,可以选择安装插件来完善配置,这里不再详细介绍,感兴趣的朋友可以去网上搜索。
2.5 使用sudo指令(补)
在上一章我们讲解权限时提到如果要使用sudo命令那么我们的账户必须是在一个类似于白名单的文件中,接下来教大家如何添加到白名单中:
首先我们要切换到root账户,然后用vim打开/etc/sudoers
:
进入之后我们先切换到末行模式,查找关键字root
,如下图所示:
找到这里之后切换回命令模式,用yy复制该行,然后用p进行粘贴,之后进入插入模式将用户名改为你要加入的用户名,之后保存强制退出即可。这样我们对应的账户就可以使用sudo命令进行命令提权了。
3. 编译器gcc
gcc是Linux下编译C语言的工具,它只能编译以.c
为结尾的文件,它可以把文件编译成可执行程序:
3.1 gcc编译选项
格式:gcc [选项] 要编译的⽂件 [选项] [⽬标⽂件]
首先我们要知道编译一共分为四步,分别是:预处理、编译、汇编、链接。
第一个选项是确定我们要进行到哪一步,如果不加则直接编译成可执行程序,也就是四步全部执行,第二个选项一般为-o
,后面跟的是文件名,意味着生成指定文件名的文件。
3.1.1 预处理
预处理的主要目的是进行宏替换、去掉注释、条件编译、头文件展开等等。我们可以通过-E
选项进行程序翻译,一旦预处理做完就停下来,生成.i
文件:
.i
⽂件为已经过预处理的C原始程序。
3.1.2 编译
编译的主要目的是生成汇编代码,我们可以通过-S
选项进行程序翻译,当编译完成形成汇编就停下来,生成.s
文件:
在这个阶段中,gcc⾸先要检查代码的规范性、是否有语法错误等,以确定代码的实际要做的⼯作,在检查⽆误后,gcc 把代码翻译成汇编语⾔。
3.1.3 汇编
汇编的主要目的是生成机器可识别码,汇编阶段是把编译阶段⽣成的.s
⽂件转成.o
⽂件,我们可以通过-c选项信息程序翻译,汇编完成就停下来,生成.o
文件:
这里我们生成的.o
文件被称为可重定位目标二进制文件,还不能执行。
3.1.4 链接
链接的目的是生成可执行文件或库文件。在成功编译后就进入了链接阶段。在当前阶段gcc我们只需要直接编译文件即可:
对于我们当前阶段来说gcc进行程序翻译的过程中我们需要对链接有一个认识。
3.2 动静态链接和动静态库
在我们的实际开发中,不可能将所有代码放在⼀个源⽂件中,所以会出现多个源⽂件,⽽且多个源⽂件之间不是独⽴的,⽽会存在多种依赖关系,如⼀个源⽂件可能要调⽤另⼀个源⽂件中定义的函数,但是每个源⽂件都是独⽴编译的,即每个*.c⽂件会形成⼀个*.o⽂件,为了满⾜前⾯说的依赖关系,则需要将这些源⽂件产⽣的⽬标⽂件进⾏链接,从⽽形成⼀个可以执⾏的程序。这个链接的过程就是静态链接。静态链接的缺点很明显:
- 浪费空间:因为每个可执⾏程序中对所有需要的⽬标⽂件都要有⼀份副本,所以如果多个程序对同⼀个⽬标⽂件都有依赖,如多个程序中都调⽤了printf()函数,则这多个程序中都含有printf.o,所以同⼀个⽬标⽂件都在内存存在多个副本;
- 更新⽐较困难:因为每当库函数的代码修改了,这个时候就需要重新进⾏编译链接形成可执⾏程序。但是静态链接的优点就是,在可执⾏程序中已经具备了所有执⾏程序所需要的任何东西,在执⾏的时候运⾏速度快。
动态链接的出现解决了静态链接中提到问题。动态链接的基本思想是把程序按照模块拆分成各个相对独⽴部分,在程序运⾏时才将它们链接在⼀起形成⼀个完整的程序,⽽不是像静态链接⼀样把所有程序模块都链接成⼀个单独的可执⾏⽂件。
动态链接其实远⽐静态链接要常⽤得多。⽐如我们查看下code
这个可执⾏程序依赖的动态库,会发现它就⽤到了⼀个c动态链接库:
ldd
命令⽤于打印程序或者库⽂件所依赖的共享库列表。
在这⾥涉及到⼀个重要的概念: 库
- 在我们的C程序中,并没有定义“printf”的函数实现,且在预编译中包含的“stdio.h”中也只有该函数的声明,⽽没有定义函数的实现,那么是在哪⾥实“printf”函数的呢?
答案是系统把这些函数实现都被做到名为 libc.so.6
的库⽂件中去了,在没有特别指定时,gcc 会到系统默认的搜索路径/usr/lib
下进⾏查找,也就是链接到 libc.so.6
库函数中去,这样就能实现函数“printf”了,⽽这也就是链接的作⽤
静态库是指编译链接时,把库⽂件的代码全部加⼊到可执⾏⽂件中,因此⽣成的⽂件⽐较⼤,但在运⾏时也就不再需要库⽂件了。其后缀名在Linux下⼀般为.a
,在windows下一般为.lib
动态库与之相反,在编译链接时并没有把库⽂件的代码加⼊到可执⾏⽂件中,⽽是在程序执⾏时由运⾏时链接⽂件加载库,这样可以节省系统的开销。动态库后缀在Linux下一般为.so
,在windows下一般为.dll
。如前⾯所述的 libc.so.6
就是动态库。
gcc 在编译时默认使⽤动态库进行动态链接,如果想要使用静态链接需要加入选项-static
。但是在Linux中一般只会存在动态库,静态库需要我们自己去进行下载,使用命令yum install glibc-static libstdc++-static -y
从上图中可以看出静态链接的文件是远大于动态链接的。但是动态库是共享的,不能丢失,一旦丢失所有依赖动态库的程序都会运行出错。而静态链接是把我们要的库方法实现直接拷贝到我们的可执行程序中,库文件哪怕丢失也不会影响我们的可执行程序。
尾声
本章讲解就到此结束了,若有纰漏或不足之处欢迎大家在评论区留言或者私信,同时也欢迎各位一起探讨学习。感谢您的观看!
相关文章:
【寻找Linux的奥秘】第三章:基础开发工具(上)
请君浏览 前言1. 软件包管理器1.1 linux中安装软件1.2 yum的具体操作1.2.1 查找软件包1.2.2 安装软件1.2.3 卸载软件 1.3 小结 2. 编辑器vim2.1 vim的基本概念和操作2.2 命令模式的命令集光标定位其他命令模式切换(常用的) 2.3 末⾏模式的命令集2.4 小结…...
Photoshop 2025 Mac中文Ps图像编辑
Photoshop 2025 Mac中文Ps图像编辑 文章目录 Photoshop 2025 Mac中文Ps图像编辑一、介绍二、效果三、下载 一、介绍 Adobe Photoshop 2025 Mac版集成了多种强大的图像编辑、处理和创作功能。①强化了Adobe Sensei AI的应用,通过智能抠图、自动修复、图像生成等功能…...
#SVA语法滴水穿石# (004)关于 ended 和 triggered 用法
在 SystemVerilog 断言(SVA, SystemVerilog Assertions)中,ended 是一个用于 序列(sequence) 的关键字,它表示某个序列(sequence)在特定时间点已经成功匹配(即“结束”)。 ended 主要用于 同步不同序列的时间关系,尤其是在多序列组合或属性(property)中需要对齐时…...
16.1Linux自带的LED灯驱动实验(知识)_csdn
前面我们都是自己编写 LED 灯驱动,其实像 LED 灯这样非常基础的设备驱动, Linux 内核已经集成了。 Linux 内核的 LED 灯驱动采用 platform 框架,因此我们只需要按照要求在设备树文件中添加相应的 LED 节点即可,本章我们就来学习如…...
普通类、抽象类和接口的区别
1. 普通类 (Concrete Class) 定义:完整的类,可以直接实例化 特点: 可以包含属性、普通方法(有具体实现)和构造方法 可以被直接实例化创建对象 可以被继承(除非用final修饰) 示例࿱…...
使用 Elastic 实现端到端的大语言模型(LLM)可观测性:洞察生成式 AI 应用这个不透明的世界
作者:来自 Elastic Daniela Tzvetkova 及 Bahubali Shetti 在快速发展的人工智能领域,大语言模型(Large Language Models - LLMs)已成为创新的灯塔,为各行各业带来了前所未有的能力。从生成类人文本、翻译语言到提供个…...
15.2linux设备树下的platform驱动编写(程序)_csdn
我尽量讲的更详细,为了关注我的粉丝!!! 修改设备树文件: 这个我们在上一章已经写过了,但是还是带着大家来重写一遍! 1.打开pinctrl-stm32.c 这个文件: strict 成员变量默认为 true&…...
Java的Selenium的特殊元素操作与定位之window切换
当你要操作另外一个窗口页面的元素时,一定要注意先切换窗口 切换方式:传入要操作窗口的name或者句柄handle driver.switchTo.window(nameOrHandle); 如何获取到窗口的句柄 driver.getWindowHandle();//获取当前操作窗口的句柄driver.getWindowHandles();//获取测…...
【Rust学习】Rust环境搭建和Rust基础语法
本文专栏:Rust学习 目录 一,Rust环境搭建 1,C环境安装 2,Rust下载 3,Rust安装 4,Rust环境检测 二,创建Rust项目 1,rustc 2,cargo 三,输出到命令行 …...
在windows环境下通过docker-compose脚本自动创建mysql和redis
一、环境版本 在windows环境下通过docker容器运行各种服务,使用的软件版本如下: docker desktop :V4.39.0 【docker的安装环境设置略】 mysql:9.2 redis:7.4.2 二、各配置文件 1.已经解决了字符集和排序规则问题造成…...
【玩泰山派】2、制作buildroot镜像,并烧录
文章目录 前言制作buildroot镜像过程搭建环境(docker版)下载泰山派开发的sdk利用制作的镜像和下载的sdk去启动开发docker容器编译buildroot镜像 参考 前言 泰山派官方提供了不少现成的镜像 但是都买了泰山派了,肯定是想自己编译折腾下&…...
实验二 VLAN 的配置与应用
一、实验目的 1. 熟悉 VLAN 和 PORT VLAN 的原理; 2. 熟悉华为网络模拟器的使用; 3. 掌握网络拓扑图的绘制; 4. 掌握单交换机内 VLAN 的配置。 二、实验设备 PC、华为模拟器 ENSP。 三、实验步骤 知识准备:VLAN 和 PORT V…...
【C/C++算法】蓝桥杯之递归算法(如何编写想出递归写法)
绪论:冲击蓝桥杯一起加油!! 每日激励:“不设限和自我肯定的心态:I can do all things。 — Stephen Curry” 绪论: ———————— 早关注不迷路,话不多说安全带系好,发车啦&am…...
coding ability 展开第九幕(位运算——进阶篇)超详细!!!!
文章目录 前言丢失的数字两整数之和只出现一次的数字II消失的两个数字总结 前言 上一篇博客,我们已经把位运算的基础知识,以及基本运算都掌握啦 上次的习题还是让人意犹未尽,今天我们来尝试一下难一点的题目 位运算熟练起来真的让人觉得做题是…...
Python实现NOA星雀优化算法优化随机森林回归模型项目实战
说明:这是一个机器学习实战项目(附带数据代码文档视频讲解),如需数据代码文档视频讲解可以直接到文章最后关注获取。 1.项目背景 在现代数据科学领域,回归分析是解决预测问题的核心工具之一。然而,在面对复…...
蓝桥云客--浓缩咖啡液
4.浓缩咖啡液【算法赛】 - 蓝桥云课 问题描述 蓝桥杯备赛选手小蓝最近刷题刷到犯困,决定靠咖啡续命。他手上有 N 种浓缩咖啡液,浓度分别是 A1%, A2%, …, AN%,每种存货都是无限的。为了提神又不炸脑,小蓝需要按比例混合这…...
异常【C++】
文章目录 异常异常的概念和基本语法异常的三个关键字: 异常抛出和被接收的过程异常的再次抛出再次抛出被非catch(...)捕捉到的异常再次抛出被catch(...)捕捉到的异常 异常规范异常安全异常的优缺点优点缺点总结&#x…...
关于图片分类任务的猜想 | 撰写论文 paper
关于图片分类任务的猜想 | 撰写论文 paper 背景Yolo 是一次巨大的飞跃过滤无关的特征Yolo 的问题 背景 在计算视觉领域,有几个关键的演变。 1)CNN 卷积的出现,这是一个大的创新; 2)从卷积到 AlexNet ,是更…...
路由器和交换机
路由器和交换机分别位于OSI模型和TCP/IP模型的不同网络层次,具体对比如下: 1. 路由器(Router) 所属层级: OSI模型:网络层(第3层)TCP/IP模型:网络互联层(Int…...
jEasyUI 表单验证
jEasyUI 表单验证 引言 jEasyUI 是一款流行的 jQuery UI 扩展库,它提供了丰富的 UI 组件和交互效果,极大地方便了前端开发工作。在 jEasyUI 中,表单验证是一个非常重要的功能,它可以帮助开发者确保用户输入的数据符合预期的格式和规则。本文将详细介绍 jEasyUI 表单验证的…...
PIKE 助力知识库进阶:多模型协作下的精准信息 “捕手”
PIKE(通常指的是字节跳动提出的一种技术)增强检索知识库是一种结合了先进的信息检索技术和知识库管理的系统。它旨在提高知识检索的准确性、效率和召回率,以更好地满足用户对知识的需求。 特点和工作原理 数据增强 :对知识库中…...
使用Ubuntu18恢复群晖nas硬盘数据外接usb
使用Ubuntu18恢复群晖nas硬盘数据外接usb 1. 接入硬盘2.使用Ubuntu183.查看nas硬盘信息3. 挂载nas3.1 挂载损坏nas硬盘(USB)3.2 挂载当前运行的nas 4. 拷贝数据分批传输 5. 新旧数据对比 Synology NAS 出现故障,DS DiskStation损坏,则可以使用计算机和 U…...
Dify票据识别遇到的分支判断不准确问题
已测试这篇文章中 https://zhuanlan.zhihu.com/p/5465385787 使用多分支条件判断使用不同的大模型识别图片内容 发现了细节问题。在使用时若不注意,分支会出现走向不准的问题。 需要关注部分 下方红框处。1,2后不能跟点。否则会出问。除此之外࿰…...
Flutter学习总结之Android渲染对比
一、Android 界面渲染机制(基于原生 View 体系) 1. 核心渲染流程(源码级解析) 三阶段渲染流程(ViewRootImpl驱动): Measure 阶段(measure()): View调用onMea…...
Media streaming mental map
Media streaming is a huge topic with a bunch of scattered technologies, protocols, and formats. You may feel like hearing fragments without seeing the big picture. Let’s build that mental map together — here’s a high-level overview that connects everyt…...
7B斗671B:扩散模型能否颠覆自回归霸权?
模型对决:从7B到671B的意外之战 参数量与性能的反差 DeepSeek V3以6710亿参数稳坐自回归模型的“巨无霸”地位,而70亿参数的Dream 7B却在多项测试中与其不分伯仲。例如,在需要复杂规划的“倒计时任务”中,Dream 7B的解题成功率比…...
WVP-GB28181摄像头管理平台存在弱口令
免责声明:本号提供的网络安全信息仅供参考,不构成专业建议。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我联系,我将尽快处理并删除相关内容。 漏洞描述 攻击者可利用漏洞获取当前系统管…...
实验研究:不同物体与落点材质对弹起高度的影响
本研究通过控制变量法,探讨了不同物体(乒乓球和笔)在不同下落高度和落点材质条件下,其弹起高度的变化。实验结果显示,物体类型、下落高度和落点材质均对弹起高度有显著影响。其中,铁碗作为落点材质时&#…...
开源 PDF.js 文件编辑操作
一、PDF.js PDF.js 是 Mozilla 基金会推出的一个使用 HTML5 构建的 PDF 阅读器,它完全使用 JavaScript 编写。作为 Firefox 浏览器的默认 PDF 查看器,PDF.js 具有强大的兼容性和稳定性。它不仅支持 PDF 文件的查看和渲染,还提供了丰富的交互…...
hydra小记(一):深入理解 Hydra:instantiate() 与 get_class() 的区别
hydra小记(一):深入理解 Hydra:instantiate 与 get_class 的区别 深入理解 Hydra:instantiate() 与 get_class() 的区别1. hydra.utils.get_class()2. hydra.utils.instantiate()3. 总结对比 深入理解 Hydra࿱…...
在 macOS 上安装和配置 Aria2 的详细步骤
在 macOS 上安装和配置 Aria2 的详细步骤: 1.安装 Aria2 方式一:使用 Homebrew Homebrew 是 macOS 上的包管理器,可以方便地安装和管理软件包。 • 打开终端。 • 输入以下命令安装 Aria2: brew install aria2• 检查安装是否…...
Linux开发工具——make/makefile
📝前言: 这篇文章我们来讲讲Linux开发工具——make/makefile: 🎬个人简介:努力学习ing 📋个人专栏:Linux 🎀CSDN主页 愚润求学 🌄其他专栏:C学习笔记…...
生信分析服务MR孟德尔随机化单细胞测序转录组数据分析网络药理学
将孟德尔随机化(MR)、单细胞测序、转录组数据分析和网络药理学结合,是当前生物信息学领域的前沿方法,尤其在疾病机制解析、靶点发现和药物研发中展现出巨大潜力。以下从技术逻辑、应用场景和服务流程三个维度展开说明:…...
Sentinel实战(五)、系统保护规则、限流后统一处理及sentinel持久化配置
Spring Cloud Alibaba-Sentinel实战(五)、系统保护规则、限流后统一处理及sentinel持久化配置 一、系统保护规则一)、系统规则支持的模式二)、新增系统规则界面三)、demo测试二、限流后统一处理实操demo三、sentinel持久化配一、系统保护规则 系统保护规则是从应用级别的…...
iPhone XR:一代神机,止步于此
什么样的 iPhone ,才配称为一代神机? 我曾经用过iPhone 4S、iPhone 6S Plus、iPhone 8 Plus,iPhone SE2、iPhone XR、iPhone 13、iPhone 14 Plus、iPhone 15/Pro。 不管硬件再怎么卷,不管囊中是否羞涩,主力机基本没考…...
[C++面试] explicit面试8问 —— 较难,可简单了解即可
Google C规范建议所有单参数构造函数必须加explicit,除非明确需要隐式转换(如std::string从const char*构造)。 1. 隐式转换的实际危害 隐式转换可能导致资源泄漏或逻辑错误(如std::vector<int> v 10;可能被误认为初始化…...
2024-2025 CSS前沿技术全景解析:构建下一代Web界面的核心武器库
前言:CSS的范式革命 当WebAssembly与JavaScript持续争夺开发者注意力时,CSS正在经历一场静默的革命。2024年CSS工作组发布的Level 4/5草案,标志着样式语言正式进入「智能样式」时代。本文将从15个维度深入剖析未来两年最具变革性的CSS新特性…...
flutter row里面怎么统一高度
在 Flutter 中,Row 是一个水平布局的组件,默认情况下,它的子组件的高度是根据每个子组件的内容自动调整的。如果你希望 Row 中的所有子组件具有统一的高度,可以通过以下几种方式实现。 1. 使用 SizedBox 或 Container 设置固定高度…...
pinia-plugin-persist、vuex
pinia-plugin-persist 作用:为 Pinia 状态管理库实现状态持久化,自动将指定的 Pinia store 状态保存到本地存储(如 localStorage 或 sessionStorage),并在应用启动时从本地存储恢复状态。效果:确保应用状态…...
Spring Boot整合MyBatis-Plus实现CRUD操作教程
本文将演示如何在Spring Boot项目中整合MyBatis-Plus框架,快速实现数据库的增删改查操作。相较于原生MyBatis,MyBatis-Plus提供了更简洁的API和自动化功能。 环境准备 JDK 1.8MySQL 5.7Spring Boot 2.7.xMyBatis-Plus 3.5.x 实现步骤 1. 创建项目并添加…...
Vue 3 的响应式原理
Vue 3 的响应式原理可以比喻为“智能监控系统”:当数据变化时,它能自动追踪依赖关系并触发更新。以下是通俗解释和核心机制: 一、核心原理:Proxy 代理 Vue 3 的响应式系统基于 JavaScript 的 Proxy 对象实现(Vue 2 使…...
使用Scrapy官方开发的爬虫部署、运行、管理工具:Scrapyd
一般情况下,爬虫会使用云服务器来运行,这样可以保证爬虫24h不间断运行。但是如何把爬虫放到云服务器上面去呢?有人说用FTP,有人说用Git,有人说用Docker。但是它们都有很多问题。 FTP:使用FTP来上传…...
基于51单片机和8X8点阵屏、独立按键的单人弹球小游戏
目录 系列文章目录前言一、效果展示二、原理分析三、各模块代码1、8X8点阵屏2、独立按键3、定时器04、定时器1 四、主函数总结 系列文章目录 前言 用的是普中A2开发板,用到板上的独立按键、8X8点阵屏。 【单片机】STC89C52RC 【频率】12T11.0592MHz 效果查看/操作…...
群体智能避障革命:RVO算法在Unity中的深度实践与优化
引言:游戏群体移动的挑战与进化 在《全面战争》中万人战场恢弘列阵,在《刺客信条》闹市里人群自然涌动,这些令人惊叹的场景背后,都离不开一个关键技术——群体动态避障。传统路径规划算法(如A*)虽能解决单…...
Java 实现选择排序:[通俗易懂的排序算法系列之一]
引言 大家好!从今天开始,我计划写一个关于常见排序算法的系列文章,旨在用通俗易懂的方式,结合 Java 代码实现,帮助大家理解和掌握这些基础但非常重要的数据结构与算法知识。 排序是计算机科学中最基本的操作之一&…...
动画过渡设置
使用Animator的Trigger参数 步骤 1:打开 Animator 窗口 确保你的 Sprite 对象已添加 Animator 组件。 在 Unity 编辑器顶部菜单栏,选择 Window > Animation > Animator,打开 Animator 窗口。 步骤 2:创建 Trigger 参数 在…...
【项目管理-高项】学习方法 整体概览
相关文档,希望互相学习,共同进步 风123456789~-CSDN博客 1.背景 📝 软考高项,全称 信息系统项目管理师 ,是软考高级资格项目之一。 本考试考三门科目:综合知识(上午)、案例分析(下午…...
HarmonyOS应用开发者高级-编程题-001
题目一:跨设备分布式数据同步 需求描述 开发一个分布式待办事项应用,要求: 手机与平板登录同一华为账号时,自动同步任务列表任一设备修改任务状态(完成/删除),另一设备实时更新任务数据在设备…...
HarmonyOS-ArkUI Ability进阶系列-UIAbility与各类Context
UIAbility及相关类关系 一个模块编译的时候会出一个HAP包, 每一个HAP包在运行时都对应一个AbilityStage。 AbilityStage持有一个AbilityStageContext一个APP, 有时候会有很多个HAP包, 至少一个。 一个APP运行时,对应的是我们的App…...
接口并行执行且流式顺序输出的解决方案
接口并行执行且流式顺序输出的解决方案: import asyncio from aiotas_agi2all_llms_utils.output_answer_from_ask_question_results import (reasoning_model_ask_question, ) import os from aiotas_agi2all_llms_utils.logging_utils import create_logger import uuid fr…...