#380 Linux 磁盘使用情况检查
Linux 2020-03-14我们一般使用 du 命令,不正是做这个用的么(Disk Usage)?
du -hsc # 当前目录占用空间大小
du -hsc *.log* # 查看文件大小
du -hsc a b c d # 查看指定几个目录的大小
coding in a complicated world
我们一般使用 du 命令,不正是做这个用的么(Disk Usage)?
du -hsc # 当前目录占用空间大小
du -hsc *.log* # 查看文件大小
du -hsc a b c d # 查看指定几个目录的大小
TLS, Transport Layer Security, 传输层安全性协议
SSL, Secure Sockets Layer, 安全套接层
协议 | 发布时间 | 状态 | 说明 |
---|---|---|---|
SSL 1.0 | 未公布 | 未公布 | |
SSL 2.0 | 1995 年 | 2011 年弃用 | |
SSL 3.0 | 1996 年 | 2015 年弃用 | |
TLS 1.0 | 1999 年 | 2021 年弃用 | RFC 2246 |
TLS 1.1 | 2006 年 | 2021 年弃用 | RFC 4346 |
TLS 1.2 | 2008 年 | RFC 5246 | |
TLS 1.3 | 2018 年 | RFC 8446 |
现在主流的是 TLS 1.2 和 TLS 1.3。
相比之下,TLS 1.3 安全性更好,性能也更好。
搜索一下 tls1.2 tls1.3 difference
或者 tls1.2 tls1.3 performance
就能看到很多相关比较。
SSL/TLS 的本质就是非对称加密。
安全传输层协议(TLS)用于在两个通信应用程序之间提供保密性和数据完整性。
该协议由两层组成:
- TLS 记录协议(TLS Record)
- TLS 握手协议(TLS Handshake)
握手协议(handshake protocol)
密钥规格变更协议(change cipher spec protocol)
应用数据协议(application data protocol)
警报协议(alert protocol)。
HTTP/2 规范并没有要求使用 TLS,但是主流浏览器开发商全部选择在 TLS 之上实现 HTTP/2。
微软宣布从 2022 年 9 月 13 日起, Internet Explorer 和 EdgeHTML( WebView 控件的呈现引擎) 将默认禁用 TLS 1.0 和 1.1。禁用 TLS 1.0 和 1.1 的工作早在 2020 年提出,但当时新冠病毒在全球爆发,大量开发者居家办公,微软只能推迟淘汰 TLS 1.0 和 1.1 的时间。
注意:不是弃用,仍然可以通过配置打开相关支持。
main.log
/ app.log
主日志,INFO 级别, 保留 15 天trace.log
调试日志,DEBUG 级别, 保留 3 天error.log
异常日志,ERROR 级别, 保留 30 天, 可以考虑加上monitor.log
监控日志access.log
访问日志api.log
API 调用日志event.log
重要的时间点记录下来,比如 REQUEST_START, REQUEST_END 等, 保留 30 天data.log
/ db.log
数据库操作(包含 Redis), 保留 30 天message.log
/ mq.log
MQ 消息, 保留 30 天Monitor:Daily
, Monitor:5m
, Monitor:UpstreamError
丰田生产方式(Toyota Production System,简称 TPS)是一种以精益生产为核心的生产方式,由日本丰田汽车公司所创立。TPS 的目标是通过消除浪费、提高效率和质量,实现生产过程的最优化,从而提高企业的竞争力。
TPS 的核心思想是“精益生产”,即通过消除浪费来提高生产效率和质量。TPS 将浪费分为七种类型,包括:
TPS 通过消除这些浪费,实现生产过程的最优化。具体来说,TPS 采用了以下几种方法:
TPS 的成功得益于其对生产过程的精细管理和不断改进的精神。TPS 的思想已经被广泛应用于各个领域,成为了一种重要的管理理念。
早期只有一种浏览器存储方式,就是万维网早期,由网景公司设计,加入了 HTTP 1.0 的 Cookie。
HTTP5 的时代,一次性加入了三种 API,分别是 Web Storage,IndexedDB,Web SQL。
Set-Cookie: name=value; expires=Mon, 21 Oct 2019 07:28:00 GMT; path=/; domain=.example.com; secure; HttpOnly
expires
过期时间,GMT 格式。如果不设置该属性,则 Cookie 的生命周期为当前会话,即关闭浏览器后 Cookie 就会被删除。path
路径,表示该 Cookie 归属于哪个路径。默认为当前页面的路径。domain
域名,表示该 Cookie 归属于哪个域名。默认为当前页面的域名。secure
只能通过 HTTPS 协议传输,不能通过 HTTP 协议传输。HttpOnly
只在网络传输时使用,不能通过 JavaScript 访问。localStorage.setItem("key", "value");
var value = localStorage.getItem("key");
sessionStorage.setItem("key", "value");
var value = sessionStorage.getItem("key");
setItem(key, value)
存储数据getItem(key)
读取数据removeItem(key)
删除数据clear()
清空数据 (删除所有的键值对)key(index)
获取键名 (根据索引获取对应的键名)没有研究过。
// 打开数据库
var request = indexedDB.open("myDatabase", 1);
// 创建对象仓库
request.onupgradeneeded = function (event) {
var db = event.target.result;
var objectStore = db.createObjectStore("users", { keyPath: "id" });
objectStore.createIndex("name", "name", { unique: false });
objectStore.createIndex("age", "age", { unique: false });
};
// 存储数据
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(["users"], "readwrite");
var objectStore = transaction.objectStore("users");
var user = { id: 1, name: "张三", age: 20 };
var request = objectStore.add(user);
request.onsuccess = function (event) {
console.log("数据存储成功");
};
};
// 读取数据
request.onsuccess = function (event) {
var db = event.target.result;
var transaction = db.transaction(["users"], "readonly");
var objectStore = transaction.objectStore("users");
var index = objectStore.index("name");
var request = index.get("张三");
request.onsuccess = function (event) {
var user = event.target.result;
console.log(user);
};
};
与老婆签订的不平等条约,应她要求公开 😭
https://mp.weixin.qq.com/s/67qBDteTmHROeMwOBUeyaw
如何通过 Git 和 Husky 添加提交钩子并实现代码任务自动化
钩子 | 时机 | 用途 |
---|---|---|
pre-commit |
提交之前 | 代码检查 |
prepare-commit-msg |
提交信息生成之前 | 生成提交信息 |
commit-msg |
提交信息保存之前 | 检验提交信息 |
post-commit |
提交之后 | 通知,自动测试,CI 等 |
pre-push |
push 之前 | 代码检查,测试,编译打包 |
applypatch-msg |
生成补丁时 | 验证补丁信息 |
fsmonitor-watchman |
文件系统监视器发现变化时 | 触发版本控制操作 |
pre-applypatch |
应用补丁之前 | 验证补丁信息 |
pre-merge-commit |
合并之前 | 检查将要合并的分支是否符合要求 |
pre-rebase |
rebase 操作之前 | - |
push-to-checkout |
- | - |
pre-receive |
接受提交之前 | 代码检查,校验权限 |
post-receive |
接受提交之后 | 通知,自动测试,CI 等 |
update |
更新操作之前(分支、Tag) | 提供从旧版本到新版本的改动列表供用户审核 |
post-update |
更新操作之后(分支、Tag) | 通知,自动测试,CI 等 |
pre-receive
#!/usr/bin/env python
"""
每个人都只能提交代码到 username-date-branchName
username 是 git 用户名
date 是 mmdd 日期
branch 是分支描述,支持小写字母、数字、横杠,2 到 16 个字符
"""
import re
import subprocess
import sys
# 获取提交者的用户名
author = subprocess.check_output(['git', 'config', 'user.name']).decode().strip()
# 获取提交的分支名称
branch = subprocess.check_output(['git', 'rev-parse', '--abbrev-ref', 'HEAD']).decode().strip()
# 定义分支名称的正则表达式
branch_pattern = r'^%s-\d{4}-[a-z0-9\-]{2,}$' % (author,)
# 检查分支名称是否符合正则表达式
if not re.match(branch_pattern, branch):
print('Error: Branch name "{}" does not match the required pattern "{}"'.format(branch, branch_pattern), file=sys.stderr)
sys.exit(1)
# 解析日期并检查其是否合法
try:
_, date_str, _ = branch.split('-')
month, day = int(date_str[:2]), int(date_str[2:])
if month < 1 or month > 12 or day < 1 or day > 31:
raise ValueError
except ValueError:
print('Error: Invalid date format in branch name "{}"'.format(branch), file=sys.stderr)
sys.exit(1)
SMTP 会话中,发行方会通过 MAIL FROM
命令告诉收信方,这封邮件是谁发出的。
但是,由于邮件系统的设计上没有考虑如何对垃圾邮件进行有效防范,收信方需要一个机制来判断这封邮件的来源是否可靠。因此,人们提出了 SPF 方案:
MAIL FROM
地址之后,使用发信方 IP 地址和发信域 DNS 中记录的 IP 地址做一个比对。如果匹配,说明来源正确,否则,这封邮件可以被视为垃圾邮件,直接返回投递失败(硬退)。该方案 2006 年提交到 Network Working Group 成为草案,然后 2014 年成为建议标准。
注意:SPF 只是验证了邮件确实是从发信域所在网络投递出来的,但是不能防止邮件伪造和欺诈。应该结合其他技术,如 DKIM(DomainKeys Identified Mail)和 DMARC(Domain-based Message Authentication, Reporting, and Conformance),一起增强电子邮件的安全性。
dig +short txt qq.com
"v=spf1 include:spf.mail.qq.com -all"
dig +short txt spf.mail.qq.com
"v=spf1 include:qq-a.mail.qq.com include:qq-b.mail.qq.com include:qq-c.mail.qq.com include:biz-a.mail.qq.com include:biz-b.mail.qq.com include:biz-c.mail.qq.com include:biz-d.mail.qq.com -all"
dig +short txt qq-{a..c}.mail.qq.com biz-{a..d}.mail.qq.com
"v=spf1 ip4:101.226.139.0/25 ip4:101.91.43.0/25 ip4:101.91.44.128/25 ip4:112.64.237.128/25 ip4:116.128.173.0/25 ip4:121.51.40.128/25 ip4:121.51.6.0/25 ip4:162.62.52.214 ip4:162.62.55.67 ip4:162.62.57.0/24 ip4:162.62.58.211 ip4:162.62.58.216 -all"
"v=spf1 ip4:162.62.58.69 ip4:162.62.63.194 ip4:180.163.24.128/25 ip4:183.2.187.0/25 ip4:203.205.221.128/25 ip4:203.205.251.0/25 ip4:210.51.43.0/25 ip4:58.246.222.128/25 ip4:58.250.143.128/25 ip4:61.241.55.128/25 -all"
"v=spf1 ip4:113.108.92.0/25 ip4:121.14.77.0/25 ip4:81.69.217.16/28 ip4:54.164.151.162 -all"
"v=spf1 ip4:114.132.122.39 ip4:114.132.123.192 ip4:114.132.124.171 ip4:114.132.125.233 ip4:114.132.197.227 ip4:114.132.224.180 ip4:114.132.233.22 ip4:114.132.58.0/24 ip4:43.155.65.254 ip4:114.132.62.0/24 ip4:106.55.200.77 -all"
"v=spf1 ip4:114.132.63.24 ip4:114.132.64.0/26 ip4:114.132.65.219 ip4:43.155.67.158 ip4:114.132.67.179 ip4:114.132.73.137 ip4:114.132.74.132 ip4:43.154.209.5 ip4:43.154.197.177 ip4:43.154.155.102 ip4:43.155.80.173 ip4:43.154.221.58 -all"
"v=spf1 ip4:54.204.34.129 ip4:54.204.34.130 ip4:54.243.244.52 ip4:52.205.10.60 ip4:35.173.142.173 ip4:54.207.22.56 ip4:54.207.19.206 ip4:54.254.200.92 ip4:54.254.200.128 ip4:54.92.39.34 ip4:54.206.16.166 ip4:54.206.34.216 ip4:114.132.75.215 -all"
"v=spf1 ip4:52.59.177.22 ip4:18.194.254.142 ip4:18.132.163.193 ip4:18.169.211.239 ip4:13.245.186.79 ip4:13.245.218.24 ip4:15.184.224.54 ip4:15.184.82.18 ip4:114.132.76.87 ip4:114.132.77.159 ip4:114.132.78.196 ip4:114.132.79.153 ip4:43.154.54.12 -all"
"v=spf1":指定 SPF 记录的版本,目前只有 SPFv1 版本。
机制(Mechanisms):SPF 使用机制来指定哪些服务器被授权发送邮件。常用的机制有:
"all":定义了所有情况下的默认结果。可以是 "+all"(通过验证)或 "-all"(不通过验证)。例如,"-all" 表示除非匹配其他通过机制,否则所有情况都不通过验证,即严格拒绝伪造邮件。
"include":允许引用其他域名的 SPF 记录。例如:"include:example.com" 表示允许按照 example.com 的 SPF 记录来验证。
修饰符(Modifiers):修饰符可以在机制之后指定,用于调整验证的结果。常用的修饰符有:
"+":显示通过验证。
SPF 记录示例:
v=spf1 ip4:192.0.2.1 a mx ~all
以上示例表示允许 IP 地址为 192.0.2.1 的服务器、A 记录和 MX 记录指定的主机发送邮件,但验证结果为软失败,邮件可能会被接受,但标记为不可信。
IANA 设计了一种专门的 DNS 类型用来记录 SPF 信息,但是采用率非常低。
可以忽略,继续使用 TXT 类型来保存 SPF 信息。