之前,如果要为自己的网站自建权威 DNS 系统,那么(几乎)唯一的选择是 PowerDNS 加上它的 GeoIP 后端。但是 GeoIP 后端使用的是 YAML 格式的配置文件,不能与 MySQL 等数据库一同使用。这意味着必须手动配置一套跨服务器同步文件的系统,而不能使用更为成熟的数据库同步技术。 不过,PowerDNS 在最新的 4.2 版本中加入了 Lua 记录的支持。Lua 是一种专门用于「嵌入其它程序执行功能」的编程语言,你或许曾经在 nginx 上看到过它(作为一个插件)。Lua 记录支持使得 PowerDNS 可以根据用户查询请求的不同来返回不同的回答,分地区解析 GeoDNS 功能也就可以实现了。 更新 PowerDNS 最新的 PowerDNS 4.2 版本没有加入 Debian 10 的软件仓库中,你需要从 Debian Unstable 的软件仓库下载。但是由于 PowerDNS 依赖了一大堆新版的库文件,其中包括系统运行必须的库文件,...
学校网络中自建 VLAN,低价实现高速私有内网
和全国大多数高校一样,我所在的大学以「一人一账号」的方式提供网络。通过有线网络或者 Wi-Fi 联网时,所有请求会被暂时重定向到一个登录界面(即 Captive Portal),输入用户名密码后才可以访问互联网。这个做法也是大多数公共场所(例如机场,咖啡厅)的标配,对于电脑、手机等设备也还算友好。但是一些不带显示屏的设备(例如树莓派,ESP8266 等)就难以访问网络了。 对于树莓派、ESP8266 等可以运行自定义代码的系统,可以模拟提交表单来登录网络,但是一旦模拟提交表单的程序出现问题,你就得手动将设备取下来,连上自己的电脑上传新的登录程序,这一过程非常的麻烦。至于其余只能运行预定程序的智能设备就完全无法联网了。由于我并没有智能台灯等设备,本文暂时只考虑可以运行 Windows、macOS、Linux 三大操作系统之一的智能设备,包括电脑及单板计算机(Single Board Computer)。 另外还有几个小问题: 我的寝室里只有一个网络端口供我使用,...
OS/2 Warp 4 系统试用及安装 Firefox
OS/2 是起初由 IBM 与微软公司联合开发,后续由 IBM 维护的操作系统。在上世纪 90 年代,OS/2 是 Windows 的有力竞争者,但 OS/2 后续在市场上被 Windows 系列击败,IBM 也在 2006 年 12 月 31 日最终停止了 OS/2 Warp 4 的技术支持。 但是,这并不意味着 OS/2 的死亡。在官方技术支持终止后,Serenity System 公司接手了 OS/2 的开发,并以 eComStation 的名字继续开发;2015 年,另一家公司 Arca Noae LLC 也推出了一款基于 OS/2 的发行版 ArcaOS,并且作为商业产品出售。 同时,开源社区也在为 OS/2 提供一些技术支持。开源社区在 OS/2 上交叉编译了常用的 Unix 工具(例如 ls,rm 等),RPM/YUM 包管理器,以及一系列的库。这使得 1996 年就发布的 OS/2 Warp 4 系统可以运行一些(相对)现代的应用程序,例如 Firefox 45.9 浏览器。 本文中,我将介绍在 VirtualBox 虚拟机中安装 OS/2 Warp 4 操作系统,并且安装 Firefox 浏览器。...
(怀旧)ATduck 虚拟 Modem 拨号上网
今年真的是 9102 年了吗? 是的。 出于怀旧的目的,我想尝试一下在 Windows 2000 等旧操作系统中拨号上网。当然,在 2019 年绝大部分人都已经不会有使用电话线的调制解调器,甚至不会知道曾经有它存在。现在的电脑也早已没有了电话线接口,ISP 也不再提供拨号上网服务。 Doge Microsystems 的这篇文章 提供了自建拨号上网 ISP 的一种方法。文章作者购买了硬件电话 Modem,使用 Asterisk 建立了基于 SIP 的网络电话交换网,然后使用 Analog Telephone Adapter(ATA,模拟电话转 SIP 网络电话的设备)将 Modem 连接上交换网。同时作者使用 Linux 下的 mgetty 操作 Modem,结合 pppd 提供了一个 PPP 拨号服务。 这样操作的主要问题是:一整套设备太贵,而且也占地方。这个作者用来拨号的是一台物理的 Windows 98 主机,而不是像我一样使用虚拟机。如果我采用类似的方案,我还需要各种转换线以及 Hub 才能将所有设备连上主机,并且还要在虚拟机软件中设置直通。...
与 Hexo 配合使用 Sass 和 Webpack
为何使用 Sass 和 Webpack Sass 是 CSS 的超集,在 CSS 的基础上扩展了大量的语法,支持规则嵌套、变量定义、include 等功能,也可以进行数学运算。主要功能可以在 官方入门教程 中查看。Sass 原先的文件格式扩展名是 sass,其结构类似 yaml,似乎不与传统 CSS 兼容;而目前 Sass 的文件格式是 scss,兼容 CSS 文件。 我使用 Sass 的目的,一是更加清晰的 CSS 规则管理。例如,我有一些 CSS 规则希望只对网站顶栏生效,我就可以将它们全部放到一个代码块中方便管理: header { h1 { ... } } 二是减少网页加载时的 CSS 代码量。虽然我的网站使用了 Bootstrap,但是我只使用了一小部分功能,即 Bootstrap 的栅格系统,导航栏和下拉菜单,其它大部分功能都没有使用,这部分 CSS 就不必加载。同时,我还通过 CSS !important 覆盖的方式对一些 Bootstrap 的颜色、形状进行了自定义,这也引入了额外的代码量。 我在我的 scss 文件中定义了全局的控件颜色、字体大小等,...
开始使用 Hexo 静态网站生成器
什么是静态网站生成器 我们常用的 WordPress、Typecho 等 CMS(内容管理系统)都是动态网站。当用户访问网页时,服务端运行使用 PHP、Python、Node.js 等语言的程序,根据用户的请求 实时 产生网页,将其返回给用户。 而 Jekyll、Hexo、Hugo 等静态网站生成器采取的是另一种方法: 提前 预测用户的请求,一次性产生对应的 HTML 文件。 这两种方式的主要优缺点如下: 谁更占优 动态网站 静态网站 动 可以实现复杂的交互,根据用户的输入随时改变内容 只能响应预定的输入,灵活性差 动 大多数 CMS 都会提供易用的管理后台,方便用户随时更新内容 没有在线后台,需要在本地安装额外软件更新网站内容 静 安装脚本运行环境需要较复杂的配置 服务端无需脚本运行环境,几乎无需服务端任何配置 静 实时产生网页需要较大的运算量(包括脚本运行、数据库查询),对服务器造成较大的压力 服务端几乎无需计算,响应速度极快 静 如果需要迁移服务器,...
(自建 NTP)在 Tinker Board 上使用 PPS
在 前一篇文章 中,我使用 Tinker Board 和 ATGM336H GPS/北斗模块自建了 NTP 服务器,以 GPS 作为时间基准。GPS 模块除了提供传统的串口输出 NMEA 语句之外,还额外提供了一个 PPS 信号,这个信号会每秒变化一次。原本 gpsd 需要不断解析 GPS 模块传来的 NMEA 语句,需要耗费不短的时间,并且容易被其它程序抢占运行时间,产生 delay(延迟)和 jitter(波动)。而 PPS 信号可以直接触发 CPU 的中断,运行一个简单的处理程序,让操作系统以高优先级处理,不会被其它程序影响。 一般而言,在 Linux 中,PPS 由内核直接提供驱动支持。但是在前文中,由于 Tinker Board 的 Armbian Linux 内核没有提供 PPS 支持,所以我们没法直接开启。 解决方法 1:重新编译内核 如果内核没有对应支持,那就重新编译内核,加上功能就好。 Tinker Board 论坛上的这篇帖子 中提供了一个内核补丁,为内核加上了 PPS 支持。打上补丁、编译内核后,将 PPS 信号连到第 22 针,...
自建基于 GPS 的 NTP 服务端
NTP 是什么 NTP(Network Time Protocol)是目前使用最广泛的互联网时间同步协议。我们常用的 Windows、macOS、Linux 等都自带了 NTP 客户端,可以连接远程服务器获取当前的时间。例如,Windows 的 Internet 时间同步功能就是基于 NTP: (图片来自网络) Windows 默认会连接到 time.windows.com 这台由微软维护的 NTP 服务器同步时间。但是,默认的这台服务器在国内并不好用。这台服务器位于美国,到国内的延迟很大并且容易波动,因此 NTP 客户端也很难得出准确的时间。 那么中国大陆有没有 NTP 服务器呢?有,但是不多: cn.pool.ntp.org 由 www.pool.ntp.org 维护的 NTP 服务器池项目,所有服务器由志愿者提供,在各个地区通过 DNS 负载均衡到不同的服务器上。 现在(2019 年 9 月 16 日)共有 63 台服务器位于 CN 池内(但不是所有的服务器都在国内) 可以通过 0.cn.pool.ntp.org,1.cn.pool.ntp.org 等方式获得更多的服务器 cn.ntp.org....
使用 GPP 预处理 Dockerfile,实现 #include、#if 等功能
由于我有多种架构的设备运行 Docker(包括 x86_64 的电脑和服务器,ARM32v7 的 Tinker Board 和 ARM64v8 的树莓派 3B),我的每个 Docker 镜像都要构建多种版本。最初我 给每个架构单独写一份 Dockerfile ,但是很明显这样难以统一管理,在软件更新修改 Dockerfile 时经常漏改文件。之后,我用的是 Docker 的构建参数功能 ,即 --build-arg 参数,根据参数来调用不同的基础镜像、下载不同文件。 但是这样还是有很大的局限性。首先,不同项目对不同架构的称呼是不一样的。例如,我们平时说的 x86 32 位架构,i386,就被 Go 以及众多使用 Go 的项目叫做 386。类似的,ARM32v7 也可以叫做 ARMHF,而 ARM64v8 有三种写法(ARM64v8,ARM64,AARCH64)。之前,我就不得不用 bash 脚本转换出不同的称呼组合在不同的地方使用,但是这样做就需要设置很多的变量,非常麻烦。 另外,有些镜像在特定架构下需要特殊处理。例如,...
Cyclone IV FPGA 开发踩坑记录
上学期,学校开设了一门数字电路课程,使用 FPGA 进行开发。在课程结尾,我们需要分成小组,利用 FPGA 自由设计电路的特性实现复杂的功能,例如制作一款游戏、运行卷积神经网络等等,并且可以按自己喜好加入各种额外的功能。 我们小组实现了一款类似《雷电》的游戏,实际上就是操控飞机发射子弹攻击敌人。实现的额外功能(课程内容除外)包括: 640x480,16 位色深的 VGA Framebuffer,存储在 SRAM 芯片上 相应的,内置了简体中文字库(包含整个 UTF-8 中文范围,但不包括标点符号(懒)) 也支持修改 Y 轴偏移量快速滚动屏幕,为了实现飞行效果 SRAM 控制器/芯片以二倍频率工作,让 FPGA 上的软 CPU 和 VGA 控制器同时访问,不存在抢占问题 最多 8 架飞机(包括敌方我方),可以完全自定义图片(非调色板,非索引),全屏幕自由移动 最多 56 发子弹(包括敌方我方),可以修改大小颜色,全屏幕移动 使用 WM8731 音频芯片循环播放长达约 5 分钟的 BGM,...