鸿蒙内核源码分析(忍者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简单很多- 目前已知的
GoogleChrome,Android的一部分,LLVM,V8, 方舟编译器, 鸿蒙 等大型系统都使用到了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.c用cc规则编译成foo.o- 最终编译选项:
gcc -Wall -Werror -c foo.c -o foo.o
- 最终编译选项:
- 第二个
build,将special.c用cc规则编译成special.o- 最终编译选项:
gcc -Wall -c foo.c -o foo.o
- 最终编译选项:
in,out是ninja的两个内置变量.
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
鸿蒙全栈开发全新学习指南
也为了积极培养鸿蒙生态人才,让大家都能学习到鸿蒙开发最新的技术,针对一些在职人员、0基础小白、应届生/计算机专业、鸿蒙爱好者等人群,整理了一套纯血版鸿蒙(HarmonyOS Next)全栈开发技术的学习路线【包含了大厂APP实战项目开发】。
本路线共分为四个阶段:
第一阶段:鸿蒙初中级开发必备技能

第二阶段:鸿蒙南北双向高工技能基础:gitee.com/MNxiaona/733GH

第三阶段:应用开发中高级就业技术

第四阶段:全网首发-工业级南向设备开发就业技术:https://gitee.com/MNxiaona/733GH

《鸿蒙 (Harmony OS)开发学习手册》(共计892页)
如何快速入门?
1.基本概念
2.构建第一个ArkTS应用
3.……

开发基础知识:gitee.com/MNxiaona/733GH
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.……

鸿蒙开发面试真题(含参考答案):gitee.com/MNxiaona/733GH

鸿蒙入门教学视频:

美团APP实战开发教学:gitee.com/MNxiaona/733GH

写在最后
- 如果你觉得这篇内容对你还蛮有帮助,我想邀请你帮我三个小忙:
- 点赞,转发,有你们的 『点赞和评论』,才是我创造的动力。
- 关注小编,同时可以期待后续文章ing🚀,不定期分享原创知识。
- 想要获取更多完整鸿蒙最新学习资源,请移步前往小编:
gitee.com/MNxiaona/733GH

相关文章:
鸿蒙内核源码分析(忍者ninja篇) | 都忍者了能不快吗
ninja | 忍者 ninja是一个叫 Evan Martin的谷歌工程师开源的一个自定义的构建系统,最早是用于 chrome的构建,Martin给它取名 ninja(忍者)的原因是因为它strikes quickly(快速出击).这是忍者的特点,可惜Martin不了解中国文化,不然叫小李飞刀更合适些.究竟有多块呢? 用Martin自…...
Linux——守护进程化(独立于用户会话的进程)
目录 前言 一、进程组ID与会话ID 二、setsid() 创建新会话 三、daemon 守护进程 前言 在之前,我们学习过socket编程中的udp通信与tcp通信,但是当时我们服务器启动的时候,都是以前台进程的方式启动的,这样很不优雅,…...
安卓开发--按键跳转页面,按键按下变色
前面已经介绍了一个空白按键工程的建立以及响应方式,可以参考这里:安卓开发–新建工程,新建虚拟手机,按键事件响应。 安卓开发是页面跳转是基础!!!所以本篇博客介绍利用按键实现页面跳转&#…...
Ps基础学习笔记
Ps基础学习笔记 Adobe Photoshop(简称Ps)是一款非常流行的图像处理软件,被广泛应用于图像编辑、修饰和设计等领域。作为一名初学者,了解Ps的基础知识是非常重要的,本文将介绍Ps的基本操作和常用工具,帮助你…...
spring开发问题总结(持续更新)
开始 最近在做项目的时候,总遇到一些大小不一,奇形怪状的问题。 现在终于有时间来总结一下遇到的问题,以备复习之用。 以下提到的问题经过简化,不代表任何项目代码或问题。 问题1:未完成任务状态搜索结果有误&#x…...
Android 状态栏WiFi图标的显示逻辑
1. 状态栏信号图标 1.1 WIFI信号显示 WIFI信号在状态栏的显示如下图所示 当WiFi状态为关闭时,状态栏不会有任何显示。当WiFi状态打开时,会如上图所示,左侧表示有可用WiFi,右侧表示当前WiFi打开但未连接。 当WiFi状态连接时&#x…...
更改 DeepXDE 的后端
DeepXDE 库为科学计算和工程优化等领域提供了深度学习方法,是一个非常有用的工具。其中一个重要的功能是它允许用户自定义后端。在本文中,我们将指导如何更改 DeepXDE 的后端,并且验证更改是否成功。 更改 DeepXDE 的后端 DeepXDE 支持多种…...
SpringBoot之Zuul服务
概述 Spring Cloud Netflix zuul组件是微服务架构中的网关组件,Zuul作为统一网关,是所有访问该平台的请求入口,核心功能是路由和过滤。 目前公司业务就是基于Zuul搭建的网关服务,且提供的服务包括转发请求(路由)、黑名单IP访问拦截、URL资源访问时的权限拦截、统一访问日志记…...
Go-变量
可以理解为一个昵称 以后这个昵称就代指这些信息 var sg string "czy" 声明赋值 package mainimport "fmt"func main() {var sg string "陈政洋"fmt.Println(sg)var age int 73fmt.Println(age)var flag bool truefmt.Println(flag) } …...
【CTF-Crypto】RSA-选择明密文攻击 一文通
RSA:选择明密文攻击 关于选择明/密文攻击,其实这一般是打一套组合拳的,在网上找到了利用的思路,感觉下面这个题目是真正将这个问题实现了,所以还是非常棒的一道题,下面先了解一下该知识点:(来自…...
Pytorch基础:torch.expand() 和 torch.repeat()
在torch中,如果要改变某一个tensor的维度,可以利用view、expand、repeat、transpose和permute等方法,这里对这些方法的一些容易混淆的地方做个总结。 expand和repeat函数是pytorch中常用于进行张量数据复制和维度扩展的函数,但其…...
如何正确安装Scrapy 2.6.1并解决常见的Python环境问题
在配置Python环境和安装包时,常常会遇到版本冲突和路径问题,特别是当系统中存在多个Python版本时。本文将指导你如何在CentOS系统中正确使用pip3安装Scrapy 2.6.1,并解决一些常见的环境问题。 步骤1: 确认和升级 pip3 确认 pip3 的版本&…...
阵痛中的乳业产业,何时才能成为下一个啤酒产业?
说起饮品,近年来中国啤酒业中各大品牌齐齐聚焦高端化的趋势绝对值得一提。然而,与之相反,国内乳业却是仍未进入高端化阶段,甚至陷入了周期底部中。 图源:中国圣牧财报 增收降利 牧企承受巨大的供需缺口压力 从产业链…...
关于模型参数融合的思考
模型参数融合通常指的是在训练过程中或训练完成后将不同模型的参数以某种方式结合起来,以期望得到更好的性能。这种融合可以在不同的层面上进行,例如在神经网络的不同层之间,或者是在完全不同的模型之间。模型参数融合的目的是结合不同模型的…...
Windows MySQL本地服务器设置并导入数据库和数据
文章目录 小结问题及解决导出数据库Windows MySQL本地服务器设置导入数据库和数据 参考 小结 最近需要在本地Windows环境中设置MySQL服务器,并导入数据库和数据,记录过程。 问题及解决 导出数据库 首先需要导出数据库: C:\mysql-8.0.37-…...
豪投巨资,澳大利亚在追逐海市蜃楼吗?
澳大利亚政府正在积极投资于量子计算领域。继2021年向量子技术投资逾1亿澳元后,2023年5月,该国发布了首个国家量子战略,详细阐述了如何把握量子技术的未来及保持全球领先地位。 澳大利亚的国家量子战略概述 原文链接: https://ww…...
面试集中营—Redis架构篇
一、Redis到底是多线程还是单线程 1、redis6.0版本之前的单线程,是指网络请求I/O与数据的读写是由一个线程完成的; 2、redis6.0版本升级成了多线程,指的是在网络请求I/O阶段应用的多线程技术;而键值对的读写还是由单线程完成的。所…...
05_kafka-整合springboot
文章目录 kafka 整合 springboot pom.xml <parent><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-parent</artifactId><version>2.1.5.RELEASE</version> </parent> <dependencies>&…...
论UML在学情精准测评系统中的应用
摘要简介 项目背景: 随着教育改革的不断深入,对学生学情的精准测评成为教育教学工作中的重要环节。为了解决传统学情测评方式主观性强、效率低、反馈不及时等问题,我们团队受教育主管部门委托,承担了中小学学情精准测评系统&…...
Day23 代码随想录打卡|字符串篇---重复的子字符串
题目(leecode T459): 给定一个非空的字符串 s ,检查是否可以通过由它的一个子串重复多次构成。给定的字符串只含有小写英文字母,并且长度不超过10000。fang 移动匹配。分析可以由自己的子串构成的字符串,肯…...
MPNet:旋转机械轻量化故障诊断模型详解python代码复现
目录 一、问题背景与挑战 二、MPNet核心架构 2.1 多分支特征融合模块(MBFM) 2.2 残差注意力金字塔模块(RAPM) 2.2.1 空间金字塔注意力(SPA) 2.2.2 金字塔残差块(PRBlock) 2.3 分类器设计 三、关键技术突破 3.1 多尺度特征融合 3.2 轻量化设计策略 3.3 抗噪声…...
conda相比python好处
Conda 作为 Python 的环境和包管理工具,相比原生 Python 生态(如 pip 虚拟环境)有许多独特优势,尤其在多项目管理、依赖处理和跨平台兼容性等方面表现更优。以下是 Conda 的核心好处: 一、一站式环境管理:…...
将对透视变换后的图像使用Otsu进行阈值化,来分离黑色和白色像素。这句话中的Otsu是什么意思?
Otsu 是一种自动阈值化方法,用于将图像分割为前景和背景。它通过最小化图像的类内方差或等价地最大化类间方差来选择最佳阈值。这种方法特别适用于图像的二值化处理,能够自动确定一个阈值,将图像中的像素分为黑色和白色两类。 Otsu 方法的原…...
Nuxt.js 中的路由配置详解
Nuxt.js 通过其内置的路由系统简化了应用的路由配置,使得开发者可以轻松地管理页面导航和 URL 结构。路由配置主要涉及页面组件的组织、动态路由的设置以及路由元信息的配置。 自动路由生成 Nuxt.js 会根据 pages 目录下的文件结构自动生成路由配置。每个文件都会对…...
今日科技热点速览
🔥 今日科技热点速览 🎮 任天堂Switch 2 正式发售 任天堂新一代游戏主机 Switch 2 今日正式上线发售,主打更强图形性能与沉浸式体验,支持多模态交互,受到全球玩家热捧 。 🤖 人工智能持续突破 DeepSeek-R1&…...
Mysql中select查询语句的执行过程
目录 1、介绍 1.1、组件介绍 1.2、Sql执行顺序 2、执行流程 2.1. 连接与认证 2.2. 查询缓存 2.3. 语法解析(Parser) 2.4、执行sql 1. 预处理(Preprocessor) 2. 查询优化器(Optimizer) 3. 执行器…...
安全突围:重塑内生安全体系:齐向东在2025年BCS大会的演讲
文章目录 前言第一部分:体系力量是突围之钥第一重困境是体系思想落地不畅。第二重困境是大小体系融合瓶颈。第三重困境是“小体系”运营梗阻。 第二部分:体系矛盾是突围之障一是数据孤岛的障碍。二是投入不足的障碍。三是新旧兼容难的障碍。 第三部分&am…...
腾讯云V3签名
想要接入腾讯云的Api,必然先按其文档计算出所要求的签名。 之前也调用过腾讯云的接口,但总是卡在签名这一步,最后放弃选择SDK,这次终于自己代码实现。 可能腾讯云翻新了接口文档,现在阅读起来,清晰了很多&…...
iview框架主题色的应用
1.下载 less要使用3.0.0以下的版本 npm install less2.7.3 npm install less-loader4.0.52./src/config/theme.js文件 module.exports {yellow: {theme-color: #FDCE04},blue: {theme-color: #547CE7} }在sass中使用theme配置的颜色主题,无需引入,直接可…...
安卓基础(Java 和 Gradle 版本)
1. 设置项目的 JDK 版本 方法1:通过 Project Structure File → Project Structure... (或按 CtrlAltShiftS) 左侧选择 SDK Location 在 Gradle Settings 部分,设置 Gradle JDK 方法2:通过 Settings File → Settings... (或 CtrlAltS)…...
