Linux系统远程操作和程序编译
目录
一、Linux远程终端登录、图形桌面访问、 X图形窗口访问和FTP文件传输操作
1.1 桥接模式
1.2 putty远程登录Ubuntu
1.3 win10远程登录并上传下载文件
1.4 X server仿真软件安装
1.5 树莓派在putty上的远程登录
1.6 使用ftp远程登录并实现文件上传下载
1.7 Linux下的图形界面软件使用(Xming、Putty)
1.7.1 Xming下载与安装
1.7.2 Xming和Putty配置
1.7.3 通过Putty进行图像界面软件的运行
二、阿里云服务器运行Talk程序
2.1 在阿里云服务器上登录后,运行talk程序与其他用户进行文字聊天
2.2 然后自己用c语言写一个linux进程之间通信(聊天)的简单程序
三、ubuntu下OpenCV图像显示
3.1 下载安装
3.1.1 下载安装包并解压
3.1.2 使用 cmake安装opencv
3.1.3 使用make创建并编译安装
3.1.4 配置环境
3.2 打开图片进行特效显示
3.2.1 示例图片
3.2.2 具体过程
3.2.3 相关问题
四、总结
一、Linux远程终端登录、图形桌面访问、 X图形窗口访问和FTP文件传输操作
1.1 桥接模式
将虚拟机Ubuntu系统的网络连接设置为“桥接模式”,并配置Ubuntu的IP、网关参数,保证其他同学的win10系统能够ping通你的Ubuntu;在Ubuntu和树莓派上分别用 sudo adduser添加2个用户名classmate1,、classmate2,密码均为123456;
(1)设置桥接模式
Win10主机的网络查看:ipconfig
(2)配置Ubantu的网络参数:使用静态ip配置
sudo nano /etc/netplan/01-netcfg.yaml
保存文件并运行以下命令应用配置:
使用另一台电脑使用ping命令观察是否成功:
(3)添加用户
(4)安装ssh服务
sudo apt update sudo apt install openssh-server sudo systemctl enable ssh sudo systemctl start ssh
1.2 putty远程登录Ubuntu
让同学使用创建账号在win10下用putty或xshell等远程登录你的Ubunt系统(注意要打开SSH服务);
这里我们使用Putty连接虚拟机
(1)打开Putty输入自己的虚拟机的IP地址,port选为22。随后点击Open进行访问。
(2)进入终端,使用我们创建的账号进入虚拟机
1.3 win10远程登录并上传下载文件
让同学在win10下用 ftp或xshel等软件l远程登录你的Ubunt系统,上传和下载文件(注意要打开SSH服务);
我们使用FileZilla
输入完主机、用户名、密码、端口号等信息之后,连接,随后在左侧选择要上传的文件夹即可
1.4 X server仿真软件安装
在客户端windows下安装X server仿真软件(这里我们使用免费软件 Xming), 以及终端软件,这次实验采用 putty。
安装好之后打开让它在后台运行。
(1)打开PuTTY,进入Connection→SSH→Auth→X11 forwarding并勾选,然后使用classmate1访问虚拟机
(2)输入指令连接windows系统:
set DISPLAY=xxx.xxx.xxx.xxx:0
(3)输入命令打开windows下载的Xing:
gedic
(4)打开火狐浏览器:
1.5 树莓派在putty上的远程登录
1.Putty的下载与安装
进入Putty官网下载:Download PuTTY: latest release (0.83)
双击安装文件,自定义安装路径,然后一直NExt到安装完成,点击finish
双击Putty图标文件,进入主界面
2.树莓派的远程登录
关于树莓派环境的配置,和如何创建多个用户,可以看我之前写的这个博客:
安装树莓派3B+环境-CSDN博客
接下来我们在另一台同子网下的主机进行对应操作。
在框中对应输入树莓派的IP地址,(注意选择SSH服务),点击Open连接,若跳出下图界面,选择Accept,输入用户名和密码。
1.6 使用ftp远程登录并实现文件上传下载
在电脑命令行中使用ssh命令登录树莓派
1.vsftpd的下载
输入以下命令下载vsftpd:sudo apt-get install vsftpd
2.修改配置文件
输入以下命令进入文件vsftpd.v并对应将图片中圈出的语句前的#删掉
cd /etc/
sudo nano vsftpd.conf
3.重新启动服务
sudo service vsftpd restart
4.ftp远程登录树莓派
打开cmd命令行
输入ftp <树莓派的IP地址>然后对应输入用户名和密码进行登录
4.文件上传
首先我们在电脑中找到我们要上传的文件路径
然后我们在命令行中写入下面代码
mkdir week8 //新建文件夹,用于存放待会上传的文件
ls //查看所有文件夹,可以看见我们新创建的week8
cd week8 //打开week8文件夹
lcd E:\ //进入本地目录中,LCD 后面跟自己文件所在的目录
put helloworld.c //将helloworld.c文件上传至该文件夹中
通过ls命令我们可以查看该文件是否上传成功
可以看到文件已经成功上传。
5.文件下载
输入下面命令
lcd D:\ //进入本地目录D盘
get helloworld.c //下载helloworldworld.c文件,多个文件下载使用mget
我们可以在D盘中找到该文件
1.7 Linux下的图形界面软件使用(Xming、Putty)
1.7.1 Xming下载与安装
Xming官网下载地址:https://sourceforge.net/projects/xming/
分别下载Xming和其字体包
自行选择对应的目录安装,确保选中"Xming Font Server",我直接默认配置安装的。
1.7.2 Xming和Putty配置
1.Xming的配置
打开XLaunch出现如下界面,选择"Multiple windows",Display number设为0,勾选"No Access Control",其他保持默认
完成后可看见Xming在后台运行
2.Putty配置
(1)打开PuTTY,在Session中输入:
Host Name: 树莓派/Ubuntu服务器的IP地址,Port: 22(默认SSH端口)
(2)配置X11转发:
Connection > SSH > X11,勾选"Enable X11 forwarding",X display location设为"localhost:0"
点击Open建立连接,输入用户名和密码登录
如果正确配置了PuTTY的X11转发,不需要手动设置DISPLAY变量。SSH连接会自动设置正确的DISPLAY环境变量
可以通过以下命令验证:
echo $DISPLAY
若没有,可以通过以下命令进行DISPLAY环境配置
set DISPLAY=<电脑IP地址>:0
3.测试图形程序
输入以下命令进行测试:
# 测试简单图形程序
xeyes
1.7.3 通过Putty进行图像界面软件的运行
1.图形界面文件的打开
首先通过VNC远程登录到树莓派系统桌面
由于博主之前已经配置好桌面系统环境,这里就不赘述了,没下载VNC的可以看这个博客:树莓派3b:环境配置,VNC远程控制并进行简单代码运行_树莓派vnc-CSDN博客
输入以下命令打开对应的图形界面
gedit <文件名>
若没下载gedit,可以通过下面命令进行下载
sudo apt update
sudo apt install gedit -y
可以在桌面系统看见helloworld.c文件已经被打开
2.图形界面软件的打开
输入以下命令:
firefox
若出现以下报错,其为 Firefox 在树莓派上运行时无法检测到 GPU 加速支持,导致图形渲染问题。
我们通过以下命令安装缺失的图形库:
sudo apt install libgl1-mesa-dri libgl1-mesa-glx -y
然后我们重新运行Firefox,就可以出现如下界面
总结思考
1、 X窗口协议与远程桌面VNC-viewer协议有什么差异?
X窗口系统(X Window System,简称X11)和VNC(Virtual Network Computing)是两种不同的远程图形界面技术,它们在设计原理、通信方式和使用场景上有显著差异。
(1)基本概念
X窗口协议
设计目标:提供网络透明的图形显示服务,允许应用程序(客户端)在远程运行,而图形界面(服务端)在本地显示。
核心思想:分离应用程序逻辑和图形渲染,支持分布式图形计算。
典型应用:Linux/Unix系统下的图形程序远程运行(如通过SSH -X转发)。
VNC
设计目标:实现完整的远程桌面控制,将远程主机的屏幕画面传输到本地,并允许本地操作。
核心思想:传输屏幕像素变化,实现“所见即所得”的远程操作。
典型应用:跨平台远程桌面管理(如Windows远程协助、服务器维护)。
(2)协议架构
X窗口协议
客户端-服务器模型:
X Server:运行在本地,负责显示图形和接收输入(如键盘、鼠标)。
X Client:运行在远程的应用程序(如Firefox、MATLAB)。
通信方式:传输绘图指令(如“画线”“填充颜色”),而非像素数据。
网络端口:默认端口6000+(如DISPLAY=:0对应6000)。
VNC
服务器-客户端模型:
VNC Server:运行在远程主机,捕获屏幕像素并发送给客户端。
VNC Viewer:运行在本地,接收像素数据并发送输入事件(如鼠标点击)。
通信方式:传输压缩的屏幕像素(类似视频流)。
协议:基于RFB(Remote Framebuffer Protocol),默认端口5900+。
(3)性能与效率
对比项 X窗口协议 VNC 贷带宽需求 低(传输指令) 高(传输像素,依赖压缩算法) 延迟 低(适合交互式应用) 较高(频繁画面更新时可能卡顿) 适用场景 单个图形应用远程运行 完整桌面远程控制 (4)安全性
对比项 X窗口协议 VNC 原生加密 无(需SSH隧道保护) 支持SSL/TLS加密(如TigerVNC) 认证方式 xauth或IP限制(较弱) 密码/密钥认证 (5)使用场景
X窗口协议的适用场景
在本地显示远程Linux服务器上的图形程序(如通过ssh -X运行Wireshark)。
开发调试分布式图形应用(如科学计算可视化)。
VNC的适用场景
远程控制完整的桌面环境(如Windows远程桌面替代方案)。
跨平台支持(Windows/macOS/Linux均可作为服务端或客户端)。
(6)典型工具
协议 服务端工具 客户端工具
X窗口协议: 内置(Linux/Unix系统) Xming(Windows)、XQuartz(macOS)
VNC :TigerVNC/RealVNC Server Remmina/VNC Viewer
2、你会发现新建的账号无法使用sudo命令,请问如何解决这个问题?
在 Ubuntu 中,新建的用户无法使用 sudo命令是因为该用户未被添加到 sudo用户组(或 /etc/sudoers 文件中未授权)。我们可以通过root账户操作:
切换到root用户:
su - root
或
sudo - i
将新用户添加到sudo组:
usermod -aG sudo 新用户名
验证是否生效:
groups 新用户名
二、阿里云服务器运行Talk程序
在阿里云服务器上使用XTerminal登录后,可以运行各种命令来管理服务器或与服务器上的其他用户进行交互。
2.1 在阿里云服务器上登录后,运行talk程序与其他用户进行文字聊天
(1)登录阿里云服务器
(2)输入以下命令查看当前登录用户的终端
who
(3)输入以下命令启动聊天
talk
(4)等待对方连接
(5)对方收到请求,回应【talk 用户名】
talk 用户名
至此,Talk成功启动
2.2 然后自己用c语言写一个linux进程之间通信(聊天)的简单程序
要进行Talk的双方一个运行socket_client.c ,另一个运行 socket_server.c
socket_client.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>#define BUFFER_SIZE 1024void *receive_messages(void *arg) {int sock = *((int *)arg);char buffer[BUFFER_SIZE];int bytes_read;while (1) {bytes_read = read(sock, buffer, BUFFER_SIZE);if (bytes_read <= 0) {printf("Server disconnected\n");exit(EXIT_SUCCESS);}buffer[bytes_read] = '\0';printf("\nReceived: %s", buffer);printf("Enter message (or 'exit' to quit): ");fflush(stdout);}return NULL;
}int main(int argc, char const *argv[]) {if (argc != 2) {printf("Usage: %s <server_ip>\n", argv[0]);exit(EXIT_FAILURE);}int sock = 0;struct sockaddr_in serv_addr;char buffer[BUFFER_SIZE] = {0};pthread_t thread_id;// 创建socketif ((sock = socket(AF_INET, SOCK_STREAM, 0)) < 0) {perror("socket creation error");exit(EXIT_FAILURE);}serv_addr.sin_family = AF_INET;serv_addr.sin_port = htons(8080);// 将IP地址从字符串转换为二进制形式if (inet_pton(AF_INET, argv[1], &serv_addr.sin_addr) <= 0) {perror("invalid address");exit(EXIT_FAILURE);}// 连接服务器if (connect(sock, (struct sockaddr *)&serv_addr, sizeof(serv_addr)) < 0) {perror("connection failed");exit(EXIT_FAILURE);}printf("Connected to server at %s\n", argv[1]);// 创建接收消息的线程if (pthread_create(&thread_id, NULL, receive_messages, (void *)&sock) < 0) {perror("could not create thread");exit(EXIT_FAILURE);}// 主线程处理发送消息printf("Enter message (or 'exit' to quit): ");while (fgets(buffer, BUFFER_SIZE, stdin)) {if (strncmp(buffer, "exit", 4) == 0) {write(sock, "Client exiting...", 17);break;}write(sock, buffer, strlen(buffer));printf("Enter message (or 'exit' to quit): ");}close(sock);return 0;
}
socket_server.c
#include <stdio.h>
#include <stdlib.h>
#include <string.h>
#include <unistd.h>
#include <arpa/inet.h>
#include <pthread.h>#define PORT 8080
#define BUFFER_SIZE 1024void *handle_client(void *arg) {int client_socket = *((int *)arg);char buffer[BUFFER_SIZE];int bytes_read;while (1) {bytes_read = read(client_socket, buffer, BUFFER_SIZE);if (bytes_read <= 0) {break;}buffer[bytes_read] = '\0';printf("Received: %s", buffer);printf("Enter reply (or 'exit' to quit): ");fgets(buffer, BUFFER_SIZE, stdin);if (strncmp(buffer, "exit", 4) == 0) {write(client_socket, "Server exiting...", 17);break;}write(client_socket, buffer, strlen(buffer));}close(client_socket);pthread_exit(NULL);
}int main() {int server_fd, client_socket;struct sockaddr_in address;int opt = 1;int addrlen = sizeof(address);pthread_t thread_id;// 创建socket文件描述符if ((server_fd = socket(AF_INET, SOCK_STREAM, 0)) == 0) {perror("socket failed");exit(EXIT_FAILURE);}// 设置socket选项if (setsockopt(server_fd, SOL_SOCKET, SO_REUSEADDR | SO_REUSEPORT, &opt, sizeof(opt))) {perror("setsockopt");exit(EXIT_FAILURE);}address.sin_family = AF_INET;address.sin_addr.s_addr = INADDR_ANY;address.sin_port = htons(PORT);// 绑定socket到端口if (bind(server_fd, (struct sockaddr *)&address, sizeof(address)) < 0) {perror("bind failed");exit(EXIT_FAILURE);}// 开始监听if (listen(server_fd, 3) < 0) {perror("listen");exit(EXIT_FAILURE);}printf("Server started on port %d. Waiting for connections...\n", PORT);while (1) {// 接受新连接if ((client_socket = accept(server_fd, (struct sockaddr *)&address, (socklen_t*)&addrlen)) < 0) {perror("accept");continue;}printf("New connection from %s\n", inet_ntoa(address.sin_addr));// 为每个客户端创建新线程if (pthread_create(&thread_id, NULL, handle_client, (void *)&client_socket) < 0) {perror("could not create thread");continue;}// 分离线程,使其结束后自动释放资源pthread_detach(thread_id);}close(server_fd);return 0;
}
在服务器和客户端机器上分别编译:
服务器端
gcc socket_server.c -o server -lpthread
客户端
gcc socket_client.c -o client -lpthread
接下来我们进行通讯尝试:
在服务器机器上启动服务器程序:
./server
在客户端机器上启动客户端程序,指定服务器IP地址:
./client <服务器IP地址>
三、ubuntu下OpenCV图像显示
编写一个打开图片进行特效显示的代码 test1.cpp
3.1 下载安装
3.1.1 下载安装包并解压
下载安装资源压缩包
将下载好的压缩包opencv-3.4.11放在主目录文件夹下
解压缩(打开虚拟机终端,输入命令 unzip opencv-3.4.11.zip)
unzip opencv-3.4.11.zip
解压缩以后主目录文件夹如下:
进入到解压后的文件夹中
cd opencv-3.4.11
3.1.2 使用 cmake安装opencv
(1)首先进入 root 用户,并更新一下
sudo su
sudo apt-get update
(2)执行以下命令安装 cmake
sudo apt-get install cmake
这里直接按enter键默认继续安装
(3)cmake安装完成
(4)安装依赖库
sudo apt-get install build-essential libgtk2.0-dev libavcodec-dev libavformat-dev libjpeg.dev libtiff5.dev libswscale-dev libjasper-dev
(5)创建build文件夹,进入build文件夹
(6)使用cmake 编译参数
cmake ..
运行结果如下:
3.1.3 使用make创建并编译安装
(1)在build文件夹下进行
输入以下命令
sudo make
(2)编译完成
(3)安装
输入以下命令
sudo make install
(4)安装完成
3.1.4 配置环境
(1)修改 opencv.conf文件,打开后的文件是空的,添加opencv库的安装路径:/usr/local/lib
输入以下命令
sudo gedit /etc/ld.so.conf.d/opencv.conf
输入路径/usr/local/lib 并保存,记得点小叉叉退出文件编辑界面
出现警告是正常的
(2)更新系统共享链接
sudo ldconfig
(3)配置bash,修改 bash.bashrc 文件
输入以下命令
sudo gedit /etc/bash.bashrc
(4)在文件末尾加入
PKG_CONFIG_PATH=$PKG_CONFIG_PATH:/usr/local/lib/pkgconfig
export PKG_CONFIG_PATH
(5)然后执行以下命令使得配置生效
source /etc/bash.bashrc
(6)输入以下命令更新
sudo updatedb
我输入之后显示找不到命令,好像是之前有个软件包没安装成功
解决方法:
运行以下命令安装 mlocate软件包
sudo apt-get update
sudo apt-get install mlocate
手动运行 updatedb
sudo updatedb
(7)查看 opencv 的版本信息
如下图所示,说明安装成功
3.2 打开图片进行特效显示
3.2.1 示例图片
3.2.2 具体过程
(1)新建文件夹code
输入以下命令创建新的文件夹
mkdir code
cd code
(2)新建文件 test1.cpp
输入以下命令新建 test1.cpp 文件
vim test1.cpp
(3)test1.cpp代码
#include <opencv2/highgui.hpp>
#include <opencv2/opencv.hpp>
using namespace cv;
using namespace std;
int main(int argc, char** argv)
{CvPoint center;double scale = -3; IplImage* image = cvLoadImage("lena.jpg");argc == 2? cvLoadImage(argv[1]) : 0;cvShowImage("Image", image);if (!image) return -1; center = cvPoint(image->width / 2, image->height / 2);for (int i = 0;i<image->height;i++)for (int j = 0;j<image->width;j++) {double dx = (double)(j - center.x) / center.x;double dy = (double)(i - center.y) / center.y;double weight = exp((dx*dx + dy*dy)*scale);uchar* ptr = &CV_IMAGE_ELEM(image, uchar, i, j * 3);ptr[0] = cvRound(ptr[0] * weight);ptr[1] = cvRound(ptr[1] * weight);ptr[2] = cvRound(ptr[2] * weight);}Mat src;Mat dst;src = cvarrToMat(image);cv::imwrite("test.png", src);cvNamedWindow("test",1); imshow("test", src);cvWaitKey();return 0;
}
输入代码以后,按Esc 输入 :wq保存退出
vim修改代码,按i进入插入模式;按Esc再输入 :wq 保存并退出
(4)把图片粘贴到code目录下
(5)编译 test1.cpp 文件
g++ test1.cpp -o test `pkg-config --cflags --libs opencv`
(6)运行
输入以下命令运行
./test
运行结果
3.2.3 相关问题
1、 gcc test1.cpp -o test1 pkg-config --cflags --libs opencv
这条编译命令,是如何获得opencv头文件、链接lib库文件的路径的?
命令解析: gcc:GNU 编译器,用于编译 C/C++ 程序。 test1.cpp:源代码文件,包含 OpenCV 的代码。 -o test1:指定输出的可执行文件名称为 test1。 `pkg-config --cflags --libs opencv`:这是一个子命令用于,动态获取 OpenCV 的编译和链接参数。 pkg-config:一个工具,用于查询已安装库的编译和链接参数。 --cflags:获取 OpenCV 的头文件路径(-I 参数)。 --libs:获取 OpenCV 的库文件路径(-L 参数)和库名称(-l 参数)。
(1)pkg-config --cflags --libs opencv
会返回 OpenCV 的头文件路径和库文件路径,例如:
-I/usr/local/include/opencv4 -L/usr/local/lib -lopencv_core -lopencv_imgproc -lopencv_highgui ...
(2)这些参数会被传递给 gcc
,确保编译器能够找到 OpenCV 的头文件和库文件。
2、改用make+makefile方式编译 上述程序(用变量命名格式写makefile文件,并包括 clean选项)
将以下内容保存为 Makefile 文件,放在 code 目录下
# 定义变量
CXX = g++
CXXFLAGS = `pkg-config --cflags opencv`
LDFLAGS = `pkg-config --libs opencv`
SRC = test.cpp
OBJ = test.o
TARGET = test
# 默认目标
all: $(TARGET)
# 编译规则
$(TARGET): $(OBJ)$(CXX) $(CXXFLAGS) $(LDFLAGS) -o $(TARGET) $(OBJ)
# 生成对象文件
$(OBJ): $(SRC)$(CXX) $(CXXFLAGS) -c $(SRC) -o $(OBJ)
# 清理
clean:rm -f $(OBJ) $(TARGET)
在终端运行以下命令
cd ~/code
make
运行程序
./test
清理编译文件
make clean
3、用cmake方式进行编译
将以下内容保存为 CMakeLists.txt
文件,放在 ~/code
目录下:
# CMake 最低版本要求
cmake_minimum_required(VERSION 3.10)
# 项目名称
project(OpenCVTest)
# 查找 OpenCV
find_package(OpenCV REQUIRED)
# 添加可执行文件
add_executable(test test.cpp)
# 链接 OpenCV 库
target_link_libraries(test ${OpenCV_LIBS})
(1)在 ~/code
目录下创建一个构建目录并进入:
cd ~/code
mkdir build
cd build
(2)运行 cmake
和 make
:
cmake ..
make
编译完成后,可执行文件 test
会生成在 build
目录中
(3)运行程序
./test
(4)清理
删除 build 目录
rm -rf ~/code/build
4、对比总结
方式 | 优点 | 适用场景 |
---|---|---|
直接 gcc | 简单快速 | 单文件小项目 |
Makefile | 支持多文件、变量管理、增量编译 | 中小型项目 |
CMake | 跨平台、自动检测依赖、适合大型项目 | 大型或跨平台项目 |
四、总结
本次学习围绕Linux系统的远程操作和图像处理展开。通过学习,了解到了Linux系统的远程终端登录、图形桌面访问、文件传输以及OpenCV图像处理等技术。在远程操作部分,配置了Ubuntu虚拟机的网络连接为桥接模式,通过创建用户并开启SSH服务,和同学实现了Putty和Xshell远程登录到我的Ubuntu和树莓派系统,完成了文件的上传和下载操作。在OpenCV图像处理部分,成功安装了OpenCV库,并编写了一个简单的图像程序,用gcc、Makefile和CMake进行编译,了解了第三方库的使用和编译流程。
相关文章:
Linux系统远程操作和程序编译
目录 一、Linux远程终端登录、图形桌面访问、 X图形窗口访问和FTP文件传输操作 1.1 桥接模式 1.2 putty远程登录Ubuntu 1.3 win10远程登录并上传下载文件 1.4 X server仿真软件安装 1.5 树莓派在putty上的远程登录 1.6 使用ftp远程登录并实现文件上传下载 1.7 Linux下的…...
Mac配置开发环境
博主是一名Python后端开发,有时候环境太多 需要配置太多,故做此文章 环境Macbook ,请注意自己的是ARM 还是x86 结构 Vscode/Cursor配置Python debug 配置Debug launch.json {"version": "0.2.0","configuratio…...
LabVIEW配电器自动测试系统
随着航天技术的迅猛发展,航天器供配电系统的结构越来越复杂,对配电器的功能完整性、稳定性和可靠性提出了更高要求。传统人工测试方式难以满足高效率、高精度、可重复的测试需求。本项目开发了一套基于LabVIEW平台的宇航配电器自动测试系统,融…...
生成与强化学习:赋予VLA系统物理行动能力
引言:从“理解世界”到“改变世界” 当机器能够“看懂”图像、“听懂”指令时,一个更根本的挑战浮现:如何让它们像人类一样,将认知转化为精准的物理动作?无论是机械臂抓取杯子,还是自动驾驶汽车紧急避障&a…...
基于Springboot+Mysql的闲一品(含LW+PPT+源码+系统演示视频+安装说明)
系统功能 管理员功能:首页、个人中心、用户管理、零食分类管理、零食信息管理、订单评价管理、系统管理、订单管理。用户功能:首页、个人中心、订单评价管理、我的收藏管理、订单管理。前台首页功能:首页、零食信息、零食资讯、个人中心、后…...
jupyter4.4安装使用
一、chrome谷歌浏览器 1. 安装 1.1 下载地址: 下载地址: https://www.google.cn/intl/zh-CN_ALL/chrome/fallback/ 2 插件markdown-viewer 2.1 下载地址: 下载地址:https://github.com/simov/markdown-viewer/releases 2.2…...
Linux虚拟内存详解
引言 虚拟内存是现代操作系统中的核心概念之一,它为进程提供了一个连续的、独立的地址空间,有效解决了物理内存限制问题,并大大简化了程序开发和执行。本文将深入探讨Linux系统中虚拟内存的工作原理、实现机制以及相关的内存管理技术&#x…...
数据库安装(基于Linux下centos7)(保姆级教程)
前言:笔者有段时间没写博客了,今天笔者要分享新的知识了,那就是数据库,笔者会通过博客系统的且通俗易懂的分享数据库知识,对于想要学习数据库和学习过数据库的老铁复习都是非常有用的,绝对干货满满,那么今天…...
【自动驾驶 机器人】速度规划 |梯形/S型速度曲线
参考文章: (1)【自动驾驶】运动规划丨速度规划丨T型/S型速度曲线 (2)一文教你快速搞懂速度曲线规划之S形曲线(超详细图文推导附件代码) 1 梯形速度曲线 如下图所示梯形速度/加速度/加加速度曲…...
Qt C++内存泄漏排查方法
在Qt C++中排查内存泄漏可以按照以下步骤进行,结合工具使用和代码审查: 1. 使用内存检测工具 Valgrind (Linux/macOS) 安装Valgrind:sudo apt-get install valgrind运行程序并检测内存泄漏:valgrind --leak-check=full ./your_qt_app分析输出结果,定位未释放的内存块。Dr…...
[redis进阶一]redis的持久化(2)AOF篇章
目录 一 为什么有了RDB持久化机制还要有AOF呢 板书介绍具体原因: 编辑二 详细讲解AOF机制 (1)AOF的基本使用 1)板书如下 2)开启AOF机制: 3) AOF工作流程 (2)AOF是否会影响到redis性能 编辑 (3)AOF缓冲区刷新策略 (4)AOF的重写机制 板书如下: 为什么要有这个重写机…...
聊天室项目day4(redis实现验证码期限,实现redis连接池)
1.redis连接池操作和之前所学过的io_context连接池原理一样这里不多赘述,也是创建多个连接,使用时按顺序取出来。 2.知识补充redisConnect()函数建立与 Redis 服务器的非阻塞网络连接,成功返回 redisContext*(连接上下文指针&…...
Redis之分布式锁
面试切入点 锁的分类 单机版同一个JVM虚拟机内,synchronized或者Lock接口分布式多个不同JVM虚拟机,单机的线程锁不再起作用,资源类在不同的服务器之间共享了 一个靠谱分布式锁需要具备的条件与刚需 独占性:onlyOneÿ…...
AF3 ProteinDataset类的__getitem__方法解读
AlphaFold3 protein_dataset 模块 ProteinDataset 类 __getitem__ 方法用于从数据集中获取一个条目,并根据配置对数据进行处理。 源代码: def __getitem__(self, idx):"""Return an entry from the dataset.If a clusters file is provided, then the idx i…...
NLP 梳理02 — 标点符号和大小写
文章目录 一、说明二、为什么文本预处理中需要小写2.1 为什么小写在文本预处理中至关重要?2.2 区分大小写对 NLP 任务的影响 三、删除标点符号及其对 NLP 任务的影响3.1 什么是标点符号?3.2 为什么在文本预处理中删除标点符号?3.3 删除标点符…...
HarmonyOS中的多线程并发机制
目录 多线程并发1. 多线程并发概述2 多线程并发模型3 TaskPool简介4 Worker简介4.1 Woker注意事项4.2 Woker基本用法示例 5. TaskPool和Worker的对比5.1 实现特点对比5.2 适用场景对比 多线程并发 1. 多线程并发概述 并发模型是用来实现不同应用场景中并发任务的编程模型&…...
游戏引擎学习第221天:(实现多层次过场动画)
资产: intro_art.hha 已发布 在下载页面,你会看到一个新的艺术包。你将需要这个艺术包来进行接下来的开发工作。这个艺术包是由一位艺术家精心制作并打包成我们设计的格式,旨在将这些艺术资源直接应用到游戏中。它包含了许多我们会在接下来的直播中使用…...
Python | 在Pandas中按照中值对箱形图排序
箱形图是可视化数据分布的强大工具,因为它们提供了对数据集内的散布、四分位数和离群值的洞察。然而,当处理多个组或类别时,通过特定的测量(如中位数)对箱形图进行排序可以提高清晰度并有助于揭示模式。在本文中&#…...
openapi + knife4j的使用
一、依赖作用与关系 1. springdoc-openapi-starter-webmvc-api • 核心功能: 基于 OpenAPI 3 规范,自动生成 API 文档元数据(JSON 格式),并集成 Spring MVC。 提供Tag Operation、Schema 等注解,支持通过…...
数据结构*包装类泛型
包装类 什么是包装类 在讲基本数据类型的时候,有提到过包装类。 基本数据类型包装类byteByteshortShortintIntegerlongLongfloatFloatdoubleDoublecharCharacterbooleanBoolean 我们知道:基本数据类型并不是对象,没有对象所具有的方法和属…...
Azure Synapse Dedicated SQL pool里大型表对大型表分批合并数据的策略
Azure Synapse Dedicated SQL pool中大型表的数据通过MERGE INTO语句合并到另一张大型表的时间很长,容易造成运行超时,而有的时候超时的时间是管理设置,由客户控制,无法修改。这种时候为了确保操作可以运行成功,需要将…...
Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表
Day81 | 灵神 | 快慢指针 链表的中间结点 环形链表 876.链表的中间结点 876. 链表的中间结点 - 力扣(LeetCode) 思路: 设置两个指针,一个快指针r一个慢指针l 初始都是头结点 我们要求的是中间节点 所以快指针走两步&#x…...
【DDR 内存学习专栏 1.2 -- DDR Channel 介绍】
文章目录 1. DDR中的通道(Channel)概念1.1 DDR Channel 与 DDRC1.2 DIMM 内存插槽1.3 物理通道的定义1.3.1 多通道的作用 1.4 通道的硬件实现1.5 多核系统的DDR通道分配策略 1. DDR中的通道(Channel)概念 关于 DDR 通道ÿ…...
深入解析xDeepFM:结合压缩交互网络与深度神经网络的推荐系统新突破
今天是周日,我来解读一篇有趣的文章——xDeepFM。这篇文章由 Mao et al. 发表在SIGIR 2019会议。文章提出了一个新的网络模型——压缩交互网络(CIN),用于显式地学习高阶特征交互。通过结合 CIN 和传统的深度神经网络(D…...
Mybatis 中 <mappers> 标签四种配置方式
在MyBatis中,我们可以通过四种不同的方式来配置Mappers标签 : 1. 使用 <package name=""> 批量扫描包 这种方式通过指定一个包名,MyBatis 会自动扫描该包下的所有接口并注册为映射器。 <mappers><package name="com.example.mapper"/&…...
科技赋能记忆共生-郑州
故事背景 故事发生在中国河南郑州的现代城市环境中,这里描绘了人与科技的交融与共生。多样的场景展示了人与自然、历史与未来的互动,通过各种科技手段与古老文化相结合,展现出未来城市的独特魅力。 故事内容 在中国河南郑州,一座科…...
根据开始日期和结束日志统计共有多少天和每天的营业额
controller 重点:根据时间格式接受时间类型参数 DateTimeFormat(pattern "yyyy-MM-dd") LocalDateTime begin, DateTimeFormat(pattern "yyyy-MM-dd") LocalDateTime end) RestController RequestMapping("/admin/report") Slf4…...
LLMs之Agent之A2A:A2A的简介、安装和使用方法、案例应用之详细攻略
LLMs之Agent之A2A:A2A的简介、安装和使用方法、案例应用之详细攻略 目录 相关文章 LLMs之Agent之A2A:《Announcing the Agent2Agent Protocol (A2A)》翻译与解读 LLMs之Agent之A2A:A2A的简介、安装和使用方法、案例应用之详细攻略 A2A协议…...
深入学习OpenCV:第一章简介
本专栏为零基础开发者打造,聚焦OpenCV在Python中的高效应用,用100%代码实践带你玩转图像处理! 从 环境配置到实战项目,内容涵盖: 1️⃣ 基础篇:图像读写、阈值处理、色彩空间转换 2️⃣ 进阶篇ÿ…...
汉诺塔问题——用贪心算法解决
目录 一:起源 二:问题描述 三:规律 三:解决方案 递归算法 四:代码实现 复杂度分析 一:起源 汉诺塔(Tower of Hanoi)问题起源于一个印度的古老传说。在世界中心贝拿勒斯&#…...
【双指针】专题:LeetCode 283题解——移动零
移动零 一、题目链接二、题目三、题目解析四、算法原理两个指针的作用以及三个区间总结 五、与快速排序的联系六、编写代码七、时间复杂度、空间复杂度 一、题目链接 移动零 二、题目 三、题目解析 “保持非零元素的相对顺序”,比如,示例1中非零元素1…...
2025-4-12-C++ 学习 XOR 三元组 异或 急转弯问题
C的学习必须更加精进一些,对于好多的函数和库的了解必须深入一些。 文章目录 3513. 不同 XOR 三元组的数目 I题解代码 3514. 不同 XOR 三元组的数目 II题解代码 晚上,10点半,参加了LC的竞赛,ok了一道,哈哈~ 第二道…...
[MySQL] 索引
索引 1.为什么有索引?2.MySQL的存储(MySQL与磁盘交互的基本单位)3.小总结4.索引的进一步理解4.1测试案例4.2 理解单个page4.3 理解多个page页目录单页情况多页情况 4.4 B树 VS B树4.5 聚簇索引 VS 非聚簇索引1.非聚簇索引2.聚簇索引 5.索引操…...
软考高级--案例分析
架构风格 重点 交互方式数据结构控制结构扩展方法 分类 管道-过滤器风格 数据流 数据仓储风格 星型结构以数据为中心,其他构件围绕数据进行交互 企业服务总线esb 定义 以一个服务总线充当中间件的角色,把各方服务对接起来,所有服务…...
Go - 内存逃逸
概念 每个函数都有自己的内存区域来存放自己的局部变量、返回地址等,这个内存区域在栈中进行分配。当函数结束时,这段内存区域会进行释放。 但有些变量,我们想在函数结束后仍然使用它,那么就要把这个变量在堆上分配,这…...
【数字电路】第四章 组合逻辑电路
一、组合逻辑电路的概述 1.逻辑电路的分类 2.逻辑功能的描述 二、组合逻辑电路的分析方法 根据输出可以粗略判断输入的数值的大小。 三、组合逻辑电路的基本设计方法 1.进行逻辑抽象 2.写出逻辑函数式 3.逻辑函数的化简或变换 4.画出逻辑电路图 5.设计验证与工艺设计 转换为…...
提权实战!
就是提升权限,当我们拿到一个shell权限较低,当满足MySQL提权的要求时,就可以进行这个提权。 MySQL数据库提权(Privilege Escalation)是指攻击者通过技术手段,从低权限的数据库用户提升到更高权限ÿ…...
单双线程的理解 和 lua基础语法
1.什么是单进程 ,什么是多进程 当一个程序开始运行时,它就是一个进程,进程包括运行中的程序和程序所使用到的内存和系统资源。而一个进程又是由单个或多个线程所组成的。 1.1 像apache nginx 这类 服务器中间件就是多进程的软件 ࿰…...
深度学习(对抗)
数据预处理:像素标记与归一化 在 GAN 里,图像的确会被分解成一个个像素点来处理。在你的代码里,transform transforms.Compose([transforms.ToTensor(), transforms.Normalize((0.5,), (0.5,))]) 这部分对图像进行了预处理: tra…...
【NLP】 18. Tokenlisation 分词 BPE, WordPiece, Unigram/SentencePiece
1. 翻译系统性能评价方法 在机器翻译系统性能评估中,通常既有人工评价也有自动评价方法: 1.1 人工评价 人工评价主要关注以下几点: 流利度(Fluency): 判断翻译结果是否符合目标语言的语法和习惯。充分性…...
详解MYSQL表空间
目录 表空间文件 表空间文件结构 行格式 Compact 行格式 变长字段列表 NULL值列表 记录头信息 列数据 溢出页 数据页 当我们使用MYSQL存储数据时,数据是如何被组织起来的?索引又是如何组织的?在本文我们将会解答这些问题。 表空间文…...
lwip移植基于freertos(w5500以太网芯片)
目录 一、背景二、lwip移植基于w5500(MACPHY,数据链路层和物理层)1.移植需要的相关文件2、协议栈层级调用3、w5500关键初始化说明 三、附录 一、背景 1.OSI七层模型 图片来自网络 lwip协议栈工作在应用层、传输层、网络层; 网卡…...
【TI MSPM0】IQMath库学习
一、与DSP库的区别 二、IQMath库详解 RTS是靠纯软件实现的,而MathACL是靠硬件加速,速度更快 三、工程详解 1.导入工程 2.样例详解 使用一系列的运算来展示IQMath库,使用的是MathACL实现版本的IQMath库 编译加载运行,结果变量叫…...
51单片机 光敏电阻5506与ADC0832驱动程序
电路图 5506光敏电阻光强增加电阻值减小 以上电路实测无光时电压1.5v 有光且较亮时电压2.7v。 转换程序和ADC0832程序如下 // ADC0832引脚定义 sbit ADC_CS P1^2; // 片选信号 sbit ADC_CLK P1^0; // 时钟信号 sbit ADC_DIO P1^1; // 数据线// 获取电压值 - 返回c…...
【Linux】进程创建、进程终止、进程等待
Linux 1.进程创建1.fork 函数2.写时拷贝3.为什么要有写时拷贝? 2.进程终止1.进程退出场景2.退出码3.进程常见退出方法1.main函数return2.exit库函数3._exit系统调用 3.进程等待1.概念2.必要性3.方法1.wait2.waitpid3.参数status4.参数option5.非阻塞轮询 1.进程创建…...
ReliefF 的原理
🌟 ReliefF 是什么? ReliefF 是一种“基于邻居差异”的特征选择方法,用来评估每个特征对分类任务的贡献大小。 它的核心问题是: “我怎么知道某个特征是不是重要?是不是有能力把不同类别的数据区分开?” 而…...
C++ 数据结构之图:从理论到实践
一、图的基本概念 1.1 图的定义与组成 图(Graph)由顶点(Vertex)和边(Edge)组成,形式化定义为: G (V, E) 顶点集合 V:表示实体(如城市、用户) …...
机器学习(5)——支持向量机
1. 支持向量机(SVM)是什么? 支持向量机(SVM,Support Vector Machine)是一种监督学习算法,广泛应用于分类和回归问题,尤其适用于高维数据的分类。其核心思想是寻找最优分类超平面&am…...
C++学习之使用OPENSSL加解密
目录 1.知识点概述 2.哈希的特点和常用哈希算法散列值长度 3.Linux下openss相关的安装问题 4.md5 api 5.其他哈希算法使用 6.sha1测试 7.哈希值的封装 8.非对称加密特点和应用场景 9.生成密钥对-rsa 10.在内存中生成rsa密钥对-代码 11.将密钥对写入磁盘 12.使用bio方…...
markdown导出PDF,PDF生成目录
1、vscode中安装markdown插件,将编辑的文件导出PDF。 2、安装PDF Guru Anki软件 百度网盘:通过网盘分享的文件:PDFGuruAnki 链接: https://pan.baidu.com/s/1nU6avM7NUowhEn1FNZQKkA 提取码: aues PDF中不同的标题需要通过矩形框标注差异&a…...