HarmonyOS Next构建工具 lycium 原理介绍
HarmonyOS Next构建工具 lycium 原理介绍
背景介绍
HarmonyOS Next中很多系统API是以C++接口提供,如果要使用C++接口,必须要使用NAPI在ArkTS与C++间交互,这种场景在使用DevEco-Studio中集成的交叉编译工具,以及cmake构建工具就完全够用了。但是针对一些三方库迁移的场景,比如ffmpeg、openssl等,如果自己配置编译环境和脚本比较麻烦,进行交叉编译的过程中较关注的问题是:不同编译构建方式如何进行交叉编译、不同的编译构建平台如何配置交叉编译的环境、不同的交叉编译架构如何配置以及交叉编译后的产物如何进行测试验证。当前开源的C/C++三方库编译方式多样化,以下为主流的几种交叉编译方式:
- cmake 编译构建。
- configure 编译构建方式。
- make 编译构建。
官方提供了交叉编译构建工具lycium,帮助我们快速构建三方库。
lycium工具介绍
lycium是一款协助开发者通过shell语言实现C/C++三方库快速交叉编译,并在OpenHarmony 系统上快速验证的编译框架工具。开发者只需要设置对应C/C++三方库的编译方式以及编译参数,通过lycium就能快速的构建出能在OpenHarmony 系统运行的二进制文件。
lycium的构建原则是移植过程,不可以改源码(即不patchc/cpp文件,不patch构建脚本)。如移植必须patch,patch必须评审,给出充分理由。(不接受业务patch)
lycium构建工具地址:https://gitee.com/openharmony-sig/tpc_c_cplusplus
使用示例
- 编译环境准备:
lycium
框架支持多种构建方式的三方库,为了保障三方库能正常编译,我们需要保证编译环境中包含以下几个基本编译命令:gcc
,cmake
,make
,pkg-config
,autoconf
,autoreconf
,automake
, 如若缺少相关命令,可通过官网下载对应版本的工具包,也可以在编译机上通过命令安装,如若Ubuntu
系统上缺少cmake
可以通过以下命令安装:sudo apt install cmake
- 修改三方库的编译方式以及编译参数,lycium框架提供了HPKBUILD文件供开发者对相应的C/C++三方库的编译配置。具体方法:
- 在thirdparty目录下新建需要共建的三方库名字pkgname。
- 将HPKBUILD模板文件拷贝到新建三方库目录下。
- 根据三方库实际情况修改HPKBUILD模板,文件修改可参考minizip共建。
- 快速编译三方库:配置完三方库的编译方式参数后,在lycium目录执行./build.sh pkgname,进行自动编译三方库,并打包安装到当前目录的 usr/pkgname/
ARCH 目录./build.sh # 默认编译 thirdparty 目录下的多有库
,也可以:./build.sh aaa bbb ccc ... # 编译 thirdparty 目录下指定的 aaa bbb ccc ...库 当 aaa 库存在依赖时,必须保证入参中包含依赖,否则 aaa 库不会编译
lycium框架是通过linux shell脚本语言编写的,接下来我们分析构建工具的shell代码,理解构建流程,有助于帮助我们定位编译时遇到的失败问题。
构建脚本原理介绍
lycium框架主要由以下几个部分组成:
- HPKBUILD 构建配置
- 顶层构建脚本 build.sh
- 交叉编译工具链
- 测试验证环境
构建流程
1. 构建配置准备
开发者需要在 thirdparty 目录下为待编译的三方库创建目录,并编写 HPKBUILD 构建配置文件。HPKBUILD 文件定义了:
- 源码获取方式
- 编译参数配置
- 依赖关系声明
- 安装规则
HPKBUILD构建配置文件示例:
# Contributor: Jeff Han <hanjinfei@foxmail.com>
# Maintainer: Jeff Han <hanjinfei@foxmail.com>
pkgname=FFmpeg
pkgver=n6.0
pkgrel=0
pkgdesc="FFmpeg is a collection of libraries and tools to process multimedia content such as audio, video, subtitles and related metadata."
url="https://github.com/FFmpeg/FFmpeg/"
archs=("armeabi-v7a" "arm64-v8a")
license=("GPL2" "GPL3" "LGPL3" "MIT" "X11" "BSD-styl")
depends=("rtmpdump" "openssl_1_0_2u")
makedepends=()
source="https://github.com/FFmpeg/$pkgname/archive/refs/tags/$pkgver.tar.gz"autounpack=false
downloadpackage=true
buildtools="configure"builddir=$pkgname-${pkgver}
packagename=$builddir.tar.gz
source envset.sh
buildhost=true
arch=
ldflags=prepare() {if [ "$LYCIUM_BUILD_OS" == "Linux" ]thenhostosname=linuxelif [ "$LYCIUM_BUILD_OS" == "Darwi" ]thenhostosname=darwinelseecho "System cannot recognize, exiting"return -1fiif [ $buildhost == true ]thentar -zxf $packagenamecd $builddir./configure --enable-static --enable-shared --disable-doc --disable-htmlpages \--target-os=$hostosname --disable-optimizations --prefix=`pwd`/hostbuild > $publicbuildlog 2>&1$MAKE >> $publicbuildlog 2>&1$MAKE install >> $publicbuildlog 2>&1export LD_LIBRARY_PATH=`pwd`/hostbuild/lib:$LD_LIBRARY_PATHsed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/source.mak/#include $(SRC_PATH)\/tests\/fate\/source.mak/g' tests/Makefile$MAKE check >> $publicbuildlog 2>&1ret=$?buildhost=falsecd $OLDPWDfimkdir $pkgname-$ARCH-buildtar -zxf $packagename -C $pkgname-$ARCH-buildcd $pkgname-$ARCH-build/$builddirpatch -p1 < ../../FFmpeg_oh_test.patchcd $OLDPWDif [ $ARCH == "armeabi-v7a" ]thensetarm32ENVarch=armldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/arm-linux-ohos"elif [ $ARCH == "arm64-v8a" ]thensetarm64ENVarch=aarch64ldflags="-L${OHOS_SDK}/native/sysroot/usr/lib/aarch64-linux-ohos"elseecho "${ARCH} not support"return -1fireturn $ret
}build() {cd $pkgname-$ARCH-build/$builddirPKG_CONFIG_LIBDIR="${pkgconfigpath}" ./configure "$@" --enable-neon --enable-asm --enable-network \--disable-vulkan --enable-cross-compile --enable-librtmp --disable-x86asm --enable-openssl --enable-protocols \--enable-static --enable-shared --disable-doc --disable-htmlpages --target-os=linux --arch=$arch \--cc=${CC} --ld=${CC} --strip=${STRIP} --host-cc="${CC}" --host-ld="${CC}" --host-os=linux \--host-ldflags=${ldflags} --sysroot=${OHOS_SDK}/native/sysroot > $buildlog 2>&1$MAKE >> $buildlog 2>&1ret=$?cd $OLDPWDreturn $ret
}package() {cd $pkgname-$ARCH-build/$builddir$MAKE install >> $buildlog 2>&1cd $OLDPWD
}checktestfiles() {cd $pkgname-$ARCH-build/$builddir/tests/reftmpdir=("fate" "acodec" "lavf" "lavf-fate" "pixfmt" "seek" "vsynth")for dir in ${tmpdir[*]}dofor file in `ls $dir`doif [ ! -f $dir/$file ]; thencontinuefistr=`cat $dir/$file | grep "\*tests"`if [ ! -z "$str" ]thensed -i.bak 's/\*tests/tests/g' $dir/$filefidonedonecd $OLDPWD
}copyhostbin() {file=$1if [[ -f tests/$file ]] && [[ ! -f tests/$file.${ARCH} ]]thenmv tests/$file tests/$file.${ARCH}cp ../../$builddir/tests/$file tests/$filefi
}check() {cd $pkgname-$ARCH-build/$builddir# disable running cmdsed -i.bak 's/ $(Q)$(SRC_PATH)\/tests\/fate-run.sh/# $(Q)$(SRC_PATH)\/tests\/fate-run.sh/g' tests/Makefile# disable check git sourcessed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/source.mak/#include $(SRC_PATH)\/tests\/fate\/source.mak/g' tests/Makefile# disable check ffprobe,this use xmllint command, which ohos is not supportsed -i.bak 's/include $(SRC_PATH)\/tests\/fate\/ffprobe.mak/#include $(SRC_PATH)\/tests\/fate\/ffprobe.mak/g' tests/Makefile# change x86 cmd for generate test targetmv ffmpeg ffmpeg.${ARCH}cp ../../$builddir/ffmpeg ./retrytimes=0ret=0while truedo$MAKE check >> $buildlog 2>&1if [ $? -eq 0 ]thenbreak;ficopyhostbin base64copyhostbin audiomatchcopyhostbin audiogencopyhostbin videogencopyhostbin tiny_psnrcopyhostbin tiny_ssimcopyhostbin rotozoomlet retrytimes=$retrytimes+1if [ $retrytimes -gt 4 ]thenret=1breakfidonemv ffmpeg.${ARCH} ffmpegfor file in `ls tests/*.${ARCH}`dotmpfile=${file%.*}mv $file $tmpfiledone# reduction running cmd for real testsed -i.bak 's/# $(Q)$(SRC_PATH)\/tests\/fate-run.sh/ $(Q)$(SRC_PATH)\/tests\/fate-run.sh/g' tests/Makefilecd $OLDPWDchecktestfilesecho "The test must be on an OpenHarmony device!"# skip running test on host# real test CMD# make checkreturn $ret
}recoverpkgbuildenv() {unset archunset ldflagsif [ $ARCH == "armeabi-v7a" ]thenunsetarm32ENVelif [ $ARCH == "arm64-v8a" ]thenunsetarm64ENVelseecho "${ARCH} not support"return -1fi
}# 清理环境
cleanbuild() {rm -rf ${PWD}/${builddir} ${PWD}/$pkgname-arm64-v8a-build ${PWD}/$pkgname-armeabi-v7a-build #${PWD}/$packagename
}
2. 构建过程
主入口 build.sh 脚本执行以下步骤:
- 解析命令行参数,确定要编译的目标库
- 检查编译环境(编译工具链等)
- 读取目标库的 HPKBUILD 配置
- 按照依赖关系顺序编译各个库
- 对每个库执行:
- 获取源码
- 配置编译参数
- 执行编译
- 安装到指定目录
检查编译环境代码:
# 检测操作系统类型
unames=`uname -s`
osname=${unames:0:5}# 设置根目录
LYCIUM_ROOT=$(cd $(dirname ${BASH_SOURCE[0]}); pwd)# 检查 OHOS_SDK 环境
if [ -z ${OHOS_SDK} ]
thenecho "OHOS_SDK 未设置..."exit 1
fi
依赖管理检测:
# 依赖库暂存文件
depend_tmp_file="/tmp/$USER-lycium_deps-$build_time"
export LYCIUM_DEPEND_PKGNAMES=$depend_tmp_file# 已完成库列表
donelist=()
donelibs=()
核心函数 buildhpk() 实现了构建流程控制:
- 任务分轮次执行
- 处理依赖关系
- 错误处理机制
主要变量:
- nextroundlist: 下一轮待构建项目
- notdonelist: 未完成项目列表
- buildfalselist: 构建失败项目列表
关键函数说明如下:
checkbuildenv()
检查必要的构建工具是否安装:
-
gcc, cmake, make 等基础工具
-
autoconf, automake 等自动化工具
-
git, curl 等辅助工具 prepareshell()
为每个构建目录准备必要的脚本: -
build_hpk.sh: 项目构建脚本
-
envset.sh: 环境设置脚本 makelibsdir()
管理构建目录: -
检查目录有效性
-
过滤已构建项目
-
添加到构建队列
3. 交叉编译支持
框架通过以下方式实现交叉编译:
- 使用 OpenHarmony NDK 提供的交叉编译工具链
- 在 HPKBUILD 中配置交叉编译相关参数
- 支持 arm32/arm64/x86 等多架构编译
4. 产物输出
编译产物按照如下结构组织:
usr/└── ${pkgname}/└── ${ARCH}/├── lib/ # 库文件├── include/ # 头文件└── bin/ # 可执行文件
build_hpk.sh构建脚本说明
核心构建函数说明:
1. prepare()
准备构建环境:
- 宿主机构建(buildhost=true时)
- 解压源码包
- 应用补丁
- 设置交叉编译环境
2. build()
执行构建过程:
- 配置构建参数
- 执行configure配置
- 执行make编译
- 返回构建结果
3. package()
安装打包:
- 执行make install
- 生成最终安装包
4. check()
测试验证:
- 修改测试配置
- 准备测试环境
- 执行测试用例
- 处理测试结果
5. 环境管理函数
- recoverpkgbuildenv()
- 清理编译环境变量
- 恢复原始环境
- cleanbuild()
- 清理构建目录
- 删除临时文件
总结
本文介绍了HarmonyOS Next跨平台构建脚本功能、使用、以及原理,介绍了构建脚本相关的shell代码等。
相关文章:
HarmonyOS Next构建工具 lycium 原理介绍
HarmonyOS Next构建工具 lycium 原理介绍 背景介绍 HarmonyOS Next中很多系统API是以C接口提供,如果要使用C接口,必须要使用NAPI在ArkTS与C间交互,这种场景在使用DevEco-Studio中集成的交叉编译工具,以及cmake构建工具就完全够用…...
蓝桥杯例题一
不管遇到多大的困难,我们都要坚持下去。每一次挫折都是我们成长的机会,每一次失败都是我们前进的动力。路漫漫其修远兮,吾将上下而求索。只有不断努力奋斗,才能追逐到自己的梦想。不要害怕失败,害怕的是不敢去尝试。只…...
MySQL可直接使用的查询表的列信息
文章目录 背景实现方案模板SQL如何查询列如何转大写如何获取字符位置如何拼接字段 SQL适用场景 背景 最近产品找来,想让帮忙出下表的信息,字段驼峰展示,每张表信息show create table全部展示,再逐个粘贴,有点太耗费时…...
输入网址到网页显示,发生了什么--讲述
输入www.baidu.com作为网址, 孤身的人-HTTP 浏览器要做的第一步就是 解析URL,根据url里面的资源路径,确认服务器资源和路径,生成http请求消息,包括请求消息(请求行 消息头 请求体) 举例&am…...
npm install 报错:Command failed: git checkout 2.2.0-c
[TOC](npm install 报错:Command failed: git checkout 2.2.0-c) npm install 报错:Command failed: git checkout 2.2.0-c export NODE_HOME/usr/local/node-v14.14.0-linux-x64 npm config set registry https://registry.npmmirror.com 使用如上环…...
[Day 15]54.螺旋矩阵(简单易懂 有画图)
今天我们来看这道螺旋矩阵,和昨天发的题很类似。没有技巧,全是循环。小白也能懂~ 力扣54.螺旋矩阵 题目描述: 给你一个 m 行 n 列的矩阵 matrix ,请按照 顺时针螺旋顺序 ,返回矩阵中的所有元素。 示例 1: …...
react antd点击table单元格文字下载指定的excel路径
在使用 Ant Design (antd) 的 Table 组件时,如果想点击表格单元格中的文字来触发下载指定路径的 Excel 文件,可以通过以下步骤实现: 1. 确保有一个可供下载的 Excel 文件:需要有一个服务器端点或者一个可以直接访问的 URL…...
什么是数据结构
数据结构 如何有效的存储数据。 数据存储方式 物理结构又称存储结构 在内存中存储状态,数据可以选择集中存放(顺序存储结构),也可以选择分散存放(链式存储结构)。 逻辑结构 数据之间的逻辑关系&#…...
把 PVE 下的机械硬盘(非SSD系统盘)分配给虚拟机使用
PVE 挂在硬盘 参考 Ubuntu 24.04 LTS 空闲硬盘挂载到 文件管理器的 other locations。 在 PVE shell 中根据上面教程挂在硬盘 新建分享目录 参考 Proxmox VE(PVE)添加硬盘做存储 虚拟机新增硬盘 虚拟机 关机,按下图新增硬盘 新增硬盘…...
HTML5 Web Worker 的使用与实践
引言 在现代 Web 开发中,用户体验是至关重要的。如果页面在执行复杂计算或处理大量数据时变得卡顿或无响应,用户很可能会流失。HTML5 引入了 Web Worker,它允许我们在后台运行 JavaScript 代码,从而避免阻塞主线程,保…...
把网站程序数据上传到服务器的方法和注意事项
将网站程序数据上传到服务器是一个常见的网站开发和部署流程。主要涉及到FTP上传、FileZilla、rsync(在Linux下)、或其他相关的文件同步工具。以下是一般步骤和方法: 使用FTP: 1. 选择FTP客户端软件: - 常见的FTP客户端包括FileZilla(开源)、…...
YOLOv5训练自己的数据及rknn部署
YOLOv5训练自己的数据及rknn部署 一、下载源码二、准备自己的数据集2.1 标注图像2.2 数据集结构 三、配置YOLOv5训练3.1 修改配置文件3.2 模型选择 四、训练五、测试六、部署6.1 pt转onnx6.2 onnx转rknn 七、常见错误7.1 训练过程中的错误7.1.1 cuda: out of memory7.1.2 train…...
李沐vscode配置+github管理+FFmpeg视频搬运+百度API添加翻译字幕
终端输入nvidia-smi查看cuda版本 我的是12.5,在网上没有找到12.5的torch,就安装12.1的。torch,torchvision,torchaudio版本以及python版本要对应 参考:https://blog.csdn.net/FengHanI/article/details/135116114 创…...
Python 在Word中添加、或删除超链接
在Word文档中,超链接是一种将文本或图像连接到其他文档、网页或同一文档中不同部分的功能。通过添加超链接,用户可以轻松地导航到相关信息,从而增强文档的互动性和可读性。本文将介绍如何使用Python在Word中添加超链接、或删除Word文档中的超…...
在K8S中使用Values文件定制不同环境下的应用配置详解
在Kubernetes(简称K8s)环境中,应用程序的配置管理是一项关键任务。为了确保应用程序在不同环境(如开发、测试、预发布和生产)中都能稳定运行,我们需要为每个环境定制相应的配置。Values文件是在使用Helm管理…...
elementUI Table组件实现表头吸顶效果
需求描述 当 table 内容过多的时候,页面上滑滚动,表头的信息也会随着被遮挡,无法将表头信息和表格内容对应起来,需要进行表头吸顶 开始编码💪 环境:vue2.6、element UI step1: 给el-table__h…...
JS-Web API -day06
一、正则表达式 正则表达式测试工具: http://tool.oschina.net/regex 1.1 正则表达式介绍与语法 正则表达式: 正则表达式(Regular Expression)是用于匹配字符串中字符组合的模式。在 JavaScript中,正则表达式也是对象。通常用来查…...
qml MenuItem详解
1、概述 MenuItem 是 QML(Qt Modeling Language)中用于表示菜单项的组件。它通常作为 Menu 组件的子项出现,用于提供用户可点击的菜单选项。MenuItem 可以包含文本、图标,甚至可以是其他 MenuItem 或 Menu 的容器,从而…...
汇编实验·系统调用
一、实验目的: 1.掌握基于特定操作系统中调用API或者SYSTEMCALL的基本方法。 2.进一步理解高级语言中函数调用的相关规定和约定(stdcall,cdec,fastcall等) 3.IA-32架构下API参数在汇编中的实现方式和约定。 二、实验内容 1.在课程设定的VS2022社区版的汇编开发环境下,完…...
ubuntu调用图形化网络测试工具
在 Ubuntu 中,除了命令行工具外,还有一些图形化的网络测试工具可以帮助你更直观地测试和分析网络性能。以下是几款常用的图形化网络测试工具及其使用方法: 1. gnome-nettool gnome-nettool 是一个简单的图形化网络工具集,包含 pi…...
【Qt】05-菜单栏
做菜单 前言一、创建文件二、菜单栏 QMenuBar2.1 示例代码2.2 运行结果 三、工具栏 QToolBar3.1 运行代码3.2 结果分析 四、状态栏 QStatusBar4.1 运行代码4.2 运行结果 五、文本编辑框 QTextEdit5.1 运行代码5.2 运行结果 六、浮动窗口 addDockWidget6.1 运行代码6.2 运行结果…...
Git知识分享
一、理解git首先要理清楚下面五个概念: 1、工作区(git add 命令之前的样子) 2、stash 暂存(暂存工作区和暂存区的更改) 3、暂存区(git add 命令之后的存储区, 4、本地仓库(git commit提交的位置) 5、远程仓库(git push提交的位置) 二、git常用命令: 1、g…...
细说STM32F407单片机电源低功耗StandbyMode待机模式及应用示例
目录 一、待机模式基础知识 1、进入待机模式 2、待机模式的状态 3、退出待机模式 二、待机模式应用示例 1、示例功能和CubeMX项目设置 (1) 时钟 (2) DEBUG、LED1、KeyRight、USART6、CodeGenerator (3&#x…...
独立站运营新突破:Clock斗篷技术助力商家降本增效
一、引言 在当今竞争激烈的电商市场中,独立站运营已成为众多商家拓展业务、打造品牌的重要途径。然而,推广成本高企一直是困扰独立站商家的难题。许多商家在推广过程中,由于缺乏有效的策略,往往面临高昂的费用和有限的回报。但事实…...
【python】subprocess.Popen执行adb shell指令进入linux系统后连续使用指令,出现cmd窗口阻塞问题
问题描述 subprocess.Popen执行adb shell指令进入linux系统后出现cmd窗口阻塞问题,需要手动关闭cmd才会继续执行其他指令。 解决方案 1、cmd指令后面加入exit\n关闭exe进程 2、subprocess.Popen()添加内置参数creationflagssubprocess.CREATE_NO_WINDOW隐藏窗口弹…...
10天学会flutter DAY2 玩转dart 类
print(point.y); * 使用 ?. 代替. 可以避免因为左边表达式为null 而导致的问题 (这个是flutter 2.0 之后新增的空认证功能)print(point?.x); print(point?.y); * 如下代码所示p1.y 6; **setter** 写入方法, print(p1.y); **getter** 读取方法p1.y 6; print(p1.y); […...
【C++】string类模拟实现
目录 💕1.模拟string类构造函数 💕2.模拟构造函数实现 💕3.拷贝构造函数模拟实现 💕4.析构函数模拟实现 💕5.size函数,capacity函数模拟实现 💕6.begin函数,end函数,模拟实…...
2025发文新方向:AI+量化 人工智能与金融完美融合!
2025深度学习发论文&模型涨点之——AI量化 人工智能的融入,使量化交易实现了质的突破。借助机器学习、深度学习等先进技术,人工智能可高效处理并剖析海量市场数据,挖掘出数据背后错综复杂的模式与趋势,从而不仅提升了数据分析…...
eniops库中reduce函数使用方法
reduce 是 eniops 中的一个常用函数,用于对张量进行降维操作。它允许你通过指定维度名称和操作类型(如求和、均值等)来简化张量的形状。 import eniops import torch# 创建一个示例张量 x torch.randn(2, 3, 4)# 使用 reduce 进行降维操作 …...
第03章 02 VTK中的智能指针
在VTK(Visualization Toolkit)中,智能指针用于管理对象的生命周期,避免内存泄漏和悬空指针等问题。VTK提供了几种不同类型的智能指针,包括vtkNew、vtkSmartPointer和vtkWeakPtr。以下是它们的区别和作用: …...
03垃圾回收篇(D4_彻底理解GC)
目录 一、浅析大促备战过程中出现的 fullGc,我们能做什么? 1. 什么是 JVM 的 GC? 2. 写代码的时候能做什么? 3. 测试能做啥 4. 知识小结 二、MinorGC、MajorGC、FullGC垃圾回收介绍 1. MinorGC (新生代垃圾回收)…...
C语言小项目——通讯录
功能介绍: 1.联系人信息:姓名年龄性别地址电话 2.通讯录中可以存放100个人的信息 3.功能: 1>增加联系人 2>删除指定联系人 3>查找指定联系人的信息 4>修改指定联系人的信息 5显示所有联系人的信息 6>排序(名字&…...
MyBatis和JPA区别详解
文章目录 MyBatis和JPA区别详解一、引言二、设计理念与使用方式1、MyBatis:半自动化的ORM框架1.1、代码示例 2、JPA:全自动的ORM框架2.1、代码示例 三、性能优化与适用场景1、MyBatis:灵活的SQL控制1.1、适用场景 2、JPA:开发效率…...
【理论】测试开发工程师进阶路线
一、腾讯与阿里的质量保证服务参考 阿里云效测试能力与架构 腾讯 WeTest 测试能力全景图 二、测试开发技术体系 1.用户端测试: Web/App 测试 Web/App 自动化测试 用户端专项测试 用户端安全测试 2.服务端测试: 接口协议与 Mock 接口自动化测试 服务端…...
能源新动向:智慧能源平台助力推动新型电力负荷管理系统建设
背景 国家能源局近日发布《关于支持电力领域新型经营主体创新发展的指导意见》,鼓励支持具备条件的工业企业、工业园区等开展智能微电网建设,通过聚合分布式光伏、分散式风电、新型储能、可调节负荷等资源,为电力系统提供灵活调节能力&#x…...
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理
WPF基础 | 深入 WPF 事件机制:路由事件与自定义事件处理 一、前言二、WPF 事件基础概念2.1 事件的定义与本质2.2 常见的 WPF 事件类型 三、路由事件3.1 路由事件的概念与原理3.2 路由事件的三个阶段3.3 路由事件的标识与注册3.4 常见的路由事件示例 四、自定义事件处…...
CAP原则中的P:分区容错性(Partition tolerance)
CAP 理论概述 在分布式系统中,系统面临三大核心问题: 一致性(Consistency):所有节点的数据始终保持一致。可用性(Availability):系统始终能够响应请求,无论请求是否成功…...
校验收货地址是否超出配送范围实战3(day09)
优化用户下单功能,加入校验逻辑,如果用户的收货地址距离商家门店超出配送范围(配送范围为5公里内),则下单失败。 提示: 1. 基于百度地图开放平台实现(https://lbsyun.baidu.com/)…...
【二叉树的深搜】二叉树剪枝
文章目录 814. 二叉树剪枝解题思路:深度优先遍历 后序遍历另一种写法 814. 二叉树剪枝 814. 二叉树剪枝 给你二叉树的根结点 root ,此外树的每个结点的值要么是 0 ,要么是 1 。 返回移除了所有不包含 1 的子树的原二叉树。 节点…...
Java 大视界 -- Java 大数据中的数据脱敏技术与合规实践(60)
💖亲爱的朋友们,热烈欢迎来到 青云交的博客!能与诸位在此相逢,我倍感荣幸。在这飞速更迭的时代,我们都渴望一方心灵净土,而 我的博客 正是这样温暖的所在。这里为你呈上趣味与实用兼具的知识,也…...
k8s优雅重启
理论上处于terminating状态的pod,k8s 就会把它从service中移除了,只用配置一个优雅停机时长就行了。kubectl get endpoints 验证 简介 使用kubernetes启动容器时,一般都会配置一些探针来保证pod的健康,并通过terminationGracePe…...
RK3568上电启动流程详解.2 [十五]
这里我们再深入分析一下 U-Boot 启动 Kernel 的过程。 我们首先需要从 eMMC 的 boot partition 中加载 kernel Image,kernel dtb 以及 Ramdisk: > mmc partPartition Map for MMC device 0 -- Partition Type: EFIPart Start LBA End L…...
仅仅4M!windows系统适用,免费无限制使用!
软件介绍 在日常生活里,我们经常会碰到电脑运行迟缓、网速卡顿的现象,却又不清楚是哪个程序在占用过多资源。这种时候,一款能实时监测网络和系统状态的工具就变得非常关键了。今天呢,就给大家介绍一个小巧又实用的监控工具——「T…...
SOME/IP服务接口
本系列文章将分享我在学习 SOME/IP 过程中积累的一些感悟,并结合 SOME/IP 的理论知识进行讲解。主要内容是对相关知识的梳理,并结合实际代码展示 SOME/IP 的使用,旨在自我复习并与大家交流。文中引用了一些例图,但由于未能找到原作…...
计算机网络之网络层
本文章目录结构出自于《王道计算机考研 计算机网络_哔哩哔哩_bilibili》 03 网络层 在网上看到其他人做了相关笔记,就不再多余写了,直接参考着学习吧。 1 详解网络层-网络层概述和编址【王道计算机网络笔记】_wx63088f6683f8f的技术博客_51CTO博客 2 …...
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:…...