分类

小米10S 手机的体验

最近一直想换个手机, 之前的 iPhone 用了四年多, 换了电池, 续航还算给力, 可是它的外放声音实在太小, 而且有时接听电话没有声音, 很不方便. 最大的问题还是信号差, 10 月份去北京出差办理入住时一直没有信号, 还是用了同事的热点才成功入住的, 很尴尬.

两天前换了小米 10S 这款手机, 体验了两天, 用起来太费心思.

阅读全文 "小米10S 手机的体验" »

查看动态库的依赖关系树

今天调试一个内存泄露的问题, 表现是在 amd64 的机器上进程正常退出, 而 arm64 上会出现 指针错误.

$ ./lithium https://bing.com
[1223/105725.272479:INFO:command_line_ipc_client.cpp(58)] args item: ./lithium
[1223/105725.272716:INFO:command_line_ipc_client.cpp(58)] args item: --disable-gpu
[1223/105725.272742:INFO:command_line_ipc_client.cpp(58)] args item: --enable-print-preview
[1223/105725.272787:INFO:command_line_ipc_client.cpp(58)] args item: https://bing.com
[1223/105725.272809:INFO:command_line_ipc_client.cpp(58)] args item:
Found existing runtime, exit now!
*** Error in `./lithium': free(): invalid pointer: 0x00000000402c2f30 ***

这里, 先用 gdb 追踪了一下, 发现在 main() 函数退出后, 执行全局对象的 dtor() 时出了问题. 单步执行来追查, 发现是 protobuf 库在析构时挂了.

之后, 又使用 valgrind 来确认, 同样定位到了相同的问题点:

阅读全文 "查看动态库的依赖关系树" »

处理小米电视的广告

昨天终于回家了。

晚上家人看电视剧时,我发现每次切换一集,就会自动播放 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 端口转发" »