物联网网关Web服务器--CGI开发实例BMI计算
本例子通一个计算体重指数的程序来演示Web服务器CGI开发。
硬件环境:飞腾派开发板(国产E2000处理器)
软件环境:飞腾派OS(Phytium Pi OS)
硬件平台参考另一篇博客:国产化ARM平台-飞腾派开发板硬件与系统
lighttpd服务器部署参考另一篇博客:物联网网关Web服务器--lighttpd服务器部署与应用测试
1、部署与运行效果
//启动服务器
user@phytiumpi:/var/www$ sudo service lighttpd start//服务器根目录/var/www部署如下目录与文件
user@phytiumpi:/var/www$ tree
.
`-- html|-- bmi.png|-- bmi_index.png|-- cgi-bin| `-- bmi.cgi`-- index.html2 directories, 4 files//文件权限如下
user@phytiumpi:/var/www$ ls -lh html/*
-rw-r--r-- 1 root root 36K Jan 16 11:07 html/bmi.png
-rw-r--r-- 1 root root 13K Jan 16 14:08 html/bmi_index.png
-rw-r--r-- 1 root root 688 Jan 16 11:07 html/index.htmlhtml/cgi-bin:
total 16K
-rwxr-xr-x 1 root root 15K Jan 16 13:51 bmi.cgi//bmi.cgi文件类型
user@phytiumpi:/var/www$ file html/cgi-bin/bmi.cgi
html/cgi-bin/bmi.cgi: ELF 64-bit LSB pie executable, ARM aarch64, version 1 (SYSV), dynamically linked, interpreter /lib/ld-linux-aarch64.so.1, BuildID[sha1]=f39d7a4a7551ef3e3b4eba59a12959d4bc636032, for GNU/Linux 3.7.0, not stripped
-
浏览器运行
输入身高与体重信息,点击“计算”按钮,会提交当前网页中的表单数据到Web服务器并返回计算后的BMI数据。
2、Index网页文件说明
index.html是web服务器默认的页面文件,主要作用就是显示一个静态页面,提交当前页面后指定的cgi程序执行处理。
//action 指定了cgi-bin\bmi.cgi为提交后执行的程序文件
<form action="cgi-bin\bmi.cgi" method="get">
index.html源码:
<html>
<body>
<div align="center">
<form action="cgi-bin\bmi.cgi" method="get"> <table> <tr><td rowspan="3"><img src="bmi.png" hight="60" width="120"></td><td align="center" colspan="3"><h2>体重指数(BMI)计算器</h2></td></tr><tr><td >身高 : <input type="number" name="cm" min="1" max="300" size="3"> cm </td><td >体重 : <input type="number" name="kg" min="1" max="500" size="3"> kg </td><td align="center" ><input type=submit value=" 计 算 " size="16"> </td></tr><tr><td align="center" colspan="3">BMI = <input type="text" name="ret" value="" size="3" readonly></tr> </table>
</form>
</br><img src=bmi_index.png >
</div>
</body>
</html>
3、HTTP 请求处理功能说明
通过getvalue.h头文件实现。
宏定义和全局变量
#define FIELD_LEN 60
#define NV_PAIRS 15 typedef struct name_value_st{char name[FIELD_LEN + 1];char value[FIELD_LEN + 1];
} name_value;name_value name_val_pairs[NV_PAIRS];
int num_pairs = 0;/*pairs number*/
const char *M = NULL;
const char *L = NULL;
const char *S = NULL;
static int iread = 0;
-
FIELD_LEN
宏定义了每个名称或值的最大长度为 60。 -
NV_PAIRS
宏定义了可以处理的名称 - 值对的最大数量为 15。 -
name_value
结构体包含两个字符数组name
和value
,分别用于存储名称和值,长度为FIELD_LEN + 1
。 -
name_val_pairs
是name_value
结构体的数组,用于存储多个名称 - 值对。 -
num_pairs
用于记录实际存储的名称 - 值对的数量。 -
M
、L
、S
是指向常量字符的指针,初始化为NULL
,可能用于存储请求方法、内容长度和查询字符串。 -
iread
是静态整型变量,可能用于记录读取值的次数。
函数声明
void unescape_url(char *url);
void set_env(const char *r_mth, const char *c_len,const char *q_str);
char* get_value(const char *name);
int get_input(void);
void send_error(char *error_test);
char x2c(char *what);
void load_nv_pair(char *tmp_buffer, int nv_entry_number_to_load);
-
unescape_url(char *url)
:对 URL 进行转义处理。 -
set_env(const char *r_mth, const char *c_len,const char *q_str)
:设置环境变量,将传入的三个参数存储到全局指针M
、L
和S
中。 -
get_value(const char *name)
:根据传入的名称查找并返回对应的value
。 -
get_input(void)
:获取输入数据,根据请求方法(POST 或 GET)将数据存储在ip_data
中,并将数据解析为名称 - 值对存储在name_val_pairs
中。 -
send_error(char *error_text)
:输出错误信息,以 HTML 格式输出错误信息。 -
x2c(char *what)
:将十六进制表示的字符转换为对应的 ASCII 字符。 -
load_nv_pair(char *tmp_buffer, int nv_entry_number_to_load)
:将tmp_buffer
中的名称 - 值对加载到name_val_pairs
数组的指定条目中。
set_env(const char *r_mth, const char *c_len,const char *q_str)
void set_env(const char *r_mth, const char *c_len,const char *q_str)
{M = r_mth;L = c_len;S = q_str;
}
-
功能:将传入的三个参数
r_mth
、c_len
和q_str
分别赋值给全局指针M
、L
和S
,用于存储环境信息。
get_value(const char *name)
char* get_value(const char *name)
{int nv_entry_number = 0;int i = 0;char* val = NULL;char *tname = NULL;if(iread == 0){ if (!get_input()){return "error";exit(EXIT_FAILURE);}}for(i = 0; i < num_pairs; i++ ){ val = name_val_pairs[nv_entry_number].value;tname = name_val_pairs[nv_entry_number].name;nv_entry_number++;if( strcmp(tname,name) == 0 ){ break;}else{ val = NULL; tname = NULL;}}iread++;//read value timesreturn val; exit(EXIT_SUCCESS);
}
-
功能:
-
首先,如果
iread
为 0,则调用get_input()
函数获取输入数据。如果get_input()
失败,返回"error"
并终止程序。 -
然后遍历
name_val_pairs
数组,比较每个名称 - 值对的名称部分和传入的name
,如果匹配,将对应的value
存储在val
中。 -
增加
iread
的值,表示读取值的次数。 -
最后返回找到的
value
,如果未找到,返回NULL
。
-
get_input(void)
int get_input(void)
{int nv_entry_number = 0;int got_data = 0;char *ip_data = NULL;int ip_length = 0;char tmp_buffer[(FIELD_LEN * 2) + 2];int tmp_offset = 0;char *tmp_char_ptr = NULL;int chars_processed = 0;tmp_char_ptr = (char*)M;if ( tmp_char_ptr){if(strcmp(tmp_char_ptr, "POST") == 0){tmp_char_ptr = (char*)L;if (tmp_char_ptr){ip_length = atoi(tmp_char_ptr);ip_data = malloc(ip_length + 1);if (fread(ip_data, 1, ip_length, stdin)!= ip_length){send_error("Bad read from stdin");return(0);}ip_data[ip_length] = '\0';got_data = 1;}}}tmp_char_ptr = (char*)M;if ( tmp_char_ptr){if(strcmp(tmp_char_ptr, "GET") == 0){tmp_char_ptr = (char*)S;if (tmp_char_ptr){ip_length = strlen(tmp_char_ptr);ip_data = malloc(ip_length + 1);strcpy(ip_data, (char*)S);ip_data[ip_length] = '\0';got_data = 1;}}}if (!got_data){send_error("No data received");}if (ip_length <= 0){send_error("Input length <= 0");return(0);}memset(name_val_pairs, '\0', sizeof(name_val_pairs));tmp_char_ptr = ip_data;while (chars_processed <= ip_length && nv_entry_number < NV_PAIRS){tmp_offset = 0;while (*tmp_char_ptr && *tmp_char_ptr!= '&' && tmp_offset < FIELD_LEN){tmp_buffer[tmp_offset] = *tmp_char_ptr;tmp_offset++;tmp_char_ptr++;chars_processed++;}tmp_buffer[tmp_offset] = '\0';load_nv_pair(tmp_buffer, nv_entry_number);tmp_char_ptr++;nv_entry_number++;}free(ip_data);ip_data = NULL;return(1);
}
-
功能:
-
首先,通过
M
检查请求方法。 -
如果是
POST
方法,通过L
获取内容长度,分配足够的内存给ip_data
,使用fread
从标准输入读取数据,处理读取错误。 -
如果是
GET
方法,通过S
获取查询字符串,分配内存给ip_data
,复制查询字符串,添加字符串结束符。 -
检查是否有数据,如果没有数据,调用
send_error
函数报错。 -
检查输入长度是否小于等于 0,若是则报错。
-
清空
name_val_pairs
数组。 -
遍历
ip_data
,将数据存储在tmp_buffer
中,遇到&
符号或达到FIELD_LEN
长度时,调用load_nv_pair
函数将数据存储到name_val_pairs
数组中。 -
释放
ip_data
的内存。
-
send_error(char *error_text)
void send_error(char *error_text)
{printf("Content-Type: text/html\r\n");printf("\r\n");printf("Woops:- %s\r\n",error_text);
}
-
功能:输出 HTML 头信息和错误信息,用于向用户反馈错误信息。
load_nv_pair(char *tmp_buffer, int nv_entry)
void load_nv_pair(char *tmp_buffer, int nv_entry)
{int chars_processed = 0;char *src_char_ptr = NULL;char *dest_char_ptr = NULL;src_char_ptr = tmp_buffer;dest_char_ptr = name_val_pairs[nv_entry].name;while (*src_char_ptr && *src_char_ptr!= '=' && chars_processed < FIELD_LEN){if (*src_char_ptr == '+'){*dest_char_ptr = ' ';}else{*dest_char_ptr = *src_char_ptr;}dest_char_ptr++;src_char_ptr++;chars_processed++;}if (*src_char_ptr == '='){num_pairs++;src_char_ptr++;dest_char_ptr = name_val_pairs[nv_entry].value;chars_processed = 0;while (*src_char_ptr && *src_char_ptr!= '=' && chars_processed < FIELD_LEN){if (*src_char_ptr == '+'){*dest_char_ptr = ' ';}else{*dest_char_ptr = *src_char_ptr;}dest_char_ptr++;src_char_ptr++;chars_processed++;}}unescape_url(name_val_pairs[nv_entry].name);unescape_url(name_val_pairs[nv_entry].value);
}
-
功能:
-
将
tmp_buffer
中的数据解析为名称 - 值对,将名称存储在name_val_pairs[nv_entry].name
中,将值存储在name_val_pairs[nv_entry].value
中。 -
将
+
替换为空格。 -
调用
unescape_url
函数对名称和值进行 URL 转义处理。
-
unescape_url(char *url)
void unescape_url(char *url)
{int x,y;for (x=0,y=0; url[y]; ++x,++y ){if ( (url[x] = url[y]) == '%'){url[x] = x2c(&url[y+1]);y += 2;}}url[x] = '\0';
}
-
功能:
-
遍历
url
字符串。 -
当遇到
%
时,调用x2c
函数将后面的两个字符转换为对应的 ASCII 字符。
-
x2c(char *what)
char x2c(char *what)
{register char digit;digit = (what[0] >= 'A'? ((what[0] & 0xdf) - 'A')+10 : (what[0] - '0'));digit *= 16;digit += (what[1] >= 'A'? ((what[1] & 0xdf) - 'A')+10 : (what[1] - '0'));return(digit);
}
-
功能:将十六进制表示的字符(如
%xx
)转换为对应的 ASCII 字符。
4、应用功能主程序说明
通过bmi.c程序实现。关键代码分析说明如下:
set_env(getenv("REQUEST_METHOD"),getenv("CONTENT_LENGTH"),getenv("QUERY_STRING"));
-
getenv("REQUEST_METHOD")
:该函数用于获取名为REQUEST_METHOD
的环境变量的值。在 HTTP 服务器环境中,REQUEST_METHOD
通常包含请求的方法,例如GET
、POST
、PUT
等。 -
getenv("CONTENT_LENGTH")
:该函数用于获取名为CONTENT_LENGTH
的环境变量的值。在 HTTP 请求中,如果是POST
方法,CONTENT_LENGTH
表示请求体的长度。 -
getenv("QUERY_STRING")
:该函数用于获取名为QUERY_STRING
的环境变量的值。在 HTTP 的GET
请求中,QUERY_STRING
包含了 URL 中的查询部分(即?
后面的部分)。
val_cm = get_value("cm"); val_kg = get_value("kg");
-
通过getvalue.h文件中的自定义函数get_value,可根据传入的名称查找并返回对应的字符串值。
bmi.c文件源码:
#include <stdio.h>
#include <unistd.h>
#include <sys/types.h>
#include <stdlib.h>
#include "getvalue.h"int main(int argc, char *argv[])
{char *val_cm = NULL;char *val_kg = NULL;int cm,kg,len;float cm_f=0.0,kg_f=0.0,bmi=0.0;set_env(getenv("REQUEST_METHOD"),getenv("CONTENT_LENGTH"),getenv("QUERY_STRING")); val_cm = get_value("cm"); val_kg = get_value("kg"); cm = atoi(val_cm);kg = atoi(val_kg);cm_f = (cm + 0.0) / 100;kg_f = kg + 0.0;bmi = kg_f/(cm_f*cm_f);//计算bmi数值//下面输出信息都是HTML文件输出printf( "Content-type:text/html\n\n" ); printf("<html><body><div align=\"center\">\n");//输出调试信息printf("Debug INFO:CM=%f,KG=%f,BMI=%f \n",cm_f,kg_f,bmi);printf("<form action=\"bmi.cgi\" method=\"get\"><table> \n");printf("<tr><td rowspan=\"3\"><img src=\"../bmi.png\" hight=\"60\" width=\"120\"></td> \n");printf("<td align=\"center\" colspan=\"3\"><h2>体重指数(BMI)计算器</h2></td></tr> \n");printf("<tr><td >身高 : <input type=\"number\" name=\"cm\" min=\"1\" max=\"300\" size=\"3\"> cm </td> \n");printf("<td >体重 : <input type=\"number\" name=\"kg\" min=\"1\" max=\"500\" size=\"3\"> kg </td> \n");printf("<td align=\"center\" ><input type=submit value=\" 计 算 \" size=\"16\"> </td></tr> \n");printf("<tr><td align=\"center\" colspan=\"3\">BMI = \n");if(bmi == 0.0)printf("<input type=\"text\" name=\"ret\" value=\" \" size=\"3\" readonly></tr> \n");elseprintf("<input type=\"text\" name=\"ret\" value=\" %.1f \" size=\"3\" readonly></tr> \n",bmi); printf("</table></form></br><img src=\"../bmi_index.png\" > \n");printf("</div></body> </html> \n");return 0;
}
相关文章:
物联网网关Web服务器--CGI开发实例BMI计算
本例子通一个计算体重指数的程序来演示Web服务器CGI开发。 硬件环境:飞腾派开发板(国产E2000处理器) 软件环境:飞腾派OS(Phytium Pi OS) 硬件平台参考另一篇博客:国产化ARM平台-飞腾派开发板…...
计算机网络 (51)鉴别
前言 计算机网络鉴别是信息安全领域中的一项关键技术,主要用于验证用户或信息的真实性,以及确保信息的完整性和来源的可靠性。 一、目的与重要性 鉴别的目的是验明用户或信息的正身,对实体声称的身份进行唯一识别,以便验证其访问请…...
Mellanox ConnectX 系列网卡的双驱动架构:以太网与 InfiniBand 的协同设计
在现代数据中心和高性能计算(HPC)环境中,网络硬件的性能和功能至关重要。Mellanox ConnectX 系列网卡以其卓越的性能和多功能性而闻名,支持从传统的以太网到高性能的 InfiniBand 网络协议。这种多功能性使得 Mellanox 网卡能够满足不同应用场景的需求,从常规的数据中心网络…...
【Java】阿里环球Antom支付对接
阿里环球Antom支付对接 线上文档地址: GitHub:https://github.com/alipay/global-open-sdk-java 文档:https://global.alipay.com/docs/ac/ams_zh-cn/session_cashier maven: <!--阿里国际支付--><dependency><g…...
【vim】vim编辑器如何设置行号
vim编辑器如何设置行号 一、**临时设置行号**二、永久设置行号2.1. **用户配置文件方式(针对当前用户)**2.2. **全局配置文件方式(谨慎使用,会影响所有用户)** 在Vim中设置行号有以下两种常见的方法: 一、…...
爬虫基础之爬取某站视频
目标网址:为了1/4螺口买小米SU7,开了一个月,它值吗?_哔哩哔哩_bilibili 本案例所使用到的模块 requests (发送HTTP请求)subprocess(执行系统命令)re (正则表达式操作)json (处理JSON数据) 需求分析: 视频的名称 F12 打开开发者工具 or 右击…...
2024嵌入式系统的未来发展与技术洞察分享
时间如白驹过隙,不知不觉又是一年,这一年收获满满。接下来,将本年度对技术的感悟和洞察分析如下,希望对大家有所帮助。 在过去几十年里,嵌入式系统技术迅速发展,成为现代电子设备和智能硬件的核心组成部分。…...
[微服务]注册中心优化
环境隔离 企业实际开发中,往往会搭建多个运行环境,例如: 开发环境测试环境预发布环境生产环境 这些不同环境之间的服务和数据之间需要隔离。 还有的企业中,会开发多个项目,共享nacos集群。此时,这些项目…...
Leetcode 3426. Manhattan Distances of All Arrangements of Pieces
Leetcode 3426. Manhattan Distances of All Arrangements of Pieces 1. 解题思路2. 代码实现 题目链接:3426. Manhattan Distances of All Arrangements of Pieces 1. 解题思路 这道题很惭愧,一开始没有搞定,后来看了答案想了想ÿ…...
【重庆市乡镇界】面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移内容测评
标题中的“最新重庆市乡镇界面图层shp格式arcgis数据乡镇名称和编码wgs84坐标无偏移最新”指的是一个地理信息系统(GIS)的数据集,特别设计用于ArcGIS软件。这个数据集包含了重庆市所有乡镇的边界信息,以Shapefile(.shp…...
基于ChatGPT的论文写作辅助工具研究
**基于ChatGPT的论文写作辅助工具研究** **摘要**: 随着人工智能技术的飞速发展,自然语言处理(NLP)领域取得了显著进步。ChatGPT作为OpenAI最新推出的生成式预训练Transformer模型,在文本生成、对话系统等方面展现出…...
定时器setTimeout和setInterval
setTimeOut()异步 setInterval()异步...
PCL 部分点云视点问题【2025最新版】
目录 一、问题概述二、解决方案1、软件实现2、代码实现三、调整之后博客长期更新,本文最近更新时间为:2025年1月18日。 一、问题概述 针对CloudCompare软件处理过的pcd格式点云,在使用PCL进行特征点提取、配准等实验中最终显示结果出现点云位置偏差较大的问题,本博客给出解…...
Cursor 与常见集成开发环境(IDE)的优势对比
Cursor与常见集成开发环境(IDE)的优势对比 一、AI 辅助编程能力 强大的代码生成功能: Cursor: 以其内置的强大 AI 辅助编程功能为核心优势。用户可以通过输入自然语言描述,快速生成各种编程语言的代码。例如…...
TDengine 做为 FLINK 数据源技术参考手册
Apache Flink 是一款由 Apache 软件基金会支持的开源分布式流批一体化处理框架,可用于流处理、批处理、复杂事件处理、实时数据仓库构建及为机器学习提供实时数据支持等诸多大数据处理场景。与此同时,Flink 拥有丰富的连接器与各类工具,可对接…...
不重启JVM,替换掉已经加载的类
不重启JVM,替换掉已经加载的类 直接操作字节码 使用ASM框架直接操作class文件,在类中修改代码,然后retransform就可以了 下边是BTrace官方提供的一个简单例子: package com.sun.btrace.samples;import com.sun.btrace.annotati…...
axios的使用总结
一、Axios 简介 Axios 是一个基于 Promise 的 HTTP 客户端,用于浏览器和 Node.js。在 Vue 项目中,它主要用于发送 HTTP 请求来获取数据(如从 API 获取数据)或者提交数据(如用户登录、注册等表单数据)。 二…...
使用 F12 查看 Network 及数据格式
在浏览器中,F12 开发者工具的 “Network” 面板是用于查看网页在加载过程中发起的所有网络请求,包括 API 请求,以及查看这些请求的详细信息和响应数据的。以下以常见的 Chrome 浏览器为例,介绍如何使用 F12 控制台查看 Network 里…...
HTML<img>标签
例子 如何插入图片: <img src"img_girl.jpg" alt"Girl in a jacket" width"500" height"600"> 下面有更多“自己尝试”的示例。 定义和用法 该<img>标签用于在 HTML 页面中嵌入图像。 从技术上讲&#x…...
Android系统开发(六):从Linux到Android:模块化开发,GKI内核的硬核科普
引言: 今天我们聊聊Android生态中最“硬核”的话题:通用内核镜像(GKI)与内核模块接口(KMI)。这是内核碎片化终结者的秘密武器,解决了内核和供应商模块之间无尽的兼容性问题。为什么重要&#x…...
每日一刷——1.20——准备蓝桥杯
链接:登录—专业IT笔试面试备考平台_牛客网 来源:牛客网 题目一 请统计某个给定范围[L, R]的所有整数中,数字2出现的次数。 比如给定范围[2, 22],数字2在数2中出现了1次,在数12中出现1次,在数20中出现1次&a…...
知行合一:解决有心无力的问题,解决知易行难的问题,知行合一并不意味着事事都要合一,而是....
问题是什么? 想学习的时候,有手机阻碍我们。想戒掉手机短视频,卸载后,几天的时间,又下载了回来。制定了减肥计划,但就是不执行。明知道这样做是不对的,但依然行动不起来。 沉溺于各种各样的享…...
C++ Qt练习项目 日期时间数据 未完待续
个人学习笔记 新建项目 设计UI 实现组件功能 参考资料 4.7日期时间数据_哔哩哔哩_bilibili...
Golang学习笔记_28——工厂方法模式(实例)
Golang学习笔记_26——通道 Golang学习笔记_27——单例模式 Golang学习笔记_28——工厂方法模式 工厂方法模式(实例) package factory_method_demoimport "fmt"// Order 接口,定义订单的基本操作 type Order interface {Calculate…...
linux下springboot项目nohup日志或tomcat日志切割处理方案
目录 1. 配置流程 2. 配置说明 其他配置选项: 3. 测试执行 4. 手动执行 https://juejin.cn/post/7081890486453010469 通常情况下,我们的springboot项目部署到linux服务器中,通过nohup java -jar xxx.jar &指令来进行后台运行我们…...
SentencePiece和 WordPiece tokenization 的含义和区别
SentencePiece和 WordPiece tokenization 的含义和区别 SentencePiece 和 WordPiece 都是常用的分词(tokenization)技术,主要用于自然语言处理(NLP)中的文本预处理,尤其是在处理大规模文本数据时。它们都基于子词(subword)单元,能够将未登录词(out-of-vocabulary, O…...
视频修复最强算法 部署笔记2025
目录 模型下载: 模型: 原版保存的视频,vs code不播放: 模型下载: Release ProPainter V0.1.0 Release sczhou/ProPainter GitHub huggingface-cli download --resume-download lixiaowen/diffuEraser --local-dir /mnt/pfs/models/huggingface/models--lixiaowen--d…...
Java数据结构——优先队列
目录 引言1. 优先队列2. 优先队列的实现2.1 堆的概念2.2 堆的创建2.2.1 堆的向下调整2.3 堆的插入2.4 堆的删除 3. 总结 引言 前面一篇文章讲了二叉树,本篇将讲述数据结构中的优先队列,优先队列则需要用到完全二叉树来实现。 1. 优先队列 队列&#x…...
红外热成像之无人机载荷
电力巡检 相较于传统的人工电力巡线方式,无人机巡检能够在高空对人工难以达到或无法检测的设备进行检测,实现了电子化、信息化、智能化巡检,可以提高巡检的工作效率和应急抢险水平。 森林防火 无人机搭载红外光电系统能在森林高空进行全天候监…...
深入Spring Boot:自定义Starter开发与实践
引言 Spring Boot通过其强大的自动配置机制和丰富的Starter模块,极大地简化了Spring应用的开发过程。Starter模块封装了一组相关的依赖和配置,使得开发者可以通过简单的依赖引入,快速启用特定的功能。然而,除了使用Spring Boot提…...
MasterSAM downloadService任意文件读取(CVE-2024-55457)(附脚本)
免责申明: 本文所描述的漏洞及其复现步骤仅供网络安全研究与教育目的使用。任何人不得将本文提供的信息用于非法目的或未经授权的系统测试。作者不对任何由于使用本文信息而导致的直接或间接损害承担责任。如涉及侵权,请及时与我们联系,我们将尽快处理并删除相关内容。 0x0…...
【Pytest】基础到高级功能的理解使用
文章目录 第一部分:Pytest 简介1.1 什么是 Pytest?1.2 Pytest 的历史1.3 Pytest 的核心概念1.4 Pytest 的特点1.5 为什么选择 Pytest? 第二部分:Pytest 的基本使用2.1 安装 Pytest2.2 编写第一个测试用例2.2.1 创建一个简单的测试…...
【Linux系统编程】—— 从零开始实现一个简单的自定义Shell
文章目录 什么是自主shell命令行解释器?实现shell的基础认识全局变量的配置初始化环境变量实现内置命令(如 cd 和 echo)cd命令:echo命令: 构建命令行提示符获取并解析用户输入的命令执行内置命令与外部命令Shell的主循…...
探索云原生可观测性:技术与团队协作的深度结合
TheNewStack 出品的电子书《Cloud Native Observability for DevOps Teams》读后感,老书新读,还是另有一番领悟。 阅读原文请转到:https://jimmysong.io/blog/cloud-native-observability-devops/ 最近读了 TheNewStack 发布的电子书《Cloud …...
Vue基础(2)
19、组件之间传递数据 组件与组件之间不是完全独立的,而是有交集的,那就是组件与组 件之间是可以传递数据的 传递数据的解决方案就是 props ComponentA.vue <template><!-- 使用ComponentB组件,并传递title属性 --><h3>…...
Yearning开源MySQL SQL审核平台
一款MYSQL SQL语句/查询审计工具,为DBA与开发人员使用. 本地部署,注重隐私,简单高效的MYSQL审计平台。 它可以通过流程审批,实现真实线上环境sql的审核和执行,还可以回滚执行,能够确保线上SQL更新的可靠性…...
《鸿蒙Next应用商店:人工智能开启智能推荐与运营新时代》
在科技飞速发展的当下,鸿蒙Next系统的出现为操作系统领域带来了新的变革与机遇,而人工智能技术的融入更是让其应用商店的智能化推荐和运营迈向了一个全新的高度。 用户画像精准构建 在鸿蒙Next系统中,应用商店可以借助系统强大的权限管理和…...
SSTI注入
ssti漏洞成因 ssti服务端模板注入,ssti主要为python的一些框架 jinja2 mako tornado django,PHP框架smarty twig,java框架jade velocity等等使用了渲染函数时,由于代码不规范或信任了用户输入而导致了服务端模板注入,…...
根据经纬度查询地理位置信息API
API 概述 接口名称:查询地理位置信息V2接口类型:HTTP GET接口地址:https://api.kertennet.com/geography/locationInfo_v2请求编码格式:utf-8 请求说明 请求头部 标签类型必填说明参数示例Content-Typestring是请求的内容类型…...
【知识分享】PCIe5.0 TxRx 电气设计参数汇总
目录 0 引言 1 参考时钟--Refclk 2 发射端通道设计 3 发送均衡技术 4 接收端通道设计 5 接收均衡技术 6 结语 7 参考文献 8 扩展阅读 0 引言 PCI Express Base Specification 5.0的电气规范中,关键技术要点如下: 1. 支持2.5、5.0、8.0、16.0和3…...
Airsim 项目结构分析
Airsim 项目结构分析 本文只分析最核心的 AirLib 项目结构,以及其与 Unreal 项目的关系 假如已经根据 Airsim 主页,克隆了完整项目。 Build on Linux - AirSim 克隆源码 # go to the folder where you clone GitHub projects git clone https://git…...
STM32+W5500+以太网应用开发+003_TCP服务器添加OLED(u8g2)显示状态
STM32W5500以太网应用开发003_TCP服务器添加OLED(u8g2)显示状态 实验效果3-TCP服务器OLED1 拷贝显示驱动代码1.1 拷贝源代码1.2 将源代码添加到工程1.3 修改代码优化等级1.4 添加头文件路径1.5 修改STM32CubeMX工程 2 修改源代码2.1 添加头文件2.2 main函…...
SQLmap 注入-03 获得用户信息
1: Sqlmap 先进入库,然后进入table, 然后列出column: sqlmap -u "http://192.168.56.133/mutillidae/index.php?pageuser-info.php&usernamexiaosheng&passwordabc&user-info-php-submit-buttonViewAccountDetails" --batch -p username -D …...
Kafka 和 MQ 的区别
1.概述 1.1.MQ简介 消息中间件,其实准确的叫法应该叫消息队列(message queue),简称MQ。其本质上是个队列,有FIFO的性质,即first in first out,先入先出。 目前市场上主流的MQ有三款ÿ…...
若依报错:无法访问com.ruoyi.common.annotation
无法访问com.ruoyi.common.annotation 若依的父工程的pom文件中设置了jdk为1.8,将idea的jdk也改为1.8即可。...
MCU、MPU、SOC、ECU、CPU、GPU的区别到底是什么
MCU、MPU、SOC、ECU、CPU、GPU的区别 参数MCUMPUSoCECUCPUGPU处理能力低至中中至高综合,视具体设计而定专用于汽车控制中至高高(并行能力强)集成度高低高高低(需配合主板使用)低(通常作为外部设备ÿ…...
档案事业与数据要素之间有什么关系?
在数字时代背景下,档案事业正经历着前所未有的变革。随着大数据、云计算、人工智能等技术的快速发展,档案数据已成为重要的基础性战略资源和关键生产要素。那么档案事业与数据要素之间究竟有什么关系? 一、档案数据要素的内涵与价值 数据要…...
HarmonyOS NEXT:华为分享-碰一碰开发分享
随着科技的不断进步,智能手机和智能设备之间的互联互通变得越来越重要。华为作为科技行业的领军企业,一直致力于为用户提供更加便捷、高效的使用体验。HarmonyOS NEXT系统的推出,特别是其中的“碰一碰”功能,为用户带来了前所未有…...
nuxt3项目打包部署到服务器后配置端口号和开启https
nuxt3打包后的项目部署相对于一般vite打包的静态文件部署要稍微麻烦一些,还有一个主要的问题是开发环境配置的.env环境变量在打包后部署时获取不到,具体的解决方案可以参考我之前文章 nuxt3项目打包后获取.env设置的环境变量无效的解决办法。 这里使用的…...
面试:Hadoop,块,HDFS的优缺点,HDFS的读写流程
Hadoop CDH会简化Hadoop的安装 Hue主要用于数据分析和处理,而CM(Cloudera Manager)则主要用于集群的管理和运维。 HDFS HDFS的块 块是 HDFS 系统当中的最小存储单位, 在hadoop2.0和3.0中默认128MB 在HDFS上的文件会被拆分成多个块,每个块作为独立的单…...