谢乾坤 | Kingname

给时光以生命。

有一类面试官特别讨厌,面试的时候,会问一些偏、难、怪的题目。假设你今天去面试,遇到面试官问你:“什么是鸭子类型?”。你怎么回答?

熟读维基百科的你,脑海中闪过了下面这张截图:

图中的红框像闪电一样从你的脑子里划过。你用中指扶了扶黑框眼镜,自信地说道:

鸭子类型就是说,一个函数不会关心它传入参数的类型,只关心这个参数对应的对象有没有自己想要的方法和属性。如果有,就能运行。如果没有,就不能运行。这就像是我看到了一只鸟,只要它能像鸭子一样叫,像鸭子一样走路,有鸭子一样的白色羽毛,那么,无论它实际上是什么东西,我都认为它是鸭子。

说完这段话,一道光从你的镜片上一闪而过。你心里想,这下稳了。

阅读全文 »

我们知道,在使用 Git 的时候,应该要正确使用它的分支(Branch)功能。不同的功能使用不同的分支开发,最后合并进入主分支。但有时候会出现这样一种情况——我代码都已经写完了,才发现我写错分支了。这个时候,怎么把我的修改迁移到目标分支上,并且不修改现在正在使用的分支?

阅读全文 »

我们知道,HTTP请求的 POST 方式,提交上去的数据有很多种格式。例如JSON/form-data/x-www-form-urlencoded等等。我们在 Postman 的 POST 请求里面,可以看到这些数据格式,如下图所示:

阅读全文 »

很多人都知道环境变量,很多人也在使用环境变量。但是很多人一说到在 Linux、macOS 中使用环境变量,第一个想到的就是export XXX=yyy这种形式的环境变量。但实际上,在 Linux 和 macOS 中,定义环境变量有三种方式,他们的效果和作用范围是不相同的。

阅读全文 »

有一些同学在写爬虫的时候,喜欢在Chrome 开发者工具里面直接复制 XPath,如下图所示:

他们觉得这样复制出来的 XPath 虽然长了点,但是工作一切正常,所以频繁使用。

但我希望大家不要过于依赖这个功能。因为它给出的结果仅作参考,有时候并不能让你提取出数据。我们来看一个例子。

阅读全文 »

今天在读者交流群里面,有同学提到这样一个问题:

这个同学想实现,在代码第35行,如果进入了 if 判断,那么就退出第40-43行对应的 ac 函数。

能问出这个问题,说明这个同学显然没有认真看我的微信公众号。就在几天前我才发了一篇文章:一日一技:Python多线程的事件监控。使用这篇文章里面讲到的方法,就可以轻易实现他的需求。

在那篇文章中,我们讲到了threading.Event,这个东西不仅可以在线程之间使用,也可以在主线程和子线程之间使用。

阅读全文 »

现在阿里云,腾讯云等等云服务商都已经提供对象储存服务,我们可以使用对象储存来存放文件或者图片。通过云服务商提供的 SDK,一行代码就可以把文件或者图片上传到对象储存,并获得文件的地址。

我的博客图片就使用腾讯云的对象储存作为图床,所以如果你查看图片的地址,会发现他们的网址是这样的:

1
https://kingname-1257411235.file.myqcloud.com/IMG_5551.JPEG

其中的https://kingname-1257411235.file.myqcloud.com/就是我的对象储存的域名。

然而,在公司的项目中,虽然我们也是用云服务商提供的对象储存来存放图片,但是我们会额外开发一个图片服务接口。所以,公司项目网站的图片,使用的地址类似于:https://img.kingname.info/xxx.png。当你访问这个地址的时候,这个图片服务会从域名拿到图片的名字xxx.png,然后访问对象储存拿到这张图片,最后再把这种图片以数据流的形式返回给你。

你可能会觉得,这不是多此一举吗?为什么不能让用户直接访问对象储存获得图片呢?单独做一个图片接口不仅增加了开发时间,而且还需要服务器单独再发一次请求到对象储存拿数据,白白增加了访问延迟,怎么看都是得不偿失啊。

这是因为,工程上的问题,有时候不仅仅是一个行与不行的问题。它需要考虑很多额外的因素。

阅读全文 »

Redis 在日常的开发中,会积累大量的 Key,占用不少内存空间。有时候,我们想知道当前 Redis 里面有多少个 Key,是哪个 Key 占用了最大的内存。

但是,我们知道,由于 Redis 是单线程数据库,所以在线上环境是绝对禁止使用keys *这种命令的,因为它会花费很长时间扫描所有的 Key,在这个过程中,Redis 会卡死,无法处理其他的读写操作。

那么,我们应该怎么知道当前有多少个 Key 呢?有同学说可以使用scan命令。但这个命令一方面是需要写程序来迭代,另一方面是它给出的结果可能是不准确的。

阅读全文 »
0%