#660 中国正式申请加入 CPTPP
时事 2021-09-242021 年 9 月 16 日,中国申请加入 CPTPP。
coding in a complicated world
2021 年 9 月 16 日,中国申请加入 CPTPP。
hierarchical part
┌───────────────────┴─────────────────────┐
authority path
┌───────────────┴───────────────┐┌───┴────┐
abc://username:password@example.com:123/path/data?key=value&key2=value2#fragid1
└┬┘ └───────┬───────┘ └────┬────┘ └┬┘ └─────────┬─────────┘ └──┬──┘
scheme user information host port query fragment
urn:example:mammal:monotreme:echidna
└┬┘ └──────────────┬───────────────┘
scheme path
URI (统一资源标识符),标识一个资源主要有两种方法,根据名称(URN),根据路径(URL)。
URI 语法:
有一个问题就是注册的 URI scheme 基本上都可以认为是用于资源定位,所以 URI 和 URL 的概念就比较模糊了。
有的 scheme,比如说 data:<mediatype>[;base64],<data>
,既不算 URL,也不算 URI。
有的 scheme,比如说 sms:<phone number>?<action>
,我觉得是属于名称标识,但是不符合 URN 的定义(必须 urn:
)。
而且实际上,就比如说 URL http://example.com/user/create
,我们用来创建一个用户,如果套用万维网创建时的学院派设想,我们只能把创建这个动作理解成一个资源了。所以,我认为深入讨论这几个 “统一资源” 的概念之间到底存在什么差异没有什么意义,大致知道他们的渊源就够了:先随着 WWW 出来了 URL 的概念,然后又有人整出来一个 URN,再后来统一为 URI 标准,这几个概念本来就是混乱的,这就是现实生活,泾渭分明的概念只存在于那些教授们的理想中。
如果感兴趣可以参考 RFC 3305,这是一个 Infomational RFC,就是试图解释这几个概念,并向社区作出使用建议。
URL (统一资源定位符) = 协议://认证信息@主机名:端口号/路径?查询字符串#片段
协议必须是在 IANA 注册的合法 URI scheme。
我们最熟悉的是 HTTP URL,协议是 http 或者 https,除此之外还有其他的 IANA 批准的协议,比如:
mailto:<address>[?<header1>=<value1>[&<header2>=<value2>]]
imap://[<user>[;AUTH=<type>]@]<host>[:<port>]/<command>
git://github.com/user/project-name.git
file://[host]/path
or file:[//host]/path
view-source:<absolute-URI>
URN (统一资源名称) is 资源名称(唯一标识),格式:urn:<NID>:<NSS>
urn
就是 IANA 注册的众多 URI scheme 之一。这个命名空间标识 NID 也需要在 IANA 注册。
urn:isbn:0451450523
urn:ietf:rfc:2648
实际上,我好像没有见过什么地方在使用 URN,更别提设想中的统一资源属性 URC 了。
就好比上面提到的两个例子,ISBN: 0451450523,RFC 2648,直接这么写就是了,按照 RFC 定义写成标准的那一串实在是没见过。
URL 是 URI 中的因特网部分,用来指示网络资源位置。
import urllib.parse
a = urllib.parse.urlunparse('http', 'user:pass@example.com:8080', '/path', 'param1=a', 'a=1&b=2', 'Title')
# 'http://user:pass@example.com:8080/path;param1=a?a=1&b=2#Title'
b = urllib.parse.urlparse(a)
b.scheme # 0 'http'
b.netloc # 1 'user:pass@example.com:8080'
b.path # 2 '/path'
b.params # 3 'param1=a'
b.query # 4 'a=1&b=2'
b.fragment # 5 'Title'
b.username # 'user'
b.password # 'pass'
b.hostname # 'example.com'
b.port # 8080
print(b[2]) # '/path'
b = urllib.parse.urlparse(('pymysql+mysql://root:111111@1.1.1.1:3306/xiaorui_master?charset=utf8mb4'))
print(repr((b.scheme, b.netloc, b.path, b.params, b.query, b.fragment, b.username, b.password, b.hostname, b.port)))
('pymysql+mysql', 'root:111111@1.1.1.1:3306', '/xiaorui_master', '', 'charset=utf8mb4', '', 'root', '111111', '1.1.1.1', 3306)
这些个常见的词到底有啥区别?
所谓授权是指管理者把由他全权负责的一项或多项任务委派给下属员工,使下属拥有相当的自主权和行动权。
《冰雪奇缘2》中的插曲。
抖音上看到有人穿警服说,如果有人打你,你只要还手就是互殴,无关正当防卫。那普通人面对被打的情况该怎么正确处理?
一句话介绍 JWT:就是通过非对称加密算法签名的方式,将部分用户信息存在客户端。
全名 JSON Web Token,简称 JWT。
内容 = 头 Headers (JSON) + 负载 Payload (JSON) + 签名 Signature
分别 Base64 编码之后,用 .
连接。
import base64
def jsonify(obj):
return json.dumps(obj, ensure_ascii=False, separators=',:')
def base64urlEncoding(s):
return base64.urlsafe_b64encode(s).rstrip(b'=').decode('ascii')
def sign(key, msg):
return base64urlEncoding(hmac.new(key, msg, hashlib.sha256).digest())
# def verify(key, msg, sig):
# return key.verify(msg, base64.urlsafe_b64decode(sig))
def e(obj):
return base64urlEncoding(jsonify(header).encode('utf-8'))
def encode(key, header, payload):
s = e(header) + '.' + e(payload)
return s + '.' + sign(key, s)
def decode(token):
header_str, payload_str, sig = token.split('.')
header = json.loads(base64.urlsafe_b64decode(header_str).decode('utf-8'))
payload = json.loads(base64.urlsafe_b64decode(payload_str).decode('utf-8'))
sig = base64.urlsafe_b64decode(sig)
header = {
"alg": "HS256",
"typ": "JWT"
}
payload = {
"sub": "1234567890",
"name": "John Doe",
"iat": 1516239022
}
signature = HMAC_SHA256(
secret,
base64urlEncoding(header) + '.' +
base64urlEncoding(payload)
)
const token = base64urlEncoding(header) + '.' + base64urlEncoding(payload) + '.' + base64urlEncoding(signature)
Code | Name | Description |
---|---|---|
iss |
Issuer | .. |
sub |
Subject | .. |
aud |
Audience | .. |
exp |
Expiration Time | .. |
nbf |
Not Before | .. |
iat |
Issued At | .. |
jti |
JWT ID | .. |
Code | Name | Description |
---|---|---|
typ |
Type | .. |
cty |
Content Type | .. |
alg |
Algorithm | .. |
kid |
Key ID | .. |
x5c |
X.509 Certificate | .. |
x5u |
X.509 URL | .. |
x5t |
X.509 Thumbprint | .. |
jku |
JSON Web Key URL | .. |
jwk |
JSON Web Key | .. |
x5t#S256 |
X.509 SHA-256 Thumbprint | .. |
比如:Tornado 框架的 stars 数量:、
,再比如说这种:
外国人真是会玩,总有这样的好点子,在有限的环境(Markdown)中也能弄的丰富多彩的。
上面都是用的 shields.io 提供的服务,它内置了很多种类的图标,GitHub 关注数、Fork 数、Star 数、协议,Twitter 关注数、NPM 包大小、PyPI 下载数量等等,这些看他们官网提供的示例,照着用就是了。
还有一种,就是用户定制接口,格式:
https://img.shields.io/badge/<LABEL>-<MESSAGE>-<COLOR>
https://img.shields.io/static/v1?label=<LABEL>&message=<MESSAGE>&color=<COLOR>
https://img.shields.io/endpoint?url=<URL>&style<STYLE>
https://img.shields.io/badge/dynamic/json?url=<URL>&label=<LABEL>&query=<$.DATA.SUBDATA>&color=<COLOR>&prefix=<PREFIX>&suffix=<SUFFIX>
还有好多更加细致的规则,用来定制自己的图标,就不细说了,自己看文档就行。
其实我用的多的还是上面的第一种接口,因为它比较简单,只要把 label 和 message 修改就可以了。
https://img.shields.io/badge/site-markjour.com-brightgreen.svg?style=plastic&logo=nginx
https://img.shields.io/badge/-doing-green
看新闻说 Windows 11 必须要 TPM 模块才能正常运行,虚拟机和物理机都一样。
我也是第一次听说这个东西。
随手写的,以命名为主(原来想写的是命名规范,结果写超了纲)。