MoreRSS

site iconEST修改

EST = Extrospect, Sein & Tao ,后端工程师。
请复制 RSS 到你的阅读器,或快速订阅到 :

Inoreader Feedly Follow Feedbin Local Reader

EST的 RSS 预览

影视飓风和小米

2025-11-15 10:17:00

觉得最近Tim和军儿都着了道了,两个同样都是内容创作者,关注度较高,最近都被“舆论”冲击。为他们可惜。

一开始我不太明白,为啥会有那么极端的傻逼莫名其妙的把原视频曲解成那样?影视飓风这个澄清印证了,这些hater其实本来就拒绝看原视频,它们出于本能的讨厌会加倍传播“掐头去尾”的误解。

上学的时候,注意力涣散和理解偏差的人被认为是“差生”,对个体的人为的分类和教正,在强调“公平”的成年人社会是反过来的。老师给「听众」贴标签的权利是学校赋予的,脱离校园进入社会,是听众给「老师」打分。

平台和舆论很傻逼怎么办?没办法。傻逼的共识也是共识。

网上有句笑谈,傻逼是优质国家资产。启蒙傻逼犯罪。所以,国家需要保护傻逼。作为个体,最优解是想办法盘活这个资产并最大化的从资产身上得到收益;对于Tim和军儿,他们需要处理这部分负资产。

舆论风险不是公平的,谁不掌握言论的「防卫权」,谁就是被审判的人。突然想起来,Elon Musk这招才是绝杀。democrats 当年那个呼风唤雨,直接把 TWTR 买了。甚至都不用删号,直接后台凝视,这些矩阵号都不敢乱来了。

矩阵号,切片传播是不是要故意恶心人呢?在赞美和诋毁之间,它们选择了起号。在输和赢之间它们选择了流量最大的打法。捕风捉影是基操。

军儿本来手上是有“米聊”之类的社交牌的,他自己放弃了。金山、小米都是千亿市值的企业,每年出一点养老的钱维护个app有那么难?

回忆起来,我也一度非常想创业做社交,大部分人都反对,理由担忧监管压力,运营风险。

是的,他们说得没错。现在也看明白了,你不承风险,风险就跑到别的平台上蛐蛐你。

另一方面,这也解释了为什么现在很多 podcast 话题尺度比较大。因为没法截图断章取义。只能一段一段听完。

套 Cloudflare Warp 解决IP送中

2025-11-12 17:36:00

缘起

网上很多套Cloudflare教程,但是大多数都是在前置作为反向代理,CF的IP如果不挑选,则喜提“减速乐”

我这边的情况是该死的 Google 把我IP送中了,打死不提供 gemini 服务,为了解决锁区问题,本来以为简单用一下 Cloudflare Warp 就行,没想到是个大坑。花了好几天研究。

核心问题是, warp-cli connect 之后就失联了,ssh 都连不上。

warp-cli 网上很多教程都过时了。它命令行改版了。最简单的 warp-cli mode 其实官方教程都不全,它的 warpwarp+ ,改成 tunnel_only 还是不行。寄希望于 proxy 模式,官方博客说 "use the proxy (HTTPS or SOCKS5)",我实际测试,这个默认端口 40000 都是拼凑搜出来的。 然而我打死也没测试成功如何用 HTTP_PROXY 。AI 说只有 win/mac 的桌面版本支持?wtf。

CF一键脚本

没有希望,看下别人怎么解决的,大神给出的解是 一键脚本。

Cloudflare WARP 多功能一键脚本,支持纯IPV4/纯IPV6/双栈V4V6的VPS共9种情况随意切换安装,screen一键手动/自动刷新支持Netflix奈飞的IP(自动识别WGCF与SOCKS5环境,自定义刷新奈飞IP的时间段间隔,自定义奈飞区域国家,自定义仅刷区域国家),支持升级WARP+及Teams账户。

搜到最早的出处应该是 p3terx 的。但是这种一键脚本我都不太敢用,万一写个什么后门之类的你怎么知道。

大概读了下,会执行下面的脚本:

  • curl -fsSL git.io/wgcf.sh
  • curl -fsSL git.io/wireguard-go.sh

git.io 是个第三方短链服务,可能会看人下菜碟?怕怕

看了半天发现回到原点,核心原理还是proxy然后socks5。或者把 wireguard 配置提取出来自己配路由

有没有什么不用第三方复杂配置,用官方的 warp-cli 但是保留几个tcp端口可用呢?

研究

于是同 ChatGPT、gemini 两位老师向 Linux 网络栈 展开了斗智斗勇。真是苦啊。需要在 warp 生效的时候测试不同的方法,就在那个贼难用的 noVNC html5 based VNC client 里一行一行代码试出来的

得到了以下宝贵教训:

  1. iptables 老早就过时了。现在的 iptables 实际上是 nf-tables 的马甲!吃了大亏!翻来覆去在错误的地方检查,AI也不提醒我一下
  2. ip route 路由也不是全部,其实还有 policy based routing 叫 ip rule

其中 warp-cli 会创建一个叫 cloudflare-warp 的 nft,还有一个叫 CloudflareWARP 的 dev。然后在 ip rule 里会添加一条

32765: not from all fwmark 0x100cf lookup 65743

这里学到几个冷知识:

  1. 前面的 32765 是优先级,越低越优先,命令行里可以写成 priority 32765 或者 pref 32765 一回事
  2. 后面的 65743 是内核里的table,可以在 /etc/iproute2/rt_tables 定义一套alias

耍聪明把INPUT流量标记一个 0x100cf 是不行的。以为是配置问题用 tcpdump 发现甚至只有 SYN 包。后来才知道去折腾 nf-tables。

如何给全局 warp 开一个端口

  1. echo "200 inbound" | sudo tee -a /etc/iproute2/rt_tables 或者这一步不做也行,后面所有的 inbound 都替换成 200 就行
  2. sudo ip route add default dev eth0 scope link table inbound 这个是因为我VPS是on-link的。如果是实体 dev 自己换下
  3. 连接 warp-cli connect 这玩意会在所有自定义 ip rule add 前面加一条策略所以记得先连,再加自己的策略
  4. sudo ip rule add from all sport 6666 lookup inbound pref 500 这里的 500必须比默认的 32765 低。所以要先连上 warp
  5. sudo nft insert rule inet cloudflare-warp input tcp dport 6666 accept 入站 接受
  6. sudo nft insert rule inet cloudflare-warp output tcp sport 6666 accept 出站 接受

因为步骤3 执行之后你ssh就掉了,记得做成一个 .sh 脚本。。。

然后每次断开连接 warp-cli disconnet 之后,记得删除第4步里创建的

sudo ip rule del pref 500

否则的话,该死的 warp-cli connect 会创建一个 pref 499 在你前面卡位!

测试

curl -sk https://www.cloudflare.com/cdn-cgi/trace

折腾结束。这应该是全网第一个不动官方 warp-cli 能开端口的方法。

学习的方法论

2025-11-07 09:49:00

前段时间记录了下 Hinton 一句话总结了教育的本质,有朋友看后说,你这个太幼稚

教育怎么会仅仅是传输,是灌输呢?他说,教育的内涵是建立一套世界观,是一个彼岸。在这个世界里,包含你在成年生活中可能用到的一切知识,有深度,也有广度。你需要去感知、去理解、去体会。

人又不是机器,有主观能动性,所以教育绝不是被动接受数据就完事。教育提供的是一种能力,让后人能够不断超越前人。

面对这浓浓鸡汤味的一番道理,我觉得道理也没错。于是我突发奇想问:“教育,是不是就好比给孩子装一套操作系统?”

朋友懵逼了一会儿。我又接着问:“如果用 10B/s,比软盘还慢的外设来装系统,你不会觉得痛苦吗?”

朋友半天只回了一个:“……”

虽然这个比喻是灵机一动,但人生确实需要安装太多驱动。经典的“学好数理化”就是理工科的内核。而当你真正脱离父母、走出学校时,你还会发现人际交往的 IO 才是最麻烦的驱动。

我还特意在网上搜集了一些类似的陈词滥调:

  • 教育的本质,是对“人”的教育,而非对“任务”的完成。
  • 最有效的教育,永远发生在良好的关系之中。在学校,就是师生关系;在家里,就是亲子关系。
  • 教育的本质是培养能力。应试教育的本质是筛选,而不是培养能力。
  • 教育是上层建筑
  • 苏格拉底:教育的真谛不是灌输而是点燃,一万次灌输不如一次真正的唤醒
  • 知识还在生长过程中时,我们就已经接触到了,我们需要了解它,但了解到的也不是最终的结果。世界和社会变化太快

抛开教育是什么不谈,只说教育的缺点,我看是时效性问题。浪费很多时间学习过时的东西。前段时间我SO在考一个证,习题反复出现的一个考察知识点,数字信息有哪些存储媒介?答案:硬盘软盘,还行;光盘,可以接受;集成电路卡,这……是什么鬼?

我想起来中学还学过Flash。虽然我一直认为Flash技术很先进,但这个技术栈还是避免不了没落。大学有朋友还深入研究过 ASP.NET Atlas技术,后来却被 AJAX 无情地抛弃。很多东西,往往两三年就过时了。

无论你把教育当作安装操作体系,还是世界观和认知,或是什么人文 科学,教育的瓶颈已经凸显了——你都只有 10B/s 的带宽来进行同步。而且在学前教育 义务教育 K12 高等教育里,还存在大量浪费的无用甚至负用教育。

按我说,教育就应该这么办:

  1. 做一套最小规模的 bootstrap
  2. 以压缩技术为突破口
  3. 想一切办法学习带宽

教育说完了,说说学习。

这几天恰好跟娃的成绩着急,前面讲的,后面就忘了。本来白天上班就够焦虑了,晚上给人整崩溃。

恰好刷到别人转的 一则 RT

你总是觉得累,并不是因为你工作太多,而是因为你有太多“没闭环的事”。
那些你还没回的讯息、还没说出口的道歉、你一直在逃避的决定、你一再拖延的谈话。这些事整天在你脑海的后台运行,不断消耗你的能量。
关闭这些循环,完成它们。你会发现自己的精力在慢慢恢复。心理负担,比任何体力劳动都更让人筋疲力尽。

这突然启发了我——这不就是成绩差的原因吗?前面的问题还没搞懂,老师就讲到后面了。知识点千疮百孔,基础不牢,地动山摇。套路题的套路背下来了,结果计算出错或条件带入错误。唉……

你说补习吧,也不知道从哪里开始。到处都是问题,没有一个闭环。想象“别人家的孩子”,优秀的人对知识的“一致性”和“完整性”都有追求,他们甚至喜欢手绘一整套知识地图。

怎么解决呢?我也不知道。

我知道的是,ADHD 和拖延症有些相似,核心在于多巴胺的分配机制。多巴胺,简单说,就是驱动力,也可以理解为精气神的“气”。

当人意外完成某件事并获得好处时,多巴胺会让行为与结果之间产生联系(建立神经通路),并奖励人不断重复这个行为。只是这种奖励感不等同于直接的快乐。在长期多巴胺作用下,相关神经通路会不断被强化。如果强化过度,就会形成路径依赖,产生渴望和欲望。

优秀的学习者会追求更高的水平,所谓“优秀是卓越的大敌”。

这个机制有一个致命缺陷:它是一个点。它控制经过这个点通路的 YES / NO

小学之后,知识就变成了“面”或者“体”。学习中大量的中间环节,是一个毫无奖励的枯燥序列,一堆前置知识就能把人烦死。如果孩子的注意力无法在上下文中长时间保持,最终结果肯定会 fail。

文史类的还可以胡诌几句,数理类的就直接完蛋。这和拖延症的问题几乎一模一样。太宏大的目标,往往难以执行,迈出第一步尤其困难。

当然,成年人面对的工作任务、老板布置的指令、甲方提出的需求,比学校里人工设计的题目扯蛋一万倍。考试至少有明确答案,而在现实世界里,你提出的问题方向可能都是错的。

学习的方法论:在你多巴胺失效之前,探索一条每一步都有正向激励最短路径完成图遍历。

方法论已经有了,接下来就是把这个原理应用到学习流程设计里了。很多码农都喜欢折腾一套todo,为了帮助拖延症同病房的学习困难症患者,那么接下来让我从一个简单的 TodoMVC 原型开始……算了拉倒吧 🤣

一个叛逆大爷的童年

2025-11-06 17:53:00

偶然刷到这么一个人的童年:

  1. 十分讨厌传统文化
  2. 上小学喜欢看小说。比如 三国 西游 等。怕被老师抓?老师过来,用一本书盖住。
  3. 因为老师苛刻,打学生。所以10岁逃学,不敢回家;山谷里流浪三天,最后找到发现是兜圈子,离家大概才8里
  4. 13岁忤逆父母。
    离家出走!有一件事我记得特别清楚。在我大约13岁的时候,我父亲请了许多客人到家里;我们两人当着他们的面争论起来。父亲当众骂我懒而无用。这一下激怒了我。我回骂了他,接着就离家出走。我母亲追着我想劝我回去。父亲也追上来,边骂边命令我回去。我跑到一个池塘边,并且威胁说如果他再走近一步,我就要跳进水里。在这种情况下,停止内战的要求和反要求都提出来了。我父亲坚持要我道歉并磕头认错。我同意如果他答应不打我,我可以跪一只腿磕头。战争就这样结束了。
  5. 认为皇帝不是坏人,甚至不反对帝制,都是手下干坏事?
  6. 从小大量阅读,知道拿破仑、叶卡德琳娜女皇、彼得大帝、威灵顿、格拉斯顿、卢梭、孟德斯鸠和林肯
  7. 上大学想出国,学法语。还认识一位在加州加入了Ku Klux Klan的学长。

奇妙的经历,估计好多人感觉都有相似之处? 🤣

gRPC Python, AsyncIO and multiprocess

2025-11-04 10:46:00

I am torn about writing this. AsyncIO in Python is always a mess, protobuf is another, gRPC is the worst of them all because of all that boilerplate code that does nothing but trouble.

The task I am facing is integrating a mesh API server based on our internal codebase.

non-gRPC options

I mean, gRPC is just h2+protobuf, how hard could it be? Even uWSGI had h2 from decades ago

Turns out the options are quite limited. h2 in uWSGI was major versions behind, SPDYv3 never took off. gRPC and h2 are related but different because the frames are marked and handled differently.

So there's either hypercorn or fallback to gRPC. To avoid further mess I decided to stick with gRPC

infectious async/await

Now I face another challenge: The existing business logic is written in async/await style (cue FastAPI fad)

I carefully studied the gRPC async hello world example

Everything ran great, except the notorious GIL, my gRPC server runs but only on one single CPU.

multiprocess

Old school solution to GIL: spawn many processes. Given a 1:1 map to worker CPU. Easy? There's an official multiprocessing example

It worked... until it didn't. The major selling point of h2 is connection multiplexing, one TCP connection to serve all concurrency. And our mesh client is so good at this, only one worker consumes 100% of one CPU and the rest simply idle. 🤣

SO_REUSEPORT

I also tried to implement a prefork worker on my own. Let's get rid of master because political-correctness we have SO_REUSEPORT already.

Unfortunately it didn't work at all, because of h2's multiplexing nature. The kernel won't schedule requests if there's only one single connection.

ProcessPoolExecutor

I looked closely and found how gRPC inits:

grpc.server(futures.ThreadPoolExecutor(max_workers=10))

Maybe swap it with ProcessPoolExecutor() ?

Nope, server went dead with a timeout. Don't have time to look into C/C++ details. Nope.

It seems gRPC only allows ThreadPoolExecutor().

Why does Google even allow it as a parameter then?

The apply_async() hallucination

Out of despair, next I asked ChatGPT. The advanced AI model said: just use multiprocessing in your invokes

Yeah why not. So how do I run async in multiprocessing?

ChatGPT hallucinated: use apply_async. I initially believed that shit only to find it means the func will return an AsyncResult object, not running some async/await code. btw, I found the .apply() is just a shortcut for .apply_async().get()

Putting it together

I got the mess to work eventually.

  1. Create a normal gRPC server with add_generic_rpc_handlers and stuff
  2. Create a pool = ProcessPoolExecutor(...) before the unary_unary_rpc_method_handler, with an initializer that spawns a global loop = asyncio.new_event_loop().
    It had to be global because concurrent.futures only allows it this way
  3. Run loop.run_until_complete() inside pool.submit()

lessons learned

If you aren't a try-hard:

  • avoid async

  • avoid gRPC

特立独行的中文

2025-10-24 17:42:00

上一篇汉字 和 汉语 的先进性 还没完

最近不知道在 X 上还是 xhs 上,原帖我翻不到了。有留子在图书馆查资料,用中文搜索,旁边印度妹问在看啥?

留子说在查学术问题。印度妹悻然说到,她的母语就没有这么多资料可查,只能有英语资料可看。

这回到我今年第一篇blog 如何用英语给出简短的 “春节” 定义 抛出的一个观点:

其实,全世界的主要语言里,只有汉语还在坚持“意译”

仔细想想还是挺恐怖的,全世界都叫 ResNET,日本人甚至用假名 レズネット 也要坚持音译。

前端时间 龙是不是要翻译成 Lonng 也是个很火的话题,现在很多人明白了。意译实际上是中文使用者的一厢情愿,特立独行的。日韩把很多东西都已经抢注了,比如 围棋 Go 泡菜 kimchi,老中还在那里老老实实的 Sour Pickles。

这个做法有好有坏,但是这种坚持就。比较难评。

又想起一个老梗:

元朝有个官职叫怯里马赤,放在现在叫翻译官。有一次忽必烈先生问孔子是什么人,有人告诉他:孔子是老天爷的怯里马赤。忽必烈先生很满意这个回答,曰:善。

出处:叶奇《草木子》卷四下:

(北人)立怯里马赤,盖译史也,以通华夷言语文字。昔世祖尝问孔子何如人。或应之曰:“是天的怯里马赤。”世祖深善之。

意译这事坚持得有多离谱呢?连天意都要给你翻译成中文。巫文史医一脉相承了等于说是。