0%

1. Heap

Heap 分为young generation, old generation.

  • young generation, 采用清除算法,分为from, to两个区域。当需要GC时,会检测分配的对象的有效性,如果从这次GC中存活,会标记,然后copy到to 区域,清空from区,然后交换from, to的命名。当有对象在2次GC都存活了,那么会移动到old generation.这个也被称为minor GC.
  • old generation, 采用mark-sweep方法, old generation中allocate分配容易,清理难。这个也被称为major GC。这里的GC也有两种可能,一种是内存充裕时使用mark-sweep, 另一种是内存不充足时内存压塑,移动内存,释放内存碎片。

Usually, ~20% of the Young Generation survives into the Old Generation. Collection in the Old Space will only commence once it is getting exhausted. To do so the V8 engine uses two different collection algorithms:

  • Scavenge collection, which is fast and runs on the Young Generation,
  • Mark-Sweep collection, which is slower and runs on the Old Generation.

node GC时会stop the world,代表主线程被暂停了。

Read more »

1. ADBlock Plus

对于国内广告有时不work,那么就需要设置下语言。这个语言按照需要,设多了会影响ADBlock Plus的速度。所以我只需要设两个Chian+English.
Settigns

Read more »

1. Redux

Redux createStore三个主要的属性和方法是{store, getState, dispatch}。createStore是创建一个Redux Store, store是这个Redux Store的引用,getState是返回全局的State, dispatch是发送一个Action. 这个全局State对于JS来说是plain object,每次dispatch都会创建一个新的object,而redux-immutable会使用原来的Immutale Map引用。

其它一些辅助方法:
combineReducers(reducers), 这个是把reducersMap变成一个大reducer object.它接受一个Action和当前State, 然后遍历所有的reducer(这里可能会有性能问题,试想一千个reducer,会影响性能)。

  • createStore的第一个参数就是combineReducers(reducers)返回的结果, 内部创建一个currentState, finalReducers, dispatch方法。State的key就是reducers的key, 在createStore内部,store创建好之后会dispatch 当ActionTypes.INIT,这个会在finalReducers里面运行一次,由于这个时候全局State是undefined,所以会使用reducers的defaultState,这里也就解释为什么reducers的defaultState要和reducers的key(reducers的name)一样。

Action是一个Object,它包含type, payload(自定义的负荷). ActionTypes.INIT, 是Redux自带的Action,它的type其实是一个随机生成的字符串。我们不该针对这个ActionTypes.INIT写任何的reducer。

1
2
3
4
5
const ActionTypes = {
INIT: `@@redux/INIT${/* #__PURE__ */ randomString()}`,
REPLACE: `@@redux/REPLACE${/* #__PURE__ */ randomString()}`,
PROBE_UNKNOWN_ACTION: () => `@@redux/PROBE_UNKNOWN_ACTION${randomString()}`
}
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
return function combination(
// dispatch 当ActionTypes.INIT 的时候,state是undefined, 所以这里使用了函数默认值{}.
state: StateFromReducersMapObject<typeof reducers> = {},
action: AnyAction
) {


let hasChanged = false
const nextState: StateFromReducersMapObject<typeof reducers> = {}
// 遍历所有的Reducer
for (let i = 0; i < finalReducerKeys.length; i++) {
const key = finalReducerKeys[i]
// 获取一个reducer方法
const reducer = finalReducers[key]
// 获取当前的shape (某个reducer key下面的值)
const previousStateForKey = state[key]
// reduxer都会运行一次, 除非报错
// 当接受ActionTypes.INIT时,previousStateForKey是个undefined,所以reducer里面返回的是reducer的defaultState。
const nextStateForKey = reducer(previousStateForKey, action)

if (typeof nextStateForKey === 'undefined') {
const actionType = action && action.type
throw new Error()
}
// 改写下个shape (某个reducer key下面的值)
nextState[key] = nextStateForKey
hasChanged = hasChanged || nextStateForKey !== previousStateForKey
}
// 监测至少有一次变化
hasChanged =
hasChanged || finalReducerKeys.length !== Object.keys(state).length
return hasChanged ? nextState : state
}
  • createStore的第二个参数时initialState,它的值要和reducer的key一样。它会和Reducer产生的State做hydrate。

Redux中函数默认值的使用很广泛,第一重要的就是reducers中函数默认值defaultState的使用,然后是createStore中initialState的使用。createStore中初始化Reduxt的Gloabal State就是用到了上面两个函数默认值。

Read more »

1. ngrok

内网穿透到internet, 方便本地调试,但同时也需要一个外网链接地址,比如调试webhook。这个外网链接地址支持HTTP与HTTPS。

1
brew install ngrok/ngrok/ngrok
Read more »

The current React Native Bridge architecture between Native and JS works asynchronously and transfer data in JSON only.

It produces next issues:

Async calls

Many threads and jumps across them: JS, Shadow, Main, Native…
JS and Main threads do not directly communicate (slow UI rendering)
JSON

No data sharing between JS and Native threads
Slow data transfer because of JSON serialisation (bottleneck)
You can make the bridge to any native code Java/Konlin, ObjC/Swift, C++ etc. but you always have the problems from above.

React Native JSI provides API to JS Runtime engine and allows to expose native functions and objects to JS directly - no bridge at all.

It provides next advantages:

Sync call from JS thread to Native and vice-versa
Fast rendering using direct call to UI Main thread
Data sharing between threads
You have to use C++ only to work with JSI because JS Runtime has C++ API but it is possible to make C++ layer between JSI and your existed Java or Swift code.

JSI is foundation for future new React Native architecture which includes: Fabric, TurboModules, CodeGen. Read more: https://github.com/react-native-community/discussions-and-proposals/issues/91

Share
reference:https://stackoverflow.com/questions/69501535/whats-the-difference-between-bridging-a-module-with-c-or-with-jsi-in-react-na

1. 重定向

理解
302 表示临时性重定向。
访问一个Url时,被重定向到另一个url上。
常用于页面跳转。

与301的区别
301是指永久性的移动,302是暂时性的,即以后还可能有变化

其它重定向方式
在响应头中加入Location参数。浏览器接受到带有location头的响应时,就会跳转到相应的地址。

1. zlib, gzip

zlib是压缩算法,这个分gunzip和inflate, inflateraw。一般用zlib的默认算法是inflate, python里面的zlib使用的也是inflate。

gzip是文件格式。

2. windowBits

zip里面有个参数windowBits, The wbits argument controls the size of the history buffer (or the “window size”) used when compressing data, and whether a header and trailer is included in the output. It can take several ranges of values. The default is 15.

+9 到 +15:窗口大小以 2 为底的对数。即这些值对应着 512 到 32768 的窗口大小。更大的值会提供更好的压缩,同时内存开销也会更大。压缩输出会包含 zlib 特定格式的头部和尾部。

−9 到 −15:绝对值为窗口大小以 2 为底的对数。压缩输出仅包含压缩数据,没有头部和尾部。

+25 到 +31 = 16 + (9 到 15):后 4 个比特位为窗口大小以 2 为底的对数。压缩输出包含一个基本的 gzip 头部,并以校验和为尾部。

所以如果windowBits为负数,那么就是代表没有头和尾。这个可以让压缩文件结果变小。

node里面不能设置为负数,用inflateRaw也不行。最后使用了ZlibSyncpako.

1. ECDH

ECDH是用来交换密码的,Alice和Boc使用椭圆函数secp256k1,生成各自的公钥和私钥,然后用自己的私钥和对方的公钥,生成一个screate key, 这个screate key是一样的。

Read more »

1. CI绕过2fa,2sv

2-factor authentication (2FA) :可以选一个可信设备,也可以选手机号。现在的AppleId如果涉及到开发,都是必须要启用2fa的。fastlane的工作机制是基于session,而session是通过cookie来标识的,所以如果遇到session过期,session不支持,那么首先考虑的就是新建一个session,而新建session的方法是通过刷新cookie。

legacy 2-step verification (2SV):选一个手机号。

fastlane CI上面说有三种方法:

Read more »