处理小米电视的广告
昨天终于回家了。
晚上家人看电视剧时,我发现每次切换一集,就会自动播放 86
秒左右的广告,无法跳过。
相当的坑,每集都这样。
吃了晚饭后,就开始折腾了,找了一些资料,发现确实是可以通过过滤小米服务器域名的 方式来跳过广告的。路由器上跑的 openwrt,这个功能自然很容易配置。
结合了之前的域名黑名单,生成的最终的配置文件是这个 dnsmasq.conf.add。
cargo sccache 缓存加速编译过程
默认情况下, cargo 在编译一个项目的第三方依赖时, 会缓存编译好的结果, 以便加速 之后编译速度.
但是, 对于跨工作区(workspace)的项目来说, 并不能很好地缓存这些第三方库编译后生成的 文件; 为此, mozilla 组织开发了 sccache 项目.
安装它也很简单, 分两步. 第一步在终端安装它:
$ cargo install sccache
netstat 常用命令
netstat
作为调试网络问题的必备工具, 有些常用选项, 在这里记录一下.
- 显示路由表:
netstat -r
- 显示所有连接:
netstat -a
- 显示所有
TCP
连接:netstat -at
- 显示所有
UDP
连接:netstat -au
- 显示所有的
TCP
监听服务:netstat -lt
- 列举网络接口:
netstat -ie
- 最常用选项:
netstat -plent
显示本地TCP
监听服务及其对应的进程信息
Rust 语言受限的地方
最近半年陆续写了很多的 Rust 代码,跟别的语言相比,它有些地方还是蛮受限的,在表达 一个功能时需要各种弯弯绕,下面就列举几个方面的问题。
struct/union 不支持嵌套
类型嵌套可以将关联的数据结构放在一起,这个在C语言里是很常用的。像内核提供的系统
调用,比如 bpf()
以及 io_uring_setup()
,都有大量的使用。它们都是定义了一堆的
操作指令(operation-code, op-code),以及一个公用的 union
联合体,跟据不同的
操作指令来解析 union
为不同的结构。尤其是 bpf()
系统调用,使用一个接口就实现了
内核 BPF
虚拟机的所有操作,相当的强大和复杂。
在使用Rust为类似这样的 C
接口做绑定时,会很麻烦。需要先将嵌套的结构体以及 union
联合体拆成独立的片段,然后再依次组装到一起,这样写的代码,其可读性并不好,也更难
维护。
重新编译 linux 内核,开启 btf
默认的 archlinux 内核包并不包含对 BTF(BPF Type Format) 的支持,需要我们手动开启,
目前的内核版本是 5.6.4
,我们使用 yaourt
来安装。
首先是安装 pahole
这个依赖包:
yaourt -S pahole
目前的 pahole
版本要依赖 libebl
库,而这个库并不是必需的,可以给它创建一个
软链接指向 libelf.so
即可。
cargo-update:更新 rust 二进制程序
使用 cargo install
安装了一些 rust 工具到本地后,如果再想着要更新它们时,需要
手动一个个更新,比较麻烦。可以使用 cargo-update
这个工具来批量更新。
首先把它安装到系统里:
$ cargo install cargo-update
之后就可以尝试着更新本地的可执行文件了:
$ cargo install-update --all
下载 deb 安装包及其依赖包
这两天要为离线的 arm 服务器安装几个 deb 包,因为这些包都有许多上游的依赖包,得 一起把它们下载到本地。
这里以 ubuntu 18.04 (bionic) 为例,下载 arm64 架构的几个包。
首先就是配置安装源,因为本地环境不是 ubuntu,需要先搞一个 ubuntu 的环境,可以 考虑使用 docker 或者 debootstrap。这里选择使用后者,操作起来要更简单。
配置 ubuntu 18.04 amd64 环境
sudo debootstrap bionic rootfs http://mirrors.aliyun.com/ubuntu
这里用的是阿里云的安装源,系统目录位于 rootfs
。
ssh 端口转发
有时需要临时在本地访问一下服务器上的未公开访问权限的服务,可以用 ssh 将此服务的
端口重映射到本地。使用起来也很简单,比如之前常用的 X11Forward
类似实现的。
下面以访问服务器的 127.0.0.1:8080
web 服务为例说明:
ssh -p 22 -v -N -L 0.0.0.0:8080:127.0.0.1:8080 user@example.com
以上命令即可将服务器上 8080
端口的服务映射到本地网络。其中各个参数的意义是:
-p 22
为服务器上的sshd
服务的端口号,默认是22
,可以略去这个选项-v
交互式模式,会打印一些日志到终端里;可以略去-N
表示不在服务器端执行命令,这样就不会打开服务器上的远程终端;可以略去-L 0.0.0.0:8080:127.0.0.1:8080
将服务器上的8080
映射到本地的8080
端口user@example.com
是ssh
服务的用户名及服务器地址
之后就可以在本机浏览器里面访问 http://127.0.0.1:8080
地址了。
运行 gitk 时提示缺少 wish 命令
gitk 命令可以方便地查看 git 仓库中某个文件的更改历史。
但是 archlinux 平台上运行这个命令时却提示如下错误:
/usr/sbin/gitk: line 3: exec: wish: not found
查了一下, 发现是没有安装 tk
工具包,手动安装它即可:
sudo pacman -S tk
这个问题蛮早就有人反馈给上游了,目前还没有把它加到包依赖列表里。
gcc 编译选项
最近常用的 GCC 编译选项:
g++ -std=c++14 -Wall -Wextra -Werror -Wfatal-error -pedantic-error
其中:
-std=c++14
, 使用 C++14 的标准-Wall
, 打开大多数编译警告选项-Wextra
, 打开额外的编译警告选项-Werror
, 将编译警告转为编译报错,进而退出编译过程-pedantic-error
, 如果有违背 ISO C++ 标准, 有使用了语言扩展, 旧的语言特性等情况时, 都会报错