8.21-8.22网络编程——词典

文章目录

  • 一、思维导图
  • 二、词典
    • 1、服务器
    • 2、客户端
    • 3、现象
  • 三、牛客网刷题

一、思维导图

在这里插入图片描述

二、词典

1、服务器

#include <myhead.h>#define SER_PORT  8888        //服务器端口号
#define SER_IP  "192.168.116.128"   //服务器IP地址 //账户密码结构
typedef struct acc_pass
{int num;char account[20];int password;
} acc_pass_t;//搜索查询结构
typedef struct search_query
{int num;char word[50];char account[20];
} search_query_t;//搜索历史结构
typedef struct search_history
{char client_ip[16];int client_port;char account[20];char search_word[50];char search_result[256];char search_time[20];
} search_history_t;/**************将文件中的词插入到表中********************/
int insert_word(sqlite3 *ppDb,char *buf1,char *buf2)
{char sql[256]="";snprintf(sql,sizeof(sql),"insert into WORD_TRANSLATE values(\"%s\",\"%s\");",buf1,buf2);char *errmsg=NULL;if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d插入失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************清空单词的数据表********************/
int empty_word(sqlite3 *ppDb)
{char sql[128]="delete from WORD_TRANSLATE;";char *errmsg=NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d清空失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************记录搜索历史********************/
int record_search_history(sqlite3 *ppDb,const char *client_ip,int client_port,const char *account,const char *word,const char *result)
{//获取当前时间time_t now =time(NULL);struct tm *t =localtime(&now);char timestamp[20];snprintf(timestamp,sizeof(timestamp),"%04d-%02d-%02d %02d:%02d:%02d",t->tm_year + 1900,t->tm_mon + 1,t->tm_mday,t->tm_hour,t->tm_min,t->tm_sec);char sql[512]="";snprintf(sql,sizeof(sql), "insert into SEARCH_HISTORY values(\"%s\",%d,\"%s\",\"%s\",\"%s\",\"%s\");",client_ip,client_port,account,word,result,timestamp);char *errmsg=NULL;if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d插入搜索历史失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************查询单词********************/
int query_word(sqlite3 *ppDb,const char *word,char *result,int result_size)
{char sql[256]="";snprintf(sql,sizeof(sql),"select translate from WORD_TRANSLATE where word=\"%s\";",word);char *errmsg=NULL;int found=0;int callback(void *data,int argc,char **argv,char **azColName) {if(argc>0&&argv[0]) {strncpy((char*)data,argv[0],result_size-1);found=1;}return 0;}if(sqlite3_exec(ppDb,sql,callback,result,&errmsg)!=SQLITE_OK){printf("%d查询失败%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}if(!found) {strncpy(result,"未找到该单词",result_size-1);}result[result_size-1]='\0';return 0;
}/***************查询搜索历史********************/
int query_search_history(sqlite3 *ppDb,const char *account,char *result,int result_size)
{char sql[256]="";snprintf(sql,sizeof(sql),"select search_time,search_word,search_result from SEARCH_HISTORY where account=\"%s\" order by search_time desc;", account);char *errmsg=NULL;result[0]='\0';int count=0;int callback(void *data,int argc,char **argv,char **azColName) {char *res=(char *)data;char line[512];snprintf(line,sizeof(line),"时间: %s\n单词: %s\n结果: %s\n\n",argv[0],argv[1],argv[2]);if(strlen(res)+strlen(line)<(size_t)(result_size-1)) {strcat(res,line);count++;}return 0;}if(sqlite3_exec(ppDb,sql,callback,result,&errmsg)!=SQLITE_OK){printf("%d查询历史记录失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}if(count==0) {strncpy(result,"无搜索历史记录",result_size-1);result[result_size-1]='\0';}return 0;
}/**************将账户密码插入到表中********************/
int insert_account(sqlite3 *ppDb,const char *account,int password)
{//检查账号是否已存在char check_sql[256]="";snprintf(check_sql,sizeof(check_sql),"select * from ACCOUNT_PASSWORD where account=\"%s\";",account);char *errmsg=NULL;int exists=0;int check_callback(void *data,int argc,char **argv,char **azColName) {*(int*)data=1;return 0;}if(sqlite3_exec(ppDb,check_sql,check_callback,&exists,&errmsg)!=SQLITE_OK){printf("%d查询账号失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}if(exists) {printf("账号已存在\n");return -1;}//插入新账号char sql[256] = "";snprintf(sql, sizeof(sql), "insert into ACCOUNT_PASSWORD values(\"%s\",%d,0);", account, password);if (sqlite3_exec(ppDb, sql, NULL, NULL, &errmsg) != SQLITE_OK){printf("%d插入账号失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************清空账号密码的数据表********************/
int empty_account(sqlite3 *ppDb)
{char sql[128]="delete from ACCOUNT_PASSWORD;";char *errmsg=NULL;if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d清空账号表失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************登录账户********************/
int enter_account(sqlite3 *ppDb,const char *account,int password)
{char sql[256]="";snprintf(sql, sizeof(sql), "select * from ACCOUNT_PASSWORD where account=\"%s\" and password=%d and flag=0;",account, password);char *errmsg=NULL;int exists=0;int callback(void *data,int argc,char **argv,char **azColName) {*(int*)data=1;return 0;}if (sqlite3_exec(ppDb,sql,callback,&exists,&errmsg)!=SQLITE_OK){printf("%d查询账号失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}if (!exists) {return -1; //账号密码错误或已登录}//更新登录状态snprintf(sql,sizeof(sql),"update ACCOUNT_PASSWORD set flag=1 where account=\"%s\" and password=%d;",account,password);if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d更新登录状态失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************退出账户********************/
int break_account(sqlite3 *ppDb,const char *account,int password)
{char sql[256]="";snprintf(sql,sizeof(sql),"update ACCOUNT_PASSWORD set flag=0 where account=\"%s\" and password=%d;",account, password);char *errmsg=NULL;if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("%d更新退出状态失败:%s\n",__LINE__,errmsg);sqlite3_free(errmsg);return -1;}return 0;
}/***************处理客户请求********************/
void handle_client(int new_fd,struct sockaddr_in cin,sqlite3 *ppDb)
{char client_ip[16] = {0};inet_ntop(AF_INET,&cin.sin_addr.s_addr,client_ip,sizeof(client_ip));int client_port=ntohs(cin.sin_port);printf("[%s:%d]连接成功,new_fd=%d\n",client_ip,client_port,new_fd);acc_pass_t p;search_query_t query;int flag;char result[4096]={0};char current_account[20]={0}; //记录当前登录账号while(1){memset(&p,0,sizeof(acc_pass_t));int res=recv(new_fd,&p,sizeof(acc_pass_t),0);if(res<=0){if(res==0){printf("客户端[%s:%d]已下线\n",client_ip,client_port);//如果已登录,更新状态if(strlen(current_account)>0){break_account(ppDb,current_account,p.password);}}else{perror("recv error");}break;}printf("收到客户端[%s:%d]请求: num=%d\n",client_ip,client_port,p.num);switch(p.num){case 1: //注册账号printf("注册账号: %s, %d\n",p.account,p.password);flag=insert_account(ppDb,p.account,p.password);break;case 2: //登录账户printf("登录账户:%s,%d\n",p.account,p.password);flag=enter_account(ppDb,p.account,p.password);if(flag==0){strcpy(current_account,p.account);}send(new_fd,&flag,sizeof(flag),0);break;case 3: //退出账户printf("退出账户:%s,%d\n",p.account,p.password);flag=break_account(ppDb,p.account,p.password);if(flag==0){memset(current_account,0,sizeof(current_account));}send(new_fd,&flag,sizeof(flag),0);break;case 4: //查询单词printf("查询单词请求\n");memset(&query,0,sizeof(query));if(recv(new_fd,&query,sizeof(query),0)<=0){perror("recv query error");flag=-1;break;}printf("用户[%s]查询单词:%s\n",query.account,query.word);memset(result,0,sizeof(result));if (query_word(ppDb,query.word,result,sizeof(result))==0){send(new_fd,result,strlen(result)+1,0);//记录搜索历史record_search_history(ppDb,client_ip,client_port, query.account, query.word, result);}else{send(new_fd,"查询失败",strlen("查询失败")+1,0);}break;case 5: //查询历史记录printf("查询历史记录请求,用户:%s\n",p.account);memset(result,0,sizeof(result));if(query_search_history(ppDb,p.account,result,sizeof(result))==0){send(new_fd,result,strlen(result)+1,0);}else{send(new_fd,"查询历史记录失败",strlen("查询历史记录失败")+1,0);}break;default:printf("未知请求:%d\n",p.num);break;}}close(new_fd);printf("[%s:%d]连接关闭,new_fd=%d\n",client_ip,client_port,new_fd);
}//处理僵尸进程
void handle_sigchild(int sig)
{while (waitpid(-1,NULL,WNOHANG)>0);
}/***************主函数********************/
int main(int argc, const char *argv[])
{//设置信号处理,回收僵尸进程signal(SIGCHLD,handle_sigchild);//打开词典文件int fd = open("./dict.txt",O_RDONLY);if(fd==-1){ERR_MSG("open dict.txt error");}//打开或创建数据库sqlite3 *ppDb=NULL;if (sqlite3_open("./dict.db",&ppDb)!=SQLITE_OK){printf("sqlite3_open error: %s\n",sqlite3_errmsg(ppDb));close(fd);return -1;}//创建单词表char *sql="create table if not exists WORD_TRANSLATE(word char primary key, translate char);";char *errmsg=NULL;if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("创建单词表失败:%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(ppDb);close(fd);return -1;}empty_word(ppDb); //清空单词表//创建账户表sql = "create table if not exists ACCOUNT_PASSWORD(account char primary key,password int,flag int);"; //flag: 0-未登录, 1-已登录if (sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("创建账户表失败:%s\n",errmsg);sqlite3_free(errmsg);sqlite3_close(ppDb);close(fd);return -1;}empty_account(ppDb); //清空账户表//创建搜索历史表sql = "create table if not exists SEARCH_HISTORY(client_ip char,client_port int,account char,search_word char,search_result char,search_time char);";if(sqlite3_exec(ppDb,sql,NULL,NULL,&errmsg)!=SQLITE_OK){printf("创建历史表失败:%s\n",errmsg);sqlite3_free(errmsg);//不退出,继续执行}printf("初始化词典中\n");//从文件加载单词到数据库char buf1[128]={0}; //单词char buf2[512]={0}; //翻译char buf[1]={0};ssize_t nread;off_t file_size=lseek(fd,0,SEEK_END);lseek(fd,0,SEEK_SET);while (lseek(fd,0,SEEK_CUR)<file_size){memset(buf1,0,sizeof(buf1));memset(buf2,0,sizeof(buf2));//读取单词(到第一个空格)int i=0;while (i<sizeof(buf1)-1){nread=read(fd,buf,1);if(nread<=0)break;if(buf[0]==' '||buf[0]=='\t'||buf[0]=='\n'){break;}buf1[i++]=buf[0];}//跳过空格while(1){nread=read(fd,buf,1);if(nread<=0)break;if(buf[0]!=' '&&buf[0]!= '\t'){lseek(fd,-1,SEEK_CUR); //回退一个字符break;}}//读取翻译(到换行符)i=0;while(i<sizeof(buf2)-1){nread=read(fd,buf,1);if(nread<=0)break;if(buf[0]=='\n')break;buf2[i++]=buf[0];}if(strlen(buf1)>0){insert_word(ppDb,buf1,buf2);//printf("加载单词: %s -> %s\n", buf1, buf2);}}close(fd);printf("词典加载完成\n");//创建服务器套接字int sfd=socket(AF_INET,SOCK_STREAM,0);if(-1==sfd){ERR_MSG("socket error");}printf("socket创建成功,sfd = %d\n",sfd);//设置端口复用int reuse=1;if(setsockopt(sfd,SOL_SOCKET,SO_REUSEADDR,&reuse,sizeof(reuse))==-1){ERR_MSG("setsockopt error");}//绑定地址struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if(bind(sfd,(struct sockaddr*)&sin,sizeof(sin))==-1){ERR_MSG("bind error");}printf("bind成功\n");//监听if(listen(sfd, 128)==-1){ERR_MSG("listen error");}printf("listen成功,等待客户端连接...\n");struct sockaddr_in cin;socklen_t addrlen=sizeof(cin);while(1){int new_fd = accept(sfd,(struct sockaddr*)&cin,&addrlen);if(-1==new_fd){perror("accept error");continue;}//创建子进程处理客户端pid_t pid=fork();if(pid==0){close(sfd); //子进程关闭监听套接字handle_client(new_fd,cin,ppDb);sqlite3_close(ppDb); //子进程关闭数据库exit(EXIT_SUCCESS);}else if(pid>0){close(new_fd); //父进程关闭通信套接字}else{close(new_fd);perror("fork error");}}//关闭资源(理论上不会执行到这里)sqlite3_close(ppDb);close(sfd);return 0;
}

2、客户端

#include <myhead.h>
#define SER_PORT  8888        //服务器端口号
#define SER_IP  "192.168.116.128"   //服务器IP地址 //账户密码结构
typedef struct acc_pass
{int num;char account[20];int password;
} acc_pass_t;//单词查询结构(与服务器保持一致)
typedef struct search_query
{int num;char word[50];char account[20];
} search_query_t;//注册账户
int do_register(int num,acc_pass_t *p,int cfd)
{printf("请输入账号:");scanf("%s",p->account);printf("请输入密码:");scanf("%d",&p->password);p->num=num;//发送注册信息if(send(cfd,p,sizeof(acc_pass_t),0)==-1){perror("send register error");return -1;}printf("注册信息发送成功\n");return 0;
}//登录账户
int do_login(int num,acc_pass_t *p,int cfd)
{printf("请输入账号:");scanf("%s",p->account);printf("请输入密码:");scanf("%d",&p->password);p->num=num;//发送登录信息if(send(cfd,p,sizeof(acc_pass_t),0)==-1){perror("send login error");return -1;}//接收登录结果int response;if(recv(cfd,&response,sizeof(response),0)==-1){perror("recv response error");return -1;}if (response==0){printf("登录成功\n");return 0;}else{printf("登录失败\n");return -1;}
}//退出账户
int do_logout(int num,acc_pass_t *p,int cfd)
{p->num=num;if(send(cfd,p,sizeof(acc_pass_t), 0)==-1){perror("send logout error");return -1;}int response;if (recv(cfd,&response,sizeof(response),0)==-1){perror("recv logout response error");return -1;}return response;
}//查询搜索历史
int do_search_history(int cfd,const char *account)
{acc_pass_t p;memset(&p,0,sizeof(acc_pass_t));p.num=5;strcpy(p.account,account);  //携带账号信息if(send(cfd,&p,sizeof(acc_pass_t),0)==-1){perror("send history request error");return -1;}//接收历史记录char history[4096]={0};int recv_len=recv(cfd,history,sizeof(history)-1,0);if(recv_len==-1){perror("recv history error");return -1;}printf("搜索历史记录:\n%s\n",history);return 0;
}//查询单词
int do_search_word(int cfd,const char *account)
{//发送查询类型标识acc_pass_t p;memset(&p,0,sizeof(acc_pass_t));p.num=4;strcpy(p.account,account);if (send(cfd,&p,sizeof(acc_pass_t),0)==-1){perror("send search type error");return -1;}//准备查询信息search_query_t query;memset(&query,0,sizeof(search_query_t));query.num=4;strcpy(query.account, account);printf("请输入要查询的单词:");scanf("%s",query.word);query.word[strcspn(query.word,"\n")]='\0';//发送查询请求if (send(cfd,&query,sizeof(query),0)==-1){perror("send word query error");return -1;}//接收查询结果char result[256]={0};int recv_len=recv(cfd,result,sizeof(result)-1,0);if(recv_len==-1){perror("recv word result error");return -1;}printf("查询结果: %s\n",result);return 0;
}int main(int argc, const char *argv[])
{//创建通信套接字int cfd=socket(AF_INET, SOCK_STREAM, 0);if(-1==cfd){perror("socket error");return -1;}printf("socket创建成功,cfd = %d\n",cfd);//连接服务器struct sockaddr_in sin;sin.sin_family=AF_INET;sin.sin_port=htons(SER_PORT);sin.sin_addr.s_addr=inet_addr(SER_IP);if (connect(cfd,(struct sockaddr*)&sin,sizeof(sin))==-1){perror("connect error");close(cfd);return -1;}printf("连接服务器成功\n");acc_pass_t *p=(acc_pass_t*)malloc(sizeof(acc_pass_t));if(p==NULL){perror("malloc error");close(cfd);return -1;}memset(p,0,sizeof(acc_pass_t));int num;int logged_in=0;//记录当前状态char current_account[20]={0};  //记录当前登录账号//数据收发循环while(1){if(!logged_in){printf("===== 请选择功能 =====\n");printf("1、注册账户\n");printf("2、登录账号\n");printf("3、退出程序\n");printf("======================\n");printf("选择功能:");scanf("%d",&num);switch(num){case 1:do_register(num,p,cfd);break;case 2:if(do_login(num,p,cfd) == 0){logged_in=1;strcpy(current_account,p->account);  //保存当前登录账号}break;case 3:printf("程序即将退出\n");free(p);close(cfd);return 0;default:printf("无效的选择,请重新输入\n");break;}}else{printf("===== 请选择功能 =====\n");printf("1、查找单词\n");printf("2、查找历史记录\n");printf("3、退出登录\n");printf("======================\n");printf("选择功能:");scanf("%d",&num);switch (num){case 1:do_search_word(cfd,current_account);break;case 2:do_search_history(cfd,current_account);break;case 3:do_logout(num,p,cfd);logged_in=0;memset(current_account,0,sizeof(current_account));printf("已退出登录\n");break;default:printf("无效的选择,请重新输入\n");break;}}}//关闭资源free(p);close(cfd);return 0;
}

3、现象

在这里插入图片描述

三、牛客网刷题

在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。
如若转载,请注明出处:http://www.pswp.cn/news/920096.shtml
繁体地址,请注明出处:http://hk.pswp.cn/news/920096.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

ffmpeg测试rtsp地址

ffmpeg可以用 ffmpeg 通过 tcp协议/udp协议传输流到 null设备&#xff0c;ffmpeg \-rtsp_transport tcp \ # 使用TCP协议传输RTSP流-timeout 5000000 \ # 设置超时时间为5000000微秒&#xff08;5秒&#xff09;-i "rtsp://admin:admin123192.168.1.…

Apache Commons Math_Java科学计算的利器

1. 引言 1.1 科学计算在现代软件开发中的重要性 随着大数据、人工智能和科学计算需求的不断增长,科学计算能力已成为现代软件开发不可或缺的重要组成部分。从金融风险评估到工程仿真,从数据分析到机器学习,科学计算在各行各业中发挥着关键作用。 科学计算涉及复杂的数学运…

Python爬虫框架设计:类封装与工程化实践​

实战中的UA轮换技巧 import fake_useragent import random class DynamicHeader: def init(self): self.ua_generator fake_useragent.UserAgent() # 注意&#xff1a;实际使用需更新数据路径 self.fingerprints [“chrome125”, “edge115”, “safari17”] # 2025年主流指…

5G 三卡图传终端:公安执法的 “移动可视化指挥中枢”

前言 在公安执法中&#xff0c;“实时取证、高效指挥、安全协同” 是破解现场复杂局面的核心需求。传统执法设备常因传输卡顿、证据存证难、跨警种信息断层等问题影响执法效能&#xff0c;而 5G 便携式多卡高清视频融合终端凭借多网聚合、高清编码、安全存储等特性&#xff0c;…

R语言rbind()和cbind()使用

rbind&#xff1a;r row&#xff08;行&#xff09;cbind&#xff1a;c column&#xff08;列&#xff09; 核心区别方向 • rbind&#xff1a;纵向&#xff08;按行&#xff09;堆叠&#xff0c;行数相加。 • cbind&#xff1a;横向&#xff08;按列&#xff09;拼接&#…

【Linux】开发工具命令指南:深度解析Vim的使用操作

欢迎各位佬进行交流&#xff0c;我们一起无限进步&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01;&#xff01; 文章目录Vim&#xff1a;多模式高效文本编辑器1. 初次体验 Vim2. Vim 核心工作模式&#xff08;…

【Day 12】73.矩阵置零

文章目录73.矩阵置零题目&#xff1a;思路&#xff1a;方法一&#xff1a;用两个标记数组&#xff08;易理解&#xff0c;额外空间 O(mn)&#xff09;思路&#xff08;直观&#xff09;举例&#xff08;[[1,1,1],[1,0,1],[1,1,1]]&#xff09;优缺点代码实现&#xff08;Go&…

Clustering Enabled Wireless Channel Modeling Using Big Data Algorithms

文章目录Clustering TechniquesPartitioning-Based AlgorithmsDensity-Based AlgorithmsHierarchical-based algorithmsClustering Enabled Channel ModelingCluster-Based Channel ModelsClustering AlgorithmsClustering Techniques 聚类是一种已被广泛用于数据分析的技术。…

基于「多模态大模型 + BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vue+flask+AI算法)

一、项目演示视频 基于「多模态大模型 BGE向量检索增强RAG」的儿童绘画心理健康分析系统(vueflaskAI算法)二、技术栈 前端技术栈 (web-vue) 核心框架: Vue 3.5.13 (Composition API) UI组件库: Element Plus 2.9.4 状态管理: Pinia 2.3.1 路由管理: Vue Router 4.5.0 HTTP客户…

QML中的Component

目录 &#x1f9e0; 核心概念&#xff1a;什么是 Component&#xff1f; &#x1f4ca; Component 的两种主要形式 1. 内联 Component&#xff08;在 QML 文件内部定义&#xff09; 2. 外部 Component&#xff08;单独的 .qml 文件&#xff09; &#x1f3af; Component 的…

什么是模型训练中的 特征提取,如何对光伏发电预测中的特征进行提取

&#x1f50d; 什么是模型训练中的“特征提取” 定义&#xff1a;特征提取是从原始数据中提炼出对预测或分类最有用的信息的过程。它的目标是去掉冗余和噪声&#xff0c;保留能最好反映数据规律的特征。 作用&#xff1a; 降低数据维度&#xff0c;减少计算量 提高模型的泛化…

Linux应急响应一般思路(三)

日志分析Linux日志分析Linux日志类型大致可以分为三类&#xff0c;内核和系统日志、用户日志、应用日志内核和系统日志&#xff1a;这种日志主要由syslog管理、根据其配置文件/etc/syslog.conf中的设置决定内核消息和各种系统程序信息记录到哪个位置用户日志&#xff1a;用户日…

【酒店酒水寄存管理效率低?】佳易王酒水寄存管理系统操作教程全解析

前言&#xff1a; &#xff08;一&#xff09;试用版获取方式 资源下载路径&#xff1a;进入博主头像主页第一篇文章末尾&#xff0c;点击卡片按钮&#xff1b;或访问左上角博客主页&#xff0c;通过右侧按钮获取详细资料。 说明&#xff1a;下载文件为压缩包&#xff0c;使用…

Unity 套圈捕捉 UI 实现分享:椭圆环 Shader + 动态进度

Unity 套圈捕捉 UI 实现分享 期望表现效果 《拼贴冒险传 / PatchQuest》 捕捉进度 动态UI实现效果 目标&#xff1a;角色 A 套圈怪物 B&#xff0c;进度环显示围绕角度。技术点&#xff1a;Shader 绘制椭圆环&#xff0c;支持描边、顺/逆时针,需要对两个切口也进行描边。 技术…

MyBatis-Plus代码生成器

MyBatis-Plus 代码生成器是一款高效、灵活的自动化工具,旨在简化 Java 后端开发中的持久层代码编写。通过配置数据库连接和模板参数,它可以一键生成实体类、Mapper 接口、XML 文件、Service 层及 Controller 层代码,大幅提升开发效率,减少重复劳动。 核心优势: 快速生成:…

06-导入Maven项目模块

文章目录1、文章介绍2、模块复制3、导入pom文件4、效果图1、文章介绍 视频定位 2、模块复制 复制资料“02.maven项目”中的两个项目模块到刚刚新建的项目文件路径中 导入后的效果图 3、导入pom文件 4、效果图

Jenkins+docker 微服务实现自动化部署安装和部署过程

Jenkins 是一款流行的开源自动化服务器&#xff0c;广泛用于持续集成&#xff08;CI&#xff09;和持续交付&#xff08;CD&#xff09;流程的自动化。通过 Docker 部署 Jenkins 可以简化安装和配置过程&#xff0c;同时保证在不同环境下的一致性。本篇文章将介绍如何使用 Dock…

【芯片后端设计的灵魂:Placement的作用与重要性】

在芯片设计的浩瀚宇宙中&#xff0c;后端物理设计扮演着决定成败的关键角色。其中&#xff0c;​Placement&#xff08;布局&#xff09;​​ 作为整个流程的核心环节&#xff0c;被誉为芯片性能、功耗和面积的“奠基者”。今天&#xff0c;我们就来深入探讨Placement的作用、重…

将FGUI的Shader全部预热后,WebGL平台没有加载成功

1&#xff09;将FGUI的Shader全部预热后&#xff0c;WebGL平台没有加载成功 2&#xff09;iOS如何确认内存扩展使用生效 3&#xff09;SpriteAtlasManager.atlasRequested延后一帧回调 4&#xff09;Unity如何使用Java 17打包 这是第442篇UWA技术知识分享的推送&#xff0c;精选…

Python二进制、八进制与十六进制高级操作指南:从底层处理到工程实践

引言&#xff1a;为何需要掌握进制操作&#xff1f;在现代计算领域&#xff0c;直接操作不同进制的数值是一项核心技术能力。根据2024年Stack Overflow开发者调查报告&#xff1a;73%的低级系统开发涉及位级操作65%的网络协议要求理解十六进制数据80%的硬件接口配置使用二进制控…