代码评审平台Gerrit安装配置方法介绍

news2024/11/25 14:43:46

Gerrit是一款开源免费的基于 web 的代码审查工具,是基于 Git 的版本控制系统。在代码入库之前对开发人员的提交进行审阅,检视通过的代码才能提交入库。本文记录如何安装部署gerrit平台。

目录

  • Gerrit简介
  • 环境准备
    • 1. 安装Java
    • 2. 安装Git
    • 3. 安装nginx
    • 4. 安装Apache
  • Gerrit安装配置
    • 1. 下载
    • 2. 安装
    • 3. nginx反向代理
    • 4. 创建用户名密码
    • 5. 启动
    • 6. 邮箱配置
  • 用户创建
  • 创建项目仓库
  • Git ssh key配置
    • 1. 创建 ssh key
    • 2. gerrit添加公钥
    • 3. 生成ppk私钥文件
    • 4. 添加私钥
  • 拉取项目仓库
  • 提交代码
  • 审核代码

Gerrit简介

Gerrit代码审查工具也是一个Git服务器,使用Git作为底层版本控制系统,当前的版本使用Java开发。

一个典型的Git项目包含一个远程中央仓库,

https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.2/intro-how-gerrit-works.html

Gerrit在Git中央仓库基础上引入了一个额外的概念:存储修改的暂存区,

https://gerrit-documentation.storage.googleapis.com/Documentation/3.6.2/intro-how-gerrit-works.html

push的代码更改会被存储到暂存区(Pending changes),其他人评审通过后就可以将更改提交到代码库 (Authoritative Repository)。

下面介绍如何安装部署gerrit。

环境准备

本文介绍Linux中gerrit的安装配置方法,Windows安装可参考官方文档:https://gerrit-documentation.storage.googleapis.com/Documentation/3.7.2/install.html

1. 安装Java

Linux服务器需要先安装好Java环境

$ yum -y install java-11-openjdk.x86_64
$ java -version
openjdk version "11.0.16" 2022-07-19 LTS
OpenJDK Runtime Environment (Red_Hat-11.0.16.0.8-1.el7_9) (build 11.0.16+8-LTS)
OpenJDK 64-Bit Server VM (Red_Hat-11.0.16.0.8-1.el7_9) (build 11.0.16+8-LTS, mixed mode, sharing)

2. 安装Git

安装最新版本git

$ git --version
git version 2.9.5
$ sudo yum -y remove git
$ sudo yum -y install https://packages.endpointdev.com/rhel/7/os/x86_64/endpoint-repo.x86_64.rpm
$ sudo yum install git
$ git --version
git version 2.39.2

3. 安装nginx

安装nginx用于反向代理。

1、下载nginx安装包nginx-1.22.1.tar.gz:http://nginx.org/en/download.html

2、解压:

$ tar -xvzf nginx-1.22.1.tar.gz

3、安装:

$ cd nginx-1.22.1
$ pwd
/usr/local/nginx-1.22.1
$ ./configure
$ make
$ make install

4、启动nginx:

$ cd /usr/local/nginx/sbin
$ ./nginx
$ ps -aux | grep nginx | grep -v grep 
root      13581  0.0  0.0  20576   620 ?        Ss   21:56   0:00 nginx: master process ./nginx
nobody    13583  0.0  0.0  23104  1372 ?        S    21:56   0:00 nginx: worker process
$ ./nginx -t
nginx: the configuration file /usr/local/nginx/conf/nginx.conf syntax is ok
nginx: configuration file /usr/local/nginx/conf/nginx.conf test is successful

或者使用命令 systemctl start nginx.service 启动。

浏览器访问:http://192.168.30.8/

关闭nginx命令:

$ ./nginx -s stop
$ ./nginx -s quit

刷新配置文件:

$ ./nginx -s reload

其中配置文件路径为:/usr/local/nginx/conf/nginx.conf

接下来配置nginx开机启动:

/lib/systemd/system/ 目录下创建 nginx.service 文件:

$ vim /lib/systemd/system/nginx.service

输入如下内容:https://www.nginx.com/resources/wiki/start/topics/examples/systemd/

[Unit]
Description=The NGINX HTTP and reverse proxy server
After=syslog.target network-online.target remote-fs.target nss-lookup.target
Wants=network-online.target

[Service]
Type=forking
PIDFile=/usr/local/nginx/logs/nginx.pid
ExecStartPre=/usr/local/nginx/sbin/nginx -t
ExecStart=/usr/local/nginx/sbin/nginx
ExecReload=/usr/local/nginx/sbin/nginx -s reload
ExecStop=/usr/local/nginx/sbin/nginx -s quit
PrivateTmp=true

[Install]
WantedBy=multi-user.target

加入开机自启动

$ systemctl enable nginx
Created symlink from /etc/systemd/system/multi-user.target.wants/nginx.service to /usr/lib/systemd/system/nginx.service.

其它命令:

$ systemctl reload nginx.service  # 重新加载nginx配置
$ systemctl start nginx.service  # 启动nginx服务
$ systemctl stop nginx.service   # 停止nginx服务
$ systemctl restart nginx.service # 重启nginx服务
$ systemctl status nginx.service  # 查看nginx服务当前状态
$ systemctl disable nginx.service # 停止开机自启动

4. 安装Apache

安装Apache用于http认证

$ yum install httpd

Gerrit安装配置

1. 下载

gerrit各版本下载地址:https://www.gerritcodereview.com/releases-readme.html

war包下载完成后把它发送到Linux服务器,如果服务器可以联网,也可以直接执行以下命令下载:

$ wget https://gerrit-releases.storage.googleapis.com/gerrit-3.7.2.war –no-check-certificate

2. 安装

执行以下命令安装Gerrit:

$ cd ~/gerrit
$ export GERRIT_SITE=~/gerrit/gerrit_testsite
$ java -jar gerrit*.war init --batch --dev -d $GERRIT_SITE
$ java -jar gerrit*.war init -d $GERRIT_SITE
Using secure store: com.google.gerrit.server.securestore.DefaultSecureStore
[2023-04-02 09:58:38,456] [main] INFO  com.google.gerrit.server.config.GerritServerConfigProvider : No /root/gerrit/gerrit_testsite/etc/gerrit.config; assuming defaults

*** Gerrit Code Review 3.7.2
*** 


*** Git Repositories
*** 

Location of Git repositories   [git]: 

*** JGit Configuration
*** 


*** Index
*** 

Type                           [lucene]: 

*** User Authentication
*** 

Authentication method          [openid/?]: oauth
Git/HTTP authentication        [http/?]: 
Enable signed push support     [y/N]? 

*** Review Labels
*** 

Install Verified label         [y/N]? y

*** Email Delivery
*** 

SMTP server hostname           [localhost]: smtp.163.com
SMTP server port               [(default)]: 
SMTP encryption                [none/?]: 
SMTP username                  [root]: XXXXXXXXX@163.com
XXXXXXXXX@163.com's password   : 
              confirm password : 

*** Container Process
*** 

Run as                         [root]: 
Java runtime                   [/usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.el7_9.x86_64]: 
Copy gerrit-3.7.2.war to /root/gerrit/gerrit_testsite/bin/gerrit.war [Y/n]? 
Copying gerrit-3.7.2.war to /root/gerrit/gerrit_testsite/bin/gerrit.war

*** SSH Daemon
*** 

Listen on address              [*]: 
Listen on port                 [29418]: 
Generating SSH host key ... rsa... ed25519... ecdsa 256... ecdsa 384... ecdsa 521... done

*** HTTP Daemon
*** 

Behind reverse proxy           [y/N]? 
Use SSL (https://)             [y/N]? y
Listen on address              [*]: 127.0.0.1
Listen on port                 [8443]: 8081
Canonical URL                  [https://127.0.0.1:8081/]: http://192.168.30.8:8081
Create new self-signed SSL certificate [Y/n]? 
Certificate server name        [192.168.30.8:8081]: 
Certificate expires in (days)  [365]: 36500

*** Cache
*** 


*** Plugins
*** 

Installing plugins.
Install plugin codemirror-editor version v3.7.2 [y/N]? y
Installed codemirror-editor v3.7.2
Install plugin commit-message-length-validator version v3.7.2 [y/N]? y
Installed commit-message-length-validator v3.7.2
Install plugin delete-project version v3.7.2 [y/N]? y
Installed delete-project v3.7.2
Install plugin download-commands version v3.7.2 [y/N]? y
Installed download-commands v3.7.2
Install plugin gitiles version v3.7.2 [y/N]? y
Installed gitiles v3.7.2
Install plugin hooks version v3.7.2 [y/N]? y
Installed hooks v3.7.2
Install plugin plugin-manager version v3.7.2 [y/N]? y
Installed plugin-manager v3.7.2
Install plugin replication version v3.7.2 [y/N]? y
Installed replication v3.7.2
Install plugin reviewnotes version v3.7.2 [y/N]? y
Installed reviewnotes v3.7.2
Install plugin singleusergroup version v3.7.2 [y/N]? y
Installed singleusergroup v3.7.2
Install plugin webhooks version v3.7.2 [y/N]? y
Installed webhooks v3.7.2
Initializing plugins.

============================================================================
Welcome to the Gerrit community

Find more information on the homepage: https://www.gerritcodereview.com
Discuss Gerrit on the mailing list: https://groups.google.com/g/repo-discuss
============================================================================
Initialized /root/gerrit/gerrit_testsite
$  

其中 ~/gerrit 是我的gerrit安装路径,出现 Starting Gerrit Code Review: OK 表示启动成功。

gerrit配置文件路径为:/root/gerrit/gerrit_testsite/etc/gerrit.config,我的gerrit.config文件内容如下:

[gerrit]
        basePath = git
        canonicalWebUrl = http://192.168.30.8:8081
        serverId = 737ce77e-a02f-4e6e-ab7b-daff97faf5da
[container]
        javaOptions = "-Dflogger.backend_factory=com.google.common.flogger.backend.log4j.Log4jBackendFactory#getInstance"
        javaOptions = "-Dflogger.logging_context=com.google.gerrit.server.logging.LoggingContext#getInstance"
        user = root
        javaHome = /usr/lib/jvm/java-11-openjdk-11.0.16.0.8-1.el7_9.x86_64
[index]
        type = lucene
[auth]
        type = http
        gitBasicAuthPolicy = HTTP
[receive]
        enableSignedPush = false
[sendemail]
        smtpServer = smtp.163.com
        smtpUser = XXXXXXXXX@163.com
        smtpServerPort = 25
        from = XXXXXXXXX@163.com
[sshd]
        listenAddress = *:29418
[httpd]
        listenUrl = http://192.168.30.8:8081/
[cache]
        directory = cache

停止命令:

$ /root/gerrit/gerrit_testsite/bin/gerrit.sh stop
Stopping Gerrit Code Review: OK

启动命令:

$ /root/gerrit/gerrit_testsite/bin/gerrit.sh start
Starting Gerrit Code Review: OK

重启命令:

$ /root/gerrit/gerrit_testsite/bin/gerrit.sh restart
Stopping Gerrit Code Review: OK
Starting Gerrit Code Review: OK

设置开机自动启动gerrit:

$ sudo ln -snf /root/gerrit/gerrit_testsite/bin/gerrit.sh  /etc/init.d/gerrit.sh

修改文件 /etc/init.d/gerrit.sh 设置gerrit安装路径GERRIT_SITE:

##################################################
# No GERRIT_SITE yet? We're out of luck!
##################################################
if test -z "$GERRIT_SITE" ; then
    GERRIT_SITE="/root/gerrit/gerrit_testsite"
fi

然后执行:

$ chkconfig --add gerrit.sh
$ chkconfig gerrit.sh on

3. nginx反向代理

编辑nginx配置文件vim /usr/local/nginx/conf/nginx.conf,添加如下内容:

server {
        listen       80;
        server_name  localhost;
        index index.html index.htm index.php;
        access_log  /usr/local/nginx/logs/gerrit.access.log;
        error_log  /usr/local/nginx/logs/gerrit.error.log;
        allow   all;
        deny    all;
        auth_basic "Welcomme to Gerrit Code Review Site!"; 
        auth_basic_user_file /root/gerrit/gerrit_testsite/etc/gerrit.password; 
        location / {
                proxy_pass http://localhost:8081;
       }
}   

auth_basic_user_file 是用来保存gerrit用户名密码的文件。

重新加载配置:

$ systemctl reload nginx.service

4. 创建用户名密码

使用 htpasswd 命令创建用户名密码:

$ touch /root/gerrit/gerrit_testsite/etc/gerrit.password
$ htpasswd -c /root/gerrit/gerrit_testsite/etc/gerrit.password admin
New password:
Re-type new password:
Adding password for user admin

5. 启动

重启nginx:

$ systemctl reload nginx.service
$ systemctl restart nginx.service

重启gerrit:

$ /root/gerrit/gerrit_testsite/bin/gerrit.sh restart

启动成功后,浏览器访问gerrit:http://192.168.30.8/,其中192.168.30.8是我的服务器IP地址。

页面会弹出登录页面,输入创建的管理员用户名密码进行登录。

认证成功后会跳转到gerrit页面

6. 邮箱配置

登录成功后,进入’Settings’ > ‘Email Addresses’ 配置邮箱。

点击 ‘Send verification’ 后设置的邮箱会收到一封认证邮件

访问邮件中的链接(将localhost:8081改为主机地址192.168.30.8)[http://192.168.30.8/#/VE/xdQBwdHcOpmrDGWJdqnUIQNqNMTf6F6x9PQQ1A==KaTeX parse error: Expected 'EOF', got '#' at position 64: ….168.30.8:8081/#̲/VE/xdQBwdHcOpm…MTAwMDAwMDoxMDI4NzQwOTc2QHFxLmNvbQ==) 即可认证成功。

用户创建

和前面介绍的创建管理员账户一样,使用htpasswd 命令创建普通用户:

$ htpasswd -b /root/gerrit/gerrit_testsite/etc/gerrit.password gerrit 123456
Adding password for user gerrit

创建成功后使用用户名密码登录gerrit并配置邮箱即可。

创建项目仓库

主要有四种创建仓库方式:

1、Web页面进入’Browse’ > ‘Repositories’ > ‘CREATE NEW’

创建完成后进行仓库配置:

2、通过gerrit REST API创建

请求接口为 PUT /projects/{project-name},请求次数参考https://gerrit-documentation.storage.googleapis.com/Documentation/3.7.2/rest-api-projects.html#create-project

3、通过SSH 命令创建

ssh -p <port> <host> gerrit create-project { <NAME> }

可用参数选项可参考https://gerrit-documentation.storage.googleapis.com/Documentation/3.7.2/cmd-create-project.html

4、也可以直接在gerrit服务器上手动创建

具体可参考https://gerrit-documentation.storage.googleapis.com/Documentation/3.7.2/project-configuration.html#manual_project_creation

Git ssh key配置

开发环境需要安装Git,Windows和Linux系统上Git安装方法可参考Git简易教程-安装及简单使用。gerrit支持HTTP和SSH两种方式克隆项目,本文介绍SSH认证方式的配置方法。

1. 创建 ssh key

这一步目的是在本地(开发电脑)生成用于认证的公钥和私钥。

由于安全原因,GIT 2.33 及之后的版本禁用了 ssh-rsa 公钥签名算法,可使用ed25519算法来生成秘钥:

$ ssh-keygen -t ed25519 -C "123456789@qq.com" # 邮件地址是在gerrit平台上配置的邮箱 

密码不用设置,回车即可:

$ ssh-keygen -t ed25519 -C "123456789@qq.com"
Generating public/private ed25519 key pair.
Enter file in which to save the key (/c/Users/10287/.ssh/id_ed25519): 
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in id_ed25519
Your public key has been saved in id_ed25519.pub
The key fingerprint is:
SHA256:Ufs5p/nzaZ7dKQG8un2IRYkClI+Ro4+oT0f/8cCd+VE 123456789@qq.com
The key's randomart image is:
+--[ED25519 256]--+
|    ..o   .      |
|     *   . .     |
|    . * . + .    |
|   . . o o * .   |
|  . +   S . * E  |
| . o o . . = B   |
|. . . . + B = .  |
|.. .   . *.o =..*|
| ..     ..o.o =B+|
+----[SHA256]-----+

执行完成后会在 ~/.ssh 目录下生成id_ed25519(私钥)和 id_ed25519.pub(公钥)这两个秘钥文件。

进入 .ssh 文件夹下,可以看到生成的秘钥文件:

$ cd ~/.ssh # 进入 .ssh 文件夹下
$ ls
id_ed25519  id_ed25519.pub known_hosts

2. gerrit添加公钥

访问gerrit,将生成的公钥添加到Gerrit SSH Keys中。

复制公钥:

$ cat id_ed25519.pub
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIPHx9bqXz3Hp9mpz0fC/1IcfkVASqZG6oecab3ItcW8j 123456789@qq.com

登录Gerrit,点击Setting,找到SSH Keys,粘贴复制的公钥,然后点击 ‘Add new SSH key’

3. 生成ppk私钥文件

ppk私钥文件用于使用git GUI 克隆代码时使用的秘钥文件。

进入 ~/.ssh 目录下,复制前面生成的私钥文件 id_ed25519 为后缀为ppk的文件:

$ cp id_ed25519 id_ed25519.ppk

打开PuTTYgen工具,点击【load】,加载复制的id_rsa_gerrit.ppk文件

导入成功后,点击【Save private key】保存私钥,可以新创建一个文件或者覆盖原来复制的ppk文件。

4. 添加私钥

打开Pageant工具,加载保存的私钥文件。

拉取项目仓库

公钥和私钥配置完成后,就可以克隆gerrit上的仓库了。登录gerrit,进入要克隆的仓库,选择ssh方式,复制clone命令。

$ git clone "ssh://admin@192.168.30.8:29418/gerritDemo" && (cd "gerritDemo" && mkdir -p `git rev-parse --git-dir`/hooks/ && curl -Lo `git rev-parse --git-dir`/hooks/commit-msg http://192.168.30.8:8081/tools/hooks/commit-msg && chmod +x `git rev-parse --git-dir`/hooks/commit-msg)

上面的clone代码执行完成后,仓库 /.git/hooks 目录下面会有一个commit-msg钩子文件。

提交代码

提交示例:

$ echo test > test.txt
$ git status
On branch master
Your branch is up to date with 'origin/master'.

Untracked files:
  (use "git add <file>..." to include in what will be committed)
        test.txt

nothing added to commit but untracked files present (use "git add" to track)
$ git add test.txt
warning: in the working copy of 'test.txt', LF will be replaced by CRLF the next time Git touches it
$ git commit -m "gerrit提交测试"
[master 6e78c4e] gerrit提交测试
 1 file changed, 1 insertion(+)
 create mode 100644 test.txt

$ git push --progress "origin" master:refs/for/master
Enumerating objects: 4, done.
Counting objects: 100% (4/4), done.
Writing objects: 100% (3/3), 303 bytes | 303.00 KiB/s, done.
Total 3 (delta 0), reused 0 (delta 0), pack-reused 0
remote: Processing changes: refs: 1, new: 1, done
remote:
remote: SUCCESS
remote:
remote:   http://192.168.30.8:8081/c/gerritDemo/+/1 gerrit提交测试 [NEW]
remote:
To ssh://192.168.30.8:29418/gerritDemo
 * [new reference]   master -> refs/for/master

注意:push的远程分支为 refs/for/master,如果使用master分支会直接push到中央仓库,不会到暂存区。

审核代码

push成功后登录gerrit,可以看到刚才的提交

进入此次提交详细页面,可对提交的代码进行评审:

具体操作方法这里不做更多介绍了,可参考官方示例:https://gerrit-documentation.storage.googleapis.com/Documentation/3.7.2/intro-gerrit-walkthrough.html

评审通过后,点击SUBMIT提交到主仓库。

--THE END--

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

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

相关文章

宝塔面板+悟空CRM功能模块安装搭建部署教程 环境配置

悟空CRM目录结构 wk_modules ├── module – 无代码模块 ├── common – 基础模块 平台使用的主要技术栈 名称 版本 说明 spring-cloud-alibaba 2021.0.4 核心框架 spring-boot 2.6.11 spring版本 mybatis-plus 3.5.2 ORM框架 nacos 2.1.0 注册中心以及配置管理 seata 1.2.…

论文笔记:A Simple Framework for Contrastive Learning of Visual Representations

0 简介 论文&#xff1a;A Simple Framework for Contrastive Learning of Visual Representations 代码&#xff1a;https://github.com/google-research/simclr 发表&#xff1a;2020年发表在ICML会议上 1 核心思想 如何构建对比学习的比较对象&#xff1f;本文按如下方式…

国民技术N32G430开发笔记(8)- 内部Flash的读写操作

N32G430 内部Flash的读写操作 1、主存储区最大为 64KB&#xff0c;也称作主闪存存储器&#xff0c;包含 32 个 Page&#xff0c;用于用户程序的存放和运行&#xff0c;以及数 据存储。 每一页的大小为2K字节 2、IAP 升级我们将64K的flash分区如下&#xff1a; Boot 0x800000…

scanf老是出错?带你详细解决输入缓冲区问题

文章目录 1.前言2.getchar 和 putchar3.缓冲区问题3.1先观察一个代码3.2输入缓冲区3.3清除缓冲区 结尾 1.前言 我们一般在进行输入输出的时候&#xff0c;就会用到 scanf / printf 。并且根据格式指定可以输入输出各种类型的数据。可以输入整形&#xff0c;字符&#xff0c;浮…

【元分析研究方法】学习笔记4.评估研究的质量

评估研究的质量 该步骤的作用该步骤中需要注意的问题该步骤中知识点1&#xff1a;判断编码的分类方式该步骤中知识点2&#xff1a;统计识别异常值 参考来源&#xff1a;库珀 (Cooper, H. M. )., 李超平, & 张昱城. (2020). 元分析研究方法: A step-by step approach. 中国人…

SpringBoot的事务与锁

在一人一单问题里&#xff0c;为什么加了事务还是会出现一人下多单呢&#xff1f; 本质的原因是&#xff0c;我们使用Java的对象锁&#xff0c;可以保证临界区只有一个线程访问&#xff0c;但是这和SpringBoot里加Transactional注解不是等价的。数据库里的事务保证的是要么全部…

ChatGPT+Word的智能化文字生成和应用

在Word中引入OpenAI代码需要使用VBA编辑器。以下是在Word中引入OpenAI代码的步骤&#xff1a; 打开Word文档&#xff0c;按下Alt F11键打开VBA编辑器。 在VBA编辑器中&#xff0c;选择“插入”菜单&#xff0c;然后选择“模块”。 在新建的模块中&#xff0c;将OpenAI代码粘…

【教学类-35-01】(256*256*256)RGB色卡图片

作品展示&#xff1a; 背景需求&#xff1a; 甲流传染病&#xff0c;班级来了三位孩子&#xff0c;他们玩折纸的时候讨论&#xff0c; 09号问&#xff1a;“绿色和蓝色混合是什么颜色&#xff1f;” 08号问&#xff1a;“绿色加蓝色加浅蓝合在一起是什么颜色” 17号说&…

逆向学习X64DBG

目标游戏&#xff1a;焰影神兵 目的&#xff1a;更改玩家名称&#xff08;中文名称&#xff09; 使用X64dbg可以快速搜索游戏人名&#xff0c;所以本次逆向使用该工具进行工作。 原来的名字&#xff1a;平家物语 现在我们想改成&#xff1a;源氏物语。所以打开X32/64dbg 附…

免费域名申请

title: 免费域名申请 20230428153405|left &#x1f308;Description&#xff1a; ​ 本文将介绍如何免费申请域名&#xff0c;在最近的折腾中发现&#xff0c;域名真的很重要&#xff0c;不然好多服务是无法访问的。 备注&#xff1a;由于freenom基于技术原因&#xff0c;暂时…

感知机学习

定义 感知机&#xff1a;假设输入控件&#xff08;特征空间&#xff09;是 X ⊆ R n \mathcal{X} \subseteq \mathbb{R}^n X⊆Rn,输出空间是 Y { 1 , − 1 } \mathcal{Y}\left\{1, -1\right\} Y{1,−1},输入 x ∈ X \mathbf{x}\in\mathcal{X} x∈X表示实例的特征向量&#x…

使用Pano2VR实现背景音乐、放大/缩小、旋转、缩略图和直线/立体/鱼眼模式等

内容简介 本文在文章《使用Pano2VR实现客厅VR效果》基础上&#xff0c;增加背景音乐、放大/缩小、旋转、缩略图和直线/立体/鱼眼模式等&#xff1b;效果如下图&#xff08;为了可以上传缩小屏幕&#xff0c;属于PC端运行&#xff09;&#xff1a; 实现过程 1. 运行Pano2VR软件后…

【初学人工智能原理】【1】一元一次函数:感知器如何描述直觉

前言 本文教程均来自b站【小白也能听懂的人工智能原理】&#xff0c;感兴趣的可自行到b站观看。 本文【原文】章节来自课程的对白&#xff0c;由于缺少图片可能无法理解&#xff0c;故放到了最后&#xff0c;建议直接看代码&#xff08;代码放到了前面&#xff09;。 代码实…

企业管理中,如何组建数据团队

数字化已经成为了当前时代的标志&#xff0c;也变为人们对未来社会发展的共识&#xff0c;一时间数字化相关技术、理念、应用都开始向各行各业普及。此时人工智能、云计算、大数据、互联网、物联网等的发展也越来越快&#xff0c;给人们的生活和企业的经营管理模式带来了深刻改…

设计模式 -- 原型模式

前言 月是一轮明镜,晶莹剔透,代表着一张白纸(啥也不懂) 央是一片海洋,海乃百川,代表着一块海绵(吸纳万物) 泽是一柄利剑,千锤百炼,代表着千百锤炼(输入输出) 月央泽,学习的一种过程,从白纸->吸收各种知识->不断输入输出变成自己的内容 希望大家一起坚持这个过程,也同…

【问题解决】RabbitMQ启动出现epmd error for host xx.xx: nxdomain (non-existing domain)

问题描述 【k8s】或【普通容器】或【Linux】部署的RabbitMQ启动时出现了 epmd error for host xx.xx: nxdomain (non-existing domain) 错误&#xff0c;MQ无法启动成功。 其中 xx.xx 为无法解析的域名。 RabbitMQ官方还提到报错 Error during startup: {error,no_epmd_port}…

回归区间预测 | Matlab基于分位数随机森林算法(QRF)的回归预测

文章目录 效果一览文章概述部分源码参考资料效果一览 文章概述 Matlab基于分位数随机森林算法(QRF)的回归预测,matlab代码。 基于分位数随机森林算法(QRF)回归预测,matiab代码,单变量输入模型。 评价指标包括:R2、MAE、MSE、RMSE和区间覆盖率和区间平均宽度百分比等,代码质…

【软件测试】自动化测试日志问题该怎么解决?测试老鸟总结方案...

目录&#xff1a;导读 前言一、Python编程入门到精通二、接口自动化项目实战三、Web自动化项目实战四、App自动化项目实战五、一线大厂简历六、测试开发DevOps体系七、常用自动化测试工具八、JMeter性能测试九、总结&#xff08;尾部小惊喜&#xff09; 前言 Python自动化测试&…

Leetcode力扣秋招刷题路-0801

从0开始的秋招刷题路&#xff0c;记录下所刷每道题的题解&#xff0c;帮助自己回顾总结 801. 使序列递增的最小交换次数 我们有两个长度相等且不为空的整型数组 nums1 和 nums2 。在一次操作中&#xff0c;我们可以交换 nums1[i] 和 nums2[i]的元素。 例如&#xff0c;如果 …

为什么越来越多的人开始学习大数据了?

现在&#xff0c;在数字化转型的推动下&#xff0c;越来越多的企业意识到大数据的魅力&#xff0c;并不断在这个领域投入资金&#xff0c;Python大数据开发相关人才也备受青睐&#xff01; 大数据从业领域很宽广&#xff0c;不管是科技领域还是食品产业&#xff0c;零售业等都…