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

【云备份】配置文件加载模块

目录

 一.为什么要配置文件

二.配置文件的实现

三.单例文件配置类设计

四.源码


 

 一.为什么要配置文件

我们将服务端程序运行中用到的一些关键信息保存到配置文件中,这样可以使程序的运行更加灵活。

这样做的好处是,未来如果我们想要修改一些关键信息,不需要去源文件里修改,避免了文件重新编译等。

配置文件信息

  • 热点判断时间

决定热点文件隔多长时间会被判定为非热点文件。这个必须是可变的,因为我们

  • 文件下载的 URL 前缀路径

用于表示客户端的请求是一个下载请求。

一般来说,我们的用户都是输入类似于下面这种URL:http://192.168.122.136:9090/path,通过这样子的方式,默认访问到的是我们根目录下的path文件了吗?那访问我们服务器的用户不都可以通过这种方式获取我服务器上的所有文件了吗?这是很危险的,所以我们会在程序运行时添加一个新的相对的根目录。例如wwwroot。此时用户只能访问/wwwroot/里面的所有文件,这就是一种前缀路径。

示例:但是当用户发一个请求listshow来查看备份列表,listshow可能是一种指令,也可能是一个文件的名字,那我们如何判断这个请求不是一个listshow的文件下载请求呢?

此时我们可以为下载请求添加一个前缀路径,例如/download/listshow,那么就认为它是一个下载一个名字叫listshow文件的请求

  • 压缩包后缀名

约定一个压缩包命名规则。示例:在原文件后面加上 .lz 表示该文件的压缩包名称。

  • 上传文件存放路径

决定上传文件之后,该文件实际存储在服务器的何处。

  • 压缩包存放路径

决定压缩后的文件存储在何处。

上传的文件也可能是压缩文件,而我们对于上传的文件里面对于非热点文件,我们会进行压缩,如果非热点文件是压缩文件,那我们不能对其再次进行压缩。所以要将压缩包和普通文件分开来。

  • 服务端备份信息存放文件

服务端记录的备份文件信息的持久化存储路径或文件名。

事实上,我们这个项目并没有使用数据库来存储任何信息,因为这个是一个入门项目,如果加上数据库,就会显得这个项目有点庞大了。所以我们不加上数据库好了。

当程序需要运行在其他主机上,则不需要修改程序,只需要修改一下配置文件就OK了。

  • 服务器访问 IP 地址

服务器的 IP 地址,用于客户端访问。

当程序需要运行在其他主机上,则不需要修改程序,只需要修改一下配置文件就OK了。

  • 服务器访问端口

服务器的访问端口,用于客户端与服务端之间的通信。

当程序需要运行在其他主机上,则不需要修改程序,只需要修改一下配置文件就OK了。


二.配置文件的实现

我们这些配置文件都是基于JSON来描述的

cloud.conf

// cloud.conf
{"hot_time" : 30,"server_port" : 9090,"server_ip" : "117.72.80.239","download_prefix" : "/download/","packfile_suffix" : ".lz","pack_dir" : "./packdir/","back_dir" : "./backdir/","backup_file" : "./cloud.dat"
}

我们去我们的服务器里,创建一个cloud.conf文件

 

三.单例文件配置类设计

使用单例模式管理系统配置信息,能够让配置信息的管理控制更加统一灵活。该类的设计我们将使用单例模式中的懒汉模式,即在使用时创建对象。

conf.hpp

#ifndef _MY_CONFIG_
#define _MY_CONFIG_
#include"util.hpp"
#include<mutex>namespace cloud {#define CONFIG_FILE "./cloud.conf" // 配置文件路径class Config{public:static Config* GetInstance(){if (_instance == nullptr)//如果还没有被初始化,说明还没有被构造过{_mutex.lock();//加锁保护if (_instance == nullptr)//二次检测{_instance = new Config();//构建新对象}_mutex.unlock();//解锁}return _instance;//返回句柄}int GetHotTime(){return _hot_time;}int GetServerPort(){return _server_port;}std::string GetSeverIp(){return _server_ip;}std::string GetDownloadPrefix(){return _download_prefix;}std::string GetPackFileSuffix(){return _packfile_suffix;}std::string GetPackDir(){return _pack_dir;}std::string GetBackDir(){return _back_dir;}std::string GetBackupFile(){return _backup_file;}private:Config() // 构造函数私有化,因为我们是根据配置文件来对这个类来构造的,所以一个类只能有一个构造函数//无法在类外进行实例化{ReadConfigFile();//一构造就去读取配置文件}bool ReadConfigFile()//读取配置文件{FileUtil fu(CONFIG_FILE);//这个CONFIG_FILE在上面定义了std::string body;if(fu.GetContent(&body) == false)//body存储了配置文件的内容,但配置文件是序列化之后的内容,不能直接使用{std::cout << "load config file failed!" << std::endl;return false;}Json::Value root;if(JsonUtil::Unserialize(body, &root) == false)//root里面存储了配置文件反序列化后的内容{std::cout << "parse config file failed!" << std::endl;return false;}_hot_time = root["hot_time"].asInt();_server_port = root["server_port"].asInt();_server_ip = root["server_ip"].asString();_download_prefix = root["download_prefix"].asString();_packfile_suffix = root["packfile_suffix"].asString();_pack_dir = root["pack_dir"].asString();_back_dir = root["back_dir"].asString();_backup_file = root["backup_file"].asString();}private:int _hot_time;//热点判断时间int _server_port;//服务器监听端口号std::string _server_ip;//服务器监听的IPstd::string _download_prefix;//下载的url的前缀路径std::string _packfile_suffix;//压缩文件的后缀名,比如.lzstd::string _pack_dir;// 压缩包存放路径std::string _back_dir;// 备份文件存放路径std::string _backup_file;// 备份信息存放文件static Config* _instance;//句柄,单例模式,只有一个实例,所以加staicstatic std::mutex _mutex;//由于是单例模式的懒汉模式,涉及线程安全,所以需要加互斥锁};Config* Config::_instance = nullptr;//初始化std::mutex Config::_mutex;//锁
};
#endif

我们回到我们的服务器上面来,创建一个conf.hpp,把上面那个代码给填进去就OK了。

我们来对它进行检测一下,

cloud.cc

#include"util.hpp"
#include"conf.hpp"void ConfigTest()
{       cloud::Config*config=cloud::Config::GetInstance();std::cout<<config->GetHotTime()<<std::endl;std::cout<<config->GetServerPort()<<std::endl;std::cout<<config->GetSeverIp()<<std::endl;std::cout<<config->GetDownloadPrefix()<<std::endl;std::cout<<config->GetPackFileSuffix()<<std::endl;std::cout<<config->GetPackDir()<<std::endl;std::cout<<config->GetBackDir()<<std::endl;std::cout<<config->GetBackupFile()<<std::endl;
}
int main(int argc,char*argv[])
{ConfigTest();return 0;
}

这个时候我们编译,就会发现一个错误

这个是因为util.hpp是被重复包括了,因为cloud.cc和conf.hpp里面都包含了头文件util.hpp,所以我们需要加上防止头文件重复定义的.

我们需要在util.hpp里面加上这个

#ifndef _MY_UTIL_
#define _MY_UTIL_...#endif

现在编译就没有问题了,

我们运行一下

也是一点问题都没有。


到这里,我们还是需要使用git来提交一番

四.源码

util.hpp

#ifndef _MY_UTIL_
#define _MY_UTIL_
#include<iostream>
#include<fstream>
#include<string>
#include<vector>
#include <time.h>
#include <sys/types.h>
#include <sys/stat.h>
#include <unistd.h>
#include"bundle.h"
#include <experimental/filesystem>
#include <jsoncpp/json/json.h>namespace cloud {//注意:我们下面这些接口的名称可能会与系统的那些接口的名字重复,所以最好创建名称空间来避免名称污染namespace fs = std::experimental::filesystem;class FileUtil{public:FileUtil(const std::string& filename):_filename(filename){}//主要针对普通文件的接口int64_t FileSize() // 获取文件大小,这里使用64位的有符号的int,防止文件过大导致文件大小显示异常{struct stat st;int re=stat(_filename.c_str(),&st);if(re<0)//stat函数获取文件属性失败了{std::cout<<"Get FileSize Failed!!"<<std::endl;return -1;}return st.st_size;}time_t LastModtime() // 获取文件最后一次修改时间{struct stat st;int re = stat(_filename.c_str(), &st);if (re < 0)//stat函数获取文件属性失败了{std::cout << "Get LastModtime Failed!!" << std::endl;return -1;}return st.st_mtim.tv_sec;}time_t LastAcctime() // 获取文件最后一次访问时间{struct stat st;int re = stat(_filename.c_str(), &st);if (re < 0)//stat函数获取文件属性失败了{std::cout << "Get LastAcctime Failed!!" << std::endl;return -1;}return st.st_atim.tv_sec;}std::string FileName() // 获取文件路径中的纯文件名称 a/b/c/test.cc --> test.cc{size_t pos=_filename.find_last_of("/");//寻找最后一个/if(pos==std::string::npos)//没找到,说明没有/{return _filename;}return _filename.substr(pos+1);//从pos截取到末尾}bool GetPosLen(std::string* body, size_t pos, size_t len){std::ifstream ifs;ifs.open(_filename, std::ios::binary);//打开文件,以二进制方式来读取数据if (ifs.is_open() == false)//打开失败{std::cout << "GetPosLen: open file failed!" << std::endl;return false;}size_t fsize = this->FileSize();//获取文件大小if (pos + len > fsize)//超过文件大小了{std::cout << "GetPosLen: get file len error" << std::endl;return false;}ifs.seekg(pos, std::ios::beg); // 将文件指针定位到pos处body->resize(len);//把存储读取的数据的载体的大小修改到够大的ifs.read(&(*body)[0], len);//读取数据if (ifs.good() == false)//上次读取出错了{std::cout << "GetPosLen: get file content failed" << std::endl;ifs.close();return false;}ifs.close();return true;}bool GetContent(std::string* body){size_t fsize = FileSize();return GetPosLen(body, 0, fsize);}bool SetContent(const std::string& body)//写入数据{std::ofstream ofs;//也就是输出ofs.open(_filename, std::ios::binary);//以二进制模式打开if (ofs.is_open() == false)//打开失败{std::cout << "SetContent: write open file failed" << std::endl;return false;}ofs.write(&body[0], body.size());if (ofs.good() == false)//上次写入文件数据出错了{std::cout << "SetContent: write open file failed" << std::endl;ofs.close();return false;}ofs.close();return true;}bool Compress(const std::string& packname){// 1.获取源文件数据std::string body;if (this->GetContent(&body) == false)//源文件数据都存储在body里面{//获取源文件数据失败std::cout << "compress get file content failed" << std::endl;return false;}// 2.对数据进行压缩std::string packed = bundle::pack(bundle::LZIP, body);// 3.将压缩的数据存储到压缩包文件中FileUtil fu(packname);if (fu.SetContent(packed) == false){//压缩数据写入压缩包文件失败std::cout << "compress write packed data failed!" << std::endl;return false;}return true;}bool UnCompress(const std::string& filename){// 1.将当前压缩包数据读取出来std::string body;if (this->GetContent(&body) == false){std::cout << "Uncompress get file content failed!" << std::endl;return false;}// 2.对压缩的数据进行解压缩std::string unpacked = bundle::unpack(body);// 3.将解压缩的数据写入到新文件中FileUtil fu(filename);if (fu.SetContent(unpacked) == false){std::cout << "Uncompress write packed data failed!" << std::endl;return false;}return true;}bool Exists(){return fs::exists(_filename);}bool Remove(){if (Exists() == false){return true;}remove(_filename.c_str());return true;}bool CreateDirectory(){if (Exists()) return true;return fs::create_directories(_filename);}bool ScanDirectory(std::vector<std::string>* array){for (auto& p : fs::directory_iterator(_filename)) // 迭代器遍历指定目录下的文件,从那个网站上面复制下来的{if (fs::is_directory(p) == true)//如果是目录,就不添加进当前目录的文件里continue;// relative_path 带有路径的文件名array->push_back(fs::path(p).relative_path().string());//添加文件//注意迭代器返回的p不是string,不能直接将p添加进array里面,我们需要使用path将其}return true;}private:std::string _filename; // 文件名--包含路径};class JsonUtil {public:/*** @brief 将 Json::Value 对象序列化为字符串* @param root 输入的 JSON 数据结构(待序列化)* @param str 输出的序列化后的字符串* @return true 序列化成功,false 序列化失败*/static bool Serialize(const Json::Value &root, std::string *str) {// 1. 创建 JSON 流写入器构建器(可配置格式化选项,如缩进)Json::StreamWriterBuilder swb;// 2. 通过构建器生成 StreamWriter 对象(unique_ptr 自动管理内存)std::unique_ptr<Json::StreamWriter> sw(swb.newStreamWriter());std::stringstream ss;  // 用于存储序列化结果// 3. 将 JSON 数据写入流// 返回值 0 表示成功,非 0 表示失败(JsonCpp 的约定)if (sw->write(root, &ss) != 0) {std::cout << "JSON 序列化失败!" << std::endl;return false;}// 4. 将 stringstream 内容转为字符串*str = ss.str();return true;}/*** @brief 将字符串反序列化为 Json::Value 对象* @param str 输入的 JSON 格式字符串* @param root 输出的解析后的 JSON 数据结构* @return true 解析成功,false 解析失败*/static bool Unserialize(const std::string &str, Json::Value *root) {// 1. 创建 JSON 字符读取器构建器Json::CharReaderBuilder crb;// 2. 通过构建器生成 CharReader 对象(unique_ptr 自动管理内存)std::unique_ptr<Json::CharReader> cr(crb.newCharReader());std::string err;  // 存储解析错误信息// 3. 解析字符串// 参数说明:// - str.c_str():字符串起始地址// - str.c_str() + str.size():字符串结束地址// - root:输出解析后的 JSON 对象// - &err:错误信息输出bool ret = cr->parse(str.c_str(), str.c_str() + str.size(), root, &err);if (!ret) {std::cout << "JSON 解析错误: " << err << std::endl;return false;}return true;}};
};
#endif

相关文章:

【云备份】配置文件加载模块

目录 一.为什么要配置文件 二.配置文件的实现 三.单例文件配置类设计 四.源码 一.为什么要配置文件 我们将服务端程序运行中用到的一些关键信息保存到配置文件中&#xff0c;这样可以使程序的运行更加灵活。 这样做的好处是&#xff0c;未来如果我们想要修改一些关键信息&…...

重构之道:识别并替换不合适使用的箭头函数

1、引言 JavaScript 自 ES6 引入了箭头函数(Arrow Function)后,因其简洁的语法和对 this 的词法绑定机制,迅速成为开发者喜爱的写法之一。然而,并不是所有场景都适合使用箭头函数。 在实际开发中,我们常常会因为追求代码简洁而忽视其潜在问题,例如: this 指向错误不适…...

git问题记录-如何切换历史提交分支,且保留本地修改

问题记录 我在本地编写了代码&#xff0c;突然想查看之前提交的代码&#xff0c;并且想保留当前所在分支所做的修改 通过git stash对本地的代码进行暂存 使用git checkout <commit-hash>切换到之前的提交记录。 查看完之后我想切换回来&#xff0c;恢复暂存的本地代码…...

【MySQL】事务管理

事务管理 一. 事务的概念二. 事务的特征三. 事务的版本支持四. 事务的提交方式五. 事务的常见操作六. 事务的隔离级别1. 查看与设置隔离级别2. 读未提交 (Read Uncommitted)3. 读提交 (Read Committed)4. 可重复读 (Repeatable Read)5. 串行化 (Serializable)6. 隔离级别的总结…...

【点对点协议(PPP)全解析】从原理到工程实践

目录 前言技术背景与价值当前技术痛点解决方案概述目标读者说明 一、技术原理剖析核心概念图解核心作用讲解关键技术模块说明技术选型对比 二、实战演示环境配置要求核心配置实现案例1&#xff1a;基础PPP链路建立案例2&#xff1a;CHAP认证配置 运行结果验证 三、性能对比测试…...

环境搭建:开启 Django 开发之旅

一、环境搭建&#xff1a;开启 Django 开发之旅 &#xff08;一&#xff09;安装 Python 先确保电脑上装有 Python 3.6 及以上版本&#xff0c;Django 5.1 的话&#xff0c;至少得 Python 3.8 哦。 安装前&#xff0c;先查下有没有装过 Python &#xff0c;终端&#xff08;Wi…...

如何配置NGINX作为反向代理服务器来缓存后端服务的响应?

大家好&#xff0c;我是锋哥。今天分享关于【如何配置NGINX作为反向代理服务器来缓存后端服务的响应&#xff1f;】面试题。希望对大家有帮助&#xff1b; 如何配置NGINX作为反向代理服务器来缓存后端服务的响应&#xff1f; 1000道 互联网大厂Java工程师 精选面试题-Java资源…...

【Java IO流】File类基础详解

参考笔记&#xff1a;java File类基础 万字详解&#xff08;通俗易懂&#xff09;-CSDN博客 目录 1.前言 2. File类介绍 3. File类构造方法 4.File类常用的方法案例演示 4.1 创建文件/文件夹的方法 4.2 删除文件/文件夹的方法 4.3 判断文件/文件夹是否存在的方法 4.4 …...

《C#数据结构与算法》—201线性表

线性表的实现方式 顺序表 线性表的顺序存储是指在内存中用一块地址连续的空间依次存放线性表的数据元素&#xff0c;用这种方式存储的线性表叫顺序表。 特点&#xff1a;表中相邻的数据元素在内存中存储位置也相邻。 顺序表接口实现&#xff1a; 方法名参数返回值描述GetLen…...

MATLAB绘制局部放大图

今天&#xff0c;我将分享一段 MATLAB 代码&#xff0c;该代码生成了一个主副图结合的可视化展示&#xff0c;用于比较不同控制系统性能表现。 clc; clear; close all;% 生成时间向量 t 0:0.1:12;% 生成模拟数据 zero_feedback 0.5 * ones(size(t)); % 恒定…...

TS 常用类型

JS不会检查变量类型的变化 给变量规定特定的数据类型&#xff0c;错误赋值时会报错 优势&#xff1a;TS会标记出代码中的意外行为&#xff0c;尤其是typeerrors 具体实现&#xff1a;类型注解 JS和TS中数据类型的变化...

[Control-Chaos] Toxic Cascade(毒性級鏈)

信息 信息描述靶場名稱Toxic Cascade地址GitHub: Toxic Cascade難度中等人數推薦1人類型CTF、APT 攻擊模擬、故事解謎、化工工程與逆向工程描述Toxic Cascade 是一個結合 CTF、APT 攻擊模擬、故事解謎、化工工程與逆向工程的高度沉浸式靶場。該靶場具有獨特的情境背景與模擬真…...

纳米AI搜索体验:MCP工具的实际应用测试,撰写报告 / 爬虫小红书效果惊艳

1. 引言 近期测试了纳米AI搜索的MCP工具功能&#xff0c;重点体验了其智能体在报告生成和社交媒体数据分析方面的表现。平台整合了100多个MCP工具&#xff0c;通过本地化部署的方式&#xff0c;为用户提供了不同于云端方案的操作体验。本文将分享实际测试结果&#xff0c;包括智…...

React useMemo函数

第一个参数是回调函数&#xff0c;返回计算的结果&#xff0c;第二个参数是依赖项&#xff0c;该函数只监听count1变量的变化 import { useReducer, useState } from react; import ./App.css;// 定义一个Reducer函数 根据不同的action进行不同的状态修改 function reducer(st…...

第 1 篇:起点的选择:为何需要超越数组与链表?

大家好&#xff0c;欢迎来到“数据结构选型指南”系列&#xff01;在软件开发中&#xff0c;数据是核心&#xff0c;而如何高效地组织和访问这些数据&#xff0c;则是程序性能的关键。选择合适的数据结构&#xff0c;就像为你的 Java 应用选择最优的“引擎零件”。今天&#xf…...

MySQL 索引不生效的情况

MySQL 索引不生效的 SQL 查询需要避免的情况 索引是提高 MySQL 查询性能的关键&#xff0c;但某些 SQL 写法会导致索引失效&#xff0c;从而影响查询效率。以下是需要避免的常见情况&#xff1a; 1. 使用 NOT、! 或 <> 操作符 -- 索引可能失效 SELECT * FROM users WH…...

【阿里云大模型高级工程师ACP学习笔记】2.9 大模型应用生产实践 (上篇)

特别说明:由于这一章节是2025年3月官方重点更新的部分,新增内容非常多,因此我不得不整理成上、下两篇,方便大家参考。 学习目标 备考阿里云大模型高级工程师ACP认证,旨在全面掌握大模型应用生产实践的专业知识,提升在该领域的实操技能与理论水平,为职业发展增添助力。具…...

STM32 ZIBEE DL-20 无线串口模块

一.配置方法 二.串口中断 u8 i; u16 buf[20],res; u8 receiving_flag 0; // 新增一个标志&#xff0c;用于标记是否开始接收数组 void USART1_IRQHandler(void) {if(USART_GetITStatus(USART1, USART_IT_RXNE) ! RESET) //接收中断{res USART_ReceiveData(USART1);if(receiv…...

【算法基础】选择排序算法 - JAVA

一、算法基础 1.1 什么是选择排序 选择排序是一种简单直观的排序算法&#xff0c;它的工作原理是&#xff1a;首先在未排序序列中找到最小&#xff08;或最大&#xff09;元素&#xff0c;存放到排序序列的起始位置&#xff0c;然后再从剩余未排序元素中继续寻找最小&#xf…...

FastAPI 与数据库交互示例

目录 安装必要的包完整代码示例运行应用使用说明API 端点说明代码解析 下面将创建一个简单的 FastAPI 应用程序&#xff0c;演示如何与 SQLite 数据库进行交互。这个例子包括创建、读取、更新和删除&#xff08;CRUD&#xff09;操作。 安装必要的包 首先&#xff0c;需要安装…...

(六——下)RestAPI 毛子(Http resilience/Refit/游标分页)

文章目录 项目地址一、Refit1.1 安装需要的包1.2 创建接口IGitHubApi1.3 创建RefitGitHubService1. 实现接口2. 注册服务 1.4 修改使用方法 二、Http resilience2.1 安装所需要的包2.2 创建resilience pipeline简单版2.3 创建全局的resilience处理1. 创建清理全局ResilienceHan…...

Rust 学习笔记:关于枚举与模式匹配的练习题

Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题 Rust 学习笔记&#xff1a;关于枚举与模式匹配的练习题以下程序能否通过编译&#xff1f;若能&#xff0c;输出是什么&#xff1f;考虑这两种表示结果类型的方式&#xff0c;若计算成功&#xff0c;则包含值 T&#xff1b…...

父子组件双向绑定

v-model 语法糖实现 vue中我们在input中可以直接使用v-model来完成双向绑定,这个时候 v-model 通常会帮我们完成两件事: v-bind:value的数据绑定@input的事件监听如果我们现在封装了一个组件,其他地方在使用这个组件时,是否也可以使用v-model来同时完成这两个功能呢? 当我…...

系统思考与第一性原理

最近一直有客户提到“第一性原理”&#xff0c;希望借此穿透纷繁复杂的现象&#xff0c;看清事情的本质。我第一反应是&#xff1a;这与系统思考中的冰山模型不谋而合。 冰山模型中提到&#xff1a;我们看到的只是表面事件&#xff0c;事件背后有趋势&#xff0c;趋势背后有结…...

基于Redis实现-UV统计

基于Redis实现-UV统计 本文将使用HyperLogLog来实现UV统计。 首先我们搞懂两个概念&#xff1a; UV&#xff1a;全称Unique Visitor&#xff0c;也叫独立访客量&#xff0c;是指通过互联网访问、浏览这个网页的自然人。1天内同一个用户多次访问该网站&#xff0c;只记录一次…...

【iOS】类与对象底层探索

类与对象底层探索 Clang探索对象本质objc_setProperty源码探索cls与类的关联原理isa的类型isa_t原理探索 类&类的结构什么是元类NSObject到底有几个isa走位&继承关系图objc_class&objc_object 类结构分析计算cache类中的内存大小获取bits属性列表&#xff08;prope…...

2025年- H18-Lc126-54.螺旋矩阵(矩阵)---java版

1.题目描述 2.思路* 思路1&#xff1a; 补充2&#xff1a; directions[1][0] // 表示“下”这个方向的行增量&#xff08;1&#xff09; directions[1][1] // 表示“下”这个方向的列增量&#xff08;0&#xff09; int[][] directions {{0, 1}, {1, 0}, {0, -1}, {-…...

Paddle Serving|部署一个自己的OCR识别服务器

前言 之前使用C部署了自己的OCR识别服务器&#xff0c;Socket网络传输部分是自己写的&#xff0c;回过头来一看&#xff0c;自己犯傻了&#xff0c;PaddleOCR本来就有自己的OCR服务器项目&#xff0c;叫PaddleServing&#xff0c;这里记录一下部署过程。 1 下载依赖环境 1.1 …...

yolov5 本地训练

YOLOv5 | Kaggle 直接gitclone他的源码用Vscode看&#xff08;也可以直接把jupyter下下来&#xff09; 他要1.8&#xff0c;我的是2.7&#xff0c;他这个代码可能有点年头了 两年前了 他的环境 我的环境 我就是不懂为什么清华源的torch windows默认下出来是cpu版本 . 在终端…...

同城跑腿小程序帮取帮送接单抢单预约取件智能派单同城配送全开源运营版源码优创

一、源码描述 这是一套同城跑腿小程序&#xff0c;基于FastadminUniapp框架&#xff0c;全开源无加密&#xff0c;可私有化部署&#xff0c;包含用户端、骑手端和运营端&#xff08;后端&#xff09;&#xff0c;支持帮取/帮送模式&#xff0c;支持一键接单/抢单&#xff0c;主…...

基于SpringBoot的药房药品销售管理系统

作者&#xff1a;计算机学姐 开发技术&#xff1a;SpringBoot、SSM、Vue、MySQL、JSP、ElementUI、Python、小程序等&#xff0c;“文末源码”。 专栏推荐&#xff1a;前后端分离项目源码、SpringBoot项目源码、Vue项目源码、SSM项目源码、微信小程序源码 精品专栏&#xff1a;…...

机器学习中的学习率及其衰减方法全面解析

摘要&#xff1a; 本文深入解析机器学习中的学习率及其衰减方法&#xff0c;涵盖学习率的作用、常用衰减参数及七种主流衰减策略&#xff08;分段常数、指数、自然指数、多项式、余弦、线性余弦、噪声线性余弦&#xff09;。通过公式推导与图示对比&#xff0c;揭示不同衰减方式…...

硬件性能与能效比竞赛:解码 PC 硬件的 “速度与激情”

引言&#xff1a;当性能遇见能效&#xff0c;一场永不停歇的算力革命 在数字内容爆炸式增长的时代&#xff0c;无论是 4K/8K 游戏的极致画质追求&#xff0c;还是 AI 大模型的本地化部署需求&#xff0c;亦或是内容创作者对实时渲染的效率渴求&#xff0c;都在推动 PC 硬件走向…...

大模型在终末期肾脏病风险预测与临床方案制定中的应用研究

目录 一、引言 1.1 研究背景与意义 1.2 研究目的与创新点 1.3 研究方法与数据来源 二、终末期肾脏病概述 2.1 定义与诊断标准 2.2 发病机制与影响因素 2.3 现状与危害 三、大模型技术原理及应用现状 3.1 大模型基本原理 3.2 在医疗领域应用案例 3.3 在终末期肾脏病…...

【C++11】智能指针

&#x1f4dd;前言&#xff1a; 这篇文章我们来讲讲C11——智能指针&#xff1a; &#x1f3ac;个人简介&#xff1a;努力学习ing &#x1f4cb;个人专栏&#xff1a;C学习笔记 &#x1f380;CSDN主页 愚润求学 &#x1f304;其他专栏&#xff1a;C语言入门基础&#xff0c;pyt…...

华为云Astro轻应用利用自定义连接器调用第三方接口实际操作

样图 说明 华为云Astro轻应用通过自定义连接器调用第三方接口具有多方面的作用,主要体现在以下几点: 扩展功能与集成能力 调用第三方服务:通过配置自定义连接器,Astro轻应用可以调用第三方提供的Rest协议接口,实现第三方提供的业务功能,扩展应用的能力。 集成外部系统:…...

【中间件】brpc_基础_butex.h

butex.h 学习笔记 源码 1 概述 butex.h 提供了一种用户态同步原语 butex&#xff08;类似 Linux 的 futex&#xff09;&#xff0c;专为 bthread 设计&#xff0c;用于高效协调线程的阻塞与唤醒。其核心是通过原子操作结合等待队列管理&#xff0c;减少内核态切换开销&#…...

数字智慧方案5876丨智慧交通枢纽智能化系统建设方案(56页PPT)(文末有下载方式)

篇幅所限&#xff0c;本文只提供部分资料内容&#xff0c;完整资料请看下面链接 https://download.csdn.net/download/2301_78256053/89575493 资料解读&#xff1a;智慧交通枢纽智能化系统建设方案 详细资料请看本解读文章的最后内容。 随着城市化进程的加速&#xff0c;交…...

深度学习笔记40_中文文本分类-Pytorch实现

&#x1f368; 本文为&#x1f517;365天深度学习训练营 中的学习记录博客&#x1f356; 原作者&#xff1a;K同学啊 | 接辅导、项目定制 一、我的环境 1.语言环境&#xff1a;Python 3.8 2.编译器&#xff1a;Pycharm 3.深度学习环境&#xff1a; torch1.12.1cu113torchvision…...

python设置word字体的方法

在Python中&#xff0c;可以使用python-docx库来设置Word文档的字体样式&#xff0c;以下为具体方法和示例代码&#xff1a; 一、设置段落中字体样式 使用python-docx库时&#xff0c;Word文档中的文本通常被组织成段落&#xff08;Paragraph对象&#xff09;&#xff0c;而一…...

golang常用库之-标准库text/template

文章目录 golang常用库之-标准库text/template背景什么是text/templatetext/template库的使用 golang常用库之-标准库text/template 背景 在许多编程场景中&#xff0c;我们经常需要把数据按照某种格式进行输出&#xff0c;比如生成HTML页面&#xff0c;或者生成配置文件。这…...

【JAVA】如何快速阅读一个基于maven构建的springboot项目

一、摘要 在JAVA项目开发过程中&#xff0c;现在比较流行的是springboot机构&#xff0c;特别是在后端开发的项目中&#xff0c;springboot应用的非常普遍。springboot很好将大型的、复杂的项目进行分解&#xff0c;以模块或者服务的表现形式组成项目。那么当我们接手一个陌生的…...

Fedora升级Google Chrome出现GPG check FAILED问题解决办法

https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公钥(0x7FAC5991)已安装 https://dl.google.com/linux/linux_signing_key.pub 的 GPG 公钥(0xD38B4796)已安装 仓库 "google-chrome" 的 GPG 公钥已安装&#xff0c;但是不适用于此软件包。 请检查此仓库的…...

深入解析MapReduce:大数据处理的经典范式

引言 在大数据时代&#xff0c;如何高效处理海量数据成为技术核心挑战之一。Hadoop生态中的MapReduce框架应运而生&#xff0c;以其“分而治之”的思想解决了大规模数据的并行计算问题。本文将从原理、核心组件到实战案例&#xff0c;带你全面理解这一经典计算模型。 一、MapR…...

JVM性能调优的基础知识 | JVM内部优化与运行时优化

目录 JVM内部的优化逻辑 JVM的执行引擎 解释执行器 即时编译器 JVM采用哪种方式&#xff1f; 即时编译器类型 JVM的分层编译5大级别&#xff1a; 分层编译级别&#xff1a; 热点代码&#xff1a; 如何找到热点代码&#xff1f; java两大计数器&#xff1a; OSR 编译…...

云计算-容器云-部署jumpserver 版本2

应用部署&#xff1a;堡垒机部署 # 使用提供的软件包配置Yum源&#xff0c;通过地址将jumpserver.tar.gz软件包下载至Jumpserver节点的/root目录下 [rootjumpserver ~]# tar -zxvf jumpserver.tar.gz -C /opt/ [rootjumpserver ~]# cp /opt/local.repo /etc/yum.repos.d/ [roo…...

MSP430G2553驱动0.96英寸OLED(硬件iic)

1.前言 最近需要用MSP430单片机做一个大作业,需要用到OLED模块&#xff0c;在这里记录一下 本篇文章主要讲解MSP430硬件iic的配置和OLED函数的调用&#xff0c;不会详细讲解OLED显示原理(其实就是江科大的OLED模块如何移植到msp430上).OLED显示原理以及底层函数讲解请参考其他…...

同质化的旅游内核

湘西凤凰古城、北京非常有文艺氛围的方家胡同都在被改造翻新为现代的其他城市范式式的样式。 什么意思呢&#xff1f;很多古城的老房子&#xff0c;从外面看&#xff0c;很古老、很漂亮&#xff0c;但是进去以后&#xff0c;完全不是那么回事&#xff0c;整座房子已经被完全掏…...

2025年五一数学建模A题【支路车流量推测】原创论文讲解(含完整python代码)

大家好呀&#xff0c;从发布赛题一直到现在&#xff0c;总算完成了2025年五一数学建模A题【支路车流量推测】完整的成品论文。 本论文可以保证原创&#xff0c;保证高质量。绝不是随便引用一大堆模型和代码复制粘贴进来完全没有应用糊弄人的垃圾半成品论文。 A题论文共104页&a…...

文章六:《循环神经网络(RNN)与自然语言处理》

文章6&#xff1a;循环神经网络&#xff08;RNN&#xff09;与自然语言处理——让AI学会"说人话" 引言&#xff1a;你的手机为什么能秒懂你&#xff1f; 当你说"我想看科幻片"时&#xff0c;AI助手能立刻推荐《星际穿越》&#xff0c;这背后是RNN在"…...