Live Note

Remain optimistic

1. Make Sure the compileSdkVersion is correct.

Cause if you don’t have the correct version of compileSdkVersion, the Context.RECEIVER_EXPORTED will not found.

build.gradle
1
2
3
4
5
6
7
8
9
10
11
12
buildscript {
// ...
ext {
buildToolsVersion = "***"
minSdkVersion = ***
compileSdkVersion = 33
targetSdkVersion = 34
ndkVersion = "***"
googlePlayServicesAuthVersion = "***"
}
// ...
}

2. Rewrite the registerReceiver in MainApplication.java

Make sure the registerReceiver is override before the onCreate function.

MainApplication.java
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
// ...
@Override
public Intent registerReceiver(@Nullable BroadcastReceiver receiver, IntentFilter filter) {
if (Build.VERSION.SDK_INT >= 34 && getApplicationInfo().targetSdkVersion >= 34) {
return super.registerReceiver(receiver, filter, Context.RECEIVER_EXPORTED);
} else {
return super.registerReceiver(receiver, filter);
}
}

@Override
public void onCreate() {
// some code here
}
// ...

3. Clean Project and Rebuild the apk package

Reference here: React Native App Crashes — On upgrading to targetSdkVersion 34(Android 14)

Custom Scroll Indicator for ScrollView

Demo.tsx
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
import React, { useMemo, useState } from "react"
import { ScrollView, View } from "react-native"

const Demo: React.FC = () => {
const [contentSize, setContentSize] = useState(0)
const [scrollViewSize, setScrollViewSize] = useState(0)
const [scrollPosition, setScrollPosition] = useState(0)

const indicatorWidth = useMemo(() => {
if (contentSize > 0 && scrollViewSize > 0) {
return (scrollViewSize / contentSize) * scrollViewSize
}

return 0
}, [contentSize, scrollViewSize])

const indicatorPosition = useMemo(() => {
if (contentSize > 0 && scrollPosition > 0) {
return (scrollPosition / contentSize) * scrollViewSize
}

return 0
}, [contentSize, scrollPosition, scrollViewSize])

return (
<View>
<ScrollView
// disable default scroll indicator
showsHorizontalScrollIndicator={false}
onLayout={(event) => {
setScrollViewSize(event.nativeEvent?.layout?.width ?? 0)
}}
onContentSizeChange={(w) => {
setContentSize(w)
}}
horizontal // set horizontal scroll
scrollEventThrottle={16} // throttle scroll event to improve performance
onScroll={(event) => {
// change scroll position here
const { contentOffset } = event.nativeEvent

const { x = 0 } = contentOffset
const max = contentSize - scrollViewSize
const min = 0

if (x > max) {
setScrollPosition(max)
} else if (x < min) {
setScrollPosition(min)
} else {
setScrollPosition(x)
}
}}
>
{/* Content here */}
</ScrollView>

{/* custom scroll indicator */}
<View
style={{
bottom: 0,
height: 4,
width: indicatorWidth,
position: "absolute",
left: indicatorPosition,
borderRadius: 4,
backgroundColor: "#EEEEEE",
}}
/>
</View>
)
}

export default Demo

见证历史了吧

上证指数开盘涨停。

国家这次真算得上破釜成舟了。

就是不知道,半年/多年后回过头来看,这是起大厦的首日,还是倾大厦的首日呢?

不得而知。 楼他们是不打算救了,可以考虑购买房子了。

extends Array

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
class PowerArray extends Array {
isEmpty() {
return this.length === 0;
}

// filter/map/... 等函数不再传递PowerArray
static get [Symbol.species] () {
return Array;
}
}

let arr = new PowerArray(1, 2, 3);
alert(arr.isEmpty()); // false

let filter_array = arr.filter(i => i > 1);
alert(filter_array.isEmpty()); //Error

什么是 Diamond

Diamond 指的是一种设计模式,称为 EIP-2535 Diamonds。这种模式用于构建可模块化和可升级的以太坊智能合约。

Diamond

  • 模块化架构:Diamond 是一种创建单一、模块化合约(称为 Diamond)的方式,该合约将不同的功能委托给分离的、可互换的合约组件(称为 Facets)。这有助于更好地组织代码和分离关注点。
  • Facets:每个 Facet 包含特定的功能,并可以独立升级。例如,一个 Facet 可能处理用户管理,而另一个处理交易。
  • Diamond Storage:在 Diamond 模式中,合约的存储结构被设计成可以支持不同 Facets 的升级,而不影响整体合约的其他部分。

对外部世界(如用户界面、其他智能合约和软件/脚本)而言,Diamond 看起来是一个单一的智能合约,具有一个单一的以太坊地址。但在内部,它使用一组称为 Facets 的合约来处理其外部功能,这些 Facets 对外部是隐藏的。

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 »

区块链是什么?

区块链是一种分布式的、数字化的、不可篡改的账本,用于以安全透明的方式记录交易和存储数据。它基于一个去中心化的节点网络,这些节点共同维护一个唯一的真实来源,使参与者能够在无需中介的情况下与系统进行交互。

区块是一个数据容器结构,用于聚合交易并将其包含在公共账本中,即区块链。链中的每个区块包含一组已通过共识过程由节点网络验证和记录的交易。一旦区块被添加到链中,它就不能被更改或删除,从而创建了一个网络上所有交易的不可篡改的记录。

区块链因匿名人士(或团体)中本聪(Satoshi Nakamoto)在 2009 年发布比特币网络时而普及。比特币是一种加密货币网络,主要处理 BTC 资产在网络上的转移,无需可信中介或权威,同时确保网络本身的安全且不可被黑客攻击。(附注:比特币网络也可能是世界上最大的漏洞赏金项目——如果你能破解它,你将立即成为万亿富翁)。

随着时间的推移,比特币的设计激发了其他更强大的区块链网络的出现,例如以太坊(Ethereum)。

Read more »

A drawer animation HOC component

Requirements:

  • react-native-reanimated: animation
  • react-native-root-siblings: root sibling
  • Functional component: require hooks

Drawer HOC

Read more »

section 1

小舅子目前阶段的学习生涯结束了,在下一段学习之前,他决定去赚点零花钱。

他在惠州,干了奶茶店/进厂打工/跑外卖。后面还是决定去深圳,跟着他表哥去跑外送。

从小体质就差,再加上深圳鱼龙混杂,病毒也多,没几天就感染了。

  • 2024/7/7 日,送到深圳。
  • 2024/7/11 日凌晨,肚子痛,叫救护车。诊断为胆囊炎。
  • 2024/7/12 日,夜间 11h 左右,未好转,转院到惠州三院,抢救+进入 CCU 治疗。
  • 2024/7/12 日,医生告病重,同时拍片结果显示,前纵隔存在一个畸胎瘤。
  • 2024/7/13 日,未好转,感染指标依旧高,检查过杆菌/结核菌/DNA 序列检测,未找到原因。
  • 2024/7/14 日,感染指标下降,医生说畸胎瘤必须要切除,病理报告未收到,建议先等待。
  • 2024/7/15 日,感染指标下降,右侧积水增多,已经联系好广州三甲医院,先去看心血管方面的情况。积水估计还是要上引流管。
  • 2024/7/16 日,医生说考虑是恶性肿瘤,等待病理结果。
  • 2024/7/17 日,病理结果未出,检测报告拿到广州肿瘤防治中心,医生推测为恶性肿瘤。身体指标好转。
  • 2024/7/18 日,出院,转入中山大学孙逸仙纪念医院(越秀)。
  • 2024/7/21 日,高烧 39 度。
  • 2024/7/22 日,术前准备,状态尚可。
  • 2024/7/23 日,手术很成功,肿瘤大小目测 10cm10cm5cm。

畸胎瘤,生殖细胞肿瘤,医生说出生的时候就携带了,但是不清楚是什么时候发展的。三院无法处理,建议转去更高级医院。医生综合评估,目前的腹部和胸腔还是存在积水,积水的原因很可能就是畸胎瘤导致的,所以建议优先处理畸胎瘤。

起因

如果 wrapp 的 flex-direction 为 row 的时候,Text 内部不自动 wrap。还是测试拿给我看,才发现某些机型会存在这种问题。

开始以为是 Text 内部会根据flexbox而有不同的展现,但是翻阅官方文档:

The element is unique relative to layout: everything inside is no longer using the Flexbox layout but using text layout. This means that elements inside of a are no longer rectangles, but wrap when they see the end of the line.

Text 组件内部默认是 wrap 的,除非这一整个是一个超长的单词,否则就会在 white space 的时候自动 break 了。
如果给 wrapp 设置 wrap,那么整个 text 直接就 wrap 到下一行,icon 单独一行了。(这部分官方是有案例的,根据 Text 外部的 Container,wrap 也是不一样的)

好嘛,到底是什么东西导致的?为什么 flex-direction: row 就给我炸了?

原因: element 的宽度计算方式导致的

解决

官方的解释:每个 element 的 size 大致可以分为两种方式:

  • content-driven
  • parent-driven
  1. flex-direction: column 的时候,宽度首先由 content-driven,然后再由 parent-driven,高度直接由 content-driven,完美,一点问题没有。
  2. flex-direction: row 的时候:高度由 comtent-driven,宽度呢?那当然是 content-driven 啊! … 不好意思,Text 无法计算自己的 width,why?因为 Text 是 autosize 的!(也有意外情况,如果你把 Text 给 absolute 起来,那么就可以计算了)。所以此时的 Text 的 width,是由 parent-driven,也就是整个 wrapper 的宽度了。

解决方法也很简单,Text 上挂一个 flexShrink: 1,让它自己玩去吧。