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

WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术

一、背景&现状

创作者服务平台作为得物为社区创作者提供的PC端视频发布入口,地位非常重要。且随着功能的升级迭代,用户群体也越来越多。但我们偶尔会收到如下反馈:

  • 视频损坏,无法播放
  • 视频模糊
  • 曝光度问题
  • 黑屏,只有声音,没有画面

黑屏.jpeg
黑屏,无法播放

低清晰度.jpeg
低清晰度

曝光异常.jpeg
曝光异常

黑屏只有声音.jpeg
黑屏,只有声音

视频的损坏不仅影响用户体验,还可能导致忠诚用户的流失。用户在浏览时看到错误反馈或者无法播放的视频,容易产生挫败感。

第二,流量的上涨导致此类case越来越多,据统计,自2024年4月份开始,通过创作者平台发布的视频可分发视频量较之前上涨多倍。

为提升视频发布的质量和用户体验,视频发布前的检测能力需尽快落地。

二、业界的做法

在视频内容平台兴盛的今天,视频上传和检测方面已经有了一些有力措施,以确保用户上传的视频质量,最大程度地减少损坏视频对用户体验和平台形象的影响,比如服务端检测,创作者在上传完视频后,会立即触发服务端检测功能,经过等待后会反馈给用户信息,不强卡发布。

这一方案是可行的,但也存在些弊端:

  • 需要视频上传完成才能拿到完整的文件流进行检测,通常在PC上传的视频文件很大,要等到传完作者才能知道自己的视频有问题,然后再上传,再检测
  • 帖子发布时间拉长,增加创作者的等待,从心智上会影响创作者的体验
  • 带宽成本

但这一方案有个优秀的点,如对涉黄、涉恐等元素的视频,能同时被检测到并且禁止分发。

三、得物音视频团队的方案

目前得物音视频团队在上传前的预检测这种场景下已有了一套较为完善的方案,那就是使用C+ffmpeg编写好检测代码后再通过Emscripten工具将其打包成WebAssembly的二进制文件使代码运行在web端。

音视频团队的方案.jpeg

目前这个方案的核心检测能力已应用在得物App发布工具场景使用,其能通过ffmpeg解析视频的元数据,获取其基本信息,如视频尺寸,码率等,能查找目标视频下的视频流,对音频和视频的AVPacket进行验证,检测文件是否损坏,时间轴是否存在异常等等。正常的流程如下:

正常的流程如下.jpeg

经过此过程的检测,我们可以排除绝大多数文件格式存在问题的视频文件,下面列出一些常见的文件结构存在问题或者格式不合规的视频:

1.文件的moov不存在

https://videocdn.poizon.com/creator/og/2386746172_96421a9fd8662a848fef2a62ffbc1e63_1730287081103_dur1208dur_w1080h1920.mp4

moov不存在.jpeg

2.视频帧的NAL结构异常

https://videocdn.poizon.com/creator/og/2376721105_6dc8f934807c2b62b2261227d2b6699b_1730284366880_dur27dur_w720h1280.mp4

NAL结构异常.jpeg

3.没有视频轨道

https://videocdn.poizon.com/app/sns-og/2024/video/1753839080_byte588513_dur35786_ed63cbac543fdbfe1d8afc098a5be0c6_1729117036244_du_android_w480h480.mp4

没有视频轨道.jpeg

除了可以检测视频文件是否存在问题之外,我们还可以通过预检测获取大量的视频相关的信息:

1.视频的基本信息

  • 宽高、帧率(是否是动态帧率)、码率
  • 旋转角度

2.色域信息

  • 是否是HDR、DP3色域
  • 是8bit/10bit/12bit/16bit

3.视频编码附加信息

  • 当前的视频是否是从其他平台上搬运而来的?
  • 当前的视频是否使用其他的剪辑工具导出的?
  • 我们可以通过识别视频中的metadata中的信息来分析当前的视频来自哪些平台的:

来自抖音.jpeg
来自抖音

来自微信.jpeg
来自微信

来自快手.jpeg
来自快手

综上所述,我们在上传前预检测阶段,可以得到视频的很多信息 + 检测视频是否存在结构问题和格式问题。

四、我们需要解决的问题

虽然整体链路方案非常完善,但是SDK实际落地到web端运行还存在一些问题。

内存泄漏

我们先做个压力测试,在不刷新页面的情况,看下网页端内存如何变化:

1.准备32个50MB以内的小视频,1个800MB的大视频,内存采样为每3s采样一次

2.通过一个个上传,内存占用一直在上升,当传入800MB视频进行检测时,内存占用直接飙升至3G,未被正确释放

旧版SDK内存占用情况.jpeg
旧版SDK压力测试内存占用情况

此时控制台报错,内存溢出,页面卡死,用户必须刷新页面才可继续操作。

内存溢出报错.jpeg
控制台内存溢出报错

array异常占用.jpeg
ArrayBuffer异常占用

大视频无法检测

传入1.9GB的视频文件,控制台直接报错,无法申请1.9GB的内存。

大文件传入报错.jpeg
大文件传入报错

检测速度慢

一步步通过裁剪,缩小视频大小,800MB时视频传入检测成功,耗时94630ms。

五、内存优化方案

针对以上问题,我们一个个来看:

内存溢出:先了解下现有代码中内存是如何被分配和销毁的,下面是部分核心代码。

IO核心代码.jpeg
IO核心代码

大致的流程如下:

大致的流程如下.jpeg
通过流程图可见内存已经被正确的申请和释放了,但是实际表现确是申请的内存一直在被占用,所以可能不是代码逻辑问题,在翻阅了wasm官方设计文档时发现一个issue,其中提到了wasm内存设计方案存在几个问题(该issue还处于open状态):

wasm内存设计问题.jpeg
wasm内存设计问题

所以正是由于第2、3点导致了wasm占用的内存只能被扩大,而无法通过释放被缩小,一旦过多的使用malloc内存占用达到wasm的最大内存限制后,申请必将失败,后续的链路也就无法继续了。那么排除其他因素,通过代码验证一下吧,我们只需要将extract_video_data函数修改一下,直接释放掉接收的内存指针指向的内存块:

修改代码片段.jpeg
修改代码片段

依旧还是之前的物料进行压力测试,可见内存整体增长情况态势与之前别无二致,所以基本可以确认,内存一直占用的问题是wasm底层Memory的设计导致的,所以malloc函数我们肯定是用不了了。

验证内存采集.jpeg
验证内存采集

大视频无法检测:通过分析"IO核心代码"一图可以看到,视频文件是转成ArrayBuffer后通过forEach把一个个的字节塞入了提前申请好的内存中来实现数据传递的,这种方案存在两个问题:

  1. 效率低,不考虑文件转ArrayBuffer的时间,光遍历动不动就上百兆量级的buffer需要的时间都是巨量的,经过测试800MB文件想要全部转化为Uint8ClampedArray,然后写入到wasm内存中耗时大约在14秒左右,这就是导致检测速度慢的一个原因。

  2. ArrayBuffer的size是存在最大限制的,以chrome为例,这个限制是2GB,导致在js侧检测视频理论大小限制为了2GB,wasm侧最大可申请内存也存在限制,大约在1.6GB左右。在使用malloc申请到内存空间后又将其传入avio_alloc_context,avio_alloc_context内部将再次申请buffer_size大小的内存空间进行数据缓存, 从而导致实际检测视频最大为800MB。

所以ArrayBuffer这种方案是不能使用的,天然存在限制。那么到此问题原因都找到了,归根结底都出在文件的IO上,那么是否可以换一种思路,如果不需要任何的数据格式的转换,使wasm环境下的ffmpeg直接读取到文件这样肯定是最省时且高效的。那么ffmpeg能直接读取文件吗,答案是肯定的。

答案是肯定的.jpeg

avformat_open_input可以传入文件路径并能将AVFormatContext自动分配并写入ps。意思是只要能拿到目标文件的文件路径,就能直接调用avformat_open_input读取文件到IOContext,省去了将数据手动塞入IOContext的逻辑,也就意味着能绕过多余的内存的申请和释放,且不再需要进行数据格式的转换,可是怎样才能拿到目标文件路径呢?

因为SDK的运行环境是在web端,web端想要访问本地文件只能通过file类型的input拿到文件对象,那传入blobUrl行不行呢,经过测试,传入blobUrl会报Permission denied 无权限的错误,因为wasm的文件系统有自己的特殊实现,其并不能与JavaScript 直接进行交互,读取文件需要通过nodefs.js,idbfs.js,workerfs.js,proxyfs.js这几个js分别构造的虚拟文件系统才行,其分别是:

  • NODEFS,在node环境中使用的文件系统
  • IDBFS,在web浏览器中可使用的文件系统,强依赖IndexedDB
  • WORKERFS,工作在web浏览器,且只能运行在webWorker中的文件系统
  • PROXYFS,允许通过代理的方式访问本地文件系统或远程文件系统,主要用于将文件操作传递到JavaScript中的其他实现。这种机制使得WebAssembly模块能够与JavaScript代码进行交互,进而访问不同的文件系统或数据源

由此看来想要提供给avformat_open_input目标文件的路径,我们还需将目标文件挂载到一个虚拟文件系统中。那么该如何选择呢?

因为我们的SDK是需要运行在web浏览器中,那么NODEEFS首先就被排除掉了,其次视频的读取检测属于计算密集型任务,是需要运行在webWorker中的,所以WORKERFS与我们的使用场景更加契合,他提供对webWorker中的file和Blob对象的只读访问,而无需将整个数据复制到内存中,非常适合对大型文件的读取,也满足了我们对于快速读取和内存占用少的要求,简直完美。

那么说干就干,webWorker + WORKERFS的方案需要对打包命令和代码进行改造。首先启用WORKERFS需要在wasm的打包命令中添加-l workerfs.js参数,并且导出运行时函数WORKERFS,完整命令如下:

emcc -O3 \
-I ${FFMPEG_DIST_DIR}/include \
-L ${FFMPEG_DIST_DIR}/lib -l avcodec -l avformat -l swresample -l avutil -l workerfs.js\
-I ${CJSON_SOURCE_DIR} \
-s EXPORTED_FUNCTIONS="['_get_video_info', '_extract_video_data']" \
-s WASM=1 \
-s ALLOW_MEMORY_GROWTH=1 \
-s EXPORTED_RUNTIME_METHODS=[\"wasmMemory\", \"FS\", \"WORKERFS\", \"ccall\"]"
-fsanitize=address \
-o ${workspaceFolder}/sociality/main.js ${workspaceFolder}/sociality/main.c \
${CJSON_SOURCE_DIR}/cJSON.c ${CJSON_SOURCE_DIR}/cJSON_Utils.c

如果导出成功就能在wasm模块中看到WORKERFS的实例:

worker实例.jpeg

导出成功后想要使用的话只需要在webworker中创建任意文件夹,将目标文件通过mount方法挂载到该文件夹上就行,直接上代码:

webwork使用.jpeg
WORKERFS在Webworker中的使用

然后修改C语言侧extract_video_data方法:

修改c语言侧.jpeg

文件就能正确地被读取和处理了。可见这个方案非常的简洁且省去了巨量的IO操作,效率提升了,但是内存占用问题还存不存在呢,再次跑个压力测试试一试:

老SDK占用情况.jpeg
对比老SDK内存占用情况

用同样的视频物料进行压力测试,得出的内存占用情况如图,可见优化后内存使用在压力测试后一直维持在900MB左右,且继续传入大视频文件不会继续上涨,判断为正常内存占用(绿色线条),检测速度也做了一个粗略的统计,与旧版SDK对比,性能方面,以800MB文件为例,检测时长分别为20s和95s,性能预计提升约78%;2GB视频文件检测时长为61s,对于更大的视频也能轻松应对。至此所有的问题都已解决。目前该功能已上线:得物创作者平台。

六、总结

通过WebAssembly技术的引入与整合,我们在视频损坏检测上迎来了新的机遇。在逐步解决技术挑战的过程中,完善了我们的视频上传流程,并提升了用户体验。展望未来,我们希望继续优化这些功能,确保用户能够在平台上无障碍地上传和分享他们的创作,进一步提升社区的活跃度和用户粘性。

文 / 佳庆&ALBERT

关注得物技术,每周更新技术干货

要是觉得文章对你有帮助的话,欢迎评论转发点赞~

未经得物技术许可严禁转载,否则依法追究法律责任。

相关文章:

WebAssembly视频检测在社区创作平台的落地与实践 | 得物技术

一、背景&现状 创作者服务平台作为得物为社区创作者提供的PC端视频发布入口,地位非常重要。且随着功能的升级迭代,用户群体也越来越多。但我们偶尔会收到如下反馈: 视频损坏,无法播放视频模糊曝光度问题黑屏,只有…...

服务器内部是如何运行的

服务器内部的运行可以从硬件和软件两个方面来解释。 一、硬件层面 服务器的硬件与普通计算机相似,但它通常具有更高的性能和更强的扩展性。服务器硬件包括: 1.中央处理单元(CPU):负责执行服务器上的计算任务。服务器一般配备多核心的高性能CPU,以支持多个请求并行处理…...

mapbox加载geojson,鼠标移入改变颜色,设置样式以及vue中的使用

全国地图json数据下载地址 目录 html加载全部代码 方式一:使用html方式加载geojson 1. 初始化地图 2. 加载geojson数据 设置geojson图层样式,设置type加载数据类型 设置线条 鼠标移入改变颜色,设置图层属性,此处是fill-extru…...

电子应用设计方案102:智能家庭AI鱼缸系统设计

智能家庭 AI 鱼缸系统设计 一、引言 智能家庭 AI 鱼缸系统旨在为鱼类提供一个健康、舒适的生活环境,同时为用户提供便捷的管理和观赏体验。 二、系统概述 1. 系统目标 - 自动维持水质稳定,包括水温、酸碱度、硬度和溶氧量等关键指标。 - 智能投食&…...

ESP8266 OTA固件启动日志里分区解析【2M flash】

ESP8266 启动日志中分区表的内容及其解释 分区表日志: I (136) boot: Partition Table: I (147) boot: ## Label Usage Type ST Offset Length I (170) boot: 0 nvs WiFi data 01 02 00009000 00004000 I (193) boot:…...

dl学习笔记:(7)完整神经网络流程

完整神经网络流程 反向传播链式求导 代码实现反向传播动量法Momentum开始迭代为什么选择小批量TensorDataset与DataLoader 反向传播 由于本节的公式比较多,所以如果哪里写错了漏写了,还请帮忙指出以便进行改正,谢谢。 在前面的章节已经介绍过…...

三分钟简单了解一些HTML的标签和语法_01

1.图片建议建立一个文件夹如下图所示 <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"keywords"><title>魔神羽落</title><style>.testone{background-color: #ff53e…...

C# 中使用Hash用于密码加密

通过一定的哈希算法&#xff08;典型的有MD5&#xff0c;SHA-1等&#xff09;&#xff0c;将一段较长的数据映射为较短小的数据&#xff0c;这段小数据就是大数据的哈希值。他最大的特点就是唯一性&#xff0c;一旦大数据发生了变化&#xff0c;哪怕是一个微小的变化&#xff0…...

【C++高并发服务器WebServer】-2:exec函数簇、进程控制

本文目录 一、exec函数簇介绍二、exec函数簇 一、exec函数簇介绍 exec 函数族的作用是根据指定的文件名找到可执行文件&#xff0c;并用它来取代调用进程的内容&#xff0c;换句话说&#xff0c;就是在调用进程内部执行一个可执行文件。 exec函数族的函数执行成功后不会返回&…...

Linux将目录挂载到另一个目录,类似软硬链接,并通过fstab实现

格式 <源> <目> none bind 0 0例如 /data/var/lib/docker /var/lib/docker none bind 0 0参数使用制表符tab间隔 效果 rootDebian12:~# cat /etc/fstab | grep -v ^# /dev/mapper/Debian12--vg-root / ext4 erro…...

【C++模板】:如何判断自定义类型是否实现某个函数

一、引子 偶尔我们会面对这样的尴尬的场景&#xff0c;我们需要显示的去判断在某个自定义类型中&#xff0c;是否已经提供了我们期待的API接口&#xff0c;以避免产生“莫须有”的错误。阁下该如何破解此问题&#xff01; 这里&#xff0c;直接给出一种通用的方法&#xff0c;…...

关于CAN(FD)转以太网详细介绍

一、功能描述 CANFD 完全向下兼容 CAN &#xff0c;以下统称 CAN(FD) 。 SG-CAN(FD)NET-210 是一款用来把 CANFD 总线数据转为网口数据的设备。 网口支持 TCP Sever 、 TCP Client 、 UDP Sever 、 UDP Client 四种模式。 可以通过软件配置和 Web 网页配置。 两路…...

GPU算力平台|在GPU算力平台部署MedicalGPT医疗大模型的应用教程

文章目录 一、GPU算力服务平台云端GPU算力平台 二、平台账号注册流程MedicalGPT医疗大模型的部署MedicalGPT医疗大模型概述MedicalGPT部署步骤 一、GPU算力服务平台 云端GPU算力平台 云端GPU算力平台专为GPU加速计算设计&#xff0c;是一个高性能计算中心&#xff0c;广泛应用…...

【ChatGPT】意义空间与语义运动定律 —— AI 世界的神秘法则

作者介绍 斯蒂芬•沃尔弗拉姆&#xff08;Stephen Wolfram&#xff09; 计算机科学家、数学家和理论物理学家&#xff0c;当今科学和技术领域重要的革新者之一。他创造了在全世界备受推崇的软件系统——Mathematica、Wolfram|Alpha和Wolfram语言。 在 ChatGPT 内部&#xff0c;…...

Harbor 部署教程

Harbor 部署教程 一.背景二.遇到的问题及解决办法1.服务无法启动,相关的容器不断重启 三.操作步骤1. 创建工作目录并进入2. 配置 Docker 守护进程3. 重启 Docker 服务4. 下载 Harbor 离线安装包和 Docker Compose5. 安装 Docker Compose6. 解压 Harbor 安装包7. 配置 Harbor8. …...

hive 自动检测、自动重启、记录检测日志、自动清理日志

最终效果 定时检测hive运行状态&#xff0c;进程不存在或者进程存在但是不监听端口的hiveserver2&#xff0c;自动重新拉起每次检测脚本执行的日志都会保存在log目录下.check文件&#xff0c;每一个月一个文件每月15日&#xff0c;删除2月前的检测日志开启hive自带日志输出后&…...

C++类和对象下详细指南

C类和对象下详细指南 1. 初始化列表与构造函数 1.1 初始化列表概述 初始化列表在C中用于初始化对象的成员变量&#xff0c;特别是当你需要在对象构造时就明确成员变量的值时。通过初始化列表&#xff0c;成员变量的初始化可以在进入构造函数体之前完成。这不仅可以提升性能&…...

【算法C++】构造回文字符串问题

问题描述 小C手中有一个由小写字母组成的字符串 s。她希望构造另一个字符串 t&#xff0c;并且这个字符串需要满足以下几个条件&#xff1a; t 由小写字母组成&#xff0c;且长度与 s 相同。t 是回文字符串&#xff0c;即从左到右与从右到左读取相同。t 的字典序要小于 s&…...

基于java线程池和EasyExcel实现数据异步导入

基于java线程池和EasyExcel实现数据异步导入 2.代码实现 2.1 controller层 PostMapping("import")public void importExcel(MultipartFile file) throws IOException {importService.importExcelAsync(file);}2.2 service层 Resource private SalariesListener sa…...

使用Layout三行布局(SemiDesign)

tips&#xff1a;Semi Design网址 &#xff1a;Semi Design 1、安装Semi # 使用 npm npm i douyinfe/semi-ui# 使用 yarn yarn add douyinfe/semi-ui# 使用 pnpm pnpm add douyinfe/semi-ui 2、引入Layout布局 import { Layout } from douyinfe/semi-ui;3、开始实现三行布局…...

缓存之美:万文详解 Caffeine 实现原理(下)

上篇文章&#xff1a;缓存之美&#xff1a;万文详解 Caffeine 实现原理&#xff08;上&#xff09; getIfPresent 现在我们对 put 方法有了基本了解&#xff0c;现在我们继续深入 getIfPresent 方法&#xff1a; public class TestReadSourceCode {Testpublic void doRead() …...

PHP防伪溯源一体化管理系统小程序

&#x1f50d; 防伪溯源一体化管理系统&#xff0c;品质之光&#xff0c;根源之锁 &#x1f680; 引领防伪技术革命&#xff0c;重塑品牌信任基石 我们自豪地站在防伪技术的前沿&#xff0c;为您呈现基于ThinkPHP和Uniapp精心锻造的多平台&#xff08;微信小程序、H5网页&…...

STM32——LCD

一、引脚配置 查看引脚 将上述引脚都设置为GPIO_Output 二、导入驱动文件 将 LCD 驱动的 Inc 以及 Src 中的 fonts.h,lcd.h 和 lcd.c 导入到自己工程的驱动文件中。 当然&#xff0c;后面 lcd 的驱动学习可以和 IMX6U 一块学。 三、LCD函数 void LCD_Clear(u16 Color); 功能…...

洛谷刷题1-3

比较巧妙&#xff0c;求最小公倍数&#xff0c;看多少个数一次循环&#xff0c;直接求解就好了&#xff0c;N的数量级比较大&#xff0c;一层循环也会超时&#xff0c;也用了点双指针的想法&#xff08;归并排序&#xff09; 这里很大的问题&#xff0c;主要是cin输入的时候遇到…...

Facebook 元宇宙与全球文化交流的新趋势

随着科技的快速发展&#xff0c;虚拟现实与增强现实技术逐渐成为全球社交平台的重要组成部分。Facebook&#xff08;现改名为 Meta&#xff09;率先将目光投向了元宇宙这一新兴领域&#xff0c;致力于打造一个超越传统社交媒体的虚拟空间&#xff0c;成为全球文化交流的新平台。…...

结构化布线系统分为六个子系统

文章目录 前言系统介绍1. 工作区子系统 (Work Area Subsystem)2. 水平布线子系统 (Horizontal Cabling Subsystem)3. 管理子系统 (Administration Subsystem)4. 干线&#xff08;垂直&#xff09;子系统 (Backbone Cabling Subsystem)5. 设备间子系统 (Equipment Room Subsyste…...

亿坊软件前端命名规范

在前端开发中&#xff0c;文件命名的重要性不言而喻。由于历史原因和个人习惯&#xff0c;不同的开发者在命名DOM结构、图片和CSS文件时&#xff0c;可能会产生不一致的情况。这不仅会导致维护成本增加&#xff0c;还会降低团队协作效率。因此&#xff0c;制定一套统一的命名规…...

单片机-STM32 IIC通信(OLED屏幕)(十一)

一、屏幕的分类 1、LED屏幕&#xff1a; 由无数个发光的LED灯珠按照一定的顺序排列而成&#xff0c;当需要显示内容的时候&#xff0c;点亮相关的LED灯即可&#xff0c;市场占有率很高&#xff0c;主要是用于户外&#xff0c;广告屏幕&#xff0c;成本低。 LED屏是一种用发光…...

【Qt】: QPointer详解

考古&#xff1a; 《Qt智能指针之QScopedPointer》 QPointer是Qt框架中的一个智能指针类&#xff0c;用于安全地管理QObject派生对象的指针。它的主要功能是自动将指针置为nullptr&#xff0c;当它所指向的QObject对象被销毁时。这在Qt应用程序中非常有用&#xff0c;因为QObj…...

15_业务系统基类

创建脚本 SystemRoot.cs 因为 业务系统基类的子类 会涉及资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 所以在业务系统基类 提取引用资源加载服务层ResSvc.cs 和 音乐播放服务层AudioSvc.cs 并调用单例初始化 using UnityEngine; // 功能 : 业务系统基类 public c…...

C++中explicit关键字的介绍和使用详解

某一天突然发现Qt自动生成的类文件的构造函数前边都有explicit关键字&#xff0c;但是explicit关键字什么意思呐&#xff1f; 在C中&#xff0c;explicit是一个关键字&#xff0c;主要用于修饰构造函数或转换运算符&#xff0c;其作用是防止隐式类型转换或隐式构造行为。 下面…...

动态内存管理

本章重点 1.为什么存在动态内存分配 2.动态内存函数的介绍 3.malloc free calloc realloc 4.常见的动态内存错误 一.为什么存在动态内存分配 二.动态内存函数的介绍 #define _CRT_SECURE_NO_WARNINGS #include <stdio.h> #include <stdlib.h> #include &…...

Java 中的各种锁详解

&#x1f9d1; 博主简介&#xff1a;CSDN博客专家&#xff0c;历代文学网&#xff08;PC端可以访问&#xff1a;https://literature.sinhy.com/#/literature?__c1000&#xff0c;移动端可微信小程序搜索“历代文学”&#xff09;总架构师&#xff0c;15年工作经验&#xff0c;…...

进制之间转换

「 一、十进制 二进制 」 1.十进制转二进制&#xff1a;一直除以2直到商为0&#xff0c;再反向取余数。 例&#xff1a;13&#xff08;十进制&#xff09;转1101&#xff08;二进制&#xff09; 2.二进制转十进制:最后一位数开始是2^0&#xff0c;然后一直按照指数递增的方式…...

微信小程序获取位置服务

wx.getLocation({type: gcj02,success(res) {wx.log(定位成功);},fail(err) {wx.log(定位失败, err);wx.showModal({content: 请打开手机和小程序中的定位服务,success: (modRes) > {if (modRes.confirm) {wx.openSetting({success(setRes) {if (setRes.authSetting[scope.u…...

数据结构——实验八·学生管理系统

嗨~~欢迎来到Tubishu的博客&#x1f338;如果你也是一名在校大学生&#xff0c;正在寻找各种编程资源&#xff0c;那么你就来对地方啦&#x1f31f; Tubishu是一名计算机本科生&#xff0c;会不定期整理和分享学习中的优质资源&#xff0c;希望能为你的编程之路添砖加瓦⭐&…...

Linux应用编程(五)USB应用开发-libusb库

一、基础知识 1. USB接口是什么&#xff1f; USB接口&#xff08;Universal Serial Bus&#xff09;是一种通用串行总线&#xff0c;广泛使用的接口标准&#xff0c;主要用于连接计算机与外围设备&#xff08;如键盘、鼠标、打印机、存储设备等&#xff09;之间的数据传输和电…...

Swift语言探索:Sequence与Collection的详细解读

在Swift编程语言中&#xff0c;Sequence和Collection是两个非常重要的协议&#xff0c;它们定义了遍历和访问元素集合的方式。理解这两个协议不仅有助于我们更好地掌握Swift的集合类型&#xff0c;还能让我们在编写代码时更加灵活和高效。本文将详细解读Sequence与Collection&a…...

解锁C# EF/EF Core:从入门到进阶的技术飞跃

一、EF/EF Core 初相识 在.NET 开发的广阔天地中&#xff0c;Entity Framework (EF) 及其轻量级、可扩展、跨平台的版本 Entity Framework Core (EF Core)&#xff0c;犹如两颗璀璨的明星&#xff0c;照亮了数据访问层开发的道路。它们是开源的对象关系映射器&#xff08;ORM&…...

大模型搜广推?对算法工作的影响

大模型与传统应用结合的性质 长期看是一种范式革新。算力和模型定义的边界发生变化&#xff0c;选择生成式AI或大模型发展方向时&#xff0c;会不断发现新的增长曲线&#xff0c;目前在不断被验证。 现阶段大模型确实带来了增量信息&#xff0c;但推荐过程仍在原有流程基础上…...

【教程】最好的pytorch教程

文章目录 Materials for the Learn PyTorch for Deep Learning: Zero to Mastery course from: https://github.com/mrdbourke/pytorch-deep-learning/blob/main/01_pytorch_workflow.ipynb...

基于java线程池和EasyExcel实现异步导出

基于java线程池和EasyExcel实现异步导出 1.controller层 GetMapping("export") public void exportExcel(HttpServletResponse response) throws IOException, InterruptedException {exportService.exportExcel(response); }2. service public void exportExcel(H…...

vue3组件传值具体使用

问&#xff1a; left.vue文件调用接口获取了后端返回的urlLink字段&#xff0c;我该怎么传递给总的父组件index.vue中&#xff0c;我需要点击父组件的一个按钮来触发跳转&#xff1f; 回答&#xff1a; 在 Vue 3 中使用 TypeScript 和 setup 语法糖时&#xff0c;可以通过 e…...

《CPython Internals》阅读笔记:p336-p352

《CPython Internals》学习第 17天&#xff0c;p336-p352 总结&#xff0c;总计 17 页。 一、技术总结 1.GDB GDB 是 GNU Dbugger 的缩写。 (1)安装 sudo apt install gdb(2)创建 .gdbinit 文件 touch ~/.gdbinitvim ~/.gdbinit(3)配置 .gdbinit 文件 add-auto-load-saf…...

WPF基础 | WPF 常用控件实战:Button、TextBox 等的基础应用

WPF基础 | WPF 常用控件实战&#xff1a;Button、TextBox 等的基础应用 一、前言二、Button 控件基础2.1 Button 的基本定义与显示2.2 按钮样式设置2.3 按钮大小与布局 三、Button 的交互功能3.1 点击事件处理3.2 鼠标悬停与离开效果3.3 按钮禁用与启用 四、TextBox 控件基础4.…...

Langchain+讯飞星火大模型Spark Max调用

1、安装langchain #安装langchain环境 pip install langchain0.3.3 openai -i https://mirrors.aliyun.com/pypi/simple #灵积模型服务 pip install dashscope -i https://mirrors.aliyun.com/pypi/simple #安装第三方集成,就是各种大语言模型 pip install langchain-comm…...

2025年华为云一键快速部署幻兽帕鲁联机服务器教程

华为云如何快速部署幻兽帕鲁联机服务器&#xff1f;为了方便新手玩家搭建专属游戏联机服务器&#xff0c;华为云推出了云游戏专场&#xff0c;无需专业技术&#xff0c;新手小白也能一键快速部署幻兽帕鲁联机服务器&#xff01; 华为云快速部署幻兽帕鲁联机服务器教程如下&…...

Langchain+文心一言调用

import osfrom langchain_community.llms import QianfanLLMEndpointos.environ["QIANFAN_AK"] "" os.environ["QIANFAN_SK"] ""llm_wenxin QianfanLLMEndpoint()res llm_wenxin.invoke("中国国庆日是哪一天?") print(…...

C++AVL树(一)详解

文章目录 AVL树概念AVL树的插入平衡因子的更新旋转的规则左单旋右单旋抽象的情况h0h1h 2h 3 AVL树 概念 AVL树是一棵平衡二叉查找树&#xff0c;AVL树是空树&#xff0c;保证左右子树都是AVL树&#xff0c;AVL树要求高度差的绝对值不超过1&#xff0c;因为最好情况是1&#…...

ceph新增节点,OSD设备,标签管理(二)

一、访问客户端集群方式 方式一: 使用cephadm shell交互式配置 [rootceph141 ~]# cephadm shell # 注意&#xff0c;此命令会启动一个新的容器&#xff0c;运行玩后会退出&#xff01; Inferring fsid c153209c-d8a0-11ef-a0ed-bdb84668ed01 Inferring config /var/lib/ce…...