Lan Tian @ Blog

(怀旧)ATduck 虚拟 Modem 拨号上网

今年真的是 9102 年了吗? 是的。 出于怀旧的目的,我想尝试一下在 Windows 2000 等旧操作系统中拨号上网。当然,在 2019 年绝大部分人都已经不会有使用电话线的调制解调器,甚至不会知道曾经有它存在。现在的电脑也早已没有了电话线接口,ISP 也不再提供拨号上网服务。 Doge Microsystems 的这篇文章提供了自建拨号上网 ISP 的一种方法。文章作者购买了硬件电话 Modem,使用 Asterisk 建立了基于 SIP 的网络电话交换网,然后使用 Analog Telephone Adapter(ATA,模拟电话转 SIP 网络电话的设备)将 Modem 连接上交换网。同时作者使用 Linux 下的 mgetty 操作 Modem,结合 pppd 提供了一个 PPP 拨号服务。 这样操作的主要问题是:一整套设备太贵,而且也占地方。...

与 Hexo 配合使用 Sass 和 Webpack

为何使用 Sass 和 Webpack Sass 是 CSS 的超集,在 CSS 的基础上扩展了大量的语法,支持规则嵌套、变量定义、include 等功能,也可以进行数学运算。主要功能可以在官方入门教程中查看。Sass 原先的文件格式扩展名是 sass,其结构类似 yaml,似乎不与传统 CSS 兼容;而目前 Sass 的文件格式是 scss,兼容 CSS 文件。 我使用 Sass 的目的,一是更加清晰的 CSS 规则管理。例如,我有一些 CSS 规则希望只对网站顶栏生效,我就可以将它们全部放到一个代码块中方便管理: 123header { h1 { ... }} 二是减少网页加载时的 CSS 代码量。虽然我的网站使用了 Bootstrap,但是我只使用了一小部分功能,即 Bootstrap 的栅格系统,导航栏和下拉菜单,...

开始使用 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:重新编译内核 如果内核没有对应支持,那就重新编译内核,...

自建基于 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 负载均衡到不同的服务器上。...

使用 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)。之前,...

Cyclone IV FPGA 开发踩坑记录

上学期,学校开设了一门数字电路课程,使用 FPGA 进行开发。在课程结尾,我们需要分成小组,利用 FPGA 自由设计电路的特性实现复杂的功能,例如制作一款游戏、运行卷积神经网络等等,并且可以按自己喜好加入各种额外的功能。 我们小组实现了一款类似《雷电》的游戏,实际上就是操控飞机发射子弹攻击敌人。实现的额外功能(课程内容除外)包括: 640x480,16 位色深的 VGA Framebuffer,存储在 SRAM 芯片上 相应的,内置了简体中文字库(包含整个 UTF-8 中文范围,但不包括标点符号(懒)) 也支持修改 Y 轴偏移量快速滚动屏幕,为了实现飞行效果 SRAM 控制器/芯片以二倍频率工作,让 FPGA 上的软 CPU 和 VGA 控制器同时访问,不存在抢占问题 最多 8 架飞机(包括敌方我方),可以完全自定义图片(非调色板,非索引),...

在 DN42 中使用 Docker 建立 Anycast DNS 服务

2020-03-16 提示 本文中的方案已有更新版本:参见《Docker 容器共享网络命名空间,集成 Bird 实现 Anycast 高可用》。 建议阅读本文的概念介绍部分及 Bird 的大致配置,配合上文的 Docker 部署方案使用。 什么是 Anycast 互联网上常用的路由协议 BGP 是这样工作的:我在 DN42 拥有 IP 段 172.22.76.104/29,我通过 BIRD 等 BGP 软件,“宣告”这台服务器上可以访问到 172.22.76.104/29 这个 IP 段。与我有 Peering 的其它服务器记录下这一条消息:“通过某条路径,走 1 格可以访问到 172.22.76.104/29”,并且向与它们有 Peering 的服务器继续宣告:“这台服务器距离 172.22.76.104/29 只有 1 格距离”。以此类推,其余服务器也通过类似的流程,...

Typecho 主题性能优化和缓存

为了实现 Lightbox、代码高亮等功能,我在我的博客主题中写了一些后处理代码,对 Typecho Markdown 输出后的 HTML 代码再进行一层处理。但是因为我的博客历史文章较多,我在不同时期也用了不同的编辑器(WordPress 编辑器,百度 UEditor 等等),为了尽可能保证历史文章也能正常显示,我的处理逻辑比较复杂。再加上我用的廉价 VPS 性能本就不怎么样,相应的网页加载时间也较长。 我在 nginx 配置中添加了这样一行,以在 HTTP 头中输出网页在服务器端处理的用时: 1add_header LT-Latency $request_time; 最初,这个值是 0.25 左右,代表着每个网页需要在服务器端处理 250ms 之久。于是,我在大概一年前(2018 年 3 月 11 日,《大幅优化了博客主题性能》)大改了一轮后处理逻辑,修改点大致如下: 原先,...

树莓派 3B 折腾笔记:串口拨号上网

今年是 9102 年了吗? 是的。 为什么要这样做 我手上有一块树莓派 3B 和一块华硕的 Tinker Board。有的时候,因为 Wi-Fi 爆炸/配置出错/pacman -Syu 滚挂系统之类的原因会导致其中一块板子断网。通过连接两块板子的串口,再在上面建立拨号上网连接,就可以在一块板子 Wi-Fi 或有线网中断时,从另一块板子上 SSH 上去解决问题。 (另外买树莓派不折腾 GPIO 的话,还不如买个 x86 的凌动小主机之类的玩) 怎么操作 硬件方面,将两端的串口连接起来。树莓派的串口是第 8 根针发送,第 10 根针接收,可以在 pinout.xyz 网站查到。Tinker Board 的串口也是 8 发送 10 接收。用两根杜邦线将树莓派的针 8 连接到 Tinker Board 的针 10,将树莓派的针 10 连接到 Tinker Board 的针 8。...