013

You shouldn’t mock an API (verb), instead you create a mock (noun) that implements a given API.

Mocks and explicit contracts

最简单的例子是访问外部 API

defmodule MyApp.MyController do
  def show(conn, %{"username" => username}) do
    # ...
    MyApp.TwitterClient.get_username(username)
    # ...
  end
end

在测试中一般通过 mock MyApp.TwitterClient 所使用的 HTTPClient 来解决

mock(HTTPClient, :get …
more ...

012

Strip 的滚动 API 设计经验

APIs as infrastructure: future-proofing Stripe with versioning

如果某个 API 返回一个名为 verifiedboolean 类型字段来表示账户状态,那么用户可能会编写出如下的代码

if bank_account[:verified]
  ...
else
  ...
end

但假如在后续迭代中将 verified 替换为包含 verifiedstatus 字段,那么便会影响用户之前所写的代码。这种类型的改变称为 "backwards-incompatible"。为了避免这种情况,之前存在的字段应该继续存在且保持相同的类型和名称。显然这对开发并不友好,但如果要用户更新他们的代码则又需要经过足够的协商

通常的方法是使用版本控制,v1v2v3 作为前缀添加在 URL 中或者 HTTP ACCEPT 首部中。OK 还行 …

more ...

011

关于 /dev/urandom

Myths about /dev/urandom

If you are unsure about whether you should use /dev/random or /dev/urandom, then probably you want to use the latter. As a general rule, /dev/urandom should be used for everything except long-lived GPG/SSL/SSH keys.

引用自 man 4 unrandom …

more ...

010

PROC(5)

/proc 是 Linux 下的一个特殊目录,目录中的文件大部分都是 0 字节(kcore 便是例外),但是如果通过 cat 命令查看则会返回大量的信息。这个目录中包含一系列以数字命名的子目录,这些数字便是当前系统中运行的进程的 PID,以及一些如 netfs 等包含某个类别数据的目录。除此之外还有一些比较零散的文件,下面简要地分析这些文件的作用

more ...

009

Cassandra 内部原理和底层实现

Centralized database

单机处理能力不够:

  • 计算能力
  • 存储量

Distributed database

Partitioning

几种策略:

  • Range Partition: 根据范围进行分片,比如 North:1~1000East:1000~2000
  • List Partition: 和 Range Partition 相似,不过是定义几个包含不同 id 的分区列表 North:[3, 5, 6, 9, 17]East:[1, 2, 10, 11, 19, 20]
  • Hash Partition: 根据 key 的 Hash 结果进行分片 …
more ...

008

ipss 命令的使用

ip(8)

ip 命令能够显示/操作路由、网络设备、接口和隧道等。若机器上不存在 ip 命令,则需要安装 iproute2

iproute2 提供了一系列用于替换 net-tools 的命令,一个简单的对比如下

iproute2 net-tools meaing
ip addr ifconfig -a 显示所有地址信息
ip link set eth0 down ifconfig eth0 down 停止网络接口
ip link set eth0 up ifconfig eth0 up 激活网络接口
ip addr add …
more ...

007

本周关注 Python 的命令行参数与环境变量,大体是在翻译文档。版本为 Python 3.7.0

Python Command line and environment

Command line

Interface options

  • -c <command> 执行 command 中的 Python 代码,command 可以是一个或者多个由换行符分隔的语句,与正常代码一样前导空白符是具有意义的。指定此参数后,sys.argv 的第一个元素将是 -c,并且当前目录会被添加至 sys.path 的开头

  • -m <module-name>sys.path 中搜索指定名称的模块,然后作为 __main__ 执行。因为参数是模块的名称,所以不需要提供文件扩展名 .py。模块的名称应当是合法的 …

more ...

006

:tada: Python 3.7.0 在本周发布了 :tada:

What’s New In Python 3.7

Syntax changes

asyncawait 成为关键字

In [9]: import keyword

In [10]: all(map(keyword.iskeyword, ('async', 'await')))
Out[10]: True

dict 对象保持插入顺序的特性已经被声明为 Python 语言规范的一部分

New Features

PEP 563 - Postponed Evaluation of Annotations

推迟了注解的求值时间,解决了下面的两个问题:

  • 注解只能使用当前作用域中已经存在的名称 …
more ...

005

本周为 CNM(Container Network Model) 和 CNI(Container Network Interface)。Kubernetes 采用的是 CNI

libnetwork design

The goal of libnetwork is to deliver a robust Container Network Model that provides a consistent programming interface and the required network abstractions for applications.

libnetwork 实现了 CNM。它为 Docker daemon 和网络驱动程序之间提供了接口。网络控制器(NetworkController)负责将驱动 …

more ...

004

本周依旧围绕 PyCon 2018 的视频

Clearer Code at Scale: Static Types at Zulip and Dropbox

本演讲的主题是通过 static types 使 code 变得 clearer

演讲者为 Greg Price,曾在 Dropbox 和 Zulip 工作

视频的 4:16 中解释了为什么需要 static types

Work incrementally

添加 static types 是一个渐进的过程,从新写的文件/函数开始做起

Define a clean build

CI 中添加 mypy …

more ...