Minimal and Clean blog theme for Hugo
笔记
2024年4月13日
爬虫工具 Easy Scraper
登录鉴权服务 https://fusionauth.io/
Tailwind组件库 4244 UI elements: CSS & Tailwind (uiverse.io)
SaaS模板 ixartz/SaaS-Boilerplate
OpenAI 接口转发站 头顶冒火 (burn.hair)
Twitter的找工作平台 X (twitter.com)
AI移除图片的背景 fiama 插件 ImgGen AI - Background Remover | Figma
GitHub 文件下载代理。部署在Cloudflare Workers。 hunshcn/gh-proxy
李笑来的《人人都能用英语》 xiaolai/everyone-can-use-english:
AI移除图片背景 Background Remover
Notion like 块编辑 BlockNote
精选的 Cloudflare 工具、开源项目、指南、博客和其他资源列表。 (github.com)
一个开源React.js组件库漂亮彩色的画布 UVCanvas
old
mobx的observable变成非observ的变量
以@observable声明的变量,可以会变成普通的对象,而失去响应能力,可能是应为直接复制的操作导致的。
@observable
private rowData = []; // 这样rowData是不是observable的?
@observable
private rowData = observable([]); // 需要这样赋值才行吗?
indicatorMap需要使用observable.ref声明才能监听到。用observable声明并用replace替换的话就不能监听到了.
reaction(
() => indicatorMap,
(indicatorMap) => {
console.log(1);
},
),
8月13日review
- cellRendererFramework改成cellRender
改了cellRender以后不显示了。
…Go基础三:方法和接口
Go基础二:流程控制语句
链表
数组
数组的缺点:数组中添加或删除元素需要将其他元素向前或向后移动,
除了对数据的随机访问,链表几乎可以用在任何可以使用一维数组的情况中。
链表
链表是由一组“节点”组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一个节点的引用叫做“链”。数组元素靠它们的位置进行引用,链表元素则是靠互相之间的关系进行引用。
链表对象
节点类:元素内容和后继的引用
function Node(element) {
this.element = element;
this.next = null;
}
链表类:表投和一些操作方法
function LinkedList() {
this.head = new Node("head");
this.find = find;
this.insert = insert;
this.remove = remove;
this.display = display;
}
插入元素
向一个已知
参考
- 数据结构与算法JavaScript描述.[美]麦克米伦.[译者]王群锋,杜欢.人民邮电出版社.2014-08
Go基础一:包、变量和函数
React-生命周期
挂载
- constructor
- getDerviedStateFromProps
- render
- didMount
willMount已过时
更新
- getDerviedStateFromProps
- shouldComponentUpdate(nextProps, nextState)
- render
- getSnapshotBeforeUpdate(prevProps, prevState)
- componentDidUpdate(prevProps, prevState, snapshot)
willUpdate和willReceiveProps已过时
getSnapshotBeforeUpdate可以在更新前,从DOM中获取一些信息,比如滚动位置。
卸载
- willUnmount
异常
- getDerviedStateFromError
- didCatch
setState
setState在合成事件或者生命周期中调用时,会将修改放入队列,在协调和更新之后进行更新state
…TLS握手过程
什么是TLS
TLS是IETF对SSL进行标准化时,将其改名为Transport Layer Security(传输层安全)。严格说,SSL与TLS指代的协议的版本号不同,TLS1.0是SSL3.0的升级版。
握手
TLS的通信是通过对称加密进行的,也就是client与server使用同一个密钥进行加密和解密,那么这个密钥怎么从加密方传给解密方呢?如果直接从网络上传输,它就可能会被攻击者获取到,这样加密也就失去了意义。也就是说,发送密钥有被窃听的危险,但是不发送的话,接收方又不能解密。
所以为了安全的将密钥发送给接收方
首先会进行TCP的握手,即一次往返。然后开始TLS的握手。
四个阶段:
- client hello
- server hello
- client finish
- server finish
主要做了两件事:确定协议版本和加密套件、生成加密密钥。TLS的握手主要由3个阶段来完成这两件事。
第一件事比较简单,只需要client告诉server自己支持的协议的版本和支持的加密套件,然后server选择并通知client。就可以啦。这两个操作分别在握手的第一第二阶段完成。
第二件事就没那么简单来。协议规定,生成一个加密密钥需要三个随机数,其中前两个随机数分别在第一阶段和第二阶段,由client和server分别生成并告诉对方。第三个随机数的交换要稍微复杂一点。
- 首先client在第二阶段得到来server的证书,证书中包含来server的公钥。
- 然后client会使用这个公钥对第三个随机数进行加密,然后将随机数的密文传给server。
- 最后,server将密文解密,得到了第三个随机数。
这样,client和server两端就都有了这三个随机数,然后它们使用相同的算法生成一个密钥,用这个密钥来对数据进行对称加密,在将密文在网络中传输。
为什么第三个随机数要这么麻烦呢?
首先,client和server都会发送和接收数据,所以两边都要进行加密和解密。加密算法主要就两类:对称和非对称。非对称的性能差,所以就选择性能好的对称算法。而对称算法的密钥需要两端都知道才可以,因此使用非对称加密将密钥从一边发送给另一边。又为了保证随机性,就用三个随机数来生成密钥。
下面具体说一下这四个阶段都做了什么。
第一步,client需要告诉server自己支持的版本号和加密套件,还要生成随机数2,用于计算加密密钥。client把这三个信息告诉来server。
第二步,server在拿到这些信息后,它会选择一个版本号和一个加密套件。然后跟第一步一样,生成随机数2,也是用于计算加密密钥。在加上自己的证书,将这四项数据发回给client。
第三步,client首先验证证书的有效性,若有效从中取出server的公钥。生成随机数3,使用公钥对其进行加密,并发送给server密文,并告诉server之后的消息开始加密了。还会将前面的握手信息的摘要进行加密后传给server,server收到后将其解密,用于验证协商的密钥的一致性。
第四步,
client hello
client告诉server:
- 协议版本号
- 随机数1
- 支持的加密套件
server hello
server根据收到的信息
- 确认版本号
- 随机数2
- 选择加密套件
- server证书
client回应
首先验证证书,如果验证通过:
- 从证书内取出server公钥
- 随机数3,使用公钥加密
- client握手结束
server回应
- server握手结束
完成握手
两边都有了三个随机数,使用相同的加密算法,生成一个对称密钥。此后两边的应用数据都通过这个密钥进行加密。
对称加密于非对称加密
非对称加密算法最常用的是RSA算法,使用公钥和私钥进行加密和解密。缺点是速度慢,优点是安全性高。
对称加密算法,加密和解密使用同一个密钥。优点是速度快。
参考
https://www.jianshu.com/p/7158568e4867
图解HTTP
Web性能权威指南
…计算贝塞尔曲线
枚举的应用
展示TypeScript中的枚举(enum)的一种实际用例。
class P {
x: number;
y: number;
constructor(x: number, y: number) {
this.x = x;
this.y = y;
}
}
enum key {
x = "x",
y = "y",
}
const p0 = new P(1, 2);
function dosomething(key: key) {
console.log(p0[key])
}
dosomething('x');
dosomething('y');
设置jar包使用内存
下面的命令中包含了几个 jvm option
限制运行jar包使用的内存在72M。
java -XX:+UseSerialGC -Xss512k -XX:MaxRAM=72m -jar image-0.0.4-SNAPSHOT.jar
如果不加这3个option的话,会使用大概300-400M内存。
根据这个答案1进行的设置:
With -XX:+UseSerialGC
这将与分配堆内存的线程而不是专用GC线程内联地执行垃圾回收。
With -Xss512k
这会将每个线程的堆栈内存限制为512KB,而不是默认的1MB。
With -XX:MaxRAM=72m
这会将JVM对堆和非堆托管内存的计算限制在此值的范围内。
除了上述JVM选项之外,您还可以在 application.properties
文件中使用以下属性:
server.tomcat.max-threads = 1
这会将HTTP请求处理程序线程数限制为1(默认值为200)
这是一个使用上述限制并使用 docker -m 72m
参数运行非常简单的 Spring Boot
应用程序的 docker stats
示例。如果我降低的值低于此值,我将无法启动应用程序。
83ccc9b2156d: Mem Usage: 70.36MiB / 72MiB | Mem Percentage: 97.72%
-
CCob.stackoverflow Answers.2018年10月25日 ↩︎