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

Ubuntu学习记录

冷知识补充

1.VMware官网安装后,会有两个软件,一个收费(pro)(功能更多,可以一次运行多个虚拟机)(尽管2024年最新版本的也免费了)一个免费(player)。
2.ubuntu打开终端快捷键:ctrl+alt+T
3.在这里插入图片描述
在这里插入图片描述
4.文件表达方式
在这里插入图片描述
5.mounted on 挂载,这个信息可以从Ubuntu中的Disk中看到,或者df -h
6.在这里插入图片描述
7.首先"/"为根目录,“/bin”中存储了相关命令:比如ls
8./home文件夹下每个文件代表一个用户
9.shell寻找程序:会从path环境变量所指示的位置中去找程序(ls命令其实对应的就是一个程序),也可以指定相对位置或绝对位置去找执行程序。
10.修改环境变量方法
临时设置: export PATH = $PATH:/Home/Hellohamburger (仅对当前终端有效,当前终端关闭后就无效了)
永久设置:
在这里插入图片描述
其中方法2仅对当前用户(/Home下的用户)有效,方法1对所有用户有效。
11.修改文件权限chmod

在这里插入图片描述
12.bzip2相比gzip压缩率更高,这两个只能压缩单个文件,不能压缩目录
在这里插入图片描述
13.vi编辑器模式切换
在这里插入图片描述

一些修改操作

/etc/passwd 文件中通过超级用户权限将book用户从/bin/sh变为/bin/bash,即设置book用户登陆系统使用bash这个功能齐全的shell进行命令交互,方便命令补全,这个问题最开始是为了解决ssh连接后Tab无法补全的问题

linux可执行文件

#include <stdio.h> 
int main(int argc, char **argv)   
{ 
printf("hello, world!\n"); 
return 0; 
}
argc为命令行参数的数量,linux从可执行文件名称开始计数,输入几个参数几个参数
比如: ./hello [参数] [参数]   此时argc计数为3
argv为命令行参数的数组

重要文件所在位置

/etc/environment PATH所在位置

相关命令

命令本身是文件路径下的程序,命令的选项和参数为程序的入口参数,前面所指的文件路径包括:1.默认PATH路径下的文件路径2.指定的相对位置或绝对位置路径

df -h 显示分区磁盘挂载信息:磁盘被挂载到哪个文件目录下,其中“/”表示系统根目录
ls -al 所有文件名称及信息(包括隐藏和非隐藏以及用户读写权限信息) 
ls    列举非隐藏文件
ls -a 列举隐藏和非隐藏文件名称
echo $PATH 查看环境变量PATH的值
echo Hamburger 打印Hamburger到终端
echo Hamburger >1.txt 写入Hamburger到1.txt文件中去
> 重定向操作符,这个符号会覆盖文件原有内容
>> 重定向操作符,追加内容
env 查看所有环境变量(环境变量 = 环境变量的值)
lsPATH环境变量所指示的位置中去找程序ls去运行
/bin/ls 从指定位置/bin中去找程序ls去运行
gedit 文本文件编辑程序
cd ~
cd /
cd ..
pwd
cd - 切回到上一次访问的目录
./  当前目录下
../ 上一级目录下
mkdir
rmdir 一般用rm -rf递归强制删除可以直接用
rm -rf [目录名(文件夹名称)],删除路径文件夹中所有信息。
mv ls
cat+文件名,显示文件中的信息或者串联文件并将信息打印出来
cat 01.txt
cat 01.txt 02.txt
Date 查看电脑上的的时间
touch 修改文件时间为当前时间
chmod 改变文件的权限
chmod 777 [文件名] 修改文件权限为rwxrwxrwx(文件所有者/所在用户组/其他用户)
chmod -x [文件名]  修改文件权限为rw-rw-rw-
ls -ld [指定目录] 显示指定目录信息
sudo 申请超级用户(root)的权限
chown 改变文件的所有者
chown book:book(账号名:组名) [文件名] 改变文件的所有者
cp 1.txt 2.txt 复制1.txt中的信息去2.txt(默认情况下:2.txt不存在则新建,存在则覆盖复制)

快捷键

ctrl + l 清空命令行

A

配置网络:Ubuntu 配置的默认源并不是国内的服务器,下载更新软件都比较慢。
源文件保存在/etc/apt/sources.list中,可以在里面添加国内镜像源
软件包管理系统中的apt命令sudo apt-get install gparted 下载磁盘管理工具

B

bzip2 -k test -k表示压缩解压文件时保留源文件

C

cd - 进入上次目录
chmod -w 1.txt 撤销写权限cp * -drf [目标目录] 将当前文件夹文件拷贝到目标目录 -d是保留链接文件 -r是递归 -f是强制 一般链接文件类型用l表示,文件夹为d,普通文件为-

D

dd if=/dev/zero of=test bs=1024 count=1024
dd 处理数据命令
if (intput file)
/dev/zero 是一个特殊的设备文件,它可以看作是一个源源不断输出零字节数据的 “数据源”。
当 dd 命令以它作为输入文件时,就会不断从这里获取零字节数据用于后续的操作,比如创建
一个全是零字节填充的文件。 
of (output file) 输出文件,新建或覆盖
bs (block size) 这意味着 dd 命令在进行数据处理(如读取、写入)时,会以 1024 字节为
一个基本的操作单元。
count 要处理块的数量
上面这条 dd 命令的主要作用是创建一个大小为 1MB(1024*1024) 且内容全部为零字节填充的文件 test。

E

env 查看环境变量

F

find [指定目录] -name [待查找文件名] 从指定目录路径开始搜索
find -name [待查找文件名] 从当前文件目录开始搜索文件
find -name "*1.txt" 其中*是一个通配符,可以找到如21.txt这种文件
find -name "*1.txt*"也可以file [文件名]    查询该文文件的详细属性,比如是可执行文件还是其他等等。

G

grep "abc" [指定文件名] 从指定文件目录中查找含有“abc”的文件的内容
grep "abc" *    *指代当前文件夹下的所有文件
grep "abc" * -n  -n指定显示找到后在第几行
grep "abc" * -nw  -w对应全词匹配
grep "abc" * -nwr   -r (最常用)代表递归查找(不仅找当前目录下的文件,也把当前目录下子文件夹下的文件也进行递归查找)gzip -k [待压缩文件名] -k压缩/解压文件时保留源文件
gzip -dk [待解压文件名] -d解压命令 -k保留源文件编译过程中 gcc test.c -o test -D DEBUG(为程序进行宏定义)
gcc -o hello hello.c 用于将名为 hello.c 的 C 语言源文件编译成可执行文件hello
gcc -E -o hello.i hello.c 预处理之后得到.i文件,将头文件中的内容展开,将宏进行替代,目前还不会处理函数内容
gcc -S -o hello.s hello.i 编译之后得到.s文件,.s文件为汇编语言
gcc -c -o hello.o hello.s 汇编之后得到.o文件,.o文件为机器码
-c 指令是只完成预处理,编译,汇编,但不进行链接
gcc -o hello hello.o 链接操作
gcc -o hello hello.c -v 查看整个编译过程 (这个其实就是一口气全部预处理,编译,
汇编,链接)
gcc进行编译的整个流程:预处理将所有.c文件中的.h文件路径展开,宏定义展开,最后变成.i文件;编译和汇编操作将.i变成.o文件。最后一步是链接,是将所有.c文件生成的.o文件进行链接,这个链接是最后一步,在这一步之前,所有的.c文件是独立编译的,最后一步才会链接合体。
gcc -o [执行文件] [.c文件1] [.c文件2] 将两个.c文件预处理编译汇编并链接成执行文件
gcc -o [执行文件] [.o文件1] [.o文件2] 将两个.o文件直接链接成执行文件gcc编译过程中的头文件位置问题:
include<stdio.h> <>括号会从工具链目录中找
include<sub.h> 假如sub.h不在gcc工具链目录中,那么则必须指定头文件目录,使用-I指定
比如将sub.h文件放在当前文件下,就可以使用
gcc -o main.exe main.c -I ./   -I用来指定头文件的目录 制作使用静态库(静态库在编译时被链接到可执行程序中,一旦链接完成,可执行程序就包含了静态库中的所有代码和数据,不再依赖于外部的库文件,但是,由于静态库的代码被复制到每个可执行程序中,这会导致可执行程序的体积较大,所以不要把静态库运行到板子上)
gcc -c -o main.o  main.c 
gcc -c -o sub.o   sub.c 
ar  crs  libsub.a  sub.o  sub2.o  sub3.o(可以使用多个.o生成静态库) 
ar  crs  libxxx.a  sub.o  sub2.o  sub3.o(可以使用多个.o生成静态库) 
gcc  -o  test  main.o  libsub.a (如果.a不在当前目录下,需要指定它的绝对或相对路径 通过 -L 指定) 制作使用动态库(.so文件,多个可执行程序共享一个动态库,因为库代码在内存中只需要加载一次。同时,动态库的更新也比较方便,只需要更新动态库文件,而无需重新编译所有使用该库的可执行程序)将多个.o文件打包
动态库比较特殊,链接动态库时,可执行程序在运行时还需要能够找到动态库文件。即链接时需要用一次.so文件,程序执行时还需要找一次.so文件。
gcc -c -o main.o  main.c 
gcc -c -o sub.o   sub.c 
gcc -shared  -o libsub.so  sub.o  sub2.o  sub3.o(可以使用多个.o生成动态库) 
-fpic生成位置无关代码,即该动态库可以加载到内存任何位置,因为一个动态库可能被多个程序调用,所以要保证动态库可以加载到任意位置
动态库命名规则:lib[自定] , 比如libsub,libhambur等
gcc -o test main.o  -lsub/-lhambur(-l为指定链接哪一个库文件,sub为libsub的缩写取后半部分)   -L [指定链接时库文件目录] echo 'main(){}'| gcc -E -v -  // 它会列出头文件目录、库目录(LIBRARY_PATH) export LD_LIBRARY_PATH=$LD_LIBRARY_PATH:./指定程序运行时动态库查找路径,仅在当前会话窗口起作用。
等正式做项目的时候再搞这个,也可以去bashrc文件中去修改交叉编译需要在最后面加上-fPIC参数。ldd main(可执行程序):可以检测动态依赖关系是否完善,即动态库加载GDB调试
1.准备工作:关闭编译器的优化选项(-O),并打开调试选项-g,-Wall是在不影响程序行为的情况下打开所有warning,可以帮助发现许多问题,避免不必要的bug
gcc -g -Wall program.c -o program(为调试而进行编译),确保调试时gdb可以找到源文件,显示代码和对应的行号联系起来
GDB命令:
启动退出:
gdb 可执行程序
quit
给程序设置参数
set args 10 20
show args
GDB使用帮助
help
查看当前文件代码:
list/l (从默认位置显示)
list/l [行号] (从指定行显示)
list/l [函数名] (从指定函数显示)
查看非当前文件代码
list/l [文件名:行号] (从指定行显示)
list/l [文件名:函数名] (从指定函数显示)
设置显示行数:
show list
set list [行数]
设置断点:
b/break 行号/函数名/文件名:行号/文件名:函数
查看断点:
i/info b/break
删除断点:
d/del/delete b/break;
设置断点无效
dis/disable 断点编号
设置断点生效
ena/enable 断点编号
设置条件断电(一般在循环的位置)
b/break 10 if i==5
运行:
start (程序停在第一行)
run (遇到断电再停)
c/continue
n/next(不会进入函数体)
s/step(遇到函数进入函数体)
finish(跳出函数体)
p/print 变量名(打印变量值)
ptype 变量名(打印变量类型)
display num (自动打印指定变量的值)
i/info display
undisplay 编号
set var 变量名 = 变量值
until 跳出循环info registers查看汇编代码
backtrace 查看崩溃时的调用栈TUI模式:
layout asm 仅显示汇编
layout spilt 分屏显式源码和汇编
退出TUI模式:tui disable查看数据示例:
在GDB中,x命令用于查看内存内容
通用语法为:x/[数量][格式][单位] 地址
常用格式:
x 十六进制
a 地址(解析符号名)
d 十进制
u 无符号十进制
s 字符串
i 汇编代码
常用单位:
b 字节(1字节)
h 半字(2字节)
w 字(4字节)
g 双字(8字节)
x/1gx查看指针值

H

[命令] --help 输出命令使用提示

I

配置网络工具:
sudo apt install net-tools
ifconfig 查看IP命令
ping news.qq.com 验证是否可以与服务器网络畅通
ping(Packet InterNet Groper) 分组网间探测,探索本地主机与外部服务器(主机)是否联通,使用是ICMP协议

J

K

L

ls -l text* *是通配符,省略后面的路径名
ll 直接列出当前文件夹下的所有信息

M

man [命令] 查看该命令的手册
man 2 open 打开第二项系统调用中的open函数mkdir -p [文件夹名称]mount 命令用来挂载各种支持的文件系统协议到某个目录下。 
mount -t nfs -o nolock,vers=3 192.168.5.11:/home/book/nfs_rootfs /mnt
将远程 NFS 服务器(IP 地址为 192.168.5.11)上的共享目录/home/book/nfs_rootfs挂载到本地的/mnt目录下,这样本地系统就可以像访问本地文件系统一样访问远程 NFS 服务器上的文件make mrproper  Linux 内核源代码目录下使用的命令,它主要用于清理内核源代码树,是内核编译准备工作的一部分。删除所有编译生成的文件和配置文件,例如,如果你之前进行了一次内核编译,生成了很多中间文件和最终的内核镜像文件,执行make mrproper后,这些文件都会被清除,使得源代码目录恢复到比较 “纯净” 的状态,就好像你刚刚解压了内核源代码包一样。
make dtbs 编译设备树makefile内容部分
makefile规则
[目标文件][依赖文件1][依赖文件2].....[依赖文件n]
TAB [命令]
执行规则:如果依赖文件比目标文件新,或者目标文件还未生成,执行命令
举例makefile文件:
test:a.o b.ogcc -o test a.o b.o
a.o:a.cgcc -c -o a.o a.c -c仅预处理编译汇编未链接
b.o:b.cgcc -c -o b.o b.c
执行make命令便会执行makefile文件通配符
%.o:表示所用的.o文件
%.c:表示所有的.c文件
$@:表示目标文件
$<:表示第1个依赖文件
$^:表示所有依赖文件	假想目标:.PHONY
test: a.o b.o c.ogcc -o test $^
%.o : %.cgcc -c -o $@ $<
clean:rm *.o test 清楚所有.o文件和目标文件test,说明执行make命令会生成一系列.o文件和目标文件
为什么要用假想目标?
当文件中存在一个clean文件时,makefile文件中的clean目标文件不会执行。为什么呢?因为makefile文件中目标文件执行的条件是:依赖文件比目标文件新或者目标文件不存在,所以makefile文件中的clean目标文件下的命令不会被执行。使用假想目标的作用就是:假想目标文件不用判断是否存在依赖文件或者依赖文件比目标文件新,而是直接执行假想目标即可
具体示例:
test: a.o b.o c.ogcc -o test $^
%.o : %.cgcc -c -o $@ $<
clean:rm *.o test
.PHONY:clean 这条是设定clean为假想目标的代码,这样的话就算文件里有clean文件,也会执行清楚命令make [目标文件] 如果目标文件为空,则make默认生成第一个目标文件,如果不为空,则生成对应目标文件即时变量,延时变量 export
1.简单变量(即时变量):
A := xxx    # A的值即刻确定,在定义时即确定
对于即使变量使用 “:=” 表示,它的值在定义的时候已经被确定了
2.延时变量
B = xxx   # B的值使用到时才确定
对于延时变量使用“=”表示。它只有在使用到的时候才确定,在定义时并没有确定下来
:= # 即时变量
= # 延时变量
?= # 延时变量, 如果是第1次定义才起效, 如果在前面该变量已定义则忽略这句
+= # 附加, 它是即时变量还是延时变量取决于前面的定义
执行make命令之后,一般会将命令打印下来,如果不想把命令打印下来,就在命令前加@,比较方便。
基本函数
1.foreach
$(foreach,var,list,text) 对list中的每一个var执行text公式
比如:
A = a b c
B = $(foreach f, $(A), $(f).o)
all:@echo B = $(B)
执行make命令后得:B = a.o b.o c.o
2.filter(英文是滤波器的含义)
$(filter pattern...,text)      # 在text中取出符合patten格式的值
3.filter-out
$(filter-out pattern...,text)  # 在text中取出不符合patten格式的值
比如:
C = a b c d/
D = $(filter %/, $(C))
E = $(filter-out %/, $(C))其中%指的是占位符4.$(wildcard pattern) # pattern定义了文件名的格式, wildcard取出其中存在的文件。
比如:
files = $(wildcard *.c)
执行make后在当前文件夹下寻找.c文件
files2 = a.c b.c c.c d.c e.c  abc
files3 = $(wildcard $(files2)) 这个则是判断files2中的文件哪些文件在当前文件夹下真实存在。
特别的,这句话是有错误的,files2 = $(wildcard $(files2)),“=”是延时变量,files2是不能调用自己的,这个是个明显错误。files2 := $(wildcard $(files2))这样子实时赋值是可以的5.patsubst
$(patsubst pattern,replacement,$(var))
patsubst 函数是从 var 变量里面取出每一个值,如果这个符合 pattern 格式,把它替换成 replacement 格式。
比如:
files2  = a.c b.c c.c d.c e.c abc
dep_files = $(patsubst %.c,%.d,$(files2)) 将.c修改为.d,其余保留实例讲解:
头文件依赖问题,makefile将头文件依赖包含的话,这样不论是.c文件还是.h文件变化,都会再次生成.o文件以及最终链接后的文件
gcc -M c.c // 打印出依赖,这个依赖指的是c.c的include的.h文件
gcc -M -MF c.d c.c  // 把依赖的头文件写入文件c.d
gcc -c -o c.o c.c -MD -MF c.d  // 编译c.c生成c.o, 并把依赖头文件写入文件c.dmakefile实例:
objs = a.o b.o c.o 定义延时变量,调用时才会赋值
dep_files := $(patsubst %,.%.d, $(objs))第一个%是匹配字符串,即把a.o替换为.a.o.d
dep_files := $(wildcard $(dep_files))找出在当前文件夹中存在的文件
test: $(objs)gcc -o test $^
ifneq ($(dep_files),)    
include $(dep_files)
endif  判断当前依赖文件是否为空,如果不为空,则全部
%.o : %.cgcc -c -o $@ $< -MD -MF .$@.d 预处理编译汇编第一个依赖文件生成目标文件,并将依赖文件的包含的头文件写入到.d文件中去
clean:rm *.o test    删除所有.o文件和最终的目标文件
distclean:rm $(dep_files) 删除所有依赖文件
.PHONY: clean 

make文件实例:重要是哪个if语句的位置导致程序出现问题,即修改头文件后,二次make有问题。
原因找到了,因为保存.c文件依赖头文件的.d文件中的格式是:a.o : a.c b.h c.h…
这个格式刚好是makefile中目标文件和依赖文件的形式,make没有指定目标文件的时候则会将a.o作为默认输出目标文件。如果把包含include的代码写在test目标文件上面,那么a.o则变成了默认目标文件。第一个make正常是因为.d文件不存在,include代码并没有执行,第二次.d文件存在了,include生效了,结果输出a.o up to date。这下终于想明白了。

#尝试自行编写makefile文件
objs = a.o b.o c.o
dep_files := $(patsubst %,.%.d, $(objs)) #替换名称
dep_files := $(wildcard $(dep_files))    #检查文件是否在当前文件夹下存在
CFLAGS = -Werror -Iinclude   设置编译选项,所以警告提示错误,并添加头文件包含位置在include文件夹下
test : $(objs)      默认执行目标问题gcc -o test $^ ifneq ($(dep_files),)    #查看文件是否非空
include $(dep_files)     #如果不非空,则make包含这些文件
endif        这段代码必须放在默认执行目标的后面,放在前面的话,每次make都得清除原来的文件
%.o : %.cgcc $(CFLAGS) -c -o $@ $< -MD -MF .$@.d    按照编译选项去执行
clean:rm *.o test
disclean:rm $(dep_files)
.PHONY:clean   

N

O

P

poweroff 关机命令

Q

R

rm 一般只能删除文件,不能删除文件夹
rm [文件夹] -r 递归删除文件夹(可以删除文件夹中的普通文件)
rm [文件夹] -rf 递归并强制删除文件夹(删除所有文件,包括.git等这种不可见文件)reboot 重启电脑

S

ssh [用户名]@[目标主机IP地址或域名] 之后输入用户密码就可以远程连接并操作远程服务器了
source ~/.bashrc 重新加载配置文件,使得对于~/.bashrc文件的修改立即生效。

T

tree 查看当前文件夹的目录树
tar 命令更加常用
tar czf test.tar.gz test1
tar xzvf test.tar.gz   解压到当前目录下
tar xzvf test.tar.gz -C [指定解压后存放位置] 
-c:创建文件包
-z:gzip压缩
-J:bzip2压缩
-f:后面跟着一个压缩后的文件名(tar打包,gzip/bzip2压缩)
-v:详细报告tar处理的信息
-x:解压
tar cJf test.tar.bz2(压缩后的文件名) [待压缩文件或文件夹]
tar xJvf test.tar.bz2 
tar xJvf test.tar.bz2 -C [指定解压后存放目录文件夹]tracert (windows)
traceroute (unix)
追踪去往目的地时沿途经过的路由器
traceroute [目的ip地址]

U

ulimit -a 查看用户可以使用的资源

V

vi 2.txt 新建并打开或打开2.txt
vi 2.txt +2 光标跳到第二行还是
vi进入后首先为一般模式:
i(insert模式在光标前输入字符) a(光标后追加模式) i a进入编辑模式 ESC返回到一般模式
终端命令:
:q 退出
:wq 保存并退出
:q! 不保存退出 
一般模式下:
:set number 显示行号
: [行号] 光标跳到该行首个字符
:set nonumber 不显示行号
翻页:
ctrl + f 向前翻页(下一页)
ctrl + b 向后翻页(上一页)
shift + G 转至文件结尾
0 跳到当前行的首字符一般模式下可以执行的命令:
dd 删除该行
d+$ 删除改行从该字符开始之后的所有字符
x 删除光标所在的字符(删除一个字母)
xw 删除一个单词(光标指在首字母)
u 撤销上一步操作
o 增加新的一行yy 复制当前行
nyy 复制当前行及下方的n-1行
p 粘贴最近复制的内容/[字符] 搜索字符
n 提示搜索到的下一个字符
N 向前查找:
:%s/[字符串1]/[字符串2]/g 全局替换字符串1为字符串2
:%s/[字符串1]/[字符串2]/gc   c是确认的意思,替换之前会提示确认

W

X

Y

Z

root用户理解

su root 切换到超级用户

在这里插入图片描述

  • 当执行 su root 命令时,系统会提示输入超级用户(root)的密码(注意,不是当前用户的密码)。这是因为切换到超级用户身份需要超级用户的身份验证。
  • 输入正确的超级用户密码后,系统会将当前用户的环境切换到超级用户的环境,此时用户就拥有了超级用户的所有权限,可以执行任何需要超级用户权限才能完成的任务,比如修改系统关键文件、安装软件包到系统级别的目录、配置系统网络等。
  • sudo(superuser do)是用来申请超级用户权限,会要求输入当前用户的密码,验证当前用户身份后才会给与当前用户使用超级用户权限。

文件IO

./open open.c &  这个&符号表示后台运行该代码,即立刻释放该终端,终端立刻出现命令行提示符,程序在后台执行
执行该命令后输出:[作业号] 进程ID号
Ctrl+Z 挂起进程
ps显示当前进程
kill -9 [进程ID] 强制杀死该进程
cd /proc/[进程号]/fd 查看系统进程目前打开的文件
主要函数实例:
sprintf(result_buf, "%s,%d,%d,%d,%d,%s", name, scores[0], scores[1], scores[2], sum, levels[level]);
sscanf(data_buf, "%[^,],%d,%d,%d,", name, &scores[0], &scores[1], &scores[2]);
其中%[^,]用于匹配除都好之外的字符序列(即一直读取字符,直到遇到逗号为止)
len = read(fd, buf, sizeof(buf)-1);
fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0644);
lseek(fd, 3, SEEK_SET);光标偏移
fd = open(argv[1], O_RDWR | O_CREAT | O_TRUNC, 0777);
比较新的一个函数:
int fd3 = dup(fd);复制文件句柄fd为fd3,即假设文件句柄fd对应的文件为1.txt,fd3也对应1.txt.韦东山例程里给的案例是使用open函数读文件时,文本位置光标会偏移,而fd3保留了fd的偏移。
dup2(fd, 1);把文件句柄句柄为1的文件指针指向fd,文件句柄:0表示标准输入文件,1表示标准输出文件,2表示标准错误文件。此时操作系统的标准输出文件就指向fd所对应的文件了。

相关文章:

  • EXIST与JOIN连表比较
  • Flink基本理解
  • 缓存穿透、缓存击穿、缓存雪崩解决方案
  • MySQL 索引详解与原理分析
  • Typescript总结篇——配置TS、基础知识(类型、接口、类型别名、泛型、extendsinfer关键字)
  • 递归+反射+注解(动态拼接建表语句)
  • BitsAndBytesConfig参数描述
  • RESTful风格
  • C++网络编程入门学习(四)-- GDB 调试 学习 笔记
  • 面试题 - 微服务相关的经典问题(33道)
  • 解决echarts图表legend文本太长;echarts图表的图例legend省略号显示
  • 第十节第四部分:常见API:秒杀案例、Calendar
  • SkyWalking 报错:sw_profile_task 索引缺失问题分析与解决
  • Javascript 编程基础(4)函数 | 4.4、bind() 方法
  • 重磅升级!Google Play商店改版上线
  • 13、自动配置【源码分析】-自动包规则原理
  • Postgres数据库配置用户读写权限(read_write)和只读权限(read_only):
  • 第23天-Python Flet 开发指南
  • Quasar 使用 Pinia 进行状态管理
  • 10.18 LangChain ToolMessage实战:多轮交互与状态管理全解析
  • 电子商务网站开发/国际新闻大事
  • 网站备案流程/百度竞价推广联系方式
  • 克拉玛依住房和建设局网站/百度助手app免费下载
  • 小学生制作书签/上海网站优化公司
  • 做网站为什么差价很大/邳州网站开发