duangsuse::Echo
713 subscribers
4.24K photos
127 videos
583 files
6.46K links
import this:
美而不丑、明而不暗、短而不凡、长而不乱,扁平不宽,读而后码,行之天下,勿托地上天国。
异常勿吞,难过勿过,叹一真理。效率是很重要,盲目最是低效。
简明是可靠的先验,不是可靠的祭品。
知其变,守其恒,为天下式;穷其变,知不穷,得地上势。知变守恒却穷变知新,我认真理,我不认真。

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
Forwarded from Sukka's Notebook
r/Cloudflare
Forwarded from Sukka's Notebook
果然还是 Rust 的问题,用 Nginx + Lua 驱动的 FL1 不受太大影响(gracefully catch 掉了)、而 RIIR 重写后的 FL2 就直接 panic 触发了 HTTP 500。

以及这就是 Rust:「让我们提前分配 远比我们正常情况下需要的多得多的内存、这样有助于改善性能。但是一旦非正常情况导致内存占用飙升 超出了预分配的空间,就既不能增加内存分配、也不能 gracefully fail,必须整个线程完全 panic 然后 crash」。
duangsuse::Echo
比较深奥的话题里,我快被内联的代码淹没了,却不知道他,或者原软件的作者想handle什么数据结构和动态。当然我贴的链接都是很易读的,因为他选择了较高视角。 高视角和技术栈的符号无法结合,也算是95%的通病。
#statement #learn 《面向薛定谔的技术分享》
刚才有个朋友说,
咱们写个文既要 "get ur hands dirty", 又要能添加 "footprints",还tm要别人觉得易读,
那不就和玩泥坑的佩佩猪一样,成巨婴了?😒


可是…… 在读这一类仅仅是博文-而非知识库的产出时,我就能隐约感受到一层“可悲的厚壁障”了😅:好像作者已死,读者不能出于好奇或自己领域的经验提出任何问题。
这就像读博文或AI生成的完整代码时,却不能edit&rerun,甚至都不能run的起来一样,手感非常怪异。 简单来说,这就是yin所谓的「死知识」
https://yinwang.org/posts/learning-philosophy#:~:text=死知识可能来源于真正聪明的人,但普通人往往是间接得到它

然而,我似乎能猜到95%网文对技术“粗粒度”和“细粒度”的描述间,又为什么会缺失这一种中间融合态的视角,而有时又没这毛病。旁观者清,我把这种状态称为「面向薛定谔的技术分享」。🤯

我学习的方式比较特殊,因为我脑子不好,经常学不进东西!所以,我的任何一个知识,并非是“插入了”整个的知识图谱里,而像是“在教程和实践的启发下,自己创造出来的新知识”。
这样状态的知识不经考(因为学习效率低),而且往往也与主流技术界“没有共同语言”,但也有一点好处。🤪

我能控制知识点间的超链接,也知道着手的顺序
,就像py函数一样。
我能看清热点的时序、难点的重构、高开销的IO和易错的地方,好像是自己在运行着整个图谱一样,知道在哪里加个if就能提升静态或动态的性能😒

所以我们就能回答文章顶部的问题了:
粗粒度理解时,外部的知识树并不大,所以自己没有knowledge-base也可以含得(handle)住; 细粒度时,因为完全是转发主创的形状,照猫画虎,也没问题; 但是要在之间形成一种解读时,这两种 "hot path" 都靠不住了,必须是“去优化”到自己来做,才能抓得住。 毕竟,创作是掌握的象征。


因为是“自己创造”而非“FFI外语接入”,获得知识的「内聚性关联」较弱,我能够切断我不想要的,或者替换,或者打散重组;就像JVM的native比之cpy的“C 语 言 (意味深) 插 件”一样:
前者必须遵循Java的心智模型,按照她的生命周期来,不然就不接纳它这个“复用库”;后者则非常自由,每次生态的整体升级都会给cpy自己卡点设限。😅
——最要命的是“C插件”所依赖的C生态,根本不在cpy自己调度范围内;但也没差的,反正cpy也成了unix系的一个附庸。 它获得了她那70年积累下来的“下限”,但同时也失去了替代unix工作的机会,可以说有得必有失。

那,如何直观区分“学到的知识vs受外部启发而自己创造的知识”?
简单来说,后者是双向选择。 我的认知之网不存在“pin好的值”,或者表象形式。 这个站点,是热补丁的、交叉引用的,不存在「一种清单」去豁免知识,更不会将死知识“视如己出”。

我认可,才知之;交叉引用太少,我想学都不成。 其实呢,这也未必是学习效率低,人们谈教育的词,慢慢从智商、智慧、认知,变到更优的指标。
yin对一些「知识负资产」还能实践一些,有成果后去骂几句,遂束之高阁;我就没他那么聪明。 有些“知识孤岛”表面上存续,它们作为整体却没有希望。
我把教程融入自身,而不许自身融入教程。 寻根究底,最简单的替代品,就是事物的本质。


在AI和 #ML 技术发展的当下,你想要选择哪种模式,调度自己所「掌握」的知识呢?😒
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from 层叠 - The Cascading
Python 基金会因「坚持推行 DEI」放弃美政府 $1.5M 捐款。

- Python 基金会 (PSF) 发文如是说。DEI 指多元化、平等及包容 (diversity, equity, inclusion)。
- 捐款来自美国政府国家科学基金会 (NSF) 关于开源生态系统的项目,起初由 Python 基金会职员组织申请。
- 捐款方美国政府要求 PSF 不开展促进 DEI 的工作,否则可能收回已发放捐款。

pyfound.blogspot.com/~

#Python #US
Forwarded from 层叠 - The Cascading
Firefox 新吉祥物:小狐狸 Kit。

https://www.firefox.com/en-GB/kit/

EDIT 11/9: 修正一个 typo。

#Firefox
Forwarded from 咕 Billchen 咕 🐱 抹茶芭菲批发中心 (billchenchina | 缩缩)
All modern digital infrastructure
https://mk.absturztau.be/notes/af9ier31oog102r8
Forwarded from &'a ::rynco::UntitledChannel (Rynco Maekawa)
神人网站:只有哈基米音乐的播放器 hachimi.world
duangsuse::Echo pinned «#statement #learn 《面向薛定谔的技术分享》 刚才有个朋友说, 咱们写个文既要 "get ur hands dirty", 又要能添加 "footprints",还tm要别人觉得易读, 那不就和玩泥坑的佩佩猪一样,成巨婴了?😒 可是…… 在读这一类仅仅是博文-而非知识库的产出时,我就能隐约感受到一层“可悲的厚壁障”了😅:好像作者已死,读者不能出于好奇或自己领域的经验提出任何问题。 这就像读博文或AI生成的完整代码时,却不能edit&rerun,甚至都不能run的起来一样,手感非常怪异。…»
duangsuse::Echo
阶段一:The Master Craftsman (工匠大师) vs. The Knowledge Curator (知识馆长)
#cs #dalao YSLib的作者(C++吧 帝球,与vczh齐名,和hex老互怼)的科普集合,非常的……
https://github.com/FrankHB/pl-docs/tree/master/zh-CN

对于咱们喜欢看title的听众,若说 jia.je 是“清华微电子17届”,在CS的整体上倾向开源硬件,那HB起码是 MIT,IU,Berkley 了…… HB比起ice1k这种只是略沾C艹的人,而且还混贴吧的,那知识量简直双倍啊😅
ps. 没说错,因为他和1k就是一个圈子的。
ps. 可是我也关注了会锐评HB的频道啊 😅

他写导论的“语气”和我比较像,不太严肃,但这个大部头,超深的ul>li>ul树,结合VSCode自带的嵌套ul逐层高亮(while e.parent:e=e.closest'ul') 😱
这种深列表风格,一时间让我有点像「自己是归并排序算法」的感觉,又像是「帝球才是真正的Lisp信徒」。

你看过帝球的docs,就完全理解为啥有人把30行的体量写成500行大算法了,但我完全被他不明觉厉吓住了,他这个广度,大概不比LLM差吧…… 24年更新,主要内容截止到22年,但我看没什么我了解的东西他没写到的😅

上面AI也说了,杰哥这种风格的人最终会“修”到什么样子,我猜,就是(知识馆长)程度的能力😒

可惜谈个main函数ABI都能写上千行的能力,要知识蒸馏,甚至只是当词典查,还真难啊。
不要轻易读pl-docs,不然就回不来了。

ps. 最近我对yin的产出和历史了解比较多,他的书也很好,除了只公开英文,7章前一百多页
https://github.com/Kuri-su/yinwang.bak/tree/master/articles
https://github.com/yinwang-wiki/site
ref:https://t.me/dsuse/21573 另一位大佬

ps. https://yinwang-wiki.github.io/site/blog/posts/2013/06/21/One语言-的设计理念.html#:~:text=把类型声明放在函数体内,不是为了显得酷,而是为了取得语义的“一致性”。这个类型声明可以是一个很复杂的表达式

呃…… 不得不谢谢这些做“名人”wiki的人了。 如果不是他们记下这些曾经开源的思想, 我都意识不到我今天的设计yin曾经尝试采用过。 不过,我不相信圆括号就是了(你猜呢 😝? 命名也非常DOM风格(类似http头那样,因为单词长,所以取得了一致性,所以实践意义上反而简单..)。

他用 Rc+typehints 替代GC的方法我也有考虑到,甚至是 (wait (par 多任务)),或许最后做不到,但至少要在ABI中体现。 窝槽,这是十年前啊。 这些笔记现在是搜不到的,所以饭圈在某种意义上也是有价值的?
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
ac.k331.one, 朱子润
难怪看这个人文章我觉得亲切,记住他了,原来是一个流派的……
点朱子润resume里的头像,你会发现wow! 🥳

为什么这么wow呢?因为他协作于 章雍哲、柯向上 (除了Agda.. 柯擅长使用 bidirectional transform 解决两个变量树的一致性)
https://josh-hs-ko.github.io/blog/0006/ 这篇挺好读的
https://x.com/i/grok/share/bHjJvTvsgL8KDNBhYIEzvemYo #ai探讨
我注意到BiGUL对一份代码,实现了 get, put 两个操作,组合函数的签名就像JQ,单向函数会validate结果(V)是否如f(S) 否则Err(adapt分支)

可是就 Reactive List 的场景而言,直接以length来"adaptive"或"skip"是很奇怪的,因为无论项是不是int,它肯定该有一个ID,然后,根据局部ID(key函数)来缓存strBiGUL的map结果就行了,就像普通的lru_cache或memo而已

push, splice 这些操作应该直接影响到id,而不是要写另外一堆“默认值”或截短的接口。另外,如果emb再复杂一点,不能是 String(Number(int)) 这样oneliner的正反函数,“魔法”抽象被击穿的代价会非常残酷,让库调用者试图理解整个 'Putback-based BX',demo里都没做到。😅


ps. 其实对于任何“PL人”之外领域的人,编译器都是随手都来么…… 这个是2010 ACM的成都#4
https://bitbucket.org/zyz915/palgol/src/master/doc/tutorial.md#markdown-header-112-indentation-rule

不过我不得不说,这和py+DSL区别也不大了…… 甚至语意上的优化不如numpy这些「准编程语言」,而且是 dsl2c++,甚至没有1:N port
但其实业界也就那样嘛…… 想起了 np.einsum() ,那才叫设计语言啊,我在国内看到实现语言工具链的都很少了,少数两三个人都是爱设计「艺术品」,中看不中用那种。

ps. 😱 grok 支持执行py代码了?
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
你看过帝球的docs,就完全理解为啥有人把30行的体量写成500行大算法了,
shunting-yard #parser #algorithm
https://www.moonbitlang.cn/pearls/shunting-yard#:~:text=可以认为%20Shunting%20Yard%20是将%20Pratt%20Parser%20中隐含在调用栈里的机制转写为显式的栈操作

其实我会这个玩意(从Lua抄的,但基于调用栈而非[].push),但我一直不知道它叫啥 Yard
不过,现在我知道它是 Dijkstra 百年前为Algol60所创,就高兴了。以后谈RPN就可以提Dij的名字了😃
另外一种是1999~2008的 https://11l-lang.org/archive/simple-top-down-parsing/ #recommended

ps. lparser.c#subexpr 使用的是TDOP(aka Pratt),但输出的结构不是树或SExp,它是一个树状的RPN数组,所以我说两者是一样的,就在上上条消息里。
如果在TDOP里不使用return,我们很容易发现Pratt是把栈结构藏在call里工作。 但如果一定要考据癖的话,那就是递归下降 op precedence 算法先进Dij老大40年

不过,现在某些大学里还在教「左递归」和LL1么…… 考据癖可能都做不到。

所谓选择大于努力, 在我看来Moonbit张写上条消息的算法也是可以500行的,比另一个Earley算法(一个经典的CFG解析器)短点。
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
shunting-yard #parser #algorithm https://www.moonbitlang.cn/pearls/shunting-yard#:~:text=可以认为%20Shunting%20Yard%20是将%20Pratt%20Parser%20中隐含在调用栈里的机制转写为显式的栈操作 其实我会这个玩意(从Lua抄的,但基于调用栈而非[].push),但我一直不知道它叫啥 Yard 不过,现在我知道它是 Dijkstra 百年前为Algol60所创,就高兴了。以后谈RPN就可以提Dij的名字了😃
#plt #java #learn 张宏波系列
这个教程整体不错,但还是太刻板了,尤其是在这里比较数学上一个不相干的概念…… 为什么不说数学的“参数式函数” “隐函数”和python里有啥区别呢?
https://github.com/moonbitlang/contest-2025-data/blob/main/compiler-crash-course/05_closure.md#:~:text=原本对于一个函数是开放(open)的变量(也就是自由变量),%20被关闭(close)到了一个指定的变量作用域中,%20得到了一个“关闭的表达式”(closed%20expression)。%20这个名字再之后被缩短,就变成了和数学概念重名


“可露稀closure” 其实是对单方法对象(SAM) 的内存优化,其实现方法为“捕获capture”,就是把栈上字节copy到new结构里去,结构就叫闭包。

张强调的一点很对,就是libc提供了 signal(id, fn, arg0) 这种“KV注册”接口,但只传入fn也是可以的。 传入vtable+this 双指针(fat pointer)也是可以的,C.ABI.函数指针 能无缝衔接对象参数,要不然C++怎么那么轻松就火起来了。

闭包与纯粹的 (new Callable(nonlocal变量,)) .call() 区别在于,如果在frame返回前销毁,就不需要堆分配了,所以说它不是一个「语意上存在的特性」,只是new class{}对象的语法糖+inline优化。 这点和同样用“捕获”创建的协程(闭包链表Thenable),完全不同😒

nonlocal有很多名字,cellvar .py.rs, Upvalue.lua, LexicalScope ,但本质上,它和 class var 一样可写,因此在 |mut acc|{} capture 里,它会逼得外层函数也变成 new class {call(...){}} ,除非依赖 IntRef(0)这种autoboxing,即修正 "effective final" 错误。
当然这种错误真正的解法就是从OOP过程式-> Compose。 IntRef是不是和 let [get,set]=useHook(0) 的逻辑式变量很像?
Moonbit 的实现没有在DOM上,就不只是在set时更新一下 derived vars. dirty...

至于文顶的“自由变量”一般就是this变量或全局。 之所以自由,是因为暴露在API里不能随便“alpha-重命名”,相对于“绑定变量”来讲。 这一行谈纯理论,我说的不难受,但我猜读的人和我当时一样百思不得其解,什么栏目答演算。🤯

invokedynamic/LambdaMetafactory 其实就是这个“不逃逸优化”,没被存储到字段、传到其他线程、返回出去,零拷贝。 Serialization 的问题由JDK大佬 Brian Goetz @2014 PPT讲解过:
https://wiki.jvmlangsummit.com/images/7/7b/Goetz-jvmls-lambda.pdf#page=18
https://www.infoq.cn/article/brian_goetz_project_lambda_from_the_inside_interview#:~:text=你很难决定是否支持捕获可变局部变量、非局部控制流、异常透明度和其他的特性,并且放弃其中一些特性意味着它们很难自然地表达。

Goetz这个说的道理。这不比莫名其妙扯到数学的科班好了? fyi. #Kotlin 支持它们全部
#ai锐评 https://x.com/i/grok/share/UEs8sZtds1l1XxWqwWUFijyIj
再谈「指针vs对象表示」问题😒
其实这些,都是从解释器到cpu的优化,或者说是试图把 [1,2,3].[0~1]=> ptr+len, Animal{Duck;Cat}=>type+data 编码为x86能计算或跳过的字节,避免「中间商赚差价」(LLVM 就不是中间商了, hh
我们操作的是变量树,指针和堆栈并非「语意上存在的特性」,所以cpy它丫的 sizeof(一个int)==28 😓……
当然,这些VM数据结构的心智开销很小,感兴趣的可放心阅读。

C++-style lambdas 张宏波系列 https://thephd.dev/the-cost-of-a-closure-in-c-c2y
模仿 esm.run,git 的“一切皆文本”编程语言: scrapscript.org
GC/Rc 的最终 https://x.com/i/grok/share/ULJQCSOhg56OCZiY84f29lPZO
Please open Telegram to view this post
VIEW IN TELEGRAM
https://jsbin.com/yosixu/edit?output #ai #vibe Graphviz
https://jsbin.com/nofepom/edit?html,output 最终发现失败了,AI没有做成功双向编辑😅

grok3搞了3遍…… 回头加个漫画风和AST可视化。
#statement
事实证明,如果AI第一遍没写对,而且不是版本号这些小问题; 后来你调试会花600%的时间…… vibe 可不是针对大模块的

而且,grok3的webUI基本上一点点模块化都没有…… 我思量着ipywidget那种级别的demo可以让它帮忙,但有缝合代码的需求就还是算了。API矿工都挺勉强,它太难调教

😅 修了半天也没把两个API缝合好,动不动就错,还不报错
#除错路线 d3-graphviz+拖拽更新DOT节点文本
- ai提供版本号和大小写错误的js -轻松
- drag事件座标计算错、state变量问题。现在依然有玄学的座标偏差问题(多次拖放)
- roughJS的各路API不稳定造成AI幻觉问题

d3的报错没有提示是renderDot()和sketch()共享一个id容器,大部分时间浪费在排除法和http请求、鼠标路径上

最不爽:AI经常调用不存在或已经失效的API(“最后一公里”问题)、jsbin的三栏界面太窄(F12很燥人)
AI直接处理大段代码会写丢功能、AI的代码基本没有函数化 导致无法扩展/插拔(代码裁缝还不好当..)

#awesome
https://observablehq.com/@magjac/demo-of-d3-graphviz-animations
https://github.com/magjac/graphviz-visual-editor 原作者写的编辑器(UI很差。。)
https://codesandbox.io/examples/package/d3-graphviz #tool npm的demo搜索

https://edotor.net/
http://www.webgraphviz.com/
https://stamm-wilbrandt.de/GraphvizFiddle/ ps. 这人也是个跑马拉松的( German Ultramarathon Association )
http://www.ryandesign.com/canviz/ 巨多示例
https://sketchviz.com/about 这个不是作为示例库,而是抄了RoughJS和字体

#draft
设计一种.jsdot 脑图,更加简洁(如 let { -a b; -b c 'c1' }),可以嵌入S-表达式和js ,可以ppt动画

dot=({fruit,salad, 香蕉,番茄}, ln)=>{
fruit(香蕉)
salad([香蕉,番茄, fruit], {port:'r2l'})
}
ln(attr_arrow?, Node, _1nNode?)
ln(attr?, _1nNode)
ln(_) 绑定首参数,返回Node函数。 ln(..)() 创建或获取"node[attr]"的 $ed 编辑器选区
所有Node可为"str",自动获取或创建。(_1nNode)意为1或N个项
ln.ALL可过滤全部节点, ln.F5创建动画帧,总结:

ln(...DSL) 可以是以下任意形式:

ln(A, B, attr0) → A → B
ln(A, [B,C], attr0) → A → B, A → C
ln([A,B], C) → #wontfix
ln(A)(B)(C) → #wontfix, try [A,B,C].reduce(ln)
ln.graph({...}) → 图属性
ln.let(name) → 创建子图
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
接下来又双是暴论时间了。我希望这是我最后一篇讲单线多任务的po,不区分pyjskt等卡线程or单线多路IO实现
#ai探讨 https://x.com/i/grok/share/O3cKyQzTDrHBLaUbm34UadxDL
#对比 https://chat.librechat.ai/share/ziJek8UdHRdq7AuKQNHoQ
😅😅 完了,我被AI取代了 😅😅

有时候,果然还是非专业的Thinking模型好用啊…… 没有思维定势
与他的比喻相比,我写这些给中级开发者看,又算什么!

“ 异步,是程序自己主动把慢活儿安排给别人干,
异步就是:别傻等,让别人去干慢活儿,干完了再通知我。
异步不是让程序变快了,而是让“等待的时间”不再浪费!😅
同步:你等5秒,啥也干不了 → 浪费5秒
异步:你等5秒,但这5秒你可以接待100个顾客 → 时间被充分利用了
最后回到那句“异步的最小单位是任务对象”翻译成大白话就是:
一张“干完这事后记得叫我”的小纸条。
这张纸条可以传、可以组合、可以排队、可以取消……
所有高级玩意儿,都是在玩这张纸条的花样。

阻塞 = “我不干完,你全家都不准干”
而所有异步技术,核心就两样东西 : 一张“待办小纸条”(Promise / Future / Task) + 一个“闹钟大管家”(事件循环 / 运行时)

全世界99.9%的异步花里胡哨,都是在这两样东西上玩花样。
你会发现:sleep 5的 real ≈ 5秒,但 user 和 sys 都几乎是0!结论:异步的 sleep 根本不占你的CPU!
它只是跟操作系统说:“5秒后叫醒我”,然后你的程序就去干别的事了。


#tool 很好的client WebUI
TypingMind (付费、Team,UI繁多)
🔗 https://typingmind.com

LibreChat (全开源,可分享链接,可自托管,UI简洁)
🔗 https://librechat.ai
🧑‍💻 GitHub: https://github.com/danny-avila/LibreChat

LobeChat (现代开源,UI最美)
🔗 https://lobe.chat
🧑‍💻 GitHub: https://github.com/lobehub/lobe-chat
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
想知道没有相关知识的小白问AI会有什么结果可以看看:
grok3: 同步阻塞的本质 = 把“等待”当成了“工作”,时间被偷走还不自知。

你看,是不是每一句话都能在项目里找到真实案例?
哪个陷阱戳中你了?来,我给你递纸巾擦眼泪~

😅😅 #learn
Please open Telegram to view this post
VIEW IN TELEGRAM