Coding的痕迹

一位互联网奔跑者的网上日记

0%

数列

定义域为 NN 的函数 xn=f(n),nN+x_n = f(n), n \in N_+,写作 x1,x2,,xn,x_1, x_2,\dots,x_n,\dots{xn}\{x_n\}。一般讨论数列的单调性有界性

例:试证以下数列单调增加且有界:(p4 数列的极限1)

  1. xn=2+2++2x_n = \sqrt{2+\sqrt{2+\dots+\sqrt2}}nn 重根号)
  2. xn=a+a++ax_n = \sqrt{a + \sqrt{a+\dots+\sqrt a}}nn 重根号,a>0a > 0

数列 xn{x_n} 中的无穷项,它们下标依次为 n1<n2<<nk<n_1 < n_2 < \dots < n_k < \dots,则称数列 xn1,xn2,,xnk,x_{n_1},x_{n_2},\dots,x_{n_k},\dots{xn}\{x_n\}子列,记为 {xnk}\{x_{n_k}\}

阅读全文 »

本篇主要是高中知识的复习与补充。大部分内容来源于乐经良教授主讲《高等数学》的“实数集”一课,此外也收录了笔者在后续课程中发现自身的缺失之处,以及常用的高中知识点。

集合

具有某种属性的事物的全体称为集合。元素用小写字母(如 aa)表示,集合用大写字母(如 AA)表示。 aaAA 的元素: aAa \in Aaa 不是 AA 的元素: aAa \notin A

集合具有确定性、互异性、无序性。

阅读全文 »

xx, yy 为两个变量 (xD)(x \in D). 对任意的 xDx \in D,总存在唯一确定的 yyxx 对应,称 yyxx 的函数,记作 y=f(x)y = f(x).

函数在 DDx0x_0 对应的 f(x0)f(x_0) 称为函数在 x0x_0 的值,有时记为 fx0f|_{x_0}

常见的函数

符号函数

y=sgn x={1,x<00,x=01,x>0y = sgn\ x = \left\{ \begin{aligned} -1, & x < 0 \\ 0, & x = 0 \\ -1, & x > 0 \end{aligned} \right.

阅读全文 »

背景

最近在开发“上应小风筝”的电费统计功能后端接口。前端突然反馈说数据有问题:前端页面中计算得到的平均值和电费排名中的消费量不一致。(如图,图上 0.05 即为均值,但此图为事后截,无太大问题)

电费统计页(事后截图)

去查看后端返回的数据,发现最后 8 小时电费情况始终为 0 元,而与实际金额不符。因此怀疑是时区问题的锅。

阅读全文 »

数据库备份是实际运维中必须进行的操作,然而有时因为没空或者懒,便忽视了这项工作,有时甚至造成损失。

背景

今天早上对本博客的 nodejsnpm 进行升级时,apt 提示部分包可以使用 apt autoremove 命令删除。为了减少系统体积,便执行了。因为注意到执行前系统内存占用在 600M 左右,执行后内存占用在 240M 左右,便感觉到不对劲。于是首先便想到了同一台服务器上的数据库,执行:

1
2
root@Aliyun:~# systemctl status postgres
Unit postgres.service could not be found.

想着出事了,博客上运行的 PostgreSQL 不翼而飞。由于用户量不大,开始不慌不忙地进行恢复工作。

阅读全文 »

Rust 使用 tesseract 识别验证码

近期需要将验证码识别功能集成到一个 Rust 项目中,验证码图片大概这样:

验证码图片示例

观察

首先观察图片,发现前景文字和背景图片颜色深度差别较大,可以对图片进行二值化处理。使用 Photoshop 可以看到,转为灰度图像后,在 0 ~ 255 内,前景和背景大约以 130 为界。使用 “天若OCR” 截图、识别了若干张图片,在较大截图区域的情况下,识别率可以达到 100%,说明这个验证码不复杂。由于在线 API 有数量等限制,最终将目光锁定在了 tesseract 上。

阅读全文 »

这是一篇 PostgreSQL 13 在 Linux 上安装的笔记,便于日后查询使用。数据库配置于 Debian 10 (Buster) 上,在配置的过程中,你可以参考官方文档

阅读全文 »

最近最少使用算法,或 最近最久未使用算法 (Least Recently Used, LRU)是一种常用的页面置换算法(当然也可以用于文件缓存等情景)。再实际情况中,如某些页面长时间未被访问,则它们在将来还可能会长时间不会访问。算法基于这个推论,选择最近最久未使用的页面予以淘汰。

我们认为 “最近使用” 指的是读/写相应的内存页(或值),然后以一个例子(来自参考资料1)看看:

LRU过程示意

阅读全文 »

银行家算法(Banker’s Algorithm)是一个避免死锁(Deadlock)的算法。

背景

在银行中,客户申请贷款的数量是有限的,每个客户在第一次申请贷款时要声明完成该项目所需的最大资金量,在满足所有贷款要求时,客户应及时归还。银行家在客户申请的贷款数量不超过自己拥有的最大值时,都应尽量满足客户的需要。在这样的描述中,银行家就好比操作系统,资金就是资源,客户就相当于要申请资源的进程。(维基百科

察看银行家算法的历史,它于 1965 年由 Dijkstra 和学生所设计,打算应用到 THE 系统 中的。作为那个时代的产物,这个算法或许当时在避免死锁上取得了很好的效果,而技术发展日新月异,需求的变化和性能的差异使得它今天的价值主要体现在教学和思想的传播了吧。

阅读全文 »

晚上在写一段多线程程序时,在C++标准库中发现了这样的写法,让我很惊讶:

1
this_thread::sleep_for(2s);

Ctrl + Click 点进去看,函数的声明是这样的:

1
2
3
_NODISCARD constexpr chrono::seconds operator"" s(unsigned long long _Val) noexcept /* strengthened */ {
return chrono::seconds(_Val);
}

像是重载了双引号的写法,翻了翻 cppreference ,原来叫用户定义字面量(字面值)。

阅读全文 »