#24 一些不足道哉的开发经验

2020-03-10
  1. 编码:
  2. 遵守一个社区比较公认的编码规范和编程实践,不要试图自己搞一套。
    尤其是命名风格保持统一。
  3. 拆分的思想:分服务,分模块,分文件,分函数,分层。
    不同部分之间的依赖应该非常清晰,严禁无序调用。
  4. 代码复用:尽可能不要重复写类似的代码。
    业务无关代码应该采用公共库,组织内复用,不要重复实现相同的逻辑
  5. 对于功能实现应该有一定的预留空间,对可能发生的调整有一定的包容性
  6. 函数简单:一个函数应该尽可能简单,代码行数少,逻辑清晰。
  7. Git:
  8. 分支管理
  9. 提交管理
    1. 每次代码提交应该有一个明确的目的,和这个目的无关的代码应该另外提交。
      尽可能保证每次提交修改的量比较少。
    2. 提交的时候应该做代码风格检查,没有通过的拒绝接受
  10. 测试:
  11. 单元测试必须要有, 要比业务代码接受更严格的检查
  12. 我认为写单元测试的时间应该开发的时间差不多
  13. 覆盖率要求
  14. 为了保证测试的便利,可以对现有实现进行调整(开发时就应该考虑到测试流程)
  15. 集成测试,回归测试,功能测试,性能测试
  16. 自动化:
  17. 自动化测试
  18. 自动化部署
  19. 日志:
  20. 格式统一
    重点是要能方便地定位到问题, 比如对于同一个请求的所有日志加上相同的标识
  21. 日志级别一定要分清楚,方便做异常监控
  22. 日志监控
  23. 对于请求响应类型的服务,建议分成以下日志文件:
    1. main.log / app.log 主日志,INFO 级别, 保留 15 天
    2. trace.log 调试日志,DEBUG 级别, 保留 3 天
    3. error.log 异常日志,ERROR 级别, 保留 30 天, 可以考虑加上
    4. monitor.log 监控日志
    5. access.log 访问日志
    6. api.log API 调用日志
    7. event.log 重要的时间点记录下来,比如 REQUEST_START, REQUEST_END 等, 保留 30 天
    8. data.log / db.log 数据库操作(包含 Redis), 保留 30 天
    9. message.log / mq.log MQ 消息, 保留 30 天
  24. 对于有监控需求的日志应该加上特殊标识,比如 Monitor:Daily, Monitor:5m, Monitor:UpstreamError
    这个根据监控策略来。
  25. 新开发的逻辑可以加入尽可能多的调试信息,日后根据实际情况调整。
  26. 设计:
  27. 需求评审之后,就要做设计评审(方案评审)
    1. 如果涉及数据库调整,应该由数据库团队参与评审
    2. 如果设计加购调整,应该由架构团队参与评审
  28. 对外接口调整需要谨慎
  29. 其他:
  30. 应当尽可能了解自己参与的项目,重要的数据应该能记住,比如重点客户信息,性能指标,流量等。

#23 ASN.1

2020-01-30

我印象中曾在某个项目中接触到了这种格式,但是一时间竟也想不起来。
PS: 可能是有一次涉及 LDAP 协议的时候。

概念

ASN 全名 Abstract Syntax Notation, 翻译过来就是:抽象语法标记。
ASN.1 可能是第一版的意思(?)。

asn.1 是一套国际标准,用来定义一种通用的、严谨的数据表示(标记)方法,以及对应的数据编码格式。
PS:对数据 Scheme 的定义独立于硬件架构和编程语言。

  • ITU-T Rec. X.680 (2015) | ISO/IEC 8824-1:2015
    Specification of basic notation
  • ITU-T Rec. X.681 (2015) | ISO/IEC 8824-2:2015
    Information object specification
  • ITU-T Rec. X.682 (2015) | ISO/IEC 8824-3:2015
    Constraint specification
  • ITU-T Rec. X.683 (2015) | ISO/IEC 8824-4:2015
    Parameterization of ASN.1 specifications
  • ITU-T Rec. X.690 (2015) | ISO/IEC 8825-1:2015
    BER, CER and DER
    PS:常见证书格式 der 就是来自这个 DER。
  • ITU-T Rec. X.691 (2015) | ISO/IEC 8825-2:2015
    PER (Packed Encoding Rules)
  • ITU-T Rec. X.692 (2015) | ISO/IEC 8825-3:2015
    ECN (Extended Component Notation)
  • ITU-T Rec. X.693 (2015) | ISO/IEC 8825-4:2015
    XER (XML Encoding Rules)
  • ITU-T Rec. X.694 (2015) | ISO/IEC 8825-5:2015
    Mapping W3C XML schema definitions into ASN.1
  • ITU-T Rec. X.695 (2015) | ISO/IEC 8825-6:2015
    Registration and application of PER encoding instructions
  • ITU-T Rec. X.696 (2015) | ISO/IEC 8825-7:2015
    OER (Octet Encoding Rules)
  • ITU-T Rec. X.697 (2017) | ISO/IEC 8825-8:2018
    JER (JSON Encoding Rules)

一般又被称之为 X.680 系列,最早是 1995 年出第一版。最新的是 2018 年出的 5.4 版(X.680 (2015) Amd. 1)
PS:2021 年 X.680 出了第六版。

部分应用层的网络协议就使用了 ASN.1 格式,比如 X.500 Directory Services,LDAP,VoIP,PKCS,Kerberos,移动通信(2G/GSM,GRPS,一直到 5G)。

它和 JSON 这种通用数据交换格式完全不同,更加类似与 protobuf,msgpack,thrift 这样,提供一个完备的数据定义语法用来声明 Schema(ASN.1 称之为模块),然后基于二进制紧凑地表示数据。所以非常适合用在 C/S 架构的网络编程上,作为服务通讯协议的一部分,负责内外数据交换,也就是 TCP/UDP 服务的接口部分。

如果要将 ASN.1 归类的话,更贴切的应该是接口定义语言,或者叫协议定义语言。

要是了解到 ASN.1 出现的年份(1984)的话,对照它的竞争者出现的时间,会发现它的设计确实比较超前。不管怎么说,这些晚辈确实更加流行,作为国际标准的 ASN.1 不够卖座,肯定是也有不好的地方。
PS:可能是 ASN.1 历史包袱太重, 不够轻便 (我看到的一些评论和我的猜想比较符合)。

数据定义

先来一个示例(维基上找来的,感觉没啥意义):

FooProtocol DEFINITIONS ::= BEGIN

    FooQuestion ::= SEQUENCE {
        -- 跟踪编号,后面括号是限制值的范围
        trackingNumber INTEGER(0..199),
        -- 问题内容,字符串
        question       IA5String
    }

    FooAnswer ::= SEQUENCE {
        -- 问题编号
        questionNumber INTEGER(10..20),
        -- 答案内容
        answer         BOOLEAN
    }

    FooHistory ::= SEQUENCE {
        -- 问题数组
        questions SEQUENCE(SIZE(0..10)) OF FooQuestion,
        -- 答案数组
        answers   SEQUENCE(SIZE(1..10)) OF FooAnswer,
        -- 一个整型数组
        anArray   SEQUENCE(SIZE(100))  OF INTEGER(0..1000),
        ...
    }

END

基本语法

  1. 大小写字母,数字,短横杠,空格
    标识符:小写字母开头
    类型名称:大写字母开头
  2. 多个空白符号(空格、换行)会当作一个空格
  3. 数据类型都有一个 TagNumber
  4. -- 注释

数据类型

简单类型
结构化类型
标记类型
其他类型:CHOICEANY

类别:

  • 0 Universal 通用类型
  • 1 Application 应用协议相关类型
  • 2 Context-specific
  • 3 Private 自定义

结构化:

原始类型:

Type Tag number 备注
INTEGER 2 整型
BIT STRING 3
OCTET STRING 4
NULL 5 NULL
OBJECT IDENTIFIER 6 对象
SEQUENCE and
SEQUENCE OF
16 数组
SET and SET OF 17 集合
PrintableString 19 字符串
T61String 20
IA5String 22
UTCTime 23 时间

示例:


编码规则

  • 基本编码规则(BER,Basic Encoding Rules)
  • 规范编码规则(CER,Canonical Encoding Rules)
  • 唯一编码规则(DER,Distinguished Encoding Rules)
  • 压缩编码规则(PER,Packed Encoding Rules)
  • XML 编码规则(XER,XML Encoding Rules)

Python

https://www.cnblogs.com/20175211lyz/p/12769883.html
https://github.com/etingof/pyasn1

上面的示例通过 asn1ate /tmp/foo.asn > /tmp/foo.py 生成 Python 代码:
PS:并不是一定需要定义成这样类的结构,只是 pyasn1 库适合这样用而已。

from pyasn1.type import univ, char, namedtype, namedval, tag, constraint, useful


class FooAnswer(univ.Sequence):
    pass


FooAnswer.componentType = namedtype.NamedTypes(
    namedtype.NamedType('questionNumber', univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(10, 20))),
    namedtype.NamedType('answer', univ.Boolean())
)


class FooQuestion(univ.Sequence):
    pass


FooQuestion.componentType = namedtype.NamedTypes(
    namedtype.NamedType('trackingNumber', univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, 199))),
    namedtype.NamedType('question', char.IA5String())
)


class FooHistory(univ.Sequence):
    pass


FooHistory.componentType = namedtype.NamedTypes(
    namedtype.NamedType('questions', univ.SequenceOf(componentType=FooQuestion()).subtype(subtypeSpec=constraint.ValueSizeConstraint(0, 10))),
    namedtype.NamedType('answers', univ.SequenceOf(componentType=FooAnswer()).subtype(subtypeSpec=constraint.ValueSizeConstraint(1, 10))),
    namedtype.NamedType('anArray', univ.SequenceOf(componentType=univ.Integer().subtype(subtypeSpec=constraint.ValueRangeConstraint(0, 1000))).subtype(subtypeSpec=constraint.ValueSizeConstraint(100, 100)))
)

然后就可以使用了:

import foo
from pyasn1.codec.der.encoder import encode
fa = foo.FooAnswer()
fa['questionNumber'] = 10
fa['answer'] = False

fa_encoded = encode(fa)
print(fa_encoded)  # b'0\x06\x02\x01\n\x01\x01\x00'
print(binascii.b2a_hex(fa_encoded).decode())  # 300602010a010100

from pyasn1.codec.der.decoder import decode
obj, rest = decode(fa_encoded)
print(obj)
# Sequence:
#  field-0=10
#  field-1=False
for k, v in obj.items():
    print([k, v])
    # ['field-0', <Integer value object, tagSet <TagSet object, tags 0:0:2>, payload [10]>]
    # ['field-1', <Boolean value object, tagSet <TagSet object, tags 0:0:1>, subtypeSpec <ConstraintsIntersection object, consts <SingleValueConstraint object, consts 0, 1>>, namedValues <NamedValues object, enums False=0, True=1>, payload [False]>]

obj, rest = decode(fa_encoded, asn1Spec=foo.FooAnswer())
print(obj)
# FooAnswer:
#  questionNumber=10
#  answer=False
# print(dict(obj.items()))
print(dict([(k, str(v)) for k, v in obj.items()]))
# {'questionNumber': '10', 'answer': 'False'}

print(obj['questionNumber'].__dict__)
print(obj['questionNumber']._value)  # 10
print(obj['answer'].__dict__)
print(obj['answer']._value)  # 0
print([int(obj['questionNumber']), bool(obj['answer'])])

GitHub 找到的几个相关库:

  • wbond/asn1crypto stars Python ASN.1 library with a focus on performance and a pythonic API
  • etingof/pyasn1 stars Generic ASN.1 library for Python
  • eerimoq/asn1tools stars ASN.1 parsing, encoding and decoding.
  • P1sec/pycrate stars A Python library to ease the development of encoders and decoders for various protocols and file formats; contains ASN.1

参考资料与拓展阅读

#22 容错、高可用、灾备

2019-11-19

阮一峰的博文(容错,高可用和灾备)中说:

  • 容错:发生故障时,如何让系统继续运行。
    飞机的四个引擎坏了一个还能继续飞行,汽车的四个轮子坏了一个也能将就驾驶。
  • 高可用:系统中断时,如何尽快恢复。
    汽车的备胎,用于快速恢复正常驾驶(允许短暂的业务中断)。
  • 灾备:系统毁灭时,如何抢救数据。
    飞机的弹射装置,保证最核心的“资产” —— 驾驶员能够存活。

#21 开发者 Cheatsheets

2019-11-18

Linux

  • https://linuxopsys.com/topics/linux-commands-cheat-sheet
  • grep
  • awk

Bash & ShellScripting

  • https://oit.ua.edu/wp-content/uploads/2020/12/Linux_bash_cheat_sheet-1.pdf
  • http://www.cheat-sheets.org/saved-copy/shellscripcheatsheet.pdf

Linux Network

  • https://opensource.com/downloads/cheat-sheet-networking
  • https://opensource.com/sites/default/files/gated-content/osdc_cheatsheet-networking-2021.4.8.pdf
  • Hacking Tools Cheat Sheet

Windows

cmd

  • http://www1.cs.columbia.edu/~sedwards/classes/2017/1102-spring/Command%20Prompt%20Cheatsheet.pdf
  • https://phoenixnap.com/kb/wp-content/uploads/2023/01/windows-cmd-commands-cheat-sheet-pdf.pdf

PowerShell

  • http://ramblingcookiemonster.github.io/images/Cheat-Sheets/powershell-basic-cheat-sheet2.pdf

Vim

  • https://phoenixnap.com/kb/vim-commands-cheat-sheet
  • https://www.cs.cmu.edu/~15131/f17/topics/vim/vim-cheatsheet.pdf
  • https://github.com/dennyzhang/cheatsheet-vim-A4
  • https://github.com/dennyzhang/cheatsheet-vim-A4/blob/master/cheatsheet-vim-A4.pdf
  • https://gitee.com/chloneda/vim-cheatsheet

Python

  • https://hackr.io/blog/python-cheat-sheet
  • https://www.pythoncheatsheet.org/
  • https://static.realpython.com/python-cheat-sheet.pdf
  • https://static.realpython.com/python_cheat_sheet_v1.pdf
  • https://courses.cs.washington.edu/courses/cse163/22wi/resources/python-cheat-sheet.pdf

Django

  • http://cheat-sheets.org/saved-copy/django_reference_sheet.pdf
  • https://cheatography.com/ogr/cheat-sheets/django/
  • https://edu.anarcho-copy.org/Programming%20Languages/Python/Python%20CheatSheet/beginners_python_cheat_sheet_pcc_django.pdf
  • https://www.riptutorial.com/Download/django-rest-framework.pdf
  • https://books.agiliq.com/_/downloads/django-api-polls-tutorial/en/latest/pdf/

NumPy

  • http://www.cheat-sheets.org/saved-copy/numpy-cheat-sheet.20210604.pdf

Golang

  • http://www.cheat-sheets.org/saved-copy/go-lang-cheat-sheet-master.20181212/golang_refcard.pdf
  • https://golang.sk/images/blog/cheatsheets/go-cheat-sheet.pdf
  • https://github.com/fedir/go-tooling-cheat-sheet
  • https://raw.githubusercontent.com/fedir/go-tooling-cheat-sheet/master/go-tooling-cheat-sheet.pdf

C/C++

  • http://dcjtech.info/wp-content/uploads/2017/09/C-Programming.pdf
  • https://cheatography.com/ashlyn-black/cheat-sheets/c-reference/
  • https://opensource.com/sites/default/files/gated-content/cheat_sheet_c.pdf
  • https://courses.cs.washington.edu/courses/cse351/14sp/sections/1/Cheatsheet-c.pdf
  • https://web.pa.msu.edu/people/duxbury/courses/phy480/Cpp_refcard.pdf
  • https://cheatography.com/technecure/cheat-sheets/c-cheatsheet/
  • https://cppcheatsheet.readthedocs.io/_/downloads/en/latest/pdf/
  • https://cheatography.com/benjy/cheat-sheets/c/

Java

  • https://computinglearner.com/wp-content/uploads/2021/09/Java-Cheat-Sheet.pdf

PHP

  • https://websitesetup.org/wp-content/uploads/2020/09/PHP-Cheat-Sheet.pdf

Web

HTML

  • https://html.com/wp-content/uploads/html-cheat-sheet.pdf

CSS

  • https://websitesetup.org/wp-content/uploads/2019/11/wsu-css-cheat-sheet-gdocs.pdf

JavaScript

  • https://websitesetup.org/wp-content/uploads/2020/09/Javascript-Cheat-Sheet.pdf

jQuery

  • https://websitesetup.org/wp-content/uploads/2017/01/wsu-jquery-cheat-sheet.pdf
  • https://cheat-sheets.org/saved-copy/wsu-jquery-cheat-sheet.pdf

Vue

  • https://learnvue.co/LearnVue-Vue-3-Cheatsheet.pdf
  • https://vuejs-tips.github.io/cheatsheet/vuejs-cheatsheet.pdf

Redis

  • http://stephendavies.org/cpsc350/redisCheatSheet.pdf

MySQL

  • https://phoenixnap.com/kb/wp-content/uploads/2021/04/MySQL-Commands-Cheat-Sheet-by-PhoenixNAP.pdf

MongoDB

  • https://cheatography.com/isaeus/cheat-sheets/mongodb/
  • http://stephendavies.org/cpsc350/mongoCheatSheet.pdf
  • https://www.goalkicker.com/MongoDBBook/MongoDBNotesForProfessionals.pdf

RabbitMQ

  • https://pika.readthedocs.io/_/downloads/en/stable/pdf/

工具

Git

  • https://education.github.com/git-cheat-sheet-education.pdf

Excel

  • https://download.microsoft.com/download/5/4/c/54cd97c1-0213-46a7-b659-95f1c9145f42/Excel_shortcuts_cheat_sheet.pdf

PyTorch

  • https://www.mad.tf.fau.de/files/2019/07/pytorch-cheatsheet-en.pdf

#19 LaTeX

2019-07-21

TeX

/tɛx/

TeX 是计算机科学领域传奇人物高德纳教授 1978 年在完成《计算机程序设计艺术》(The Art of Computer Programming)一书时顺手开发出来,理由是当时的计算机排版技术会影响这本书的印刷质量。而且,与 TeX 一同发明出来的还有一种用于定义矢量字体的编程语言 Metafont,不过这种语言并没有被广泛使用,毕竟字体开发者多半是做美术设计的人,应该在理解编程方面有很大的障碍。

TeX 是很多领域的出版物排版领域都是事实标准,这个名字可以指相关排版系统,也可以指那套排版系统所使用的语法。

TeX 是一个共有领域项目,鼓励别个自己改进完善这个项目。而且其项目管理特别有意思,规定 3.0 做功能冻结,之后按照 π 的小数位来版本更新,只做 BUG 修复,在作者(高德纳)死之后,版本修改为 π,然后剩下的错误修复都当作是新功能来提交。

最知名的 TeX 发行版:TeX Live,它由 TeX User Group 发布,是目前大多数 Unix-like 机器上默认的 TeX 版本。Tex 引擎作为其核心(可以认为是现在的官方版本吧),另外还包含必要字体和相关工具(最重要的是 TeX 编辑器),可能还有一些重要拓展,比如 XeTeX(Unicode 和现代字体技术支持)、LuaTeX(内置 Lua 支持) 等。

其他:

  1. TeX 输出设备无关的 DVI 文件,用来显示和打印都行。
  2. 老爷子还设计了 Plain TeX 对 TeX 进行一种封装,或者说一组宏集。

LaTex

/ˈlɑːtɛx/

LaTeX 算是 TeX 的派生软件,使用 TeX 作为排版引擎,当前的版本是LaTeX2e。

我的理解:LaTex 是在 TeX 上面附加了一组宏集,进一步屏蔽了 TeX 层的复杂性,简化了 TeX 的使用。

由于 TeX 可以认为是领域编程(DSL),而这个库里面有各种预订的规则,然后基于这些预设规则,我们可以很容易完成排版,比如有一个包描述了象棋棋谱相关规则,我们就可以通过简单的几句描述一个棋盘。

其内容与样式分离的设计思路有点类似 HTML + CSS,或者说 XML + XSL,通过命名空间定义一组标签,然后 XML 使用这组标签写文档,最后 XSL 上来渲染。LaTeX 完成了很多领域命名标签的定义,然后还有预定义的各种样式,基本上只需要采用相关语法写自己的文档就行。

常用语法

参考资料与拓展阅读

#18 Facebook 数字货币项目 Libra 的国会听证会

2019-07-16

背景:美国国会叫停 Facebook 数字货币项目

今天的听证会上,小扎声明:

  1. 在获批之前,不会继续推动项目;
  2. 上线之后一定会配合监管,确保不被用于洗钱和恐怖主义融资。

有意思的是,他特意提到中国,表示如果一再受阻,中国央行会抢在他们前面有所动作(可能是说推出数字货币)。

值得注意的是,Libra 项目的几个重要合作者,包括 eBay、PayPal、Stripe、Visa、MasterCard,已经退出了。

#17 美国国会叫停 Facebook 数字货币项目

2019-07-03

目前 Facebook 已经联合了万事达、Visa、PayPal、Uber、Lyft、Spotify 等在内的共 28 家公司,组建总部位于瑞士 Libra 合作组织(数字货币 Libra / 数字钱包 Calibra)。

  1. 通过去中心化的、可编程的数据库来支持小波动的加密货币(稳定币)
  2. Libra 核心代码托管在 GitHub,采用 Apache-2.0 开源许可证

美国众议院财政服务委员担忧此项目会导致新全球金融体系的建立,对美国货币政策产生干扰,甚至影响美元地位,故而向扎克伯格等 Facebook 高管致函,要求其立即停止该项目所有工作。

关联事件:2019/07/16 参议院就 Libra 项目举行听证会

#15 邮件大小统计

2019-04-14

突然想了解一下我们 SMTP 服务中的入栈邮件大小,于是写了点脚本分析一下。
先上结论:
截图