从何时开始怕遥望星辰?

使用 Warp + Cloudflare Tunnel 在 IPv6 单栈服务器上搭建代理

由于战争的原因,俄罗斯当局对互联网的封锁日益严重(Twitter、Google News);加之包括 Dell、Microsoft、OpenAI、Cisco、Apple 等国际软硬件厂商因为制裁退出俄罗斯市场,很多网站甚至直接 ban 了整个俄罗斯地区的 IP,搭建一个合适的代理服务对于正常访问国际互联网是十分有必要的。

使用 Warp + Cloudflare Tunnel 在 IPv6 单栈服务器上搭建代理

使用CFW Parser处理订阅更新内容

无论是在国内还是俄罗斯,想要正常的访问国际互联网,都需要借助代理工具;本文中使用的是 Clash for Windows 的 MacOS 客户端。

而大多数机场提供的 Clash 订阅链接都包含了 Rules 规则 —— 这是为了方便国内用户,减少用户的配置负担;但是如果按照机场给定的 Rules 代理,很多在俄罗斯本没有必要代理的网站也会使用走代理,这不但会浪费流量,很多情况下也会减慢网速。

CFW 提供了名为 Parser 的功能用于解决这个问题。

使用CFW Parser处理订阅更新内容

快速平方根算法 - 从卡马克的魔法数字谈起

大家应该都听说过雷神之锤 3 中那段神奇的快速平方根倒数算法 —— 它因为使用了魔法数字:0x5f3759df 而闻名:

1
2
3
4
5
6
7
8
float InvSqrt(float x) {
float xhalf = 0.5f*x;
int i = *(int*)&x;
i = 0x5f3759df - (i >> 1);
x = *(float*)&i;
x = x*(1.5f - xhalf*x*x);
return x;
}

事实上,这个算法使用的方法是传统的牛顿迭代法 —— 之所以它能够在常数时间内给出结果,是因为这个魔法数字可以让迭代开始时的值就已经很接近实际根了。

下面我从牛顿迭代开始,一步步实现一个快速平方根算法,并探究这个魔法数字到底是怎么来的。

快速平方根算法 - 从卡马克的魔法数字谈起

DNSSEC 技术详解

DNS 系统最早在 1983 年的 RFC 882 就有定义与技术实现了;作为最重要的互联网基础设施之一,我们必要对它进行足够的了解;而在如今国内复杂的网络环境下,原始的 DNS 协议也经常无法正常工作,为了保证 DNS 查询结果的可信,又诞生了 DNSSEC、DNSCrypt、DoT 甚至 DoH 这类的技术。

本文将主要介绍和讨论 DNSSEC 的工作原理、复习一些较为容易混淆的 DNS 中的概念、最后将会介绍一些 DNS 新技术。

您可能需要有对传统 DNS 协议的工作流程有基本的了解;以及对 TCP/IP 协议、数字签名技术有一个大致的了解(不用十分深入)作为知识基础。

DNSSEC 技术详解

Vercel Serverless 与 Flask 体验

前段时间有个小应用要部署上线,倒也不复杂:接口收到前端请求之后返回一张动态生成的图片就行。

由于 没有服务器只能白嫖 想要体验世界上最流行、先进的 Serverless 函数计算,正好博客部署在 Vercel,所以看了看 Vercel 的官方 Documentation,发现他们也可以部署一些函数计算,支持的语言有:

  • Node.js
  • Go
  • Python
  • Ruby

我对 Python 比较熟悉,于是就顺手用 Flask 写了一个服务;部署时候遇到了一些坑,在这里记录一下。

Vercel Serverless 与 Flask 体验

ucos 原理 - 任务调度分析

上面说过了 uCOS-II 通过不断的在任务之间切换实现任务调度,这一个小节我们来分析 uCOS-II 到底是如何调度任务的。

首先我们要清楚,既然用户给定的任务是一个个无穷循环,所以操作系统肯定不能指望任务自己放弃 CPU 的使用权,让给其他的函数去执行;相反的,当一个任务执行一段时间之后,我们的 OS 就需要“强行的”从它手里拿到处理器的时间,这样的操作系统被称为 抢占式 的,相反那种不同任务之间 Co-operate 的,就叫做 非抢占式 的。

可我们的 OS 是怎么做到 “抢占” 的动作呢?

ucos 原理 - 任务调度分析

uCOS 原理 - 任务概览

uCOS-II 中的一个重要组成部分就是 任务,因为大多数嵌入式设备的处理器能力有限,所以大多的 RTOS 都采用了多进程/单线程模型;这就意味着 OS 需要通过在不同的任务之间切换,而如何创建、管理任务就成为了一个重要的组成部分。

任务基础

uCOS-II 的任务通常就是一个无限的循环,就像我们在裸机编程时使用的循环一样:

1
2
3
4
5
void task(void* pdata) {
while (true) {
/* Working code */
}
}

那么问题就来了,既然每个任务都是无穷循环,如何从一个任务跳转到另一个任务中呢?

uCOS 原理 - 任务概览