引入Minio

前置条件

官网:https://www.minio.org.cn/download.shtml#/kubernetes

命令

# 查看系统上的网络连接和监听端口信息
netstat -tpnl
# 检查系统的指定端口占用情况
sudo netstat -tuln | grep 9000

systemctl status firewalld
# 临时关闭
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld

安装

官网有不同系统的下载安装方式

Linux

注意:./是当前目录

# 下载
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改权限
chmod +x minio
# 启动
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password ./minio server /mnt/data --console-address ":9001"
#也可以下面这样,他会默认用户名和密码
./minio server /mnt/data --console-address ":9001"
  • MINIO_ROOT_USER 指定 MinIO 的用户名;
  • MINIO_ROOT_PASSWORD 指定 MinIO 的密码;
  • /mnt/data 指定 MinIO 服务器用于存储数据的目录;
  • console-address “:9001” 指定 MinIO 控制台的监听地址和端口

后台启动(&结束):./minio server /mnt/data --console-address “:9001” &

docker

# 安装前查看系统是否已经安装了Docker
yum list installed | grep docker
# 卸载Docker  把查出来的都卸载就行了
yum remove docker.x86_64 -y
# 安装    这种方式安装的Docker版本比较旧;(查看版本:docker -v)
yum install docker -y
# 安装最新版的Docker
yum install yum-utils -y
yum-config-manager --add-repo https://download.docker.com/linux/centos/docker-ce.repo
yum install docker-ce docker-ce-cli containerd.io docker-buildx-plugin docker-compose-plugin -y

安装启动

# 搜索MinIO镜像
docker search minio
# 拉取MinIO镜像
docker pull minio/minio
# 启动MinIO容器  不指定的话默认最新  这个启动命令官网是 podman 改成docker
docker run -p 9000:9000 -p 9001:9001 minio/minio server /data --console-address :9001

没有指定用户名和密码,默认是 minioadmin

  • p (映射端口) 虚拟机 : 容器
  • minio/minio 镜像名
  • server 启动参数
  • /data 数据文件存放的路径
  • console-address :9001 web 访问地址和端口

windows

下载 minio:https://dl.min.io/server/minio/release/windows-amd64/minio.exe

进入到 minio.exe 所在的目录
执行 minio.exe server D:\minio\data 启动 minio 服务,其中 D:\minio\data 是 MinIO 存储数据的目录路径

在浏览器输入:http://localhost:9000/ ,登录 MinIO 服务器 web 管理后台,默认用户名密码都是 minioadmin

springboot 集成

Bucket 是存储 Object 的逻辑空间,每个 Bucket 之间的数据是相互隔离的,对用户而言,相当于存放文件的顶层文件夹;

Object 是存储到 MinIO 的基本对象,对用户而言,相当于文件;

添加依赖

https://min.io/docs/minio/linux/developers/minio-drivers.html#java

<dependency>
    <groupId>io.minio</groupId>
    <artifactId>minio</artifactId>
    <version>8.5.10</version>
</dependency>

配置类 MinioClientConfig

@Configuration
public class MinioClientConfig {
	@Bean
	public MinioClient minioClient() {
		return MinioClient.builder()
				.endpoint("http://192.168.64.100:9000")
				.credentials("minioadmin", "minioadmin")
				.build();
	}
}

测试连接

@SpringBootTest
public class TestMain {
	@Autowired
	private MinioClient minioClient;
	@Test
	public void test() {
		System.out.println(minioClient);
	}
}

MinioClient 的常用 API:

  • bucketExists():用于检查指定的存储桶是否存在,返回布尔值,表示存储桶是否存在;

  • makeBucket():用于创建一个新的存储桶(bucket),需要指定存储桶的名称;

  • listBuckets():用于列出用户有权访问的所有存储桶,返回存储桶的列表;

  • removeBucket():用于删除一个已存在的存储桶(bucket),删除失败会抛出异常;

  • putObject():用于上传文件到指定的存储桶;

  • statObject():用于检查指定的对象(文件)的状态;

  • getPresignedObjectUrl():用于生成一个对象(文件)的签名 URL,以便可以通过 HTTP 访问;

  • getObject():用于从指定的存储桶中下载文件;

  • listObjects():用于列出指定存储桶中的所有对象(文件);

  • removeObject():用于删除指定存储桶中的对象,需要指定存储桶名称和对象键;

Buckets 代码实现

@SpringBootTest
public class TestBucket {
	@Autowired
	private MinioClient minioClient;
	@Test
	public void removeBucket() throws Exception {
		// 删除bucket
		minioClient.removeBucket(RemoveBucketArgs.builder().bucket("test").build());
	}
	@Test
	public void listBuckets() throws Exception {
		// 列出所有有权访问的 bucket
		minioClient.listBuckets().forEach(bucket -> {
			System.out.println(bucket.name()+bucket.creationDate());
		});
	}
	@Test
	public void createBucket() throws Exception {
		// 创建bucket
		minioClient.makeBucket(MakeBucketArgs.builder().bucket("test").build());
	}
	@Test
	public void bucketExists() throws Exception {
		boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket("test").build());
		System.out.println("test目录是否存在:"+bucketExists);
	}
	@Test
	public void test() {
		System.out.println(minioClient);
	}
}

Object 代码实现

@SpringBootTest
public class TestObject {
	@Autowired
	private MinioClient minioClient;
	@Test
	public void removeObject() throws Exception {
		//用于删除指定存储桶中的指定对象(文件)
		minioClient.removeObject(RemoveObjectArgs.builder()
				.bucket("test")
				.object("1.jpg")
				.build());
	}
	@Test
	public void listObjects() {
		//用于列出指定存储桶中的所有对象(文件)
		Iterable<Result<Item>> test = minioClient.listObjects(ListObjectsArgs.builder()
				.bucket("test").build());
		test.forEach(result -> {
			try {
				Item item = result.get();
				System.out.println(item.objectName());
			} catch (Exception e) {
				throw new RuntimeException(e);
			}
		});
	}
	@Test
	public void getObject() throws Exception {
		//用于从指定的存储桶中下载文件
		GetObjectResponse response = minioClient.getObject(GetObjectArgs.builder()
				.bucket("test")
				.object("1.jpg")
				.build());
		//io.minio.GetObjectResponse@6a5dd083
		System.out.println(response);
		System.out.println(response.transferTo(new FileOutputStream("D:\\Desktop\\projects\\springoot3-vues\\minio\\day01\\src\\main\\resources\\static\\1.jpg")));
	}
	@Test
	public void getPresignedObjectUrl() throws Exception {
		//用于生成一个对象(文件)的签名URL,以便可以通过HTTP访问
		String url = minioClient.getPresignedObjectUrl(GetPresignedObjectUrlArgs.builder()
				.bucket("test")
				.expiry(3, TimeUnit.MINUTES)//设置过期时间
				.object("1.jpg").method(Method.GET).build());
		System.out.println("url = " + url);
	}
	@Test
	public void statObject() throws Exception {
		StatObjectResponse test = minioClient.statObject(StatObjectArgs.builder()
				.bucket("test").object("1.jpg").build());
		//用于检查指定的对象(文件)的状态;
		//ObjectStat{bucket=test, object=1.jpg, last-modified=2024-05-10T08:30:35Z, size=1145359}
		System.out.println(test);
	}
	@Test
	public void putObject() throws Exception {
		File file = new File("D:\\Pictures\\0.jpg");
		ObjectWriteResponse test = minioClient.putObject(PutObjectArgs.builder()
				.bucket("test").object("1.jpg")//上传到minio后的文件名
				.stream(new FileInputStream(file), file.length(), -1).build());
		//test = io.minio.ObjectWriteResponse@1815577b
		System.out.println("test = " + test);
		ObjectWriteResponse test1 = minioClient.uploadObject(UploadObjectArgs.builder()
				.bucket("test").object("1.jpg").filename("D:\\Pictures\\0.jpg").build());
	}
}

集群

纠删码模式部署

纠删码(Erasure Code)简称 EC,是一种数据保护方法,也是一种算法;

MinIO 对纠删码模式的算法进行了实现,采用 Reed-Solomon code(简称 RScode)纠错码将对象拆分成 N/2 数据和 N/2 奇偶校验块,Reed Solomon 利用范德蒙矩阵(Vandermonde matrix)、柯西矩阵(Cauchy matrix)的特性来实现;

即将数据拆分为多个数据块和多个校验块,分散存储在不同的磁盘上,即使在部分磁盘损坏或丢失的情况下,也可以通过剩余的数据块和校验块恢复出原始数据;

举个例子,现在有 12 块磁盘,一个对象数据会被分成 6 个数据块、6 个奇偶校验块,你可以损坏或丢失任意 6 块磁盘(不管其是存放的数据块还是奇偶校验块),你仍可以从剩下的磁盘中恢复数据

linux 启动纠删码模式

wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改权限
chmod +x minio
# 单机多磁盘的部署   记得执行上行命令 在/usr/local/minio下  /opt/minio/data 数据卷目录
MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12}

单机多磁盘的部署,会报错

执行命令:lsblk
lsblk 是 Linux 中的一个命令,用于列出所有可用的块设备(数据存储设备,如硬盘、闪存驱动器)的信息,如设备名称、大小、挂载点等;
执行命令:lsblk
lsblk 是 Linux 中的一个命令,用于列出所有可用的块设备(数据存储设备,如硬盘、闪存驱动器)的信息,如设备名称、大小、挂载点等;


添加一块磁盘,上图是没加磁盘

# 不重启,直接刷新磁盘数据总线,获取新加的磁盘
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done

再次执行 lsblk


启动纠删码

MINIO_ROOT_USER=admin MINIO_ROOT_PASSWORD=password /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12}

登录 minio 查看

上传一个文件查看数据目录发现每个目录都存了文件

linux 启动纠删码模式-后台启动

# 这样就不能设置用户名和密码了,咱也不知道为啥一会必须设置一会不能设置,默认用户名密码 minioadmin   不知道是不是版本原因
nohup /usr/local/minio/minio server --console-address ":9001" /opt/minio/data/data{1...12} > /opt/minio/data/minio.log 2>&1 &
  • nohup: 这是一个 Unix 命令,用于运行另一个命令在后台,并且忽略挂起(HUP)信号,也就是即使你退出了终端或关闭了会话,该命令也会继续运行;
  • > /opt/minio/data/minio.log: 这部分是将标准输出(stdout)重定向到 /opt/minio/data/minio.log 文件,这意味着 MinIO 服务器的所有正常输出(如启动信息、状态更新等)都会被写入到这个日志文件中;
  • 2>&1: 这部分是将标准错误输出(stderr)重定向到标准输出(stdout),即输出到 /opt/minio/data/minio.log 文件,这样,无论是标准输出还是错误输出,都会被写入到同一个日志文件中;
  • &: 这个符号是在命令的末尾,用于将命令放到后台执行,也就是即使你启动了 MinIO 服务器,你的终端或 shell 会话也不会被阻塞,你可以继续执行其他命令;

docker 启动纠删码模式

docker logs minio

# 这里的密码也不能少于八位 不然容器就会一直处于重启状态(查看日志就会说密码少于八位了)
docker run -d \
-p 9000:9000 \
-p 9001:9001 \
--name=minio \
--restart=always \
-e "MINIO_ROOT_USER=root" \
-e "MINIO_ROOT_PASSWORD=password" \
-v /home/minio/data1:/data1 \
-v /home/minio/data2:/data2 \
-v /home/minio/data3:/data3 \
-v /home/minio/data4:/data4 \
-v /home/minio/data5:/data5 \
-v /home/minio/data6:/data6 \
-v /home/minio/data7:/data7 \
-v /home/minio/data8:/data8 \
--privileged=true \
minio/minio server /data{1...8} \
--console-address ":9000" \
--address ":9001"

上传个文件并使用 tree 命令查看目录 /home/minio
安装 tree:yum install tree

集群部署-Linux

纠删码模式是单机多磁盘方式,如果这台机器宕机了,那么 minio 就不能对外提供服务了
准备 4 台机器;(根据 MinIO 的架构设计,至少需要 4 个节点来构建集群,这是因为在一个 N 节点的分布式 MinIO 集群中,只要有 N/2 节点在线,数据就是安全的,同时,为了确保能够创建新的对象,需要至少有 N/2+1 个节点,因此,对于一个 4 节点的集群,即使有两个节点宕机,集群仍然是可读的,但需要有 3 个节点才能写数据;)

准备四台虚拟机—下面的操作四台都需要执行

192.168.64.100
192.168.64.102
192.168.64.103
192.168.64.104

minio 集群需要独占磁盘块,不能使用 Linux 的 root 磁盘块
都添加一块硬盘去目录看–> linux 启动纠删码模式

# 不重启,直接刷新磁盘数据总线,获取新加的磁盘
for host in $(ls /sys/class/scsi_host) ; do echo "- - -" > /sys/class/scsi_host/$host/scan; done

将添加的磁盘格式化为 xfs 格式:

mkfs.xfs /dev/sdb

将磁盘挂载到 minio 的存储目录:

# 递归创建文件夹 若文件夹不存在
mkdir -p /opt/minio/data
mount /dev/sdb /opt/minio/data

开机自动挂载-Linux

开机自动挂载,不配置自动挂载的话,重启之后需要手动进行挂载
一、修改 /etc 下的 fstab 文件

vim /etc/fstab
source /etc/fstab

在最后一行加入以下内容

/dev/sdb                /opt/minio/data         xfs      defaults       0 0
  • /dev/sdb 是设备的路径。
  • /opt/minio/data 是挂载点。
  • xfs 是文件系统类型。
  • defaults 是一组默认选项。
  • 0 0 是用于文件系统检查的选项。

在这里插入图片描述

注意:不要写错和少写,我没有写文件系统类型和默认选项,重启后进入了紧急模式
二、修改 /etc 下的 rc.local 文件或者 /etc/rc.d 下的 rc.local 文件
这个配置文件会在用户登陆之前读取,这个文件中写入了什么命令,在每次系统启动时都会执行一次。

vim /etc/rc.local
# 加入 mount /dev/sdb /opt/minio/data
# 重新加载 rc.local 文件
source /etc/rc.local

在这里插入图片描述

每台机器上安装好 minio;(安装在 /usr/local/minio 目录下,版本统一)

# 下载
wget https://dl.minio.org.cn/server/minio/release/linux-amd64/minio
# 修改权限
chmod +x minio

在四台虚拟机的 /usr/local/minio 下编写 minio.sh 启动脚本

#!/bin/bash
export MINIO_ROOT_USER=admin
export MINIO_ROOT_PASSWORD=password
/usr/local/minio/minio server --config-dir /etc/minio --address :9000 --console-address :9001 \
http://192.168.64.100/opt/minio/data/data1 http://192.168.64.100/opt/minio/data/data2 \
http://192.168.64.100/opt/minio/data/data3 http://192.168.64.100/opt/minio/data/data4 \
http://192.168.64.102/opt/minio/data/data1 http://192.168.64.102/opt/minio/data/data2 \
http://192.168.64.102/opt/minio/data/data3 http://192.168.64.102/opt/minio/data/data4 \
http://192.168.64.103/opt/minio/data/data1 http://192.168.64.103/opt/minio/data/data2 \
http://192.168.64.103/opt/minio/data/data3 http://192.168.64.103/opt/minio/data/data4 \
http://192.168.64.104/opt/minio/data/data1 http://192.168.64.104/opt/minio/data/data2 \
http://192.168.64.104/opt/minio/data/data3 http://192.168.64.104/opt/minio/data/data4 &

给脚本修改权限

 chmod 744 minio.sh

启动脚本

# 如果在 minio 的安装目录下 /usr/local/minio
./minio.sh
# 若不在安装目录下,则写全路径
/usr/local/minio/minio.sh

启动可能会报错


查看防火墙的状态关闭防火墙

systemctl status firewalld
# 临时关闭
systemctl stop firewalld
# 永久关闭
systemctl disable firewalld

脚本加入开机启动-Linux

在 /usr/lib/systemd/system 下编写服务

vim /usr/lib/systemd/system/minio.service

加入以下内容

#固定写法,换一下路径即可
#!/bin/sh
[Unit]
Description=xxx-service
Documentation=https://docs.minio.io/
After=syslog.target network.target remote-fs.target nss-lookup.target
[Service]
Type=forking
# 脚本的位置
ExecStart=/usr/local/minio/minio.sh
WorkingDirectory=/opt/minio
PrivateTmp=true
[Install]
WantedBy=multi-user.target

添加权限

chmod +x /usr/lib/systemd/system/minio.service

可以一台一台的新建脚本,也可以用下列命令把建好的脚本拷贝给其他机器

# 先ssh连一下目标服务器
ssh 192.168.64.102
# 退出 192.168.64.102
exit
scp -r /usr/lib/systemd/system/minio.service 192.168.64.102:/usr/lib/systemd/system/minio.service

如果 ssh 由于秘钥问题连不上可用下面命令

ssh -o StrictHostKeyChecking=no 192.168.64.100
# 重新连接

启动

#将服务添加到开机自启服务中
systemctl enable minio.service
#系统服务刷新
systemctl daemon-reload
#启动服务
systemctl start minio.service
#查看服务状态
systemctl status minio
#停止服务
systemctl stop minio
#取消开机自启
systemctl disable minio

在这里插入图片描述

集群部署-Docker

看了好多人写的,都没成功,放着吧

Nginx 负载均衡

官网:https://nginx.org/en/download.html

Nginx 下载安装

# 下载 下载到当前目录
wget https://nginx.org/download/nginx-1.26.0.tar.gz
# 安装相关库
yum install gcc openssl openssl-devel pcre pcre-devel zlib zlib-devel -y
# 解压
tar -zxvf nginx-1.26.0.tar.gz
# 切换至解压后的nginx主目录
cd nginx-1.26.0/
# 在nginx主目录nginx-1.26.0下执行命令  --prefix是指定nginx安装路径
./configure --prefix=/usr/local/nginx  
# 执行命令进行编译
make
# 执行命令进行安装
make install
# 安装完成建议删除 nginx-1.26.0  nginx 安装在了/usr/local
# 这个删除的是下载解压的文件
rm -rf nginx-1.26.0

Nginx 启动

# -c是指定配置文件
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf
# 重启
/usr/local/nginx/sbin/nginx -s reload

Nginx 关闭

# 会将已经进来的请求处理完后再关闭
# 找出nginx的进程号
ps -ef | grep nginx
# QUIT  必须是大写
kill -QUIT 主pid
# 快速关闭会直接关闭,已经进来的请求也不会处理
ps -ef | grep nginx
# TERM 必须是大写
kill -TERM 主pid

Nginx配置检查

# 当修改Nginx配置文件后,可以使用Nginx命令进行配置文件语法检查,用于检查Nginx配置文件是否正确
/usr/local/nginx/sbin/nginx -c /usr/local/nginx/conf/nginx.conf -t

Nginx 修改配置文件

1、在http模块配置upstream

upstream api {
    server  192.168.64.100:9000;
    server  192.168.64.102:9000;
    server  192.168.64.103:9000;
    server  192.168.64.104:9000;
}
upstream webui {
    server  192.168.64.100:9001;
    server  192.168.64.102:9001;
    server  192.168.64.103:9001;
    server  192.168.64.104:9001;
}

2、在server模块里配置

		location / {
            #root   html;
            #index  index.html index.htm;
            proxy_pass http://api;
            proxy_set_header Host $http_host;
            proxy_set_header Server MinIO;
            proxy_set_header Accept-Ranges bytes;
        
        }

再写个server 指定 webui

server {
    listen       50000;
    server_name  localhost;
    location / {
         proxy_pass http://webui;
    }
}

在这里插入图片描述
在这里插入图片描述

测试访问

在地址栏输入:http://192.168.64.100:50000/ 可以正常访问 minio 后台在这里插入图片描述

常见问题

服务器时间不同步

The difference between the request time and the server’s time is too large.
解决:

yum install ntpdate -y
ntpdate pool.ntp.org

上传的文件默认是不能访问的

http://ip:9000/存储桶/文件名

一、后台修改 bucke t 的访问策略

二、代码实现

@Test
	public void createBucket() throws Exception {
		String bucketName = "test1";
		boolean bucketExists = minioClient.bucketExists(BucketExistsArgs.builder().bucket(bucketName).build());
		if (!bucketExists) {
			// 创建bucket
			minioClient.makeBucket(MakeBucketArgs.builder().bucket(bucketName).build());
		}
		//创建的时候设置访问策略  2012-10-17  不能改
		String policyJsonString = "{\n" +
				"    \"Version\": \"2012-10-17\",\n" +
				"    \"Statement\": [\n" +
				"        {\n" +
				"            \"Effect\": \"Allow\",\n" +
				"            \"Principal\": {\"AWS\": [\"*\"]},\n" +
				"            \"Action\": [\"s3:GetBucketLocation\",\"s3:ListBucket\",\"s3:ListBucketMultipartUploads\"],\n" +
				"            \"Resource\": [\"arn:aws:s3:::"+bucketName+"\"]\n" +
				"        },\n" +
				"        {\n" +
				"            \"Effect\": \"Allow\",\n" +
				"            \"Principal\": {\"AWS\": [ \"*\"]},\n" +
				"            \"Action\": [\"s3:DeleteObject\",\"s3:GetObject\", \"s3:ListMultipartUploadParts\",\"s3:PutObject\",\"s3:AbortMultipartUpload\"],\n" +
				"            \"Resource\": [\"arn:aws:s3:::"+bucketName+"/*\"]\n" +
				"        }\n" +
				"    ]\n" +
				"}";
		minioClient.setBucketPolicy(SetBucketPolicyArgs.builder()
						.bucket(bucketName)
						.config(policyJsonString)
				.build());
	}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

计算机的存储体系与性能,存储黑科技大揭秘

计算机体系结构&#xff0c;其中存储分为内存与硬盘。内存&#xff0c;非持久化存储&#xff0c;临时存数&#xff0c;断电即失&#xff1b;硬盘&#xff0c;持久化存储&#xff0c;数据长存&#xff0c;即使断电也无忧。 计算机存储种类繁多&#xff0c;分为内部与外部两类。…

机器学习周记(第三十八周:语义分割)2024.5.6~2024.5.12

目录 摘要 ABSTRACT 1 DeeplabV3实现思路 预测部分 ①主干网络介绍​编辑 ② 加强特征提取结构 ③ 利用特征获得预测结果 摘要 本周继续了语义分割的学习&#xff0c;主要学习了DeepLabV3的部分实现思路&#xff0c;即DeepLabV3的整个模型的预测过程&#xff0c;并通过代…

Windows环境下编译 aom 源码详细过程

AV1 AV1是一种开源的视频编码格式&#xff0c;由开放媒体联盟&#xff08;AOMedia Video 1&#xff0c;简称AOMedia或AOM&#xff09;开发。AV1旨在提供比现有的视频编码格式如H.264和H.265更好的压缩效率&#xff0c;同时保持或提高视频质量。AV1的编码效率显著高于H.264&…

Xilinx 千兆以太网TEMAC IP核 MDIO 配置及物理接口

基于AXI4-Lite接口可以访问MDIO(Management Data Input/Output)接口&#xff0c;而MDIO接口连接MAC外部的PHY芯片&#xff0c;用户可通过AXI4-Lite接口实现对PHY芯片的配置。 1 MDIO接口简介 开放系统互连模型OSI的最低两层分别是数据链路层和物理层&#xff0c;数据链路层的…

【PHP【实战版】系统性学习】——登录注册页面的教程,让编写PHP注册变成一个简单的事情

&#x1f468;‍&#x1f4bb;个人主页&#xff1a;开发者-曼亿点 &#x1f468;‍&#x1f4bb; hallo 欢迎 点赞&#x1f44d; 收藏⭐ 留言&#x1f4dd; 加关注✅! &#x1f468;‍&#x1f4bb; 本文由 曼亿点 原创 &#x1f468;‍&#x1f4bb; 收录于专栏&#xff1a…

Unity编辑器如何多开同一个项目?

在联网游戏的开发过程中&#xff0c;多开客户端进行联调是再常见不过的需求。但是Unity并不支持编辑器多开同一个项目&#xff0c;每次都得项目打个包(耗时2分钟以上)&#xff0c;然后编辑器开一个进程&#xff0c;exe 再开一个&#xff0c;真的有够XX的。o(╥﹏╥)o没错&#…

如何利用ChatGPT辅助下处理:ENVI、GEE、Python等遥感数据

遥感技术主要通过卫星和飞机从远处观察和测量我们的环境&#xff0c;是理解和监测地球物理、化学和生物系统的基石。ChatGPT是由OpenAI开发的最先进的语言模型&#xff0c;在理解和生成人类语言方面表现出了非凡的能力。本课程重点介绍ChatGPT在遥感中的应用&#xff0c;人工智…

重卡生产流程的可视化管理与优化

重卡车间可视化是一个将车间内部生产流程、设备状态及人员配置直观展现的技术手段&#xff0c;确保制造过程的每个环节都在最优状态下运行。 在重卡制造领域&#xff0c;从底盘组装、车身焊接、涂装到最终的总装和检验&#xff0c;每一个工作过程都至关重要&#xff0c;对于保…

web入门——导航栏

本专栏内容代码来自《响应式web&#xff08;HTML5CSS3Bootstrap&#xff09;》教材。 导航栏 实现代码&#xff1a; <!DOCTYPE html> <html lang"en"> <head><meta charset"UTF-8"><meta name"viewport" content&…

基于springboot的代驾管理系统的设计与实现

文章目录 项目介绍主要功能截图&#xff1a;部分代码展示设计总结项目获取方式 &#x1f345; 作者主页&#xff1a;超级无敌暴龙战士塔塔开 &#x1f345; 简介&#xff1a;Java领域优质创作者&#x1f3c6;、 简历模板、学习资料、面试题库【关注我&#xff0c;都给你】 &…

DI-engine强化学习入门(七)如何自定义神经网络模型

在强化学习中,需要根据决策问题和策略选择合适的神经网络。DI-engine中,神经网络模型可以通过两种方式指定: 使用配置文件中的cfg.policy.model自动生成默认模型。这种方式下,可以在配置文件中指定神经网络的类型(MLP、CNN等)以及超参数(隐层大小、激活函数等),DI-engine会根据…

https://是怎么实现的?

默认的网站建设好后都是http访问模式&#xff0c;这种模式对于纯内容类型的网站来说&#xff0c;没有什么问题&#xff0c;但如果受到中间网络劫持会让网站轻易的跳转钓鱼网站&#xff0c;为避免这种情况下发生&#xff0c;所以传统的网站改为https协议&#xff0c;这种协议自己…

文本检测模型 DBNet 一种基于分割算法的模型 对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合 可微分二值化模块 概率图

文本检测模型 DBNet DBNet文本检测模型是一种基于分割算法的模型,其优化之处在于对每个像素点进行自适应二值化,并将二值化过程与网络训练相结合。 传统的文本检测方法通常将二值化作为一个后处理步骤,与网络训练分开进行。而DBNet则提出了一种可微分的二值化方法,即将文…

常见的几种物联网无线组网技术——青创智通

工业物联网解决方案-工业IOT-青创智通 随着物联网技术的不断发展&#xff0c;无线组网技术成为了物联网中不可或缺的一部分。无线组网技术可以使得各种设备之间无需通过有线连接即可进行数据传输和通信&#xff0c;从而提高了设备的灵活性和可扩展性。下面将介绍几种常见的物联…

行业分析---马斯克的Tesla

1 背景 在前面的博文《行业分析---我眼中的Apple Inc.》中&#xff0c;笔者曾介绍过苹果公司的财报和商业。依然本着提升自己看公司的能力&#xff0c;尝试去分析相对熟悉的公司&#xff0c;看懂它的商业。在之前的博客《自动驾驶---Tesla之FSD简介》中&#xff0c;笔者也简单介…

c++父类指针指向子类

有一个常见的c题&#xff0c;就是父类和子类的构造函数和析构函数分别调用顺序&#xff1a; 父类构造函数子类构造函数子类析构函数父类析构函数 以及父类中的函数在子类中重新实现后&#xff0c;父类指针指向子类后&#xff0c;该指针调用的函数是父类中的还是子类中的&…

Doris【部署 01】Linux部署MPP数据库Doris稳定版(下载+安装+连接+测试)

本次安装测试的为稳定版2.0.8官方文档 https://doris.apache.org/zh-CN/docs/2.0/get-starting/quick-start 这个简短的指南将告诉你如何下载 Doris 最新稳定版本&#xff0c;在单节点上安装并运行它&#xff0c;包括创建数据库、数据表、导入数据及查询等。 Linux部署稳定版Do…

简易留言板

目录 前端实现 数据库的使用 创建数据表 创建项目 连接数据库 后端实现 接口定义 持久层 业务逻辑层 控制层 前端代码完善 留言板是一个常见的功能&#xff0c;在本篇文章中&#xff0c;将实现一个简易的留言板&#xff1a; 页面中能够显示所有留言内容&#xff0c…

AI应用案例:新闻文本分类

随着科学技术的不断发展&#xff0c;互联网技术得以快速的发展和普及&#xff0c;并已在各行各业得到了广泛的应用&#xff0c;从中致使了网络上的信息呈现出爆炸式的增长状态&#xff0c;达到了“足不出户&#xff0c;万事皆知”的境况&#xff0c;充分体现了互联网新闻给生活…

深入理解WPF的ResourceDictionary

深入理解WPF的ResourceDictionary 介绍 在WPF中&#xff0c;ResourceDictionary用于集中管理和共享资源&#xff08;如样式、模板、颜色等&#xff09;&#xff0c;从而实现资源的重用和统一管理。本文详细介绍了ResourceDictionary的定义、使用和合并方法。 定义和用法 Res…