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

Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转

Gerrit | 重磅! 2.x 版本升级到 3.x 版本

为什么要做版本升级?

2.x known bugs

重大问题不一一列举,这里仅仅是举几个例子:

  • 安全或权限问题:普通用户能看到敏感数据,例如看到其他用户的 hashed api 密码,

问题传送门:https://bugs.chromium.org/p/gerrit/issues/detail?id=13514;

  • 再例如 已经设置为失效的账号,还可以登录 gerrit ;
  • 升级时索引建立失败:重建索引未完成,插件就 load 了,索引建立过程 invoked,https://bugs.chromium.org/p/gerrit/issues/detail?id=6472;

3.0 的重大更新

  • ReviewDB 寿终正寝,NoteDB 上台
  • UI 界面全面更新,GWT 被 PolyGerrit 取代
  • 支持 REST-API
  • 其他重大更新,等等

新版本大概长这样

升级 Migration 实操记录

目前待升级的 gerrit 版本为 2.13.9,根据官方文档,必须确保每个中间版本都被升级,所以升级路线暂定为:

  1. 2.13 -- 2.14 -- 2.15 -- 2.16
  2. 到了 2.16 后将review DB 迁移到NoteDB
  3. 迁移 2.16 到 3.0

注意:v2.16是唯一包含和支持 reviewDB 到 NoteDB 的关键版本

Reference Doc:https://gitenterprise.me/2019/05/20/gerrit-v3-0-is-here/

提前测试

测试原版 gerrit 升级路径,不携带任何数据,为的是快速探索成功路径

升级路径:2.13.9 -- 2.15.21 -- 2.16.25 -- 3.2.3

s0:升级前,确认 gerrit 的 replication 和 HA 的插件和配置文件,被禁用(可移走或重命名)

s1:起点版本 2.13.9

$ java -jar gerrit-2.13.9.war init --batch --dev -d gerrit_test

s2:升级到 2.15.21

$ java -jar gerrit-2.15.21.war init --batch --dev -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index groups -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index accounts -d gerrit_test

$ java -jar gerrit-2.15.21.war reindex --index changes -d gerrit_test

执行以上三步,gerrit 服务才能启动成功

其中第三步 reindex,耗时较长,可以先 skip ,升级到 3.x 再做

s3:升级到 2.16.25

$ java -jar gerrit-2.16.25.war init --batch --dev -d gerrit_test

直接启动 gerrit 可以成功

s4:升级 3.x 之前,将 jdk 11 下载解压,并加入到 环境变量中,source

$ java -version

openjdk version "11.0.9.1" 2020-11-04

OpenJDK Runtime Environment AdoptOpenJDK (build 11.0.9.1+1)

OpenJDK 64-Bit Server VM AdoptOpenJDK (build 11.0.9.1+1, mixed mode)

s5:在2.16.25 上进行数据库 migrate

$ java -jar gerrit-2.16.25.war migrate-to-note-db -d gerrit_test

可以加上 --reindex false 选择跳过 reindex

s6:升级到 3.2.3

$ java -jar gerrit-3.2.3.war init --batch --dev -d gerrit_test

s7:进行 reindex

$ java -jar gerrit-3.2.3.war reindex --index accounts -d gerrit_test

$ java -jar gerrit-3.2.3.war reindex --index changes -d gerrit_test

启动 gerrit 服务,启动 OK, awsome!!


验证一下:

$ curl localhost:29418

SSH-2.0-GerritCodeReview_3.2.3 (APACHE-SSHD-2.4.0)

Unsupported protocol version: GET / HTTP/1.1

到此基本的操作步骤都涵盖在上面了,分割线以下,是我的实际操作日志,仅供参考。

如果有任何问题,可私信咨询。


实际 Tips

  • 升级前的准备

检查 gerrit.config

[cache "diff"]

timeout = 200ms # 减少timeout 提升整体 reindex 速度

  • 导入数据

进入 MySQL : set GLOBAL max_connections=1000;

本地搭建 mysql, 并导入数据

mysql -u username -p < ...sql脚本.sql ,

例如

$ mysql -u gerrit_rw -p --verbose < c3-inf-gerrit-db01.bj.sql

  • 拷贝 线上的 gerrit 目录并停掉 gerrit 的 HA 和 replication,然后修改 gerrit.config 的 database 为本地数据库配置

[database]

type = mysql

hostname = localhost

database = xxx

username = x

password = x

port = 3306

useSSL = false

[auth] type = DEVELOPMENT_BECOME_ANY_ACCOUNT

  • 同步线上代码

$ ssh -p 29418 gerrit@localhost replication start --url 目标地址 --all

  • 2.13 --> 2.14

#停止 gerrit 服务

java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

Get an error:
Exception in thread "main" java.nio.file.NoSuchFileException: gerrit/ha/1/gerrit/shared
解决方式:去掉或重命名etc目录下的 ha config 和 replication config ,去掉 plugins 文件下的 ha 和 replication 的 jar 包
这一步也可以在执行 升级命令 之前完成

继续上面的 java 命令

$ java -jar gerrit-2.14.22.war init --batch --dev -d ${gerrit-site}

Upgrading schema to 130 ...

Upgrading schema to 131 ...

Upgrading schema to 132 ...

迁移正常的打印信息为:

Migrating 5263 repositories ...

Migration completed: 3 repositories updated:

All-Projects platform/packages/apps/ContactsCommon platform/packages/apps/OneAccountSdk

> Done (44.769 s)

Migrating data to schema 131 ...

Migrating 5263 repositories ...

Migration completed: 16 repositories updated:

... ... ...

Migrating data to schema 141 ...

> Done (0.022 s)

Migrating data to schema 142 ...

> Done (137.173 s)

Execute the following SQL to drop unused objects:

... ... ...

Initialized /home/work/gerrit

报错:直接启动 gerrit 服务会失败:No index versions ready;

解决方式:进行 reindex 操作

$ java -jar gerrit-2.14.22.war reindex --index groups -d ${gerrit-site}

... ... ...

Finishing 5 disk cache updates

启动 gerrit 服务, 查看升级后的版本

$ curl localhost:29418

SSH-2.0-GerritCodeReview_2.14.22 (SSHD-CORE-1.4.0)

Unsupported protocol version: GET / HTTP/1.1

或者查看一下新UI 左下角的版本信息(2.14.22)

  • 继续下一步:2.14 --> 2.15

migration to 2.15 与上述内容基本一致

$ java -jar gerrit-2.15.21.war init --batch --dev -d ${gerrit-site}

Upgrading schema to 143 ...

Upgrading schema to 144 ...

... ... ...

Initialized /home/work/gerrit

这一步想偷懒不做 reindex,但是失败了

No index versions for index 'changes' ready;

run java -jar /home/work/gerrit/bin/gerrit.war reindex --index changes

先升级到 3.2.3 再做 reindex

  • 下一步:2.15 --> 2.16

$ java -jar gerrit-2.16.25.war init --batch --dev -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index projects -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index groups -d ${gerrit-site}

$ java -jar gerrit-2.16.25.war reindex --index changes -d ${gerrit-site}

注意这一步可能会耗时很久, 取决于Gerrit上change的数量大小

  • 启动 gerrit 服务

$ curl localhost:29418

SSH-2.0-GerritCodeReview_2.16.25 (SSHD-CORE-2.0.0)

Unsupported protocol version: GET / HTTP/1.1

  • 继续下一步:2.16 --> 3.0

出现错误ERROR com.google.gerrit.pgm.init.BaseInit : Couldn't upgrade schema. Expected if slave and read-only database

com.google.gerrit.exceptions.StorageException: You appear to be upgrading from a 2.x site, but the NoteDb change migration was not completed. See documentation:

https://gerrit-review.googlesource.com/Documentation/note-db.html#migration

根据文档,必须先进行 NoteDB 迁移

$ java -jar gerrit-2.16.25.war migrate-to-note-db -d ${gerrit-site}

这一步报错了: failed on some changes ,see log

于是需要把 失败的 changid 的相关信息从数据库里删除掉;

# 举一个changeid 的例子

use database_name;

delete from patch_sets where change_id=183663;

delete from patch_set_approvals where change_id=183663;

delete from patch_comments where change_id=183663;

delete from changes where change_id=183663;

delete from change_messages where change_id=183663;

delete from change_id where s=183663;

... ... ...

执行完后,继续进行 migrate


  • 为了提升效(偷)率(懒),写了个自动化脚本

接受命令行输入参数的脚本

#!/bin/bash 
#
#********************************************************************
#Author:                奈文摩尔
#ID:                    xxxxx
#Created:               2021-02-02
#Modified:              2021-02-04  10:27:27
#Email:                 
#Description:           Upgrade gerrit from 2.x to 3.x
#Copyright (C):         2021 All rights reserved
#********************************************************************
# run as work 
# Input Paras :
# 1:gerrit folder (local path)
# 2:dumped sql script (local path)
# 3:remote mysql host/port/user/password
``` Example:  
bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456
```
set -e
if [ ! -n "$1" ] ;thenecho "invalid input , bash xxx  -help to get demo"exit -1
fi
if [[ $1 = "--help" ]] || [[ $1 = "-h" ]]
thenecho "-----------------------------------------------------g  gerrit folder path-d  dump sql script path-h  mysql host name-p  mysql host port-u  mysql login username-w  mysql username passwordExample:  bash gerrit_upgrate.sh -g /home/work/gerrit -d /home/work/gerrit/c3-inf-gerrit-db01.bj.sql -h 10.172.28.40 -p 3315 -u root -w 123456-----------------------------------------------------"exit 0
fi
while getopts "g:d:h:p:u:w:" opt; docase $opt ing)GERRIT_SITE=$OPTARGecho "GERRIT_SITE is $GERRIT_SITE" ;;d)DUMP_SQL=$OPTARGecho "DUMP_SQL is $DUMP_SQL" ;;h)DB_HOST=$OPTARGecho "DB_HOST is $DB_HOST" ;;p)DB_PORT=$OPTARGecho "DB_PORT is $DB_PORT" ;;u)DB_USER=$OPTARGecho "DB_USER is $DB_USER" ;;w)DB_PWD=$OPTARGecho "DB_PWD is $DB_PWD" ;;\?)echo "invalid arg" ;;esac
done
# step 0 : modify gerrit.config
cd ${GERRIT_SITE}/etc/
if [ -f gerrit.config ]; thenmv gerrit.config gerrit-bak.config
fi
if [ -f secure.config ]; thenmv secure.config secure-bak.config
fi
wget https://staging-cnbj2-fds.api.zzz.net/files/gerrit.config
wget https://staging-cnbj2-fds.api.zzz.net/files/secure.config
JDBC_STR="jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false"
sed -i "0,/hostname =/{s/hostname =.*/hostname = ${DB_HOST}/}" gerrit.config
sed -i "0,/username =/{s/username =.*/username = ${DB_USER}/}" gerrit.config
sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" gerrit.config
sed -i "0,/port =/{s/port =.*/port = ${DB_PORT}/}" gerrit.config
sed -i "/url = /c\        url = jdbc:mysql://${DB_HOST}:${DB_PORT}/reviewmiui?autoReconnect=true&characterEncoding=UTF-8&useSSL=false" gerrit.config
sed -i "0,/password =/{s/password =.*/password = ${DB_PWD}/}" secure.config
# sed -i "s/hostname =/    hostname = ${DB_HOST}/g" gerrit.config
# sed -i "s/username =/    username = ${DB_USER}/g" gerrit.config
# sed -i "s/password =/    password = ${DB_PWD}/g" gerrit.config
# sed -i "s/port =/    port = ${DB_PORT}/g" gerrit.config
# sed -i "s/url =/    url = ${JDBC_STR}/g" gerrit.config
# sed -i "s/password =*/    password = ${DB_PWD}/g" secure.config
# step 1 : delete replication /  hA config
RPC_CONFIG=${GERRIT_SITE}/etc/replication.config
HA_CONFIG=${GERRIT_SITE}/etc/high-availability.config
rm -rf ${RPC_CONFIG}
rm -rf ${HA_CONFIG}
# delete confirm
if [ -f "${RPC_CONFIG}"] || [ -f "${HA_CONFIG}" ];
thenecho "config file delete failed: ${RPC_CONFIG} or ${HA_CONFIG}"exit -1
fi
# step 2 : download pkg
cd ${GERRIT_SITE}
cd ..
rm -rf gerrit-*.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.15.21.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-2.16.25.war
wget https://staging-cnbj2-fds.api.zzzzz.net/files/gerrit-3.2.3.war
if [ ! -f "delete_dirty_changeids.sql" ]; thenwget https://staging-cnbj2-fds.api.zzzzz.net/files/delete_dirty_changeids.sql
fi
# step 3 : Loading dump data into DB
echo "-------------------- split line ---------------------------"
echo "start loading data :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
mysql -h${DB_HOST}  -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < ${DUMP_SQL}
mysql -h${DB_HOST}  -P${DB_PORT} -u${DB_USER} -p${DB_PWD} --verbose < delete_dirty_changeids.sql
# step 4 : upgrate from 2.13  --> 2.15
echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
cd ${GERRIT_SITE}/lib 
wget https:///mysql-connector-java-5.1.43.jar
mkdir -p ${GERRIT_SITE}/ha/1/gerrit/shared
cd -
java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}
# step 5 : upgrate from 2.15 --> 2.16
echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
cd ${GERRIT_SITE}/lib 
wget https://staging-cnbj2-fds.api.zzzzz.net/files/mysql-connector-java-5.1.48.jar
cd -
java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}
# step 6 : migrate on 2.16
echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
rm -rf ${GERRIT_SITE}/etc/notedb.config
nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &
while true
doecho "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; thenecho "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logbreakfiif test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; thenecho "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logexit -1fisleep 1m
done
# step 7 : upgrate from 2.16  --> 3.2.3
echo "start 3.2.3 : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-3.2.3.war init --batch --dev -d ${GERRIT_SITE}
# step 8 : reindex on 3.2.3
echo "Reindex accounts : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-3.2.3.war reindex --index accounts -d ${GERRIT_SITE}
echo "Reindex changes : $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
nohup java -jar gerrit-3.2.3.war reindex --index changes -d ${GERRIT_SITE} > "reindex-$(date "+%Y-%m-%d-%H-%M-%S").log" 2>&1 &

可固定参数的脚本:

#!/bin/bash
set -eexport GERRIT_SITE=/home/work/hdd1/gerrit_odm
cd ${GERRIT_SITE}/lib
rm -rf ${GERRIT_SITE}/lib/*
wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.43.jarcd /home/work/hdd1
echo "start 2.15 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-2.15.21.war init --batch --dev -d ${GERRIT_SITE}cd ${GERRIT_SITE}/lib
rm -rf ${GERRIT_SITE}/lib/*
wget https://staging-cnbj2-fds.api.xiaomi.net/files/mysql-connector-java-5.1.48.jarcd -
echo "start 2.16 :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
java -jar gerrit-2.16.25.war init --batch --dev -d ${GERRIT_SITE}echo "start migrate :$(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.log
nohup java -jar gerrit-2.16.25.war migrate-to-note-db --reindex false -d ${GERRIT_SITE} > mi.log 2>&1 &while true
doecho "Waiting for NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")"if test ! -z "$(tail -n 20 mi.log | grep 'NoteDB Migration complete.')"; thenecho "NoteDB Migration complete: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logbreakfiif test ! -z "$(tail -n 20 mi.log | grep 'fatal: Migrating primary storage for some changes failed, see log')"; thenecho "fatal: Migrating primary storage for some changes failed, see log: $(date "+%Y-%m-%d %H:%M:%S")" >> upgrade_time.logexit -1fisleep 1m
done

编辑于 2021-05-13 11:47

相关文章:

Gerrit | 重磅! 2.x 版本升级到 3.x 版本----转

Gerrit | 重磅! 2.x 版本升级到 3.x 版本 为什么要做版本升级&#xff1f; 2.x known bugs 重大问题不一一列举&#xff0c;这里仅仅是举几个例子&#xff1a; 安全或权限问题&#xff1a;普通用户能看到敏感数据&#xff0c;例如看到其他用户的 hashed api 密码&#xff0c…...

使用c++编程语言,用递归的方法求第n个斐波那契数,代码如下

#include<iostream> using namespace std;int fib_1(int n) {if (n < 1){return n;}return fib_1(n - 1) fib_1(n - 2); }int main() {cout << fib_1(6);return 0; }...

git config pull.rebase false

git pull 默认使用merge 可以使用 git pull --rebase 命令使用rebase 或者配置 git config pull.rebase true 使 git pull命令执行 git pull --rebase git config pull.rebase false 的作用是设置 Git 在执行 git pull 命令时默认使用 merge 而不是 rebase。 git pull 命…...

Spring面试题:(一)IoC,DI,AOP和BeanFactory,ApplicationContext

IoC&#xff0c;DI&#xff0c;AOP思想 IOC就是控制反转&#xff0c;是指创建对象的控制权的转移。以前创建对象的主动权和时机是由自己把控的&#xff0c;而现在这种权力转移到Spring容器中&#xff0c;并由容器根据配置文件去创建实例和管理各个实例之间的依赖关系。对象与对…...

RabbitMQ如何保证消息不丢失呢?

RabbitMQ 是一个流行的消息队列系统&#xff0c;用于在分布式应用程序之间传递消息。要确保消息不会丢失&#xff0c;可以采取以下一些措施&#xff1a; 持久化消息&#xff1a; RabbitMQ 允许你将消息标记为持久化的。这意味着消息将被写入磁盘&#xff0c;即使 RabbitMQ 服务…...

VR步进式漫游,轻松构建三维模型,带来展示新形式!

引言&#xff1a; 虚拟现实&#xff08;Virtual Reality&#xff0c;简称VR&#xff09;已经成为当今科技领域的一项创新力量&#xff0c;它正在逐渐渗透到不同的领域&#xff0c;其中步进式漫游是VR技术的一项重要应用&#xff0c;它能在各个行业的宣传中发挥重要作用。 一&a…...

英语——分享篇——常用人物身份

常用人物身份 家庭成员类 father 父亲 mother 母亲 grandmother&#xff08;外&#xff09;祖母 grandfather&#xff08;外&#xff09;祖父 son 儿子 daughter 女儿 uncle 叔叔&#xff0c;舅舅 aunt 婶母&#xff0c;舅母 brother 兄弟 sister 姐妹 nephew 侄子 niece…...

202310-宏基组学物种分析工具-MetaPhlAn4安装和使用方法-Anaconda3- centos9 stream

MetaPhlAn 4是一种基于DNA序列的微生物组分析工具&#xff0c;它能够从宏基因组测序数据中识别和分离微生物的组成。以下是安装和使用MetaPhlAn 4的步骤&#xff1a; 安装MetaPhlAn 4&#xff1a; 裸机环境&#xff0c;手动安装 1. 安装依赖项&#xff1a; MetaPhlAn 4需要…...

systrace/perfetto如何看surfaceflinger的vsync信号方法-android framework实战车载手机系统开发

背景&#xff1a; hi&#xff0c;粉丝朋友们&#xff1a; 大家好&#xff01;近期分享了surfaceflinger相关的一些blog&#xff0c;有同学就对相关的一些内容产生了一些疑问。 比如&#xff1a;vsync查看问题&#xff0c;即怎么才可以说是vsync到来了。 比如perfetto中surfac…...

一文带你彻底弄懂js事件循环(Event Loop)

JavaScript事件循环是JavaScript运行时环境中处理异步操作的机制。它允许JavaScript在执行同步代码的同时处理异步任务&#xff0c;以避免阻塞线程并提供更好的用户体验。 本文将在浏览器异步执行原理基础上带你彻底弄懂js的事件循环机制。 浏览器JS异步执行原理 js是单线程…...

数据结构与算法:二叉树之“堆排序”

目录 一、树概念及结构 二、二叉树树概念及结构 特殊的二叉树 三、堆的概念及结构 四、堆的创建 1、声明结构体 2、初始化 3、销毁 4、添加新元素 5、交换元素 6、向上调整 7、判断堆是否为空 8、移除堆顶元素 9、向下调整 10、获取堆元素个数 五、使用堆排序…...

gma 2 教程(三)坐标参考系统:2.基准面/椭球体

安装 gma&#xff1a;pip install gma 地球是一个近似于椭球体的三维物体&#xff0c;而地球上的各种测量和计算都需要一个基准面来进行。基准面是一个虚拟的平面&#xff0c;用于测量和计算地球上的各种物理量。在地球科学中&#xff0c;基准面通常是一个参考椭球体&#xff0…...

【1day】复现广联达-Linkworks 协同办公管理平台信息泄露漏洞

注:该文章来自作者日常学习笔记,请勿利用文章内的相关技术从事非法测试,如因此产生的一切不良后果与作者无关。 目录 一、漏洞描述 二、影响版本 三、资产测绘 四、漏洞复现...

Spring Cloud之ElasticSearch的学习【详细】

目录 ElasticSearch 正向索引与倒排索引 数据库与elasticsearch概念对比 安装ES、Kibana与分词器 分词器作用 自定义字典 拓展词库 禁用词库 索引库操作 Mapping属性 创建索引库 查询索引库 删除索引库 修改索引库 文档操作 新增文档 查找文档 修改文档 全量…...

vscode免密码认证ssh连接virtual box虚拟机

文章目录 安装软件virtual box配置vscode配置创建并传递密钥连接虚拟机最后 安装软件 安装vscode和virtual box&#xff0c;直接官网下载对应软件包&#xff0c;下载之后&#xff0c;点击执行&#xff0c;最后傻瓜式下一步安装即可 virtual box配置 创建一个仅主机网络的网卡 …...

【Linux】Centos yum源替换

YUM是基于RPM包管理&#xff0c;能够从指定的服务器自动下载RPM包并且安装&#xff0c;可以自动处理依赖性关系&#xff0c;并且一次安装所有依赖的软件包&#xff0c;无须繁琐地一次次下载、安装。 CentOS 8操作系统版本结束了生命周期&#xff08;EOL&#xff09;&#xff0…...

uniapp组件初始化的销毁(监听隐藏事件)

onHide是监听隐藏事件onHide() {console.log("销毁");this.clearTimer(); }, onShow(){console.log("初始化");this.getOrderInfo() },...

leetcode:1207. 独一无二的出现次数(python3解法)

难度&#xff1a;简单 给你一个整数数组 arr&#xff0c;请你帮忙统计数组中每个数的出现次数。 如果每个数的出现次数都是独一无二的&#xff0c;就返回 true&#xff1b;否则返回 false。 示例 1&#xff1a; 输入&#xff1a;arr [1,2,2,1,1,3] 输出&#xff1a;true 解释&…...

2023秋《论文写作》课程总结

2023秋《论文写作》课程总结 授课教师为闵帆教授&#xff0c;原文链接《论文写作》 文章目录 2023秋《论文写作》课程总结一、关于写作工具二、关于写作中的单词、短语、语法等三、关于论文题目四、关于摘要和关键词五、关于引言部分六、关于方法及实验部分七、关于结论八、关…...

Linux学习第27天:Platform设备驱动开发: 专注与分散

Linux版本号4.1.15 芯片I.MX6ULL 大叔学Linux 品人间百味 思文短情长 专注与分散是我在题目中着重说明的一个内容。这是今天我们要学习分离与分层概念的延伸。专注是说我们要专注某层驱动的开发&#xff0c;而对于其他层则是芯片厂商…...

模型参数、模型存储精度、参数与显存

模型参数量衡量单位 M&#xff1a;百万&#xff08;Million&#xff09; B&#xff1a;十亿&#xff08;Billion&#xff09; 1 B 1000 M 1B 1000M 1B1000M 参数存储精度 模型参数是固定的&#xff0c;但是一个参数所表示多少字节不一定&#xff0c;需要看这个参数以什么…...

(二)TensorRT-LLM | 模型导出(v0.20.0rc3)

0. 概述 上一节 对安装和使用有个基本介绍。根据这个 issue 的描述&#xff0c;后续 TensorRT-LLM 团队可能更专注于更新和维护 pytorch backend。但 tensorrt backend 作为先前一直开发的工作&#xff0c;其中包含了大量可以学习的地方。本文主要看看它导出模型的部分&#x…...

【C语言练习】080. 使用C语言实现简单的数据库操作

080. 使用C语言实现简单的数据库操作 080. 使用C语言实现简单的数据库操作使用原生APIODBC接口第三方库ORM框架文件模拟1. 安装SQLite2. 示例代码:使用SQLite创建数据库、表和插入数据3. 编译和运行4. 示例运行输出:5. 注意事项6. 总结080. 使用C语言实现简单的数据库操作 在…...

vue3+vite项目中使用.env文件环境变量方法

vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量&#xff0c;这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...

C++八股 —— 单例模式

文章目录 1. 基本概念2. 设计要点3. 实现方式4. 详解懒汉模式 1. 基本概念 线程安全&#xff08;Thread Safety&#xff09; 线程安全是指在多线程环境下&#xff0c;某个函数、类或代码片段能够被多个线程同时调用时&#xff0c;仍能保证数据的一致性和逻辑的正确性&#xf…...

AGain DB和倍数增益的关系

我在设置一款索尼CMOS芯片时&#xff0c;Again增益0db变化为6DB&#xff0c;画面的变化只有2倍DN的增益&#xff0c;比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析&#xff1a; 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...

PostgreSQL——环境搭建

一、Linux # 安装 PostgreSQL 15 仓库 sudo dnf install -y https://download.postgresql.org/pub/repos/yum/reporpms/EL-$(rpm -E %{rhel})-x86_64/pgdg-redhat-repo-latest.noarch.rpm# 安装之前先确认是否已经存在PostgreSQL rpm -qa | grep postgres# 如果存在&#xff0…...

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的----NTFS源代码分析--重要

根目录0xa0属性对应的Ntfs!_SCB中的FileObject是什么时候被建立的 第一部分&#xff1a; 0: kd> g Breakpoint 9 hit Ntfs!ReadIndexBuffer: f7173886 55 push ebp 0: kd> kc # 00 Ntfs!ReadIndexBuffer 01 Ntfs!FindFirstIndexEntry 02 Ntfs!NtfsUpda…...

人工智能--安全大模型训练计划:基于Fine-tuning + LLM Agent

安全大模型训练计划&#xff1a;基于Fine-tuning LLM Agent 1. 构建高质量安全数据集 目标&#xff1a;为安全大模型创建高质量、去偏、符合伦理的训练数据集&#xff0c;涵盖安全相关任务&#xff08;如有害内容检测、隐私保护、道德推理等&#xff09;。 1.1 数据收集 描…...

HybridVLA——让单一LLM同时具备扩散和自回归动作预测能力:训练时既扩散也回归,但推理时则扩散

前言 如上一篇文章《dexcap升级版之DexWild》中的前言部分所说&#xff0c;在叠衣服的过程中&#xff0c;我会带着团队对比各种模型、方法、策略&#xff0c;毕竟针对各个场景始终寻找更优的解决方案&#xff0c;是我个人和我司「七月在线」的职责之一 且个人认为&#xff0c…...