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

github webhooks 实现网站自动更新

本文目录

  • Github Webhooks 介绍
  • Webhooks 工作原理
  • 配置与验证
  • 应用
  • 云服务器通过 Webhook 自动部署网站
    • 实现
      • 复制私钥
      • 编写 webhook 接口
      • Github 仓库配置 webhook
      • 以服务的形式运行 app.py

Github Webhooks 介绍

Webhooks是GitHub提供的一种通知方式,当GitHub上发生特定事件时,会向指定的外部Web服务器发送HTTP POST请求,从而通知这些服务器有关事件的信息。

通过配置Webhooks,开发者可以在GitHub上发生特定事件时(如代码推送、拉取请求创建、评论等),自动接收事件数据,并在外部服务器上执行相应的操作,如持续集成、代码审查、部署等。

Webhooks 工作原理

事件触发:当GitHub上发生订阅的事件时(如代码推送到特定分支),GitHub会识别这一事件并触发Webhook。

发送请求:GitHub 将构造一个包含事件数据的 HTTP POST 请求,并将该请求发送到开发者在 Webhook 配置中指定的 URL。

接收与处理:外部 Web 服务器接收来自 GitHub 的 POST 请求,并解析请求体中的事件数据。根据事件数据的具体内容,服务器可以执行相应的操作,如触发构建流程、发送通知、更新数据库等。

配置与验证

配置 Webhook:在GitHub上,开发者可以为特定的仓库或组织配置Webhook。配置过程中,需要指定Webhook的URL(即外部Web服务器的接收地址)以及要订阅的事件类型。

安全验证:为了确保Webhook的安全性,GitHub提供了Secret密钥和签名验证机制。开发者可以在配置Webhook时设置一个Secret密钥,GitHub在发送POST请求时,会使用该密钥对请求体进行哈希计算,并将哈希值包含在请求头中(如X-Hub-Signature-256)。外部Web服务器在接收请求时,可以使用相同的Secret密钥对请求体进行哈希计算,并将计算得到的哈希值与请求头中的哈希值进行比较,以验证请求的真实性。

应用

应用场景

  • 持续集成:当代码推送到GitHub时,自动触发构建和测试流程。
  • 代码审查:当拉取请求创建或更新时,自动通知审查者进行代码审查。
  • 部署:当构建成功或测试通过时,自动将代码部署到生产环境。
  • 通知与监控:当发生特定事件时,向指定的通知渠道(如Slack、Discord等)发送通知。

优势

  • 实时性:Webhook允许在事件发生时立即接收通知并执行操作,无需轮询API。
  • 自动化:通过Webhook,可以实现自动化的工作流程,减少手动操作。
  • 可扩展性:Webhook可以与各种外部服务和工具集成,扩展GitHub的功能。
  • 安全性:通过Secret密钥和签名验证机制,确保Webhook的安全性。

云服务器通过 Webhook 自动部署网站

GitHub 用来存放代码等资源,使用第三方网站托管平台或者云服务器来部署网站的静态资源。本地的电脑上存放网站的静态资源,每次网站更新,执行 git push 命令将网站的静态资源上传到 Github 之后,GitHub 会通过 webhook 来通知第三方网站托管平台或者云服务器执行 pull 操作,从 GitHub 仓库中拉取网站的静态资源,自动部署网站。

第三方网站托管平台有很多,自行上网搜索,且操作流程都很简单,都是自动的,不需要执行什么操作。这里就不做介绍。

下面介绍的是在云服务器上部署网站,使其在仓库更新时自动从 GitHub 上拉取网站的静态资源部署到云服务器的 Tomcat 上。

至于云服务器部署 tomcat,请参见往期文章 Ubuntu 服务器部署 Tomcat 并配置 SSL/TLS 证书 。


思路:创建一个可以接收 webhook HTTP POST 的进程,使用 Tomcat 用户的权限并以系统服务的形式将该进程一直运行在后台,以接收 Github webhook HTTP POST。使用 ssh 协议从 Github 拉取网站代码并进行网站部署。


实现

ssl 远程云服务器:ssl -i "/path/to/id_rsa" user@server_IP

提升管理员权限 sudo -i

复制私钥

创建文件夹:mkdir /opt/tomcat/.ssh 用来存放 ssh 私钥 (我这里的 /opt/tomcat 路径是 tomcat 用户的主目录)。将私钥文件通过 scp 命令复制到服务器上。因为云服务器要通过私钥(ssh 协议)来访问 Github 的仓库。(Github 已经配置了和私钥对应的公钥。)

scp -i "/path/to/id_rsa" /path/to/id_rsa_corresponding_to_Github_publicKey user@server_IP:/path/to/store/id_rsa

复制到服务器后,将私钥复制到 /opt/tomcat/.ssh 目录下: cp /home/ubuntu/id_rsa /opt/tomcat/.ssh/

修改 .ssh/* 文件的权限,chown -R tomcat:tomcat /opt/tomcat/.ssh + chmod 700 /opt/tomcat/.ssh + chmod 700 /opt/tomcat/.ssh/id_rsa

编写 webhook 接口

编写 webhook 接口用什么语言都可以,C/C++ 、Java、Python、node.js 等都可以。

我这里使用 Python 来写,因为 Ubuntu 一般自带 Python3 且 Python 语法简单。python3 --version if python3 is not installed, execute command sudo apt install python3 to install it.

Examine that you have installed pip and venv.

root@VM-0-17-ubuntu:/opt/webhooks/example# pip
Command 'pip' not found, but can be installed with:
apt install python3-pip
root@VM-0-17-ubuntu:/opt/webhooks/example# dpkg -s python3-venv
dpkg-query: package 'python3-venv' is not installed and no information is available
Use dpkg --info (= dpkg-deb --info) to examine archive files.

从上面的执行结果来看我的这台 Ubuntu 的云服务器上没有安装 Python 的包管理工具 pip 和 虚拟环境工具 venv。执行命令安装:sudo apt install python3-pip python3-venv

创建文件夹 mkdir -p /opt/webhooks/example 用来编写 webhook 接口。

cd /opt/webhooks/example,创建 Python 的虚拟环境,python3 -m venv myenv 。这将会在当前目录下创建一个名为 myenv 的文件夹,里面包含了 Python 解释器和虚拟环境所需的所有文件。创建虚拟环境后,激活虚拟环境,使用 pip 安装的所有第三方包都将会安装在 当前 /opt/webhooks/example/ 目录下,而不是安装在全局环境下。安装在全局环境下的话,会导致第三方包的版本混乱,比如你的机子上有很多 Python 项目,每个项目都使用了指定版本的第三方包,如果都安装在全局环境就会导致混乱,或者执行代码时报包的版本错误,所以创建虚拟环境用来隔离不同的项目的环境。

root@VM-0-17-ubuntu:/opt/webhooks/example# python3 -m venv myenv
root@VM-0-17-ubuntu:/opt/webhooks/example# ls
myenv

创建了虚拟环境后,需要激活当前环境,Linux 系统使用命令 source myenv/bin/activate

root@VM-0-17-ubuntu:/opt/webhooks/example# ls
myenv
root@VM-0-17-ubuntu:/opt/webhooks/example# source myenv/bin/activate
(myenv) root@VM-0-17-ubuntu:/opt/webhooks/example#

(Windows 上激活虚拟环境,在 Command Prompt(CMD) 下使用 myenv\Scripts\activate.bat 激活。在 PowerShell 下激活,先设置 PowerShell 有执行脚本的权限:Set-ExecutionPolicy -ExecutionPolicy RemoteSigned -Scope CurrentUser,然后执行 myenv\Scripts\Activate.ps1 激活,关闭 PowerShell 执行脚本权限 Set-ExecutionPolicy -ExecutionPolicy Restricted -Scope CurrentUser 。允许 PowerShell 执行脚本通常不安全,不建议使用 PowerShell 激活 Python 虚拟环境。无论 Windows 还是 Linux,取消虚拟环境的激活使用命令 deactivate 。)

激活了虚拟环境后,安装 Flask pip install Flask 。What’s Flask? Read Below:

(Flask is a popular, lightweight web framework for Python, used for building web applications and APIs. It’s classified as a micro-framework because it provides the essential tools and features for building web apps, but it doesn’t come with some of the heavier components that larger frameworks like Django provide (e.g., built-in ORM, form handling, etc.).

Flask is designed to be simple, flexible, and easy to extend, which makes it a great choice for both beginners and advanced developers. It allows you to build anything from small, simple websites to large, complex applications.

Key Features of Flask
Minimalistic and Lightweight: Flask doesn’t force you to use any specific tools or libraries. It’s designed to be flexible and allows you to use only what you need for your project.

Routing: Flask provides an easy-to-use routing system, which means you can map URLs to specific Python functions (known as views). For example, you can easily set up routes for different pages of your web application.

Template Engine: Flask uses the Jinja2 template engine, which allows you to separate the HTML structure from the Python code. It lets you embed dynamic content into HTML templates with the power of Python code.

Development Server and Debugger: Flask includes a built-in development server with an interactive debugger that makes it easy to test and debug your application.

RESTful Support: Flask is widely used for building REST APIs, thanks to its simplicity and the ability to integrate with tools like Flask-RESTful, Flask-SQLAlchemy, etc.

Extensibility: You can extend Flask with a wide variety of third-party libraries or plugins to add more features, such as database integration, authentication, and form validation.

Flexibility: Unlike Django, Flask gives you full control over how you structure your application. You can choose your own database, authentication methods, and other components.

WSGI Compliance: Flask is WSGI-compliant, meaning it’s compatible with any WSGI-compliant server, like Gunicorn or uWSGI, for production environments.)

编写 webhook 接口的 python 代码

vim app.py

import os
import shutil
import subprocess
from flask import Flask, request, jsonifyapp = Flask(__name__)@app.route('/webhook', methods=['POST'])
def webhook():# 验证 GitHub Webhook 是否发送的正确请求(可以添加 GitHub Secret 密钥验证)if request.method == 'POST':payload = request.jsonprint(f"Received payload: {payload}")# 拉取最新代码pull_code()return jsonify({"message": "Webhook received and deployment triggered!"}), 200def pull_code():"""拉取 GitHub 仓库的最新代码并部署到 Tomcat 的 webapps/blog 目录"""repo_dir = '/opt/webhooks/example'os.chdir(repo_dir)blog_dir = os.path.join(repo_dir, 'blog')# 如果 blog 目录不存在,则从 GitHub 克隆仓库if not os.path.exists(blog_dir):print(f"Cloning the repository into {blog_dir}...")mkdir_result = subprocess.run(['mkdir', 'blog'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)if mkdir_result.returncode != 0:print(f"Error mkdir dir blog: {mkdir_result.stderr.decode()}")returnresult = subprocess.run(['git', 'clone', '--depth', '1', 'git@github.com:User-Name/Repository-Name.git', blog_dir], stdout=subprocess.PIPE, stderr=subprocess.PIPE)if result.returncode != 0:print(f"Error cloning repository: {result.stderr.decode()}")returnelse:# 如果 blog 目录已经存在,拉取最新代码print("Pulling the latest code from GitHub...")result = subprocess.run(['git', '-C', blog_dir, 'pull', 'origin', 'main'], stdout=subprocess.PIPE, stderr=subprocess.PIPE)if result.returncode != 0:print(f"Error pulling code: {result.stderr.decode()}")return# 复制代码到 Tomcat webapps/example 目录tomcat_blog_dir = '/opt/tomcat/webapps/example'  # Tomcat 下的 blog 目录if os.path.exists(tomcat_blog_dir):shutil.rmtree(tomcat_blog_dir)  # 清除旧的 blog 目录shutil.copytree(blog_dir, tomcat_blog_dir)  # 复制新代码print("Code deployed to Tomcat webapps/blog")if __name__ == '__main__':app.run(host='127.0.0.1', port=12345, debug=False)  # 启动 Flask 应用

代码中,程序监听了本机 127.0.0.1 的 12345 端口,一旦接收了 Github webhook 发出的 HTTP HOST,就使用子进程 subprocess 执行从仓库拉取代码以及资源文件的操作,将仓库中所有的子文件保存到 /opt/webhooks/example/blog 下面,然后清除 /opt/tomcat/webapps/example 里面旧的代码和资源,将新的代码以及资源复制进去。(根据需求自行修改代码。)

由于我的服务器中运行了 apache2,它监听了 443 端口,并反向代理到 tomcat,所以也要将 webhook 反向代理到本机的 12345 端口。

编辑 apache2 的配置文件,我这里的是 /etc/apache2/sites-available/my_conf.conf

        # 反向代理配置ProxyPreserveHost On# 反向代理到 webhook 的接口ProxyPass /webhook http://127.0.0.1:12345/webhookProxyPassReverse /webhook http://127.0.0.1:12345/webhook# 反向代理到 TomcatProxyPass / http://127.0.0.1:8080/ProxyPassReverse / http://127.0.0.1:8080/

注意 webhook 接口的反向代理要放在 tomcat 的反向代理前面,因为反向代理的顺序是配置文件中的从上往下,如果 tomcat 的反向代理放在前面,那么路径为 /webhook 的 HTTPS 请求将会被反向代理到 tomcat,而 tomcat 中我并没有写 webhook 的接口。

编辑完成 apache2 的配置文件后,systemctl restart apache2 重启 apache2 。

先以 root 身份运行 app.py,测试反向代理是否配置成功:

(myenv) root@VM-0-17-ubuntu:/opt/webhooks/example# ls
app.py  myenv
(myenv) root@VM-0-17-ubuntu:/opt/webhooks/example# python3 app.py* Serving Flask app 'app'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:12345
Press CTRL+C to quit

然后在本地使用 curl 命令验证:

$ curl -X POST https://example.jackey-song.com/webhook -H "Content-Type: application/json" -d '{"event": "user_signup", "data": {"username": "john_doe", "email": "john@example.com"}}'
{"message":"Webhook received and deployment triggered!"}

curl

  • -X 指定方法 POST
  • -H 设置请求头,指定发送的数据是 JSON 格式。
  • -d 请求体中的 JSON 数据。确保数据格式正确。

curl 指令执行后,可以看到服务器端输出说明反向代理配置成功:

(myenv) root@VM-0-17-ubuntu:/opt/webhooks/example# python3 app.py* Serving Flask app 'app'* Debug mode: off
WARNING: This is a development server. Do not use it in a production deployment. Use a production WSGI server instead.* Running on http://127.0.0.1:12345
Press CTRL+C to quit
Received payload: {'event': 'user_signup', 'data': {'username': 'john_doe', 'email': 'john@example.com'}}
Cloning the repository into /opt/webhooks/example/blog...
The authenticity of host 'github.com (xxx.xxx.xxx.xxx)' can't be established.
ED25519 key fingerprint is SHA256:+DiY3wvvV6TuJJhbpZisF/zLDA0zPMSvHdkr4UvCOqU.
This key is not known by any other names.
Are you sure you want to continue connecting (yes/no/[fingerprint])? yes
Error cloning repository: Cloning into '/opt/webhooks/example/blog'...
Warning: Permanently added 'github.com' (ED25519) to the list of known hosts.
git@github.com: Permission denied (publickey).
fatal: Could not read from remote repository.Please make sure you have the correct access rights
and the repository exists.127.0.0.1 - - [29/Nov/2024 17:19:00] "POST /webhook HTTP/1.1" 200 -

从输出的结果来看,从 github 上克隆仓库内容并没有成功,因为 root 用户没有权限,之前配置的 id_rsa 私钥文件是放在 tomcat 用户的主目录下的 /opt/tomcat/.ssh/id_rsa。后文会以 tomcat 的权限来运行 app.py。下面配置 Github 仓库那边的 webhook 。

Github 仓库配置 webhook

Github —> 对应的 repository —> settings —> Webhooks —> add webhook :

在这里插入图片描述

Payload URL:https://你的服务器域名/webhook

启用 SSL 验证,push 事件触发 webhook。


以服务的形式运行 app.py

创建一个 flask-app.service 文件用来保存配置,vim /etc/systemd/system/flask-app.service

[Unit]
Description=Flask Webhook API
After=network.target[Service]
# 使用 tomcat 用户来运行
User=tomcat
# Flask 应用所在的目录
WorkingDirectory=/opt/webhooks/example
# 执行 Flask 应用的命令
ExecStart=/opt/webhooks/example/myenv/bin/python3 /opt/webhooks/example/app.py
# 虚拟环境的路径以及 git 的路径
Environment="PATH=/opt/webhooks/example/myenv/bin:/usr/bin"
Environment="FLASK_APP=app.py"
Restart=always
RestartSec=3[Install]
WantedBy=multi-user.target

保存并退出 vim :wq

/opt/webhooks/example/ 中所有文件的权限修改为 tomcat:-R 递归修改 sudo chown -R tomcat:tomcat /opt/webhooks/example + sudo chmod -R 700 /opt/webhooks/example

(myenv) root@VM-0-17-ubuntu:/opt/webhooks# chown -R tomcat:tomcat /opt/webhooks/example
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# chmod -R 700 /opt/webhooks/example
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# ls -l
total 4
drwx------ 5 tomcat tomcat 4096 Nov 29 17:41 example
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# ls -l example
total 16
-rwx------ 1 tomcat tomcat 2289 Nov 29 16:51 app.py
drwx------ 2 tomcat tomcat 4096 Nov 29 17:19 blog
drwx------ 5 tomcat tomcat 4096 Nov 29 16:03 myenv
drwx------ 2 tomcat tomcat 4096 Nov 29 17:41 __pycache__

sudo systemctl daemon-reload 重新加载服务的配置文件。
sudo systemctl start flask-app 启动 flask-app 服务。
sudo systemctl enable flask-app 开机自动启动 flask-app。

(myenv) root@VM-0-17-ubuntu:/opt/webhooks# systemctl daemon-reload
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# systemctl start flask-app
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# systemctl status flask-app
● flask-app.service - Flask Webhook APILoaded: loaded (/etc/systemd/system/flask-app.service; disabled; preset: enabled)Active: activating (auto-restart) (Result: exit-code) since Fri 2024-11-29 17:57:21 CST; 2s agoProcess: 1523039 ExecStart=/opt/webhooks/example/myenv/bin/python3 /opt/webhooks/example/app.py # 执行 Fla>Main PID: 1523039 (code=exited, status=217/USER)CPU: 1ms(myenv) root@VM-0-17-ubuntu:/opt/webhooks# systemctl enable flask-app
Created symlink /etc/systemd/system/multi-user.target.wants/flask-app.service → /etc/systemd/system/flask-app.service.
(myenv) root@VM-0-17-ubuntu:/opt/webhooks# systemctl status flask-app
● flask-app.service - Flask Webhook APILoaded: loaded (/etc/systemd/system/flask-app.service; enabled; preset: enabled)Active: activating (auto-restart) (Result: exit-code) since Fri 2024-11-29 17:57:37 CST; 2s agoProcess: 1523189 ExecStart=/opt/webhooks/example/myenv/bin/python3 /opt/webhooks/example/app.py # 执行 Fla>Main PID: 1523189 (code=exited, status=217/USER)CPU: 1ms

有一点需要注意,修改 app.py 后,如果不重新启动 flask-app 服务,修改后的 app.py 代码不会被执行。

确保 /opt/tomcat/webapps/example 的权限为 tomcat 。(因为这个 example 我之前创建的时候以 root 权限进行创建的,所以这里要修改它的权限为 tomcat 。真不愧是 Linux 系统,安全系数这么高,各种权限的限制,难怪很多服务器都跑 Linux ,安全稳定。)

在执行 push 之前,先使用 root 权限 git clone 一次你的仓库(先 cp /opt/tomcat/.ssh/id_rsa /root/.sshgit clone ...),确保能够拉取代码。然后将 /root/.ssh/known_hosts 文件复制到 /opt/tomcat/.ssh/ 下,并修改权限,让 tomcat 可以读写执行。(说了半天,如果你嫌麻烦,那么就直接以 root 权限运行 app.py 就直接省去了各种权限问题)。

本地网站的静态资源项目里,创建一个 a.txt 文件,然后使用 命令 git add . + git commit -m "test webhook" + git push 到 github 仓库。

在这里插入图片描述

可以看到 webhook 成功了!!!检查服务器上的文件,也成功从 github 上 clone 或者 pull 拉取代码并部署到 tomcat 下了!!!




flask-app.service 文件也有其他的配置方法:

[Unit]
Description=Flask Application
After=network.target[Service]
User=root
WorkingDirectory=/opt/webhooks/example
ExecStart=/opt/webhooks/example/myenv/bin/gunicorn -w 1 -b 127.0.0.1:12345 app:app
Restart=always[Install]
WantedBy=multi-user.target

使用 gunicorn 来运行 app.py。需要在虚拟的 python 环境中安装 pip install gunicorn

Gunicorn 是一个 Python WSGI UNIX HTTP 服务器,用于 UNIX 系统上运行 Python web 应用。它通常用作生产环境中的 Flask、Django 等应用的服务器。




OK 简单总结一下,github 配置公钥文件,将私钥文件复制到服务器的 /opt/tomcat/.ssh/ 下,并修改权限,注意 id_rsa 文件 tomcat 要有读写和执行的权限(chomd 700),否则是无法使用该密钥建立 ssh 连接到 github 服务器的。然后使用 python 的 Flask 库 编写 webhook 接口,apache2 反向代理到 webhook 接口,github 仓库配置 webhook,push 测试一下,成功!

相关文章:

github webhooks 实现网站自动更新

本文目录 Github Webhooks 介绍Webhooks 工作原理配置与验证应用云服务器通过 Webhook 自动部署网站实现复制私钥编写 webhook 接口Github 仓库配置 webhook以服务的形式运行 app.py Github Webhooks 介绍 Webhooks是GitHub提供的一种通知方式,当GitHub上发生特定事…...

【C语言】递归的内存占用过程

递归 递归是函数调用自身的一种编程技术。在C语言中,递归的实现会占用内存栈(Call Stack),每次递归调用都会在栈上分配一个新的 “栈帧(Stack Frame)”,用于存储本次调用的函数局部变量、返回地…...

365天深度学习训练营-第P6周:VGG-16算法-Pytorch实现人脸识别

🍨 本文为🔗365天深度学习训练营中的学习记录博客🍖 原作者:K同学啊 文为「365天深度学习训练营」内部文章 参考本文所写记录性文章,请在文章开头带上「👉声明」 🍺要求: 保存训练过…...

企业AI助理在数据分析与决策中扮演的角色

在当今这个数据驱动的时代,企业每天都需要处理和分析大量的数据,以支持其业务决策。然而,面对如此庞大的数据量,传统的数据分析方法已经显得力不从心。幸运的是,随着人工智能(AI)技术的不断发展…...

洛谷 B2029:大象喝水 ← 圆柱体体积

【题目来源】https://www.luogu.com.cn/problem/B2029【题目描述】 一只大象口渴了,要喝 20 升水才能解渴,但现在只有一个深 h 厘米,底面半径为 r 厘米的小圆桶 (h 和 r 都是整数)。问大象至少要喝多少桶水才会解渴。 …...

go每日一题:mock打桩、defer、recovery、panic的调用顺序

题目一:单元测试中使用—打桩 打桩概念:使用A替换 原函数B,那么A就是打桩函数打桩原理:运行时,通过一个包,将内存中函数的地址替换为桩函数的地址打桩操作:利用Patch()函…...

STM32F103 HSE时钟倍频以及设置频率函数(新手向,本人也是新手)

HSE_SetSysCLK是野火教程里的,不懂的去这 16-RCC(第3节)使用HSE配置系统时钟并使用MCO输出监控系统时钟_哔哩哔哩_bilibili HSE_AutoSetHSE的算法部分是自己写的,用了一个转接数组。C语言不支持bool所以自己定义了一个boolK代替bool。 AutoHSE.h: /**…...

renderExtraFooter 添加本周,本月,本年

在 Ant Design Vue 中,a-date-picker 组件提供了一个 renderExtraFooter 属性,可以用来渲染额外的页脚内容。你可以利用这个属性来添加“本周”、“本月”和“本年”的按钮。下面是如何在 Vue 2 项目中实现这一功能的具体步骤: 1.确保安装了…...

SprinBoot整合KafKa的使用(详解)

前言 1. 高吞吐量(High Throughput) Kafka 设计的一个核心特性是高吞吐量。它能够每秒处理百万级别的消息,适合需要高频次、低延迟消息传递的场景。即使在大规模分布式环境下,它也能保持很高的吞吐量和性能,支持低延…...

【机器学习】CatBoost 模型实践:回归与分类的全流程解析

一. 引言 本篇博客首发于掘金 https://juejin.cn/post/7441027173430018067。 PS:转载自己的文章也算原创吧。 在机器学习领域,CatBoost 是一款强大的梯度提升框架,特别适合处理带有类别特征的数据。本篇博客以脱敏后的保险数据集为例&#x…...

PyTorch 实现动态输入

使用 PyTorch 实现动态输入:支持训练和推理输入维度不一致的 CNN 和 LSTM/GRU 模型 在深度学习中,处理不同大小的输入数据是一个常见的挑战。许多实际应用需要模型能够灵活地处理可变长度的输入。本文将介绍如何使用 PyTorch 实现支持动态输入的 CNN 和…...

【Linux相关】查看conda路径和conda和cudnn版本、安装cudnn、cuDNN无需登录官方下载链接

【Linux相关】 查看conda路径和conda和cudnn版本 安装cudnn cuDNN无需登录官方下载链接 文章目录 1. 查看信息1.1 查看 Conda 路径1.2 查看 Conda 版本1.3 查看 cuDNN 版本1.4 总结 2. 安装cudnn2.1 安装cudnn步骤2.2 cuDNN无需登录官方下载链接 1. 查看信息 查看Conda 路径、C…...

基于Java Springboot环境保护生活App且微信小程序

一、作品包含 源码数据库设计文档万字PPT全套环境和工具资源部署教程 二、项目技术 前端技术:Html、Css、Js、Vue、Element-ui 数据库:MySQL 后端技术:Java、Spring Boot、MyBatis 三、运行环境 开发工具:IDEA/eclipse 微信…...

简单的springboot使用sse功能

什么是sse? 1、SSE 是Server-Sent Events(服务器发送事件) 2、SSE是一种允许服务器主动向客户端推送实时更新的技术。 3、它基于HTTP协议,并使用了其长连接特性,在客户端与服务器之间建立一条持久化的连接。 通过这条连接&am…...

【服务器问题】xshell 登录远程服务器卡住( 而 vscode 直接登录不上)

打开 xshell ssh 登录远程服务器:卡在下面这里,迟迟不继续 当 SSH 连接卡在 Connection established. 之后,但没有显示远程终端提示符时,这通常意味着连接已经成功建立,说明不是网络连接和服务器连接问题,…...

AI×5G 市场前瞻及应用现状

本文为《5GAI时代:生活方式和市场的裂变》一书读后总结及研究。 本书的上架建议是“经营”,内容也更偏向于市场分析。书出版于2021年,现在是2024年,可以收集整理一些例子,看看书里的前瞻性5GAI应用预测,到…...

利用 Redis 与 Lua 脚本解决秒杀系统中的高并发与库存超卖问题

1. 前言 1.1 秒杀系统中的库存超卖问题 在电商平台上,秒杀活动是吸引用户参与并提升销量的一种常见方式。秒杀通常会以极低的价格限量出售某些商品,目的是制造紧迫感,吸引大量用户参与。然而,这种活动的特殊性也带来了许多技术挑…...

【MySQL】创建数据库、用户和密码

创建数据库、用户和密码参考sql语句 drop database if exists demoshop; drop user if exists demoshop%; -- 支持emoji:需要mysql数据库参数: character_set_serverutf8mb4 create database demoshop default character set utf8mb4 collate utf8mb4_un…...

leetcode hot100【Leetcode 72.编辑距离】java实现

Leetcode 72.编辑距离 题目描述 给定两个单词 word1 和 word2,返回将 word1 转换为 word2 所使用的最少操作数。 你可以对一个单词执行以下三种操作之一: 插入一个字符删除一个字符替换一个字符 示例 1: 输入: word1 "horse", word2 &…...

腾讯阅文集团Java后端开发面试题及参考答案

Java 的基本数据类型有哪些?Byte 的数值范围是多少? Java 的基本数据类型共有 8 种,可分为 4 类: 整数类型:包括 byte、short、int 和 long。byte 占 1 个字节,其数值范围是 - 128 到 127,用于表示较小范围的整数,节省内存空间,在处理一些底层的字节流数据或对内存要求…...

eNSP-Cloud(实现本地电脑与eNSP内设备之间通信)

说明: 想象一下,你正在用eNSP搭建一个虚拟的网络世界,里面有虚拟的路由器、交换机、电脑(PC)等等。这些设备都在你的电脑里面“运行”,它们之间可以互相通信,就像一个封闭的小王国。 但是&#…...

【OSG学习笔记】Day 18: 碰撞检测与物理交互

物理引擎(Physics Engine) 物理引擎 是一种通过计算机模拟物理规律(如力学、碰撞、重力、流体动力学等)的软件工具或库。 它的核心目标是在虚拟环境中逼真地模拟物体的运动和交互,广泛应用于 游戏开发、动画制作、虚…...

鸿蒙DevEco Studio HarmonyOS 5跑酷小游戏实现指南

1. 项目概述 本跑酷小游戏基于鸿蒙HarmonyOS 5开发,使用DevEco Studio作为开发工具,采用Java语言实现,包含角色控制、障碍物生成和分数计算系统。 2. 项目结构 /src/main/java/com/example/runner/├── MainAbilitySlice.java // 主界…...

Mobile ALOHA全身模仿学习

一、题目 Mobile ALOHA:通过低成本全身远程操作学习双手移动操作 传统模仿学习(Imitation Learning)缺点:聚焦与桌面操作,缺乏通用任务所需的移动性和灵活性 本论文优点:(1)在ALOHA…...

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习)

Aspose.PDF 限制绕过方案:Java 字节码技术实战分享(仅供学习) 一、Aspose.PDF 简介二、说明(⚠️仅供学习与研究使用)三、技术流程总览四、准备工作1. 下载 Jar 包2. Maven 项目依赖配置 五、字节码修改实现代码&#…...

JS设计模式(4):观察者模式

JS设计模式(4):观察者模式 一、引入 在开发中,我们经常会遇到这样的场景:一个对象的状态变化需要自动通知其他对象,比如: 电商平台中,商品库存变化时需要通知所有订阅该商品的用户;新闻网站中&#xff0…...

【Redis】笔记|第8节|大厂高并发缓存架构实战与优化

缓存架构 代码结构 代码详情 功能点: 多级缓存,先查本地缓存,再查Redis,最后才查数据库热点数据重建逻辑使用分布式锁,二次查询更新缓存采用读写锁提升性能采用Redis的发布订阅机制通知所有实例更新本地缓存适用读多…...

解析奥地利 XARION激光超声检测系统:无膜光学麦克风 + 无耦合剂的技术协同优势及多元应用

在工业制造领域,无损检测(NDT)的精度与效率直接影响产品质量与生产安全。奥地利 XARION开发的激光超声精密检测系统,以非接触式光学麦克风技术为核心,打破传统检测瓶颈,为半导体、航空航天、汽车制造等行业提供了高灵敏…...

数学建模-滑翔伞伞翼面积的设计,运动状态计算和优化 !

我们考虑滑翔伞的伞翼面积设计问题以及运动状态描述。滑翔伞的性能主要取决于伞翼面积、气动特性以及飞行员的重量。我们的目标是建立数学模型来描述滑翔伞的运动状态,并优化伞翼面积的设计。 一、问题分析 滑翔伞在飞行过程中受到重力、升力和阻力的作用。升力和阻力与伞翼面…...

redis和redission的区别

Redis 和 Redisson 是两个密切相关但又本质不同的技术,它们扮演着完全不同的角色: Redis: 内存数据库/数据结构存储 本质: 它是一个开源的、高性能的、基于内存的 键值存储数据库。它也可以将数据持久化到磁盘。 核心功能: 提供丰…...