阻塞、非阻塞、同步、异步

几个经常容易混淆的概念。特别是像异步与非阻塞,在某些情况下这两个术语常常混用。下面就我谈谈自己对这四个概念的理解,也解释了异步与非阻塞这两个词为何会形影不离。希望对这些概念迷惑,学习Python协程、并发相关的朋友有所帮助。

探究事物的基本逻辑

当我们探讨事物的时候,一定要先界定清楚事物的时空界限以及其基本定义,也要先界定清楚探讨的事物/问题的级别或层次(在阿驹看来,世界上的任何东西都是具有分层/分级的,当我们层次分明的时候,很多架构就显得清晰明了)。

阅读全文

什么是云计算

美国国家标准技术研究所(NIST)对云计算给的基本定义如下。

定义

云计算是一个实现了无处不在的、方便的、通过网络访问按需取用可配置的计算资源共享池(例如:网络、服务器、存储、应用程序和服务)的模型,用户能以最小的管理成本或与提供商沟通的代价即可快速配置和发布所需的计算资源。

阅读全文

Unable to find vcvarsall.bat

1. 什么是 vcvarsall.bat ?

Visual Studio 的编译器的一个组件。

2. 使用Python开发环境,何时需要它?

在Windows环境下,使用了lxml、mysqlclient、pillow等第三方库,这些第三方库的一些子模块是用C语言扩展写的。而在安装这些库时试图通过源码安装,需要编译,如果当前系统下没有对应的编译环境,则会报错,这里是报“无法找到vcvarsall.bat”。

阅读全文

UTC+8还是GMT+8?聊聊时间与计时法

今天一位同事问道:“你写入ES的时间字段是考虑过时区处理了的吗?”

原来是我们有一个可能部署在全球各地的软件系统,这个系统会记录各种服务监控指标存入ES(一种数据存档索引系统)。今日那位同事发现他获取的是北京时间,而存入ES系统后却比北京时间晚了8个小时。

阅读全文

如何在Python里应用SOLID原则

如今OOP编程大行其道。不少人以为用编程语言里的class关键字定义一个类,然后用类创建一个对象就是OOP了。肤浅!

OOP编程很贴近人们的正常思维方式,所以容易被接受,而且应用也很广泛。的确,这给编程带来了很大的好处。但并不是任何人都能深谙OOP的本质。简略证明如下:如果把“女朋友”作为一个类,你自己的女朋友就是你的对象,是“女朋友”类的具体的实例。如果你能熟练掌握“女朋友”这个类的特性以及方法,还不能创建一个实例么?你没女朋友,说明你没吃透女朋友类,进而说明你肯定没理解好OOP。但创建了一个实例出来也并不能证明你就吃透了这个类。

阅读全文

管理多个SSH Key以支持多个Git账号

SSH Key 可以方便地解决系统登录的问题,不用每次提交代码时输入相关Git平台的登录密码。

由于各种各样的原因,程序猿一般都有多台电脑或多个开发系统环境,同样也有多个Git账户,最起码的可能有一个GitHub账户加公司内部的一个GitLab账户。可能不同的账户有不同的用户名,邮箱等。

1. 生成SSH密钥

  • 生成默认公钥

    先确认系统中是否已有默认的SSH密钥(使用的是公钥,之后都称公钥)存在。
1
cat ~/.ssh/id_rsa.pub

如果已经有了则不用生成默认的公钥了,如果没有,则按照如下命令生成。生成后再用上述cat命令查看公钥。

1
ssh-keygen -t rsa -C "$your_email"

将上述的$your_email替换为你想使用的默认email地址。如我在工作电脑上生成默认公钥时邮箱使用的是公司内部邮箱。在私人电脑上则用的是本人Gmail邮箱。

阅读全文

Python性能优化之记忆化(Memoization)

记忆化(Memoization)介绍

简单说来 Memoization 是一种利用缓存来加速函数调用的技术手段,将消耗较大的调用结果存储起来,当再次遇到相同调用时就从缓存读取结果而无需重新计算。
有一个限制条件是该函数必须是纯函数式的,相当于函数式编程中的不可变性,即输入一致时输出一定不会改变。比如计算平方的函数就满足这种条件,square(3) 的结果永远是9,所以我们才能把它的结果存储起来,下次需要知道3的平方的结果时,无需计算,直接从内存中读取就好了。

阅读全文

深入浅出Python装饰器

有朋友说看到《Python CookBook》的装饰器部分有些迷糊,究其原因是没有清晰地理解Python装饰器是什么,能干什么。于是有了本文。看此文时,从头到尾跟着思路走,应该会对Python装饰器有更明白深刻的认识。新手不要跳读,新手不要跳读,新手不要跳读。
本文假定你已经明白了Python中什么叫做函数,变量的作用域、解析规则及生存周期。阿驹还是简单阐述一下:

  • 作用域: 变量起作用的范围, 也称之为命名空间。以方法、类、函数、模块、包、Python内置环境(当前Python解释器的Python Path里所包含的)这几个的程序结构为单元,以大结构包含小结构外层包含内层的方式,把变量放置在这样一个个的空间中,一个程序结构单元就对应一个作用域(命名空间)。每个变量,不加global和nonlocal关键字时,只属于声明该变量的这层作用域。

    阅读全文