鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗

ninja | 忍者

ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自己的话说是当一个文件被修改后,ninja从发现到编译速度是make的十倍.有没有十倍不是本篇讨论的重点,人家做出来了,就算是牛皮也该人家吹.本篇是要对鸿蒙如何使用ninja做一个比较详细的阐述.

ninja是一个重视速度的构建系统,与其对标的是Make,它们都依赖于文件的时间戳进行检测重编.

  • 它的设计目的是让更高级别的构建系统生成其输入端文件,其并不希望你手动去编.ninja文件,可以生成.ninja的工具有gn,cmake,premake,甚至你自己都可以写个 ninja 生成工具.
  • ninja非常高效,可理解为构建系统中的汇编语言。
  • ninja文件没有分支、循环的流程控制,是被指定了一堆规则的文件,所以要比Makefile简单很多
  • 目前已知的GoogleChromeAndroid的一部分,LLVMV8, 方舟编译器, 鸿蒙 等大型系统都使用到了ninja构建.

基本概念

概念	中译	解释
edge	边      即build语句,指定目标(输出)、规则与输入,是编译过程拓扑图中的一条边(edge)。
target	目标	编译过程需要产生的目标,由build语句指定。
output	输出	build语句的前半段,是target的另一种称呼。
input	输入	build语句的后半段,用来产生output的文件或目标,另一种称呼是依赖。
rule	规则	通过指定command与一些内置变量,决定如何从输入产生输出。
pool	池      一组rule或edge,通过指定其depth,可以控制并行上限。
scope	作用域	变量的作用范围,有rule与build语句的块级,也有文件级别。rule也有scope。
--------------------------------------------------------------------------------------------
关键字	  作用
build	  定义一个edge。
rule	  定义一个rule。
pool	  定义一个pool。
default	  指定默认的一个或多个target。
include	  添加一个ninja文件到当前scope。
subninja  添加一个ninja文件,其scope与当前文件不同。
phony     一个内置的特殊规则,指定非文件的target。

简单的ninja

首先 ninja 一定是简单的,呆板的.凡是能被工具生成的东西,一定是在不断的重复某种简单,众多的简单按一定的规则有效叠加起来就能解决复杂的问题,请仔细想想是不是这个道理.ninja简单到没什么语法,只是几个概念和规则.

看个示例:

cflags = -Wall -Werror  #全局变量
rule cccommand = gcc $cflags -c $in -o $outbuild foo.o: cc foo.cbuild special.o: cc special.ccflags = -Wall #局部变量,范围只在编译special.c上有效

解读

  • cflags:定义一个用户变量,用于给规则传参.
  • rule:定义一个叫cc的规则.
    • command:将生成bash命令,接收外部三个参数
  • 第一个build,将foo.ccc规则编译成foo.o
    • 最终编译选项:gcc -Wall -Werror -c foo.c -o foo.o
  • 第二个build,将special.ccc规则编译成special.o
    • 最终编译选项:gcc -Wall -c foo.c -o foo.o
  • in,outninja的两个内置变量.

phony规则

跟称呼弗拉基米尔·弗拉基米罗维奇·普京普总一样,
有些文件路径会很长,ninja提供取别名的功能,这仅仅是为了方便.

build ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp

有了上面的铺垫,读懂鸿蒙的ninja部分应该没多大障碍了.

鸿蒙 | ninja

在[v60.xx 鸿蒙内核源码分析(gn应用篇) | gn语法及在鸿蒙的使用 ]篇的末尾已说明通过 gn gen生成了以下文件和目录

turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries$ ls
args.gn  build.ninja  build.ninja.d  NOTICE_FILE  obj  test_info  toolchain.ninja
  • args.gn :一些参数
  • build.ninja : ninja的主文件
  • build.ninja.d :记录生成所有.ninja 所依赖的BUILD.gn文件路劲列表,一个BUILD.gn就生成一个.ninja文件
  • obj :各组件模块构建/编译文件输出地.
  • toolchain :放置ninja规则,将被 subninja 进 build.ninja

build.ninja

build.ninja内容如下:

ninja_required_version = 1.7.2rule gncommand = ../../../../tools/gn --root=../../.. -q --dotfile=../../../build/lite/.gn --script-executable=python3 gen .description = Regenerating ninja filesbuild build.ninja: gngenerator = 1depfile = build.ninja.dsubninja toolchain.ninjabuild ability: phony ./libability.so
build ability_notes: phony obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/ability_notes.stamp
build ability_test: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/ability_test.stamp
build ability_test_pageAbilityTest_group_lv0: phony obj/foundation/aafwk/aafwk_lite/services/abilitymgr_lite/unittest/test_lv0/page_ability_test/ability_test_pageAbilityTest_group_lv0.stamp
#此处省略诸多 phony ..build all: phony $./libcameraApp.so $obj/applications/sample/camera/cameraApp/cameraApp_hap.stamp $./libgallery.so $...default all

解读

  • 前面部分是定义一个 gn规则,用于干嘛呢? 重新生成一遍 *ninja文件
  • subninja相当于 #include文件
  • default all,指定默认的一个或多个target

toolchain | 定义规则

toolchain.ninja 定义了编译c,c++,汇编器,链接,静态/动态链接库,时间戳,拷贝等规则. 内容如下:

rule cxxcommand = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}description = clang++ ${out}depfile = ${out}.ddeps = gcc
rule alinkcommand = /root/llvm/bin/llvm-ar -cr ${out} @"${out}.rsp"description = AR ${out}rspfile = ${out}.rsprspfile_content = ${in}
rule linkcommand = /root/llvm/bin/clang ${ldflags} ${in} ${libs}   -o ${output_dir}/bin/${target_output_name}${output_extension}description = LLVM LINK ${output_dir}/bin/${target_output_name}${output_extension}rspfile = ${output_dir}/bin/${target_output_name}${output_extension}.rsprspfile_content = ${in}
rule solinkcommand = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}description = SOLINK ${output_dir}/${target_output_name}${output_extension}rspfile = ${output_dir}/${target_output_name}${output_extension}.rsprspfile_content = ${in}
rule stampcommand = /usr/bin/touch ${out}description = STAMP ${out}
rule asmcommand = /root/llvm/bin/clang ${include_dirs} ${asmflags} -c ${in} -o ${out}description = ASM ${out}depfile = ${out}.ddeps = gcc
rule cccommand = /root/llvm/bin/clang ${defines} ${include_dirs} ${cflags} ${cflags_c} -c ${in} -o ${out}description = clang ${out}
rule copycommand = cp -afd ${in} ${out}description = COPY ${in} ${out}
  • 注意这些规则中的描述description字段,其后面的内容会打到控制台上,每一条输出都是一次 build,如图所示,通过这些描述就知道使用了什么规则去构建.

组件编译

本篇以编译ability组件为例说明 ninja对组件的编译情况.每个组件都有自己的.ninja,描述组件的编译细节.而整个鸿蒙系统就是由众多的类似.ninja构建编译完成的.

├── foundation
│   ├── aafwk
│   │   └── aafwk_lite
│   │       ├── frameworks
│   │       │   ├── ability_lite
│   │       │   │   └── ability.ninja

ability.ninja内容如下:

defines = -DOHOS_APPEXECFWK_BMS_BUNDLEMANAGER \-D_XOPEN_SOURCE=700 -DOHOS_DEBUG \-D_FORTIFY_SOURCE=2 \-D__LITEOS__ -D__LITEOS_A__
include_dirs = -I../../../foundation/aafwk/aafwk_lite/frameworks/abilitymgr_lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/want_lite/include \-I../../../foundation/aafwk/aafwk_lite/interfaces/innerkits/abilitymgr_lite \-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/want_lite \-I../../../foundation/aafwk/aafwk_lite/interfaces/kits/ability_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/utils/bundle_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/interfaces/kits/bundle_lite \-I../../../foundation/appexecfwk/appexecfwk_lite/frameworks/bundle_lite/include \-I../../../foundation/graphic/ui/frameworks -I../../../foundation/graphic/surface/interfaces/kits \-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/registry \-I../../../foundation/distributedschedule/samgr_lite/interfaces/kits/samgr \-I../../../foundation/communication/ipc_lite/frameworks/liteipc/include \-I../../../kernel/liteos_a/kernel/include \-I../../../kernel/liteos_a/kernel/common \-I../../../third_party/bounds_checking_function/include \-I../../../third_party/freetype/include \-I../../../utils/native/lite/kv_store/innerkits \-I../../../utils/native/lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/include \-I../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite \-I/root/llvm/include/c++/v1 \-I../../../prebuilts/lite/sysroot/usr/include/arm-liteos \-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits/hilog \-I../../../base/hiviewdfx/hilog_lite/interfaces/native/innerkits \-I../../../third_party/bounds_checking_function/include \-I../../../third_party/bounds_checking_function/include \-I../../../foundation/communication/ipc_lite/interfaces/kits \-I../../../utils/native/lite/include
cflags = -Wall -Wno-format -Wno-format-extra-args -fPIC \--target=arm-liteos \--sysroot=/home/openharmony/prebuilts/lite/sysroot \-Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -fsigned-char -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fPIC
cflags_cc = -Wall -Wno-format -Wno-format-extra-args -fPIC \--target=arm-liteos \--sysroot=/home/openharmony/prebuilts/lite/sysroot \-Oz -flto -mfloat-abi=softfp -mcpu=cortex-a7 -nostdlib -fno-common -fno-builtin -fno-strict-aliasing -Wall -mno-unaligned-access -fno-omit-frame-pointer -fstack-protector-all -fexceptions -std=c++11 -fPIC
target_output_name = libabilitybuild obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_context.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_env_impl.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_event_handler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_loader.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_main.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_scheduler.cpp
build obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o: cxx ../../../foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/ability_thread.cppbuild ./libability.so: solink \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_context.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_env_impl.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_event_handler.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_loader.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_main.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_scheduler.o \obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite/src/libability.ability_thread.o \./libabilitymanager.so ./libbundle.so ./libhilog_shared.so ./libliteipc_adapter.so \./libsec_shared.so ./libutils_kv_store.so || obj/utils/native/lite/kv_store/kv_store.stampldflags = -lstdc++ \--target=arm-liteos \--sysroot=/home/openharmony/prebuilts/lite/sysroot \-L/root/llvm/lib/arm-liteos/c++ \-L/home/openharmony/prebuilts/lite/sysroot/usr/lib/arm-liteos \-L/root/llvm/lib/clang/9.0.0/lib/arm-liteos \-lclang_rt.builtins -lc -lc++ -lc++abi \--sysroot=/home/openharmony/prebuilts/lite/sysroot \-mcpu=cortex-a7 -lc \-L/home/openharmony/out/hispark_aries/ipcamera_hispark_aries \-Wl,-rpath-link=/home/openharmony/out/hispark_aries/ipcamera_hispark_aries -Wl,-z,now -Wl,-z,relro -Wl,-z,noexecstacklibs =frameworks =output_extension = .sooutput_dir = .

解读

  • defines,include_dirs,cflags_cc都是用户自定义变量,为了给 rule cxx准备参数,对.cpp的编译使用了这个规则
    rule cxxcommand = /root/llvm/bin/clang++ ${defines} ${include_dirs} ${cflags_cc} -c ${in} -o ${out}description = clang++ ${out}depfile = ${out}.ddeps = gcc
  • in,out是两个内置变量,无须定义,值由build提供,如此就编译成了一个个的 .o文件.
  • 在最后在当前目录下使用了solink规则,生成一个动态链接库libability.so.
   rule solinkcommand = /root/llvm/bin/clang -shared ${ldflags} ${in} ${libs} -o ${output_dir}/${target_output_name}${output_extension}description = SOLINK ${output_dir}/${target_output_name}${output_extension}rspfile = ${output_dir}/${target_output_name}${output_extension}.rsprspfile_content = ${in}

ability | 最终生成文件

turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ tree
.
├── aafwk_abilitykit_lite.stamp
├── ability.ninja
├── ability_notes.stamp
└── src├── libability.ability_context.o├── libability.ability_env_impl.o├── libability.ability_env.o├── libability.ability_event_handler.o├── libability.ability_loader.o├── libability.ability_main.o├── libability.ability.o├── libability.ability_scheduler.o└── libability.ability_thread.o1 directory, 12 files
turing@ubuntu:/home/openharmony/code-v1.1.1-LTS/out/hispark_aries/ipcamera_hispark_aries/obj/foundation/aafwk/aafwk_lite/frameworks/ability_lite$ stat ability_notes.stamp File: ability_notes.stampSize: 0         	Blocks: 0          IO Block: 4096   regular empty file
Device: 805h/2053d	Inode: 1217028     Links: 1
Access: (0644/-rw-r--r--)  Uid: ( 1000/  turing)   Gid: (    0/    root)
Access: 2021-07-21 00:38:52.237373740 -0700
Modify: 2021-07-21 00:34:30.207312566 -0700
Change: 2021-07-21 00:34:30.207312566 -0700

经常有很多小伙伴抱怨说:不知道学习鸿蒙开发哪些技术?不知道需要重点掌握哪些鸿蒙应用开发知识点?

为了能够帮助到大家能够有规划的学习,这里特别整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线,包含了鸿蒙开发必掌握的核心知识要点,内容有(ArkTS、ArkUI开发组件、Stage模型、多端部署、分布式应用开发、WebGL、元服务、OpenHarmony多媒体技术、Napi组件、OpenHarmony内核、OpenHarmony驱动开发、系统定制移植等等)鸿蒙(HarmonyOS NEXT)技术知识点。

在这里插入图片描述

《鸿蒙 (Harmony OS)开发学习手册》(共计892页):https://gitcode.com/HarmonyOS_MN

如何快速入门?

1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:

1.应用基础知识
2.配置文件
3.应用数据管理
4.应用安全管理
5.应用隐私保护
6.三方应用调用管控机制
7.资源分类与访问
8.学习ArkTS语言
9.……

在这里插入图片描述

基于ArkTS 开发

1.Ability开发
2.UI开发
3.公共事件与通知
4.窗口管理
5.媒体
6.安全
7.网络与链接
8.电话服务
9.数据管理
10.后台任务(Background Task)管理
11.设备管理
12.设备使用信息统计
13.DFX
14.国际化开发
15.折叠屏系列
16.……

在这里插入图片描述

鸿蒙开发面试真题(含参考答案):https://gitcode.com/HarmonyOS_MN

在这里插入图片描述

OpenHarmony 开发环境搭建

图片

《OpenHarmony源码解析》:https://gitcode.com/HarmonyOS_MN

  • 搭建开发环境
  • Windows 开发环境的搭建
  • Ubuntu 开发环境搭建
  • Linux 与 Windows 之间的文件共享
  • ……
  • 系统架构分析
  • 构建子系统
  • 启动流程
  • 子系统
  • 分布式任务调度子系统
  • 分布式通信子系统
  • 驱动子系统
  • ……

图片

OpenHarmony 设备开发学习手册:https://gitcode.com/HarmonyOS_MN

图片

写在最后

如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙

  • 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
  • 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
  • 想要获取更多完整鸿蒙最新学习资源,请移步前往在这里插入图片描述

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/diannao/52231.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

本地Docker部署Navidrome音乐服务器与远程访问听歌详细教程

💝💝💝欢迎来到我的博客,很高兴能够在这里和您见面!希望您在这里可以感受到一份轻松愉快的氛围,不仅可以获得有趣的内容和知识,也可以畅所欲言、分享您的想法和见解。 推荐:kwan 的首页,持续学…

StarRocks 存算分离数据回收原理

前言 StarRocks存算分离表中,垃圾回收是为了删除那些无用的历史版本数据,从而节约存储空间。考虑到对象存储按照存储容量收费,因此,节约存储空间对于降本增效尤为必要。 在系统运行过程中,有以下几种情况可能会需要删…

《Cloud Native Data Center Networking》(云原生数据中心网络设计)读书笔记 -- 07数据中心的边缘

本章将帮助你回答以下问题 可以用哪些方式将 Clos 拓扑连接到外部网终?边缘部署路由协议的最佳实践是什么?企业应如何处理混合云中的连接? 连接模型 为什么要连接到外部世界? 数据中心连接到外部世界的原因很多。如果你要对外提供某种服务(例如搜索服务广告推荐系统或内…

35岁程序员转行大模型:如何把握行业机遇与个人发展

对于一位35岁的程序员想要转行到大模型领域,这是一个很好的时机,因为人工智能和大模型技术正在快速发展,并且有着广泛的应用前景。以下是一些具体的步骤和建议,可以帮助您顺利地完成这一转变: 基础知识学习 数学基础&a…

科技在日常生活中的革新

在科技日新月异的今天,‌我们的生活正经历着前所未有的变革。‌从智能家居到可穿戴设备,‌科技已经渗透到我们生活的每一个角落,‌深刻地影响着我们的生活方式和社会经济的发展。‌ 智能家居系统的出现,‌无疑是科技改变生活的典…

[鹏城杯 2022]简单的php

题目源代码 <?phpshow_source(__FILE__); $code $_GET[code]; if(strlen($code) > 80 or preg_match(/[A-Za-z0-9]|\|"||\ |,|\.|-|\||\/|\\|<|>|\$|\?|\^|&|\|/is,$code)){die( Hello); }else if(; preg_replace(/[^\s\(\)]?\((?R)?\)/, , $code…

深度剖析C++string(上篇)

目录 前言 1.C string类 2.string类中的常见构造 3.string类对象的容量操作 4.. string类对象的访问及遍历操作 5. auto和范围for(补充&#xff09; auto关键字 范围for 结束语 前言 C语言我们学习了字符串和字符串的相关函数&#xff0c;在C语言中&#xff0c;字符串是…

10 Java数据结构:包装类、数组(Array工具类)、ArrayList

文章目录 前言一、包装类1、Integer&#xff08;1&#xff09;基本用法&#xff08;2&#xff09;JDK5前的包装类用法&#xff08;了解即可&#xff0c;能更好帮助我们理解下面的自动装箱和自动拆箱机制&#xff09;&#xff08;3&#xff09;自动装箱与自动拆箱机制 --- 导致&…

【学习笔记】Day 21

一、进度概述 1、机器学习常识19-22&#xff0c;以及相关代码复现 二、详情 19、矩阵分解 矩阵分解是一个纯数学问题&#xff0c;但当给矩阵赋予现实意义后&#xff0c;矩阵分解就成为了使用数学应对机器学习问题的一类典型而巧妙的方法。 在线性回归分析中&#xff…

esp32c3 luaos

提示&#xff1a;文章写完后&#xff0c;目录可以自动生成&#xff0c;如何生成可参考右边的帮助文档 文章目录 前言一、介绍二、相关介绍2.1helloworld——2.2任务框架2.3消息传递 与消息订阅2.4uart2.5二进制数据/c结构体的打包与解析2.6 zbuffer库2.8 uart 485 数据解析2.9 …

缓存实现方式

缓存是一个常见的话题&#xff0c;因为它对于提高应用程序性能至关重要。缓存是一种存储数据的临时地方&#xff0c;以便快速访问数据&#xff0c;减少对原始数据源&#xff08;如数据库或文件系统&#xff09;的访问次数&#xff0c;从而提高应用程序的响应速度和吞吐量。 Jav…

如何应对突发技术故障和危机:开发团队的应急策略

开发团队如何应对突发的技术故障和危机&#xff1f; 在数字化时代&#xff0c;软件服务的稳定性对于企业至关重要。然而&#xff0c;即使是大型平台&#xff0c;如网易云音乐&#xff0c;也可能遇到突发的技术故障。网页端出现502 Bad Gateway 报错&#xff0c;且App也无法正常…

如何在VMware ESXI中创建Linux虚拟机并实现异地SSH远程访问

目录 ⛳️推荐 前言 1. 在VMware ESXI中创建Ubuntu虚拟机 2. Ubuntu开启SSH远程服务 3. 安装Cpolar工具 4. 使用SSH客户端远程访问Ubuntu 5. 固定TCP公网地址 ⛳️推荐 前些天发现了一个巨牛的人工智能学习网站&#xff0c;通俗易懂&#xff0c;风趣幽默&#xff0c;忍不…

重塑“我店”平台:绿色积分引领的数字消费新纪元

在数字化转型的洪流中&#xff0c;“我店”平台凭借其创新的绿色积分体系异军突起&#xff0c;成为市场中的璀璨新星。本文将深度剖析“我店”的运营模式、市场效应及其如何通过绿色积分机制开创消费新潮流。 一、崛起之路与市场震撼力 自2021年盛夏在上海启航以来&#xff0c…

ffmpeg读取时长、读取视频格式

ffmpeg读取时长、读取视频格式 ffmpeg读取时长ffmpeg读取视频格式 ffmpeg读取时长 命令命令介绍具体用法ffmpeg -i查看视频时长ffmpeg -i 视频链接 or 视频路径 2>&1 | grep Duration ffmpeg读取视频格式 命令命令介绍具体用法ffmpeg -i查看视频时长ffmpeg -i 视频链接…

Java CompletableFuture:你真的了解它吗?

文章目录 1 什么是 CompletableFuture&#xff1f;2 如何正确使用 CompletableFuture 对象&#xff1f;3 如何结合回调函数处理异步任务结果&#xff1f;4 如何组合并处理多个 CompletableFuture&#xff1f; 1 什么是 CompletableFuture&#xff1f; CompletableFuture 是 Ja…

<数据集>商品条形码识别数据集<目标检测>

数据集格式&#xff1a;VOCYOLO格式 图片数量&#xff1a;3748张 标注数量(xml文件个数)&#xff1a;3748 标注数量(txt文件个数)&#xff1a;3748 标注类别数&#xff1a;1 标注类别名称&#xff1a;[Barcode] 序号类别名称图片数框数1Barcode37484086 使用标注工具&am…

探索Qotom Q51251OPS迷你电脑:功能与广泛应用

Qotom Q51251 OPS&#xff08;开放可插拔规范&#xff09;迷你电脑是一款设计紧凑且功能强大的设备&#xff0c;旨在满足不同领域的多样化需求。基于英特尔Core i5-12450H Alder Lake H处理器&#xff0c;这款设备不仅具备出色的计算性能&#xff0c;还提供了丰富的连接选项&am…

【MySQL】数据库基础(库的操作)

目录 一、MySQL安装、连接、修改密码操作 二、库的操作 2.1 创建数据库 2.2 字符集和校验规则 2.3 操控数据库 2.4 修改数据库 2.5 删除数据库 2.6 数据库的备份和恢复 2.7 查看连接情况 前情提要&#xff1a; 我的服务器操作系统是Ubuntu20.04&#xff0c;安装的是M…

【好书推荐】值得深读的EMC参考书籍

以下排序不分先后&#xff0c;都是好书&#xff01; 书名&#xff1a;Electromagnetic Compatibility Engineering 作者&#xff1a;Henry W. Ott 这本书的讨论重点放在了经济高效的EMC设计上&#xff0c;并将数学的数量和复杂度保持在最低限度&#xff0c;辅以 250 多个带有…