2025-01-02 21:19:48 +08:00
<!DOCTYPE html>
< html lang = "en" >
< head >
< title > Dich' blog< / title >
< meta http-equiv = "content-type" content = "text/html; charset=utf-8" >
< meta name = "viewport" content = "width=device-width, initial-scale=1.0, maximum-scale=1" >
< meta name = "robots" content = "noodp" / >
< link rel = "stylesheet" href = "https://blog.dich.bid/style.css" >
< link rel = "stylesheet" href = "https://blog.dich.bid/color/blue.css" >
< link rel = "stylesheet" href = "https://blog.dich.bid/color/background_dark.css" >
< link rel = "stylesheet" href = "https://blog.dich.bid/font-hack-subset.css" >
< meta name = "description" content = "" >
< meta property = "og:description" content = "" >
< meta property = "og:title" content = "Dich'blog" >
< meta property = "og:type" content = "article" >
2025-01-21 19:11:02 +08:00
< meta property = "og:url" content = "https://blog.dich.bid/opensource-what/" >
2025-01-02 21:19:48 +08:00
< meta name = "twitter:card" content = "summary_large_image" >
< meta name = "twitter:description" content = "" >
< meta name = "twitter:title" content = "Dich'blog" >
< meta property = "twitter:domain" content = "blog.dich.bid" >
2025-01-21 19:11:02 +08:00
< meta property = "twitter:url" content = "https://blog.dich.bid/opensource-what/" >
2025-01-02 21:19:48 +08:00
< link rel = "alternate" type = "application/atom+xml" title = "Dich'blog Atom Feed" href = "https://blog.dich.bid/atom.xml" / >
< / head >
< body class = "" >
< div class = "container" >
< header class = "header" >
< div class = "header__inner" >
< div class = "header__logo" >
< a href = "https://blog.dich.bid" style = "text-decoration: none;" >
< div class = "logo" >
Dich' blog
< / div >
< / a >
< / div >
< / div >
< nav class = "menu" >
< ul class = "menu__inner" >
< li class = "active" > < a href = "https://blog.dich.bid" > blog< / a > < / li >
< li > < a href = "https://blog.dich.bid/tags" > tags< / a > < / li >
< li > < a href = "https://blog.dich.bid/archive" > archive< / a > < / li >
< li > < a href = "https://blog.dich.bid/about" > about me< / a > < / li >
< li > < a href = "https://blog.dich.bid/links" > links< / a > < / li >
< li > < a href = "https://blog.dich.bid/search" > search< / a > < / li >
< li > < a href = "https://github.com/Dichgrem" target = "_blank" rel = "noopener noreferrer" > github< / a > < / li >
< / ul >
< / nav >
< / header >
< div class = "content" >
< div class = "post" >
2025-01-21 19:11:02 +08:00
< h1 class = "post-title" > < a href = "https://blog.dich.bid/opensource-what/" > 开源世界:什么是开源< / a > < / h1 >
2025-01-02 21:19:48 +08:00
< div class = "post-meta-inline" >
< span class = "post-date" >
2024-03-01
< / span >
< / div >
< span class = "post-tags-inline" >
:: tags:
< a class = "post-tag" href = "https://blog.dich.bid/tags/kai-yuan-shi-jie/" > #开源世界< / a > < / span >
< div class = "post-content" >
< p > 前言 「开源」一词对应英文 Open Source, 最初起源于软件开发领域, 因此也称为「开放源代码」, 对应的软件则称为开源软件( Open Source Software, 简称 OSS) 。< / p >
< span id = "continue-reading" > < / span > < h2 id = "kai-yuan-de-gai-nian" > 开源的概念< / h2 >
< p > 「开源」一词对应英文 Open Source, 最初起源于软件开发领域, 因此也称为「开放源代码」, 对应的软件则称为开源软件( Open Source Software, 简称 OSS) 。除了我们熟知的开源软件以外, 开源的表现形式还有很多, 例如开源硬件( Open Source Hardware) 、开放设计( Open Design) 、开放文档( Open Document) 等等。开源的目的是分享共享、加速创新, 可以说开源已经成为一种超越软件生产界限的运动和工作方式。< / p >
< h2 id = "kai-yuan-ruan-jian" > 开源软件< / h2 >
< p > 我们先来看看开源软件的概念,很多人可能会认为只要把源代码公开了就是开源软件。实际上这种理解是不充分的,按照 OSI 组织 (opens new window)( Open Source Initiative Association) 给出的 OSD 定义 (opens new window),除了公开源代码,开源软件的发行条款还必须符合以下十个条件。< / p >
< pre style = "background-color:#151515;color:#e8e8d3;" > < code > < span > Free Redistribution 允许自由地再发布软件
< / span > < span > Source Code 程序必须包含所有源代码
< / span > < span > Derived Works 可以修改和派生新的软件
< / span > < span > Integrity of The Author' s Source Code 发布时保持软件源代码的完整性
< / span > < span > No Discrimination Against Persons or Groups 不得歧视任何个人或团体
< / span > < span > No Discrimination Against Fields of Endeavor 不得歧视任何应用领域(例如商业)
< / span > < span > Distribution of License 许可证的发布具有延续性
< / span > < span > License Must Not Be Specific to a Product 许可证不能针对于某一个产品
< / span > < span > License Must Not Restrict Other Software 许可证不能限制其他软件
< / span > < span > License Must Be Technology-Neutral 许可证必须是技术中立的
< / span > < / code > < / pre >
< p > 通过了解这些条件约束,我们可以得出开源软件的定义:开源软件是一种技术和立场中立的使用许可证约束的开放源代码的软件。< / p >
< p > 开源软件需要保持开放的心态, 对任何技术和立场都保持客观公正的态度, 而且在开放源代码时, 还需要遵循开源许可协议, 允许任何人使用、拷贝、修改以及重新发布。开源许可协议主要分为宽松许可协议( Apache、BSD、MIT 等) 和严格许可协议( GPL、GPL v3、LGPL、Mozilla 等)两大类。除此之外,一个优秀的可持续发展的开源软件,还需要公开发布项目技术文档和其他材料、二进制文件(可选)等,以及拥有一个开放性的社区,接收用户和开发者的反馈,共同探讨开源软件的发展。< / p >
< h2 id = "kai-yuan-ying-jian" > 开源硬件< / h2 >
< p > 通过前面的介绍,我们知道了什么是开源软件,那么什么是开源硬件呢?< / p >
< p > 类比开源软件,你可能会误以为开源硬件是可以免费获得、自由修改并再分发的硬件。如果你这么想,你就大错特错了,毕竟硬件是有形的,是看得见摸得着的。我们先来简单看一下 开源硬件协会 (opens new window)( Open Source Hardware Association) 对开源硬件的描述: < / p >
< p > 开源硬件是可以通过公开渠道获得的硬件设计,任何人可以对已有的设计进行学习,修改,发布,制作和销售。硬件设计的源代码的特定的格式可以为其他人获得,以方便对其进行修改。理想情况下,开源硬件使用随处可得的电子元件和材料,标准的过程,开放的基础架构,无限制的内容和开源的设计工具,以最大化个人利用硬件的便利性。开源硬件提供人们在控制他们的技术自由的同时共享知识并鼓励硬件设计开放交流贸易。< / p >
< p > 这里要划重点了, OSHWA 在描述开源硬件时使用的是硬件设计而不是硬件本身。开源硬件的定义是在开源软件的基础上进行的,这里不再赘述,感兴趣的读者可以在 OSHWA 官网找到开源硬件的完整 定义 (opens new window)。< / p >
< p > 目前比较有名的开源硬件有 Arduino (opens new window)、树莓派( Raspberry Pi) (opens new window)、BeagleBone (opens new window)等等。< / p >
< h2 id = "kai-yuan-she-ji" > 开源设计< / h2 >
< p > 开源设计是开源项目的另一表现形式, 开源设计的定义是遵循开源许可的可以通过公开渠道获得的设计类项目, 主要指的是非源代码类型的项目, 比如: icon、UI、画稿、图纸等。这些项目也需要遵守开源协议, 并且享受协议规章的保护。< / p >
< h2 id = "kai-yuan-wen-dang" > 开源文档< / h2 >
< p > 开源文档在开源项目中非常常见,开源文档的定义是遵循开源许可的可以通过公开渠道获得的文档类项目,开源文档存在于各种项目中,种类覆盖广泛,像博客、百科、菜谱、冷知识、项目说明文档等都可以作为开源文档进行分享。开源文档常见的开源协议也有很多,比如我们《开源指北》使用的 CC BY-SA 4.0 协议。< / p >
< h2 id = "kai-yuan-de-li-shi" > 开源的历史< / h2 >
< p > < strong > UNIX< / strong >
提及开源的历史,不得不从 Unix 说起。< / p >
< p > 在 1965 年前后, 贝尔实验室( Bell) 、麻省理工学院( MIT) 及通用电气公司( GE) 曾共同发起了 Multics 项目,旨在开发一个全面的、通用的分时操作系统,实现让大型主机可以同时提供 300 台以上的终端机连接使用的目标。然而,到了 1969 年,由于项目进度落后、资金短缺,在认为 Multics 项目不可能成功之后,贝尔实验室退出了该项目的研究工作。虽然 Multics 项目没有取得成功, 但是培养出了很多优秀的人才, 其中就包括肯·汤普森( Ken Thompson) 和丹尼斯·里奇( Dennis Ritchie) 。< / p >
< p > 回到贝尔实验室后,以肯·汤普森为首的研究人员吸取了 Multics 项目失败的经验教训,将 Multics 庞大而复杂的系统进行简化,实现了一种分时操作系统的雏形,并将其取名为 UNIX。此后十年, UNIX 在学术机构和大型企业中得到了广泛的应用,当时的 UNIX 拥有者 AT& T 公司以低廉甚至免费的许可将 UNIX 源码授权给学术机构做研究或教学之用,许多机构在此源码基础上加以扩充和改进。< / p >
< p > 由于早期 AT& T 为避免美国司法部起诉它违反《反垄断法》而签订了和解协议,同意不进入计算机行业,不销售任何与计算机有关的产品。因此从 UNIX 诞生起的前十五年, 学术机构和黑客们自由地共享源码,以分散的方式共同合作开发 UNIX 系统。为后来的自由和开源软件的意识形态和社区诞生过程中起到了奠基性的作用。< / p >
< p > 转折发生在 1984 年,由于对 AT& T 的限制法令被解除, AT& T 开始以能获利的价格销售 UNIX。UNIX 的源码依然可用,但 AT& T 将 UNIX 从研究性质的项目转变为一个商业项目,这在 UNIX 黑客社区里产生了危机,他们开始寻找一个可替代的类 UNIX 系统。< / p >
< p > < strong > GNU< / strong >
实际上,在 UNIX 变成一个商业项目之前, 由于硬件价格的不断下跌, 制造商已经开始期望软件能够带来额外的收入。于是, 开始出现种种保护软件、对其收费的措施, 越来越多的厂商开始单独销售软件, 也不再提供软件的源代码, 软件工业开始独立出来了。1976 年,比尔·盖茨就曾发表《致计算机爱好者的公开信 (opens new window)》, 明确提出了软件版权( CopyRight) 的理念。< / p >
< p > 1983 年, 由于私有软件的增长和对不再能自由使用计算机程序的担忧, MIT 的理查德·斯托曼( Richard Stallman) 开始倡导自由软件运动, 并发起了 GNU 计划。GNU 是「GNU is NOT UNIX」的无穷递归缩写, 其目标是构建一整套完全由自由软件构成的 UNIX OS 体系。GNU 起初进展很顺利,开发出 GLibc、GCC、GDB 等一系列操作系统必备软件。< / p >
< p > 随着推动自由软件发展和成熟的愿景日益强烈,理查德·斯托曼意识到仅通过编写和分享 GNU 代码是远远不够的。于是,在 1985 年创建了自由软件基金会( Free Software Foundation, 简称 FSF) , 其主要工作是运行 GNU 计划, 开发更多的自由软件。同时, FSF 还创建了保护 GNU 和其他自由软件项目的法律和制度框架,提出了与 CopyRight 理念针锋相对的 CopyLeft( 许可复制权) 理念, 其表现形式为 GPL, 即公共许可证( General Pubic License) 。< / p >
< p > < strong > Linux< / strong >
1991 年, 林纳斯·托瓦兹( Linus Torvalds) 公开发布了一个类 UNIX 操作系统内核 —— Linux, 并接受 CopyLeft 理念。从 Linux 0.12 版本起, Linux 内核开始采用 GPL 许可证的新版权声明。虽然 Linux 内核并不是 GNU 计划的一部分,但由于 HURD 内核进展缓慢,使得 Linux 得到广泛关注并得以快速发展。GNU 与 Linux 的发展,可以说是相辅相成,因此 我们通常把使用 Linux 内核并且大量使用 GNU 组件的操作系统发行版称为 GNU/Linux。< / p >
< p > 正是 Linux 的出现,使得自由软件运动有了自己可以与 Microsoft 的 Windows 相抗衡的操作系统。自由软件运动初战告捷。但是,自由软件运动关于自由的追求,毕竟和现实的商业氛围格格不入,带有着过于理想化的色彩。这种反商业的信条,让一些本来也反对私有软件的人士对自由软件敬而远之。正是在这种背景下,一部分原有自由软件运动人士,开始尝试将理想的自由软件与现实的商业氛围进行某种衔接。< / p >
< h2 id = "zi-you-ruan-jian-he-kai-yuan-ruan-jian" > 自由软件和开源软件< / h2 >
< p > 1998 年, 埃里克·雷蒙德( Eric Raymond) 等人成立了一个名为开源促进会( Open Source Initiative, 简称 OSI) 的组织。为了减少意识形态上的沟壑, 以及「自由( Free) 」一词造成免费软件的误解。OSI 组织决定从「自由软件」中去掉了「自由」一词, 使用「开源软件」( Open Source Software) 作为共通名称, 并创建了自己的开放源码的定义, 以及自己的一套许可证。< / p >
< p > 正因如此,自由软件运动和开源软件运动有着密不可分的关系,两者的根本差别在于它们看待世界的方法。开源软件运动的理念更倾向于解决实际问题,既抓住了私有软件的痛点,又实现了与商业的融合。< / p >
< h2 id = "kai-yuan-githe-dai-ma-tuo-guan-ping-tai" > 开源、Git和代码托管平台< / h2 >
< p > 前面提到,开源软件是允许自由复制和重新分发的,那么分散的开发者之间是如何协作的呢?尤其是 Linux 这样依靠全世界热心的志愿者参与的项目。其实早年( 1991-2002 年间)世界各地的志愿者是通过 diff 的方式把源代码补丁发给 Linus, 然后由 Linus 本人通过手工方式合并代码。直到 2002 年, Linux 项目组才开始启用一个专有的分布式版本控制系统 BitKeeper 来管理和维护代码。< / p >
< p > 但好景不长, 2005 年,开发 BitKeeper 的商业公司结束了与 Linux 内核开源社区的合作。于是 Linux 开源社区(特别是 Linux 的缔造者 Linus Torvalds) 决定开发自己的版本控制系统 —— Git (opens new window)。很快, Linux 内核的源码已经由 Git 全面管理了。Git 是完全分布式的,同时拥有强大的代码管理能力,支持离线操作和非线性分支管理,使用 Git 可以让散布各地的开发者更加高效地协同工作, 可以说, Git 的出现极大地推动了开源的发展。< / p >
< p > 2008 年, GitHub 网站上线了,它为开源项目免费提供 Git 存储,无数开源项目开始迁移至 GitHub。GitHub 的出现让开源的工作方式变得更简单和有趣了。如今,每天都有无数来自世界各地的开发者在 GitHub 上进行交流, Github 已经成为一个包含问题追踪和版本控制的特殊社交网络。< / p >
< p > 初学者容易混淆 Git 和代码托管平台的概念。Git 是版本控制系统,开发者可以通过 Git 在本地工作空间建立项目仓库,每一个 Git 仓库都会包含一个 .git 目录, 里面存储了该项目的每一次源代码的提交日志, 可以方便地回退到过去的任意一个提交的版本与过去的代码进行比对。毫不夸张地说, Git 仓库就像是一个具有魔法的文件系统, Git 则帮我们记录该仓库下所有的读写信息,并在工作空间、暂存区、本地仓库之间随意切换。< / p >
< p > 而代码托管平台,比如 GitHub (opens new window)、GitLab (opens new window)、Bitbucket (opens new window)、Gitee (opens new window)等,则是基于 Git 的代码托管平台,通过网络为用户提供 Git 仓库托管服务。得益于 Git 分布式的特性, Git 代码托管平台上的仓库通常充当远程仓库的角色, 便于多个开发者之间的同步。在此基础之上, 代码托管平台还提供了许多协作功能, 将版本管理、Bug 跟踪、代码审查、邮件列表、IRC 等众多功能组合在一起,以实现更高效的协同开发。简单来说,代码托管平台不仅仅提供代码托管服务,还有项目管理,甚至社交等功能。< / p >
< p > 总的来说, Git 和代码托管平台有直接关联,但又有许多不同的地方。关于 Git 和代码托管平台的操作,将在后续章节展开描述。< / p >
2025-01-21 19:11:02 +08:00
< h2 id = "kai-yuan-ruan-jian-de-chang-jian-wu-qu-jie-xi" > 开源软件的常见误区解析< / h2 >
< p > 开源软件以其开放性、共享性和协作性,已经成为软件开发领域的重要力量。然而,围绕开源软件,存在一些普遍的误解。本文旨在澄清这些误区,帮助读者更准确地理解开源。< / p >
< h3 id = "kai-yuan-yu-mian-fei" > 开源与免费< / h3 >
< p > < strong > 误区一:开源即免费< / strong > < / p >
< p > 开源软件的核心在于“自由”,而非“免费”。开源软件的源代码对所有人开放,用户可以自由地查看、修改和分发,但这并不意味着所有开源软件都不收费。实际上,开源项目可以提供免费下载,同时通过提供服务、支持或附加功能来收费。< / p >
< h3 id = "kai-yuan-zu-zhi-yu-wang-luo-mo-xing" > 开源组织与网络模型< / h3 >
< p > < strong > 误区二: OSI组织与OSI网络模型相同< / strong > < / p >
< p > OSI通常指开放源代码促进会( Open Source Initiative) , 而OSI模型是指开放系统互联通信模型。两者虽然名称相似, 但实质上毫无关联, 类似于Java与JavaScript的关系。< / p >
< h3 id = "can-yu-kai-yuan-de-men-jian" > 参与开源的门槛< / h3 >
< p > < strong > 误区三:只有技术高手才能参与开源< / strong > < / p >
< p > 开源社区欢迎所有人参与,不论技术水平如何。开源的核心在于分享和协作,即使是初学者,也能通过提问、反馈或小的代码贡献来参与其中。< / p >
< h3 id = "kai-yuan-yu-bi-yuan-de-you-lie" > 开源与闭源的优劣< / h3 >
< p > < strong > 误区四:开源总是优于闭源< / strong > < / p >
< p > 开源和闭源软件各有优势和劣势。开源软件因其开放性,能够快速迭代和获得社区支持;而闭源软件则可能提供更专业的服务和更稳定的更新。< / p >
< h3 id = "shang-yong-kai-yuan-xiang-mu" > 商用开源项目< / h3 >
< p > < strong > 误区五:开源项目不能商用< / strong > < / p >
< p > 开源项目必须允许商用,这是开放源代码定义的一部分。但需注意,某些许可证可能对商用有限制。< / p >
< h3 id = "kai-yuan-zuo-zhe-de-ban-quan" > 开源作者的版权< / h3 >
< p > < strong > 误区六:开源项目作者无版权< / strong > < / p >
< p > 即使项目开源,作者依然保留版权。使用开源软件时,必须遵守其许可证规定,尊重作者的版权。< / p >
< h3 id = "kai-yuan-zhuan-bi-yuan" > 开源转闭源< / h3 >
< p > < strong > 误区七:开源项目不能转为闭源< / strong > < / p >
< p > 不同的开源许可证对开源转闭源有不同的规定。一些许可证如LGPL、GPL禁止转闭源, 而BSD、MIT等则允许。< / p >
< h3 id = "ban-kai-yuan-yu-wei-kai-yuan" > “半开源”与“伪开源”< / h3 >
< p > < strong > 误区八:“半开源”和“伪开源”等同于开源< / strong > < / p >
< p > “半开源”和“伪开源”可能不符合狭义上的开源标准,但它们仍然对开源社区有所贡献。开源的界定有时存在争议,但关键在于是否开放源代码并允许他人使用。< / p >
< h3 id = "kai-yuan-xiang-mu-de-guan-li" > 开源项目的管理< / h3 >
< p > < strong > 误区九:开源项目只需开放源代码< / strong > < / p >
< p > 一个成功的开源项目需要的不仅是开放源代码,还包括一套完整的社区管理和维护流程。< / p >
< h3 id = "kai-yuan-ruan-jian-de-an-quan-xing" > 开源软件的安全性< / h3 >
< p > < strong > 误区十:开源软件不安全< / strong > < / p >
< p > 开源软件的安全性取决于其维护和更新的及时性。开源社区能够快速发现并修复安全漏洞,但这并不意味着开源软件就绝对安全。< / p >
< h3 id = "kai-yuan-xiang-mu-de-ji-shu-zhi-chi" > 开源项目的技术支持< / h3 >
< p > < strong > 误区十一:开源项目缺乏技术支持< / strong > < / p >
< p > 开源项目的技术支持来自于其社区和企业的支持。一个活跃的社区可以提供强大的技术支持。< / p >
< h3 id = "kai-yuan-xiang-mu-de-zhi-liang" > 开源项目的质量< / h3 >
< p > < strong > 误区十二:开源项目质量不高< / strong > < / p >
< p > 开源项目的质量取决于其维护和社区的活跃度。许多知名的开源项目都是由顶尖的专家维护的。< / p >
< h3 id = "kai-yuan-xiang-mu-de-ming-ming" > 开源项目的命名< / h3 >
< p > < strong > 误区十三:开源项目必须用英文命名< / strong > < / p >
< p > 开源项目的命名应根据项目的性质和作者的偏好来决定。使用母语命名可以提高代码的可读性和可维护性。< / p >
< h3 id = "gong-xian-kai-yuan-xiang-mu-de-fang-shi" > 贡献开源项目的方式< / h3 >
< p > < strong > 误区十四:为开源项目贡献只能通过编写代码< / strong > < / p >
< p > 为开源项目做贡献有多种方式, 包括编写文档、报告bug、提供资金支持等。< / p >
< p > 通过以上解析,我们可以看到开源软件的世界是多元和包容的。开源不仅仅是技术的选择,更是一种文化和精神的体现。< / p >
2025-01-02 21:19:48 +08:00
< h2 id = "xiao-jie" > 小结< / h2 >
< p > 不会写代码也可以参与开源吗?相信你在读完这篇文章后,在自己心中应该有了答案。< / p >
< p > 当然,答案是肯定的。< / p >
< p > 从自由软件运动和开源文化的发展来看,我们会发现其实它是一场社会运动,是一种生产方式的革新。开源运动旨在利用开源软件的价值和分散的生产模型,为其社区和行业的问题寻找新的解决方式。之所以首先出现在软件领域,是因为软件作为一个新兴领域,所受阻力相对较小,同时软件可以依托网络进行异步协作和分发,大大减少了时间和空间的差异以及获取成本。但从涉猎范围来看,开源除了适用于软件领域以外,在开源硬件、开源设计、开源文档等领域也有足够的发挥空间。< / p >
< p > 时至今日,开源已经成为一种超越软件生产界限的运动和工作方式。「源」的含义也从「源代码」扩展到各类「资源」。像文中提到的硬件领域,随着 Arduino 和树莓派的流行,如今我们对「开源硬件」一词已经不陌生了。还有许多与软件源代码具有相同传播属性的各类设计文档,比如书籍、博客、食谱、配方、照片、音频和视频制品等资料。非营利性组织 Creative Commons 的 CC 许可协议就是专门应用于此类著作权法的保护。< / p >
< p > 而且,开源协议实质是权利人将其复制权、发行权、修改权等附条件地许可给不特定公众的著作权许可使用合同。开源软件许可证的法律性质是司法保护中最核心的问题,尤其是近年来多变的国际形势下,开源安全、开源治理、开源合规等问题愈发突出,这就意味着需要更多专业人才的参与。同时,开源社区的构建和运营对于开源软件生态发展和影响力非常重要,也需要相关人才参与。< / p >
< p > 总之,开源与我们息息相关,即便你不写代码,也能为开源事业贡献一份力量。当然,我们也期望更多开发者能够参与开源(强烈建议)!愿你在开源领域乘风破浪,所向无前!< / p >
< / div >
< div class = "pagination" >
< div class = "pagination__title" >
< span class = "pagination__title-h" > Thanks for reading! Read other posts?< / span >
< hr / >
< / div >
< div class = "pagination__buttons" >
< span class = "button previous" >
2025-01-21 19:11:02 +08:00
< a href = "https://blog.dich.bid/network-how-email-works-2/" >
2025-01-02 21:19:48 +08:00
< span class = "button__icon" > ←< / span >
< span class = "button__text" > 电子邮件是如何工作的:POP3/ IMAP/ SMTP< / span >
< / a >
< / span >
< span class = "button next" >
2025-01-21 19:11:02 +08:00
< a href = "https://blog.dich.bid/opensource-licenses/" >
< span class = "button__text" > 开源世界:开源软件与协议< / span >
2025-01-02 21:19:48 +08:00
< span class = "button__icon" > →< / span >
< / a >
< / span >
< / div >
< / div >
< / div >
< / div >
< footer class = "footer" >
< div class = "footer__inner" >
< div class = "copyright" >
< span > ©
2025
Dichgrem< / span >
< span class = "copyright-theme" >
< span class = "copyright-theme-sep" > :: < / span >
Theme: < a href = "https://github.com/pawroman/zola-theme-terminimal/" > Terminimal< / a > by pawroman
< / span >
< / div >
< / div >
< / footer >
< / div >
< / body >
< / html >