0%

C 和 C++中的函数重载

我们在学习 C 和 C++的时候,会接触到一个概念叫做函数重载。简单来说函数重载指的是多个函数具有相同的名称,但是参数不同(包括参数类型和参数数量)。编译器在遇到重载函数的调用时,会在同名函数的不同重载实现中选择参数匹配的哪一个来调用。

这里举一个简单的例子。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#include <iostream>

void desc(int n){
std::cout << n << " is an integer" << std::endl;
}

void desc(double x){
std::cout << x << " is a floating number" << std::endl;
}

int main(){
desc(1);
desc(2.0);
return 0;
}

C++ Function Overloading

Read more »

之前刷 LeetCode 题目的时候,偶尔会需要反转二维列表,这里总结了几种 Python 实现。

循环

简单的二维循环,将原始二维列表的每一行的第 N 个元素,放到新的二维列表的第 N 行中。

1
2
3
4
5
6
7
8
def invert_matrix(matrix: list[list[int]]) -> list[list[int]]:
new_matrix = []
for i in range(len(matrix[0])):
new_row = []
for row in matrix:
new_row.append(row[i])
new_matrix.append(new_row)
return new_matrix

列表推导式

本质上和循环算法是相同的,使用列表推导式语法来实现。

1
2
def invert_matrix(matrix: list[list[int]]) -> list[list[int]]:
return [[row[i] for row in matrix] for i in range(len(matrix[0]))]
Read more »

最近在深入学习 Rust 语言,本着学以致用的原则,使用 Rust 编写了一个生成二维码的 Web 服务

使用的库

  • axum,一个基于 tokio 的 web 框架
  • qrcode, 用于生成二维码

核心逻辑

生成二维码

直接调用qrcode库相关接口,返回生成的 PNG 文件的二进制内容

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
fn gen_qr_code(content: &str) -> Vec<u8> {
tracing::info!("Generating QR code for {}", content);

let image = QrCode::new(content)
.unwrap()
.render::<Luma<u8>>()
.min_dimensions(512, 512)
.build();

let mut buffer = Vec::new();
PngEncoder::new(buffer.by_ref())
.encode(&image, image.width(), image.height(), image::ColorType::L8)
.unwrap();

buffer
}
Read more »

最近接到了一个新的需求。需求本身是一个简单的运营活动,不过这个运营活动并不是长期存在的,需要通过后台设置生效时间。

抽象一下的话就是需要通过开关来控制一个功能是否生效,也就是特性开关(Feature Flags)模式。

Martin Fowler 先生写过一篇特性开关模式的文章,感兴趣的读者可以深入阅读。

Read more »

RAII 概念与在 Python 中的应用

RAII(Resource Acquisition Is Initialization),即资源获取即初始化,是一种设计模式,用于解决资源的获取与初始化的问题,最早在 C++中提出与推广。
在这篇文章我来简单地介绍一下 RAII 的概念,以及在 Python 中的应用。

RAII 的概念

在计算机与程序的世界中,有一些资源,比如文件、网络连接、数据库连接、线程、进程等,这些资源在使用的时候需要获取,在使用完成后需要释放。如果不及时释放,会导致资源泄露,造成资源的浪费,程序出错甚至系统崩溃。

一个简单的示例就是文件的读写。

1
2
3
4
f = open('test.json', 'r')
raw = f.read()
data = json.loads(raw)
f.close()

这段代码看起来没有什么问题,但是当test.json文件的内容不是合法的 JSON 格式时,第四行代码反序列化数据就会抛出异常,导致第五行代码无法执行,文件没有被关闭。

这个例子告诉我们在处理一些资源时,需要注意在操作过程中是否会发生一些意外情况,例如抛出异常,并且在意外情况发生后,也需要关闭资源。

在 Python2.5 之前的版本中,我们用try-finally来保证程序最终会关闭资源。

1
2
3
4
5
6
7
8
try:
f = open('test.json', 'r')
raw = f.read()
data = json.loads(raw)
except JSONDecodeError:
...
finally:
f.close()

在简单的文件读取操作中,使用try语句多少有点大材小用。为了更好地处理类似的资源管理问题,Python2.5 引入了with语句,做到无论语句块中的代码执行是否抛出异常,都可以在退出with语句块时执行清零代码。

事实上在 Python 中进行文件读写的标准方式就是使用with open语句。

1
2
3
with open('test.json', 'r') as f:
raw = f.read()
data = json.loads(raw)
Read more »

临近 618 年中大促,各大云服务商也会提供一些优惠。正好我三年前在腾讯云上买的一台 2 核 4G 的虚拟机到期了,看了一下腾讯云的优惠活动,下单了一台 2 核 4G 的的轻量应用服务器(一年期,288 元)。

轻量应用服务器一般都会提供一些常见的镜像(WordpressLAMP 等),我的目的不是建站,所以还是选了朴素的 Ubuntu18.04 的基础镜像。

下面大致介绍一下我配置服务器的过程(安装及配置方法基本来源于对应工具官网)。

配置密钥登录

轻量应用服务器默认是从腾讯云控制台直接登录到终端,可以将自己的公钥加到 ssh 配置里。

1
2
# Remote
cat PUBLIC_KEY >> ~/.ssh/authorized_keys

为了方便登录,可以配置自己主机的ssh config 文件,随后就可以通过ssh light命令登录到服务器。

1
2
3
4
5
6
# ~/.ssh/config

Host light
HostName 1.2.3.5
Port 22
User lighthouse
Read more »

最近公司越来越多的项目开始推动单元测试,而我在公司里很早就在进行单元测试实践。就用这篇文章作为一次内部技术分享的主题,同时也代表我自己对单元测试的认识和实践。

单元测试的概念

单元测试是软件测试的一种类型,测试对象是最基础的代码单元(函数、类、模块),属于白盒测试。在经典的测试金字塔中,单元测试处于最底层。

testPyramid

最简单的单元测试:

basic.png

Read more »

使用 Python 对数据进行压缩

之前在工作中遇到一个需求,需要在手机小程序端获取到微信小商店店铺的所有商品数据。由于当时我们没有在后台维护用户的商品数据,选择的解决方案是现场调用商品列表接口,然后缓存在 Redis 里。
鉴于 Redis 的内存还是比较宝贵的,而用户的商品数据(转化为 json 格式后)又是一些比较有规律的文本数据,比较适合进行数据压缩,于是我调研了一下 Python 中的数据压缩的方案。

zip标准库

Python 中有一个标准库zip,常用来处理 zip 格式文件,提供的函数和方法也更适合文件操作。在这个案例中我们的数据是通过 http 接口获取的,额外进行一些文件操作有些麻烦和多余,zip标准库并不适合这个场景。

zlib标准库

zlib是一个常用的压缩、解压库,使用了 deflate 算法。zipunzip工具背后其实用的就是zlib。Python 内置了zlib标准库,提供的接口也很简洁易用(zlib.compresszlib.decompress)。

1
2
3
4
5
import zlib
raw = b'abc' * 100
compressed = zlib.compress(raw)
print(f'compress ratio = {len(compressed)/len(raw):.2}') # compress ratio = 0.05
assert zlib.decompress(compressed) == raw
Read more »

前段时间遇到一个需要在本地开发环境定时执行某个脚本来同步数据的情景。

如果是线上业务的话,我一般会使用Celery Beat来执行定时任务。考虑到运行Celery Beat需要启动两个服务(celery workercelery beat),还要管理虚拟环境并编写 Python 代码,用在简单的定时任务执行场景过于复杂。

说起定时任务,首先想到的就是crontab。于是我调研了一下crontab的使用方法,成功配置了定时任务,也在这里简单的介绍一下。

crontab 简介

crontab(守护进程为crond)是类 unix 平台下的一个定时任务管理工具,可用于周期性执行定时任务。

Read more »