#340 Django 3.0 发布,开始支持异步功能

2019-09-16

Django 项目组试图在保持向后兼容的基础之上,对阻塞部分进行改造,使之支持异步(通过装饰器的方式)。
包括 Session、Auth、ORM 与 Handlers 等。

ASGI 模式将 Django 作为原生异步应用程序运行,原有的 WSGI 模式将围绕每个 Django 调用运行单个事件循环,以使异步处理层与同步服务器兼容。

在这个改造的过程中,每个特性都会经历以下三个实现阶段:

  • Sync-only,只支持同步,也就是当前的情况
  • Sync-native,原生同步,同时带有异步封装器
  • Async-native,原生异步,同时带同步封装器

Django 3.0 开始提供运行 ASGI 应用支持,让 Django 逐渐具备异步功能。做了这一改动后,Django 现在会感知到异步事件循环,并将阻止从异步上下文调用标记为 “异步不安全” 的代码(例如 ORM 操作),如果开发者之前使用的是异步代码,则可能会触发。如果看到 SynchronousOnlyOperation 错误,可以仔细检查代码并将数据库操作移到同步子线程中。

其它方面,Django 现在支持 MariaDB 10.1 及更高版本;新的 ExclusionConstraint 类可以在 PostgreSQL 上添加排除约束;输出 BooleanField 的表达式现在可以直接在 QuerySet 过滤器中使用,而无需先注解然后对注解进行过滤;自定义枚举类型 TextChoices、IntegerChoices 和 Choices 现在可用作定义 Field.choices 的方法。

需要特别注意的是:自从 2.2 之后,Django 将不再支持 Python 3.5。

更新说明:https://docs.djangoproject.com/en/dev/releases/3.0

#339 Django 版本历史

2019-09-16
Ver Date Notes
1.0 2008-09-03  
1.1 2009-07-29  
1.2 2010-05-17  
1.3 2011-03-23  
1.4 2012-03-23 LTS
1.5 2013-02-26  
1.6 2013-11-06  
1.7 2014-09-02  
1.8 2015-04-01 LTS 2018-04-01
1.9 2015-12-01  
1.10 2016-08-01  
1.11 2017-04-04 LTS 2020-04-01
2.0 2017-12-02  
2.1 2018-08-01  
2.2 2019-04-01 LTS 2022-04-01
3.0 2019-12-02  
3.1 2020-08-04  
3.2 2021-04-06 LTS 2024-04-01
4.0 2021-12-07  
4.1 2022-08  
4.2 2023-04 LTS 2026-04-01
5.0 2023-12  

#337 MySQL 数据类型总结

2019-08-25

数值

  • bit [1 - 64]

  • tinyint 1

  • smallint 2
  • mediumint 3
  • int 4
  • bigint 8

  • float 4 浮点(单精度)

  • double 8 浮点(双精度)
  • decimal(m, d) max(m, d) + 2 定点

别名 Synonyms:

  • integer -> int
  • bool / boolean -> tinyint(1)
  • dec / numeric / fixed -> decimal
  • double precision / real -> double

PS: 如果开启 REAL_AS_FLOAT 模式,REAL 就变成了 FLOAT 的别名。

字符串/文本

  • char
  • varchar

  • tinytext

  • text
  • mediumtext
  • longtext

  • JSON MySQL 5.7 加入

二进制

  • binary
  • varbinary

  • tinyblob

  • blob
  • mediumblob
  • longblob

时间

类型 长度 备注
year 1 四位数:1901 ~ 2155
两位数:00 ~ 69 (2000 ~ 2069) 70 ~ 99 (1970 ~ 1999)
date 3 1000-01-01 ~ 9999-12-31
time 3 -838:59:59.999999 ~ 838:59:59.999999
即:-34d23h ~ 34d23h
datetime 8 1000-01-01 00:00:00.000000 ~
9999-12-31 23:59:59.999999
timestamp 4 1970-01-01 00:00:00 ~
2038-01-19 11:14:07
  1. 用字符串(varchar)表示时间,除了失去数据库这一层的数据类型保证之外,还会在时间比较运算场景下,失去索引命中可能。
  2. 用整型数 bigint(8 字节)表示时间,可以扩大 timestamp 时间范围,但要自己维护数据(其实还是比较好维护的)。
  3. 带时区的时间:timestamp
  4. 带精度的时间:timedatetimetimestamp,精度最大为 6,表示毫秒。比如:timestamp(6)

其他

  • enum
  • set
  • Geometry 系列

货币

  1. 以分为单位 Integer
  2. Decimal,不要用 floatdouble

参考资料与拓展阅读

#336 PowerShell 在 Ubuntu 下的安装和试用

2019-08-22

PowerShell 的最近的一次更新修复了其作为 SSH 的登录 Shell 的一些问题。
Win 10 对 NFS,SSH 的支持推进也是有目共睹。
随着 MS 对 Windows 的策略调整,估计以后 Windows 服务器也会变多。

# Download the Microsoft repository GPG keys
wget -q https://packages.microsoft.com/config/ubuntu/18.04/packages-microsoft-prod.deb

# Register the Microsoft repository GPG keys
sudo dpkg -i packages-microsoft-prod.deb

# Update the list of products
sudo apt-get update

# Enable the "universe" repositories
sudo add-apt-repository universe

# Install PowerShell
sudo apt-get install -y powershell

# Start PowerShell
pwsh

PS 常用命令

# 获取本地 IP
(invoke-webrequest -uri "http://ifconfig.me/ip").content

get-nettcpconnection | where-object {$_.State -eq "Listen"}
get-nettcpconnection -localport 49667
get-process -id (get-nettcpconnection -localport 49667).owningprocess
stop-process -id (get-nettcpconnection -localport 11).owningprocess

"# README" | out-file README.md
type README.md

#335 Shell 编程备忘录

2019-08-21

PS: Shell 编程时总是不能区分什么是 Shell 语法,什么是系统命令。

基础

x=abc

echo hello world
echo 'Just output $x'
echo "The value of x: $x"

echo ${x:?变量未设置}
echo ${x:+变量已设置}
echo ${x:-默认值}

变量

Shell 就是标准的弱类型,所有的数据都是按照字符串的形式存储,然后根据上下文决定如何处理。

x='hello world' # 等于号两边不能有空格
local x='hello world' # 本地作用域,函数体中使用
echo $a
echo ${a}

unset a
readonly a  # 将变量设置成只读,不能修改,不能 unset
readonly b=1
# 没有提供方法取消 readonly 属性,但是我看到 SO 上有提供非常规方法来做这件事情

字符串变量

单引号不支持变量和转义(也就是说字符串中不能出现单引号)!

x="hello world"
echo $x

echo ${#x}
echo ${x/world/markjour} # 字符串替换

# 子字符串/字符串切片
echo ${x::5}  # hello
echo ${x:7:8} # world
echo ${x::4}  # hell
echo ${x::-4} # hello w

特殊变量

$0
$1
...
$n

# 所有参数
$*
$@

$# # 参数个数
$$ # 进程号
$! # 后台进程号
$? # 上一个命令的退出状态
$- # himBHs 当前 Shell 的选项

数组

arr=(zhao qian sun li)
arr[4]=zhou
arr[5]=wu
arr[6]=zheng
arr[7]=wang
echo ${arr[0]} # zhao
echo ${arr[@]} # zhao qian sun li zhao wu zheng wang

# 获取数组元素个数
echo ${#arr}    # 4 定义时的长度,后来新加的不算,也就是说这个值定义变量的时候就定了
echo ${#arr[@]} # 8

条件

if condition:
then
    :
else:
    :
fi
  • [ ]
  • [[ ]]
  • test

循环

for var in list:
do
    :
done

数学计算

test

逻辑

数学比较

字符串比较

文件相关

bcdfgkpurwxse
白菜豆腐干,靠谱如我,羞涩

最常用的:

  • -e 检查路径是否存在
  • -d 检查是否为目录
  • -f 检查是否为文件
  • -r 检查文件是否可读
  • -w 检查文件是否可写
  • -x 检查文件是否可执行
  • -s 检查文件是否为空

参考资料与拓展阅读

#334 Requests 的日志配置

2019-08-09
import http.client
import logging

import requests

LOG_LEVEL = logging.DEBUG
LOG_FORMAT = '%(asctime)s [%(thread)s] [%(name)s:%(funcName)s#%(lineno)d] %(levelname)s %(message)s'
logging.basicConfig(level=LOG_LEVEL, format=LOG_FORMAT)

LOG_HTTP = logging.getLogger("http.client")

def httpclient_log(*args):
    LOG_HTTP.log(logging.DEBUG, " ".join(args))

http.client.print = httpclient_log
http.client.HTTPConnection.debuglevel = 1

#332 DNS 基础

2019-07-22

域名

Class rdataclass

RESERVED0 = 0
IN = 1
INTERNET = 1
CH = 3
CHAOS = 3
HESIOD = 4
HS = 4
NONE = 254
ANY = 255

Type rdatatype

  • A IPv4 Address
  • AAAA IPv4 Address
  • CNAME Canonical Name,“规范名称”,其实就是别名,指向另一个域名。MX 记录和 NS 记录不能指向一个 CNAME 记录。
  • NS Name Server,权威 DNS 服务器位置。
  • MX Mail Exchange,邮件服务位置。
  • SRV 通用的服务类型记录,取代 MX 这种专用记录。
_xmpp-client._tcp.example.net. 86400 IN SRV 5        0      5222 example.net.
_xmpp-server._tcp.example.net. 86400 IN SRV 5        0      5269 example.net.
#                              TTL          Priority Weight Port
  • TXT
  • SOA Start Of Authority,权威记录起始
  • PTR 反解记录

反解记录

记录名称:IP 翻转过来,加上 .in-addr.arpa 后缀
记录类型:PTR

dig -x 106.75.80.125
dig +noall +answer -tPTR 125.80.75.106.in-addr.arpa

完整的 DNS 解析过程

  1. 找到权威服务器

Windows

nslookup
ipconfig /displaydns
ipconfig /flushdns

Linux

dig markjour.com A
dig @8.8.8.8 markjour.com

dig qq.com MX
dig MX qq.com
dig -t MX qq.com
dig +noall +answer qq.com
dig +short qq.com
dig qq.com ANY

dig +trace +nssearch markjour.com

DNS 请求和响应

  • header 2Bytes
Field Bits Desc
QR 1 query 0, reply 1
OPCODE 4 QUERY 0, IQUERY 1, STATUS 2
AA 1 Authoritative Answer
TC 1 TrunCation
RD 1 Recursion Desired
RA 1 Recursion Available
Z 3 Zero 填零,保留
RCODE 4 Response Code

RCODE:

  • NOERROR (0)
  • FORMERR (1, Format error)
  • SERVFAIL (2)
  • NXDOMAIN (3, Nonexistent domain)

  • body

  • question

    Field Bits Desc
    NAME 可变 资源名称
    TYPE 2 记录类型
    CLASS 2 Class Code

    CLASS Code rdata.class

    RESERVED0 = 0
    IN = 1
    INTERNET = 1
    CH = 3
    CHAOS = 3
    HESIOD = 4
    HS = 4
    NONE = 254
    ANY = 255
    
  • answer

  • authority
  • additional space

请求

响应

参考资料与拓展阅读

#331 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 完成了很多领域命名标签的定义,然后还有预定义的各种样式,基本上只需要采用相关语法写自己的文档就行。

常用语法

参考资料与拓展阅读