2025-11-16 12:41:00
刚睡到11点半起床,看到个推
Driven by Compression Progress: A Simple Principle Explains Essential Aspects of Subjective Beauty, Novelty, Surprise, Interestingness, Attention, Curiosity, Creativity, Art, Science, Music, Jokes
压缩过程驱动:简单道理解释 美、新颖、意外,趣味、关注、好奇、创意,艺术、科学、音乐和笑话 的基本面
https://arxiv.org/abs/0812.4360
这个副标题听上去就很带劲儿,这么大文科味儿的东西怎么就能被「压缩」给解释了,那么多主观的东西,就这?正如 Musk 说的:
Schmidhuber invented everything 尤根早就发明了当前AI的everything!
Juergen Schmidhuber 是 LSTM 的发明人。LSTM 是一种AI技术能长时间理解上下文,能处理复杂时间序列,解决了早期 RNN “记忆很快消失”的根本问题,这才让“听懂一句完整的话”成为可能。而且他做出这个研究是在 1997 年!
于是赶紧拜读一下这篇大作。它这个说法,大框架来说有4个要点:
Juergen说上面这个框架可以概括所有「好奇」和「创意」系统。这个系统有很多副产品:
Beauty, in this framework, is recognizable compression progress. A painting, a symphony, a theorem, a punchline all trigger a sudden “Aha!” of re-encoding the data more efficiently than before.
The observer literally rewrites its internal model of the world in a simpler, more elegant form. The emotional spike we feel is the direct consequence of that rewriting.
读完之后,我感觉。。。挺民科的,但是又似乎没啥大毛病。或许情绪和主观,就是人脑内在的一个激励机制?Juergen能把这么多乱七八糟的事都归纳到「压缩」上面也是挺能干的。
要知道,那可是他90年代就想明白的事。
2025-11-15 10:17:00
觉得最近Tim和军儿都着了道了,两个同样都是内容创作者,关注度较高,最近都被“舆论”冲击。为他们可惜。
一开始我不太明白,为啥会有那么极端的傻逼莫名其妙的把原视频曲解成那样?影视飓风这个澄清印证了,这些hater其实本来就拒绝看原视频,它们出于本能的讨厌会加倍传播“掐头去尾”的误解。
上学的时候,注意力涣散和理解偏差的人被认为是“差生”,对个体的人为的分类和教正,在强调“公平”的成年人社会是反过来的。老师给「听众」贴标签的权利是学校赋予的,脱离校园进入社会,是听众给「老师」打分。
平台和舆论很傻逼怎么办?没办法。傻逼的共识也是共识。
网上有句笑谈,傻逼是优质国家资产。启蒙傻逼犯罪。所以,国家需要保护傻逼。作为个体,最优解是想办法盘活这个资产并最大化的从资产身上得到收益;对于Tim和军儿,他们需要处理这部分负资产。
舆论风险不是公平的,谁不掌握言论的「防卫权」,谁就是被审判的人。突然想起来,Elon Musk这招才是绝杀。democrats 当年那个呼风唤雨,直接把 TWTR 买了。甚至都不用删号,直接后台凝视,这些矩阵号都不敢乱来了。
矩阵号,切片传播是不是要故意恶心人呢?在赞美和诋毁之间,它们选择了起号。在输和赢之间它们选择了流量最大的打法。捕风捉影是基操。
军儿本来手上是有“米聊”之类的社交牌的,他自己放弃了。金山、小米都是千亿市值的企业,每年出一点养老的钱维护个app有那么难?
回忆起来,我也一度非常想创业做社交,大部分人都反对,理由担忧监管压力,运营风险。
是的,他们说得没错。现在也看明白了,你不承风险,风险就跑到别的平台上蛐蛐你。
另一方面,这也解释了为什么现在很多 podcast 话题尺度比较大。因为没法截图断章取义。只能一段一段听完。
2025-11-12 17:36:00
网上很多套Cloudflare教程,但是大多数都是在前置作为反向代理,CF的IP如果不挑选,则喜提“减速乐”
我这边的情况是该死的 Google 把我IP送中了,打死不提供 gemini 服务,为了解决锁区问题,本来以为简单用一下 Cloudflare Warp 就行,没想到是个大坑。花了好几天研究。
核心问题是, warp-cli connect 之后就失联了,ssh 都连不上。
warp-cli 网上很多教程都过时了。它命令行改版了。最简单的 warp-cli mode 其实官方教程都不全,它的 warp 和 warp+ ,改成 tunnel_only 还是不行。寄希望于 proxy 模式,官方博客说 "use the proxy (HTTPS or SOCKS5)",我实际测试,这个默认端口 40000 都是拼凑搜出来的。 然而我打死也没测试成功如何用 HTTP_PROXY 。AI 说只有 win/mac 的桌面版本支持?wtf。
没有希望,看下别人怎么解决的,大神给出的解是 一键脚本。
Cloudflare WARP 多功能一键脚本,支持纯IPV4/纯IPV6/双栈V4V6的VPS共9种情况随意切换安装,screen一键手动/自动刷新支持Netflix奈飞的IP(自动识别WGCF与SOCKS5环境,自定义刷新奈飞IP的时间段间隔,自定义奈飞区域国家,自定义仅刷区域国家),支持升级WARP+及Teams账户。
搜到最早的出处应该是 p3terx 的。但是这种一键脚本我都不太敢用,万一写个什么后门之类的你怎么知道。
大概读了下,会执行下面的脚本:
curl -fsSL git.io/wgcf.shcurl -fsSL git.io/wireguard-go.shgit.io 是个第三方短链服务,可能会看人下菜碟?怕怕
看了半天发现回到原点,核心原理还是proxy然后socks5。或者把 wireguard 配置提取出来自己配路由
有没有什么不用第三方复杂配置,用官方的 warp-cli 但是保留几个tcp端口可用呢?
于是同 ChatGPT、gemini 两位老师向 Linux 网络栈 展开了斗智斗勇。真是苦啊。需要在 warp 生效的时候测试不同的方法,就在那个贼难用的 noVNC html5 based VNC client 里一行一行代码试出来的
得到了以下宝贵教训:
ip route 路由也不是全部,其实还有 policy based routing 叫 ip rule
其中 warp-cli 会创建一个叫 cloudflare-warp 的 nft,还有一个叫 CloudflareWARP 的 dev。然后在 ip rule 里会添加一条
32765: not from all fwmark 0x100cf lookup 65743
这里学到几个冷知识:
/etc/iproute2/rt_tables 定义一套alias耍聪明把INPUT流量标记一个 0x100cf 是不行的。以为是配置问题用 tcpdump 发现甚至只有 SYN 包。后来才知道去折腾 nf-tables。
echo "200 inbound" | sudo tee -a /etc/iproute2/rt_tables 或者这一步不做也行,后面所有的 inbound 都替换成 200 就行sudo ip route add default dev eth0 scope link table inbound 这个是因为我VPS是on-link的。如果是实体 dev 自己换下warp-cli connect 这玩意会在所有自定义 ip rule add 前面加一条策略所以记得先连,再加自己的策略 sudo ip rule add from all sport 6666 lookup inbound pref 500 这里的 500必须比默认的 32765 低。所以要先连上 warpsudo nft insert rule inet cloudflare-warp input tcp dport 6666 accept 入站 接受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 高等教育里,还存在大量浪费的无用甚至负用教育。
按我说,教育就应该这么办:
教育说完了,说说学习。
这几天恰好跟娃的成绩着急,前面讲的,后面就忘了。本来白天上班就够焦虑了,晚上给人整崩溃。
恰好刷到别人转的 一则 RT
你总是觉得累,并不是因为你工作太多,而是因为你有太多“没闭环的事”。
那些你还没回的讯息、还没说出口的道歉、你一直在逃避的决定、你一再拖延的谈话。这些事整天在你脑海的后台运行,不断消耗你的能量。
关闭这些循环,完成它们。你会发现自己的精力在慢慢恢复。心理负担,比任何体力劳动都更让人筋疲力尽。
这突然启发了我——这不就是成绩差的原因吗?前面的问题还没搞懂,老师就讲到后面了。知识点千疮百孔,基础不牢,地动山摇。套路题的套路背下来了,结果计算出错或条件带入错误。唉……
你说补习吧,也不知道从哪里开始。到处都是问题,没有一个闭环。想象“别人家的孩子”,优秀的人对知识的“一致性”和“完整性”都有追求,他们甚至喜欢手绘一整套知识地图。
怎么解决呢?我也不知道。
我知道的是,ADHD 和拖延症有些相似,核心在于多巴胺的分配机制。多巴胺,简单说,就是驱动力,也可以理解为精气神的“气”。
当人意外完成某件事并获得好处时,多巴胺会让行为与结果之间产生联系(建立神经通路),并奖励人不断重复这个行为。只是这种奖励感不等同于直接的快乐。在长期多巴胺作用下,相关神经通路会不断被强化。如果强化过度,就会形成路径依赖,产生渴望和欲望。
优秀的学习者会追求更高的水平,所谓“优秀是卓越的大敌”。
这个机制有一个致命缺陷:它是一个点。它控制经过这个点通路的 YES / NO
小学之后,知识就变成了“面”或者“体”。学习中大量的中间环节,是一个毫无奖励的枯燥序列,一堆前置知识就能把人烦死。如果孩子的注意力无法在上下文中长时间保持,最终结果肯定会 fail。
文史类的还可以胡诌几句,数理类的就直接完蛋。这和拖延症的问题几乎一模一样。太宏大的目标,往往难以执行,迈出第一步尤其困难。
当然,成年人面对的工作任务、老板布置的指令、甲方提出的需求,比学校里人工设计的题目扯蛋一万倍。考试至少有明确答案,而在现实世界里,你提出的问题方向可能都是错的。
学习的方法论:在你多巴胺失效之前,探索一条每一步都有正向激励最短路径完成图遍历。
方法论已经有了,接下来就是把这个原理应用到学习流程设计里了。很多码农都喜欢折腾一套todo,为了帮助拖延症同病房的学习困难症患者,那么接下来让我从一个简单的 TodoMVC 原型开始……算了拉倒吧 🤣
2025-11-06 17:53:00
偶然刷到这么一个人的童年:
奇妙的经历,估计好多人感觉都有相似之处? 🤣
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.
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
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.
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. 🤣
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.
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?
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()
I got the mess to work eventually.
add_generic_rpc_handlers and stuffpool = ProcessPoolExecutor(...) before the unary_unary_rpc_method_handler, with an initializer that spawns a global loop = asyncio.new_event_loop(). concurrent.futures only allows it this wayloop.run_until_complete() inside pool.submit()
If you aren't a try-hard:
avoid async
avoid gRPC