超大型城中村出差记

上个月去北京出差了一周。

出差的议题是朝拜我新公司的老板,也是我 2016 年的同事。大哥现在已经官至 3-2,带了 80 人。到新公司挂在大哥下面,给大哥打打杂。

上次去北京是 2015 年,当时感觉北京还是比较发达的城市,经济活力比较强。今年重游,上班在北航,住在海淀基本最好的酒店泰富,直观感受北京已经有点衰弱。但是单看 GDP 数据,却完全没有任何衰弱的意思,所以也有可能是国进民退,仅仅是民间经济的衰弱。

Read on →

Apns Portol 2021

  1. Capbilities 增加 push notification
  2. Capbilities -> Background modes 增加 Remote notifications
  3. App 添加 Notification Service Extension
  4. developer portol 对此 app id 开启 push notification

为什么比特币牛逼

私有财产是世界运行的关键

财产可以安全的私有化,是让人们获得现代生活最重要的机制。战争、税务、刚性政策会破坏私有化,从而对整体经济带来负面影响。
如果你认为早期持有比特币的人赚了后面入场人的钱是一件不道德的事,或是你一个现代货币理论的粉丝,认为超发货币能带来全局正向优化,那么这边建议亲亲直接关掉这个页面,或先去读《人、经济与国家》。我没有太多时间讲述故事背景,也绝不会想要改变你的认知。
在认同此点的基础上,可以继续往下看。

Read on →

一些感想

关于沟流

韭菜不能教,只能割

教了就会发现教不动,认知的提升只能靠他自己的内驱力。这就是不能教。
如果他不去提升自己的认知,早晚会被割。我不割自有人割,不如我割。这就是只能割。

不求不助

你觉得一个很牛逼的东西,别人get不到牛点,过去讲就让别人感觉你是个搞传销的。
对方内心:“那么牛逼你自己怎么不搞?”
这也很正常,人总是要对传销有点天生的抵御能力,不然早都被骗穷了。
如果让别人接纳你的思想,第一步是让他觉得你这个人牛逼。而第一步中的第一步,是你对未来的预判成真,让对方相信你的判断能给他带来收益,或实实在在的为对方带来了收益。互相带来收益,这种关系就比较健康。单边收益则关系比较难长久。

推论:交流就是顺着对方说

不要尝试修改对方的认知。
此条针对交流双方不是利益共同体。

Read on →

CocoaPods 遇到的一些无营养常规问题

pod install 找不到库:

现象:

1
2
3
4
5
6
7
8
9
10
11
12
[!] CocoaPods could not find compatible versions for pod "XXXX":
  In Podfile:
    XXXX (= 1.0.0.210416113435)

None of your spec sources contain a spec satisfying the dependency: `XXXX (= 1.0.0.210416113435)`.

You have either:
 * out-of-date source repos which you can update with `pod repo update` or with `pod install --repo-update`.
 * mistyped the name or version.
 * not added the source repo that hosts the Podspec to your Podfile.

Note: as of CocoaPods 1.0, `pod repo update` does not happen on `pod install` by default.

解法:

pod install --repo-update

The sandbox is not in sync with the Podfile.lock. Run ‘pod install’ or update your CocoaPods installation.

解法:

1
2
3
4
删除工程下的 Podfile.lock 和 Pods/ 
Xcode 工程 Clean
Derived Data 删一下
重新 pod install

查找 symbol 来自于哪个库

1
grep -r 'symbol_class_or_method_name' Pods

什么是财务自由

为什么有人赚了钱却不敢离职?

见到的一种最常规的说法是,「到了1000万、到了5000万、到了一个亿,我就自由了」。
但是一直打工,每年税前赚个一两百万,梭哈蔚来赚了 5000 万,融资梭哈特斯拉赚了 1 亿,这时候有归园田居的勇气吗?我见到的几个例子,并没有放弃做鸭工资离职回家。
其原因,大多是认为自己没有稳定盈利的能力,而不敢放弃一两百万做鸭的收益,怕赌博头寸风险敞口太大,返贫。
于是,就日复一日的继续在公司做鸭,大部分时间消耗在工位上。

什么情况有离职的勇气?

当工资不是现金流的大头时,这个人就有了放弃工资的勇气。这个就是打工仔们穷其一生追求(也很难追求的到)的财务自由的境界。
当现金流多种多样,就大幅降低了单点风险,避免一个现金流挂了,生计都受到影响。
投资的本质就是寻找多个互不相关的现金流。

如何财务自由?

这道题初一看,解题思路很简单,避免掉进消费主义陷阱,大量储蓄工资,同时把储蓄投一个高赔率的标的。
如果顺利的话,存个两年的工资,再命中十倍以上赔率,这辈子的工资就赚到手了,按胡润榜所谓的「标准」,差不多可以达成所在城市的初级财务自由净值。但是在这之后呢?会不会有赔光的风险?

如果全部存储为低风险资产,吃派息,就安全了吗?会不会因为快速膨胀的 M2 (每年15%)导致十年后重新扛起锄头种地(此处不包含 defi 种地)?

Read on →

为什么 LINK 和 AMPL 是空气币

先来说说 LINK

截止现在,18年到20年,最高价20多,最多涨了100倍。Defi 和 oracle 八竿子碰巧能打到一点点,最近和大热的 Defi 走的很近,市值也一度到了第五名。
买的早那是真香,但是有两个硬伤:

Read on →

拉埋点数据SQL三分钟速成

1. 基本选取

我们现在有一个表 user_action,有如下数据:

1
2
3
4
SELECT
*
FROM user_action
;
app_id app_version device_id sys_ver event_name
21370000 8.15.2 x000001 13.3 btn1_touched
21370000 8.15.2 x000001 13.3 btn1_touched
21370000 8.15.2 x000001 13.3 btn1_touched
21370000 8.15.2 x000002 14.0 btn2_touched
21370000 8.15.2 x000003 14.0 btn1_touched
21370000 8.15.2 x000003 14.0 btn2_touched

app_id app_ver 表示 app 和其版本号
device_id 为设备id
sys_ver 为系统版本号
event_name 为具体的事件名

Read on →

macOS BigSur 适配指引

在 Apple Silicon 上做性能分析

  • 原生代码一般都会比转码性能更好
  • 小心使用 Intel 专有的代码优化(SSE, AVX)
    • 可能需要针对 Apple Silicon 的优化版本
  • 尽可能使用 Apple 提供的 AP (Accelerate framework)

Apple Silicon 的非对称 CPU 核心

  • Apple Silicon Mac 有两种类型的核心
    • 高性能核心(P Cores)
    • 节能核心(Cores)
    • 在高并发任务场景下,所有的核心可以同时开启

避免使用忙等和 spinlock

  • 忙等会占用性能核心,进而导致任务延迟
  • 推荐的阻塞同步原语
    • NSLock, os_unfair_lock, pthread mutexes
    • NSCondition, pthread 条件变量
  • 避免按照 CPU 的数量划分工作任务
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
// Prefer blocking locks and condition variables
func performWorkUnderSpinlock () {
  os_unfair_lock_lock()
  performWork()
  os_unfair_lock_unlock()
}

func retrieveNextWorkTask() -> WorkTask {
  condition.lock()
  while !taskQueue.hasAnyWork {
      condition.wait()
  }
  let task = taskQueue.pop()
  condition.unlock()
  return task
}

在 Apple Silicon 上调试、测试和性能分析

  • 构建工作可以使用任何 Mac,但是运行 arm64 代码只能在 Apple Silicon Mac 上
  • 分别测试原生和 Rosetta 的运行方式
  • 注意 Intel 专有代码和忙等的实现
第一方
从源码编译
和你的 app 一起发布
第三方
预先编译好的二进制
和 app 一起或者单独发布
进程内
进程外 x
原生 app 只能加载原生插件
Rosetta 转码 ap 只能加载 x86_64 插件

通过 XPC 使用进程外插件

  • 每个插件一个进程或者每种架构一个进程
  • 更好的稳定性和安全性

为了插件使用 Rosetta

  • 用户可以强制一个通用 app 通过 Rosetta 启动
  • 通过 Info.pist 关键字可以禁用
  • 详见 macOS 移植文档

警惕多线程缺陷

  • Intel CPU 和 Apple Silicon 采用不同的内存排序模型
  • 正确的代码有相同的行为,有缺陷的代码(争条件,数据竟争)却各有各的表现
    • 一个数据竞争在 Intel CPU 上也许不显露,却有可能在 Apple Silicon 上导致崩溃
    • Rosetta 提供 Intel CPU 相同的内存排序
  • 使用 Thread Sanitizer 来发现和防止数据竞争问题

兼容性

  • 兼容的 app 自动可见
  • 可以在 App Store Connect 管理

硬件的区别

  • 鼠标和触控事件
  • 环境传感器的区别
    • 陀螺仪
    • 指南针
    • 雷达摄像头
    • GPS
  • 相机
    • 使用 AVCaptureDeviceDiscoverySession 自动兼容
  • 照片选取

Diff: /Manifest.lock: No Such File or Directory: PODS_ROOT Not Defined

WeexSDK 增加 pods 依赖的时候提示:

diff: /Manifest.lock: No such file or directory

查看 shell script:

1
diff "${PODS_PODFILE_DIR_PATH}/Podfile.lock" "${PODS_ROOT}/Manifest.lock" > /dev/null

echo 发现 PODS_ROOT 为空,导致 diff 右值传递为 ‘/Manifest.lock’,所以文件找不到。

查看 Pods-WeexSDK.debug.xcconfig 中对 PODS_ROOT 有定义:

1
PODS_ROOT = ${SRCROOT}/Pods

而且 project Info -> Configuration 下面指定了正确的 xcconfig。怀疑 PODS_ROOT 被某优先级更高的设置覆盖为空了。

全局搜索 PODS_ROOT,发现 target -> Build Settings -> User Defined 中对 PODS_ROOT 设置了空值。删除后问题解决。