[項目][boost搜索引擎#4] cpp-httplib使用 log.hpp 前端 測試及總結

目錄

編寫http_server模塊

1. 引入cpp-httplib到項目中

2. cpp-httplib的使用介紹

3. 正式編寫http_server

九、添加日志到項目中

十、編寫前端模塊

十一. 詳解傳 gitee

十二、項目總結

項目的擴展


寫在前面

[項目詳解][boost搜索引擎#1] 概述 | 去標簽 | 數據清洗 | scp

[項目詳解][boost搜索引擎#2] 建立index | 安裝分詞工具cppjieba | 實現倒排索引

[項目][boost搜索引擎#3] Searcher模塊 | 單例設計 | 去重 | 構建json

項目 gitee 已經上傳啦

(還是決定將學校和個人的 gitee 區分開來,所以之后寫博客的代碼就用這個 gitee 號了(???)

https://gitee.com/linxi-lalala

接著上一篇文章,下面繼續講解網絡庫的使用~


編寫http_server模塊

1. 引入cpp-httplib到項目中

安裝cpp-httplib 安裝的是v0.7.15版本:
下載鏈接:cpp-httplib 下載地址

我們將cpp-httplib放到項目中的test目錄下,并解壓 unzip 好

建立軟連接到我們的項目路徑下:

注意:要使用 cpp-httplib ,我們的 gcc 的版本必須時 7 以上哦

至此,我們就可以在我們的項目中使用了。

2. cpp-httplib的使用介紹

創建一個http_server.cpp的文件,編寫測試代碼:

#include "cpp-httplib/httplib.h"    int main()    
{    //創建一個Server對象,本質就是搭建服務端httplib::Server svr; // 這里注冊用于處理 get 請求的函數,當收到對應的get請求時(請求hi時),程序會執行對應的函數(也就是lambda表達式)svr.Get("/hi", [](const httplib::Request& req, httplib::Response& rsp){ //設置 get "hi" 請求返回的內容   rsp.set_content("hello world!", "text/plain; charset=utf-8");                                                                                                            });    // 綁定端口(8080),啟動監聽(0.0.0.0表示監聽任意端口)svr.listen("0.0.0.0", 8080);  return 0;    
}

對應的Makefile:

PARSER=parser
DUG=debug
HTTP_SERVER=http_server
cpp=g++.PHONY:all
all:$(PARSER) $(DUG) $(HTTP_SERVER)$(PARSER):parser.cpp$(cpp) -o $@ $^ -lboost_system -lboost_filesystem -std=c++11
$(DUG):debug.cpp$(cpp) -o $@ $^ -std=c++11 -ljsoncpp
$(HTTP_SERVER):http_server.cpp$(cpp) -o $@ $^ -std=c++11 -ljsoncpp -lpthread
.PHONY:clean
clean:rm -f $(DUG) $(PARSER) $(HTTP_SERVER)

我們直接編譯運行 http_server

打開瀏覽器,訪問我們這個端口(如服務器IP:3877/hi),結果如下:

但是當我們訪問服務器IP:3877時,卻找不到對應的網頁,

像我們訪問百度時,www.baidu.com,百度會給一個首頁,所以在我們的項目目錄下呢,也需要一個首頁。 (在項目路徑下創建一個wwwroot目錄,目錄中包含一個index.html文件)

編寫我們的首頁,并修改我們的 http_server.cpp:

<!DOCTYPE html>
<html lang="en">
<head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><title>boost搜索引擎</title>
</head>
<body><h1>歡迎來到我的世界</h1>
</body>
</html>#include "cpp-httplib/httplib.h"const std::string root_path = "./wwwroot";int main()    
{    //創建一個Server對象,本質就是搭建服務端httplib::Server svr; //訪問首頁svr.set_base_dir(root_path.c_str());// 這里注冊用于處理 get 請求的函數,當收到對應的get請求時(請求hi時),程序會執行對應的函數(也就是lambda表達式)svr.Get("/hi", [](const httplib::Request& req, httplib::Response& rsp){ //設置 get "hi" 請求返回的內容   rsp.set_content("hello world!", "text/plain; charset=utf-8");                                                                                                            });    // 綁定端口(8080),啟動監聽(0.0.0.0表示監聽任意端口)svr.listen("0.0.0.0", 8080);  return 0;    
}

再次通過瀏覽器進行訪問:

3. 正式編寫http_server
#include "cpp-httplib/httplib.h"    
#include "searcher.hpp"    const std::string input = "data/raw_html/raw.txt";    
const std::string root_path = "./wwwroot";    int main()    
{    ns_searcher::Searcher search;    search.InitSearcher(input); //創建一個Server對象,本質就是搭建服務端httplib::Server svr;   //訪問首頁svr.set_base_dir(root_path.c_str()); // 這里注冊用于處理 get 請求的函數,當收到對應的get請求時(請求s時),程序會執行對應的函數(也就是lambda表達式)svr.Get("/s", [&search](const httplib::Request &req, httplib::Response &rsp){//has_param:這個函數用來檢測用戶的請求中是否有搜索關鍵字,參數中的word就是給用戶關鍵字取的名字(類似word=split)    if(!req.has_param("word")){    rsp.set_content("必須要有搜索關鍵字!", "text/plain; charset=utf-8");    return;    }    //獲取用戶輸入的關鍵字std::string word = req.get_param_value("word");    std::cout << "用戶在搜索:" << word << std::endl;    //根據關鍵字,構建json串std::string json_string;    search.Search(word, &json_string);//設置 get "s" 請求返回的內容,返回的是根據關鍵字,構建json串內容rsp.set_content(json_string, "application/json");       });    std::cout << "服務器啟動成功......" << std::endl; // 綁定端口(8080),啟動監聽(0.0.0.0表示監聽任意端口)svr.listen("0.0.0.0", 3877);                                                                                                                                                      return 0;    
}

此時我們編譯運行我們的代碼,先執行parser進行數據清洗,然后執行http_server,搭建服務,創建單例,構建索引,發生請求(根據用戶輸入的關鍵字,進行查找索引,構建json串),最后響應給用戶

此時服務器啟動成功,索引也建立完畢 ,

此時,我們在瀏覽器進行訪問(服務器IP:3877/s)

此時,我們在瀏覽器進行訪問(服務器IP:3877/sword=split)

最終,在瀏覽器上就顯示出來了,到這里我們的后端內容大致上算是完成了,最后添加一個日志就可以了,如果你對前端不感興趣,到這里就可以了。可以把日志功能的添加看一看


九、添加日志到項目中

我們創建一個log.hpp的頭文件,需要添加日志的地方:index模塊,searcher模塊、http_server模塊。代碼如下:

#pragma once     
#include <iostream>    
#include <string>    
#include <ctime>    #define NORMAL 1   //正常的                                                                                                                                                                     
#define WARNING 2  //錯誤的     
#define DEBUG 3    //bug    
#define FATAL 4    //致命的   #define LOG(LEVEL, MESSAGE) log(#LEVEL, MESSAGE, __FILE__, __LINE__)        void log(std::string level, std::string message, std::string file, int line)    
{    // 打印日志信息std::cout << "[" << level << "]"<< "[" << time(nullptr) << "]"<< "[" << message << "]"<< "[" << file << " : " << line << "]"<< std::endl;
}

簡單說明:

我們用宏來實現日志功能,其中LEVEL表明的是等級(有四種),

這里的#LEVEL的作用是:把一個宏參數變成對應的字符串(直接替換)

C語言中的預定義符號:

  • __FILE__:進行編譯的源文件
  • __LINE__:文件的當前行號

補充幾個:

  • __DATE__:文件被編譯的日期
  • __TIME__:文件被編譯的時間
  • __FUNCTION__:進行編譯的函數

假設在如下示例代碼:

int main() {LOG(NORMAL, "This is a normal log message");LOG(WARNING, "This is a warning log message");LOG(DEBUG, "This is a debug log message");LOG(FATAL, "This is a fatal log message");return 0;
}

編譯并運行這段代碼后,輸出會類似于:

所以我們可以將日志添加到有輸出入口的地方,方便監視我們的代碼那里出現了問題。

日志系統的作用

  1. 調試和錯誤追蹤:記錄程序執行過程中的各種狀態和錯誤信息,方便定位和修復問題。
  2. 運行監控:監控程序的運行狀態,了解程序的執行流程和重要事件。
  3. 審計和分析:分析日志記錄,了解用戶行為和系統性能,進行數據挖掘和改進。

十、編寫前端模塊

前端模塊,我做詳細的解釋,代碼中都有注釋,直接上代碼

<!DOCTYPE html>                                                                                                                                                                                                                                                     
<html lang="en"><head><meta charset="UTF-8"><meta http-equiv="X-UA-Compatible" content="IE=edge"><meta name="viewport" content="width=device-width, initial-scale=1.0"><script src="http://code.jquery.com/jquery-2.1.1.min.js"></script><title>boost 搜索引擎</title><style>/*去掉網頁中的所有內外邊距,可以了解html的盒子模型*/* {margin: 0;/* 設置外邊距 */padding: 0;/* 設置內邊距 */}/* 將我們的body內的內容100%和html的呈現吻合 */html,body {height: 100%;}/* 以點開頭的稱為類選擇器.container */.container {/* 設置div的寬度 */width: 800px;/* 通過設置外邊距達到居中對其的目的 */margin: 0px auto;/* 設置外邊距的上邊距,保持元素和網頁的上部距離 */margin-top: 15px;}/* 復合選擇器,選中container下的search */.container .search {/* 寬度與父標簽保持一致 */width: 100%;/* 高度設置52px */height: 50px;}/* 選中input標簽,直接設置標簽的屬性,先要選中,標簽選擇器 *//* input在進行高度設置的時候,沒有考慮邊框的問題 */.container .search input {/* 設置left浮動 */float: left;width: 600px;height: 50px;/* 設置邊框屬性,依次是邊框的寬度、樣式、顏色 */border: 2px solid #CCC;/* 去掉input輸入框的右邊框 */border-right: none;/* 設置內內邊距,默認文字不要和左側邊框緊挨著 */padding-left: 10px;/* 設置input內部的字體的顏色和樣式 */color: #CCC;color: #CCC;font-size: 17px;}.container .search button {/* 設置left浮動 */float: left;width: 150px;height: 54px;/* 設置button的背景顏色 #4e6ef2*/background-color: #4e6ef2;color: #FFF;/* 設置字體的大小 */font-size: 19px;font-family: Georgia, 'Times New Roman', Times, serif 'Times New Roman', Times, serif;}.container .result {width: 100%;}.container .result .item {margin-top: 15px;}.container .result .item a {/* 設置為塊級元素,單獨占一行 */display: block;text-decoration: none;/* 設置a標簽中的文字字體大小 */font-size: 22px;/* 設置字體的顏色 */color: #4e6ef2;}.container .result .item a:hover {/* 設置鼠標放在a之上的動態效果 */text-decoration: underline;}.container .result .item p {margin-top: 5px;font-size: 16px;font-family: 'Lucida Sans', 'Lucida Sans Regular', 'Lucida Grande', 'Lucida Sans Unicode', Geneva, Verdana, sans-serif;}.container .result .item i {/* 設置為塊級元素,單獨占一行 */display: block;/* 取消斜體風格 */                                                                                                                                                                                                                                      font-style: normal;color: green;}</style>
</head><body><div class="container"><div class="search"><input type="text" value="輸入搜索關鍵字..."><button onclick="Search()">搜索一下</button></div><div class="result"><!-- <div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div><div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div><div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div><div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div><div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div><div class="item"><a href="#">這是標題</a><p>這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要這是摘要</p><i>https://hao.360.com/?hj=llq7a</i></div> --></div></div><script>function Search() {// 是瀏覽器的一個彈出窗// 1.提取數據,$可以理解為就是JQuery的別稱let query = $(".container .search input").val();console.log("query = " + query); //console是瀏覽器對話框,可以用來進行查看js數據// 2.發起http請求,ajax屬于一個和后端進行數據交互的函數$.ajax({type: "GET",url: "/s?word=" + query,success: function (data) {console.log(data);BuildHtml(data);}});}function BuildHtml(data) {// 獲取html中的result標簽let result_lable = $(".container .result");// 清空歷史搜索結果result_lable.empty();for (let elem of data) {console.log(elem.title);console.log(elem.url);let a_lable = $("<a>", {text: elem.title,href: elem.url,// 跳轉到新的頁面target: "_blank"});let p_lable = $("<p>", {text: elem.desc});let i_lable = $("<p>", {text: elem.url});let div_lable = $("<div>", {class: "item"});a_lable.appendTo(div_lable);p_lable.appendTo(div_lable);i_lable.appendTo(div_lable);div_lable.appendTo(result_lable);}}                                                                                                                                                                                                                                                           </script>
</body></html>

最終演示:

  • 將我們的項目部署到Linux上: n**ohup ./http_server > log/log.txt 2>&1 &**
  • 一些日志信息就會保存到log/log.txt中

十一. 詳解傳 gitee

在 Ubuntu 上向 Gitee(碼云)上傳代碼,通常需要通過 Git 進行。下面是具體步驟:

  1. 安裝 Git
    如果你還沒有安裝 Git,可以通過以下命令來安裝:

    sudo apt-get update
    sudo apt-get install git

  2. 配置 Git
    首次使用 Git 時,需要設置你的用戶名和郵箱地址。這將用于提交信息。

    git config --global user.name “你的用戶名”
    git config --global user.email “你的郵箱@example.com”

  3. 創建 Gitee 倉庫
    登錄到 Gitee 并創建一個新的倉庫。記下倉庫的 URL。

  4. 初始化本地倉庫(如果你還沒有一個本地 Git 倉庫):

    • 打開終端并導航到你的項目目錄。
    • 初始化一個新的 Git 倉庫:

    git init

    • 添加遠程倉庫鏈接(替換 your-repo-url 為你的 Gitee 倉庫 URL):

    git remote add origin your-repo-url

  1. 添加文件到倉庫
  • 將所有文件添加到暫存區:

    git add .

    • 或者你可以選擇性地添加特定文件:

    git add 文件名

  1. 提交更改
  • 提交文件到本地倉庫,并附上提交信息:

    git commit -m “初始提交或描述本次提交的內容”

  1. 推送到 Gitee
  • 推送你的本地分支到 Gitee 倉庫的主分支(通常是 mastermain):

    git push -u origin master

    • 如果你的默認分支是 main 而不是 master,請相應地調整命令

    git push -u origin main

  1. 驗證
  • 打開 Gitee 網站上的倉庫頁面,確認文件已經成功上傳。

如果你在推送過程中遇到權限問題,確保你在 Gitee 上正確設置了 SSH 密鑰或使用了正確的 HTTPS 憑證。

  • 如果使用的是 HTTPS 方式,可能需要輸入 Gitee 的用戶名和密碼或者使用個人訪問令牌。
  • 如果是 SSH 方式,則需要生成 SSH 密鑰對并將公鑰添加到 Gitee 賬戶中。

1.問題

git add .報錯warning: adding embedded git repository: carreport hint: You‘ve added another git…

原因:
使用 git add . 時,出現上述錯誤。是因為在當前 git 倉庫中同時包含有另一個git倉庫。如當前倉庫目錄下的子文件夾內又是一個倉庫。

解決:
刪除子文件夾的.git文件, 重新add commit push


2.出錯:
! [rejected] master -> master (fetch first) error: failed to push some refs to ' 。。。'

出現這個問題是因為github中的README.md文件不在本地代碼目錄中,可以通過如下命令進行代碼合并

git pull --rebase origin master


十二、項目總結

項目的擴展

1. 建立整站搜索

  • 我們搜索的內容是在boost庫下的doc目錄下的html文檔,你可以將這個庫建立搜索,也可以將所有的版本,但是成本是很高的,對單個版本的整站搜索還是可以完成的,取決于你服務器的配置。

2. 設計一個在線更新的方案,信號,爬蟲,完成整個服務器的設計

  • 我們在獲取數據源的時候,是我們手動下載的,你可以學習一下爬蟲,寫個簡單的爬蟲程序。采用信號的方式去定期的爬取。

3. 不使用組件,而是自己設計一下對應的各種方案

  • 我們在編寫http_server的時候,是使用的組件,你可以自己設計一個簡單的;

4. 在我們的搜索引擎中,添加競價排名

  • 我們在給用戶反饋是,提供的是json串,顯示到網頁上,有title、content和url;就可以在構建json串時,你加上你的博客鏈接(將博客權重變高了,就能夠顯示在第一個)
  1. 熱次統計,智能顯示搜索關鍵詞(字典樹,優先級隊列)

6. 設置登陸注冊,引入對mysql的使用

以上就是對于C++項目–基于Boost庫的搜索引擎 的理解,完結撒花~

后續還會繼續更新一些項目 ,有興趣的小伙伴歡迎大家訂閱【項目】專欄~

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/web/64025.shtml
繁體地址,請注明出處:http://hk.pswp.cn/web/64025.shtml
英文地址,請注明出處:http://en.pswp.cn/web/64025.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

xxl-job 簡單的入門到實戰

本文是參考官方文檔自己實踐一次&#xff0c;純享版&#xff0c;大致也是作者邊寫博客邊去跟著官方文檔實現 一、前期準備 1、官網地址 GitHub地址&#xff1a; GitHub - xuxueli/xxl-job: A distributed task scheduling framework.&#xff08;分布式任務調度平臺XXL-JOB&…

Centos7, 使用yum工具,出現 Could not resolve host: mirrorlist.centos.org

在 CentOS 7 中使用 yum 工具時&#xff0c;如果出現 "Could not resolve host: mirrorlist.centos.org" 的錯誤&#xff0c;通常是因為默認的鏡像源無法訪問。以下是一些常用的解決方法&#xff1a; 檢查網絡連接&#xff1a;首先使用 ping 命令測試網絡連接是否正常…

【教程】通過Docker運行AnythingLLM

轉載請注明出處&#xff1a;小鋒學長生活大爆炸[xfxuezhagn.cn] 如果本文幫助到了你&#xff0c;歡迎[點贊、收藏、關注]哦~ 官方教程&#xff1a;Local Docker Installation ~ AnythingLLM 1、先創建一個目錄用于保存anythingllm的持久化文件&#xff1a; sudo mkdir /app su…

若依(RuoYi-Vue)+Flowable工作流前后端整合教程

此教程適合若依前后端分離項目&#xff0c;其他項目可以在擴展列表中進行查找。 近期公司里需要對很久以前的RuoYi-Vue前后端分離項目擴展出flowable的功能&#xff0c;當然這個重任也是落在了我的身上&#xff08;不然也不會有這篇文章&#xff09;&#xff0c;然后我在官網看…

ubuntu 網絡管理--NetworkManager

ubuntu 網絡管理--NetworkManager 1 介紹2 NetworkManager 命令2 nmcli 命令顯示可用的wifi AP連接wifi檢查網絡連接 ?? 如何刪除刪除網絡連接查看設備狀態添加一個新的以太網連接設置靜態 IP 地址啟用并測試連接添加新的wifi連接 3 其他命令參考 1 介紹 NetworkManager 是標…

計算機網絡習題(第5章 網絡層 第6章 傳輸層)

第5章 網絡層 一、單選題 1、下列關于 IPv4 地址的說法中&#xff0c;錯誤的是( )。 A、 IP 地址是邏輯地址 B、 IP 地址一般用點分十進制表示 C、 205.106.286.36 是一個合法的 IP 地址 D、 同一個網絡中不能有兩臺計算機的 IP 地址相同 正確答案&#xff1a; C 2、…

水庫大壩三維模型的開發和使用3Dmax篇

成果圖 開發過程 工具插件three.js先加載模型做水體銜接水位測量標尺水位標記斷面標記大壩監測點打點 上代碼&#xff0c;技術交流V: bloxed <template><div class"box w100 h100"><el-row :gutter"20" v-loading"loading"e…

【藍橋杯每日一題】分糖果——DFS

分糖果 藍橋杯每日一題 2024-12-24 分糖果 DFS 題目描述 兩種糖果分別有 9 個和 16 個&#xff0c;要全部分給 7 個小朋友&#xff0c;每個小朋友得到的糖果總數最少為 2 個最多為 5 個&#xff0c;問有多少種不同的分法。糖果必須全部分完。 只要有其中一個小朋友在兩種方案中…

計算機畢設-基于springboot的校園招聘網站的設計與實現(附源碼+lw+ppt+開題報告)

博主介紹&#xff1a;?多個項目實戰經驗、多個大型網購商城開發經驗、在某機構指導學員上千名、專注于本行業領域? 技術范圍&#xff1a;Java實戰項目、Python實戰項目、微信小程序/安卓實戰項目、爬蟲大數據實戰項目、Nodejs實戰項目、PHP實戰項目、.NET實戰項目、Golang實戰…

重生之我在異世界學編程之C語言:深入動態內存管理收尾 + 柔性數組篇

大家好&#xff0c;這里是小編的博客頻道 小編的博客&#xff1a;就愛學編程 很高興在CSDN這個大家庭與大家相識&#xff0c;希望能在這里與大家共同進步&#xff0c;共同收獲更好的自己&#xff01;&#xff01;&#xff01; 本文目錄 引言正文常見的動態內存管理錯誤&#xf…

無人直播源碼

DY無人直播系統架構設計介紹 在DY等短視頻平臺的直播中&#xff0c;無人直播系統能夠提供自動化、智能化的互動體驗&#xff0c;既減輕了主播的工作量&#xff0c;又提升了觀眾的參與感。以下是一個典型的無人直播系統架構設計&#xff0c;包含全局配置、點對點互動、產品話術、…

被裁20240927 --- 嵌入式硬件開發 前篇

前篇主要介紹一些相關的概念&#xff0c;用于常識掃盲&#xff0c;后篇開始上干貨&#xff01; 他捧著一只碗吃過百家的飯 1. 處理器芯片1.1 處理器芯片制造商一、 英特爾&#xff08;Intel&#xff09;二、 三星&#xff08;SAMSUNG&#xff09;三、 高通&#xff08;Qualcomm…

準備考試:解決大學入學考試問題

引言 在編程競賽和算法挑戰中&#xff0c;我們經常會遇到各種類型的組合問題。這些問題不僅考驗我們的邏輯思維能力&#xff0c;還要求我們熟練掌握數據結構和算法。在這篇文章中&#xff0c;我們將探討一個有趣的問題——“準備考試”&#xff0c;這個問題來自于一個虛構的情…

【Linux】進程間通信 -> 匿名管道命名管道

進程間通信的目的 數據傳輸&#xff1a;一個進程許需要將它的數據發送給另外一個進程。資源共享&#xff1a;多個進程之間共享同樣的資源。通知事件&#xff1a;一個進程需要向另一個或一組進程發送消息&#xff0c;通知它們發生了某種事件&#xff08;如進程終止時要通知父進程…

Pytorch注意力機制應用到具體網絡方法(閉眼都會版)

文章目錄 以YoloV4-tiny為例要加入的注意力機制代碼模型中插入注意力機制 以YoloV4-tiny為例 解釋一下各個部分&#xff1a; 最左邊這部分為主干提取網絡&#xff0c;功能為特征提取中間這邊部分為FPN&#xff0c;功能是加強特征提取最后一部分為yolo head&#xff0c;功能為獲…

修改el-select下拉框高度;更新:支持動態修改

文章目錄 效果動態修改&#xff1a;效果代碼固定高度版本動態修改高度版本&#xff08;2024-12-25 更新&#xff1a; 支持動態修改下拉框高度&#xff09; 效果 動態修改&#xff1a;效果 代碼 固定高度版本 注意點&#xff1a; popper-class 盡量獨一無二&#xff0c;防止影…

開關電源特點、分類、工作方式

什么叫開關電源隨著電力電子技術的發展和創新&#xff0c;使得開關電源技術也在不斷地創新。目前&#xff0c;開關電源以小型、輕量和高效率的特點被廣泛應用幾乎所有的電子設備&#xff0c;是當今電子信息產業飛速發展不可缺少的一種電源方式。 開關電源是利用現代電力電子技…

Linux應用軟件編程-文件操作(目錄io)

1.打開目錄&#xff1a; DIR *opendir(const char *name); 功能&#xff1a;打開一個目錄獲得一個目錄流指針 參數: name:目錄名 返回值&#xff1a;成功返回目錄流指針&#xff1b;失敗返回NULL 2.讀目錄&#xff1a; struct dirent *readdir(DIR *dirp); 功能&…

有哪些開發者模式?

1、單例開發模式&#xff08;Singleton Pattern&#xff09; 單例模式是一種創建型設計模式&#xff0c;目的是確保在程序運行期間&#xff0c;某個類只有一個實例&#xff0c;并提供一個全局訪問點來訪問該實例。 核心特點 唯一實例&#xff1a;一個類只能創建一個對象實例。…

如何完全剔除對Eureka的依賴,報錯Cannot execute request on any known server

【現象】 程序運行報錯如下&#xff1a; com.netflix.discovery.shared.transport.TransportException報錯Cannot execute request on any known server 【解決方案】 &#xff08;1&#xff09;在Maven工程中的pom去掉Eureka相關的引用&#xff08;注釋以下部分&#xff0…