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
英文地址,請注明出處:http://en.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%的硬件接口配置使用二進制控…