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

gerrit 搭建遇到的问题

1、启动Apache,端口被占用


: AH00072: make sock: could not bind to address
(0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443
a
AH00451: no listening sockets available, shutting dow
AH00015: Unable to open logs

解决方法:

修改Apache端口的方法:

修改文件(一般在此目录下:Apache安装目录\conf\extra)httpd-ssl.conf 、httpd.ahssl.conf,将443端口替换为你想设置的端口

再次启动httpd.exe,这次没报错,查看了重新设置的监听端口正常:

netstat  -ano|findstr 端口号

2、安装gerrit过程中缺少

mysql-connector-java-5.1.21.jar、bcpkix-jdk15on-152.jar、bcprov-jdk15on-152.jar文件,下载失败

Gerrit Code Review is not shipped with MySQL Connector/J 5.1.21 ** This library is required for your configuration. ** Download and install it now [Y/n]? y Downloading http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar ... Failed to clean up lib: E:\Gerrit\lib\mysql-connector-java-5.1.21.jar !! FAIL !! error: repo2.maven.org Please download: http://repo2.maven.org/maven2/mysql/mysql-connector-java/5.1.21/mysql-connector-java-5.1.21.jar and save as: E:\Gerrit\lib\mysql-connector-java-5.1.21.jar

解决方法:

从以前老gerrit上面包拷贝过来

3、缺少 "ssh-keygen"

Generating SSH host key ... rsa...Exception in thread "main" java.io.IOException: Cannot run program "ssh-keygen": CreateProcess error=2, 系统找不到指定的文件。

at java.lang.ProcessBuilder.start(ProcessBuilder.java:1048)

at java.lang.Runtime.exec(Runtime.java:620) at java.lang.Runtime.exec(Runtime.java:485)

at com.google.gerrit.pgm.init.InitSshd.generateSshHostKeys(InitSshd.java:108)

at com.google.gerrit.pgm.init.InitSshd.run(InitSshd.java:85)

at com.google.gerrit.pgm.init.SitePathInitializer.run(SitePathInitializer.java:92)

at com.google.gerrit.pgm.init.BaseInit.run(BaseInit.java:123)

at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:64)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:159)

at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:100)

at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:56)

at Main.main(Main.java:25) Caused by: java.io.IOException: CreateProcess error=2, 系统找不到指定的文件。

at java.lang.ProcessImpl.create(Native Method) at java.lang.ProcessImpl.(ProcessImpl.java:386) at java.lang.ProcessImpl.start(ProcessImpl.java:137)

at java.lang.ProcessBuilder.start(ProcessBuilder.java:1029)

...

解决方法:

如果有安装git,git目录下面有这个,把对应的路径添加到环境变量。如果没有,需要安装一个。

4、报错如下:

fatal: DbInjector failed

fatal: Unable to determine SqlDialect

fatal: caused by com.mysql.jdbc.exceptions.jdbc4.CommunicationsException: Communications link failure

fatal: fatal: The last packet sent successfully to the server was 0 milliseconds ago. The driver has not received any packets from the server.

fatal: caused by java.net.ConnectException: Connection refused: connect

解决方法:

应该是找不到gerrit需要的数据库或者 设置的数据库用户没有权限登录到 mysql。如果你需要使用mysql,则需要安装gerrit之前安装mysql。

5、报错如下:

fatal: DbInjector failed

fatal: Unable to determine SqlDialect fatal: caused by java.sql.SQLException: Access denied for user 'gerrit'@'localhost' (using password: YES)

解决方法:

确保安装gerrit过程中输入的数据库存在,且设置的数据库用户有权限访问数据库,如果没有权限需要添加权限:

GRANT ALL PRIVILEGES ON 数据库名.* TO '数据库用户'@'localhost' IDENTIFIED BY '用户对应的密码'; 

FLUSH PRIVILEGES;

6、启动gerrit报错如下:

[2024-10-31 18:03:33,281] [main] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon

com.google.inject.CreationException: Unable to create injector, see the following errors:

1) No SSH keys under .\etc

while locating com.google.gerrit.sshd.HostKeyProvider at com.google.gerrit.sshd.SshHostKeyModule.configure(SshHostKeyModule.java:26)

while locating org.apache.sshd.common.KeyPairProvider for parameter 5

at com.google.gerrit.sshd.DatabasePubKeyAuth.(DatabasePubKeyAuth.java:72)

while locating com.google.gerrit.sshd.DatabasePubKeyAuth for parameter 0

at com.google.gerrit.sshd.CachingPublicKeyAuthenticator.(CachingPublicKeyAuthenticator.java:26)

解决方法:

报错如上,把老的gerrit上面的ssh_host_key文件拷贝过来放到etc目录下面

7、报错如下:

[2024-10-31 18:08:44,932] [main] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon

com.google.inject.ProvisionException: Unable to provision, see the following errors:

1) No index versions ready; run Reindex 1 error at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:124)

at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:74)

at com.google.gerrit.pgm.Daemon.start(Daemon.java:302)

at com.google.gerrit.pgm.Daemon.run(Daemon.java:203)

at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:64)

at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)

at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)

at java.lang.reflect.Method.invoke(Method.java:497)

at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:159)

at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:100)

at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:56)

at Main.main(Main.java:25)

解决方法:

网上查了,很多说按照指示reindex一下:java -jar .\bin\gerrit.war reindex

有些有作用,但是我是迁移老gerrit数据的,这种操作没有用。需要把老gerrit上面的

cache和index目录拷贝过来,再重启gerrit,就可以了。

8、启动gerrit报错如下:

[2024-10-30 17:43:41,799] [main] ERROR com.google.gerrit.pgm.Daemon : Unable to start daemon
com.google.inject.ProvisionException: Unable to provision, see the following errors:1) Error injecting constructor, java.io.IOException: Unable to unmap the mapped buffer: MMapIndexInput(path="E:\Gerrit\index\changes_0025\open\segments_1")at com.google.gerrit.lucene.LuceneChangeIndex.<init>(LuceneChangeIndex.java:236)while locating com.google.gerrit.lucene.LuceneChangeIndex annotated with @com.google.inject.internal.UniqueAnnotations$Internal(value=9)1 errorat com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1025)at com.google.inject.assistedinject.FactoryProvider2.invoke(FactoryProvider2.java:770)at com.google.gerrit.lucene.$Proxy115.create(Unknown Source)at com.google.gerrit.lucene.LuceneVersionManager.start(LuceneVersionManager.java:155)at com.google.gerrit.lifecycle.LifecycleManager.start(LifecycleManager.java:74)at com.google.gerrit.pgm.Daemon.start(Daemon.java:302)at com.google.gerrit.pgm.Daemon.run(Daemon.java:203)at com.google.gerrit.pgm.util.AbstractProgram.main(AbstractProgram.java:64)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method)at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)at java.base/java.lang.reflect.Method.invoke(Method.java:566)at com.google.gerrit.launcher.GerritLauncher.invokeProgram(GerritLauncher.java:159)at com.google.gerrit.launcher.GerritLauncher.mainImpl(GerritLauncher.java:100)at com.google.gerrit.launcher.GerritLauncher.main(GerritLauncher.java:56)at Main.main(Main.java:25)
Caused by: java.io.IOException: Unable to unmap the mapped buffer: MMapIndexInput(path="E:\Gerrit\index\changes_0025\open\segments_1")at org.apache.lucene.store.MMapDirectory$2.freeBuffer(MMapDirectory.java:329)at org.apache.lucene.store.ByteBufferIndexInput.freeBuffer(ByteBufferIndexInput.java:376)at org.apache.lucene.store.ByteBufferIndexInput.close(ByteBufferIndexInput.java:355)at org.apache.lucene.store.BufferedChecksumIndexInput.close(BufferedChecksumIndexInput.java:60)at org.apache.lucene.index.SegmentInfos.readCommit(SegmentInfos.java:459)at org.apache.lucene.index.IndexWriter.<init>(IndexWriter.java:909)at com.google.gerrit.lucene.AutoCommitWriter.<init>(AutoCommitWriter.java:38)at com.google.gerrit.lucene.AutoCommitWriter.<init>(AutoCommitWriter.java:33)at com.google.gerrit.lucene.SubIndex.<init>(SubIndex.java:79)at com.google.gerrit.lucene.SubIndex.<init>(SubIndex.java:61)at com.google.gerrit.lucene.LuceneChangeIndex.<init>(LuceneChangeIndex.java:268)at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method)at java.base/jdk.internal.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62)at java.base/jdk.internal.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45)at java.base/java.lang.reflect.Constructor.newInstance(Constructor.java:490)at com.google.inject.internal.DefaultConstructionProxyFactory$2.newInstance(DefaultConstructionProxyFactory.java:86)at com.google.inject.internal.ConstructorInjector.provision(ConstructorInjector.java:105)at com.google.inject.internal.ConstructorInjector.construct(ConstructorInjector.java:85)at com.google.inject.internal.ConstructorBindingImpl$Factory.get(ConstructorBindingImpl.java:267)at com.google.inject.internal.InjectorImpl$2$1.call(InjectorImpl.java:1016)at com.google.inject.internal.InjectorImpl.callInContext(InjectorImpl.java:1092)at com.google.inject.internal.InjectorImpl$2.get(InjectorImpl.java:1012)... 15 more
Caused by: java.lang.IllegalAccessException: class org.apache.lucene.store.MMapDirectory$2$1 cannot access class jdk.internal.ref.Cleaner (in module java.base) because module java.base does not export jdk.internal.ref to unnamed module @6bb4dd34at java.base/jdk.internal.reflect.Reflection.newIllegalAccessException(Reflection.java:361)at java.base/java.lang.reflect.AccessibleObject.checkAccess(AccessibleObject.java:591)at java.base/java.lang.reflect.Method.invoke(Method.java:558)at org.apache.lucene.store.MMapDirectory$2$1.run(MMapDirectory.java:322)at org.apache.lucene.store.MMapDirectory$2$1.run(MMapDirectory.java:314)at java.base/java.security.AccessController.doPrivileged(Native Method)at org.apache.lucene.store.MMapDirectory$2.freeBuffer(MMapDirectory.java:314)... 36 more

解决方法:

老gerrit上面的是jdk1.8,而新gerrit的jdk是11,把jdk版本换成1.8就可以了。也可以使用绿色版,但是启动的时候需要带全路径。

9、Apache注册成功,但是在服务那里启动失败

解决方法:

缺少环境依赖项,例如:

没有安装:vc_redist_x64 导致的,打开链接:Apache VS17 binaries and modules download

下载vc_redist_x64并安装。

重新添加Apache为本地服务,启动服务,可以正常运行了

10、点击页面的gitweb报错如下:

[2024-11-05 11:00:17,837] [Gitweb-ErrorLogger] ERROR com.google.gerrit.httpd.gitweb.GitwebServlet : CGI: ???????????????ò?í±ê??·¨?????·??
[2024-11-05 11:00:17,837] [HTTP-32] ERROR com.google.gerrit.httpd.gitweb.GitwebServlet : Non-zero exit status (1) from C:\Program Files\Git\mingw64\share\gitweb\gitweb.bat

解决方法:

看下C:\Program Files\Git\mingw64\share\gitweb\gitweb.bat 里面是否有中文的双引号,需要改成英文的双引号。

相关文章:

gerrit 搭建遇到的问题

1、启动Apache&#xff0c;端口被占用 : AH00072: make sock: could not bind to address (0S 10048)通常每个套接字地址(协议/网络地址/端口)只允许使用一次。: AH00072: make sock: could not bind to address 0.0.0.:443 a AH00451: no listening sockets available, shutti…...

UBUNTU查看CPU核心数

UBUNTU查看CPU核心数 前言一、使用lscpu命令1. 执行命令2. 查看输出 二、使用/proc/cpuinfo文件1. 查看文件2. 解释输出 三、使用nproc命令1. 执行命令2. 查看输出 四、使用htop或top工具1. 使用htop2. 使用top 五、使用inxi命令1. 执行命令2. 查看输出 六、使用图形界面工具1.…...

【JS】声明提升与块级作用域

我是目录 引言声明提升声明提升的理解函数表达式声明提升总结代码生成与查找变量的过程代码生成词法分析( Tokenizing/Lexing)语法分析( Parsing)代码生成生成代码总结查找变量不同版本中的执行上下文不同版本对执行上下文的定义let/constlet特点const特点let/const声明的变…...

Flink的流、批处理

Flink的数据流处理&#xff0c;是持续流模型&#xff0c;数据不会落地&#xff0c;上游和下游的Task同时启动&#xff0c;等待数据的到达&#xff0c;Flink的批处理还是用的MapReduce计算模型&#xff0c;先处理map端&#xff0c;再执行reduce端。 flink的流处理(STREAMING)&a…...

学习方法该升级了,‌AI时代的弯道超车:【心流学习法】行动与意识合一的巅峰进化

你是否曾感到内心如荒漠般干涸&#xff0c;面对浩瀚的知识海洋&#xff0c;热情逐渐消磨殆尽&#xff1f; 你是否渴望忘却时间的流逝&#xff0c;心无旁骛&#xff0c;与知识展开一场纯粹而深邃的对话&#xff1f; ​在AI时代&#xff0c;智能体处理数据、知识迭代的速率让人…...

【大模型LLM面试合集】大语言模型架构_chatglm系列模型

chatglm系列模型 1.ChatGLM 1.1 背景 主流的预训练框架主要有三种&#xff1a; autoregressive自回归模型&#xff08;AR模型&#xff09;&#xff1a;代表作GPT。本质上是一个left-to-right的语言模型。通常用于生成式任务&#xff0c;在长文本生成方面取得了巨大的成功&a…...

深入理解 Kafka:分布式消息队列的强大力量

一、引言 在现代分布式系统中&#xff0c;消息队列扮演着至关重要的角色&#xff0c;而 Kafka 作为其中的佼佼者&#xff0c;以其高吞吐量、可扩展性和持久性等特点被广泛应用。无论是处理海量的日志数据、实时的用户交互信息&#xff0c;还是复杂的微服务间通信&#xff0c;Ka…...

LabVIEW 离心泵机组故障诊断系统

开发了一套基于LabVIEW图形化编程语言设计的离心泵机组故障诊断系统。系统利用先进的数据采集技术和故障诊断方法&#xff0c;通过远程在线监测与分析&#xff0c;有效提升了离心泵的预测性维护能力&#xff0c;保证了石油化工生产的连续性和安全性。 项目背景及意义 离心泵作…...

GEE土地分类——土地分类的原始remap转化原始的土地分类名称

简介 GEE土地分类——土地分类的原始remap转化原始的土地分类名称 函数 first(image2) Selects the value of the first value for each matched pair of bands in image1 and image2. If either image1 or image2 has only 1 band, then it is used against all the bands…...

一些关于云电脑与虚拟化东西

前言 好久没有更新了&#xff0c;在进行自我校准。 云计算是什么&#xff1f; 云计算是一种模型&#xff0c;它使得用户能够随时随地、方便地、按需访问共享的可配置计算资源池&#xff08;例如&#xff0c;网络、服务器、存储、应用程序和服务&#xff09;&#xff0c;这些资…...

Java实现图片转pdf

该方法可以选择多个图片是否合并为一个pdf输出&#xff0c;也可以选择图片为横向或者纵向输出&#xff0c;也可以选择pdf页面为A3或者A4 第一步 <dependency><groupId>org.apache.pdfbox</groupId><artifactId>pdfbox</artifactId><version…...

【iOS】使用AFNetworking进行网络请求

文章目录 前言AFNetworkingAFNetworking 的核心组件AKNetworking库的常用方法使用AKNetworking进行网络请求的步骤和代码示例 总结 前言 在暑假写天气预报项目时&#xff0c;我们已经接触到网络请求&#xff0c;当时我们是使用URLSession类&#xff0c;即Foundation框架中用于管…...

ThingsBoard规则链节点:RPC Call Reply节点详解

引言 1. RPC Call Reply 节点简介 2. 节点配置 2.1 基本配置示例 3. 使用场景 3.1 设备控制 3.2 状态查询 3.3 命令执行 4. 实际项目中的应用 4.1 项目背景 4.2 项目需求 4.3 实现步骤 5. 总结 引言 ThingsBoard 是一个开源的物联网平台&#xff0c;提供了设备管理…...

【AI换装整合包及教程】OOTDiffusion:以AI技术引领的时尚换装革命

在当今数字化快速发展的时代&#xff0c;人工智能&#xff08;AI&#xff09;技术正以前所未有的速度改变着我们的生活。从智能家居到自动驾驶&#xff0c;从在线教育到虚拟现实&#xff0c;AI的应用范围正在不断扩展。而在时尚领域&#xff0c;一款名为OOTDiffusion&#xff0…...

排序算法详细总结

算法 定义&#xff1a;算法是解决特定问题的明确步骤集合。算法的效率通常用时间复杂度和空间复杂度来衡量。 排序算法 定义&#xff1a;排序算法是计算机科学中用于对元素序列进行排序的一系列算法。排序算法在各种应用中都非常常见&#xff0c;从简单的数据处理到复杂的数…...

uniapp MD5加密

安装&#xff1a; npm install js-md5 -D 引入&#xff1a; import Md5 from js-md5 需求加密一个对象&#xff0c; login_form: {openId: 123456789,phone: ,scenario: 656677,phoneSessionKey: ,openIdSessionKey: ,timeStamp: , }, //10位时间戳&#xff08;秒&#xff09;…...

提升视觉回归测试体验:Cypress 插件推荐

项目介绍 在现代前端开发中&#xff0c;视觉回归测试是确保用户界面在不同版本之间保持一致性的关键步骤。然而&#xff0c;传统的视觉回归测试工具往往复杂且难以使用。为了解决这一问题&#xff0c;我们推荐一款专为 Cypress 设计的插件&#xff1a;Cypress Plugin Visual Re…...

fastbootd模式刷android固件的方法

1. fastbootd追根溯源 Google在Android 10上正式引入了动态分区机制来提升OTA的可扩展性。动态分区使能后&#xff1a;andorid系统可以在开机阶段动态地进行分区创建、分区销毁、分区大小调整等操作&#xff0c;下游厂商只需要规划好super分区的总大小&#xff0c;其内部的各个…...

基于C#实现Windows后台窗口操作与图像处理技术分析

在Windows编程中&#xff0c;操作后台窗口是一项复杂而有用的技术。它可以用来自动化用户界面测试、应用程序机器人等场景。本文将深入探讨如何在C#中绑定后台窗口、获取后台窗口界面图片&#xff0c;以及在图片中寻找指定图标并获取坐标。本技术文章结合最先进的资料与实践经验…...

戴尔电脑 Bios 如何进入?Dell Bios 进入 Bios 快捷键是什么?

BIOS&#xff08;基本输入输出系统&#xff09;是计算机启动时运行的第一个程序&#xff0c;它负责初始化硬件并加载操作系统。对于戴尔电脑用户来说&#xff0c;有时可能需要进入 BIOS 进行一些特定的设置调整&#xff0c;比如更改启动顺序、调整性能选项或解决硬件兼容性问题…...

数据结构之二叉树——堆 详解(含代码实现)

1.堆 如果有一个关键码的集合 K { &#xff0c; &#xff0c; &#xff0c; … &#xff0c;}&#xff0c;把它的所有元素按完全二叉树的顺序存储方式存储 在一个一维数组中&#xff0c;则称为小堆( 或大堆 ) 。将根节点最大的堆叫做最大堆或大根堆&#xff0c;根节点最小的…...

推荐一款面向增材制造的高效设计平台:nTopology

nTopology是一款面向增材制造的高效设计平台&#xff0c;平台预置了大量增材制造常用的设计工具包&#xff0c;工程师通过调用若干个预置工具包、或自主开发定制的工具包&#xff0c;建立一个工作流&#xff0c;实现复杂几何结构的参数化设计。nTopology集合了的强大几何建模和…...

SQL,力扣题目1767,寻找没有被执行的任务对【递归】

一、力扣链接 LeetCode_1767 二、题目描述 表&#xff1a;Tasks ------------------------- | Column Name | Type | ------------------------- | task_id | int | | subtasks_count | int | ------------------------- task_id 具有唯一值的列。 ta…...

JavaScript数据类型- Symbol 详解

文章目录 前言1.唯一性2. 描述3. 作为对象属性键4. 全局注册6. 不可变性7. 隐式转换 前言 Symbol是ES6新增内容&#xff0c;代表创建后独一无二且不可变的数据类型&#xff0c;它主要是为了解决可能出现的全局变量冲突的问题 在JavaScript发展的过程中&#xff0c;其中的ES6带…...

WordPress网站添加嵌入B站视频,自适应屏幕大小,取消自动播放

结合bv号 改成以下嵌入式代码&#xff08;自适应屏幕大小,取消自动播放&#xff09; <iframe style"width: 100%; aspect-ratio: 16/9;" src"//player.bilibili.com/player.html?isOutsidetrue&bvidBV13CSVYREpr&p1&autoplay0" scrolling…...

11.6 校内模拟赛总结

打的很顺的一场 复盘 7:40 开题&#xff0c;看到题目名很interesting T1 看起来很典&#xff0c;中位数显然考虑二分&#xff0c;然后就是最大子段和&#xff1b;T2 构造&#xff1f;一看数据范围这么小&#xff0c;感觉不是很难做&#xff1b;T3 神秘数据结构&#xff1b;T…...

Redis常用的五大数据类型(列表List,集合set)

简介 List 的特点&#xff1a;单键多值。底层实际是个双向链表&#xff0c;对两端的操作性能很高&#xff0c;通过索引下标的操作中间的节点性能会较差。 Redis 列表是简单的字符串列表&#xff0c;按照插入顺序排序。你可以添加一个元素到列表的头部&#xff08;左边&#xff…...

Ubuntu 20.04 部署向量数据库 Milvus + Attu

前言 最开始在自己的办公电脑&#xff08;无显卡的 windows 10 系统&#xff09; 上使用 Docker Desktop 部署了 Milvus 容器&#xff0c;方便的很&#xff0c; 下载 Attu 也很方便&#xff0c;直接就把这个向量数据库通过 Attu 这个图形化界面跑了起来&#xff0c;使用起来感…...

实现数传数据转网口(以太网)和遥控器SBUS信号转串口的功能

为了帮助你实现数传数据转网口&#xff08;以太网&#xff09;和SBUS信号转串口的功能&#xff0c;这里提供一个基本的框架。我们将使用STM32微控制器来完成这些任务。假设你已经具备了STM32的基本开发经验&#xff0c;并且已经安装了相应的开发环境&#xff08;如STM32CubeIDE…...

APP 后台广告位配置的关键要素与策略

在当今数字化营销的浪潮中&#xff0c;APP 作为重要的信息传播渠道&#xff0c;其后台广告位的配置显得尤为关键。这不仅影响着广告的展示效果&#xff0c;还直接关系到用户体验和平台收益。 首先&#xff0c;了解目标受众是配置广告位的基础。通过对 APP 用户的行为数据进行分…...