跳转至

5 misc

信息论概论

信息论是应用数学的一个重要分支,由美国数学家克劳德 · 香农在 20 世纪中期创立。它主要研究信息的量化、存储、传输和处理的普遍规律。信息论为数字通信、数据压缩、密码学等众多计算机科学领域奠定了坚实的理论基础,是理解信息本质的科学。它不仅关注信息的传输,更关注信息本身的性质和度量。

信息、熵与比特
  1. 信息 (Information): 在信息论中,信息是对不确定性的消除。一个事件发生的可能性越小,当它发生时,所提供的信息量就越大。

例如,得知“明天太阳从西边升起”比得知“明天太阳从东边升起”能提供更多的信息,因为前者发生的概率极低,因此消除了更大的不确定性。

  1. (Entropy)
    • 定义: 熵(英语:entropy,又称信息熵、信源熵、平均自信息量,是接收的每条消息中包含的信息的平均量。这里的“消息”代表来自分布或数据流中的事件、样本或特征。
    • 物理学起源与引申: 熵的概念最早起源于物理学,用于度量一个热力学系统的无序程度。在信息论中,它被巧妙地引申为对不确定性的测量,熵值越高,信源的不确定性或随机性越大。
    • 与信息量的关系: 在信息世界中,熵越高,则能传输越多的信息;熵越低,则意味着传输的信息越少。例如,英语文本数据流的熵相对较低,因为英语的单词和语法结构使其容易被预测。
    • 定量计算: 熵的计算通常基于事件的概率分布。当取自有限样本时,熵的公式可以表示为:\(H(X) = - \sum p_i \log_b p_i\),其中 \(p_i\) 是事件发生的概率,\(b\) 是对数的底。
  2. 比特 (Bit):
    • 定义: 比特是信息量的基本单位。当熵的计算公式中对数的底 \(b=2\) 时,熵的单位就是比特。一个比特可以表示两种状态,如 0 1
    • 可加性: 采用概率分布的对数作为信息量的度量,是因为其具有可加性。例如,投掷一次硬币提供了 1 比特的信息(正面或反面,而掷 m 次硬币则提供了 m 比特的信息。
    • 与压缩的关系: 熵更高意味着压缩消息所携带的信息越难以预测,因为压缩消息中没有冗余,即每个比特的消息都携带了一个比特的信息。香农的信源编码定理揭示了,任何无损压缩技术不可能让一比特的消息携带超过一比特的信息,同时也不可能缩短任何消息。这意味着,如果消息已经达到了其信息熵的极限,即没有任何冗余可供消除,那么它就无法再被无损压缩。

信息论的应用与意义

信息论是现代数字通信、数据压缩(如 JPEG 图像压缩、MP3 音频压缩、信道编码(如纠错码,确保数据在传输过程中不失真、密码学等众多领域的核心理论基础。它为理解和量化信息提供了严谨的数学框架,是构建高效、可靠通信和计算系统的基石。

信息论的核心在于量化“不确定性”和“信息量”,而不是简单的数据传输。熵是这种量化的关键指标,且与可预测性呈反比。理解这一点,有助于从更深层次把握数据压缩和通信效率的本质。

高熵意味着低冗余,低冗余是高效无损压缩的极限

熵是信息的不确定性度量,熵越高,信息越随机,越难以预测。难以预测意味着信息中重复或可推断的部分(即冗余)越少。

例如,一个完全随机的数列,无法根据前面的数字预测下一个,因为它没有模式,也就没有冗余。

香农信源编码定理指出,任何无损压缩技术都无法让一比特的消息携带超过一比特的信息,也无法缩短消息。这意味着压缩的极限在于消除所有冗余,使每个比特都承载“新”信息。当信息源的熵达到最大时(即完全随机,每个符号出现的概率相等,其冗余度为零。此时,任何无损压缩都无法进一步减小其大小,因为已经没有可消除的冗余了。

因此,高熵是高效无损压缩的内在限制,它告诉我们数据在本质上能被压缩到多小。

信息论为“数据价值”提供了量化基础

信息论指导着如何从海量数据中提取有意义的洞察。信息论将信息量定义为与事件发生概率的对数负相关,即越不可能发生的事件,其信息量越大。这意味着“稀有”或“意外”的数据点通常比“常见”或“预期”的数据点包含更多的信息。

例如,在一个稳定的系统中,突然出现的异常日志(低概率事件)往往比常规的日志(高概率事件)包含更高的信息量,因为它可能预示着问题。在大数据分析、异常检测、机器学习特征工程中,识别和提取那些具有高信息熵的数据点(即不确定性高、出现频率低但有意义的数据)往往能带来更大的价值。

在金融交易中,异常的交易模式(低概率事件)往往比常规交易(高概率事件)包含更高的信息量,也更具检测欺诈的价值。信息论的视角帮助我们从数学上理解为什么某些数据比其他数据更有“价值”或“洞察力”,从而指导我们更有效地处理和分析数据,这对于数据科学家和分析师至关重要。

参考资料

密码学概论

密码学是研究如何保护信息安全的一门科学,它涉及将可理解的信息(明文)转换为不可理解的数据(密文,以及将密文转换回明文的过程。现代密码学不仅仅局限于加解密,其核心目标是确保信息的保密性(Confidentiality、完整性(Integrity、认证性(Authentication)和不可否认性(Non-repudiation。它利用数学技术来转换数据,防止未经授权的各方读取或篡改数据。

加密与解密
  • 明文 (Plaintext): 原始的、可理解的信息或数据。
  • 密文 (Ciphertext): 经过加密算法处理后,变得不可理解的数据。
  • 加密 (Encryption): 将明文转换为密文的过程。隐藏信息内容,使其在传输或存储过程中不被非授权方理解。
  • 解密 (Decryption): 将密文转换回明文的过程。只有拥有正确密钥的授权方才能执行此操作。
  • 密钥 (Key): 用于加密和解密算法的秘密参数。密钥是密码学安全性的核心,其保密性直接决定了加密系统的安全性。

对称加密与非对称加密

  1. 对称加密 (Symmetric Cryptography):
    • 原理: 加密和解密使用相同的秘密密钥。通信双方必须共享这个密钥。
    • 工作方式: 加密函数 Encrypt(明文, 密钥) 产生 密文;解密函数 Decrypt(密文, 密钥) 还原 明文。其正确性在于 Decrypt(Encrypt(m, k), k) = m
    • 特点: 速度快,效率高,适用于加密大量数据。
    • 示例: 高级加密标准 (AES) 是目前广泛使用的对称密钥算法。它是一种块密码,对固定大小的数据块进行操作;也有流密码,一次转换 1 位或 1 字节数据。
    • 应用: 文件存储加密(如将文件加密后存入不受信任的云服务、数据库加密、VPN 等。
  2. 非对称加密 (Asymmetric Cryptography / Public-Key Cryptography):
    • 原理: 使用一对数学相关的密钥——一个公钥 (Public Key) 和一个私钥 (Private Key)。公钥可以公开分发给任何人,而私钥必须严格保密,只有所有者拥有。
    • 工作方式:
      • 加密: 任何人都可以使用接收方的公钥加密信息,但只有接收方使用其对应的私钥才能解密。
      • 数字签名: 发送方使用自己的私钥对消息进行签名,生成一个数字签名。任何人都可以使用发送方的公钥验证这个签名,从而确认消息确实来自该发送方且未被篡改。
    • 特点: 速度通常比对称加密慢,但解决了密钥分发问题。
    • 示例: RSA 算法是公用密钥算法的典型代表。Diffie-Hellman 协议用于安全地交换密钥。
    • 应用:
      • 密钥分发: 非对称加密常用于加密对称密钥(即会话密钥,然后通过对称密钥对实际数据进行加密,这是一种混合加密方式。
      • 数字签名: 验证软件的真实性(如 Git GPG 签名
      • 安全通信: Signal、Keybase 等私密消息应用使用非对称密钥建立安全通信通道。
    • 密钥分发挑战与信任模型:
      • 挑战: 如何安全地分发公钥并将其映射到真实世界中的身份,是一个重要挑战。
      • 解决方案:
        • 初次使用信任 (Trust on first use, TOFU): 首次通信时信任对方公钥,后续若密钥发生变化则发出警告 ( 例如,Signal 应用中验证“安全号码”)。
        • 信任网络 (Web of Trust): 一种去中心化的信任模型,用户通过互相签名公钥来建立信任链 ( PGP)。它不同于中心化的证书颁发机构 (CA) 模型,后者依赖于少数受信任的方。
        • 社会证明 (Social Proof): 通过在多个社交平台验证身份来建立信任 ( Keybase)
特征 / 方面 对称加密 (Symmetric Cryptography) 非对称加密 (Asymmetric Cryptography)
密钥数量 1 ( 加密和解密使用相同密钥 ) 2 ( 公钥和私钥,成对出现 )
密钥关系 秘密共享,双方需持有相同密钥 公钥公开,私钥保密,数学相关但无法推导
安全性来源 密钥的保密性 数学难题 ( 如大整数分解、离散对数 )
速度 / 效率 极快,适用于大量数据加密 较慢,计算开销大
密钥分发 困难,需安全通道分发密钥 容易,公钥可公开分发
典型算法 AES ( 高级加密标准 ), DES ( 数据加密标准 ) RSA, ECC ( 椭圆曲线密码学 )
主要用途 数据保密性 ( 加密文件、通信内容 ) 密钥交换、数字签名、身份认证

密码学远不止加密和解密,它是一个涵盖保密性、完整性、认证性和不可否认性的综合性学科。对称加密和非对称加密各有优劣,实际应用中常结合使用以兼顾效率和安全性。

非对称加密的出现解决了对称加密的“密钥分发”难题

对称加密因其高效性而适用于大量数据加密,但其最大的挑战在于通信双方必须安全地共享同一个秘密密钥。在分布式、不安全的网络环境中,如何安全地将这个密钥从一方传递给另一方(即“密钥分发问题”,是一个巨大的安全漏洞。如果密钥在传输过程中被截获,则整个通信的保密性将不复存在。

非对称加密通过引入公钥和私钥对,巧妙地解决了这个问题。公钥可以公开分发,用于加密或验证签名;私钥则严格保密,用于解密或生成签名。这样,发送方可以使用接收方公开的公钥加密信息,而无需预先共享任何秘密密钥,从而避免了密钥分发时的安全风险。

如何确保所使用的公钥确实属于声称的实体?

然而,非对称加密又引入了一个新的问题:如何确保所使用的公钥确实属于声称的实体?如果攻击者能够伪造一个公钥并冒充合法用户,那么即使使用了非对称加密,通信的安全性也可能被破坏。

这就是“公钥信任”问题,即如何验证公钥的真实性。为了应对“公钥信任”问题,密码学界发展出了多种机制,如信任网络 (Web of Trust)、初次使用信任 (TOFU)、社会证明 (Social Proof) 等。这些机制旨在通过去中心化或半中心化的方式,建立对公钥真实性的信心,确保加密的信息确实只能被预期的接收者解密。密码学的发展是一个不断解决旧问题、同时又引入新问题的过程。

非对称加密是解决密钥分发问题的重大突破,但其有效性又高度依赖于公钥信任机制的健壮性。这体现了安全设计中“没有银弹”,总是在权衡和应对新的挑战。

编码 vs. 密码

这是一个大家常会混淆的概念,但两者有着本质的区别。

  • 编码 (Encoding):
    • 目的: 将一种数据格式转换为另一种格式,以便数据能在特定介质或协议中正确传输或存储。它旨在使数据“可读”或“兼容”,而不是“保密”。
    • 原理: 编码是依据一套公开的、标准化的规则进行转换,不涉及任何秘密密钥。任何人只要知道编码算法,就可以轻松地进行编码和解码。
    • 示例: Base64 编码。Base64 将任意二进制数据(如图片、音频文件)转换为由 64 种可打印的 ASCII 字符组成的文本字符串。这对于在只能处理文本的协议(如电子邮件、HTTP、JSON)中传输二进制数据非常有用。值得注意的是,Base64 编码会使数据大小增加约 33%
  • 密码 (Cryptography):
    • 目的: 保护信息的机密性、完整性、认证性和不可否认性。其核心在于通过数学方法实现“保密”和“安全”。
    • 原理: 依赖于秘密密钥和复杂的数学算法。没有正确的密钥,即使知道加密算法,也难以将密文还原为明文。
  • 核心区别:
    • 密钥: 编码不使用密钥,其转换规则是公开的;而密码学必须依赖秘密密钥,密钥是其安全性的核心。
    • 目的: 编码是为了格式转换和兼容性,数据转换后是“可读”的(只是格式不同;密码是为了安全性,数据转换后是“不可读”的(密文,旨在隐藏信息内容。
    • 安全性: 编码不提供任何安全性保障,它不是加密算法,不能用于安全数据传输。加密则提供强大的安全保障。将敏感信息进行 Base64 编码后传输,等同于明文传输,因为任何人都可以轻易解码。

https://x.com/LetsDefendIO/status/1583471423498035200

参考资料

网络 / 网站基础

计算机网络概述

计算机网络是将分散的、独立的计算机设备通过通信介质(如网线、光纤、无线电波)连接起来,实现资源共享和信息交换的系统。它是现代社会运行的基石,支撑着从电子邮件到在线视频、从云计算到物联网的各种应用。

互联网 (Internet) 是全球规模最大的计算机网络,它采用一套核心的协议族——TCP/IP 协议,将各种不同类型、不同规模、不同地理位置的物理网络连接成一个统一的、全球性的计算机网络。

客户端 - 服务器模型

客户端 - 服务器模型

客户端 - 服务器模型是一种最常见的网络架构范式,其中一个程序(称为客户端)向另一个程序(称为服务器)发送请求,并等待服务器返回响应。

工作原理:

  1. 当客户端(例如,读者手机上的购物 App 或电脑上的网页浏览器)需要某种服务时,它会向服务器端发送一个请求。这个请求是按照双方预先约定的格式来发送的,以确保服务器能够理解。
  2. 服务器端接收到这个请求后,会根据约定格式解释它,并执行相应的操作,例如查询数据库、处理订单或生成网页内容。
  3. 服务器端完成处理后,会生成一个响应并发送回客户端,例如返回购物清单、查询结果或网页数据。
  4. 客户端接收并处理这个响应,最终将其展示给用户,例如在手机屏幕上显示付款金额或在浏览器中渲染网页。

特点: 在网络编程中,客户端和服务器的编程模型是不同的。服务器端通常会持续监听一个特定的网络端口,等待来自客户端的连接请求。

IP 地址 (Internet Protocol Address)

  • 定义: IP 地址是互联网或本地网络上设备的唯一标识符。它类似于现实世界中的邮政地址,包含了设备在网络中的位置信息,使得数据包能够被准确地路由到目标设备,从而使设备之间能够进行通信。
  • 格式: IP 地址通常表示为一串由句点分隔的数字(例如 IPv4 地址 192.158.1.38,其中每个数字的范围都在 0 255 之间。
  • 工作原理: 读者的互联网服务提供商 (ISP) 会为读者的设备分配一个 IP 地址。读者的互联网活动将通过 ISP 传输,他们会使用读者的 IP 地址将其路由给读者。IP 地址分为私有 IP 地址(用于局域网内部设备标识,如家庭网络中的电脑、手机)和公共 IP 地址(与整个网络关联的主要地址,由 ISP 提供,用于在互联网上识别读者的网络

DNS (Domain Name System)

  • 定义: DNS 是互联网的“电话簿”或“导航系统”。人们通过易于记忆的域名(如 www.google.com)访问在线信息,而 Web 浏览器和服务器通过 IP 地址进行交互。DNS 的作用就是将人类可读的域名转换为机器可读的 IP 地址,以便浏览器能够加载互联网资源。
  • 工作原理 ( 域名解析 ):
    1. 当用户在 Web 浏览器中输入一个域名(例如 example.com)时,这个查询首先会传输到互联网,并被本地的 DNS 递归解析器接收。
    2. 接着,解析器会查询 DNS 根域名服务器(全球最高层级的服务器
    3. 根服务器并不知道 example.com IP 地址,但它知道负责 .com 域名的顶级域(TLD)DNS 服务器的地址,并将其返回给解析器。
    4. 解析器随后向.com TLD 服务器发出请求。
    5. TLD 服务器会返回该域(example.com)的权威域名服务器的 IP 地址。权威域名服务器是真正存储 example.com 对应 IP 地址的服务器。
    6. 最后,递归解析器将查询发送到 example.com 的权威域名服务器。
    7. 权威域名服务器返回 example.com IP 地址给解析器。
    8. DNS 解析器将获取到的 IP 地址响应给 Web 浏览器。浏览器随即向该 IP 地址发出 HTTP 请求,从而加载网页。
  • 缓存机制: 为了提高效率和速度,DNS 查找信息通常会本地缓存(在用户的计算机或 DNS 基础设施中,这样下次访问同一域名时可以直接从缓存中获取 IP 地址,无需重复整个解析过程。

HTTP HTTPS

HTTP (Hypertext Transfer Protocol)
  • 定义: HTTP 是超文本传输协议,是万维网(World Wide Web)上应用最广泛的协议之一。它专门用于在 Web 浏览器和 Web 服务器之间传输超文本(如 HTML 文档、图片、视频等网页内容HTTP 是一种请求 - 响应协议,定义了 Web 客户端(浏览器)与 Web 服务器之间的通信方式。
  • 安全性: HTTP 请求和响应以明文形式发送,这意味着在数据传输过程中,任何能够截获网络流量的人(例如,在公共 Wi-Fi 网络中)都可以轻易地读取和理解这些信息。这带来了敏感信息(如登录凭据、信用卡号)被窃取和篡改的巨大风险。
HTTPS (Hypertext Transfer Protocol Secure)
  • 定义: HTTPS HTTP 的安全版本,其末尾的“S”代表“安全”。它通过使用传输层安全 (TLS) 协议SSL 的后续协议)对网络流量进行加密和验证,从而确保客户端(如 Web 浏览器)与 Web 服务器之间通信的安全性。
  • 安全性:
    • 数据加密: TLS 协议对所有传输的数据进行加密。即使攻击者截获了通信,也无法解密并窃取数据,因为他们看到的只是一串无意义的乱码。
    • 身份验证: HTTPS 通过数字证书(由可信的证书颁发机构 CA 颁发)来验证网站的合法性。这有助于用户确定他们访问的确实是预期的网站,而非伪造的钓鱼网站,有效防止了中间人攻击。
    • 数据完整性: HTTPS 还能确保传输中的数据未被篡改。
  • 重要性: HTTPS 已成为几乎所有网络事务的默认标准。它不仅保护了用户隐私和数据安全,也成为现代网站获得用户信任和搜索引擎排名(SEO)的重要信号。

HTTP 的“明文传输”特性是导致其不安全的根本原因,这直接催生了 HTTPS 的普及和必要性。

HTTP 协议设计之初是为了传输超文本,其核心特点是“明文传输”。这意味着数据在客户端和服务器之间传输时,不经过任何加密处理。当数据以明文形式在公共网络上传输时,任何能够监听网络流量的第三方(如恶意攻击者、不安全的 Wi-Fi 提供商)都可以轻易地截获并读取这些数据。这包括敏感信息如登录凭据、信用卡号、个人隐私数据等。这种风险被称为“窃听”或“中间人攻击”,因为攻击者可以位于通信双方之间,拦截并可能篡改数据。

HTTPS 通过在 HTTP 层之下引入 TLS/SSL 协议来解决这个问题。TLS/SSL 负责对所有传输数据进行加密,使得即使数据被截获,也只是一串无意义的乱码,无法被解读。除了加密,HTTPS 还通过数字证书提供了服务器身份验证和数据完整性校验,进一步增强了安全性。这确保了用户连接的是真正的网站,并且数据在传输过程中未被篡改。HTTP 的明文传输是其固有缺陷,使得在现代互联网环境下,尤其涉及敏感信息时,其安全性无法得到保障。HTTPS 的出现正是为了弥补这一核心缺陷,通过加密、认证和完整性保护,构建了更安全的网络通信环境,并因此成为现代 Web 通信的默认标准。

特性 / 方面 HTTP ( 超文本传输协议 ) HTTPS ( 安全超文本传输协议 )
默认端口 80 443
安全性 不安全,数据明文传输 安全,数据加密传输
加密机制 无加密 使用 TLS/SSL 协议进行加密
身份认证 无服务器身份认证 通过数字证书验证服务器身份
数据完整性 无数据完整性校验 提供数据完整性校验,防止篡改
性能 较快 ( 无加密解密开销 ) 略慢 (TLS/SSL 握手和加解密开销 )
SEO 影响 负面 (Google 等搜索引擎优先 HTTPS) 正面 ( 有利于搜索引擎排名 )
TCP (Transmission Control Protocol) UDP (User Datagram Protocol)
  • TCP: 传输控制协议是一种面向连接的协议。它在数据传输前会建立一个可靠的连接,并提供可靠的、有序的、错误检查的数据传输。TCP 确保数据包按顺序到达,并且没有丢失或损坏,适用于对可靠性要求高的应用,如文件传输、网页浏览。
  • UDP: 用户数据报协议是一种无连接的协议。它不建立连接,直接发送数据包,提供快速但不可靠的数据传输,不保证数据包的顺序和完整性。UDP 适用于对实时性要求高但允许少量数据丢失的应用,如在线游戏、视频流、DNS 查询。

URL

https://developer.mozilla.org/en-US/docs/Learn_web_development/Howto/Web_mechanics/What_is_a_URL

URL(统一资源定位符)是互联网上唯一资源的地址。它是浏览器用于检索 HTML 页面、CSS 文档、图像等已发布资源的关键机制之一。

大多数情况下,我们只关心 Domain Name Path to file 部分;URL begin 是一个通俗版讲解。

参考资料

API ( 应用程序编程接口 )

什么是 API
  • 定义: API (Application Programming Interface),即应用程序编程接口,是一组预先定义好的规则、协议和工具,用于构建和交互软件应用程序。它充当不同软件系统之间的“翻译官”或“中介”,使得它们能够相互通信、发送和检索数据,并允许不同的软件组件协同工作,而无需了解彼此内部的复杂实现细节。
  • 目的: API 的设计目的是确保不同软件系统之间能够安全、可靠、高效地通信,无论其底层架构和技术栈如何。它极大地促进了软件的模块化、可重用性和互操作性。

API 的工作原理

API 的工作原理可以简单理解为一种请求 - 响应模型,它通过公开有限的操作和数据点,允许外部软件与之交互。

API 工作流程
  1. 当一个软件系统(我们称之为客户端,例如读者的手机 AppWeb 浏览器中的 JavaScript 代码)需要访问另一个系统(称为服务器,例如一个提供天气数据或支付功能的后端服务)提供的资源(如数据或功能)时,客户端会通过 API 发出一个详细说明所需操作的请求。
  2. API 接收并授权这个请求。一旦请求被验证合法,API 就会充当桥梁,调用外部程序或 Web 服务器来处理这个请求。
  3. 服务器处理完请求后,会将包含所请求信息或操作结果的响应发送回 API
  4. API 随后将这些数据传输回初始请求的应用程序(客户端

用户不可见性: 整个数据传输和交互过程在用户界面上是不可见的。对最终用户来说,API 使得系统间的连接显得无缝且高效。

Example

电子商务网站的第三方支付功能是一个典型的 API 应用场景。当用户在购物网站上点击支付按钮并选择“使用 PayPal 支付”时,购物网站会通过 API 调用 PayPal 的支付系统,完成支付流程,而用户无需离开购物网站;

随着大语言模型的风靡,LLM 服务的 api 也常可以见到。

API 的核心组成部分
  • 端点 (Endpoints): API 可访问的特定地址,如 Web API URL
  • 方法 (Methods): 可以在这些端点执行的操作,如 HTTP API GET(获取数据、POST(提交数据、PUT(更新数据)和 DELETE(删除数据
  • 请求 (Requests): 执行操作所需的数据和参数。
  • 响应 (Responses): API 处理请求后返回的数据。
  • 模式 (Schemas): 现代 API 通常基于模式开发,模式定义了 API 的交互规则、数据格式、验证机制和文档方式。

API 的应用场景与安全基础

  • 应用场景: API 驱动着现代软件生态系统的发展,广泛应用于云服务、移动应用开发、Web 服务集成、微服务架构、物联网设备通信等领域。
  • 安全考量:
    • API 将请求应用程序与响应服务的基础设施分离,并在两者通信时提供安全层。
    • API 调用通常需要身份验证凭据,以确保只有授权用户或应用程序才能访问资源。
    • HTTP 头、Cookie 或查询字符串可以提供额外的安全性,用于传递认证信息或会话状态。
    • API 网关可以作为中央管理点,控制访问、实施策略、限流和进一步减少安全威胁。
    • API 隐藏了内部系统细节,只共享必要的信息,这是一种“信息隐藏”的安全实践,有助于提高系统整体安全性。
    • API 也提供了用户对权限的控制,例如,当一个应用请求访问用户位置时,用户可以决定是否允许。
API 的广泛应用使得“数据和功能即服务”成为可能

API 催生了平台经济和生态系统。随着云计算和移动互联网的发展,越来越多的服务通过 API 对外开放。银行提供支付 API,地图服务提供地理位置 API,社交媒体提供用户数据 API。这些 API 使得第三方开发者可以轻松地将这些核心功能集成到自己的应用中,而无需从头开发。这种“功能即服务”的模式极大地降低了开发门槛,加速了创新。例如,一个电商应用可以利用支付 API、物流 API、地图 API 等,快速构建一个功能完善的平台。平台公司通过开放 API,吸引大量开发者在其平台上构建应用,从而形成一个繁荣的生态系统,增加平台的用户粘性和价值。例如,微信开放平台、Apple App Store 等。API 不仅仅是技术接口,它更是一种商业模式和生态系统构建的工具。它将核心数据和功能转化为可编程的服务,使得企业能够通过开放合作,共同创造更大的价值。

参考资料

CI/CD 工作流

CI/CD

CI/CD 是持续集成(Continuous Integration)和持续交付(Continuous Delivery)/ 持续部署(Continuous Deployment)的缩写。它是一套旨在简化和加速软件开发生命周期(SDLC)的实践,是 DevOps 方法论的核心组成部分,强调开发和运维团队之间的协作与沟通,从而实现软件的快速、高质量交付。

持续集成 (CI)
  • 定义: 持续集成是指开发人员频繁(通常每天多次)地将代码更改集成到共享代码库(通常是主分支)中。
  • 自动化: 每次代码集成后,都会自动触发一系列的构建和测试过程(如单元测试、集成测试,以尽早发现和修复错误。
  • 目的: 持续集成旨在减少合并冲突,确保代码的可构建性和可测试性,从而提高代码质量和开发效率。
  • 优势: 及时发现问题,降低集成风险,确保代码库始终处于可用状态。
持续交付 (CD) 与持续部署 (CD)
  1. 持续交付 (Continuous Delivery):
    • 定义: 持续交付建立在持续集成之上,它自动化地将通过所有测试的代码版本发布到可部署的仓库中。
    • 特点: 确保软件版本随时可以可靠地部署到生产或类生产环境,但最终的发布决策仍由人工控制。这意味着代码已经准备好上线,但何时上线由团队决定。
    • 目的: 拥有一个可随时部署到生产环境的代码库,并确保以最少的工作量部署新代码。
  2. 持续部署 (Continuous Deployment):
    • 定义: 持续部署是持续交付的延伸,它将通过所有测试和验证的软件版本自动部署到生产环境,无需任何人工干预。
    • 特点: 适用于低风险应用,新功能和修复可以最快速度地推送到最终用户。
    • 目的: 进一步加速软件发布速度,实现持续接收和整合用户反馈,从而更快地响应市场变化。
    • 前提: 高度依赖完善的自动化测试,因为没有人工干预的“门禁”,任何测试失败都可能导致问题上线。
阶段 核心动作 主要目标 关键优势
持续集成 (CI) 频繁代码集成、自动化构建与测试 尽早发现错误、减少冲突、确保代码可构建 提高代码质量、降低集成风险、提升开发效率
持续交付 (CD) 自动化发布到仓库、随时可部署 确保软件版本随时可发布、降低部署工作量 加速发布周期、提高发布可靠性、促进团队协作
持续部署 (CD) 自动化部署到生产环境 快速将更新推向用户、实现持续反馈 提升业务敏捷性、最小化停机时间、持续改进产品

Mkdocs workflow

下面是 Material for Mkdocs 上推荐的 ci.yml 的内容,以此为例进行讲解:

CI for MkDocs
name: ci # 工作流的名称,在 GitHub Actions 界面中显示为 "ci"
on: # 定义触发此工作流的事件
  push: # 当有代码推送到仓库时触发
    branches: # 指定只在以下分支上触发
      - master # 当代码推送到 master 分支时
      - main # 当代码推送到 main 分支时

permissions: # 定义此工作流在运行时所拥有的权限
  contents: write # 授予对仓库内容的写入权限,这对于后续的部署操作(如将构建的静态站点推送到 gh-pages 分支)是必需的。

jobs: # 定义一个或多个作业(Job)
  deploy: # 定义一个名为 "deploy" 的作业
    runs-on: ubuntu-latest # 指定此作业运行在最新的 Ubuntu 虚拟机上

    steps: # 定义此作业中要执行的一系列步骤
      - uses: actions/checkout@v4 # 步骤:使用 actions/checkout@v4 Action。
                                 # 这个 Action 负责将代码仓库克隆到运行器(Runner)上,以便后续步骤可以访问代码。

      - name: Configure Git Credentials # 步骤名称:配置 Git 凭据
        run: | # 执行多行 shell 命令
          git config user.name github-actions[bot] # 配置 Git 用户名,用于后续的 Git 提交(例如 gh-deploy 会自动提交)
          git config user.email 41898282+github-actions[bot]@users.noreply.github.com # 配置 Git 用户邮箱

      - uses: actions/setup-python@v5 # 步骤:使用 actions/setup-python@v5 Action。
                                     # 这个 Action 负责在运行器上设置 Python 环境。
        with: # 传递给 Action 的参数
          python-version: 3.x # 指定使用最新版本的 Python 3.x

      - run: echo "cache_id=$(date --utc '+%V')" >> $GITHUB_ENV # 步骤:设置缓存 ID。
                                                               # `date --utc '+%V'` 生成当前周的周数(ISO 8601 格式),作为缓存 ID 的一部分。
                                                               # `>> $GITHUB_ENV` 将这个变量添加到 GitHub Actions 的环境变量中,以便后续步骤可以使用 `env.cache_id` 访问它。

      - uses: actions/cache@v4 # 步骤:使用 actions/cache@v4 Action。
                               # 这个 Action 用于缓存文件,以加速构建过程。
                               # 对于 MkDocs 而言,它可以缓存 Python 依赖或 MkDocs 的构建缓存。
        with: # 传递给 Action 的参数
          key: mkdocs-material-${{ env.cache_id }} # 缓存的键。如果键匹配,则恢复缓存。这里使用了之前设置的 `cache_id`。
          path: .cache # 要缓存的路径。MkDocs Material 可能会在这个目录存储缓存文件。
          restore-keys: | # 当主键不匹配时,尝试恢复的键前缀。
            mkdocs-material- # 如果 `mkdocs-material-${{ env.cache_id }}` 不存在,则会尝试寻找以 `mkdocs-material-` 开头的最近缓存。

      - run: pip install mkdocs-material # 步骤:安装 MkDocs Material。
                                       # 使用 pip 安装 MkDocs Material 及其所有依赖。
                                       # 如果之前的缓存步骤成功恢复了依赖,这一步会快很多。

      - run: mkdocs gh-deploy --force # 步骤:部署 MkDocs 站点。
                                    # 执行 `mkdocs gh-deploy` 命令,该命令会将当前 MkDocs 项目构建成静态网站,并将其推送到 GitHub Pages。
                                    # `--force` 参数表示强制推送,即使 gh-pages 分支有冲突也会覆盖。
                                    # 默认情况下,`mkdocs gh-deploy` 会将网站部署到名为 `gh-pages` 的分支。

参考资料

数据可视化

数据可视化的重要性

在信息爆炸的时代,数据量呈指数级增长,原始数据往往难以直接理解和分析。数据可视化通过图形、图表、动画等视觉方式呈现数据,将抽象的数据转化为直观的视觉元素,帮助人们更高效地理解复杂数据、发现其中隐藏的趋势、模式、相关性和异常。它将数据转化为可操作的洞察,从而支持更明智的决策制定,是数据分析不可或缺的一环。

数据可视化小贴士 中总结诸多知名厂商的 “数据可视化规范”,大体上原则如下:

数据可视化设计原则
  1. 明确目的: 在设计数据可视化之前,首先要明确其目的和目标受众。不同的目的和受众可能需要不同的可视化方式和呈现形式。
  2. 简洁明了: 避免图表过于复杂或信息过载。应保持简洁的设计风格,去除所有不必要的装饰和元素,确保图表的清晰度。使用简洁的颜色和字体,避免过多的颜色对比和字体变化,并采用合理的布局,突出重要信息,帮助用户快速理解数据。
  3. 选择合适的图表类型: 根据数据的性质、特点以及要传达的信息,选择最能展示数据特征的图表类型,如折线图、柱状图、饼图、散点图等。不同的图表类型适用于不同类型的数据展示。
  4. 颜色搭配: 合理搭配颜色,避免过多颜色的使用,确保色彩对比度足够,以便用户区分不同数据或类别。颜色应具有明确的含义,并保持一致性。
  5. 易于解读 / 可读性: 数据可视化应该易于解读和理解。添加清晰的标签、图例、注释和解释性标题等辅助信息,帮助用户准确理解图表所传达的信息。选择适当的字体和字号,并确保图表元素的间距和布局合理。
  6. 保持一致性: 在整个数据可视化方案中保持一致的设计风格和布局,使用户能够更容易地理解和比较不同的数据。
  7. 交互性: 添加交互元素,如悬停效果、筛选器、钻取(深入分析)和动画等,可以增强用户参与感和数据探索能力,使用户能够自定义和深入分析数据。
  8. 响应式设计: 确保数据可视化在不同设备(包括桌面、平板和手机)上都有良好的显示效果和用户体验。
  9. 用户反馈: 数据可视化设计是一个迭代过程。应考虑用户的反馈和需求,不断进行优化和改进,以提升用户体验。
  10. 审美和创新: 尽量使数据可视化具有美学感和创新性,吸引用户的注意力并增强信息传达效果。
  11. 准确性: 确保数据的准确性是数据可视化的基石。应选择可靠的数据来源,对数据进行初步验证,使用专业的数据处理工具,并进行多次数据校验和测试。

或者我们简单一点,大概就是:

https://antv.antgroup.com/specification/principles/basic

推荐工具与实践

data visualization 中介绍了对于少量数据常见的可视化分析工具及其前置需求; 当然,诸如 《交互的Python:数据分析入门》 等教程也是很不错的,重要的还是实践;

对于大部分人而言,python matlab 能够解决绝大多数需求。

常见数据图表类型及其适用场景

图表类型 适用场景
柱状图 (Bar Chart) 比较不同类别数据的大小;展示数据分布(如直方图
折线图 (Line Chart) 展示数据随时间变化的趋势;比较多组数据的趋势。
饼图 (Pie Chart) 展示部分与整体的关系;各类别占比(不宜过多类别
散点图 (Scatter Plot) 揭示两个变量之间的关系或相关性;发现异常点。
热力图 (Heatmap) 展示数据密度或强度;识别高密度区域(常用于矩阵数据
地图 (Map) 展示地理位置相关数据分布;区域性趋势分析。

参考资料

拓展推荐