k8s-配置与存储-配置管理
文章目录
- 一、配置存储
- 1.1 ConfigMap
- 1.1.1.基于文件夹的创建方式
- 1.1.2指定文件的创建方式
- 1.1.3 配置文件创建configmap
- 1.2 Secret
- 1.2.1Secret的应用与Docker仓库 Secret设置
- 1. Kubernetes 中的 Secrets:
- 创建 Secret 示例:
- 将 Secret 挂载到 Pod 中的示例:
- 2. Docker 仓库中的 Secret:
- 在 Kubernetes 中设置 Docker 仓库的 Secret 示例:
- 在 Pod 中使用 Docker 仓库的 Secret 示例:
- 1.3SubPath 的使用
- 1.3.1 使用SubPath
- 1.4ConfigMap的热更新
- 1.5不可变的 Secret 和 ConfigMap
在前面已经提到,容器的生命周期可能很短,会被频繁地创建和销毁。那么容器在销毁时,保存在容器中的数据也会被清除。这种结果对用户来说,在某些情况下是不乐意看到的。为了持久化保存容器的数据,kubernetes引入了Volume的概念。
Volume是Pod中能够被多个容器访问的共享目录,它被定义在Pod上,然后被一个Pod里的多个容器挂载到具体的文件目录下,kubernetes通过Volume实现同一个Pod中不同容器之间的数据共享以及数据的持久化存储。Volume的生命容器不与Pod中单个容器的生命周期相关,当容器终止或者重启时,Volume中的数据也不会丢失。
kubernetes的Volume支持多种类型,比较常见的有下面几个:
- 简单存储:EmptyDir、HostPath、NFS
- 高级存储:PV、PVC
- 配置存储:ConfigMap、Secret
一、配置存储
1.1 ConfigMap
1.1.1.基于文件夹的创建方式
ConfigMap是一种比较特殊的存储卷,它的主要作用是用来存储配置信息的。
使用 kubectl create configmap -h 查看示例,构建 configmap 对象
[root@k8s-master ~]# mkdir config
[root@k8s-master ~]# cd config[root@k8s-master config]# kubectl create configmap -h
创建两个配置文件
[root@k8s-master config]# mkdir test
[root@k8s-master config]# cd test/
[root@k8s-master test]# ls
[root@k8s-master test]# touch db.properties
[root@k8s-master test]# ls
db.properties
[root@k8s-master test]# vi db.properties
username=root
password=admin
[root@k8s-master test]# vi redis.properties
host:127.0.0.1
port:6379
#创建一个名为 test-dir-config 的 ConfigMap,其中包含来自指定目录的所有文件
[root@k8s-master config]# kubectl create configmap test-dir-config --from-file=test/
configmap/test-dir-config created
- kubectl create configmap: 这是用于在 Kubernetes 中创建 ConfigMap 的命令。
- test-dir-config: 这是您为新创建的 ConfigMap 指定的名称。
- –from-file=test/: 这个标志指定了 ConfigMap 的数据来自哪个目录kubectl create configmap: 这是用于在 Kubernetes 中创建 ConfigMap 的命令。
# 获取ConfigMap 列表
[root@k8s-master config]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 15d
test-dir-config 2 103s
- kube-root-ca.crt: 包含了一个数据项 ,存储根证书的 ConfigMap
- test-dir-config: 包含了两个数据项。这是在之前的操作中创建的 ConfigMap,它从 test/ 目录中获取了两个文件的内容。
#查看详细信息
[root@k8s-master config]# kubectl describe cm test-dir-config
1.1.2指定文件的创建方式
[root@k8s-master config]# vi application.yml
spring:application:name: test app
server:port:8080
[root@k8s-master config]# kubectl create cm spring-boot-test-yaml --from-file=/root/config/application.yml
configmap/spring-boot-test-yaml created
# 获取ConfigMap 列表
[root@k8s-master config]# kubectl get cm
NAME DATA AGE
kube-root-ca.crt 1 15d
spring-boot-test-yaml 1 20s
test-dir-config 2 12m
[root@k8s-master config]# kubectl describe cm spring-boot-test-yaml
1.1.3 配置文件创建configmap
创建configmap.yaml,内容如下:
apiVersion: v1
kind: ConfigMap
metadata:name: configmapnamespace: dev
data:info: |username:adminpassword:123456
接下来,使用此配置文件创建configmapp
创建configmap
[root@k8s-master config]# kubectl create -f configmap.yaml
configmap/configmap created
# 查看configmap详情
[root@k8s-master config]# kubectl describe cm configmap -n dev
Name: configmap
Namespace: dev
Labels: <none>
Annotations: <none>Data
====
info:
----
username:admin
password:123456BinaryData
====Events: <none>
接下来创建一个pod-configmap.yaml,将上面创建的configmap挂载进去
apiVersion: v1
kind: Pod
metadata:name: pod-configmapnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1volumeMounts: # 将configmap挂载到目录- name: configmountPath: /configmap/configvolumes: # 引用configmap- name: configconfigMap:name: configmap
# 创建pod
[root@k8s-master config]# kubectl create -f pod-configmap.yaml
pod/pod-configmap created
# 查看pod
[root@k8s-master config]# kubectl get pod pod-configmap -n dev
NAME READY STATUS RESTARTS AGE
pod-configmap 1/1 Running 0 15s#进入容器
[root@k8s-master ~]# kubectl exec -it pod-configmap -n dev -- /bin/sh
#
# cd /configmap/config/
# ls
info
# more info
username:admin
password:123456# 可以看到映射已经成功,每个configmap都映射成了一个目录
# key--->文件 value---->文件中的内容
# 此时如果更新configmap的内容, 容器中的值也会动态更新
1.2 Secret
在kubernetes中,还存在一种和ConfigMap非常类似的对象,称为Secret对象。它主要用于存储敏感信息,例如密码、秘钥、证书等等。
1.2.1Secret的应用与Docker仓库 Secret设置
1. Kubernetes 中的 Secrets:
在 Kubernetes 中,Secrets 可以用于以下目的:
- 存储敏感数据: 比如数据库密码、API 密钥等。
- 挂载到 Pod 中: Secrets 可以通过 Volume 挂载到 Pod 中,使应用程序能够读取敏感数据。这有助于将敏感信息与应用程序的配置分离开。
- 用于身份验证: 在某些情况下,Secrets 也可以用于身份验证,例如在 Ingress 中配置 TLS 证书。
创建 Secret 示例:
1.首先使用base64对数据进行编码
#准备username
[root@k8s-master ~]# echo -n 'admin' | base64
YWRtaW4=#准备password
[root@k8s-master ~]# echo -n '123456' | base64
MTIzNDU2
2.接下来编写secret.yaml,并创建Secret
apiVersion: v1
kind: Secret
metadata:name: secretnamespace: dev
type: Opaque
data:username: YWRtaW4=password: MTIzNDU2
# 创建secret
[root@k8s-master config]# kubectl create -f secret.yaml
secret/secret created
# 查看secret详情
[root@k8s-master config]# kubectl describe secret secret -n dev
Name: secret
Namespace: dev
Labels: <none>
Annotations: <none>Type: OpaqueData
====
password: 6 bytes
username: 5 bytes
3.创建pod-secret.yaml,将上面创建的secret挂载进去:
apiVersion: v1
kind: Pod
metadata:name: pod-secretnamespace: dev
spec:containers:- name: nginximage: nginx:1.17.1volumeMounts: # 将secret挂载到目录- name: configmountPath: /secret/configvolumes:- name: configsecret:secretName: secret
# 创建pod
[root@k8s-master config]# kubectl create -f pod-secret.yaml
pod/pod-secret created# 查看pod
[root@k8s-master config]# kubectl get pod pod-secret -n dev
NAME READY STATUS RESTARTS AGE
pod-secret 1/1 Running 0 2m28s# 进入容器,查看secret信息,发现已经自动解码了
[root@k8s-master config]# kubectl exec -it pod-secret -- /bin/sh -n dev
/ # ls /secret/config/
password username
/ # more /secret/config/username
admin
/ # more /secret/config/password
123456
另一种创建方法:
kubectl create secret generic my-secret \--from-literal=username=my-username \--from-literal=password=my-password
将 Secret 挂载到 Pod 中的示例:
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mycontainerimage: myimagevolumeMounts:- name: secret-volumemountPath: /etc/myappvolumes:- name: secret-volumesecret:secretName: my-secret
2. Docker 仓库中的 Secret:
在 Docker 仓库中,Secrets 通常用于:
- 拉取私有镜像: 如果您的 Docker 镜像存储库是私有的,您需要将 Docker 仓库的凭据存储在 Kubernetes 中的 Secret 中,以便 Pods 能够拉取镜像。
在 Kubernetes 中设置 Docker 仓库的 Secret 示例:
kubectl create secret docker-registry my-docker-secret \--docker-server=my-docker-registry.com \--docker-username=my-username \--docker-password=my-password \--docker-email=my-email@example.com
在 Pod 中使用 Docker 仓库的 Secret 示例:
apiVersion: v1
kind: Pod
metadata:name: mypod
spec:containers:- name: mycontainerimage: my-docker-registry.com/myimage:latestimagePullSecrets:- name: my-docker-secret
这将使 Kubernetes 能够使用 my-docker-secret 中的凭据拉取 my-docker-registry.com/myimage:latest 这个私有 Docker 镜像
1.3SubPath 的使用
使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉,此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
配置方式:
- 定义 volumes 时需要增加 items 属性,配置 key 和 path,且 path 的值不能从 / 开始
- 在容器内的 volumeMounts 中增加 subPath 属性,该值与 volumes 中 items.path 的值相同
containers:
......
volumeMounts:
- mountPath: /etc/nginx/nginx.conf # 挂载到哪里
name: config-volume # 使用哪个 configmap 或 secret
subPath: etc/nginx/nginx.conf # 与 volumes.[0].items.path 相同
volumes:
- configMap:
name: nginx-conf # configMap 名字
items: # subPath 配置
key: nginx.conf # configMap 中的文件名
path: etc/nginx/nginx.conf # subPath 路径
[root@k8s-master etc]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-mkp29 1/1 Running 2 (3d3h ago) 12d
nginx-deploy-c4986b7f-8tplt 1/1 Running 2 (3d3h ago) 6d6h
nginx-deploy-c4986b7f-qltv6 1/1 Running 2 (3d3h ago) 6d6h
[root@k8s-master etc]# kubectl exec -it nginx-deploy-c4986b7f-8tplt -- sh
# cd /etc
# cd nginx
# ls
conf.d fastcgi_params koi-utf koi-win mime.types nginx.conf scgi_params uwsgi_params win-utf
# cat nginx.conf
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;
}
#复制配置信息 退出容器
# exit
#创建nginx.conf文件
[root@k8s-master config]# vi nginx-conf
[root@k8s-master config]# ls
nginx-conf[root@k8s-master config]# kubectl create configmap nginx-conf-cm --from-file=./nginx-conf
configmap/nginx-conf-cm created
[root@k8s-master config]# kubectl describe cm nginx-conf-cmName: nginx-conf-cm
Namespace: default
Labels: <none>
Annotations: <none>Data
====
nginx-conf:
----
user nginx;
worker_processes 1;error_log /var/log/nginx/error.log warn;
pid /var/run/nginx.pid;events {worker_connections 1024;
}http {include /etc/nginx/mime.types;default_type application/octet-stream;log_format main '$remote_addr - $remote_user [$time_local] "$request" ''$status $body_bytes_sent "$http_referer" ''"$http_user_agent" "$http_x_forwarded_for"';access_log /var/log/nginx/access.log main;sendfile on;#tcp_nopush on;keepalive_timeout 65;#gzip on;include /etc/nginx/conf.d/*.conf;
}BinaryData
====Events: <none>
存储的内容就是nginx-conf这个文件
[root@k8s-master config]# kubectl edit deploy nginx-deploy
volumeMounts: # 挂在数据卷- name: nginx-conf # 数据卷的名称mountPath: '/etc/nginx' # 挂载的路径volumes: # 数据卷定义- name: nginx-conf # 数据卷的名称configMap: # 数据卷类型为 configmapname: nginx-conf-cm #configmap名字items: # 要将 configmap中哪些数据挂在尽力啊- key: nginx-conf # 指定挂在哪个keypath: nginx.conf # 挂在后该key重命名什么名字
[root@k8s-master config]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-mkp29 1/1 Running 2 (3d3h ago) 12d
nginx-deploy-7c6975968-t5w5b 0/1 CrashLoopBackOff 4 (62s ago) 2m37s
[root@k8s-master config]# kubectl edit deploy nginx-deploy
deployment.apps/nginx-deploy edited
# 在name: nginx后面加入command: ["/bin/sh", "-c","nginx daemon off;sleep 3600"]
[root@k8s-master config]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-deploy-55f7b46d59-lp5px 1/1 Running 0 22s
nginx-deploy-55f7b46d59-wrfjm 1/1 Running 0 20s
[root@k8s-master config]# kubectl exec -it nginx-deploy-55f7b46d59-lp5px -- sh
# cd /etc/nginx
# ls
nginx.conf
进入容器后发现原来的一堆配置文件都不见了
得出结果:使用 ConfigMap 或 Secret 挂载到目录的时候,会将容器中源目录给覆盖掉.此时我们可能只想覆盖目录中的某一个文件,但是这样的操作会覆盖整个文件,因此需要使用到 SubPath
1.3.1 使用SubPath
[root@k8s-master config]# kubectl edit deploy nginx-deployvolumeMounts:- mountPath: /etc/nginx/nginx.confname: nginx-confsubPath: etc/nginx/nginx.confvolumes:- configMap:defaultMode: 420items:- key: nginx-confpath: etc/nginx/nginx.confname: nginx-conf-cmname: nginx-conf
[root@k8s-master config]# kubectl get po
NAME READY STATUS RESTARTS AGE
nginx-85b98978db-mkp29 1/1 Running 2 (3d20h ago) 12d
nginx-deploy-5588c8bc86-bhj9l 1/1 Running 0 35s
nginx-deploy-5588c8bc86-ltxvs 1/1 Running 0 34s
#进入容器
[root@k8s-master config]# kubectl exec -it nginx-deploy-5588c8bc86-bhj9l -- sh
#
# cd /etc/nginx
# ls
conf.d fastcgi_params koi-utf koi-win mime.types nginx.conf scgi_params uwsgi_params win-utf
配置了subPath后进入容器后发现 原来那些文件没有被覆盖掉了,这样就解决了加载配置覆盖原目录的问题。
1.4ConfigMap的热更新
我们通常会将项目的配置文件作为 configmap 然后挂载到 pod,那么如果更新 configmap 中的配置,会不会更新到 pod 中呢?
这得分成几种情况:
默认方式:会更新,更新周期是更新时间 + 缓存时间
subPath:不会更新
变量形式:如果 pod 中的一个变量是从 configmap 或 secret 中得到,同样也是不会更新的
对于 subPath 的方式,我们可以取消 subPath 的使用,将配置文件挂载到一个不存在的目录,避免目录的覆盖,然后再利用软连接的形式,将该文件链接到目标位置
但是如果目标位置原本就有文件,可能无法创建软链接,此时可以基于前面讲过的 postStart 操作执行删除命令,将默认的文件删除即可
- 通过 edit 命令直接修改 configmap
- 通过 replace 替换
由于 configmap 我们创建通常都是基于文件创建,并不会编写 yaml 配置文件,因此修改时我们也是直接修改配置文件,而 replace 是没有 --from-file 参数的,因此无法实现基于源配置文件的替换,此时我们可以利用下方的命令实现
# 该命令的重点在于 --dry-run 参数,该参数的意思打印 yaml 文件,但不会将该文件发送给 apiserver,再结合 -oyaml 输出 yaml 文件就可以得到一个配置好但是没有发给 apiserver 的文件,然后再结合 replace 监听控制台输出得到 yaml 数据即可实现替换
kubectl create cm --from-file=nginx.conf --dry-run -o yaml | kubectl replace -f-
#查看当前的 ConfigMap
[root@k8s-master config]# kubectl get cm -n dev
NAME DATA AGE
configmap 1 3d19h[root@k8s-master config]# ls
application.yml file1.txt nginx-conf nginx-pod-configmap.yaml secret.yaml
configmap.yaml file2.txt nginx.conf pod-secret.yaml test
#修改 ConfigMap 数据
[root@k8s-master config]# vi configmap.yamlusername:AAApassword:BBB#更新 ConfigMap 读取 configmap.yaml 文件中的数据,
#并使用 kubectl replace 将其更新到 configmap ConfigMap 中
[root@k8s-master config]# kubectl create cm configmap -n dev --from-file=configmap.yaml --dry-run=client -o yaml | kubectl replace -f-
configmap/configmap replaced[root@k8s-master config]# kubectl get pod pod-configmap -n dev
NAME READY STATUS RESTARTS AGE
pod-configmap 1/1 Running 0 15s# 验证更新是否传递到 Pod
[root@k8s-master config]# kubectl exec -it pod-configmap -n dev -- /bin/sh
# cd /configmap/config/
# ls
configmap.yaml
# cat configmap.yaml
apiVersion: v1
kind: ConfigMap
metadata:name: configmapnamespace: dev
data:info: |username:AAApassword:BBB
确保挂载路径与 ConfigMap 中定义的路径一致,然后查看文件内容是否更新为新的用户名和密码。
这样,就成功地使用 kubectl 命令更新了 ConfigMap 并确保更新成功地传递到相关的 Pod 中
1.5不可变的 Secret 和 ConfigMap
**对于一些敏感服务的配置文件,在线上有时是不允许修改的,此时在配置 configmap 时可以设置 immutable: true 来禁止修改.**这个配置项会锁定 ConfigMap,使其变得只读,防止运维人员或其他用户无意中修改关键配置
相关文章:

k8s-配置与存储-配置管理
文章目录 一、配置存储1.1 ConfigMap1.1.1.基于文件夹的创建方式1.1.2指定文件的创建方式1.1.3 配置文件创建configmap 1.2 Secret1.2.1Secret的应用与Docker仓库 Secret设置1. Kubernetes 中的 Secrets:创建 Secret 示例:将 Secret 挂载到 Pod 中的示例…...

c语言实现bellman-ford算法
下面是使用C语言实现Bellman-Ford算法的示例代码。Bellman-Ford算法用于在带权重的图中找到从单个源点到所有其他顶点的最短路径,它也能处理图中包含负权重边的情况。 #include <stdio.h> #include <stdlib.h> #include <limits.h>// 定义边的结构 struct …...

socket与rpc的区别
如今的游戏开发,不搞个跨服玩法都不好意思说在做游戏了(当然,也跟游戏类型有关,一些轻度休闲游戏可以排除在外)。跨服玩法的设计,可以进一步激发玩家追求高战力的虚荣心,也可以汇聚玩家数量&…...

10、内网安全-横向移动域控提权NetLogonADCSPACKDC永恒之蓝
用途:个人学习笔记,有所借鉴,欢迎指正! 背景: 主要针对内网主机中的 域控提权漏洞,包含漏洞探针和漏洞复现利用。 1、横向移动-系统漏洞-CVE-2017-0146(ms17-010,永恒之蓝࿰…...

代码随想录算法训练营第三八天 | 动态规划
目录 动态规划基础斐波那契数爬楼梯使用最小花费爬楼梯 LeetCode 509. 斐波那契数 LeetCode 70. 爬楼梯 LeetCode 746. 使用最小花费爬楼梯 动态规划基础 Dynamic Programming (DP) 如果某一问题有很多重叠子问题,使用动态规划是最有效的。 动态规划中每一个状态…...

【ubuntu2004安装N卡驱动】
软硬件环境 硬件:联想notebook16,显卡4060laptop 软件: ubuntu20.04 驱动安装成功的版本:NVIDIA-Linux-x86_64-535.146.02.run 使用默认的驱动安装,没用原因如下 让手动安装。 手动安装 环境准备: sudo …...

使用 Docker 安装 Kibana 8.4.3
使用 Docker 安装 Kibana 8.4.3 一. 安装启动 Kibana 8.4.3二. 简单使用2.1 向 Elasticsearch 发送请求2.2 搜索2.3 整体页面 前言 这是我在这个网站整理的笔记,有错误的地方请指出,关注我,接下来还会持续更新。 作者:神的孩子都在歌唱 安装k…...

基于python社交网络大数据分析系统的设计与实现
项目:基于python社交网络大数据分析系统的设计与实现 摘 要 社交网络大数据分析系统是一种能自动从网络上收集信息的工具,可根据用户的需求定向采集特定数据信息的工具,本项目通过研究爬取微博网来实现社交网络大数据分析系统功能。对于采集…...

【设计模式】23种设计模式笔记
设计模式分类 模板方法模式 核心就是设计一个部分抽象类。 这个类具有少量具体的方法,和大量抽象的方法,具体的方法是为外界提供服务的点,具体方法中定义了抽象方法的执行序列 装饰器模式 现在有一个对象A,希望A的a方法被修饰 …...

编程笔记 Golang基础 009 标识符和关键字
编程笔记 Golang基础 009 标识符和关键字 一、标识符二、标识符分类(一)空白标识符(又称下划线 _)(二)预声明标识符(三)唯一标识符(四)导出标识符 三、关键字…...

vue3中mockjs模拟获取数据
开发项目的时候,如果后端接口没有出来,前端工程师也不必非得等接口出来才进行下步开发。可以使用mock.js来模拟接口数据,以下就是使用vue3设置hook函数来封装axios请求,配合mock.js来实现的代码,mock的官网 Mock.js 一…...

element ui 添加自定义方法
今天在修改 el-table 源码过程中遇到一个头大的问题,原本修改编译后,将 element的子目录lib下的文件复制到项目的响应目录里就可以了,但是,这次不知为何,编译老是出问题,实在没有办法,我就直接修…...

Hive UDF
当Hive提供的内置函数不能满足查询需求时,用户可以根据自己业务编写自定义函数(User Defined Functions, UDF), 然后在HiveQL中调用。 例如有这样一个需求:为了保护用户隐私,当查询数据的时候,需要将用户手机号的中间…...

python Opencv 中绘制图
目录 一:绘制直线 二:绘制矩形 三:绘制圆形 四:绘制椭圆...

imazing软件安全吗?2024中文永久免费许可证
以下是iMazing更多的使用场景描述: iMazing3Mac-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49816 iMazing3Win-最新绿色安装包下载如下: https://wm.makeding.com/iclk/?zoneid49817 1. 数据迁移 当你换新的iOS设…...

JavaScript:防抖与节流
文章目录 防抖(Debounce)节流 (Throttle) 在JavaScript中,防抖(debounce)和节流(throttle)是两种优化函数调用频率的策略,它们主要用于限制频繁触发的事件回调函数执行次数,以防止过多不必要的计…...

在Win系统部署WampServer并实现公网访问本地服务【内网穿透】
目录 推荐 前言 1.WampServer下载安装 2.WampServer启动 3.安装cpolar内网穿透 3.1 注册账号 3.2 下载cpolar客户端 3.3 登录cpolar web ui管理界面 3.4 创建公网地址 4.固定公网地址访问 推荐 前些天发现了一个巨牛的人工智能学习网站,通俗易懂࿰…...

面试经典150题——单词规律
"Dont wait. The time will never be just right." - Napoleon Hill 1. 题目描述 2. 题目分析与解析 首先还是得把题目先读懂,我们直接来看看示例: 根据上面的示例,我们可以看出pattern其实就是表示单词出现的规律,每…...

RK3568平台开发系列讲解(Linux系统篇)container_of
🚀返回专栏总目录 文章目录 一、理解宏container_of二、使用案例沉淀、分享、成长,让自己和他人都能有所收获!😄 一、理解宏container_of 在代码中管理多个数据结构时,几乎总是需要将一个结构嵌入另一个结构中,并随时检索它们,而不关心有关内存偏移或边界的问题。假设…...

回显服务器
. 写一个应用程序,让这个程序可以使用网络通信,这里就需要调用传输层提供的api,传输层提供协议,主要是两个: UDP,TCP,它们分别提供了一套不同的api,socket api. UDP和TCP UDP:无连接,不可靠传输,面向数据报,全双工 TCP:有连接,可靠传输,面向字节流,全双工 一个客户端可以连接…...

c#,dotnet, DataMatrix 类型二维码深度识别,OCR,(基于 Halcon)
代码中部分调用的 c 函数参数,具体说明自行研究~(我也是参考的其他资源,还没研究透彻) 例如:HOperatorSet.GenRectangle2() , 2000, 2000, 0, 2000, 2000 这些数字应该是选取的图片解析范围、尺寸ÿ…...

亿道丨三防平板电脑厂商哪家好丨麒麟系统三防平板PAD
随着科技的飞速发展,人们对于移动设备的需求越来越高。然而,在不同的行业应用场景下,常规的智能平板往往无法满足特殊的工作要求。,亿道三防平板,将高可靠性与卓越性能高度结合,为各行各业提供卓越的移动解…...

什么是hash冲突?以及解决方案
哈希冲突是指在哈希表中,两个或更多个不同的键被映射到了同一个哈希桶的情况。这种情况可能会导致数据丢失或者检索效率下降,因为不同的键被映射到了同一个位置,需要额外的操作来处理这种冲突。 解决哈希冲突的常见方法包括: 开放…...

C# CAD交互界面-模态窗体与非模态窗体调用方式
运行环境Visual Studio 2022 c# cad2016 一、模态窗体调用方式: 当一个模态窗体打开时,它会阻塞主窗体的所有输入,直到关闭该模态窗体为止。例如,弹出一个对话框让用户必须完成某些操作后才能继续使用主程序。 [CommandMethod(&q…...

19个Web前端交互式3D JavaScript框架和库
JavaScript (JS) 是一种轻量级的解释(或即时编译)编程语言,是世界上最流行的编程语言。JavaScript 是一种基于原型的多范式、单线程的动态语言,支持面向对象、命令式和声明式(例如函数式编程&am…...

PaddleSeg分割框架解读[01] 核心设计解析
文章目录 PaddleSeg分割框架解读[01] 核心设计解析tools/train.pypaddleseg/cvlibs/config.pypaddleseg/cvlibs/builder.pypaddleseg/cvlibs/manager.pyPaddleSeg分割框架解读[01] 核心设计解析 tools/train.py import argparse import random import numpy as np import cv2…...

新鲜出炉:小巧优雅的 css-in-js库StyledFc
StyledFc 一个简单的运行时css-in-js库,用于封装react组件 零依赖非常小,< 3kb.运行时生成css支持css变量支持类似less的嵌套css样式支持props动态css支持typescript 演示 安装 pnpm add styledfc # or npm install styledfc # or yarn add styl…...

Python编程实验四:函数的使用
目录 一、实验目的与要求 二、实验内容 三、主要程序清单和程序运行结果 第1题 第2题 第3题 第4题 第5题 四、实验结果分析与体会 一、实验目的与要求 (1)通过本次实验,学生应掌握函数的定义与调用的基本语法,能根据需要…...

SVN服务备份
hotcopy备份 window批处理 保存以下内容到svn_buckup.bat,确保内容的路径正确,最后双击bat文件进行备份即可 echo offrem SVN安装路径 set svn"C:\Program Files\VisualSVN Server\bin"rem 仓库根目录 set homeE:\Repositories\WorkSpacere…...

FIDO2入门以及相关概念 Client to Authenticator Protocol
本文根据官方文档的定义以及我疑惑的问题做出的相关整理的问答,可能会有偏差,请以官网为准。 官网文档网址:Client to Authenticator Protocol (CTAP) FIDO是什么 FIDO(Fast Identity Online)是一组开放标准和…...