背景
最近在开发“上应小风筝”的电费统计功能后端接口。前端突然反馈说数据有问题:前端页面中计算得到的平均值和电费排名中的消费量不一致。(如图,图上 0.05 即为均值,但此图为事后截,无太大问题)
去查看后端返回的数据,发现最后 8 小时电费情况始终为 0 元,而与实际金额不符。因此怀疑是时区问题的锅。
数据库备份是实际运维中必须进行的操作,然而有时因为没空或者懒,便忽视了这项工作,有时甚至造成损失。
今天早上对本博客的 nodejs
和 npm
进行升级时,apt
提示部分包可以使用 apt autoremove
命令删除。为了减少系统体积,便执行了。因为注意到执行前系统内存占用在 600M
左右,执行后内存占用在 240M
左右,便感觉到不对劲。于是首先便想到了同一台服务器上的数据库,执行:
1 | root@Aliyun:~# systemctl status postgres |
想着出事了,博客上运行的 PostgreSQL 不翼而飞。由于用户量不大,开始不慌不忙地进行恢复工作。
银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的算法。
在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。(维基百科)
察看银行家算法的历史,它于 1965 年由 Dijkstra 和学生所设计,打算应用到 THE 系统 中的。作为那个时代的产物,这个算法或许当时在避免死锁上取得了很好的效果,而技术发展日新月异,需求的变化和性能的差异使得它今天的价值主要体现在教学和思想的传播了吧。
晚上在写一段多线程程序时,在C++标准库中发现了这样的写法,让我很惊讶:
1 | this_thread::sleep_for(2s); |
Ctrl + Click
点进去看,函数的声明是这样的:
1 | _NODISCARD constexpr chrono::seconds operator"" s(unsigned long long _Val) noexcept /* strengthened */ { |
像是重载了双引号的写法,翻了翻 cppreference ,原来叫用户定义字面量(字面值)。
和使用 http 类似,测试代码可以这样写:
1 | use actix_web::client::Client; |
借一个 Actix-web::Client 官方的例子,可以这样发送一个 HTTP 请求:
1 | use actix_web::client::Client; |
最近在用 Diesel 查询符合条件的行数时遇到了个问题。按照官方例子:
1 | let count = users.count().get_result(&connection); |
get_result
返回一个 Result
,在例子中是 Ok(2)
。于是我写了这样一段代码:
1 | let connection = establish_connection(); |