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

[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

在这里插入图片描述

文章目录

      • 1.参考项目
      • 2.技能点
      • 3.GO的Dockerfile配置
        • 后端的结构如图
        • Dockerfile
        • 先手动docker调试服务是否可以启动
        • 报错
      • 4.Vue的Dockerfile配置
        • 前端的结构如图
        • nginx_docker.conf
        • Dockerfile
        • 构建
      • 5.docker-compose 整合前后端
        • docker-compose.yml
        • 错误记录
        • (1)ip+端口改为https域名访问
          • 第一种:通过挂载ssl证书文件,增加端口解决,当然可以解决,但是我得物理机现在有80,443端口造成了冲突,这种方式我直接进入到容器内,是可以访问https域名地址的;
          • 第二种:直接在物理机的nginx,因为配置了多域名访问,多虚拟主机操作,直接代理转发同时配置ssl证书,也可以正常访问,只是这种是容器+物理机nginx转发操作。
        • (2)镜像仓库解决方案
        • 推送后端镜像
        • 推送前端镜像
      • 6.Docker清理缓存操作

将公司物理机项目改为容器化部署,最终方案是通过容器docker-compose部署使项目可以ip+端口访问,再通过物理机nginx代理进行https域名访问。

可能还有更好的方式,开一个nginx的容器,进行代理,但由于跟物理机80,443端口冲突,暂时没有采用。

可能目前处理不是最好的方式,不过容器化已经运用到项目,后续要在不断学习中优化,加油! 过程中参考很多经验的博主的文章,不断成长不断学习

1.参考项目

  • 用 Docker 构建一个前后端分离的项目 (go+vue)
  • github-gin-vue-blog
  • github-compose
  • goctl的Ddockerfile
  • 一个基于 docker 的 go-zero 本地开发运行环境
  • Gin-Vue-Admin文档
  • Dockerfile 多阶段构建
  • docker-compose 打包部署各种语言开发环境
  • docker-compose编排部署多服务Web应用
  • 手动在进入容器,在Apache中新建一个测试页面
  • Compose 模板文件
  • docker-compose nginx + ssl配置
  • Docker nginx https二级域名无端口访问多个web项目

2.技能点

  • 多段构建

    • 作用是减少构建时间、减小镜像体积
  • 配置、网络与存储关系
    在这里插入图片描述

  • Dockerfile基础概念

  • nginx代理

以 community_backend 社区项目为例
技术栈

  • go 1.18.10
  • vue 3.2.13
  • redis 5.0
  • mysql 5.7
  • ecs 2c4g 10M

3.GO的Dockerfile配置

后端的结构如图

community_backend
--configs
--...
--cmd
----main.go
--go.mod
--Dockerfile

服务在 /cmd/main.go 下,build 的时候使用命令 go build /cmd/main.go

我们把 Dockerfile 建立在项目的根目录下,然后写入以下的文件

Dockerfile

# 使用 golang:alpine作为编译使用的容器, 并且将其命名为build
FROM golang:alpine as build
# FROM golang:1.18.10-alpine as build# 安装gcc等其他编译工具
# RUN apk add build-base# --no-cache 选项用于不将软件包的索引缓存到镜像中,以减小镜像大小。
# ca-certificates 包是一个包含各种根证书的集合,用于验证 HTTPS 连接的证书链的有效性。
# 通过安装该包,Docker 镜像将包含一组常见的根证书,以便应用程序可以验证和建立安全的 HTTPS 连接。
RUN apk --no-cache add ca-certificates# 如果在国内用goproxy
# ENV GOPROXY https://goproxy.cn,direct
# ENV GO111MODULE="on"# 设定一个工作目录
WORKDIR /go/src/community_backend# 复制当前文件夹下所有文件到工作目录中
COPY . .# 编译服务端
# RUN go generate && go env && go build -v -gcflags="all=-N -l" -o vc_community  ./cmd/*.go # 配置 golang 环境
RUN go env -w GO111MODULE=on \&& go env -w GOPROXY=https://goproxy.cn,https://goproxy.io,direct \&& go mod tidy \&& go build -v -gcflags="all=-N -l" -o cmd/vc_community ./cmd/*.go # ===========================================================
# 多阶段构建运行服务端# 因为是在alpine里构建的, 所以同样使用alpine镜像作为运行的容器
FROM alpine:latest# 维护者
LABEL MAINTAINER = "ifanaticfire@gmail.com"# 设定一个工作目录
WORKDIR  /go/src/community_backend# 从上一个容器build中复制所有的代码包含可执行文件到当前的工作目录
# COPY --from=build  /go/src/community_backend ./COPY --from=build  /go/src/community_backend/cmd ./cmd
COPY --from=build  /go/src/community_backend/configs ./configs
COPY --from=build  /go/src/community_backend/storage ./storage# 暴露端口
EXPOSE 8083# 启动服务端
#ENTRYPOINT ./cmd/vc_community  --env=./cmd/env.toml
CMD cd cmd && ./vc_community

先手动docker调试服务是否可以启动

cd community_backend
// 构建镜像, community-backend 为镜像名字
docker build -t community-backend:v0.1 .
// 运行
docker run -it -p "8083:8083" --rm community-backend:v0.1

报错

  • returned a non-zero code: 2
    • 编译时缺少gcc组件
  • 外网ip+端口无法访问后端容器服务
    • 配置文件中监听方式由127.0.0.1:8083 改为 0.0.0.0:8083

4.Vue的Dockerfile配置

前端的结构如图

community-Frontend
--src
--vue.config.js
--nginx_docker.conf
--public
--package.json
--Dockerfile

nginx_docker.conf

server {listen 8084;server_name _;client_max_body_size 50M;#listen          443 ssl;#server_name     community.humengxu.com;#ssl_certificate       /etc/nginx/ssl/fullchain.cer;#ssl_certificate_key   /etc/nginx/ssl/humengxu.com.key;#ssl_session_timeout     5m;# 指定SSL服务器端支持的协议版本# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;#ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;# ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;       指定加密算法#ssl_ciphers  HIGH:!aNULL:!MD5;# 在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法#ssl_prefer_server_ciphers   on;location  /v1/ {proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $http_x_real_ip; #$remote_addr;proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;proxy_set_header X-Forwarded-Proto $scheme;proxy_pass http://177.7.0.11:8083/v1/;#设置允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "POST, GET, DELETE, OPTIONS";add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";add_header Access-Control-Allow-Credentials true;}location / {root /usr/share/nginx/html;index index.html;try_files $uri $uri/ /index.html last;# proxy_pass http://localhost:8084;}
}#配置转发
#server {
#     listen          80;
#     server_name     community.humengxu.com;
#
#     return 301 https://$server_name$request_uri;
#}

Dockerfile

# 声明镜像来源为node:16.14.2,命名为build
FROM node:16.14.2 as build# 声明工作目录
WORKDIR /community_frontend/# 拷贝整个前端项目到当前工作目录
COPY . .# 通过npm下载cnpm
RUN npm install -g cnpm --registry=https://registry.npm.taobao.org# 使用cnpm进行安装依赖
RUN cnpm install || npm install# 安装所有的依赖
RUN npm install# 打包项目,生成的文件保存在./dist下
RUN npm run build# ===========================================================
# 多阶段构建#使用nginx
FROM nginx:alpineLABEL MAINTAINER = "ifanaticfire@gmail.com"# 暴露8084端口
EXPOSE 8084
EXPOSE 8085# 复制打包好的文件到nginx的www目录下
COPY --from=build /community_frontend/dist /usr/share/nginx/html# 把nginx的默认配置改成我们自己的
COPY --from=build /community_frontend/nginx_docker.conf /etc/nginx/conf.d/default.conf

构建

cd community_frontend
// 构建镜像, backend 为镜像名字
docker build -t community-frontend:v0.1 .
// 运行,--rm 在容器停止后自动删除容器
# docker run -it -p "8084:8084" --rm community-frontend:v0.1

5.docker-compose 整合前后端

项目结构

-- community_backend
-- community_frontend
-- docker-compose.yaml

关联的mysql和redis都采用云服务,如没有则需要单独构建mysql容器和redis容器提供服务,这里不做单独容器操作。

我们有两个 service,分别是 frontend,backend

在每个 services 里,我们通过 networks 选项给每个容器分配了一个网络,以及对应的 ip 地址。

比如 backend 就分配到了 177.7.0.11,这就是前端的nginx配置的地址。

同时,frontend 依赖 backend,这样可以让容器按顺序 (backend-frontend) 启动,以此来避免不必要的错误。

docker-compose代码片段创建了一个名为 clinicalapi 的自定义网络,并指定了 IP 地址管理的配置。其中,使用默认的 IPAM 驱动程序,并为网络分配了 177.7.0.0/16 的子网。这样,容器可以在该网络中分配 IP 地址,并可以通过该网络进行通信。

docker-compose.yml

version: "3"networks:clinicalapi:ipam:driver: defaultconfig:- subnet: '177.7.0.0/16'services:frontend:build:context: ./community_frontenddockerfile: ./Dockerfilecontainer_name: community-frontendrestart: alwaysports:- '8084:8084'#  - '80:80'#  - '443:443'#volumes:#  - /usr/local/nginx/conf/ssl/humengxu.com:/etc/nginx/ssldepends_on:- backendcommand: [ 'nginx-debug', '-g', 'daemon off;' ]networks:clinicalapi:ipv4_address: 177.7.0.10backend:build:context: ./community_backenddockerfile: ./Dockerfilecontainer_name: community-backendrestart: alwaysports:- '8083:8083'networks:clinicalapi:ipv4_address: 177.7.0.11

完成 docker-compose.yaml 的编写后就可以尝试运行了

// 强制重写build
docker-compose up --build
// 直接运行
docker-compose up
// 后台运行
docker-compose up -d

错误记录

  • 1.容器名称中不能含有除 [a-zA-Z0-9][a-zA-Z0-9_.-] 之外的内容,我上线容器采用了_,需要修改
  • 2.当docker-compose.yml目录换了位置,就报错
[+] Running 0/0⠿ Network community_clinicalapi  Error                                                                                                                                                                     0.0sfailed to create network community_clinicalapi: Error response from daemon: Pool overlaps with other one on this address space

解决:由于更换了目录,启动docker-compose.yml,存在网卡冲突的情况,需要删除网卡和对应网卡的容器即可;如下删除clinical_clinicalapi的网卡

```
docker network ls # 查看docker网卡
docker network inspect <网卡id> # 查看具体信息,找到与subnet冲突的是哪个
docker network rm <网卡id> # 删除冲突的网卡docker network ls
NETWORK ID     NAME                     DRIVER    SCOPE
3b95a7847c0f   bridge                   bridge    local
da49214cfad9   chatgpt_default          bridge    local
e084524662f9   clinical_clinicalapi     bridge    local
851e84525446   docker-compose_default   bridge    local
836d22ebeff8   gitlab_default           bridge    local
20e8d6149527   host                     host      local
0c37e84ee02c   ifanaticfire_default     bridge    local
74099f10338f   none                     null      local```

以上均是由步骤总结
从git clone 代码仓库 -> 通过Dockerfile打镜像,跑容器-> 再通过docker-compose整合前后端容器,并运行;

按照如上部署已经完整的将go+vue项目部署到容器中国,不过还有如下问题:

  • (1)目前配置是走ip+端口形式,需要改为域名形式访问,并且要追加ssl证书;原来物理机就是这么访问的,所以目前容器化还需要改造
  • (2)没有存储镜像仓库,而是由代码直接打镜像运行,不利于维护

(1)ip+端口改为https域名访问

第一种:通过挂载ssl证书文件,增加端口解决,当然可以解决,但是我得物理机现在有80,443端口造成了冲突,这种方式我直接进入到容器内,是可以访问https域名地址的;

通过 -v 挂载证书,通过-p 映射端口也是可以的,存在docker中有多个nginx的情况,就代理转发一下, 参考地址:Docker多nginx方案:https://juejin.cn/post/6847902222760558599#heading-11

docker run -it -p 443:443 -p 80:80 -v /usr/local/nginx/conf/ssl/humengxu.com:/etc/nginx/ssl --rm community-frontend:v0.1
第二种:直接在物理机的nginx,因为配置了多域名访问,多虚拟主机操作,直接代理转发同时配置ssl证书,也可以正常访问,只是这种是容器+物理机nginx转发操作。

虚拟主机的配置,用于在一台服务器上托管多个网站或应用程序。
虚拟主机允许通过同一个IP地址和端口来访问多个域名或应用程序,并根据请求的域名或其他条件来将请求路由到相应的网站或应用程序。

  • 在Apache中,虚拟主机的配置通常是通过在配置文件(如httpd.conf或apache2.conf)中添加VirtualHost块来实现。每个VirtualHost块对应一个虚拟主机的配置,其中包含了该虚拟主机的域名、目录路径、日志文件路径等相关信息。可以根据需要添加多个VirtualHost块,每个块对应一个虚拟主机。
  • 在Nginx中,虚拟主机的配置通过server块来实现。每个server块对应一个虚拟主机的配置,其中包含了该虚拟主机的域名、目录路径、日志文件路径等相关信息。可以根据需要添加多个server块,每个块对应一个虚拟主机。

communit_frontend.conf

server
{listen          443 ssl;server_name     community.humengxu.com; ssl_certificate       /usr/local/nginx/conf/ssl/humengxu.com/fullchain.cer;ssl_certificate_key   /usr/local/nginx/conf/ssl/humengxu.com/humengxu.com.key;ssl_session_timeout     5m; # 指定SSL服务器端支持的协议版本# ssl_protocols TLSv1 TLSv1.1 TLSv1.2;ssl_protocols TLSv1.1 TLSv1.2 TLSv1.3;# ssl_ciphers  ALL:!ADH:!EXPORT56:RC4+RSA:+HIGH:+MEDIUM:+LOW:+SSLv2:+EXP;       指定加密算法ssl_ciphers  HIGH:!aNULL:!MD5;# 在使用SSLv3和TLS协议时指定服务器的加密算法要优先于客户端的加密算法ssl_prefer_server_ciphers   on; location  /v1/ {proxy_set_header Host $proxy_host;proxy_set_header X-Real-IP $http_x_real_ip; #$remote_addr;proxy_set_header X-Forwarded_For $proxy_add_x_forwarded_for;proxy_pass https://community-api.varclear.com/v1/;#设置允许跨域add_header Access-Control-Allow-Origin *;add_header Access-Control-Allow-Methods "POST, GET, DELETE, OPTIONS";add_header Access-Control-Allow-Headers "Origin, Authorization, Accept";add_header Access-Control-Allow-Credentials true;}location  / {proxy_redirect off;proxy_set_header Host $host;proxy_set_header X-Real-IP $remote_addr;proxy_set_header X-Forwarded-For $proxy_add_x_forwarded_for;proxy_pass http://1.14.34.33:8084/;}
}
# 配置转发
server {listen          80; server_name     community.humengxu.com;#    return 301 https://$server_name$request_uri;rewrite ^(.*)$ https://${server_name}$1 permanent;
}

(2)镜像仓库解决方案

制作前端和后端的镜像,然后把制作好的镜像发布
推送默认的dockerhub仓库中(当然可以自建仓库,用阿里云oss等都行)

将docker-compose打包的镜像改名字上传仓库

推送后端镜像

docker tag clinical-backend:latest firehmx/clinical-backend:v0.1
docker push firehmx/clinical-backend:v0.1

推送前端镜像

docker tag clinical-frontend:latest firehmx/clinical-frontend:v0.1
docker push firehmx/clinical-frontend:v0.1

接着修改 docker-compose.yml,把 build 参数改为 image,填上我们自己的镜像名字就行了。

services:frontend:build:context: ./community_backenddockerfile: ./Dockerfile...  改为frontend:image: firehmx/clinical-frontend:v0.1...backend:build:context: ./community_backenddockerfile: ./Dockerfile...改为backend:image: firehmx/clinical-backend:v0.1...

配置好docker-compose.yml,然后用 docker-compose up 就可以运行这整一个前后端分离项目

6.Docker清理缓存操作

  • 参考地址:https://docs.docker.com/engine/reference/commandline/builder_prune/
  • 在构建测试的过程中,由于是自家小服务器,资源紧张,发现磁盘一直爆满,删除一些大镜像还是会占满的情况,就想到是不是也是缓存问题。
    经过查询确实是build过程中的缓存启发的占用问题。

因此引出以下知识点,如何清除docker的构建过程中的缓存

Docker 18.09 引入了 BuildKit ,提升了构建过程的性能、安全、存储管理等能力。

docker system df 命令,类似于 Linux上的 df 命令,用于查看 Docker 的磁盘使用情况:
TYPE 列出了 Docker 使用磁盘的 4 种类型:

类型说明
Images所有镜像占用的空间,包括拉取下来的镜像,和本地构建的。
Containers运行的容器占用的空间,表示每个容器的读写层的空间。
Local Volumes容器挂载本地数据卷的空间。
Build Cache镜像构建过程中产生的缓存空间(只有在使用 BuildKit 时才有,Docker 18.09 以后可用)。

没清理前:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          46        18        8.928GB   6.253GB (70%)
Containers      29        6         1.779GB   1.779GB (99%)
Local Volumes   5         5         759.8MB   0B (0%)
Build Cache     176       0         5.59GB    5.59GB

清理后:

TYPE            TOTAL     ACTIVE    SIZE      RECLAIMABLE
Images          46        18        8.928GB   6.253GB (70%)
Containers      29        6         1.779GB   1.779GB (99%)
Local Volumes   5         5         759.8MB   0B (0%)
Build Cache     111       0         0B        0B

一键清理 Build Cache 缓存命令:

docker builder prune

如果你希望保留最近一定时间的缓存,删除时长更久的缓存,可以通过添加 --filter 参数实现,例如保留最近10天的缓存示例命令如下:

docker builder prune --filter 'until=240h'

另外,命令 docker system prune 可以用于清理磁盘,删除关闭的容器、无用的数据卷和网络,以及dangling镜像(即无tag的镜像)。

添加参数 docker system prune -a 清理得更加彻底,可以将没有容器使用Docker镜像都删掉。

相关文章:

[每周一更]-(第57期):用Docker、Docker-compose部署一个完整的前后端go+vue分离项目

文章目录 1.参考项目2.技能点3.GO的Dockerfile配置后端的结构如图Dockerfile先手动docker调试服务是否可以启动报错 4.Vue的Dockerfile配置前端的结构如图nginx_docker.confDockerfile构建 5.docker-compose 整合前后端docker-compose.yml错误记录&#xff08;1&#xff09;ip端…...

springboot-mybatis的增删改查

目录 一、准备工作 二、常用配置 三、尝试 四、增删改查 1、增加 2、删除 3、修改 4、查询 五、XML的映射方法 一、准备工作 实施前的准备工作&#xff1a; 准备数据库表 创建一个新的springboot工程&#xff0c;选择引入对应的起步依赖&#xff08;mybatis、mysql驱动…...

HTML5(H5)的前生今世

目录 概述HTML5与其他HTML的区别CSS3与其他CSS版本的区别总结 概述 HTML5是一种用于构建和呈现网页的最新标准。它是HTML&#xff08;超文本标记语言&#xff09;的第五个版本&#xff0c;于2014年由万维网联盟&#xff08;W3C&#xff09;正式推出。HTML5的前身可以追溯到互联…...

抽象工厂模式(Abstract Factory)

抽象工厂模式提供一个创建一组相关或相互依赖的对象的接口&#xff0c;而无须指定它们具体的类&#xff0c;每个子类可以生产一系列相关的产品。 The Abstract Factory Pattern is to provide an interface for creating families of related or dependent objects without s…...

Java 实现下载文件工具类

package com.liunian.utils;import lombok.SneakyThrows;import javax.servlet.ServletOutputStream; import javax.servlet.http.HttpServletResponse; import java.io.File; import java.io.FileInputStream;/*** ClassName DownloadFileUtils* Author liuyan 下载文件工具类…...

C# 12 预览版的新功能

作者&#xff1a;Kathleen Dollard 排版&#xff1a;Alan Wang Visual Studio 17.7 Preview 3 和 .NET 8 Preview 6 的发布推进了 C# 12的发展。此预览版包含的功能为将来的性能增强奠定了基础。现在&#xff0c;您能够在库中更方便的使用内联函数。此预览版首次推出了一项实验…...

34.利用matlab解 多变量多目标规划问题(matlab程序)

1.简述 学习目标&#xff1a;适合解 多变量多目标规划问题&#xff0c;例如 收益最大&#xff0c;风险最小 主要目标法&#xff0c;线性加权法&#xff0c;权值我们可以自己设定。 收益函数是 70*x(1)66*x(2) &#xff1b; 风险函数是 0.02*x(1)^20.01*x(2)^20.04*(x…...

暑假刷题第18天--7/30

165. 小猫爬山 - AcWing题库(dfs) #include<iostream> #include<string> #include<bitset> #include<cstring> #include<algorithm> using namespace std; const int N18; bool vis[N]; int a[N],n,ans,sum[N],k; bool cmp(int x,int y){retur…...

通向架构师的道路之Apache整合Tomcat

一、先从J2EE工程的通用架构说起 这是一个通用的Web即B/S工程的架构&#xff0c;它由&#xff1a; Web Server App Server DB Server 三大部分组成&#xff0c;其中&#xff1a; Web Server 置于企业防火墙外&#xff0c;这个防火墙&#xff0c;大家可以认为是…...

如何消除“信息孤岛”对业务增长的威胁?

根据CMSWire的数据&#xff0c;员工平均每天要花36%的时间来查找和整合信息。但44%的情况下&#xff0c;他们找不到信息。这种时间和精力的浪费就是信息孤岛造成的。 什么是信息孤岛&#xff1f; 当部门存储数据并限制其他人访问数据时&#xff0c;就会出现信息孤岛&#xff…...

Kali部署dvwa和pikachu靶场

kali换源 进入 vim /etc/apt/sources.list deb https://mirrors.aliyun.com/kali kali-rolling main non-free contrib deb-src https://mirrors.aliyun.com/kali kali-rolling main non-free contrib替换完后更新源 apt-get upadteDVWA靶场环境搭建 使用git从github上把DV…...

​LeetCode解法汇总722. 删除注释

目录链接&#xff1a; 力扣编程题-解法汇总_分享记录-CSDN博客 GitHub同步刷题项目&#xff1a; https://github.com/September26/java-algorithms 原题链接&#xff1a;力扣 描述&#xff1a; 给一个 C 程序&#xff0c;删除程序中的注释。这个程序source是一个数组&#x…...

Linux中的firewall-cmd

2023年8月4日&#xff0c;周五上午 目录 打开端口关闭端口查看某个端口是否打开查看当前防火墙设置firewall-cmd中的服务在防火墙中什么是服务&#xff1f;为什么会有服务&#xff1f;打开或关闭服务查看某个服务是否打开firewall-cmd中的 zones查看所有可用的zones&#xff0…...

python 最大归一化

最大归一化是将数据转化到[-1,1]范围之间。公式如下 其中|X|max为x特征的绝对值的最大值。 数据标准化算法介绍—数据建模工具_预处理_Max_字段 """ 最大绝对值归一化&#xff08;max abs normalization &#xff09;&#xff1a;也就是将数值变为单位长度&…...

Netty:ByteBuf写入数据、读出数据

介绍 Netty的ByteBuf数据位置索引是0开始的。 可以用ByteBuf的getByte(int index)方法从指定位置读出一字节&#xff0c;这个操作不会改变ByteBuf的readerIndex 或者 writerIndex 的位置。如果index小于0&#xff0c;或者index 1大于ByteBuf的容量&#xff0c;就会抛出IndexO…...

C++(15):面向对象程序设计

面向对象程序设计概述 面向对象程序设计&#xff08;object-oriented programming&#xff09;的核心思想是数据抽象、继承和动态绑定。 1.使用数据抽象&#xff0c;可以将类的接口与实现分离&#xff1b; 2.使用继承&#xff0c;可以定义相似的类型并对其相似关系建模&#x…...

2023牛客暑期多校训练营6-A Tree

2023牛客暑期多校训练营6-A Tree https://ac.nowcoder.com/acm/contest/57360/A 文章目录 2023牛客暑期多校训练营6-A Tree题意解题思路代码 题意 解题思路 最大价值和这个数据范围&#xff0c;一眼 d p dp dp。 直接在树上并不好处理&#xff0c;问题是如何有效转化、处理…...

Vc - Qt - QPainter::SmoothPixmapTransform及QPainter::Antialiasing

QPainter::SmoothPixmapTransform是一个标志&#xff0c;用于指定绘制操作中的平滑像素变换行为。当使用QPainter绘制一幅图像时&#xff0c;设置SmoothPixmapTransform标志可以使图像变换过程更加平滑&#xff0c;减少锯齿状边缘的出现。此标志通常用于绘制缩放后图像的情况。…...

【练习】条件变量:创建三个线程 id号为ABC,三个线程循环打印自己的ID号,运行顺序为 ABCABC

题目&#xff1a; 创建三个线程 id号为ABC&#xff0c;三个线程循环打印自己的ID号&#xff0c;运行顺序为 ABCABC......要求使用条件变量 #include <stdio.h> #include <pthread.h> #include <unistd.h>//创建互斥锁 pthread_mutex_t mutex PTHREAD_MUTE…...

SpringBoot项目修改中静态资源,只需刷新页面无需重启项目(附赠—热加载)

初衷 &#x1f4a2;初衷&#x1f4a2; 因为一遍遍修改并重启项目觉得很麻烦&#xff0c;所以刚开始就自己给项目配置了热加载&#xff0c;但奈何代码更新还是慢&#xff0c;还不如我重启一遍项目的速度&#xff0c;所以放弃了自己上网找到的热加载配置。直到我debugger前端代码…...

YSYX学习记录(八)

C语言&#xff0c;练习0&#xff1a; 先创建一个文件夹&#xff0c;我用的是物理机&#xff1a; 安装build-essential 练习1&#xff1a; 我注释掉了 #include <stdio.h> 出现下面错误 在你的文本编辑器中打开ex1文件&#xff0c;随机修改或删除一部分&#xff0c;之后…...

解决本地部署 SmolVLM2 大语言模型运行 flash-attn 报错

出现的问题 安装 flash-attn 会一直卡在 build 那一步或者运行报错 解决办法 是因为你安装的 flash-attn 版本没有对应上&#xff0c;所以报错&#xff0c;到 https://github.com/Dao-AILab/flash-attention/releases 下载对应版本&#xff0c;cu、torch、cp 的版本一定要对…...

ardupilot 开发环境eclipse 中import 缺少C++

目录 文章目录 目录摘要1.修复过程摘要 本节主要解决ardupilot 开发环境eclipse 中import 缺少C++,无法导入ardupilot代码,会引起查看不方便的问题。如下图所示 1.修复过程 0.安装ubuntu 软件中自带的eclipse 1.打开eclipse—Help—install new software 2.在 Work with中…...

GC1808高性能24位立体声音频ADC芯片解析

1. 芯片概述 GC1808是一款24位立体声音频模数转换器&#xff08;ADC&#xff09;&#xff0c;支持8kHz~96kHz采样率&#xff0c;集成Δ-Σ调制器、数字抗混叠滤波器和高通滤波器&#xff0c;适用于高保真音频采集场景。 2. 核心特性 高精度&#xff1a;24位分辨率&#xff0c…...

HarmonyOS运动开发:如何用mpchart绘制运动配速图表

##鸿蒙核心技术##运动开发##Sensor Service Kit&#xff08;传感器服务&#xff09;# 前言 在运动类应用中&#xff0c;运动数据的可视化是提升用户体验的重要环节。通过直观的图表展示运动过程中的关键数据&#xff0c;如配速、距离、卡路里消耗等&#xff0c;用户可以更清晰…...

【JVM面试篇】高频八股汇总——类加载和类加载器

目录 1. 讲一下类加载过程&#xff1f; 2. Java创建对象的过程&#xff1f; 3. 对象的生命周期&#xff1f; 4. 类加载器有哪些&#xff1f; 5. 双亲委派模型的作用&#xff08;好处&#xff09;&#xff1f; 6. 讲一下类的加载和双亲委派原则&#xff1f; 7. 双亲委派模…...

Golang——6、指针和结构体

指针和结构体 1、指针1.1、指针地址和指针类型1.2、指针取值1.3、new和make 2、结构体2.1、type关键字的使用2.2、结构体的定义和初始化2.3、结构体方法和接收者2.4、给任意类型添加方法2.5、结构体的匿名字段2.6、嵌套结构体2.7、嵌套匿名结构体2.8、结构体的继承 3、结构体与…...

django blank 与 null的区别

1.blank blank控制表单验证时是否允许字段为空 2.null null控制数据库层面是否为空 但是&#xff0c;要注意以下几点&#xff1a; Django的表单验证与null无关&#xff1a;null参数控制的是数据库层面字段是否可以为NULL&#xff0c;而blank参数控制的是Django表单验证时字…...

【p2p、分布式,区块链笔记 MESH】Bluetooth蓝牙通信 BLE Mesh协议的拓扑结构 定向转发机制

目录 节点的功能承载层&#xff08;GATT/Adv&#xff09;局限性&#xff1a; 拓扑关系定向转发机制定向转发意义 CG 节点的功能 节点的功能由节点支持的特性和功能决定。所有节点都能够发送和接收网格消息。节点还可以选择支持一个或多个附加功能&#xff0c;如 Configuration …...

实战三:开发网页端界面完成黑白视频转为彩色视频

​一、需求描述 设计一个简单的视频上色应用&#xff0c;用户可以通过网页界面上传黑白视频&#xff0c;系统会自动将其转换为彩色视频。整个过程对用户来说非常简单直观&#xff0c;不需要了解技术细节。 效果图 ​二、实现思路 总体思路&#xff1a; 用户通过Gradio界面上…...