ONVIF协议网络摄像机客户端使用gsoap获取RTSP流地址GStreamer拉流播放
什么是ONVIF协议
ONVIF(开放式网络视频接口论坛)是一个全球性的开放式行业论坛,旨在促进开发和使用基于物理IP的安全产品接口的全球开放标准。
ONVIF规范的目标是建立一个网络视频框架协议,使不同厂商生产的网络视频产品完全互通。
1:设备管控和控制:通过Web Services提供接口,使用SOAP协议进行数据交互。
2:音视频流:通过RTP/RTSP进行传输。
3:统一接口:抽象了功能的接口,统一了对设备配置和操作的方式,使得控制端不再关心设备的型号,而是关注设备提供的Web Service23。
学习并使用ONVIF协议我个人觉得要理清楚角色,就网络摄像机而言,对于应用场景可分为客户端和服务端。使用的网络摄像机就是服务端,也就是了解ONVIF出现最多的web services服务端,想要使用这个对接网络摄像机就是从这里面获取相关信息。
开发客户端通过ONVIF规范接口和网络摄像机进行通讯,其中常见的功能有:
1:获取网络相机的基本信息
2:修改网络的系统日期、时间
3:修改网络摄像机的网络配置(IP、子网掩码等)
4:获取、修改网络摄像头的各种参数(视频分辨率、码率、帧率、OSD(叠加信息)、云平台控制)
在onvif协议中,有一些列profile的技术规格。引入这些规格是使得终端用户能够更容易区分各个profile所支持的特性,而无需确定各个版本间的兼容性。
其中应用于视频流的主要是使用profile S 技术规格。
ONVIF官方profile地址
在学习ONVIF协议时会出现很多名词:Web Service、WSDL、XML、SOAP。刚接触的初学者会一脸懵逼,这些都是什么玩意有什么用,以我对他们的了解而言,这些也就了解一下皮毛就行了,不用纯手搓从底层开始搓。因为有一个很强大的工具来简化这个过程那即是gsoap
gsoap官网:http://www.cs.fsu.edu/~engelen/soap.html
需要什么功能在使用这个工具的时候直接连接。
就像这样的链接:
http://www.onvif.org/onvif/ver20/util/operationIndex.html
http://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl
http://www.onvif.org/onvif/ver10/deviceio.wsdl
http://www.onvif.org/onvif/ver10/event/wsdl/event.wsdl
http://www.onvif.org/onvif/ver20/analytics/wsdl/analytics.wsdl
http://www.onvif.org/onvif/ver10/analyticsdevice.wsdl
http://www.onvif.org/onvif/ver10/display.wsdl
http://www.onvif.org/onvif/ver20/imaging/wsdl/imaging.wsdl
http://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl
http://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
http://www.onvif.org/onvif/ver10/Receiver.wsdl
http://www.onvif.org/onvif/ver10/network/wsdl/remotediscovery.wsdl
http://www.onvif.org/onvif/ver10/Recording.wsdl
http://www.onvif.org/onvif/ver10/Replay.wsdl
http://www.onvif.org/onvif/ver10/Search.wsdl
需要什么链接什么
2:怎么使用
我是基于linux平台来进行相关的开发,那就需要自己去gsoap官网下载对应的工具库然后编译,很简单这个。
1:去官网下载相关的文件http://sourceforge.net/projects/gsoap2
2:解压压缩包然后进行配置
./configure --prefix=/usr/local/gSOAP
3:编译 make
4:安装:sudo make install
然后生成的编译好的库就在/usr/local/gSOAP这个路径下面
然后去文件夹bin里面找到
这两个工具程序,这俩是用来生成头文件框架的直接用就可以了
先把gsoap库里面的文件拷贝到自己的工程中
然后需要什么链接什么:
./wsdl2h -P -x -c -s -t ./typemap.dat -o onvif.h https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl https://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
./wsdl2h -P -x -c -s -t ./typemap.dat -o onvif.h https://www.onvif.org/onvif/ver10/device/wsdl/devicemgmt.wsdl https://www.onvif.org/onvif/ver10/media/wsdl/media.wsdl https://www.onvif.org/onvif/ver20/ptz/wsdl/ptz.wsdl
根据上面的介绍,需要什么功能后面连接什么wsdl。
然后运行
soapcpp2 -C -c -x -I import -I custom xxx.h
然后就会生成这些文件了
那么基本框架就OK了
然后就是自己写程序了
我的程序
#include <gst/gst.h>
#include "soapH.h"char* onvif() {struct soap *soap;struct _trt__GetProfilesResponse profilesResp;struct _trt__GetStreamUriResponse streamUriResp;char *rtspUri = NULL; // 用于存储RTSP URI的动态分配字符串// 初始化gSOAP运行时上下文soap = soap_new();if (soap == NULL) {fprintf(stderr, "soap_new failed\n");return NULL;}// 设置设备的端点URL和认证信息const char *device_url = "http://xxx.xxx.20.10:8000/onvif/device_service";soap->userid = "admin";soap->passwd = "admin";// 调用Web服务获取配置文件struct _trt__GetProfiles getProfiles;soap_call___trt__GetProfiles(soap, device_url, NULL, &getProfiles, &profilesResp);if (soap->error == SOAP_OK && profilesResp.Profiles) {// 假设我们使用第一个配置文件struct tt__Profile *profile = profilesResp.Profiles;// 获取每个配置文件的RTSP地址struct _trt__GetStreamUri getStreamUri;getStreamUri.ProfileToken = profile->token;// 分配并初始化Transport结构体struct tt__Transport *transport = (struct tt__Transport*)soap_malloc(soap, sizeof(struct tt__Transport));transport->Protocol = tt__TransportProtocol__RTSP; // 确保枚举值正确// 初始化StreamSetup结构体struct tt__StreamSetup streamSetup;streamSetup.Stream = tt__StreamType__RTP_Unicast; // 确保枚举值正确streamSetup.Transport = transport;// 赋值给getStreamUri.StreamSetupgetStreamUri.StreamSetup = &streamSetup;soap_call___trt__GetStreamUri(soap, device_url, NULL, &getStreamUri, &streamUriResp);if (soap->error == SOAP_OK && streamUriResp.MediaUri) {// 动态分配字符串以存储RTSP URIrtspUri = malloc(strlen("rtsp://") + strlen(streamUriResp.MediaUri->Uri) + 1);if (rtspUri != NULL) {sprintf(rtspUri, "%s", streamUriResp.MediaUri->Uri);} else {fprintf(stderr, "Memory allocation failed for RTSP URI\n");}} else {soap_print_fault(soap, stderr);}} else {soap_print_fault(soap, stderr);}// 清理资源soap_destroy(soap);soap_end(soap);soap_free(soap);return rtspUri; // 返回动态分配的RTSP URI字符串
}/* 回调函数 */
static void on_pad_added(GstElement *element, GstPad *pad, gpointer data);int main(int argc, char *argv[]) {GstElement *pipeline, *source, *depay, *parse, *decoder, *convert, *sink;GstBus *bus;GstMessage *msg;GstStateChangeReturn ret;char *rtspUri = onvif();/* 初始化 GStreamer库 */gst_init(&argc, &argv);/* 创建各个元素 */source = gst_element_factory_make("rtspsrc", "source");// RTSP 源depay = gst_element_factory_make("rtph264depay", "depay");//H.264 RTP 解封装parse = gst_element_factory_make("h264parse", "parse");// H.264 解析器decoder = gst_element_factory_make("mppvideodec", "decoder");// MPP 视频解码器convert = gst_element_factory_make("videoconvert", "convert");// 视频格式转换sink = gst_element_factory_make("autovideosink", "sink");// 自动选择视频输出if (!source || !depay || !parse || !decoder || !convert || !sink) {g_printerr("Not all elements could be created.\n");return -1;}/* Create the empty pipeline */pipeline = gst_pipeline_new("test-pipeline");if (!pipeline) {g_printerr("无法创建管道\n");gst_object_unref(source);gst_object_unref(depay);gst_object_unref(parse);gst_object_unref(decoder);gst_object_unref(convert);gst_object_unref(sink);return -1;}/* 设置源的属性 */g_object_set(G_OBJECT(source), "location", rtspUri, NULL);/* 构建管道 */gst_bin_add_many(GST_BIN(pipeline), source, depay, parse, decoder, convert, sink, NULL);/* 手动连接元素 */if (gst_element_link(depay, parse) != TRUE ||gst_element_link(parse, decoder) != TRUE ||gst_element_link(decoder, convert) != TRUE ||gst_element_link(convert, sink) != TRUE) {g_printerr("Elements could not be linked.\n");gst_object_unref(pipeline);return -1;}/* 动态连接 rtspsrc 到 rtph264depay */g_signal_connect(source, "pad-added", G_CALLBACK(on_pad_added), depay);/* 开始播放 */ret = gst_element_set_state(pipeline, GST_STATE_PLAYING);if (ret == GST_STATE_CHANGE_FAILURE) {g_printerr("Unable to set the pipeline to the playing state.\n");gst_object_unref(pipeline);return -1;}/* 等待错误或 EOS(End-Of-Stream)消息 */bus = gst_element_get_bus(pipeline);msg = gst_bus_timed_pop_filtered(bus, GST_CLOCK_TIME_NONE, GST_MESSAGE_ERROR | GST_MESSAGE_EOS);/* 解析消息 */if (msg != NULL) {GError *err;gchar *debug_info;switch (GST_MESSAGE_TYPE(msg)) {case GST_MESSAGE_ERROR:gst_message_parse_error(msg, &err, &debug_info);g_printerr("Error received from element %s: %s\n", GST_OBJECT_NAME(msg->src), err->message);g_printerr("Debugging information: %s\n", debug_info ? debug_info : "none");g_clear_error(&err);g_free(debug_info);break;case GST_MESSAGE_EOS:g_print("达到流末尾.\n");break;default:g_printerr("收到意外的消息.\n");break;}gst_message_unref(msg);}/* Free resources */gst_object_unref(bus);gst_element_set_state(pipeline, GST_STATE_NULL);gst_object_unref(pipeline);return 0;
}
/* 回调函数,用于动态链接 rtspsrc 到 rtph264depay */
static void on_pad_added(GstElement *element, GstPad *pad, gpointer data) {GstPad *sinkpad;GstElement *depay = (GstElement *)data;g_print("Received new pad '%s' from '%s':\n", GST_PAD_NAME(pad), GST_ELEMENT_NAME(element));/* If our depay is already linked, we have nothing to do here */sinkpad = gst_element_get_static_pad(depay, "sink");if (sinkpad && gst_pad_is_linked(sinkpad)) {g_print("We are already linked. Ignoring.\n");gst_object_unref(sinkpad);return;}/* 尝试链接 */if (sinkpad && gst_pad_link(pad, sinkpad) != GST_PAD_LINK_OK) {g_print("Type of the pad does not match type of sink pad.\n");} else {g_print("Link succeeded.\n");}/* 释放 sink pad */if (sinkpad) {gst_object_unref(sinkpad);}
}
我看好多文章都没说怎么编译的,直接用gcc就可以
就像这样,也可以把这些.c文件编译库连接,这样好一点。calcclient.是自己的程序,写好编译通过即可。
相关文章:
ONVIF协议网络摄像机客户端使用gsoap获取RTSP流地址GStreamer拉流播放
什么是ONVIF协议 ONVIF(开放式网络视频接口论坛)是一个全球性的开放式行业论坛,旨在促进开发和使用基于物理IP的安全产品接口的全球开放标准。 ONVIF规范的目标是建立一个网络视频框架协议,使不同厂商生产的网络视频产品完全互通。…...
40分钟学 Go 语言高并发:Go程序性能优化方法论
Go程序性能优化方法论 一、性能指标概述 指标类型关键指标重要程度优化目标CPU相关CPU使用率、线程数、上下文切换⭐⭐⭐⭐⭐降低CPU使用率,减少上下文切换内存相关内存使用量、GC频率、对象分配⭐⭐⭐⭐⭐减少内存分配,优化GC延迟指标响应时间、处理延…...
MySQL基础(语句)知识复习 (除索引和视图)
1.客户端和数据库操作 1.登录客户端界面:mysql -uroot -p 2.查看当前的数据库版本:select version(); 3.显示所有数据库:show databases;, 4.创建数据库:create [IF NOT EXISTS] database 库名 character set 字符…...
【sqlcipher】pc端sqflite使用过程中遇到的问题
在flutter中使用sqlcipher时 Mac上如果通过flutter带的文件管理api(即File的delete()方法)删除数据库文件,再创建同名的数据文件的话,必现readonly问题, 这里需要注意的一点是 DatabaseFactory 在Mac上直接使用全局的…...
Vue 实现无线滚动效果
目录 1.Element-plus官网中的Infinite Scroll组件说明 2.滚动条设置 3.滚动到底部的函数调用 1.Element-plus官网中的Infinite Scroll组件说明 官网链接如下所示: Infinite Scroll 无限滚动 | Element Plus 首先查看该代码,发现这个组件使用了一个…...
【CSS in Depth 2 精译_062】第 10 章 CSS 中的容器查询(@container)概述 + 10.1 容器查询的一个简单示例
当前内容所在位置(可进入专栏查看其他译好的章节内容) 【第十章 CSS 容器查询】 ✔️ 10.1 容器查询的一个简单示例 ✔️ 10.1.1 容器尺寸查询的用法 ✔️ 10.2 深入理解容器10.3 与容器相关的单位10.4 容器样式查询的用法10.5 本章小结 文章目录 第 10…...
conda手动初始化
问题:环境中存在conda但是conda无法使用 方法: 进入到anaconda目录下, 进入bin目录, 然后执行 source activate要想启动时自动进入conda环境, 需要在 ~/.bashrc中添加如下命令 # >>> conda initialize >>> # !! Contents within this block are managed by …...
hhdb数据库介绍(10-28)
管理 管理菜单主要囊括对业务数据进行管理的功能,例如对数据的备份恢复或执行业务表的DDL语句等操作。 数据对象 数据对象功能可以帮助用户通过列表实时查看当前已存在的数据对象,了解业务数据的整体情况。提供了对数据对象的筛选、统计、关联、详情等…...
Spring Boot自定义启动banner
在启动 Springboot 应用时,默认情况下会在控制台打印出 Springboot 相关的banner信息。 自定义banner 如果你想自定义一个独特的启动banner,该怎么做呢?Springboot 允许我们通过自定义启动banner来替换默认的banner。只需要在 resources 目…...
c语言——数组名该如何理解呢?
一般情况下,数组名表示首元素地址,以下2种除外: ①、sizeof(数组名) 表示整个数组 ※只有数组名的情况 sizeof(数组名i) 就不能表示整个数组 ②、&数组名 表示整个数组,取的是整个数…...
前端 如何用 div 标签实现 步骤审批
在前端实现一个步骤审批流程,通常是通过 div 标签和 CSS 来构建一个可视化的流程图,结合 JavaScript 控制审批的状态变化。你可以使用 div 标签创建每一个步骤节点,通过不同的样式(如颜色、边框等)表示审批的不同状态&…...
QT工程,它该怎么学?
在现代软件开发中,QT因其强大的跨平台能力和友好的用户界面设计工具,成为开发者学习和应用的热门选择。特别是在Linux系统下,如何安装、配置QT开发环境,以及创建和管理QT工程是入门QT开发的关键环节。本文将从安装QT开发环境开始&…...
第426场周赛:仅含置位位的最小整数、识别数组中的最大异常值、连接两棵树后最大目标节点数目 Ⅰ、连接两棵树后最大目标节点数目 Ⅱ
Q1、仅含置位位的最小整数 1、题目描述 给你一个正整数 n。 返回 大于等于 n 且二进制表示仅包含 置位 位的 最小 整数 x 。 置位 位指的是二进制表示中值为 1 的位。 2、解题思路 我们需要找到一个整数 x,使得: x ≥ nx 的二进制表示中仅包含置位…...
23种设计模式之外观模式
目录 1. 简介2. 代码2.1 SelectFoodService (选择食品)2.2 PayService (支付服务)2.3 TakeService (制作服务)2.4 OrderService (下单服务)2.5 Food (食品)2.6 TackingSystem (外观类)2.7 Test (测试类) 3. 优缺点3. 总结 1. 简介…...
【智商检测——DP】
题目 代码 #include <bits/stdc.h> using namespace std; const int N 1e510, M 110; int f[N][M]; int main() {int n, k;cin >> n >> k;for(int i 1; i < n; i){int x;cin >> x;f[i][0] __gcd(f[i-1][0], x);for(int j 1; j < min(i, k)…...
LeetCode-430. 扁平化多级双向链表-题解
题目链接 430. 扁平化多级双向链表 - 力扣(LeetCode) 题目介绍 你将得到一个双链表,节点包含一个“下一个”指针、一个“前一个”指针和一个额外的“子指针”。这个子指针可能指向一个单独的双向链表,并且这些链表也包含类似的特殊…...
【CSS】一篇掌握CSS
不是因为有了希望才去坚持,而是坚持了才有了希望 目录 一.导入方式 1.行内样式 2.内部样式 3.外部样式(常用) 二.选择器 1.基本选择器(常用) 1.1标签选择器 1.2类选择器 1.3id选择器 2.层次选择器 2.1后代选择器 2.2子选择器 2.3相邻兄弟选择器 2.4通用兄弟选择器…...
华为仓颉编程环境搭建
1、仓颉介绍 摘自华为官方:仓颉编程语言作为一款面向全场景应用开发的现代编程语言,通过现代语言特性的集成、全方位的编译优化和运行时实现、以及开箱即用的 IDE 工具链支持,为开发者打造友好开发体验和卓越程序性能。 其具体特性表现为&am…...
手机实时提取SIM卡打电话的信令声音-蓝牙电话如何适配eSIM卡的手机
手机实时提取SIM卡打电话的信令声音 --蓝牙电话如何适配eSIM卡的手机 一、前言 蓝牙电话的海外战略中,由于海外智能手机市场中政策的差异性,对内置eSIM卡的手机进行支持是非常合理的需求。Android系列手机中,无论是更换通信运营商…...
三种方式(oss、本地、minio)图片的上传下载
一、OSS 1、前期准备 1.1 注册阿里云账号,开启对象存储oss功能,创建一个bucket(百度教程多的是,跟着创建一个就行,创建时注意存储类型是标准存储,读写权限是公共读) 有的在创建桶时读写属性是…...
使用pyQT完成简单登录界面
import sysfrom PyQt6.QtGui import QMovie,QPixmap from PyQt6.QtWidgets import QApplication, QWidget, QLabel, QPushButton,QLineEdit#封装我的窗口类 class MyWidget(QWidget):#构造函数def __init__(self):#初始化父类super().__init__()# 设置窗口大小self.resize(330,…...
Postgres数据库自动化分区
一.创建自动化分区配置表并插入数据 -- Table: managerdb.par_info-- DROP TABLE IF EXISTS managerdb.par_info;CREATE TABLE IF NOT EXISTS managerdb.par_info (table_schema character varying(255) COLLATE pg_catalog."default" NOT NULL,table_name characte…...
【技术介绍】C++编程语言中的瑰宝
C,这门源于C语言并在其基础上进行大幅增强的编程语言,自诞生以来便以其独特的魅力和强大的功能吸引了无数编程者的目光。它不仅是计算机科学领域的一颗璀璨明珠,更是现代软件开发中不可或缺的重要工具。 解析【前言】 C的命名,寓…...
nginx反向代理
目录 环境准备 启动HTTP服务 配置Nginx 访问 部署 1.配置nginx 2.自动化脚本 3.执行脚本 4.使用ansible 什么是反向代理呢,参考nginx反向代理,业务部署过长中,常遇到的场景如下,通过访问域名/ip地址,后面接入网…...
分层图最短路
常见情形: 对于边有k次操作的题。。 整体思想: 分层图最短路可以视作是dijkstra的一个扩展,通常用于处理N小于10000,或者是k不大的情形。整体有点类似于拆点。将一个点拆成k个点处理。层与层之间互不影响。 好了我就说这么多&…...
FRU文件
FRU(Field Replaceable Unit)源文件的格式通常遵循IPMI FRU Information Storage Definition标准。在实际应用中,FRU源文件可以是JSON格式的,这种格式允许用户指定所有的FRU信息字段。以下是FRU源文件的JSON格式的一些关键点&…...
兔子繁衍问题
7-2 兔子繁衍问题 分数 15 全屏浏览 切换布局 作者 徐镜春 单位 浙江大学 一对兔子,从出生后第3个月起每个月都生一对兔子。小兔子长到第3个月后每个月又生一对兔子。假如兔子都不死,请问第1个月出生的一对兔子,至少需要繁衍到第几个月时兔…...
飞凌嵌入式受邀亮相OpenHarmony人才生态大会2024
2024年11月27日,OpenHarmony人才生态大会2024在武汉洲际酒店举行。在这场汇聚了行业精英、技术大咖及生态伙伴的年度盛会上,飞凌嵌入式作为OpenHarmony社区的重要成员受邀出席,并展示了其在OpenHarmony 4.1系统适配方面的最新成果。 在大会的…...
Resrful控制器
Linux Debian 包管理器 apt DebianUbuntuKali红帽子 包管理器dnf或者yum RHELFedroaCentos Stream RHEL上游版本,就是什么新的内容、特性会在这个上面进行测试 运行 运行页面--dotnet blog.dll配置管理 server{listen 80;server_name m.域名;location / {proxy_p…...
Python练习(2)
重复元素判定续。利用集合的无重复性来编写一个程序如果有一个元素出现了不止一次则返回true但不要改变原来列表的值: 一: def has_duplicates(lst): # 使用集合来存储已经见过的元素 seen set() for item in lst: if item in seen: # 如果元素已经在…...
Qt清空文件夹下的内容
Qt清空文件夹下的内容 你可以使用 QDir 类来清空文件夹下的所有内容。以下是一个示例,展示了如何删除指定文件夹中的所有文件和子文件夹: #include <QCoreApplication> #include <QDir> #include <QFileInfoList> #include <QDeb…...
如何手动设置ubuntu服务器的ip、子网掩码、网关、DNS
在 Ubuntu 服务器上手动设置 IP 地址、子网掩码、网关和 DNS,通常有两种方式:使用传统的 ifconfig 命令和配置文件,或者使用现代的 netplan 配置方式(对于 Ubuntu 17.10 及以后版本,netplan 是默认的网络配置工具&…...
单片机状态机实现多个按键同时检测单击、多击、长按等操作
1.背景 在之前有个项目需要一个或多个按键检测:单击、双击、长按等操作 于是写了一份基于状态机的按键检测,分享一下思路 2.实现效果 单击翻转绿灯电平 双击翻转红灯电平 长按反转红绿灯电平 实现状态机检测按键单击,双击,长…...
graph rag都能做哪些事情
从提供的项目目录结构看,系统具备高复杂度和模块化的设计,可能用于大规模数据处理、知识图谱构建、自然语言处理等方面。以下是一些推理出的核心能力和应用场景: 1. 核心模块能力: API 层 (api) 主要用于对外接口的定义和服务调…...
Linux 用户和用户组管理
Linux 用户和用户组管理 Linux系统是一个多用户多任务的分时操作系统,任何一个要使用系统资源的用户,都必须首先向系统管理员申请一个账号,然后以这个账号的身份进入系统。 用户的账号一方面可以帮助系统管理员对使用系统的用户进行跟踪&…...
Python酷库之旅-第三方库Pandas(251)
目录 一、用法精讲 1186、pandas.tseries.offsets.BusinessMonthEnd.is_year_start方法 1186-1、语法 1186-2、参数 1186-3、功能 1186-4、返回值 1186-5、说明 1186-6、用法 1186-6-1、数据准备 1186-6-2、代码示例 1186-6-3、结果输出 1187、pandas.tseries.offs…...
利用Ubuntu批量下载modis图像(New)
由于最近modis原来批量下载的代码不再直接给出,因此,再次梳理如何利用Ubuntu下载modis数据。 之前的下载代码为十分长,现在只给出一部分,需要自己再补充另一部分。之前的为: 感谢郭师兄的指导(https://blo…...
Redis分布式锁
一、全局ID生成器 1.1 概念 全局ID生成器,是一种在分布式系统下用来生成全局唯一ID的工具。具有以下特点: (1)唯一性;(2)高可用;(3&…...
【Maven】依赖管理
4. Maven的依赖管理 在 Java 开发中,项目的依赖管理是一项重要任务。通过合理管理项目的依赖关系,我们可以有效的管理第三方库,模块的引用及版本控制。而 Maven 作为一个强大的构建工具和依赖管理工具,为我们提供了便捷的方式来管…...
leetcode——移除数组
26.删除有序数组中的重复项 给你一个 非严格递增排列 的数组 nums ,请你 原地 删除重复出现的元素,使每个元素 只出现一次 ,返回删除后数组的新长度。元素的 相对顺序 应该保持 一致 。然后返回 nums 中唯一元素的个数。 考虑 nums 的唯一元素…...
vue项目部署到github pages后页面显示不出来??
问题: 当我们在命令行执行 npm run build 后,项目的目录下会生成一个 dist 文件夹,它里面又包含一个 static 文件夹和一个 index.html 文件,这是 webpack 最终打包好的文件 项目上传到仓库后发现页面为空,找不到文件路…...
为什么爱用低秩矩阵
目录 为什么爱用低秩矩阵 一、定义与性质 二、区别与例子 为什么爱用低秩矩阵 我们更多地提及低秩分解而非满秩分解,主要是因为低秩分解在数据压缩、噪声去除、模型简化和特征提取等方面具有显著的优势。而满秩分解虽然能够保持数据的完整性,但在实际应用中的场景较为有限…...
如何在MySQL中计算两个日期的间隔天数
目录 1. DATEDIFF函数2. TIMESTAMPDIFF函数3. PERIOD_DIFF函数4. 函数对比 在MySQL 5.7中,计算两个日期之间的间隔天数是一项常见的任务。 1. DATEDIFF函数 DATEDIFF函数可以直接计算两个日期之间的天数差异。 -- 计算2024年1月1日和2024年1月10日之间的天数差异 …...
SQL面试题——抖音SQL面试题 共同问题—共同使用ip用户检测问题
共同使用ip用户检测问题 现有用户登录日志表,记录了每个用户登录的IP地址,请查询共同使用过3个及以上IP的用户对; +---+--------------+-------------------+ | id| ip| etime| +---+--------------+-------------------+ | 2|223.104.41.101|20…...
python学习笔记2
下载安装PyCharm 打开pycharm官网: https://www.jetbrains.com.cn/en-us/pycharm/download/?sectionwindows 找到社区版(免费) 下载之后打开,不停下一步就行 打开pycharm软件后,新建py文件 基本输出:…...
IS-IS的原理
IS-IS的基本概念: 概述: IS-IS,中间系统到中间系统,是ISO国际标准化组织为它的无连接网络协议设计的一种动态路由协议 IS-IS支持CLNP网络和IP网络,采用数据链路层封装,区别于ospf只支持IP网络࿰…...
现代应用程序中基于 Cell 架构的安全防护之道
在飞速发展的软件开发领域,基于 Cell 的架构日益流行起来。其概念源自船舶舱壁的设计准则,即单独的水密舱室能允许故障孤立存在。通过将这个概念应用于软件,我们创建了一个架构,将应用程序划分为离散的、可管理的组件,…...
Rust : 生成日历管理markdown文件的小工具
需求: 拟生成以下markdown管理小工具,这也是我日常工作日程表。 可以输入任意时间段,运行后就可以生成以上的markdown文件。 一、toml [package] name "rust-workfile" version "0.1.0" edition "2021"[d…...
Burp Suite 全面解析:开启你的 Web 安全测试之旅
声明! 学习视频来自B站up主 **泷羽sec** 有兴趣的师傅可以关注一下,如涉及侵权马上删除文章,笔记只是方便各位师傅的学习和探讨,文章所提到的网站以及内容,只做学习交流,其他均与本人以及泷羽sec团队无关&a…...
RocketMQ: 消息积压问题的解决
概述 1 ) 什么是消息积压 在分布式消息系统中,消息积压是指消息生产速度超过消息消费速度,导致未处理的消息在消息队列中累积的现象这种现象可能会导致系统性能下降、资源占用增加,甚至影响系统的正常运行 2 )消息积…...