【项目】负载均衡式在线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: 内部错误(如文件打开失败或子进程创建失败)
获取可执行文件、标准输入、标准输出和标准错误的路径。
打开标准输入、标准输出和标准错误文件。
使用
fork创建子进程。在子进程中:
使用
dup2重定向标准输入、标准输出和标准错误。调用
SetProcLimit设置资源限制。使用
execl运行可执行程序。如果
execl失败,记录错误日志并退出。在父进程中:
关闭文件描述符。
使用
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结构体
| 变量名 | 类型 | 描述 |
| number | std::string | 题目编号,唯一标识 |
| title | std::string | 题目标题 |
| star | std::string | 题目难度(简单、中等、困难) |
| desc | std::string | 题目描述 |
| header | std::string | 题目预设代码(用户编辑器的初始代码) |
| tail | std::string | 题目测试用例(与 header 拼接形成完整代码) |
| cpu_limit | int | 题目时间限制(单位:秒) |
| mem_limit | int | 题目空间限制(单位: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内容。
构造模板文件路径:
./template_html/all_questions.html。创建
ctemplate::TemplateDictionary对象root,用于存储模板数据。遍历题目列表,将每个题目的编号、标题和难度添加到模板数据中。
加载模板文件。
使用模板数据渲染 HTML 页面,并将结果存储到
html中。
OneExpandHtml
q:单个题目的详细信息,html:输出参数存储渲染后的html内容
构造模板文件路径:
./template_html/one_question.html。创建
ctemplate::TemplateDictionary对象root,用于存储模板数据。将题目的编号、标题、难度、描述和预设代码添加到模板数据中。
加载模板文件。
使用模板数据渲染 HTML 页面,并将结果存储到
html中。
所依赖的外部模块
ctemplate: 用于 HTML 模板渲染。
ctemplate::TemplateDictionary: 存储模板数据。
ctemplate::Template: 加载和渲染模板文件。
ns_model: 提供题目数据管理功能。
Question: 题目数据结构,包含编号、标题、难度、描述、预设代码等信息。
相关文章:
【项目】负载均衡式在线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.…...
前端发布缓存导致白屏解决方案
解决发布H5后因为本地缓存白屏方案 一、 核心配置优化(前提是访问网站的请求能抵达服务器) 方案一:前端项目设置全局不缓存方案 运行逻辑:在H5服务器配置中增加Cache-Control: no-cache或max-age0响应头,禁用静态资…...
大模型开源的工具包有哪些特殊符号可以使用;SEP 是什么
大模型开源的工具包有哪些特殊符号可以使用 目录 大模型开源的工具包有哪些特殊符号可以使用自定义特殊token:special_tokens=True一、**对话轮次分隔符(必选)**二、**系统提示标记(提升指令理解)**三、**中文特色分隔符(贴合书写习惯)**四、**开源模型专属符号(按文档…...
混沌理论与混沌映射——算法改进初始化创新点之一
混沌理论与混沌映射 混沌理论研究混沌系统的动力学,其特征是非线性和对初始条件的极端敏感性。即使在这些条件下的微小变化也可能导致系统结果的显著变化。尽管看起来是随机的,混沌系统可以在不依赖随机性的情况下表现出不规则的行为,因为确…...
19874并查集
19874并查集 ⭐️难度:中等 🌟考点:并查集、数据结构 📖 📚 import java.util.*;public class Main {static int N 100010;static int[] a new int[N];static int[] p new int[N];static int n;static int m;st…...
macOS 安装配置 iTerm2 记录
都说 macOS 里替换终端最好的就是 iTerm2 ,这玩意儿还是开源的,所以就也根风学习一下,但全是英文的挺麻烦,所以这里记录一下自己的设置,以最简单的安装及设置为主,想要更酷炫、更好看的还请自己百度吧&…...
LLM最新的模型微调技术有哪些
LLM 最新的模型微调技术有哪些 目录 LLM 最新的模型微调技术有哪些1. QLoRA(Quantized Low-Rank Adaptation)2. P-Tuning v23. LoRA++(增强版 LoRA)4. AdaLoRA(Adaptive LoRA)5. BitFit(仅微调偏置)1. QLoRA(Quantized Low-Rank Adaptation) 原理:QLoRA 结合了低秩自…...
Jmeter下载安装配置及使用
1、下载 官网地址:Apache JMeter - Download Apache JMeter 2、配置环境变量 ①找到环境变量,两种方法 法一:我的电脑→右键菜单→属性→高级系统设置→环境变量 法二:直接搜索环境变量 ②新建两个系统变量 1.变量名&#x…...
简单易懂Modbus Tcp和Rtu的异同点
关键说明 无需修改业务逻辑:同一套读写代码可同时支持TCP和RTU,仅需调整底层通信接口。 工具兼容性:调试工具(如Modbus Poll)可同时解析两种协议,仅需切换传输模式。 系统集成优势:混合网络下可…...
try catch的使用
try catch的使用 在 Java 中,try-catch 语句用于异常处理。异常处理可以帮助我们在程序出现错误时,不会导致程序崩溃,而是采取一定的措施来处理错误。try-catch 语句是用于捕获并处理异常的机制。 基本语法 try {// 可能会抛出异常的代码块…...
【从零开始学习计算机科学】编译原理(一)编译过程概述
【从零开始学习计算机科学】编译原理(一)编译过程概述 绪论编译过程概述词法分析语法分析代码优化代码生成其他功能编译器的前端和后端绪论 什么叫编译程序?为什么我们需要编译程序?编译程序就是一个程序,将便于人编写、阅读、维护的高级计算机语言所写作的源代码程序,翻…...
PCL 点云AABB包围盒(二)
文章目录 一、简介二、实现代码三、实现效果参考资料一、简介 包围盒是一种求解离散点集最优包围空间的算法,基本思想是用体积稍大且特性简单的几何体(称为包围盒)来近似地代替复杂的几何对象。(来源于百度)常用的求解包围盒的算法主要有AABB和OOB算法,其中AABB的算法思想…...
【算法day8】 Z 字形变换 -O(n)算法思路整理
Z 字形变换,算法思路整理 https://leetcode.cn/problems/zigzag-conversion/description/ 将一个给定字符串 s 根据给定的行数 numRows ,以从上往下、从左到右进行 Z 字形排列。 比如输入字符串为 “PAYPALISHIRING” 行数为 3 时,排列如下…...
L3-1 夺宝大赛
输入样例 1: 5 7 1 1 1 1 1 0 1 1 1 1 1 1 0 0 1 1 0 2 1 1 1 1 1 0 0 1 1 1 1 1 1 1 1 1 1 7 1 5 7 1 1 1 5 5 3 1 3 5 1 4输出样例 1: 7 6样例 1 说明: 七支队伍到达大本营的时间顺次为:7、不可能、5、3、3、5、6,…...
Matlab:矩阵运算篇——矩阵
目录 1.定义 实例——创建矩阵 实例——创建复数矩阵 2.矩阵的生成 实例——M文件矩阵 2.利用文本创建 实例——创建生活用品矩阵 3.创建特殊矩阵 实例——生成特殊矩阵 4.矩阵元素的运算 1.矩阵元素的修改 实例——新矩阵的生成 2.矩阵的变维 实例——矩阵维度修…...
泛微ecode的页面开发发送请求参数携带集合
1.在开发过程中我们难免遇见会存在需要将集合传递到后端的情况,那么这里就有一些如下的注意事项,如以下代码: // 新增action.boundasync addQuestion(formData) {var theList this.questionAnswerList;var questionAnswerListArray new Ar…...
【结构光相机的精度极限】
1. 光源波长((\lambda)) 光源波长是决定结构光相机精度极限的核心因素之一。根据光学衍射极限理论,光的波长越短,能够分辨的细节越小,精度越高。 理论依据: 根据瑞利判据(Rayleigh Criterion&…...
Javaweb后端全局异常处理器
类名随便定义 这是异常处理的方法exceptionhandler responsebody作用,方法的响应值返回给前端,如果返回的是集合对象,会把集合对象转为json,再给前端响应返回...
SpringBoot缓存抽象:@Cacheable与缓存管理器配置
文章目录 引言一、SpringBoot缓存抽象概述二、Cacheable注解详解2.1 Cacheable的关键属性 三、缓存管理器配置四、自定义键生成策略五、缓存同步与失效策略六、SpringBoot缓存最佳实践总结 引言 缓存是提升应用性能的关键技术,SpringBoot提供了强大的缓存抽象层&am…...
下载文件,文件名乱码问题
C# .net framework 4.8 mvc 项目,做一个文件下载功能。 原项目是前端使用razor引擎方式做页面渲染的。 该项目原来就有一个模块是可供文件下载的,且文件名是中文。 但是我现在新增的这个模块,领导要求用js写,觉得razor太笨重。 …...
深入理解Linux进程管理:从基础到高级操作指南
1. 进程的定义、组成和环境 什么是进程? 想象你的电脑是一个大工厂,进程就是工厂里正在运行的机器。每个机器(进程)都有自己的任务,比如一台机器负责打印文件,另一台负责播放音乐。 进程的组成࿱…...
DOM与CSS:网页设计的核心力量
DOM与CSS:网页设计的核心力量 引言 在网页设计中,DOM(文档对象模型)与CSS(层叠样式表)是两个不可或缺的组成部分。它们共同构成了现代网页的骨架与外衣。本文将深入探讨DOM与CSS的关系、作用以及如何有效地运用它们来提升网页设计质量。 DOM:网页内容的结构化表示 什…...
深入解析pnpm与npm:颠覆传统包管理的技术革命与应用实践
深入解析pnpm与npm:颠覆传统包管理的技术革命与应用实践 引言:被node_modules支配的恐惧 "你的node_modules有多大?"这个灵魂拷问总能引发开发者会心一笑。当项目规模达到500MB时,npm install需要喝三杯咖啡的时间&am…...
OpenSSL 的主要功能及其示例命令
OpenSSL 是一个功能强大的开源工具包,用于处理各种与加密相关的任务,包括生成密钥、创建证书、加密解密数据、验证证书等。以下是 OpenSSL 的主要功能及其示例命令。 1.生成密钥 1.1 生成 RSA 私钥 openssl genrsa -out private_key.pem 2048• 说明&a…...
江科大51单片机笔记【11】AT24C02(I2C总线)
一、存储器 1.介绍 RAM的特点是存储速度特别快,但是掉电会丢失;ROM的特点是存储速度特别慢,但是掉电不会丢失 SRAM是所有存储器最快的,一般用于电脑的CPU高速缓存,容量相对较少,成本较高;DRAM…...
html css 笔记
01_浏览器相关知识 五大主流浏览器: Chrome Safari IE Firefox Opera (拥有自己的内核) 四大内核: webkit Trident Gecko blink. 02_网页相关知识 构成 网址 网站 网页 网页标准: 结构 表现 行为 分别对应 HTML CSS JavaScript 03_HTML简介 H…...
【一句话经验】ubuntu vi/vim 模式自动设置为paste
从centos过来,发现ubutun有些地方不习惯,尤其是vi的粘贴,默认自动进去了代码模式,导致每次粘贴必须得set paste,否则会出现问题。 解决办法非常简单,按照下面命令执行即可: cd ~ echo "…...
外层元素旋转,其包括在内的子元素一并旋转(不改变旋转中心),单元测试
思路:外层旋转后坐标,元素旋转后坐标,计算偏移坐标 <template><div class"outbox"><label>角度: <input v-model.number"rotate" type"number" /></label><br><div c…...
Docker容器安装软件(完整版)
文章目录 一、安装Docker1.1 docker 相关的命令1.2 配置镜像加速 二. 安装es2.1 创建网络2.2 拉取镜像2.3 创建挂载点目录2.4 部署单点es,创建es容器2.5 编写elasticsearch.yml2.6 重启es容器2.7 测试Elasticsearch是否安装成功 三. 基于Docker安装Kibana3.1 拉取镜…...
「 机器人 」扑翼飞行器通过总气动力控制四自由度运动方法
一、前言 在扑翼飞行中,总气动力(Total Aerodynamic Force)是指扑翼在运动过程中受到的所有空气动力作用的合力。它是由以下两种主要力的合成结果: 1. 升力(Lift, ):垂直于空气流方向的力,用于支持飞行器(或生物)的重量。 2. 阻力(Drag, ):平行于空气流方向的力,…...
