使用 Harbor 管理个人容器镜像
坑边闲话:容器是现代开发、运维都要学习的技术,开发人员要让应用的逻辑尽可能地做到可水平扩展、可监控状态,运维人员要尽可能地将服务以云原生的方式部署并实现高可用。在这个过程中,镜像管理非常重要,这涉及到软件的供应链安全,也关系到整个 DevOps 的流程顺滑性。
1. Harbor 简介·
在使用容器的时候,我们实际需要的是进程。进程是一个动态的概念,它需要某些二进制代码、可执行文件。后这就是我们说的 Application. 在传统环境中,我们需要到软件官网将程序下载下来,然后装入内存,得到一个动态的进程。使用容器部署任务与此类似,毕竟容器只是加了更强的隔离属性的进程。容器所需要的代码软件就是镜像。
这么说也不完全,毕竟容器在生成的时候可以指定目录映射,将本地的可执行程序映射到容器空间。但是传统的以容器为软件持久化存储的环境中,软件只来自于镜像,不来自于本地的文件映射。
因此,镜像与软件有相似的属性,也面临相似的问题。比如,容器也面临网络传播的体积限制,我们总是希望打包出来体积越小越好。此外,软件的供应链安全也是一个敏感话题,如何对镜像进行签名也是一个绕不开的问题。
如何才能像 ...
curl 教程
坑边闲话:wget 和 curl 在命令行下载文件时很常见。然而,curl 的诸多参数很复杂。
curl 发展自 1998 年,算是一个相对年轻的工具。它本身就是一个迷你的浏览器,可以请求 HTTP 内容,因此下载文件也不在话下。
此外,curl 还是一个开发库,它提供了若干个在 HTTP 开发时需要用到的组件。
-L 重定向·
如果页面发生重定向,则 curl 也会继续请求重定向后的内容。
重定向是个危险的操作,因此如果包含发送 secret, curl 不会将 secret 发送给重定向后的服务器。
可通过 --max-redirs 设置重定型的深度。
-o·
--output,将网络返回的数据写入文件,而非写入到 stdout.
由于 curl 支持解析自定义脚本,因此用 -o 参数时可以编程。
-O·
--remote-name
-O 经常用来做临时下载,它会将远程资源的文件名解析出来,并以此创建本地文件。
--output-dir·
当 -O 或 -o 指定时,该参数才生效。
1curl --output-dir "/tmp" -O https://e ...
英语词汇学习 s2
坑边闲话:作为一个中国人,而且是语言能力偏弱的人,我学习英语的时间可能比各位读者都要久,但是我的英语水平并不是很高。至少在我 27 岁将近(还有十几天)的时候,我感觉自己与英语母语者交流还是有一定的障碍。**自高中毕业,系统学习英语的时间变少了,我感到很惭愧。**但是我大学到研究生,写了很多有益的博客,提升自我同时分享了知识。为什么不能把自己英语学习的笔记、思考写成博客呢?
甚至,还可以借助 ChatGPT 啊!这一切是多简单。
Disposition·
很容易记忆:
dis, 表示否定
position,位置(超级熟悉)
然而,disposition 并不表示未知错误。属于让人望文生义的词汇。
名词:性格,倾向。
A man of a good disposition. 一个性情良好的男人。
记忆:在一个错误环境中才能表现出真实的品性、性格、倾向。
法律:对财产的处置权
Napoleon had railway at his disposition. 拿破仑有铁路可以利用。
HTTP 请求头,用于指示资源如何被展现,特别是在下载文件时需要指定。Content-D ...
英语词汇学习 s1
坑边闲话:作为一个中国人,而且是语言能力偏弱的人,我学习英语的时间可能比各位读者都要久,但是我的英语水平并不是很高。至少在我 27 岁将近(还有十几天)的时候,我感觉自己与英语母语者交流还是有一定的障碍。**自高中毕业,系统学习英语的时间变少了,我感到很惭愧。**但是我大学到研究生,写了很多有益的博客,提升自我同时分享了知识。为什么不能把自己英语学习的笔记、思考写成博客呢?
甚至,还可以借助 ChatGPT 啊!这一切是多简单。
1. 词汇 20K·
以下是曾经读过的论文里不认识的单词。我尽量做点笔记,把这些词记住。
aesthetically·
要记住这个词很简单:
aes,学密码的太熟悉不过,AES 高级加密算法
the,定冠词
tically,你肯定记得住
aesthetic 是形容词,审美的,美学的,艺术的。
发音 /iːsˈθetɪk/
adhere·
[v] 遵守
如何记忆:只能在这里(here)贴广告(ad),这个规矩你要(遵守)
常见搭配
adhere to,遵守某规则制度
It is important to adhere to r ...
Unix 命令行环境配置
坑边闲话:我曾经看到无数人对 Linux 图形化桌面十分地依赖,哪怕是跑编辑器应用都愿意在 Ubuntu 桌面里,而不愿意使用 VSCode Remote Dev. 我甚至这一切只是形式,但是我更愿意相信,优雅简单、贴近底层的方法才是美妙的。
Linux 和 macOS 本质上都是 Unix,只不过前者是净室实现,后者是一脉相承。至于 Solaris 等小型机系统我没有使用过,FreeBSD 等系统因为驱动匮乏也没有进入我的参考列表。所以,本文以
macOS
Debian 12
为例,简单介绍如何使用 Terminal 搭建良好的开发环境。
1. 个人电脑的选择·
1.1 硬件选择·
在 2023 年十月这个档口,我个人认为,个人计算机相较 2015 年(也就是我读大一的时候)已经有了长足的进步。当年只有权贵才能拥有的 8 核心 i7 5960X 处理器,其性能竟然能被 miniPC 轻松吊打。
最佳实践
经过测试,零刻 GTR7 32GB 内存加 1TB 固态硬盘版本,可以轻松完成我以下任务:
使用 Acrobat DC Pro 阅读 20 页以内的 PDF 格式的论文; ...
qBitTorrent 服务部署实战
坑边闲话:下载文件是现代人必备的技能之一,虽然现在流媒体服务越来越流行,但是在内容审查越来越严格的当下,掌握 P2P 下载技能十分必要。
1. P2P 下载服务·
自从互联网诞生之初就有了文件传输需求,后来随着 MP3 等音频文件的出现,快速共享音乐文件成为了彼时互联网的刚需。当年传输几百 KB 的音频对于低速互联网是个挑战,今天的互联网虽已有了长足的进步,千兆下行带宽已经普及,但是下载动辄数十乃至上百 GB 的 VR、4K 内容依旧对中心服务器的带宽产生了巨大的挑战。虽说此一时非彼一时,但道高一尺魔高一丈。科技进步催生了新的需求,新的需求又带来只有新科技才能解决的问题。
P2P 下载,本质就是为了文件共享而生。它依赖中心服务器做控制平面,但是不依赖中心服务器做内容获取,反而是从其他节点获取文件。因此,所谓的 PT/BT 文件下载,并非是严格意义上的 P2P 网络,但是它解放了中心化的内容分发服务器。
当我们的电脑启动 P2P 服务之后,我们可以通过 Torrent 种子里嵌入的 Tracker 服务器信息,往服务器注册自己的的意向,同时,服务器也会反馈给我们当前种子里列出的文件在 ...
Vim 基础教程与配置初步
坑边闲话:我使用 Vim 的 logo 作为头像已经接近十年了,这表达了我对 Vim 编辑器的热爱,同时也表达了我对设计优秀的工具的敬佩。但是我一直不敢做与 Vim 相关的教程,因为 Vim 的配置太繁琐了,而且我对有些功能也只是一知半解,并不能称为 Vim 专家。正逢我把所有配置迁移到 Lua,就借此机会详细说明我的 Vim 配置,以及我对 Vim 的个人理解。
后续会出一些更加详细的配置教程,但本文专注于 Vim 的基础概念与操作。
1. NeoVim 还是 Vim·
这个问题很关键。我的答案是 NeoVim. 尽管现在 Vim 9.0 已经发布,有些棘手的问题也解决了七七八八,但是我已经用 NeoVim 很多年了,再换回去比较可惜。
我对新手的建议也是 NeoVim. 主要原因是网络上参考资料比较多,解决问题的成本较低。
无需担心软件是否是“名门正派”的问题,NeoVim 本身就是 Vim 的一个分支 (fork),所以他们是同根的软件,NeoVim 就是根正苗红的 Vim.
无需担心没有大版本发布的问题,目前 NeoVim 早就很成熟了,版本一直维持在 0.x 只是一个习 ...
GitHub Copilot Chat 教程
Copilot 是 GitHub 通过其托管的无数开源项目训练所得到的代码提示工具,它的能力非常强大。如今有了大预言模型的加持,Copilot 更胜以往。最近,微软推出了 Copilot Chat 聊天机器人,与 VSCode 深度绑定,能提供很棒的用户体验。
1. 如何获取 Copilot Chat·
首先声明,GitHub Copilot 插件是需要付费的,但是我们可以通过注册学生大礼包的方式获得免费试用的权限。
GitHub Student Developer Pack
通过上面的链接,使用 EDU 结尾的邮箱注册成功,可以获得一个认证机会。随后,使用浏览器的 webRTC 摄像头功能,把自己的学生证拍照上传 (切记,不是上传图片!),半天就可以通过审核。随后你的 GitHub 账号将变成 Pro 版本。
使用经过认证的账号登录 VSCode GitHub Copilot 插件,即可使用全部功能。
接下来就是 Copilot Chat 功能。该插件依赖 GitHub Copilot,所以先要完成上述的步骤。随后,安装完 Chat 插件,即可直接通过对话的方式使用。
2. 使 ...
Debian 12 DNS 配置实战
坑边闲话:Debian 12 是一个完善的高级系统,在 DNS 方面,它同时支持 NetworkManager 和 systemd,而此二者在网络管理方面具有重叠的功能,同时启用会产生冲突。
1. 本机 DNS 配置·
一般来说,Debian 12 系统遵循大多数 Linux 采用的 DNS 配置方法,即 DNS 服务器地址、搜索域都被写在 /etc/resolv.conf 文件里。一个常见的配置文件如下所示:
12nameserver 127.0.0.53search littlenewton.cn
接下来讲解这几个网段的意思:
nameserver 指的是 DNS 服务器的地址,比如
Google 8.8.8.8
DNSPod 119.29.29.29
Cloudflare 1.1.1.1
本机的某个服务,如 dnsmasq、AdGuard Home、systemd-resolved 等。这些软件会在本地起一个服务端口,允许其他进程通过 TCP/IP 方式发起 DNS 请求,因此填写的一般是 127.0.0.0/8 地址。
此外,多个 nameserver 可以同时填写,彼 ...
OpenWrt 的缺陷
坑边闲话:笔者使用 OpenWrt 自 2016 年双十二开始,至今已有七年了。OpenWrt 提供了便捷的网络配置手段,但是也存在一些不便的地方。
本文尽力从 OpenWrt 的缺陷开始入手,讨论改进或者环节的方案,希望能对刚开始学习 OpenWrt 的用户和已经具有一定使用经验的用户有所帮助。
1. 缺乏 systemd 系统管理方案·
尽管很多人诟病 systemd,但是毫无疑问它使得系统的配置、管理变得更加简单且现代化,Debian 等系统默认启用 systemd 就是最好的证明。
注意,大家诟病它,并不是因为它管得太多,而是它最开始的代码不太完善,经常做 API 的大改动。如今 systemd 已经非常稳定。
OpenWrt 作为嵌入式系统,并没有提供 systemd 作为 init 进程,许多任务的启动、管理也是依赖 /etc/init.d/xxx.conf 配置文件进行管理。因此,许多没有写清楚标准错误、标准输出的任务,就没办法轻松地判断失败的原因,给 debug 造成了很大的麻烦。
2. 无线驱动匮乏·
因为无线芯片的驱动涉及到巨量的知识产权问题,故以高通为代表 ...
Debian 12 系统初始化
坑边闲话:Linux 的系统初始化教程对新手非常有帮助,本文提供一个合适的流程化操作,方便用户使用相关服务。本文遵循最小化安装原则,帮助用户逐步构建自己的 Linux 系统。所谓最小化安装,指的是不添加过多的 package,只包含最基本的系统组件。当然,也不包括图形化界面。
前期必看步骤:使用 ZFSBootMenu 安装 Linux
重装前先备份
若用户是重装系统,请务必记得备份重要数据,比如
zsh 历史记录 ~/.config/zsh/.zhistory
systemd 的自定义条目,如
多容器组合启动服务 harbor.service, minio.service
ZFS 定期快照任务 zfs_snapshot.service
/etc/fstab 的特殊挂载条目
家目录中的工程项目
某些特殊的、只存储在本地的容器镜像孤本
1. 配置常规用户·
遵照 使用 ZFSBootMenu 安装 Linux 指导安装的用户,可以直接跳到本章最后一节,此前的步骤已经轻松地完成了前面的这些内容。
1.1 创建新用户·
最小化安装之后,系统里仅有 root 用户,因此先要在 ...
Tailscale 全平台部署教程
坑边闲话:WireGuard 作为下一代 VPN 技术,除了面对 ISP UDP QoS 时比较尴尬之外,性能、安全性都是非常有保障的。但是 WireGuard 的配置相对繁琐,需要用户掌握许多密码、网络的知识才能完成。此外,典型 WireGuard 的 Full-Mesh 的结构也让设备的增添、移除变得非常复杂。Tailscale 通过引入管理节点,让配置变得自动化,同时 Tailscale 也支持自定义管理平面。
1. Tailscale 简介·
Tailscale 是一个基于 WireGuard 的网络技术,用于创建安全、简单、私有的虚拟网络,它具有以下优点:
基于 WireGuard: WireGuard 是一个新的、高性能的 VPN 协议,旨在提供安全、简单、快速的网络连接。Tailscale 使用 WireGuard 作为其底层协议,但对其进行了封装,以提供更加用户友好和企业友好的功能。
简单性: 传统的 VPN 和私有网络解决方案通常需要复杂的配置和维护。Tailscale 的目标是简化这个过程,使任何人都可以在几分钟内设置自己的私有网络。
跨平台: Tailsca ...
DNS 服务必知必会
坑边闲话:DNS 是现代互联网的基石,在我看来 DNS 比 TCP/IP 还要重要。没有 TCP/IP 还可以用其他通信协议,但是没了 DNS,互联网就要熄灭了。
1. DNS 简介与 DNS 劫持、污染·
1.1 DNS 常识·
DNS 的全称是 Domain Name System,也就是域名系统。原则上,我们这套互联网基于 TCP/IP,也就是可靠传输加全球路由寻址。然而,因为人类不方便记忆 IP 地址,所以产生了域名系统。比如要访问谷歌,你第一想到的是 google.com 而不是 google 的 IP 地址。毕竟,人类并不能准确记忆大量的数字地址。将 IP 地址与域名通过 DNS 联系起来,是个非常聪明的办法。
将域名对应的 IP 地址找出来的过程,叫做 DNS 查询。从这里你就看出来了,DNS 查询实际上是个应用层协议。我们往 DNS 服务器的 53 端口发送一个 DNS 解析请求,然后 DNS 服务器把域名对应的 IP 地址返回给我们,这样我们就可以愉快地使用 IP 地址进行路由通信了。有过编程经验的同学应该清楚,在写某些记录的时候你可以用域名代替 IP 地址,这时 ...
校园网环境配置 IPv6 网络
坑边闲话:中国高效的校园网 IPv6 分配一般基于 DHCP/SLAAC,且百分之九十九的情况下都不会给 ipv6-pd 前缀,因此在宿舍内网里分配 IPv6 同时兼容 IPv4 NAT 一直是一个老大难的问题。中继模式看似可行,但是 OpenWrt 支持度并不高;NAT66 过于野蛮,也没有太好的用武之地。
本文介绍的方案可将路由器变成一个 IPv6 交换机,同时保持 IPv4 内网功能不变。
1. 警告·
注意,虽然通过 ebtables-legacy 命令在以太网层次实现校园网 IPv6 接入很棒,效果非常稳定。然而,这里面存在安全隐患。这种方式相当于把外网接到内网里,因为该方案利用了 IPv6、IPv4 双栈分离的特性,因此,OpenWrt 的防火墙对 IPv6 的入侵流量没有任何防护能力,所有的基于转发的过滤规则都不起作用。
这必然给骇客攻击留下了后门,毕竟 LAN Zone 是我们的后花园,允许另一个属性的流量自由出入,肯定不是好事情。虽然现在还不清楚有什么隐患,但是应该提醒读者,这并不是最佳实践。
最后,如果你确实对校园网 IPv6 分配有需求,而且需要用到软路由, ...
Debian 12 部署 K8S 集群
坑边闲话:Kubernetes 已经是容器编排领域的事实标准,它将容器运行时和网络模块解放出来,只作为一个编排工具存在。在云原生场景和高可用需求下,容器能跑起来不重要,能编排才重要。
本文将详细介绍:
K8S v1.28 的安装与配置
K8S Calico 网络配置及其原理
K8S 接入 Portainer 管理 UI
1. 安装 Kubernetes·
这里以 Debian 12 为例。
本节内容同时适用于 Master 节点和 Worker 节点。
1.1 添加 Google Kubernetes 上游库并安装 kubeadm·
123456789101112# 安装必要的 apt 包sudo apt-get updatesudo apt-get install -y apt-transport-https ca-certificates curl# 下载 Google Cloud 公开签名秘钥curl -fsSL https://packages.cloud.google.com/apt/doc/apt-key.gpg | sudo gpg --dearmor -o /e ...
Debian 12 配置 Mellanox OFED 网卡驱动
坑边闲话:Mellanox/NVIDIA 以其高带宽、低延迟称霸数据中心领域,其解决方案更是多机互联、构建超算的首选。
本次驱动部署以 Debian 12 为例。
1. 验证是否识别到了网卡·
1lspci -v | grep Mellanox
2. 下载驱动包·
本次使用的网卡是 ConnectX-4 及以上的系列,不支持更老的网卡。
官方下载地址
12cd ~wget https://content.mellanox.com/ofed/MLNX_OFED-5.8-3.0.7.0/MLNX_OFED_LINUX-5.8-3.0.7.0-debian11.3-x86_64.iso
2.1 挂载 ISO 文件·
123mkdir /mnt/iso mount -o loop ./MLNX_OFED_LINUX-5.8-3.0.7.0-debian11.3-x86_64.iso /mnt/isocd /mnt/iso
2.2 安装驱动(耗时略久)·
1./mlnxofedinstall
2.3 重载驱动·
1/etc/init.d/openibd restart
Debian 12 配置 GPU 深度学习环境
坑边闲话:NVIDIA GPU 因为源码保护,无法直接集成到 GPLv2 开源协议的 Linux 内核里,因此需要采用一些稍微麻烦的方法进行部署。此外,CUDA 套件和 GPU driver 的关系,以及 NVIDIA-Container-runtime 的存在意义也是许多新手搞不明白的地方。
1. 前言·
全文以 amd64 体系结构的 Debian 12 系统为例。首先要牢记以下链接,因为它是上游仓库的地址。
12# NVIDIA 官方上游仓库https://developer.download.nvidia.cn/compute/cuda/repos/debian12/x86_64/
1.1 深入理解 CUDA 和 Driver 的一体性·
与 NVIDIA 软件相关的名词列举如下:
GPU Driver
NVIDIA kernel module
CUDA toolkit
cuDNN
PyTorch
接下来分别介绍其含义及存在意义。
1.1.1 GPU 驱动·
驱动程序控制 CPU 如何调用位于 PCIe 总线上的显卡。不安装驱动将无法使用 GPU 的任何功能。NVIDI ...
反向代理:从 NginxProxyManager 到 Nginx
坑边闲话:反向代理作为应用部署过程中极为关键的一环,在现代互联网应用中发挥了巨大的作用。
1. 反向代理简介·
反向代理是一个非常有用的网络服务工具,它可以作为一个中介站在客户端和服务器之间,接收客户端的请求并将这些请求转发给后端的服务器。当后端服务器返回响应时,反向代理会再次作为中介,将响应传回给客户端。这种设置有多种用途,以下是一些关键点,你可以在博客中使用:
负载均衡:反向代理可以将来自客户端的请求分发到多个服务器,确保每个服务器的负载都保持在一个合理的水平,从而提高整体的服务性能和可靠性。
缓存:反向代理可以缓存后端服务器的响应。当多个客户端请求相同的内容时,反向代理可以直接从缓存中提供响应,而不必每次都从后端服务器获取,从而加快响应速度。
安全和匿名性:反向代理可以隐藏后端服务器的真实 IP 地址和身份,为后端服务器提供一个额外的保护层。此外,它还可以作为一个应用层防火墙,阻止恶意请求。
SSL 终端:反向代理可以处理 SSL/TLS 握手,释放后端服务器的负担,使其专注于处理应用逻辑。
内容压缩:反向代理可以压缩从后端服务器返回的内容,从而减少传输的数据量,加快传输速 ...
解决 WireGuard 网络 Windows SMB 访问问题
坑边闲话:将 WireGuard 部署在 OpenWrt 等内网网关上是个好的思路,但是 Windows 的 SMB 文件和打印机服务一直不允许非本地网段的流量发起访问。本文将介绍相关的解决方案。
1. 问题原因·
Windows 10 等系统因为安全问题,防火墙策略比较严格,因为这种个人系统一般不会对外提供服务。
Windows Server 2022:SMB 服务请求可能被来自互联网,因此 src_ip 是任意的。
Windows 10:本机一般只是个人使用,不用做服务器,因此 SMB 服务只能被来自本局域网的机器访问,src_ip 必须是内网地址,其他地址都会被 DROP.
2. 解决方案·
解决方案有两种:
更改 Windows 10 的防火墙策略
将 WireGuard 来的流量在 OpenWrt 端做动态伪装,即做一次 SRC NAT.
接下来,我从 SMB server 角度和 OpenWrt 网关角度,提出两个可行的方案。
2.1 更改 Windows 10 的防火墙策略·
在搜索里找到高级安全 Windows Defender 防火墙,以管理员身份打开。
...
OpenWrt 22.03.5 源码编译:修改 AdguradHome 至最新版本
坑边闲话:OpenWrt 的稳定版一直比较保守,RC 要 4~5 轮才放出正式版,而正式版中的关键组件更新也很保守。目前 22.03.5 的 AdGuardHome 版本很老旧,除非开机后通过命令行手动升级,否则很难直接搞定。最麻烦的是配置文件 /etc/adguardhome.yaml 不能向下兼容,即老版本软件无法解析新版本的配置文件。此外,软件升级需要连接外网,没有了 AdguradHome 做 DNS 也很成问题。
1. 下载最新版 linux-amd64 二进制·
该文件可以在 GitHub 官方仓库里找到,通过 wget 直接下载:
1wget https://github.com/AdguardTeam/AdGuardHome/releases/download/v0.107.36/AdGuardHome_linux_amd64.tar.gz
在 OpenWrt 编译流程里,package 的 Makefile 依赖的源代码一般是一个 URI 链接,在编译时通过 curl 或者其他工具在线拉取。从某种意义上看,OpenWrt 也是一种符合 gentoo 思想的发行版。 ...
OpenWrt 设置多个 WireGuard 接口
坑边闲话:WireGuard 作为下一代 VPN,基于 UDP 传输。我的理解是最好不要直接使用 WireGuard 做连接,而是把它当作某个大解决方案的内核使用。比如把 containerd 当作 K8S、docker 的核心组件。毕竟,直接使用 WireGuard 门槛非常高,而某些场景需要动态调节 MTU,这在手动配置的情况下几乎是不可实现的。
1. WireGuard 是什么?·
WireGuard (简称 wg) 是一个简单、快速且现代的虚拟专用网络(VPN)技术,提供了高效、安全和轻便的解决方案。相比于其它 VPN 协议,如 OpenVPN 和 IPsec,WireGuard 的代码更少、更易于审计,并且速度更快。
主要特点
简单性:它的代码基础小,使得审计更容易。
高性能:采用最新的加密技术。
现代的加密技术:包括 Curve25519、ChaCha20、Poly1305 等。
跨平台:支持 Linux、Windows、macOS、BSD、iOS、Android 等。
无状态:没有传统的会话概念,每个数据包都是自包含的。
重要的时间节点
2016:WireGua ...
(写作中) Usenix Security 2023 论文阅读
前言:Usenix Security 2023 的 Summer、Fall 季度投稿已经产生了所有的 accepted paper. 其中不乏非常有趣的标题。
1. Fuzz·
Fuzztruction: Using Fault Injection-based Fuzzing to Leverage Implicit Domain Knowledge
作者是 Nils Bars,来自德国鲁尔大学-波鸿 (RUB).
To realize this concept, we propose a set of compile-time and run-time analyses to mutate the generator in a targeted manner,
151 个 unique crashes (Automated deduplication)
27 bugs
4 CVE
12 Generator ---> Consumer(Formated data)
2. Firmware Analysis·
to be done
3. Network·
to ...
Git 高级教程:重点讲解
前言:Git 作为版本控制工具在全球的开发者(游戏除外)中得到了广泛的使用。加深对 Git 的理解,有助于规范化开发流程,降低合作开发的成本,减少合作时误操作的产生。
1. 编辑相关·
1.1 git diff 相关的算法·
在 Git 中,我们会利用内置的算法对文件进行操作,普通 add、commit 涉及的数学算法并不多。但是如果产生了冲突,或更普遍的文件修改,Git 就需要知道文件发生了哪些修改。
文件更新和冲突标记其实是一个原理,区别在于前者是在一个 commit 链上进行,有着严格的前后时序关系,因此 Git 会很自信地将老版本的内容更新为新版。但是如果基于同一个 commit 产生了两个有冲突的分叉,当我们合并这两个分叉的时候就产生了冲突。这时 Git 不再自信,它需要我们人工介入,按照程序员的意愿修改完冲突,随后再合并。因此,文件更新前后的版本对比和冲突时的 diff 标记,使用的算法是一致的。
在此,我们隆重介绍 Meyers 算法。该算法来自于 Eugene W. Myers 的一篇十五页的论文:An O(ND) Difference Algorithm and ...
Debian 12 升级与配置恢复教程
前言:2023 年 6 月 10 日,Debian 正式升级到 12 bookworm 版本。代号:书虫。不得不承认,Debian 是最为重要的 Linux 发行版之一,许多知名的 Linux 发行版也是基于 Debian,如 Ubuntu、TrueNAS SCALE 等。
注意,Debian 12 的升级过程相对比较简单,而且该版本经过了为期一年的测试,稳定程度已经相当可观,因此除非有特殊需求(或者太懒),建议升级。
1. 升级到 Debian 11 最新版·
最近的 debian 11 apt 上游貌似进行了更新,因此可以将 /etc/apt/sources.list 修改为以下最新版:
12345678910111213141516# /etc/apt/sources.list# 默认注释了源码镜像以提高 apt update 速度,如有需要可自行取消注释deb https://mirrors.tuna.tsinghua.edu.cn/debian/ bullseye main contrib non-free# deb-src https://mirrors.tuna.ts ...
VSCode Clangd 插件配置实战
前言:许多程序员青睐 Visual Studio 或者 Jetbrains IDEs,主要是因为这些开发环境有着很良好的代码提示、代码补全、代码检查、语法高亮。这篇文章将揭开“智能提示”,并给出 VSCode 环境下开发 C/C++ 程序的最佳实践。
1. 编译系统·
很多初学者可能只用过单文件编译,比如把所有的函数都写在一个文件里,然后通过 main 作为 entry 进行调用。后面再做复杂项目的时候,就已经用上了 IDE,因此对于 IDE 做了哪些工作以及为什么要做这些工作,程序员缺乏理解。
一般我们认为编译系统由下面四个部分组成:
前处理(PreTask)
编译前需要拉取最新代码,比如 build-root 编译系统中需要拉取 package 对应的最新代码库或指定哈希值的提交版本。
编译链接(Task)
后处理(PostTask)
某个目标编译完成,需要将之移动(move)到某个特定目录以便于执行下一步操作。
改变某个文件的权限标记。
可选的打包与安装
packaging
install
1.1 现有的编译组织总结·
第 0 代,(shell) 直接 ...