Live Note

Remain optimistic

什么是 JWT?

JWT(JSON Web Token)是一个开放标准(RFC 7519),它定义了一种紧凑且自包含的方式,用于在各方之间安全地传输信息。该信息可以是声明(claim)、有效期、签名或密钥。JWT 可以使用 HMAC 算法或 RSA 算法进行签名。

JWT 自身包含了身份验证所需要的所有信息,因此,我们的服务器不需要存储 Session 信息。这显然增加了系统的可用性和伸缩性,大大减轻了服务端的压力。

可以看出,JWT 更符合设计 RESTful API 时的「Stateless(无状态)」原则 。

Read more »

Web1(20 世纪 80 年代 - 21 世纪早期)

互联网的第一个阶段,Web1,主要是为普通消费者提供在线内容和信息。

由于消费者只能在线阅读信息或内容,不能与之互动,Web1 是非常静态的。

当你想到 Web1 时,可以联想到 Internet Explorer、Yahoo 或 Netscape。虽然 Web1 是只读的,但我们与 Web1 相关的公司是建立在开放协议上的(这意味着几乎任何个人或组织都可以在互联网上进行开发,并知道他们遵循的规则与其他人或组织相同)。

Web2(现在)

Web2 是我们大多数人今天使用的互联网版本。与静态和“只读”的 Web1 不同,Web2 是“读写”的,并且具有互动性。在 Web2 下,互联网变得更加可用:Web2 是动态的,用户不仅可以消费、互动,还可以创建互联网内容。

在这个过程中,互联网变得主要由我们今天所知的四大巨头主导——苹果、亚马逊、Facebook 和谷歌。Web2 还伴随着智能手机的爆炸式增长,大多数互联网使用是通过这些公司构建的移动应用和硬件进行的。虽然这意味着更多的人可以参与互联网,但也意味着互联网越来越受到主要数字平台的控制。

为什么这是一个问题?在我们今天所知的集中化互联网中,苹果可以对所有付费应用下载和应用内购买抽取 30% 的佣金,Twitter 和 Facebook 可以将美国总统逐出平台,而普通消费者对其在线信息的隐私、安全和控制权比以往任何时候都要少。

我们还看到 Web2 中发生了大量的数据泄露,导致个人数据的安全性和隐私性降低。当用户的数据被泄露时,他们很容易成为身份盗窃、贩卖个人信息等的受害者。

Read more »

之前使用的是 trojan, 奈何找不到好的管理程序, 現使用 clash

clash 的 config 使用的是 yaml 文件, 所以比較好寫.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
port: 7890
socks-port: 7891
mixed-port: 7892 # 混合端口
allow-lan: true # 允許局域網連接
log-level: info
external-controller: 127.0.0.1:9090 # 外部控制端口
extarnal-ui: dashborad # 使用的ui
proxies: # clash官方文檔有更清楚的寫法
- {
type: ss,
name: "TEST-SS",
server: 127.0.0.1,
port: 2020,
password: 123456,
plugin: obfs,
plugin-opts: { mode: http },
} # 公司使用的是ss協議
- {
type: trojan,
name: "TEST-TROJAN",
server: 127.0.0.1,
port: 443,
password: 123456,
#sni
skip-cert-verify: true,
}
proxy-groups:
- { name: WORK, type: select, proxies: ["TEST-SS"] } # 將所需的proxy單獨進行分組
- { name: Proxy, type: select, proxies: ["TEST-TROJAN"] }
rules:
- IP-CIDR, 10.8.0.0/12, WORK # 根據rule將不同的請求轉發到所需的分組去
- IP-CIDR, 172.30.0.0/12, WORK
- IP-CIDR, 100.64.0.0/10, DIRECT
- IP-CIDR, 127.0.0.0/8, DIRECT
- DOMAIN-SUFFIX, google.com, Proxy

Example

假設現在有一個數據非常多的數組,但是我們只需要它的前幾個數據,并且進行一定的操作,這時候可以使用 generator 來進行 take 的操作.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
const arr = [1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11, 12]
const from = (arr) => arr[Symbol.iterator]()

const filter = (f) =>
function* (iter) {
let v = iter.next()
while (!v.done) {
if (f(v.value)) yield v.value
v = iter.next()
}
}

const multipy = (n) =>
function* (iter) {
let v = iter.next()
while (!v.done) {
yield v.value * n
v = iter.next()
}
}

const take = (n) =>
function* (iter) {
let i = 0
let v = iter.next()
while (!v.done && i < n) {
yield v.value
i++
v = iter.next()
}
}

const pipe = (...arr) => arr.reduce((acc, func) => func(acc))

console.log([
...pipe(
from(arr),
filter((v) => v % 2 === 0),
multipy(3),
take(30),
filter((v) => v > 15)
),
]) // [18, 24, 30, 36]