#343 Python sys.audit

2019-11-06

在学习 subprocess 模块的时候看到代码中有一行:

sys.audit("subprocess.Popen", executable, args, cwd, env)

才了解到 Python 3.8 中新加了这样一个审计功能。

作用

提供一种机制,对 Python 程序执行过程中的部分关键操作进行干预,比如记录事件、引发异常、中止操作或完全终止进程。

部分关键操作发生的时候,Python 会调用我们定义的钩子方法。

注意:官方提示,恶意代码可以轻易绕过这些钩子,不要指望审计钩子能用来创建一个安全的 sandbox。
注意:sys.addaudithook 方法的调用会触发一个同名的事件。如果现有的钩子方法抛出 Runtime 异常,则不会添加这个钩子。

支持的审计事件

CPython 定义了一些事件:Audit events table,比如:

  • import
  • exec
  • compile
  • os.exec
  • os.listdir
  • os.rmdir
  • os.spawn
  • os.walk
  • os.system
  • subprocess.Popen

使用

sys.audit 方法是官方定义和执行的,Python 运行时负责抛出审计事件,我们程序只管使用系统方法 sys.addaudithook(hook) 来添加审计钩子处理这些事件。

import sys

def hook(event, args):
    print('%s: %r' % (event, args))

sys.addaudithook(hook)

import math
num = math.ceil(100 / 3)
print(num)

#342 电磁波与可见光

2019-11-03

光、电、磁三者好像完全没有关系。但是近代的一些科学研究表明它们其实是一种东西 —— 电磁波。

1873 年,42 岁的麦克斯韦出版了《论电和磁》,预言了电磁波的存在,同时认为光是电磁波的一种。
PS: 1879 年,48 岁的麦克斯韦因病去世,同年,爱因斯坦诞生。

1905 年,奇迹之年,最著名的“民科” —— 26 岁的专利局职员爱因斯坦发表了一篇论文《On the Electrodynamics of Moving Bodies》,中文翻译为“论动体的电动力学”。论文中指出,电和磁是在不同参考系中观察到的同一种现象。

最后,科学家发现 光、电、磁 的本质,和微观粒子,和量子力学有很大的关系。

我敢说,对于 光、电、磁 三者本质的认知,目前,最顶尖的科学家也不敢打包票。

什么是光?

我们所说的光,又称之为可见光,与紫外线、红外线、X 光等区分开。
实质上来讲,可见光只是电磁波谱上一小段频谱,我们的肉眼对这一段比较敏感而已。
PS: 不同动物对不同频段的电磁波敏感度不同,所以其他动物(比如昆虫)看到的世界和我们很大有很大差异。

img

高中物理就告诉我们:

  1. 光是一种电磁波,波长在 500nm 左右。
  2. 光是由光子组成的粒子流。
  3. 光同时具有波的特性、粒子的特性,这叫做波粒二象性。

电和磁

我们初中就开始学习电,老师教我们,电是由于电子运动产生的物理现象。通过施加电压,电子就会沿着电场运动。

磁则来自磁铁,或者电流。

电磁波

电磁波是指同相振荡且互相垂直的电场与磁场,在空间中以波的形式传递能量和动量,其传播方向垂直于电场与磁场的振荡方向。

  1. 电场和磁场相互垂直,同生同灭。
  2. 电场和磁场同相振荡。
  3. 电磁波可以传输能量和动量。

左手定律,右手定律,相信很多朋友记忆深刻。

电磁波的频率

img

频率由低到高(波长由长到短):

  • 无线电波: 300GHz 1mm ~ 3KHz 100km
  • 微波: 300MHz ~ 300GHz 1m
  • 我们的微波炉 2.45GHz。
  • 红外线 760nm ~ 1000nm (1mm)
  • 可见光 380nm ~ 780nm
  • 紫外线 10nm ~ 400nm
  • X 射线 0.01nm ~ 10nm
  • 伽马射线(γ射线): 小于 0.01nm
  • 用于医疗:放射治疗(放疗)、伽马刀
  • 超新星爆发

为什么光能透过空气、水、玻璃,不能透过墙壁?

参考资料与拓展阅读

#341 尝试 K8S(Kubernetes)

2019-10-15

安装

安装 minikube

curl -LO https://storage.googleapis.com/minikube/releases/latest/minikube-linux-amd64 && sudo install minikube-linux-amd64 /usr/local/bin/minikube
$ minikube version
minikube version: v1.0.0

安装 kubectl

https://packages.cloud.google.com/apt/doc/apt-key.gpg
https://apt.kubernetes.io/

sudo apt-get update && sudo apt-get install -y apt-transport-https curl
curl -s https://mirrors.aliyun.com/kubernetes/apt/doc/apt-key.gpg | sudo apt-key add -
echo "deb https://mirrors.aliyun.com/kubernetes/apt/ kubernetes-xenial main" | sudo tee -a /etc/apt/sources.list.d/kubernetes.list
sudo apt-get update
sudo apt-get install -y kubectl kubelet kubeadm

Docker 的配置文件:~/.docker/config.json。至少,docker login 之后会生成一个。

~/.minikube/

apt-get update && apt-get install -y apt-transport-https curl
curl -s https://packages.cloud.google.com/apt/doc/apt-key.gpg | apt-key add -
cat <<EOF >/etc/apt/sources.list.d/kubernetes.list
deb https://apt.kubernetes.io/ kubernetes-xenial main
EOF
apt-get update
apt-get install -y kubelet kubeadm kubectl
apt-mark hold kubelet kubeadm kubectl

参考资料与拓展阅读

#338 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

#337 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  

#335 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

参考资料与拓展阅读

#334 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