delphij's Chaos

选择chaos这个词是因为~~实在很难找到一个更合适的词来形容这儿了……

16 Jan 2023

Postmortem: UPS 测试导致系统停机故障的事后回顾

摘要

事故影响

由于 UPS 测试触发了系统停机,导致 delphij.net 部分服务停止了约40分钟。服务从 2023-01-16 15:46:20 开始受到影响,至 16:26:55 完全恢复。 如果服务未能及时修复,潜在地将会进一步影响包括权威DNS(有多个独立的冗余,但依赖于持续的数据更新)在内的一些其他关键服务。

问题根源

在测试时对于 CyberPower UPS 测试特性的认识不足导致电池电量消耗至临界值, 由于对 nut 的配置未考虑这种情况直接将服务器关闭, 这使得必须亲自到机房才能完成服务的恢复。

Read more...
15 Jan 2023

历史 Movable Type 评论迁移到了 Remark42

上回书 说到留言板的问题时提到留言板当时没有解决, 在文内的模板中可以看到我当时是采用了一种非常对付的方法: 直接将之前的评论直接作为文章内容输出出来。这导致了页面不太美观。

趁着周末我把之前 Movable Type 的数据库重新捋了一下,把其中的 2256 条留言用类似 isso 迁移时的方法转换成了 json,然后就可以在 remark42 中导入了。 中国有句俗话叫三搬一火,意思是搬三次家大约等于失一次火, 这次留言内容搬家我也丢掉了一些东西:Remark42 的一项设计理念便是尽量不保存可以追踪用户的数据,例如用户的 E-mail 在 Remark42 中只会保存一个与之对应的 SHA1,对于网站的主人来说, 这意味着他们不能直接从这些保存的数据中获得用户的 E-mail 地址(当然, 实际情况中,这类单向函数并不能阻止他们在知道这些信息的情况下验证某个 SHA1 是不是某个 E-mail 地址,但总归这要比把数据存在数据库里安全得多), 因此这个迁移过程也就意味着所有相关的明文数据消失了。除此之外,Movable Type 还保存了许多类似于用户网站地址这样的信息,我在转换时考虑了一下,由于许多人的网站都已经不在了, 迁移的意义不太大,因此最终决定不迁移这些数据了。

考虑到现在还在用 Movable Type 的人应该已经没有几个了, 我感觉我的方法可能对其他人没有太大的参考意义,这里只是简单做个记录。 代码写的比较乱,就不拿出来丢人了。

Read more...
14 Jan 2023

试试看 CyberPower UPS

因为机房家里 之前发生过一些停电的问题,因此这两处我都放了UPS。

UPS使用的铅酸电池是有一定寿命的,机房这台UPS是2016年5月上线的(当时是觉得已经到了5年,应该换掉了; 而当时查看价格发现购买一个UPS电池自己更换的原材料价值和买一个新的差不多,于是就直接整体换成了 APC BE600)。

Read more...
11 Jan 2023

暂停 Facebook 集成

这几天收到了几次来自 Facebook 的通知,第一次是 “Request for Information/Action” (最早申请时还没有 Privacy Policy,但后来补上了),但过了几天之后系统表示无法完成 compliance review,并直接禁用了该 App。 今天早上先是收到了一封信说有一位 Karen Zuckerman 在我的 blog 上留言,内容是‘aa’, 接下来收到这么封邮件: delphij's Chaos (XXXXXXXX) appears to be creating a negative experience on Facebook in violation of our Platform Policies. If you do not make the changes to get your app into compliance, we will be forced to place a restriction on your app. Please check your <contact email> inbox for more information. If you haven't received an email from us, please ensure that the email address listed in the App Dashboard under App Settings is correct. Read more...
29 Dec 2022

作弊条:Dokuwiki 和 Remark42 的集成

我的 Wiki 之前使用的是 Disqus 的评论系统, 而 remark42 支持多个网站,因此这次顺手把评论系统也搬到了上面。

Read more...
27 Dec 2022

迁移到了基于 Remark42 的评论系统

上回书 说到启用了基于 isso 的评论系统,其实当时还发现了一个功能相当强的评论系统 remark42, 但该系统是 Go 写的,并且依赖的其他软件包要比 isso 多不少,因此当时没有下定决心换成这个。

Read more...
18 Dec 2022

iCloud 的 Advanced Data Protection

最近 Apple 的一系列更新中的一项新的安全特性是 iCloud 的 Advanced Data Protection, 大概看了一下还是挺有意思的。

Read more...
20 Nov 2022

重启手工记账

上回用 beancount 来手工记账是 2018 年的事,当时想要这么做的原因是贵厂的 Waze Carpool 项目当时并没有提供非常方便理解的记账系统,因此结合每月的对账单和 Waze 记录的数据来统计一下相关的数据,同时也把手中的现金一类没有对账单的小额资金给管起来。 后来又逐渐加入了一些其他的类似 PayPal 之类的付款记录,但是随着疫情的发展,到 2020 年初的时候已经不再有新的记录,慢慢也就把记账的事情给搁置下来了。

今年出于计算个税的需要,我又重新开始了记账。最初的想法是只把工资单的自动导入做好, 但后来想到既然 #来都来了 索性就把相关的解析全都做了好了。

Read more...
23 Oct 2022

UGFzc3dvcmQ6 是什么?

今天无意中看了一眼服务器日志,结果发现了一些奇怪的消息: warning: unknown[122.168.199.151]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[176.8.89.240]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[185.232.21.42]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[206.217.216.13]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[220.196.249.145]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[5.253.204.74]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[70.45.212.49]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[93.177.73.82]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 warning: unknown[93.177.75.66]: SASL LOGIN authentication failed: UGFzc3dvcmQ6 这里的 UGFzc3dvcmQ6 是什么呢?从直觉上看似乎是个 base64 编码的字符串。解码试试看,果然: echo "UGFzc3dvcmQ6" | base64 --decode Password: 这是个 Postfix 特有的特性,为了防止不慎在日志中写下用户的密码,它记录的是 SASL 库发给客户端的消息而不是用户名。 Read more...
18 Sep 2022

Moving toward a standarized qsort_r(3)

History of qsort_r(3)

First introduced in Research Unix V3 and eventually standardized as part of C Standard Library as of ANSI/ISO C89, qsort(3) provided an abstract interface where programmers can perform sort operation over an array of objects, by supplying a pointer to that array, the total number of the member objects, the size of individual member object, as well as a compare function. The compare function is expected to take two parameters, both pointers to a member object, and it shall return a negative number, 0, or a positive number, if the first object is considered smaller, equal, or greater respectively.

Read more...