分类

处理小米电视的广告

昨天终于回家了。

晚上家人看电视剧时,我发现每次切换一集,就会自动播放 86 秒左右的广告,无法跳过。 相当的坑,每集都这样。

吃了晚饭后,就开始折腾了,找了一些资料,发现确实是可以通过过滤小米服务器域名的 方式来跳过广告的。路由器上跑的 openwrt,这个功能自然很容易配置。

结合了之前的域名黑名单,生成的最终的配置文件是这个 dnsmasq.conf.add

阅读全文 "处理小米电视的广告" »

cargo sccache 缓存加速编译过程

默认情况下, cargo 在编译一个项目的第三方依赖时, 会缓存编译好的结果, 以便加速 之后编译速度.

但是, 对于跨工作区(workspace)的项目来说, 并不能很好地缓存这些第三方库编译后生成的 文件; 为此, mozilla 组织开发了 sccache 项目.

安装它也很简单, 分两步. 第一步在终端安装它:

$ cargo install sccache
阅读全文 "cargo sccache 缓存加速编译过程" »

netstat 常用命令

netstat 作为调试网络问题的必备工具, 有些常用选项, 在这里记录一下.

  1. 显示路由表: netstat -r
  2. 显示所有连接: netstat -a
  3. 显示所有 TCP 连接: netstat -at
  4. 显示所有 UDP 连接: netstat -au
  5. 显示所有的 TCP 监听服务: netstat -lt
  6. 列举网络接口: netstat -ie
  7. 最常用选项: netstat -plent 显示本地 TCP 监听服务及其对应的进程信息
阅读全文 "netstat 常用命令" »

Rust 语言受限的地方

最近半年陆续写了很多的 Rust 代码,跟别的语言相比,它有些地方还是蛮受限的,在表达 一个功能时需要各种弯弯绕,下面就列举几个方面的问题。

struct/union 不支持嵌套

类型嵌套可以将关联的数据结构放在一起,这个在C语言里是很常用的。像内核提供的系统 调用,比如 bpf() 以及 io_uring_setup(),都有大量的使用。它们都是定义了一堆的 操作指令(operation-code, op-code),以及一个公用的 union 联合体,跟据不同的 操作指令来解析 union 为不同的结构。尤其是 bpf() 系统调用,使用一个接口就实现了 内核 BPF 虚拟机的所有操作,相当的强大和复杂。

在使用Rust为类似这样的 C 接口做绑定时,会很麻烦。需要先将嵌套的结构体以及 union 联合体拆成独立的片段,然后再依次组装到一起,这样写的代码,其可读性并不好,也更难 维护。

阅读全文 "Rust 语言受限的地方" »

重新编译 linux 内核,开启 btf

默认的 archlinux 内核包并不包含对 BTF(BPF Type Format) 的支持,需要我们手动开启,

目前的内核版本是 5.6.4,我们使用 yaourt 来安装。

首先是安装 pahole 这个依赖包:

yaourt -S pahole

目前的 pahole 版本要依赖 libebl 库,而这个库并不是必需的,可以给它创建一个 软链接指向 libelf.so 即可。

阅读全文 "重新编译 linux 内核,开启 btf" »

下载 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

阅读全文 "下载 deb 安装包及其依赖包" »

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.comssh 服务的用户名及服务器地址

之后就可以在本机浏览器里面访问 http://127.0.0.1:8080 地址了。

阅读全文 "ssh 端口转发" »

运行 gitk 时提示缺少 wish 命令

gitk 命令可以方便地查看 git 仓库中某个文件的更改历史。

但是 archlinux 平台上运行这个命令时却提示如下错误:

/usr/sbin/gitk: line 3: exec: wish: not found

查了一下, 发现是没有安装 tk 工具包,手动安装它即可:

sudo pacman -S tk

这个问题蛮早就有人反馈给上游了,目前还没有把它加到包依赖列表里。

阅读全文 "运行 gitk 时提示缺少 wish 命令" »

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++ 标准, 有使用了语言扩展, 旧的语言特性等情况时, 都会报错
阅读全文 "gcc 编译选项" »