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

【项目】负载均衡式在线OJ

负载均衡式在线OJ

目录

负载均衡式在线OJ

1.项目介绍:

2.comm

2.1 log.hpp

日志等级

开放式日志

 时间戳工具

2.2 util.hpp

TimeUtil类

PathUtil类

FileUtil类

StringUtil类

3.Compile_server

3.1compile_run.hpp

RemoveTempFile

 CodeToDesc

 Start

 3.2compile.hpp

Compiler类

 3.3runner.hpp

Runner类

 4.oj_server

4.1 oj_control.hpp

Machine类

IncLoad

DecLoad

ResetLoad

Load

LoadBlance类

LoadConf

SmartChoice

OfflineMachine

OnlineMachine

Control类

RecoveryMachine

AllQuestions

Question

Judge

 4.2 oj_model

Question结构体

Model类

QueryMysql

GetAllQuestions

GetOneQuestion

依赖的外部模块

 4.3 oj_view

AllExpandHtml

 OneExpandHtml


1.项目介绍:

        该项目完成了类似力扣,牛客网等网站的在线OJ功能, 通过平衡负载函数,将所有用户发出的请求平均分配给每一台主机,做到负载均衡实现高并发、高可用性和高性能。

三个板块

comm : 时间戳生成、文件路径处理、文件读写操作以及字符串分割功能。
compile_server : 编译与运⾏模块
oj_server : 获取题目列表,查看题目编写题目界面,负载均衡等功能

开发环境 : C++、Ubuntu、vim、g++、gdb、git、Makefile

所用技术栈 : HTML、Json、STL标准库、Boost准标准库、cpp-httplib、ctemplate、MySQL

项目源码 :

2.comm

2.1 log.hpp

log.hpp定义了一个日志系统,可以进行日志等级,日志格式化,日志输出等功能,命名空间为ns_log。

日志等级

enum
{INFO,    // 信息级别日志DEBUG,   // 调试级别日志WARNING, // 警告级别日志ERROR,   // 错误级别日志FATAL    // 致命错误级别日志
};

开放式日志

使用方法 :   LOG(INFO) << "This is an info message" << "\n";

inline std::ostream &Log(const std::string &level, const std::string &file_name, int line)#define LOG(level) Log(#level, __FILE__, __LINE__)

 时间戳工具

TimeUtil::GetTimeStamp()

2.2 util.hpp

TimeUtil类

此类中共有两个接口,分别为GetTimeStamp(),用于获取当前时间的秒级时间戳,目的是为了给文件形成唯一的文件名,另外一个是GetTimeMs()获取当前时间的毫秒级时间戳。

static std::string GetTimeStamp()static std::string GetTimeMs()

PathUtil类

该类共有7个接口

AddSuffix:将文件名与后缀拼接,生成完整的文件路径 ;

Src: 构建源文件的完整路径,返回.cpp后缀的文件;

Exe:构建可执行文件的完整路径,添加.exe后缀

CompileError:构建编译错误文件的完整路径,添加.compile_error后缀

Stdin:构建标准输入文件的完整路径,添加.stdin后缀
Stdout:构建标准输出文件的完整路径,添加.stdout后缀

Stderr:构建标准错误文件的完整路径,添加.stderr后缀

static std::string AddSuffix(const std::string &file_name, const std::string &suffix)
static std::string Src(const std::string &file_name)
static std::string Exe(const std::string &file_name)
static std::string CompilerError(const std::string &file_name)
static std::string Stdin(const std::string &file_name)
static std::string Stdout(const std::string &file_name)
static std::string Stderr(const std::string &file_name)

FileUtil类

IsFileExists:检查文件是否存在,存在返回true,不存在返回false

static bool IsFileExists(const std::string &path_name)

UniqFileName:使用上述GetTimeMs函数获得唯一文件名

static std::string UniqFileName()

 WriteFile:将内容写入指定文件,target为目标文件路径,content为要写入的内容,写入成功为true

static bool WriteFile(const std::string &target, const std::string &content)

ReadFile: 读取文件的内容,target:目标文件路径,content:用于存储读取内容的字符串指针

static bool ReadFile(const std::string &target, std::string *content, bool keep = false)

StringUtil类

SplitString:将字符串按指定分隔符切分,并存储到target中,str:要切分的字符串,target:存储切结果的字符串向量,sep:切割符,该方法是基于Boost库实现的
 

static void SplitString(const std::string &str, std::vector<std::string> *target, const std::string &sep)

3.Compile_server

3.1compile_run.hpp

  • 编译用户代码: 将用户提交的代码编译为可执行文件。

  • 运行用户程序: 在限制的 CPU 时间和内存内运行用户程序。

  • 处理运行结果: 根据运行结果生成状态码和描述信息。

  • 清理临时文件: 在运行结束后清理生成的临时文件

RemoveTempFile

static void RemoveTempFile(const std::string &file_name)

该方法用于清理有指定文件名相关的临时文件。可用于清理以下文件:

源文件 (file_name.cpp)
编译错误文件 (file_name.compile_error)
可执行文件 (file_name.exe)
标准输入文件 (file_name.stdin)
标准输出文件 (file_name.stdout)
标准错误文件 (file_name.stderr)

 CodeToDesc

static std::string CodeToDesc(int code, const std::string &file_name)

该方法的作用是将状态码转换为描述信息

code:状态码,file_name:文件名  以下为状态码处理:

0: 编译运行成功。
-1: 提交的代码为空。
-2: 未知错误。
-3: 编译错误(从 file_name.compile_error 文件中读取错误信息)。
SIGABRT (6): 内存超过范围。
SIGXCPU (24): CPU 使用超时。
SIGFPE (8): 浮点数溢出。

 Start

static void Start(const std::string &in_json, std::string *out_json)

该方法:编译并运行用户提交的代码,返回运行结果
参数:in_json:输入的 JSON 字符串,包含用户代码、输入、CPU 时间限制和内存限制
out_json:输出的 JSON 字符串,包含状态码、描述信息、标准输出和标准错误

输入JSON格式:
{"code": "用户提交的代码","input": "用户输入","cpu_limit": "CPU 时间限制","mem_limit": "内存限制"
}输出JSON格式:
{"status": "状态码","reason": "描述信息","stdout": "标准输出","stderr": "标准错误"
}

解析输入 JSON,获取代码、输入、CPU 限制和内存限制。
检查代码是否为空,如果为空,设置状态码为 -1。
生成唯一的文件名,并将代码写入临时源文件。
调用 Compiler::Compile 编译代码:
如果编译失败,设置状态码为 -3。
调用 Runner::Run 运行编译后的程序:
如果运行失败,设置状态码为运行结果。
根据状态码生成描述信息。
如果运行成功,读取标准输出和标准错误文件的内容。
将结果写入输出 JSON。
(可选)清理临时文件 

所依赖的外部模块:

  • Compiler: 编译模块,负责将用户代码编译为可执行文件。

  • Runner: 运行模块,负责运行编译后的程序,并限制其 CPU 和内存使用。

  • ns_log: 日志模块,用于记录日志信息。

  • ns_util: 工具模块,提供文件、路径、时间等工具函数。

  • JsonCpp: 用于解析和生成 JSON 数据。

 3.2compile.hpp

Compiler类

Compile

static bool Compile(const std::string &file_name)

 使用 fork 创建子进程。
在子进程中:
打开编译错误文件(file_name.compile_error),用于存储编译错误信息。
使用 dup2 将标准错误输出重定向到编译错误文件。
使用 execlp 调用 g++ 编译器,将源文件(file_name.cpp)编译为可执行文件(file_name.exe)。
如果 execlp 失败,记录错误日志并退出。
在父进程中:
使用 waitpid 等待子进程结束。
检查是否生成了可执行文件(file_name.exe)。
如果生成成功,记录日志并返回 true;否则返回 false。

所依赖的外部模块:

  • ns_util: 工具模块,提供路径拼接和文件操作功能。

    • PathUtil::Src(file_name): 获取源文件路径(./temp/file_name.cpp)。

    • PathUtil::Exe(file_name): 获取可执行文件路径(./temp/file_name.exe)。

    • PathUtil::CompilerError(file_name): 获取编译错误文件路径(./temp/file_name.compile_error)。

    • FileUtil::IsFileExists(path): 检查文件是否存在。

  • ns_log: 日志模块,用于记录日志信息。

    • LOG(INFO): 记录信息日志。

    • LOG(WARNING): 记录警告日志。

    • LOG(ERROR): 记录错误日志

 3.3runner.hpp

Runner类

SetProcLimit接口

static void SetProcLimit(int _cpu_limit, int _mem_limit)

参数:_cpu_limit:CPU时间限制,_mem_limit:内存资源限制,设置进程的 CPU 和内存资源限制。

setrlimit 系统调用设置资源限制。RLIMIT_CPU: 限制 CPU 时间。RLIMIT_AS: 限制虚拟内存大小。

Run接口

运行编译后的程序,并限制其 CPU 和内存资源使用

static int Run(const std::string &file_name, int cpu_limit, int mem_limit)
  • > 0: 程序异常退出,返回值为收到的信号编号。

  • == 0: 程序正常运行完毕。

  • < 0: 内部错误(如文件打开失败或子进程创建失败)

  1. 获取可执行文件、标准输入、标准输出和标准错误的路径。

  2. 打开标准输入、标准输出和标准错误文件。

  3. 使用 fork 创建子进程。

  4. 在子进程中:

    • 使用 dup2 重定向标准输入、标准输出和标准错误。

    • 调用 SetProcLimit 设置资源限制。

    • 使用 execl 运行可执行程序。

    • 如果 execl 失败,记录错误日志并退出。

  5. 在父进程中:

    • 关闭文件描述符。

    • 使用 waitpid 等待子进程结束。

    • 获取子进程的退出状态,并返回状态码的低 7 位(信号编号)。

 依赖的外部模块

  • ns_util: 工具模块,提供路径拼接功能。

    • PathUtil::Exe(file_name): 获取可执行文件路径(./temp/file_name.exe)。

    • PathUtil::Stdin(file_name): 获取标准输入文件路径(./temp/file_name.stdin)。

    • PathUtil::Stdout(file_name): 获取标准输出文件路径(./temp/file_name.stdout)。

    • PathUtil::Stderr(file_name): 获取标准错误文件路径(./temp/file_name.stderr)。

  • ns_log: 日志模块,用于记录日志信息。

    • LOG(INFO): 记录信息日志。

    • LOG(ERROR): 记录错误日志。

 4.oj_server

4.1 oj_control.hpp

主要的功能:管理题目数据,渲染网面,负载均衡,调用编译和运行服务。

核心类

Machine:表示提供编译和运行服务的主机

LoadBlance:实现负载均衡

Control:核心业务逻辑处理器

 依赖模块

ns_model: 题目数据管理。

ns_view: HTML 渲染。

ns_log: 日志记录。

ns_util: 工具函数。

httplib: HTTP 客户端。

Machine类

IncLoad

void IncLoad()//增加主机负载,使用互斥锁保护负载变量,确保线程安全。

DecLoad

void DecLoad()//减少主机负载,使用互斥锁保护负载变量,确保线程安全。

ResetLoad

void ResetLoad()//重置主机的负载为0,使用互斥锁保护负载变量,确保线程安全

Load

uint64_t Load() //获取主机的当前负载,使用互斥锁保护负载变量,确保线程安全

LoadBlance类

LoadConf

bool LoadConf(const std::string &machine_conf)

 从配置文件中加载主机信息,参数:machine_conf:配置文件路径

读取配置文件,解析每台主机的 IP 和端口。初始化主机对象,并将其加入在线主机列表。

SmartChoice

bool SmartChoice(int *id, Machine **m)

参数:id 输出型参数返回选择的主机ID, m:输出参数,返回选择的主机的对象指针。
遍历在线主机列表,选择负载最低的主机

OfflineMachine

void OfflineMachine(int which)//将指定主机离线

which为要离线的主机ID

OnlineMachine

void OnlineMachine()//将所有离线主机全部上线

ShowMachine

void ShowMachines()//打印当前在线和离线主机列表(用于调试)。

Control类

核心业务逻辑控制器,负责管理题目数据、渲染网页、负载均衡以及调用编译和运行服务。

RecoveryMachine

void RecoveryMachine()//恢复离线主机为在线状态

AllQuestions

bool AllQuestions(string *html) //获取所有题目数据并渲染为网页。

html:输出参数,返回渲染后的HTML内容

从Model获取所有题目数据,使用View渲染题目列表为HTML

Question

bool Question(const string &number, string *html)//获取指定题目数据并渲染为网页

number: 题目编号。html: 输出参数,返回渲染后的 HTML 内容。

Judge

void Judge(const std::string &number, const std::string in_json, std::string *out_json)

参数:number:题目编号,in_json:输入的JSON数据,out_json:输出的JSON数据,包含评测数据

从 Model 获取指定题目的详细信息。
解析输入 JSON,拼接用户代码和测试用例代码。
使用负载均衡选择主机,发起 HTTP 请求调用编译和运行服务。
将评测结果写入输出 JSON。

 所依赖的外部模块

  • ns_model: 提供题目数据管理功能。

    • GetAllQuestions: 获取所有题目数据。

    • GetOneQuestion: 获取指定题目数据。

  • ns_view: 提供 HTML 渲染功能。

    • AllExpandHtml: 渲染题目列表为 HTML。

    • OneExpandHtml: 渲染题目详情为 HTML。

  • ns_log: 提供日志记录功能。

  • ns_util: 提供工具函数(如字符串分割)。

  • httplib: 提供 HTTP 客户端功能,用于调用编译和运行服务。

 4.2 oj_model

Question结构体

变量名类型描述
numberstd::string题目编号,唯一标识
titlestd::string题目标题
starstd::string题目难度(简单、中等、困难)
descstd::string题目描述
headerstd::string题目预设代码(用户编辑器的初始代码)
tailstd::string题目测试用例(与 header 拼接形成完整代码)
cpu_limitint题目时间限制(单位:秒)
mem_limitint题目空间限制(单位:KB)

Model类

QueryMysql

bool QueryMySql(const std::string &sql, vector<Question> *out)//执行 SQL 查询,并将结果存储到 out 中。

sql:要执行的SQL查询语句,out:输出参数,存储查询结果的Question向量

GetAllQuestions

bool GetAllQuestions(vector<Question> *out)

构造 SQL 查询语句:SELECT * FROM oj_questions

调用 QueryMySql 执行查询

GetOneQuestion

bool GetOneQuestion(const std::string &number, Question *q)

构造 SQL 查询语句:SELECT * FROM oj_questions WHERE number=<number>。
调用 QueryMySql 执行查询。
如果查询结果中有且仅有一条记录,将其赋值给 q。

依赖的外部模块

  • ns_log: 提供日志记录功能。

    • LOG(INFO): 记录信息日志。

    • LOG(WARNING): 记录警告日志。

    • LOG(FATAL): 记录致命错误日志。

  • ns_util: 提供工具函数。

  • mysql.h: MySQL C API 头文件,用于连接和操作 MySQL 数据库。

// 以下是硬编码的常量const std::string oj_questions = "oj_questions"; // 数据库表名const std::string host = "127.0.0.1";           // MySQL 服务器地址const std::string user = "oj_client";           // MySQL 用户名const std::string passwd = "123456";            // MySQL 密码const std::string db = "oj";                    // 数据库名称const int port = 3306;                          // MySQL 服务器端口号

 4.3 oj_view

AllExpandHtml

void AllExpandHtml(const vector<struct Question> &questions, std::string *html)

question:题目列表,包含所有题目的详细信息,html:输出参数,存储渲染后的html内容。

  1. 构造模板文件路径:./template_html/all_questions.html

  2. 创建 ctemplate::TemplateDictionary 对象 root,用于存储模板数据。

  3. 遍历题目列表,将每个题目的编号、标题和难度添加到模板数据中。

  4. 加载模板文件。

  5. 使用模板数据渲染 HTML 页面,并将结果存储到 html 中。

 OneExpandHtml

q:单个题目的详细信息,html:输出参数存储渲染后的html内容

  1. 构造模板文件路径:./template_html/one_question.html

  2. 创建 ctemplate::TemplateDictionary 对象 root,用于存储模板数据。

  3. 将题目的编号、标题、难度、描述和预设代码添加到模板数据中。

  4. 加载模板文件。

  5. 使用模板数据渲染 HTML 页面,并将结果存储到 html 中。

 所依赖的外部模块

ctemplate: 用于 HTML 模板渲染。

ctemplate::TemplateDictionary: 存储模板数据。
ctemplate::Template: 加载和渲染模板文件。
ns_model: 提供题目数据管理功能。
Question: 题目数据结构,包含编号、标题、难度、描述、预设代码等信息。

 

相关文章:

【项目】负载均衡式在线OJ

负载均衡式在线OJ 目录 负载均衡式在线OJ 1.项目介绍&#xff1a; 2.comm 2.1 log.hpp 日志等级 开放式日志 时间戳工具 2.2 util.hpp TimeUtil类 PathUtil类 FileUtil类 StringUtil类 3.Compile_server 3.1compile_run.hpp RemoveTempFile CodeToDesc Start 3.…...

Android启动速度优化

Android启动速度优化 一、应用启动基础知识 1.1 启动类型 Android应用的启动类型主要分为三种: 冷启动(Cold Start):应用进程不存在,系统需要创建新的进程,加载并启动应用。这是最耗时的启动方式。 温启动(Warm Start):应用进程存在,但Activity可能被销毁,需要重新创…...

python爬虫碰到IP被封的情况,如何解决?

在数据抓取和爬虫开发的实践中&#xff0c;Python作为一种功能强大且易于上手的编程语言&#xff0c;被广泛应用于网络数据的采集。然而&#xff0c;随着网络环境的日益复杂&#xff0c;爬虫活动也面临着越来越多的挑战&#xff0c;其中IP被封便是常见且棘手的问题。IP被封不仅…...

Web网页制作(静态网页):千年之恋

一、是用的PyCharm来写的代码 二、代码中所用到的知识点&#xff08;无 js&#xff09; 这段HTML代码展示了一个简单的注册页面&#xff0c;包含了多个HTML元素和CSS样式的应用。 这段HTML代码展示了一个典型的注册页面&#xff0c;包含了常见的HTML元素和表单控件。通过CSS样…...

mac安装mysql之后报错zsh: command not found: mysql !

在Mac上安装MySQL后&#xff0c;如果终端中找不到mysql命令&#xff0c;通常是 因为MySQL的命令行工具&#xff08;如mysql客户端&#xff09;没有被正确地添加到你的环境变量中。 检查 MySQL 是否已安装 ps -ef|grep mysql查看到路径在 /usr/local/mysql/bin 查看 .bash_pro…...

Spring Boot 启动失败:Failed to start bean ‘documentationPluginsBootstrapper’ 解决方案

文章目录 1. 问题描述 &#x1f3af;2. 可能原因分析 &#x1f50d;原因 1&#xff1a;SpringFox 版本与 Spring Boot 版本不兼容 ❌✅ 解决方案&#xff1a;添加兼容性配置&#xff08;首选&#xff01;&#xff01;&#xff01;&#xff01;&#xff09; 原因 2&#xff1a;S…...

Python Cookbook-3.16 查看汇率

任务 想周期性地(用 crontab 或者 Windows计划任务来运行某 Python 脚本)从 Web 获取数据&#xff0c;监视某两种货币之间的兑换比例&#xff0c;并在两者之间的汇率达到某个值时发送提醒邮件。 解决方案 这个任务和一系列的从 Web 获取数据的监控任务很类似&#xff0c;它们…...

Manus(一种AI代理或自动化工具)与DeepSeek(一种强大的语言模型或AI能力)结合使用任务自动化和智能决策

一、Manus与DeepSeek差异 十分好奇DeepSeek和Manus究竟谁更厉害些&#xff0c;DeepSeek是知识型大脑&#xff0c;Manus则是全能型执行者。即DeepSeek专注于语言处理、知识整合与专业文本生成。其核心优势在于海量参数支持的深度学习和知识推理能力&#xff0c;例如撰写论文、润…...

Redis存数据就像存钱:RDB定期存款 vs AOF实时记账

Redis持久化 ◆ 核心概念1. ◆ 持久化全景图2. ◆ 生产环境黄金法则 ◆ RDB深度优化1. ◆ 生产配置精要2. ◆ 高级触发场景3. ◆ 故障应急方案 ◆ AOF深度解析1. ◆ 7.0版本革命性改进2. ◆ 同步策略深度测试3. ◆ 重写过程优化 ◆ 混合持久化实战1. ◆ 配置示例2. ◆ 数据恢复…...

【从零开始学习计算机科学】编译原理(一)编译过程概述

【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...

第十八:go 并发 goroutine

channel 可以让多个goroutine 之间实现通信 Add方法调用时机&#xff1a;必须在goroutine 启动之前调用Add方法来增加计数器的值。 如果在goroutine已经启动之后再调用Add&#xff0c;可能会导致Wait方法提前返回&#xff0c;因为计数器没有正确反映正在运行的goroutine的数量…...

基于QGIS的二次开发(四):矢量编辑与属性表操作

一、实验目的 本次实验续接上一次的实验内容&#xff0c;旨在通过设计与开发地理信息系统的过程&#xff0c;加深学生对地理信息系统的理解&#xff0c;并掌握相关的设计与开发技能&#xff0c;包括熟悉地理信息系统的设计与开发流程&#xff0c;加强对 MVC 软件设计模式的理解…...

AI日报 - 2025年3月13日

&#x1f31f; 今日概览&#xff08;60秒速览&#xff09; ▎&#x1f916; AGI突破 | Reka开源21B参数推理模型Flash 3&#xff0c;推出企业智能平台Nexus &#x1f52c; 模型采用RLOO方法结合模型与规则基础奖励&#xff0c;实现高效推理 ▎&#x1f4bc; 商业动向 | Waymo在…...

lua C语言api学习1 编译第一个程序

本文开始进行lua C语言api的学习 1 简介 lua语言与C语言使用还是很紧密,以前我只是学习lua语言比较多,C语言api部分了解比较少,最近在学习tcc编译器的使用进一步学习一下lua C语言api的使用。 2 配置编译环境 首先需配置好tcc编译器环境[参考],再配置好lua源码路径[参考],新…...

【物联网-WIFI】

物联网-WIFI ■ ESP32-C3-模块简介■ ESP32-C3-■ ESP32-C3-■ WIFI-模组■ WIFI-■ WIFI- ■ ESP32-C3-模块简介 ■ ESP32-C3- ■ ESP32-C3- ■ WIFI-模组 ■ WIFI- ■ WIFI-...

在MATLAB中实现PID控制仿真

在MATLAB中实现PID控制仿真可以通过代码编程或Simulink图形化建模两种方式完成。以下是两种方法的详细操作步骤和示例&#xff1a; 方法1&#xff1a;使用MATLAB脚本编程&#xff08;基于控制系统工具箱&#xff09; 步骤1&#xff1a;定义被控对象的数学模型 假设被控对象是…...

C#实现本地Deepseek模型及其他模型的对话v1.4

前言 系 统&#xff1a;Window11 开发工具&#xff1a;Visual Studio 2022 相关技术&#xff1a;C# 、WPF .Net 8.0 1、C#实现本地AI聊天功能 WPFOllamaSharpe实现本地聊天功能,可以选择使用Deepseek 及其他模型。 新增根据聊天记录回复的功能。 优化了部分ViewModel&#xff…...

用sphinx-doc整理文档#2

上一篇博客&#xff1a;用sphinx-doc整理文档 回头看&#xff0c;上一篇博客已经是18年的事情了。最近我又开始维护起18年的项目了。最近策划同事提了一些需求。我又改进了一波&#xff0c;所以有本文。 sphinx支持导出pdf sphinx本身是支持导出pdf的&#xff0c;命令如下&am…...

DBeaver部分操作指南(数据库连接,构造ERD图,格式化SQL)

详细步骤指导如何使用DBeaver来连接到数据库&#xff1a; 步骤 1: 下载并安装 DBeaver 如果还没有安装DBeaver&#xff0c;请访问DBeaver官网下载适合操作系统的版本&#xff0c;并按照指示完成安装。 步骤 2: 启动 DBeaver 安装完成后&#xff0c;启动DBeaver应用程序。 …...

十种处理权重矩阵的方法及数学公式

1. 权重归一化&#xff08;Weight Normalization&#xff09; 目的&#xff1a;通过分离权重向量的范数和方向来加速训练。公式&#xff1a;对于权重向量 w \mathbf{w} w&#xff0c;归一化后的权重 w ′ \mathbf{w} w′ 为&#xff1a; w ′ w ∥ w ∥ \mathbf{w} \frac{…...

姚安娜新剧瘦了一圈,《仁心俱乐部》急诊医生顾诗宜在线上岗

《仁心俱乐部》在芒果 TV 播出&#xff0c;湖南卫视金鹰独播剧场也随之播出&#xff0c;这一剧集受到了不少观众的关注。姚安娜在剧中饰演的急诊科医生顾诗宜&#xff0c;她为患者检查身体时动作娴熟&#xff0c;与患者沟通时展现出的耐心和专注&#xff0c;都展现出很高的专业…...

postgresql源码安装

步骤 1: 安装依赖 在开始之前&#xff0c;请确保您的系统上安装了编译 PostgreSQL 所需的依赖包。使用以下命令安装必要的软件包&#xff1a; 对于 Debian/Ubuntu 系统&#xff1a; sudo apt update sudo apt install build-essential libreadline-dev zlib1g-dev flex biso…...

【51单片机】程序实验15.DS18B20温度传感器

主要参考学习资料&#xff1a;B站【普中官方】51单片机手把手教学视频 开发资料下载链接&#xff1a;http://www.prechin.cn/gongsixinwen/208.html 单片机套装&#xff1a;普中STC51单片机开发板A4标准版套餐7 目录 DS18B20介绍主要特性内部结构控制时序初始化时序写时序读时序…...

Java 集合框架:数据管理的强大工具

Java集合框架&#xff1a;数据管理的强大工具 目录 Java集合框架&#xff1a;数据管理的强大工具引言一、Set集合1. 定义与特点2. 常用实现类 - HashSet创建方式常用方法遍历方式 二、Map集合1. 定义与特点2. 常用实现类 - HashMap创建方式常用方法遍历方式 三、List集合1. 定义…...

AIM-T500绝缘监测仪:实时监测,确保IT系统绝缘安全-安科瑞 蒋静

在现代工业生产中&#xff0c;电力系统的稳定性和安全性至关重要。电力系统的绝缘状况直接关系到设备的正常运行和人员的安全。为了确保IT配电系统&#xff08;不接地系统&#xff09;的绝缘状况始终处于好的状态&#xff0c;安科瑞电气股份有限公司推出了AIM-T500绝缘监测仪&a…...

css3-学习

css 特性 选择器 基础选择器 标签选择器 ID 选择器 类选择器 CSS 的优先级是什么&#xff1f; !important > 内联样式(style“”) > ID 选择器 > 类选择器 属性选择器 伪类 > 标签选择器 伪元素选择器。 层级选择器 foo bar 后代选择器&#xff0c;元素的…...

neo4j图数据库

neo4j图数据库 学习neo4j图数据库的使用 文章目录 neo4j图数据库[toc]1-核心知识点2-思路整理3-参考网址4-上手实操1-安装neo4j-docker2-要学习CQL语句3-解决cmake问题1-可能的原因及解决办法1. cmake 未正确安装或者版本不兼容2. 依赖库缺失3. 环境变量配置问题4. 网络问题 2-…...

go下的Prototype学习笔记

本博文讲解prototype的学习笔记&#xff0c;内容包含了syntax、option go_package、message、service进行讲解&#xff0c;举例了常见写法。 文章目录 1.syntax 声明语法版本2.package 给当前的proto分配包名称3.option4.message4.1 切片数组4.2 map4.3 类型嵌套 5. 消息定义 …...

[高阶技术了解]WebRPC详解

“webrpc详解”&#xff0c;我需要根据我搜索到的资料来回答这个问题。首先&#xff0c;得弄清楚webrpc到底是什么。根据&#xff0c;Webrpc是一个模式驱动的后端服务开发工具&#xff0c;允许通过RIDL或JSON模式文件生成代码&#xff0c;支持多种语言如Go、TypeScript等。它类…...

地基注解@Controller和@RestController区别

前记&#xff1a;基础啊&#xff0c;区别点重点理解&#xff1b; 在Spring和Spring Boot框架中&#xff0c;Controller和RestController都用于处理HTTP请求&#xff0c;但它们在设计目的和用法上有显著区别。以下是它们的核心区别及示例说明&#xff1a; ​1. 核心区别 特性C…...

UI自动化:seldom框架和Selenium

以下是关于 seldom框架 和 Selenium 的对比解析及结合使用的详细说明&#xff0c;帮助理解二者的定位、功能差异和应用场景&#xff1a; 1. 核心定位 工具定位Selenium浏览器自动化工具库&#xff0c;提供直接操控浏览器的底层API&#xff08;如点击、输入、获取元素等&#x…...

机器学习项目实战——信用评分与贷款风险评估(主页有源码)

✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连 ✨ ✨个人主页欢迎您的访问 ✨期待您的三连✨ ​ ​​​ 1. 领域介绍 信用评分与贷款风险评估是金融领域中的一个重要应用场景。随着金融科技的快速发展&#xff0c;银行、信用卡公司、P2P…...

使用 OptiSLang 和 MotorCAD 构建一个强大的电机优化元模型

介绍 在本文中&#xff0c;我们将检查这些敏感性分析的结果&#xff0c;并构建一个健壮的元模型&#xff0c;作为优化过程的基础。 本文涵盖&#xff1a; 解释敏感性分析结果了解元模型及其在优化中的重要性构建和完善最佳预后模型 &#xff08;MOP&#xff09;使用预后系数…...

【科研绘图系列】python绘制分组点图(grouped dot plot)

禁止商业或二改转载,仅供自学使用,侵权必究,如需截取部分内容请后台联系作者! 文章目录 介绍加载R包数据下载导入数据函数`generateRectBoxDF` 函数主要作用参数解释逻辑流程`nmfDotPlot` 函数主要作用参数解释逻辑流程画图1画图2画图3画图4介绍 【科研绘图系列】python绘制…...

【Android】adb shell基本使用教程

adb shell 是 Android Debug Bridge (ADB) 工具中的一个命令&#xff0c;用于在连接的 Android 设备或模拟器上执行 shell 命令。通过 adb shell&#xff0c;你可以直接与设备的 Linux 内核交互&#xff0c;执行各种操作。 基本用法 启动 adb shell&#xff1a; 在终端或命令提…...

257. 二叉树的所有路径(递归+回溯)

257. 二叉树的所有路径 力扣题目链接(opens new window) 给定一个二叉树&#xff0c;返回所有从根节点到叶子节点的路径。 说明: 叶子节点是指没有子节点的节点。 示例: 思路&#xff1a;在叶子节点收割结果&#xff0c;如果不是叶子节点&#xff0c;则依次处理左右子树&a…...

C++和标准库速成(一)——HelloWorld和名称空间

目录 1. 引言1. 简单小程序"Hello World"1.1 模块导入1.2 预处理指令1.2.1 简介1.2.2 常用的预处理指令 1.3 main()函数1.4 输入输出流1.4.1 输出流1.4.2 转义字符1.4.3 输入流 2. 名称空间2.1 定义名称空间2.2 using指令2.3 嵌套名称空间2.4 名称空间别名 参考 1. 引…...

OpenHarmony 5.0 MP4封装的H265视频播放失败的解决方案

问题现象 OpenHarmony 5.0版本使用AVPlayer播放MP4封装格式的H.265(HEVC)编码格式的视频时解码失败导致播放失败 问题原因 OpenHarmony 5.0版本AVPlayer播放器使用histreamer引擎&#xff0c;因为 libav_codec_hevc_parser.z.so 动态库未开源导致从MP4封装中分离的HVCC格式的…...

索引-最左匹配

在数据库索引中&#xff0c;最左匹配原则确实在遇到某些范围查询时会停止向右匹配&#xff0c;但对于 >、<、BETWEEN 和前缀匹配的 LIKE&#xff0c;索引匹配可以继续使用后续列。以下是详细分析&#xff1a; 1. 最左匹配原则的核心规则 最左匹配原则要求查询条件从复合…...

感觉自己邮电部诗人

中心扩散 第二次做这道题&#xff0c;求回文子串最大长度的时候&#xff0c;计算写成了j-i1&#xff0c;看了15分钟才看发现哪里出了问题&#xff0c;感觉自己邮电部诗人&#xff0c;望周知。...

Java代理方式的详细介绍,包括代码示例、注释说明及其差异对比表格

Java代理方式 Java中的代理模式是一种结构型设计模式&#xff0c;用于在不修改原始类的情况下增强其功能。Java支持两种代理方式&#xff1a; 静态代理动态代理 JDK动态代理CGLIB动态代理 1. 静态代理 静态代理通过手动编写代理类实现&#xff0c;代理类和目标类实现相同的…...

接口对外安全交互新姿势

文章目录 1.前言2.姿势2.1 AES2.2 body参数签名及验签2.3使用sm2 加ip白名单 3.总结 1.前言 由于这久做了一个乐企数电开票的项目&#xff0c;已经上线了&#xff0c;真的是一言难尽&#xff0c;再回首已经是轻舟已过万重山&#xff0c;接口通过外网暴露给业务方使用&#xff0…...

Docker基础篇——Ubuntu下Docker安装

大家好我是木木&#xff0c;在当今快速发展的云计算与云原生时代&#xff0c;容器化技术蓬勃兴起&#xff0c;Docker 作为实现容器化的主流工具之一&#xff0c;为开发者和运维人员带来了极大的便捷 。下面我们一起进行Docker安装。 Docker的官方Ubuntu安装文档&#xff0c;如…...

《深度解析DeepSeek-M8:量子经典融合,重塑计算能效格局》

在科技飞速发展的今天&#xff0c;量子计算与经典算法的融合成为了前沿领域的焦点。DeepSeek-M8的“量子神经网络混合架构”&#xff0c;宛如一把钥匙&#xff0c;开启了经典算法与量子计算协同推理的全新大门&#xff0c;为诸多复杂问题的解决提供了前所未有的思路。 量子计算…...

关于C/C++语言的初学者在哪刷题,怎么刷题

引言&#xff1a; 这篇博客主要是针对初学者关于怎么在网上刷题&#xff0c;以及在哪里刷题。 1.介绍平台&#xff08;在哪刷题&#xff09;&#xff1a; 1.牛客牛客网https://www.nowcoder.com/ &#xff1a;有许多面试题&#xff0c;也有许多供学习者练习的题 2.洛谷洛谷 …...

【redis】string类型相关操作:SET、GET、MSET、MGET、SETNX、SETEX、PSETEX

文章目录 二进制存储编码转换SET 和 GETSETGET MSET 和 MGETSETNX、SETEX 和 PSETEX Redis 所有的 key 都是字符串&#xff0c;value 的类型是存在差异的 二进制存储 Redis 中的字符串&#xff0c;直接就是按照二进制数据的方式存储的 不仅仅可以存储文本数据&#xff0c;还可…...

el-table中嵌套了el-form-item 导致的内容不垂直居中展示的问题

el-table中嵌套了el-form-item 导致的内容不垂直居中展示的问题 这个问题原先我一直没有找到问题的关键点&#xff0c;后来看了一篇文章得知由于el-form-item的margin导致的 下面的css类告诉我们。正常的表单校验margin就是20px&#xff0c;在el-table中的只有是校验失败的才会…...

LVCMOS(Low Voltage Complementary Metal-Oxide-Semiconductor)电平详解

一、LVCMOS电平的定义与核心特性 LVCMOS&#xff08;低压互补金属氧化物半导体&#xff09;是 CMOS技术的低电压版本&#xff0c;专为现代低功耗、高集成度芯片设计&#xff0c;支持 1.2V、1.8V、2.5V、3.3V 等多种电压等级。其通过优化晶体管结构和供电电压&#xff0c;显著降…...

计算机操作系统(一) 什么是操作系统

计算机操作系统&#xff08;一&#xff09; 什么是操作系统 前言一、什么是操作系统二、操作系统的作用三、推动操作系统发展的主要动力总结&#xff08;核心概念速记&#xff09;&#xff1a; 前言 当你打开电脑、点击应用、播放音乐时&#xff0c;是谁在背后默默协调这一切&…...

《用 python、MySQL 和 Chart.js 打造炫酷数据看板》实战案例笔记

今天&#xff0c;我们要构建一个数据看板系统。在这个过程中&#xff0c;我们会利用 MySQL 来存储数据&#xff0c;使用 Python 搭建后端 API&#xff0c;还会借助 Chart.js 在前端呈现各式各样的图表。 整个流程涵盖多个环节&#xff0c;首先要进行数据库表的设计&#xff0c…...