Live Note

Remain optimistic

又一次见证历史了。

预计级别会达到VEI6,不知道后续会不会继续喷发。
没想到,疫情还未过去,出现了一个比疫情更严峻的现实问题——无夏之年

更新于 2022 年 7 月 26 日 17:22:50

我错了,最近的温度已经到达了 40℃。

一年一度的总结时间

2021,辛丑年。
这一年,似乎发生了许多事;事情太多,以至于能记住的太少了。

  • 教育减负,新东方股价蒸发 90%
  • 房产暴雷,恒大欠债 1.6 万亿
  • 疫情,孕妇流产、心梗无法救治、猝死、……

是好事吗?是坏事吗?
长远来看,民智开化了许多,不再一味地听从党和政府,有了自己的思考。
但是,如果一个政府没有了民心支持,那么他还能维持不倒吗?
每次变革都是流血,只希望不要起太大的冲突。

Read more »

序言

农业和游牧或工业不同,它是直接取资与土地的。
游牧的人飘忽不定,工业可以择地而居。
而种地的人却搬不动地。

从农业本身来看,是无需群居的。最小的社区可以只有一户人家。
夫妻和孩子聚集,满足两性与抚养的需要。
无论在什么性质的社会里,家庭总是最基本的抚养社群。

中国农民聚集而居原因:

  1. 耕地面积小,小农经营。住所与耕地不会相隔太远
  2. 需要水利,所以大家一起合作。
  3. 合作弊害。
  4. 土地继承。

农村属于 face to face group,所以 文字 在农村并没有太大意义。

社会学中通常两种不同性质的社会:

  1. 共同体:没有主要的目的聚集。
  2. 社会:有主要的目的聚集。

孝是什么,孔子并没有抽象地加以说明。最后归结到“心安”二字。
做子女的在日常接触中熟悉父母的性格,然后承他们的欢,做到心安。

Read more »

日航哲学 – 成功方程式

人生 · 工作的结果 = 思维方式 _ 努力 _ 能力

作为人,何谓正确

领导人率先垂范,以身作则。

阿米巴系统

京瓷的经营理念: 在追求全体员工物质和精神两方面幸福的同时,为人类社会的进步发展做出贡献。

阿米巴经营是通过一个个小集体的独立核算来实现全员参与经营、凝聚全体员工力量和智慧的经营管理系统。

但是在 乌合之众 中说到,群体聚集在一起的智商,只会降低。所以是否可以利用群体的力量,独立的领导人(智慧&方向),达到目的。

阿米巴经营的目的

  1. 确立与市场挂钩的分部门核算制度
  2. 培养具有经营意识的人才
  3. 实现全员参与的经营

创业初期部门结构

创业初期部门结构

核心技术在研发

传统公司经营模式

传统公司经营模式

如果市场价格波动,销售的售价必然下降。此时,如果减少销量,会增加库存。增加销量,成本增高,总利润下降。

此时拆分成阿米巴之后,生产和销售之间必然会产生分歧。此时直接损害生产部的利益,所以传统经营模式在阿米巴经营中并不适用。

细分阿米巴的三个条件

  1. 能够独立核算的单位
  2. 独立完成某个业务的单位
  3. 划分组织必须有利于实现公司的方针和目标

激活 Windows

  1. 查看 OS 版本:
    • run.exe: slmgr.vbs -dlv,查看产品密钥通道。
    • OEM:出厂版本
    • Retail:零售版本
    • VL(Vol):批量激活版本
  2. 只有 VL 版本可以激活。
  3. 使用 cmd:slmgr /skms kms.03k.org,把skms地址设置为 kms.03k.org
  4. slmgr /ato,手动激活

激活 Office

Office 必须是 VL 版本

  1. 进入 Office 安装地址,找到 OSPP.VBS
  2. cmdcscript ospp.vbs /sethst:kms.03k.org,指定kms服务地址
  3. cscript ospp.vbs /act,手动激活

工具网站:office tool plus

晚上睡不着。看了一眼 HuoBi

发现自己的合约被强制平仓了。陆续开始清退大陆用户。

也就几百块,取出来也没多大作用。

看了看最近的风口 Meta verse,买了点币。顺便跟着孙割买了点币。

之后 HuoBi 清退,还需要把币提出来。麻烦

周一看看能不能把股市内的基金投入到 恒生30ETF

恒生ETF中很大一部分是 Meta Verse 概念。
股市还是太难玩了。玩不明白。

原理

通过改写[].__proto__上的方法,实现对Array原生方法的拦截。

源码位置为 /core/instance/observer/array.js

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
// cache the original Array.prototype
const originalPrototype = Array.prototype

// create an object from original Array.prototype
const arrayMethods = Object.create(originalPrototype)

const methodsToPatch = [
"push",
"pop",
"shift",
"unshift",
"splice",
"sort",
"reverse",
]

methodsToPatch.forEach((method) => {
arrayMethods[method] = function (...args) {
// use original Array methods to get the result
const result = originalPrototype[method].apply(this, args)

// proxy here
console.log(`catch ${method}`)

return result
}
})

const a = [1, 2, 3]
a.__proto__ = arrayMethods

a.push(1)
a.reverse()
a.pop()

console.log(a)

Promise A+ 规范

  1. promise:是一个拥有then方法的对象或函数,其行为符合本规范。
  2. thenable:是一个定义了then方法的对象或函数。这个主要是用来兼容一些老的Promise实现,只要一个Promise实现是thenable,也就是拥有then方法的,就可以跟Promises/A+
    兼容。
  3. value:指reslove出来的值,可以是任何合法的 JS 值(包括 undefined , thenablepromise等)
  4. exception:异常,在Promise里面用throw抛出来的值
  5. reason:拒绝原因,是reject里面传的参数,表示reject的原因

Promise Status

  1. pending: 一个promiseresolve或者reject前就处于这个状态。
  2. fulfilled: 一个promiseresolve后就处于fulfilled状态,这个状态不能再改变,而且必须拥有一个不可变的值(value)。
  3. rejected: 一个promisereject后就处于rejected状态,这个状态也不能再改变,而且必须拥有一个不可变的拒绝原因(reason)。

thenable

1
promsie.then(onFulfilled, onRejected)

Optional parameters

  1. 如果 onFulfilled 不是函数,其必须被忽略
  2. 如果 onRejected 不是函数,其必须被忽略

onFulfilled

如果 onFulfilled 是函数:

  1. promise 执行结束后其必须被调用,其第一个参数为 promise 的终值value
  2. promise 执行结束前其不可被调用
  3. 其调用次数不可超过一次

onRejected

如果 onRejected 是函数:

  1. promise 被拒绝执行后其必须被调用,其第一个参数为 promise 的据因reason
  2. promise 被拒绝执行前其不可被调用
  3. 其调用次数不可超过一次

then

then 方法可以被同一个 promise 调用多次

  1. promise 成功执行时,所有 onFulfilled 需按照其注册顺序依次回调
  2. promise 被拒绝执行时,所有的 onRejected 需按照其注册顺序依次回调

Return

then 方法必须返回一个 promise 对象。

1
promise2 = promise1.then(onFulfilled, onRejected)
  1. 如果 onFulfilled 或者 onRejected 返回一个值 x ,则运行 Promise 解决过程:[[Resolve]](promise2, x)
  2. 如果 onFulfilled 或者 onRejected 抛出一个异常 e ,则 promise2 必须拒绝执行,并返回拒因 e
  3. 如果 onFulfilled 不是函数且 promise1 成功执行, promise2 必须成功执行并返回相同的值
  4. 如果 onRejected 不是函数且 promise1 拒绝执行, promise2 必须拒绝执行并返回相同的据因

实现

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
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
206
207
208
209
210
211
212
213
214
215
216
217
218
219
220
221
222
223
224
225
226
227
228
229
230
231
232
233
234
235
236
237
238
239
240
241
242
243
244
245
246
247
248
249
250
251
252
253
254
255
256
257
258
259
260
261
262
263
264
265
266
267
268
269
270
271
272
273
274
275
276
277
278
279
280
281
282
283
284
285
286
287
288
289
290
291
292
293
294
295
296
297
298
299
300
301
302
303
304
305
306
307
308
309
310
311
312
313
314
315
316
317
318
319
320
var PENDING = "pending"
var FULFILLED = "fulfilled"
var REJECTED = "rejected"

function Promise(fn) {
this.status = PENDING // initial status
this.value = null // initial value
this.reason = null // initial reason
this.onFulfilledCallbacks = []
this.onRejectedCallbacks = []

var _this = this

function resolve(value) {
if (_this.status === PENDING) {
_this.status = FULFILLED
_this.value = value

_this.onFulfilledCallbacks.forEach((i) => i(_this.value))
}
}

function reject(reason) {
if (_this.status === PENDING) {
_this.status = REJECTED
_this.reason = reason

_this.onRejectedCallbacks.forEach((i) => i(_this.reason))
}
}

try {
fn(resolve, reject)
} catch (e) {
reject(e)
}
}

function resolvePromise(promise, x, resolve, reject) {
if (promise === x) {
reject(new TypeError("The promise and the return value are the same"))
}

if (x instanceof Promise) {
x.then(function (y) {
resolvePromise(promise, y, resolve, reject)
}, reject)
} else if (typeof x === "object" || typeof x === "function") {
if (x === null) {
return resolve(x)
}

try {
var then = x.then
} catch (e) {
return reject(e)
}

if (typeof then === "function") {
var called = false

try {
then.call(
x,
function (y) {
if (called) return
called = true
resolvePromise(promise, y, resolve, reject)
},
function (r) {
if (called) return
called = true
reject(r)
}
)
} catch (e) {
if (called) return

reject(e)
}
} else {
resolve(x)
}
} else {
resolve(x)
}
}

Promise.prototype.then = function (onFulfilled, onRejected) {
var checkOnFulfilled = onFulfilled
if (typeof onFulfilled !== "function") {
checkOnFulfilled = function (value) {
return value
}
}

var checkOnRejected = onRejected
if (typeof onRejected !== "function") {
checkOnRejected = function (reason) {
throw reason
}
}

var _this = this

if (this.status === FULFILLED) {
// 如果前面的 promise 抛出异常,后面的必须拒绝执行
var promise2 = new Promise(function (resolve, reject) {
setTimeout(function () {
try {
if (typeof onFulfilled !== "function") {
resolve(_this.value)
} else {
var x = checkOnFulfilled(_this.value)
resolvePromise(promise2, x, resolve, reject)
}
} catch (e) {
reject(e)
}
}, 0)
})

return promise2
}

if (this.status === REJECTED) {
var promise2 = new Promise(function (resolve, reject) {
setTimeout(function () {
try {
if (typeof onRejected !== "function") {
reject(_this.reason)
} else {
var x = checkOnRejected(_this.reason)
resolvePromise(promise2, x, resolve, reject)
}
} catch (e) {
reject(e)
}
}, 0)
})

return promise2
}

if (this.status === PENDING) {
var promise2 = new Promise(function (resolve, reject) {
_this.onFulfilledCallbacks.push(function () {
setTimeout(function () {
try {
if (typeof onFulfilled !== "function") {
resolve(_this.value)
} else {
var x = checkOnFulfilled(_this.value)
resolvePromise(promise2, x, resolve, reject)
}
} catch (e) {
reject(e)
}
}, 0)
})

_this.onRejectedCallbacks.push(function () {
setTimeout(function () {
try {
if (typeof onRejected !== "function") {
reject(_this.reason)
} else {
var x = checkOnRejected(_this.reason)
resolvePromise(promise2, x, resolve, reject)
}
} catch (e) {
reject(e)
}
}, 0)
})
})

return promise2
}
}

Promise.resolve = function (parameter) {
if (parameter instanceof Promise) {
return parameter
}

return new Promise(function (resolve) {
resolve(parameter)
})
}

Promise.reject = function (reason) {
return new Promise(function (resolve, reject) {
reject(reason)
})
}

Promise.all = function (promises) {
return new Promise(function (resolve, reject) {
var count = 0
var result = []
var len = promises.length

if (length === 0) {
return resolve(result)
}

promises.forEach(function (promise, index) {
Promise.resolve(promise).then(
function (value) {
count++
result[index] = value

if (count === len) {
resolve(result)
}
},
function (reason) {
reject(reason)
}
)
})
})
}

Promise.race = function (promises) {
return new Promise(function (resolve, reject) {
var len = promises.length

if (length === 0) {
return resolve()
} else {
for (var i = 0; i < len; i++) {
Promise.resolve(promises[i]).then(
function (value) {
return resolve(value)
},
function (reason) {
return reject(reason)
}
)
}
}
})
}

Promise.catch = function (onRejected) {
this.then(null, onRejected)
}

Promise.finally = function (fn) {
return this.then(
function (value) {
return Promise.resolve(fn()).then(function () {
return value
})
},
function (error) {
return Promise.resolve(fn()).then(function () {
throw error
})
}
)
}

Promise.allSettled = function (promises) {
return new Promise(function (resolve) {
var len = promises.length
var result = []
var count = 0

if (len === 0) {
resolve(result)
} else {
for (let i = 0; i < len; i++) {
;(function (i) {
var current = Promise.resolve(promises[i])

current.then(
function (value) {
count++
result[i] = {
status: "fulfilled",
value,
}

if (count === len) {
return resolve(result)
}
},
function (reason) {
count++
result[i] = {
status: "rejected",
reason,
}

if (count === len) {
return resolve(result)
}
}
)
})(i)
}
}
})
}

// for promises-aplus-tests test
Promise.deferred = function () {
var result = {}
result.promise = new Promise(function (resolve, reject) {
result.resolve = resolve
result.reject = reject
})

return result
}

module.exports = Promise

什么是微前端

微前端架构具备以下几个核心价值

  • 技术栈无关:主框架不限制接入应用的技术栈,子应用具备完全自主权
  • 独立开发、独立部署:子应用仓库独立,前后端可独立开发,部署完成后主框架自动完成同步更新
  • 独立运行时:每个子应用之间状态隔离,运行时状态不共享

现有解决方案

  • 路由分发(nginx)
  • npm 子包:基座负责打包构建发布,打包时集成;
  • iframe:应用之间完全独立;需要基座提供通信方案;
  • 通用中心路由基座式:完全独立;需要基座提供通信方案;使用 DOM 实现;(阿里乾坤)
  • 特定中心路由基座式:相同技术栈;复用基座公共基建内容;(美团广告业务)
Read more »

type="module"

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
<!DOCTYPE html>
<html lang="en">
<head>
<meta charset="UTF-8" />
<meta http-equiv="X-UA-Compatible" content="IE=edge" />
<meta name="viewport" content="width=device-width, initial-scale=1.0" />
<title>Document</title>

<script type="module">
// will not block the button
console.log(this) // undefined
console.log(import.meta.url) // the url of import file
</script>
<script>
// will block the button
console.log(this) // window
</script>

<script async type="module" src="http://example.com/test.js">
// will run immediate when the file is load
// example.com needs the Access-Control-Allow-Origin flag
import {sayHi} from 'sayHi' // this will get error because no path import in this module block.
</script>

<script nomodule>
alert("The Browser can not support the module import.")
</script>
</head>
<body>
<button>Button</button>
</body>
</html>