Docker 搭建 Gogs
Docker 搭建 Gogs
准备工作
- 先准备配置目录和持久化目录,举个栗子:
mkdir -p /opt/module/gogs/{data,backup}
拉取官方Gogs镜像
# 拉取 gogs:0.13
docker pull gogs/gogs:0.13
# 拉取最新版 gogs 镜像
docker pull gogs/gogs
启动一个临时容器【通过创建一个临时的测试容器,用来复制配置文件,来反推配置】
docker run -d \-p 10022:22 \-p 13000:3000 \-v /opt/module/gogs/data:/data \--name=gogs \gogs/gogs:0.13
参数说明:
docker run -d
: 启动一个Docker容器并将其设置为在后台(守护进程模式)运行。-p 10022:22
: 将主机的端口10022映射到容器内部的端口22,这允许你通过主机的10022端口访问容器内部的SSH服务。-p 13000:3000
: 将主机的端口10300映射到容器内部的端口3000,这允许你通过主机的10300端口访问容器内部的Gogs Web应用程序。-v /opt/module/gogs/data:/data
: 将主机上的/opt/module/gogs/data
目录挂载到容器内部的/data
目录,这样可以持久化地存储Gogs的数据,以防容器停止后数据丢失。--name=gogs
: 为容器指定一个名称,即"gogs",以便在后续操作中更容易引用该容器。gogs/gogs:0.13
: 指定要运行的Docker镜像的名称和标签。在这里,使用的是Gogs官方镜像的0.13版本。
复制gogs的配置文件到宿主机中
# 将容器app.ini文件复制到宿主机
docker cp gogs:/data/gogs/conf/app.ini /opt/module/gogs/conf# 将容器data文件夹下内容复制到宿主机
docker cp gogs:/data /opt/module/gogs/data# 将容器中的log文件夹复制到宿主机【可以不执行】
docker cp gogs:/var/log/nginx /opt/module/nginx/logs
docker cp gogs:/data /opt/module/gogs/data
移除临时容器
docker stop gogs
docker rm gogs
运行镜像
docker run -d \-p 10022:22 \-p 13000:3000 \-v /opt/module/gogs/data:/data \-v /opt/module/gogs/backup:/backup \-e TZ="Asia/Shanghai"\--name=gogs \--restart=always \gogs/gogs:0.13
参数说明:
docker run -d
: 启动一个Docker容器并将其设置为在后台(守护进程模式)运行。-p 10022:22
: 将主机的端口10022映射到容器内部的端口22,这允许你通过主机的10022端口访问容器内部的SSH服务。-p 13000:3000
: 将主机的端口10300映射到容器内部的端口3000,这允许你通过主机的10300端口访问容器内部的Gogs Web应用程序。-v /opt/module/gogs/data:/data
: 将主机上的/opt/module/gogs/data
目录挂载到容器内部的/data
目录,这样可以持久化地存储Gogs的数据,以防容器停止后数据丢失。-v /opt/module/gogs/backup:/backup
: 将主机上的/opt/module/gogs/backup
目录挂载到容器内部的/backup
目录,这样可以持久化地存储Gogs的数据,以防容器停止后数据丢失。-e TZ="Asia/Shanghai"
: 设置容器的时区为"Asia/Shanghai"。--name=gogs
: 为容器指定一个名称,即"gogs",以便在后续操作中更容易引用该容器。--restart=always
: 指定容器的重启策略为始终自动重启。这意味着如果容器意外停止,Docker将自动重新启动容器。gogs/gogs:0.13
: 指定要运行的Docker镜像的名称和标签。在这里,使用的是Gogs官方镜像的0.13版本。
查看启动日志
#docker logs [服务id/服务名]
docker logs gogsdocker logs -f -t --tail 20 gogs
进入gogs容器内部
docker ps # 查看正在运行的容器,并得到 容器id# 进入tomcat容器内部
docker exec -it [容器id] /bin/bash # 中间那个是容器id 就是 CONTAINER_ID
docker exec -it [容器id] /bin/sh
# -it 表示进入
docker exec -it gogs sh
docker exec -it gogs /bin/sh
# 使用 命令别名 开启 ll命令
cat <<EOF >> /etc/profile
alias ll='ls -l --color=tty'
alias grep='grep --color=auto'
EOFsource /etc/profile
查看防火墙【开放端口】
# 查询端口是否开放
firewall-cmd --query-port=10022/tcp
firewall-cmd --query-port=13000/tcp# 开放80、443端口
firewall-cmd --permanent --add-port=10022/tcp
firewall-cmd --permanent --add-port=13000/tcp# 移除端口
firewall-cmd --permanent --remove-port=10022/tcp
firewall-cmd --permanent --remove-port=13000/tcp# 重启防火墙(修改配置后要重启防火墙)
firewall-cmd --reload# 查看已经开发那些端口
firewall-cmd --list-ports
firewall-cmd --zone=public --list-ports
测试
#浏览器中服务器
http://虚拟机IP:13000
http://虚拟机IP:10022
常用Git命令
# 配置
git config --global user.name "Your Name Comes Here"
git config --global user.email you@yourdomain.example.com# 查看
git --version
git status # 初始仓库
git init# 添加至暂存区
git add ./file (将需要提交的提交到暂存区)# 提交本地仓库
git commit - m 'feat: 注释' (提交到本地)
git commit --amend# 快捷提交
git commit -am 'feat: 注释'# 直接回退
git log --oneline
git checkout filename# 从暂存区回退
git reset HEAD filename
git checkout -- filename# 从本地仓回退
git log --oneline
git reset --hard XXX# 从本地仓重置回退
git reflog
git reset --hard XXX# 查看分支
git branch 查看本地所有分支
git branch -a 查看所有的分支
git branch -r 查看远程所有分支# 创建分支
git branch 分支名称# 切换分支
git checkout 分支名称# 创建并切换
git checkout -b 分支名称# 合并分支
git merge 目标分支 -m "描述"
git rebase 目标分支# 将本地的Test分支推送到远端的master分支
git push origin Test:master# 删除分支
git branch -d 分支
# 删除远程分支
git push origin --delete 分支 # 查看tag
git tag# 查看详情
git show tag名称# 创建tag
git tag -a "v1.0" -m "描述"
git tag -a "v1.0" 标识码 -m "描述"# 删除tag
git tag -d 标签名# 查看远程仓库
git remote [-v]# 删除关联
git remote remove origin# 推送tag
git push origin --tags
git push tag名称# 删除远程tag
git push origin --delete tag名称# 获取远程tag
git fetch origin tag V1.2# 拉取远程代码
git pull <远程主机名> <远程分支名>:<本地分支名># 一、开发分支(develop)上的代码达到上线的标准后,要合并到 master 分支
git checkout develop
git pull
git checkout master
git merge develop
git push -u origin master# 二、当master代码改动了,需要更新开发分支(develop)上的代码
git checkout master
git pull
git checkout develop
git merge master
git push -u origin develop
删除容器
注意: 还有删除数gogs据库
1. 停止和删除Gogs容器
docker stop gogs
docker rm gogs
2.查看数据卷的详细信息,包括挂载到容器的数据卷的名称:
docker inspect gogs
这将提供Gogs容器的详细信息,包括挂载的数据卷的名称。在JSON输出中,寻找"Mounts"字段,其中包含有关挂载的信息。
3.一旦你找到了相关的数据卷名称,你可以使用以下命令删除它:
#查看所有数据卷
docker volume lsdocker volume rm <volume_name>
请将<volume_name>
替换为实际的数据卷名称,这样就可以删除与之关联的数据卷。
实际操作
[root@192 ~]# docker inspect gogs
[{"Id": "aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78","Created": "2023-09-08T10:35:12.579405355Z","Path": "/app/gogs/docker/start.sh","Args": ["/bin/s6-svscan","/app/gogs/docker/s6/"],"State": {"Status": "running","Running": true,"Paused": false,"Restarting": false,"OOMKilled": false,"Dead": false,"Pid": 25338,"ExitCode": 0,"Error": "","StartedAt": "2023-09-08T10:35:12.847045044Z","FinishedAt": "0001-01-01T00:00:00Z","Health": {"Status": "healthy","FailingStreak": 0,"Log": [{"Start": "2023-09-08T18:40:43.607286021+08:00","End": "2023-09-08T18:40:43.684070251+08:00","ExitCode": 0,"Output": ""},{"Start": "2023-09-08T18:41:13.687167438+08:00","End": "2023-09-08T18:41:13.76545214+08:00","ExitCode": 0,"Output": ""},{"Start": "2023-09-08T18:41:43.769161045+08:00","End": "2023-09-08T18:41:43.851412268+08:00","ExitCode": 0,"Output": ""},{"Start": "2023-09-08T18:42:13.859782099+08:00","End": "2023-09-08T18:42:13.943519873+08:00","ExitCode": 0,"Output": ""},{"Start": "2023-09-08T18:42:43.951301454+08:00","End": "2023-09-08T18:42:44.023457417+08:00","ExitCode": 0,"Output": ""}]}},"Image": "sha256:4fa5cedc038517695cf354561e6eceec91d1803bc8b8d84744c796f2e47993b4","ResolvConfPath": "/var/lib/docker/containers/aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78/resolv.conf","HostnamePath": "/var/lib/docker/containers/aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78/hostname","HostsPath": "/var/lib/docker/containers/aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78/hosts","LogPath": "/var/lib/docker/containers/aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78/aa5966fa1e07c9830a93d146f4eebc0510db4f3d484f1aa74c57fd045a3efd78-json.log","Name": "/gogs","RestartCount": 0,"Driver": "overlay2","Platform": "linux","MountLabel": "","ProcessLabel": "","AppArmorProfile": "","ExecIDs": null,"HostConfig": {"Binds": ["/opt/module/gogs/data:/data"],"ContainerIDFile": "","LogConfig": {"Type": "json-file","Config": {}},"NetworkMode": "default","PortBindings": {"22/tcp": [{"HostIp": "","HostPort": "10022"}],"3000/tcp": [{"HostIp": "","HostPort": "13000"}]},"RestartPolicy": {"Name": "always","MaximumRetryCount": 0},"AutoRemove": false,"VolumeDriver": "","VolumesFrom": null,"ConsoleSize": [41,207],"CapAdd": null,"CapDrop": null,"CgroupnsMode": "host","Dns": [],"DnsOptions": [],"DnsSearch": [],"ExtraHosts": null,"GroupAdd": null,"IpcMode": "private","Cgroup": "","Links": null,"OomScoreAdj": 0,"PidMode": "","Privileged": false,"PublishAllPorts": false,"ReadonlyRootfs": false,"SecurityOpt": null,"UTSMode": "","UsernsMode": "","ShmSize": 67108864,"Runtime": "runc","Isolation": "","CpuShares": 0,"Memory": 0,"NanoCpus": 0,"CgroupParent": "","BlkioWeight": 0,"BlkioWeightDevice": [],"BlkioDeviceReadBps": [],"BlkioDeviceWriteBps": [],"BlkioDeviceReadIOps": [],"BlkioDeviceWriteIOps": [],"CpuPeriod": 0,"CpuQuota": 0,"CpuRealtimePeriod": 0,"CpuRealtimeRuntime": 0,"CpusetCpus": "","CpusetMems": "","Devices": [],"DeviceCgroupRules": null,"DeviceRequests": null,"MemoryReservation": 0,"MemorySwap": 0,"MemorySwappiness": null,"OomKillDisable": false,"PidsLimit": null,"Ulimits": null,"CpuCount": 0,"CpuPercent": 0,"IOMaximumIOps": 0,"IOMaximumBandwidth": 0,"MaskedPaths": ["/proc/asound","/proc/acpi","/proc/kcore","/proc/keys","/proc/latency_stats","/proc/timer_list","/proc/timer_stats","/proc/sched_debug","/proc/scsi","/sys/firmware"],"ReadonlyPaths": ["/proc/bus","/proc/fs","/proc/irq","/proc/sys","/proc/sysrq-trigger"]},"GraphDriver": {"Data": {"LowerDir": "/var/lib/docker/overlay2/92c6c2732f4f260fe37eb1965fc8c0b8b6c012c2b6d643011f8e295161106e14-init/diff:/var/lib/docker/overlay2/e8e4330e6a3c559eb093d7ee19dd92099ed5991c02623e70b288df5682bb99ac/diff:/var/lib/docker/overlay2/fb16d9b7d34cde7249809fec0867f74a96602cbc5e1e41df6e2229c318f1297b/diff:/var/lib/docker/overlay2/e52f016f52d3310c2b79b3cd41283f2fcb87778266b7657175ea11b97138bcf7/diff:/var/lib/docker/overlay2/3f28c4f1444f9c71a36d18744e709da916a7d3aae75fb501d61f3fbf5d504cbd/diff:/var/lib/docker/overlay2/ed08f7907ca663d1c06ccd8f595f7d9e0f0d9e320f4679dc47caf042df8dcc54/diff:/var/lib/docker/overlay2/732dc76ce54ea2e95f6c47811827e647e9739f587f0a6f8cb19c4ae89a6ddc64/diff:/var/lib/docker/overlay2/1f980dc96ce58159f4254a109d3ecf1d55261e37d533dfcbe75bc2c642850fdd/diff","MergedDir": "/var/lib/docker/overlay2/92c6c2732f4f260fe37eb1965fc8c0b8b6c012c2b6d643011f8e295161106e14/merged","UpperDir": "/var/lib/docker/overlay2/92c6c2732f4f260fe37eb1965fc8c0b8b6c012c2b6d643011f8e295161106e14/diff","WorkDir": "/var/lib/docker/overlay2/92c6c2732f4f260fe37eb1965fc8c0b8b6c012c2b6d643011f8e295161106e14/work"},"Name": "overlay2"},"Mounts": [{"Type": "bind","Source": "/opt/module/gogs/data","Destination": "/data","Mode": "","RW": true,"Propagation": "rprivate"},{"Type": "volume","Name": "4c4048a2ae7c1daed9004d6551878050cc8bfa318fcdc08d95ea73021aa17fcb","Source": "/var/lib/docker/volumes/4c4048a2ae7c1daed9004d6551878050cc8bfa318fcdc08d95ea73021aa17fcb/_data","Destination": "/backup","Driver": "local","Mode": "","RW": true,"Propagation": ""}],"Config": {"Hostname": "aa5966fa1e07","Domainname": "","User": "","AttachStdin": false,"AttachStdout": false,"AttachStderr": false,"ExposedPorts": {"22/tcp": {},"3000/tcp": {}},"Tty": false,"OpenStdin": false,"StdinOnce": false,"Env": ["TZ=Asia/Shanghai","PATH=/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin","GOGS_CUSTOM=/data/gogs"],"Cmd": ["/bin/s6-svscan","/app/gogs/docker/s6/"],"Healthcheck": {"Test": ["CMD-SHELL","(curl -o /dev/null -sS http://localhost:3000/healthcheck) || exit 1"]},"Image": "gogs/gogs:0.13","Volumes": {"/backup": {},"/data": {}},"WorkingDir": "/app/gogs","Entrypoint": ["/app/gogs/docker/start.sh"],"OnBuild": null,"Labels": {}},"NetworkSettings": {"Bridge": "","SandboxID": "09962969d9df5d6ecc24bc036b7b0841236be252a03f478377b9d74043044e4f","HairpinMode": false,"LinkLocalIPv6Address": "","LinkLocalIPv6PrefixLen": 0,"Ports": {"22/tcp": [{"HostIp": "0.0.0.0","HostPort": "10022"},{"HostIp": "::","HostPort": "10022"}],"3000/tcp": [{"HostIp": "0.0.0.0","HostPort": "13000"},{"HostIp": "::","HostPort": "13000"}]},"SandboxKey": "/var/run/docker/netns/09962969d9df","SecondaryIPAddresses": null,"SecondaryIPv6Addresses": null,"EndpointID": "e92cbb6dfd8e64c2dc986bdeb3b4b10871f1117eedfb2d961c819cffc95571e9","Gateway": "172.17.0.1","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"IPAddress": "172.17.0.5","IPPrefixLen": 16,"IPv6Gateway": "","MacAddress": "02:42:ac:11:00:05","Networks": {"bridge": {"IPAMConfig": null,"Links": null,"Aliases": null,"NetworkID": "ddd0a110308f6f26f3a3b4e63faeefc70c565fc776148030a4498acaf49d8937","EndpointID": "e92cbb6dfd8e64c2dc986bdeb3b4b10871f1117eedfb2d961c819cffc95571e9","Gateway": "172.17.0.1","IPAddress": "172.17.0.5","IPPrefixLen": 16,"IPv6Gateway": "","GlobalIPv6Address": "","GlobalIPv6PrefixLen": 0,"MacAddress": "02:42:ac:11:00:05","DriverOpts": null}}}}
]
根据Docker容器的详细信息,你的Gogs容器在挂载了两个卷(volumes):
-
/opt/module/gogs/data
目录挂载到容器的/data
目录,这个卷用于持久化存储Gogs的数据。 -
还有一个匿名卷,它被挂载到容器的
/backup
目录。这个卷通常由Gogs用于备份目的,可能包含一些历史数据。
要删除与Gogs相关的历史数据,你可以执行以下步骤:
-
停止和删除Gogs容器(如果尚未完成):
docker stop gogs docker rm gogs
-
删除Gogs数据卷:
对于
/opt/module/gogs/data
目录的数据卷,你可以使用以下命令删除它:docker volume rm gogs_data
如果你想删除备份目录的匿名卷,可以使用以下命令:
docker volume rm 4c4048a2ae7c1daed9004d6551878050cc8bfa318fcdc08d95ea73021aa17fcb
请谨慎操作,确保你不再需要这些数据。
-
然后,重新创建Gogs容器(使用之前的命令):
docker run -d \-p 10022:22 \-p 10300:3000 \--name=gogs \gogs/gogs:0.13
通过执行以上步骤,你将删除与Gogs相关的历史数据,并重新启动一个新的Gogs容器,以确保不再使用旧的数据。
相关文章:

Docker 搭建 Gogs
Docker 搭建 Gogs 准备工作 先准备配置目录和持久化目录,举个栗子:mkdir -p /opt/module/gogs/{data,backup} 拉取官方Gogs镜像 # 拉取 gogs:0.13 docker pull gogs/gogs:0.13 # 拉取最新版 gogs 镜像 docker pull gogs/gogs启动一个临时容器【通过创…...

PostgreSQL的备份方式
PostgreSQL 提供多种方式进行备份,适用于不同需求的场景。常用的备份方法如下: 1. 逻辑备份(pg_dump 和 pg_dumpall) 1.1 使用 pg_dump 备份单个数据库 pg_dump 是 PostgreSQL 内置的逻辑备份工具,可以将数据库导出为…...

Springboot 3项目整合Knife4j接口文档(接口分组详细教程)
文章目录 前言一、Spring Boot 3.0整合Knife4j二、OpenApi 3注解的使用规范三、使用步骤 1.Spring Boot 3.0项目中使用knife4j2.在application.yml中添加knife4j相关配置3.设置WebMvc相关配置(解决封装统一异常处理后doc.html无法打开的问题)4.创建Knif…...

深入解析 Conda 安装的默认依赖包及其作用:conda create安装了哪些包(中英双语)
深入解析 Conda 安装的默认依赖包及其作用 当我们使用 Conda 创建新环境时,例如执行命令: conda create -n olmes python3.10Conda 会自动为我们安装一系列基础依赖包,保证 Python 环境能够正常运行。这些包不仅是我们开发的基础工具&#…...

Redis核心技术知识点全集
Redis数据结构和常用命令 1. String字符串2. Hash哈希3. List列表4. Set集合5. Sorted Set有序集合6. Redis常用命令参考Redis事务机制...

【Unity3D】ECS入门学习(九)SystemBase
SystemBase:支持主线程或多线程执行筛选实体任务。 主要介绍是内部成员:Entities的各种筛选方法,其内部成员还有EntityManager ForEach方法筛选,传递一个有参委托函数进去,参数ref xxx组件类(可填多个&…...

【Triton-ONNX】如何使用 ONNX 模型服务与 Triton 通信执行推理任务上-Triton快速开始
模型部署系列文章 前置-docker 理解:【 0 基础 Docker 极速入门】镜像、容器、常用命令总结前置-http/gRPC 的理解: 【HTTP和gRPC的区别】协议类型/传输效率 /性能等对比【保姆级教程附代码】Pytorch (.pth) 到 TensorRT (.plan) 模型转化全流程【保姆级教程附代码(二)】Pytor…...

CertiK《Hack3d:2024年度安全报告》(附报告全文链接)
CertiK《Hack3d:2024年度安全报告》现已发布,本次报告深入分析了2024年Web3.0领域的安全状况。2024年损失总额超过23亿美元,同比增幅高达31.61%;其中,12月的损失金额最少。过去一年,网络钓鱼攻击和私钥泄露…...

TIOBE 指数 12 月排行榜公布,VB.Net排行第九
IT之家 12 月 10 日消息,TIOBE 编程社区指数是一个衡量编程语言受欢迎程度的指标,评判的依据来自世界范围内的工程师、课程、供应商及搜索引擎,今天 TIOBE 官网公布了 2024 年 12 月的编程语言排行榜,IT之家整理如下: …...

【网络协议】开放式最短路径优先协议OSPF详解(一)
OSPF 是为取代 RIP 而开发的一种无类别的链路状态路由协议,它通过使用区域划分以实现更好的可扩展性。 文章目录 链路状态路由协议OSPF 的工作原理OSPF 数据包类型Dijkstra算法、管理距离与度量值OSPF的管理距离OSPF的度量值 链路状态路由协议的优势拓扑结构路由器O…...

嵌入式Linux驱动开发的基本知识(驱动程序的本质、常见的设备类型、设备号的本质理解、设备实例的注册过程)
基本概念之什么是驱动程序()? 驱动程序本质上是代码逻辑的集合,通常用于管理、驱动多个设备实例。某个设备要想使用驱动程序,需要实例化相应的驱动程序的结构体,并在系统中注册,获得主设备号、次设备号,并…...

爱死机第四季(秘密关卡)4KHDR国语字幕
通过网盘分享的文件:love_death_robot 链接: https://pan.baidu.com/s/1bG3Xtdopenil2O_y93hY_g?pwd8kib 提取码: 8kib...

kubelet状态错误报错
journalctl -xeu kubelet 执行后的日志如下: -- -- The process exit code is exited and its exit status is 1. Jan 02 14:20:06 iv-ydipyqxfr4wuxjsij0bd systemd[1]: kubelet.service: Failed with result exit-code. -- Subject: Unit failed -- Defined-By: system…...

<div>{{ $t(“collectionPlan“) }}</div> 中的$t是什么
$t是Vue I18n插件提供的一种方法,用于根据当前应用的语言环境来获取相应的翻译文本。 以下是一个简单的示例,展示如何在Vue I18n中定义消息: const i18n new VueI18n({locale: en, // 设置默认语言messages: {en: {collectionPlan: Collec…...

[C++刷题] 求回文素数
求回文素数 题目 素数回文数的个数 题目描述 求 11 11 11 到 n n n 之间(包括 n n n),既是素数又是回文数的整数有多少个。 输入格式 一个大于 11 11 11 小于 10000 10000 10000 的整数 n n n。 输出格式 11 11 11 到 n n n 之…...

SQLALchemy如何将SQL语句编译为特定数据库方言
最近在一个使用fastapitortoise-orm的项目中,需要将orm的语句编译成特定数据库方言,但是查询了官方文档及一些资料却找不到合适的方法论😔,于是乎我就把目光放到了sqlalchemy身上,东找西找给我找着了。话不多说&#x…...

[卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析
目录 [卫星遥感] 解密卫星目标跟踪:挑战与突破的深度剖析 1. 卫星目标跟踪的核心挑战 1.1 目标的高速与不确定性 1.2 卫星传感器的局限性 1.3 数据处理与融合问题 1.4 大尺度与实时性要求 2. 当前卫星目标跟踪的主流技术 2.1 卡尔曼滤波(Kalman …...

I2C(一):存储器模式:stm32作为主机对AT24C02写读数据
存储器模式:在HAL库中,I2C有专门对存储器外设设置的库函数 I2C(一):存储器模式的使用 1、I2C轮询式写读AT24C02一页数据2、I2C轮询式写读AT24C02多页数据3、I2C中断式写读AT24C02一页数据4、I2C使用DMA式写读AT24C02一…...

scrapy 教程
Scrapy Tutorial In this tutorial, we’ll assume that Scrapy is already installed on your system. If that’s not the case, see Installation guide. We are going to scrape quotes.toscrape.com, a website that lists quotes from famous authors. This tutorial …...

2025元旦源码免费送
我们常常在当下感到时间慢,觉得未来遥远,但一旦回头看,时间已经悄然流逝。对于未来,尽管如此,也应该保持一种从容的态度,相信未来仍有许多可能性等待着我们。 免费获取源码。 更多内容敬请期待。如有需要可…...

高级架构五 设计模式
一 设计模式七大原则 1.1. 设计模式目的 编写软件过程中,程序员面临着来自 耦合性,内聚性以及可维护性,可扩展性,重用性,灵活性 等多方面的挑战,设计模式是为了让程序(软件),具有更好的&#…...

RFID手持机与RFID工业平板在仓储物流管理系统中的选型
概述 随着物联网技术在仓储物流管理系统中的普及,RFID手持机与RFID工业平板作为基于RFID技术手持式读写器的两种重要终端设备形态,得到了广泛应用。尽管RFID手持机与RFID工业平板都具备读写 RFID标签的基本功能,使用场景较为类似,…...

IoC设计模式详解:控制反转的核心思想
前言:在软件开发中,设计模式是一种经过验证的、在特定场景下能有效解决问题的解决方案。控制反转(Inversion of Control,IoC) 作为一种设计模式,通过让程序的控制流和对象管理反转,从而使得代码…...

《云原生安全攻防》-- K8s安全配置:CIS安全基准与kube-bench工具
在本节课程中,我们来了解一下K8s集群的安全配置,通过对CIS安全基准和kube-bench工具的介绍,可以快速发现K8s集群中不符合最佳实践的配置项,及时进行修复,从而来提高集群的安全性。 在这个课程中,我们将学习…...

LINUX下载编译gtk
下载 选择自己合适的版本 GNOME / gtk GitLab 下载meson GNOME / gtk GitLab 编译 BUILD_DIRbuilddir INSTALL_DIR${HOME}/gtk-resultMESON_PATHpwd/meson-1.6.1/meson.py${MESON_PATH} setup \--prefix ${INSTALL_DIR} \${BUILD_DIR}cd builddir${MESON_PATH} compile…...

基于VSCode软件框架的RISC-V IDE MRS2正式上线发布
基于VSCode软件框架的RISC-V IDE MRS2正式上线发布 一、概述 MounRiver Studio Ⅱ(MRS2)为MounRiver Studio的换代版本,从V2.1开始,框架更换至更现代的VSCode,并深度定制开发。在工程管理、代码编辑、编译、调试等方面均兼容之前版本&#…...

AWS re:Invent 2024 - Dr. Werner Vogels 主题演讲
今年,我有幸亲临现场参加了所有的 keynote,每一场都让我感受到深深的震撼。无论是全新的功能发布,还是令人眼前一亮的新特性展示,每一场 keynote 都精彩纷呈,充满干货,值得反复学习和回味。 恰好ÿ…...

前端小案例——520表白信封
前言:我们在学习完了HTML和CSS之后,就会想着使用这两个东西去做一些小案例,不过又没有什么好的案例让我们去练手,本篇文章就提供里一个案例——520表白信封 ✨✨✨这里是秋刀鱼不做梦的BLOG ✨✨✨想要了解更多内容可以访问我的主…...

FPGA随记——过约束
什么是过约束? 从字面意思来看,所谓过约束是指约束过紧了。这个“过”体现在setup requirement变小了,对于单周期路径,这个值通常与时钟周期一致,但在过约束情况下,等效于这个值变小了,也就是时…...

如何利用云计算进行灾难恢复?
云计算环境下的灾难恢复实践指南 天有不测风云,企业的IT系统也一样,我见过太多因为没有做好灾备而吃大亏的案例。今天就和大家聊聊如何用云计算来做灾难恢复。 一个惊心动魄的真实案例:某电商平台的主数据中心因为市政施工不小心挖断了光纤…...