通过物理 Hack 上小区天台并记录一些数据

最近使用物理 Hack 的方法(开锁),上了小区的天台打算在上面架设端馈天线。我打算把天线两端固定在钢管上,大概需要一些 U 形卡扣。所以我用拼多多上买的游标卡尺上去测量了一些数据:

通风口钢管

钢管外径 (48mm)
钢管内径(39mm)

护栏钢管

垂直着测出的外径(48mm)
然后发现有一截高出来,这是水平的。(48mm)
横向的钢管稍细一点(33mm)

通风口上铁棍

这根很稳固,也可以用来固定(10mm)

总结

公称通径DN和钢管外径φ管通环内径对照表(A系列是英制管,B系列是公制管)

查表知,小区天台的钢管有两种都为英制管,大一点的是 DN40(1寸半管)、小一点的是 DN25(1寸管)。

密钥签名派对 —— Caff 的配置与使用

Caff 是 signing-party 包的一个实用工具,可以签名一个密钥并邮寄给所有者。Caff 是一个 Perl 脚本,发件需要配置 MTA(邮件传输代理)这里使用 msmtp 来连接到一个 Relay (SMTP 服务器)。

配置 MTA

配置 MTA 非常简单,先安装 msmtp, msmtp-mta 然后创建 .msmtprc 文件:

# Set default values for all following accounts.
defaults
auth           on
tls            on
tls_trust_file /etc/ssl/certs/ca-certificates.crt
logfile        ~/.msmtp.log

# autistici
account        autistici
host           smtp.autistici.org
port           465
tls_starttls   off
from           a@b.c
user           a@b.c
password       xxxxx

# Set a default account
account default : autistici

在配置完以后,你应该能用 mail -s "test_email" user@mailprovider.com 来发送一条测试邮件。如果出了问题可以查看 .msmtp.log

Caff 的配置文件会在第一次运行时生成,里面有有关选项的注释。这是我的配置文件:

# .caffrc -- vim:ft=perl:

$CONFIG{'owner'} = 'William Goodspeed';
$CONFIG{'email'} = 'goodspeed@anche.no';

$CONFIG{'keyid'} = [ qw{2945CED1C88E763DB6FFBCE247FFB4C9CB4F5319} ];

$CONFIG{'local-user'} = [ qw{2945CED1C88E763DB6FFBCE247FFB4C9CB4F5319} ];

# Mail template to use for the encrypted part
$CONFIG{'mail-template'} = << 'EOM'; Hi, please find attached the user id{(scalar @uids >= 2 ? 's' : '')}
{foreach $uid (@uids) {
    $OUT .= "\t".$uid."\n";
};}of your key {$key} signed by me.

If you have multiple user ids, I sent the signature for each user id
separately to that user id's associated email address. You can import
the signatures by running each through `gpg --import`.

Note that I did not upload your key to any keyservers. If you want this
new signature to be available to others, please upload it yourself.
With GnuPG this can be done using
       gpg --keyserver pool.sks-keyservers.net --send-key {$key}

If you have any questions, don't hesitate to ask.

Regards,
{$owner}
EOM

用 Jenkins 构建 Android 原生库

因为最近有在尝试移植 Darkplaces 引擎到 Android,而且电脑太垃圾,所以打算让我的 Jenkins 服务器为我分担一部分。

要移植 Android 的原生程序就需要一并构建相关的依赖,一些依赖的构建挺消耗性能,还有一些依赖的构建不能一步到位。Freetype2 就属于后者,其构建需要运行 ./configure 脚本,而 Android 自带的 ndk-build 不允许这个。对应的构建需要 NDK 的独立编译链,然后一一执行配置脚本,生成指定架构的库。所以,我想这时候 Jenkins 就能派上用场了。

Jenkins 的作业配置

要让一个作业给多个架构构建肯定要参数化,这里 Jenkins 提供了构建矩阵。构建矩阵可以设置多个不同的维度(参数)列表,然后生成一个矩阵(表格),为他们依次构建。一个有 Arch 参数和 Whatever 参数的矩阵长这样:

+---------------+---------+-------+----------+-------+
| Arch/Whatever |  arm64  |  arm  |  x86_64  |  x86  |
+---------------+---------+-------+----------+-------+
|       1       | arm64,1 | arm,1 | x86_64,1 | x86,1 |
|       2       | arm64,2 | arm,2 | x86_64,2 | x86,2 |
+---------------+---------+-------+----------+-------+

但我们这里只有一个参数——架构,所以和一个列表差不多。

要配置这样的作业,在 Jenkins 中新建作业并选择构建一个多配置项目。然后在配置矩阵那里,新建新的维度(Axis)里面填上名字(建议全英文,因为这是变量名)然后在值里面填入对应的需要的值,以空格分割。我这里是这样的:

Arch 维度中有 aarch64 armv7a i686 x86_64 四个值

然后就可以编写对应的构建脚本里,在脚本中维度的名字是个变量。下面是 Freetype2 作业的构建脚本:

./autogen.sh
./configure --host=${arch}-linux-androideabi --prefix=/out-${arch} --without-brotli --without-bzip --without-zlib --with-png=no --with-harfbuzz=no
make
rm -rf $(pwd)/out-${arch}
make install DESTDIR=$(pwd)

成果

修复 Nvidia 显卡在 GNU/Linux 下的画面撕裂

最近发现使用 Nvidia 专有驱动时会有画面撕裂(但比 Nouveau 可以接受)。但是我用 VLC 看电影还有撕裂就忍不了了。

在 Arch Linux Wiki 的 NVIDIA/Troubleshooting 中介绍了画面撕裂的解决办法。据报道,启用 Full Composite Pipeline 可能会降低 OpenGL 的性能,和可能让 WebGL 出现问题。但我觉得还是看电影不撕裂更重要一点。:-p

解决方法

首先安装 nvidia-settings,然后执行 nvidia-settings -query CurrentMetaMode 你会看到类似下面的内容:

  Attribute 'CurrentMetaMode' (Goodspeed-PC:0.0): id=50, switchable=no,
  source=nv-control :: DPY-0: nvidia-auto-select @1440x900 +800+0
  {ViewPortIn=1440x900, ViewPortOut=1440x900+0+0},
  DPY-2: nvidia-auto-select @800x1280 +0+0 {ViewPortIn=800x1280,
  ViewPortOut=1280x800+0+0, Rotation=270}

注意里面的 source=nv-control :: 后面的东西,是我们想要的。

DPY-0: nvidia-auto-select @1440x900 +800+0 {ViewPortIn=1440x900, ViewPortOut=1440x900+0+0}

是我的第一块屏幕。

DPY-2: nvidia-auto-select @800x1280 +0+0 {ViewPortIn=800x1280, ViewPortOut=1280x800+0+0, Rotation=270}

是我的第二块屏幕。(如果你只有一块屏幕,大概不会有第二条)

我们需要在后面的花括号里面加上ForceFullCompositionPipeline = On,看上去就像这样:{ ..., ForceFullCompositionPipeline=On }。然后再用逗号把两个显示(如果有)拼起来,以上面的举例,修改后是这样的:

DPY-0: nvidia-auto-select @1440x900 +800+0 {ViewPortIn=1440x900, ViewPortOut=1440x900+0+0, ForceFullCompositionPipeline=On}, DPY-2: nvidia-auto-select @800x1280 +0+0 {ViewPortIn=800x1280, ViewPortOut=1280x800+0+0, Rotation=270, ForceFullCompositionPipeline=On}

然后执行 nvidia-settings --assign CurrentMetaMode="修改过的"。这样,不出意料的话,就不会有画面撕裂了。