Minimal and Clean blog theme for Hugo

笔记


2024年4月13日

爬虫工具 Easy Scraper

登录鉴权服务 https://fusionauth.io/

Tailwind组件库 4244 UI elements: CSS & Tailwind (uiverse.io)

Tailwind组件库 shadcn/ui

低端影视 - 超清在线视频站 (ddys.pro)

SaaS模板 ixartz/SaaS-Boilerplate

SaaS模板,d-ivashchuk/cascade

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-workers-blog: 博客

精选的 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

  1. cellRendererFramework改成cellRender

改了cellRender以后不显示了。

Read more ⟶

Go基础三:方法和接口


Read more ⟶

Go基础二:流程控制语句


Read more ⟶

链表


数组

数组的缺点:数组中添加或删除元素需要将其他元素向前或向后移动,

除了对数据的随机访问,链表几乎可以用在任何可以使用一维数组的情况中。

链表

链表是由一组“节点”组成的集合。每个节点都使用一个对象的引用指向它的后继。指向另一个节点的引用叫做“链”。数组元素靠它们的位置进行引用,链表元素则是靠互相之间的关系进行引用。

链表对象

节点类:元素内容和后继的引用

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;
}

插入元素

向一个已知

参考

  1. 数据结构与算法JavaScript描述.[美]麦克米伦.[译者]王群锋,杜欢.人民邮电出版社.2014-08
Read more ⟶

Go基础一:包、变量和函数


Read more ⟶

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

Read more ⟶

TLS握手过程


什么是TLS

TLS是IETF对SSL进行标准化时,将其改名为Transport Layer Security(传输层安全)。严格说,SSL与TLS指代的协议的版本号不同,TLS1.0是SSL3.0的升级版。

握手

TLS的通信是通过对称加密进行的,也就是client与server使用同一个密钥进行加密和解密,那么这个密钥怎么从加密方传给解密方呢?如果直接从网络上传输,它就可能会被攻击者获取到,这样加密也就失去了意义。也就是说,发送密钥有被窃听的危险,但是不发送的话,接收方又不能解密。

所以为了安全的将密钥发送给接收方

首先会进行TCP的握手,即一次往返。然后开始TLS的握手。

四个阶段:

  1. client hello
  2. server hello
  3. client finish
  4. 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. 协议版本号
  2. 随机数1
  3. 支持的加密套件

server hello

server根据收到的信息

  1. 确认版本号
  2. 随机数2
  3. 选择加密套件
  4. server证书

client回应

首先验证证书,如果验证通过:

  1. 从证书内取出server公钥
  2. 随机数3,使用公钥加密
  3. client握手结束

server回应

  1. server握手结束

完成握手

两边都有了三个随机数,使用相同的加密算法,生成一个对称密钥。此后两边的应用数据都通过这个密钥进行加密。

对称加密于非对称加密

非对称加密算法最常用的是RSA算法,使用公钥和私钥进行加密和解密。缺点是速度慢,优点是安全性高。

对称加密算法,加密和解密使用同一个密钥。优点是速度快。

发送对称加密的密钥.png1

参考

https://www.jianshu.com/p/7158568e4867

图解HTTP

Web性能权威指南


  1. 上野宣.图解HTTP.于均良.北京:人民邮电出版社,2014.5 ↩︎

Read more ⟶

计算贝塞尔曲线


使用JavaScript计算贝塞尔曲线,将计算过程发布为npm包,在canvas中画出曲线。
Read more ⟶

枚举的应用


展示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');
Read more ⟶

设置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%

  1. CCob.stackoverflow Answers.2018年10月25日 ↩︎

Read more ⟶