Please open Telegram to view this post
VIEW IN TELEGRAM
xuanwo.io
httpbin 介绍
Achieving Data Freedom Through Open Source and Rust
#js #dalao #tw https://www.cythilya.tw/2018/10/11/types/
#web CF Serverless 和 bencoding 序列化简单demo: https://x.com/i/grok?conversation=1981638452027482299
#经验散 https://gist.github.com/duangsuse/559632fbc6d5619a1cf11bc50354a61e
OG 分享图编辑: https://opengraphexamples.com/examples/tags/website-development/
- 可在 https://tiiny.host/manage 或 pagedrop.io 试验效果
1024程序员节快乐!🦎
#web CF Serverless 和 bencoding 序列化简单demo: https://x.com/i/grok?conversation=1981638452027482299
#经验散 https://gist.github.com/duangsuse/559632fbc6d5619a1cf11bc50354a61e
OG 分享图编辑: https://opengraphexamples.com/examples/tags/website-development/
- 可在 https://tiiny.host/manage 或 pagedrop.io 试验效果
1024程序员节快乐!
Please open Telegram to view this post
VIEW IN TELEGRAM
Summer。桑莫。夏天
你懂 JavaScript 嗎?#4 型別(Types) | Summer。桑莫。夏天
本文主要會談到 (1) 何謂「型別」?內建型別有哪些?常見疑難雜症與解法;(2) 未定義(undefined)vs 未宣告(undeclared)。
Please open Telegram to view this post
VIEW IN TELEGRAM
www.thiings.co
Samoyed Dog | Thiings Collection
Download the free 3D icon. The Samoyed is a fluffy, white, medium-to-large dog breed known for its friendly temperament, smiling expression, and thick double coat. Originally bred to herd reindeer and pull sleds in Siberia, Samoyeds are now popular as affectionate…
❤1
#rust #wasm #os https://share.google/aimode/Tngzv83rUcpir6kup
据说,WASM只能在浏览器上运行libc生态的代码,不能真正取代native🤔
(C memory model 其实是Linux基于mmap()的分段block模型,但AI也说了这不相干。
我想问的其实是,如果模块没有使用unsafe,并且由可信CI编译, array boundary, union tag 这些检查能不能在编译期消除
但是AI还是非常人机的说不能,它以为我在问.wat 格式运行时的限制…… 我是说进一步开发)
#blog
https://ianjk.com/webassembly-vs-javascript
https://nickb.dev/blog/the-webassembly-value-proposition-is-write-once-not-performance/
据说,WASM只能在浏览器上运行libc生态的代码,不能真正取代native
(C memory model 其实是Linux基于mmap()的分段block模型,但AI也说了这不相干。
我想问的其实是,如果模块没有使用unsafe,并且由可信CI编译, array boundary, union tag 这些检查能不能在编译期消除
但是AI还是非常人机的说不能,它以为我在问.wat 格式运行时的限制…… 我是说进一步开发)
#blog
https://ianjk.com/webassembly-vs-javascript
https://nickb.dev/blog/the-webassembly-value-proposition-is-write-once-not-performance/
Please open Telegram to view this post
VIEW IN TELEGRAM
www.google.com
针对safe Rust输出的wasm代码,也做不到和C(没有内联汇编)一样的性能吗?
wasm 与x86相比理论上的性能瓶颈
#security #web
https://www.evacoder.com/2019/02/15/iframe_security/#more
https://x.com/i/grok?conversation=1984808395300618491
https://www.evacoder.com/2019/02/15/iframe_security/#more
https://x.com/i/grok?conversation=1984808395300618491
Eva's Blog
「 安全 」从iframe说到万物皆可hook
需求今天遇到有业务要求我们的登录页允许被嵌在 iframe 中以满足导流需求,找安全的大佬们讨论了下,最后给出的结论是: 如果业务方的代码写的挫了点,有 xss 漏洞的话,坏人完全可以把你本来的 iframe 隐藏掉,自己写个弹框出来,这样的话用户完全无感知地被篡改了,直接输入用户名和密码,信息就被上送到了坏人的服务器。 what?还能这样吗? 那得写多少代码才能覆盖掉弹窗再伪造一个出来啊!
Llever
介绍 - Rust 和 WebAssembly
立即开始学习如何一起使用 Rust 和 WebAssembly.
#post 想看中文mdBook不容易 (#rust by #wasm Example )
是啊🤭 !我觉得这俩SDK搭配一起学很合适,尤其因为真正的C++程序员不多。而 Web APIs 的话,小白也有共同语言呢
https://wasm-bindgen.github.io/wasm-bindgen/
但我对新资料喜欢的很。坏处是,目前这本书没有翻译(https://llever.com/rustwasm-book/ 不算)。
想让便宜AI(DS3.1,kimi-k2 什么的)帮我弄一下,结果找到的“小”工具,各种震惊我爷一整年的复杂度or莫名其妙的坑……
最后我还是使用 WebUI翻译器 + (pip install flat-tree, 这是grok的一个幻觉😒 :可实现
不过……这也有坑。 .md 翻译Agent我不相信没人做,可各种不兼容和为省钱出的bug……🤪
格式化文本的翻译…… 其实就是把内嵌代码拆分合并下,预制一下术语表。聪明点,只用和tg的 text+tag format 一样拆,再设定 :is(code,a) 不翻译就够了。
插入 %% 匹配位置和长度不行吗? AI还是能把
https://github.com/telegramdesktop/tdesktop/issues/5795#issuecomment-612471703
——AI解读tg markup https://x.com/i/grok/share/bFv4gWxreN5s4OYds3e69UNh4
我竟然都找不到这种实现?!
求AI帮它门保持md语法,而自己却做“行缓存”,那要"Agent"干什么??
难道.html DOM 心智模型有这么晦涩吗,需要差别对待短代码vs代码段?
#failed
# MS家的各种报错没F12可调试
# 总报错Provider阻止 https://github.com/smikitky/chatgpt-md-translator
# 只支持DS https://crates.io/crates/mdbook-translator/0.1.0
# 只单文件 https://tools.newzone.top/en/md-translator
是啊
https://wasm-bindgen.github.io/wasm-bindgen/
先说说availability吧
WASI,它之于std::*,就像linux基础框架之于libc。WA的线程ABI都还没确定(这也是涉及fs,shm,stdio咋缓冲,甚至需不需要进程和argv? 的容器化革新)。
即使过几年,有稳定的IoContext接口了,WA也只适合高频func和二进制读写。甚至,我不确定后者还能卡js的脖子几年。
算法和并行的话前有WebGL2 WebGPU,后有native numpy,高并发又不适合WASM,比较鸡肋。 Rust可以说是以后WA原生的主力了
—— #AI锐评 本段 https://x.com/i/grok/share/OZlvWyOJwE3RWlpngMKrYLmGe
但我对新资料喜欢的很。坏处是,目前这本书没有翻译(https://llever.com/rustwasm-book/ 不算)。
想让便宜AI(DS3.1,kimi-k2 什么的)帮我弄一下,结果找到的“小”工具,各种震惊我爷一整年的复杂度or莫名其妙的坑……
最后我还是使用 WebUI翻译器 + (pip install flat-tree, 这是grok的一个幻觉
a/b.md <=> a__b.md 互操作) 了……UI: https://github.com/ruanyf/weekly/issues/7446 ,在这里只需要设定下 CustomLLM=https://openrouter.ai/api/v1/chat/completions ,token
model=moonshotai/kimi-k2-0905,UserPrompt=${content}, 然后关闭翻译缓存! 即可
#SystemPrompt
你是一个顶级的翻译引擎和语言专家。你的任务是提供专业、精准、且忠于原文的翻译或内容改写。
请将用户提供的文本内容,根据指示翻译或改写成中文,需要严格保持原有技术内容的意义、语气和语境。
完全保留原始内容的格式,包括但不限于段落、链接文字、代码块、Markdown 标记等。
不过……这也有坑。 .md 翻译Agent我不相信没人做,可各种不兼容和为省钱出的bug……
格式化文本的翻译…… 其实就是把内嵌代码拆分合并下,预制一下术语表。聪明点,只用和tg的 text+tag format 一样拆,再设定 :is(code,a) 不翻译就够了。
插入 %% 匹配位置和长度不行吗? AI还是能把
hi **bold** [world] 正确排序为 hi %bold% %world% 的,其中文本也能缓存,比如:loads=(s, ...tag)=>(i=>s.replace(/%/g, m=>(i++, tag[(i-1)/2>>0])) )(0)
loads('hello %gg%, %world% !', '*','_',)
https://github.com/telegramdesktop/tdesktop/issues/5795#issuecomment-612471703
——AI解读tg markup https://x.com/i/grok/share/bFv4gWxreN5s4OYds3e69UNh4
我竟然都找不到这种实现?!
求AI帮它门保持md语法,而自己却做“行缓存”,那要"Agent"干什么??
难道.html DOM 心智模型有这么晦涩吗,需要差别对待短代码vs代码段?
#failed
# MS家的各种报错没F12可调试
docker run --rm -it --env-file .env -v "${PWD}:/work" ghcr.io/azure/co-op-translator:latest -md -l "zh"# 总报错Provider阻止 https://github.com/smikitky/chatgpt-md-translator
# 只支持DS https://crates.io/crates/mdbook-translator/0.1.0
# 只单文件 https://tools.newzone.top/en/md-translator
#bash 牛! https://x.com/i/grok/share/Q7VnKtuR45Ti2t3DFIJWppqNT
wc <<<hi
echo "hi" &> >(wc)
#tool
https://x.com/i/grok/share/skxv5PCsPXGA5H5RLFA0kLtjF
shopt -s globstar
tree2globs() { local s="$1" d="$2" f;
[ "$3" = "==" ] && { s="$2" d="$1"; } # a__b -> a/b
for f in "$s"/**/*; do
[ -d "$f" ] && { sed "s/[^\/]//g;s/./ /g;s/$/$(basename "$f")/" <<<"$f"; continue; }
u="${f#$s/}" #prefix
[ "$3" = "==" ] && {
install -D -- "$f" "$d/${u//__/\/}"
} ||
install -D -- "$f" "$d/${u//\//__}"
done;
}
Please open Telegram to view this post
VIEW IN TELEGRAM
Please open Telegram to view this post
VIEW IN TELEGRAM
X (formerly Twitter)
Paidax (@xin_pai88825) on X
“为了防止被小米的文字忽悠到,我的朋友做了个显微镜插件”
#life #ai https://x.com/imxiaohu/status/1985174703976435861
如果你有钱,而他们想要你的钱,
你比自己以为的更有谈判筹码。
账单不是圣旨。要敢于抗争。
但要带着知识去抗争。😒
我每月 20 美元订阅 Claude,
这笔钱赚得值。🤭
是的,AI 有时会幻觉、胡说八道。
所以我没有盲信。我亲自查证 Claude 的发现,结果它是对的。
我还订阅了 ChatGPT 一个月,
让它帮我审查信件内容、检查事实。
结果它一字未改。完美。
医院想把这笔钱“算进慈善减免”,
因为那样可以维持他们的免税地位。
说白了,就是做做样子。
如果“虚假的账单”是为了支撑“虚假的慈善”,
那整个系统就是虚伪的。
----------
在 Claude 的帮助下,我写了一封信,
详细指出他们的违规计费,
并威胁要采取法律行动。
信中我故意埋下 舆论、公关、合规 的陷阱,
然后问他们:“你们觉得什么是公平的?”
我明确告诉他们:
我们不是来申请慈善的,
我们是在谈价格。
而且你们被抓了个现行——
无论在法庭上还是舆论上,你们都站不住脚。
别发出自己不敢兑现的威胁。
我们敢。
结果,这招管用。
他们回信,说愿意降到 3.7 万美元。
----------
我把谈判结果告诉嫂子,建议我们再压一点。
她担心被催债,问我为什么不直接接受对方报价。
我说:
“因为那四千美元是你自己的钱——
他们不该拿走。”
于是我们折中,提出 3.3 万美元。
医院接受了。
这就是我从整个经历里学到的东西。
如果你有钱,而他们想要你的钱,
你比自己以为的更有谈判筹码。
账单不是圣旨。要敢于抗争。
但要带着知识去抗争。
我每月 20 美元订阅 Claude,
这笔钱赚得值。
是的,AI 有时会幻觉、胡说八道。
所以我没有盲信。我亲自查证 Claude 的发现,结果它是对的。
我还订阅了 ChatGPT 一个月,
让它帮我审查信件内容、检查事实。
结果它一字未改。完美。
Please open Telegram to view this post
VIEW IN TELEGRAM
X (formerly Twitter)
小互 (@imxiaohu) on X
4 小时 ICU 抢救,人没有抢救过来
却收到了19.5万美元的账单
最后通过 AI帮助 把账单降到了 3.3万美元 ...
一位美国网友分享了他的经历:
下面是整个过程翻译:
我姐夫在六月去世了,心脏病发作。住院四个小时后就走了。
然后账单开始接踵而至。
他在两个月前刚保险失效了 。
却收到了19.5万美元的账单
最后通过 AI帮助 把账单降到了 3.3万美元 ...
一位美国网友分享了他的经历:
下面是整个过程翻译:
我姐夫在六月去世了,心脏病发作。住院四个小时后就走了。
然后账单开始接踵而至。
他在两个月前刚保险失效了 。
duangsuse::Echo
#learn #math Fourier Transform 的输入必须是2,3维向量:可以用于简化 svg path ✏️ FT是把yMax个频 的sin(cos,基频), 逐y与波形加权求差(np .dot),得到"左右对称"的直方图 (频谱图里纵向的1px 线) (FFT以此优化. 直方含有"相位",默认为wav+0j,也能被vocoder推出来) def DFT(x): N = len(x) t = np.arange(N) pi = -2j*np.pi * t.reshape((N…
hexo.limour.top
【探索】利用后缀表达式解方程 - Limour's Blog
这段Python代码实现了使用后缀表达式解方程的功能。它包括了一个栈类(Stack)和一个多项式类(Polynomial)。通过中缀表达式转后缀表达式的方式处理方程,最终实现了解一元一次方程的功能。代码包含了多个方法,如多项式的加法、减法、乘法、除法等操作。在解方程时,它先进行表达式的简化和转换,然后输出方程的解或者判断方程是否是一元一次方程。
我一直以为 #AI 的水平是不错的。因此,偶尔遇到「不好懂」的问题,甚至是自己的灵感自己做不出来时,都会去grok/gemini一下,它一般能在细化追问后让我明悟
比如,今天我回顾 #math #algorithm FFT,我想起了一个质疑:FFT和cos,sin有关,为什么能用于整数乘法?🤯
grok3:
换句话说,10进制(10e1~~个十百千万) vs cossin(vec2)频谱本质上是一样的,都是“[钢琴键×响度,].sum()” 的形式😒 ,因此有 NTT 这个玩法。
#blog https://hexo.limour.top/Solving-equations-using-postfix-notation 把逆波兰写那么丑么…… 还是要学递归啊。 原文就在这医学生的博客里 #dalao
https://github.com/Limour-dev/qrjs #tool 无网络靠二维码传文件
比如,今天我回顾 #math #algorithm FFT,我想起了一个质疑:FFT和cos,sin有关,为什么能用于整数乘法?
grok3:
13 → [3, 1] (个位 3,十位 1)
21 → [1, 2] (个位 1,十位 2)
结果 = [3×1, 3×2 + 1×1, 1×2] = [3, 7, 2]
→ 解释: 3×1=3……(个位、十位、百位并行处理,即“卷”积)
→ 273 ✓
(e^{iθ} = cosθ + i·sinθ) 复数次数只是等价变换的工具,卷积定理 + 频域点乘 这个数学魔法才是优化技巧(中间虽然用了 cos、sin 和复数,但数学上等价)
import numpy as np
a = [3, 1, 0, 0]
b = [1, 2, 0, 0]
c = np.fft.ifft(np.fft.fft(a) * np.fft.fft(b)).real
print(np.round(c).astype(int)[:3]) # [3 7 2]
换句话说,10进制(10e1~~个十百千万) vs cossin(vec2)频谱本质上是一样的,都是“[钢琴键×响度,].sum()” 的形式
#blog https://hexo.limour.top/Solving-equations-using-postfix-notation 把逆波兰写那么丑么…… 还是要学递归啊。 原文就在这医学生的博客里 #dalao
https://github.com/Limour-dev/qrjs #tool 无网络靠二维码传文件
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
#security #web https://www.evacoder.com/2019/02/15/iframe_security/#more https://x.com/i/grok?conversation=1984808395300618491
#security CSP沙盒(tool)居然不是默认的? 任何一个富文本也可能导致 js/html 注入😒
这比C的 buffer[N] as code 牛逼多了😅 确如 yinwang.org 所说,把代码加个引号就当成数据、参数、用户输入,还在test出问题时"escape",怎么想的。 一开始就该用代码模板(ES6``)嘛
libc侧的RCE至少还能用 noexec/-fPIE 防一下,栈溢想利用就需要libc.so的地址,js呢,都是字符串……
CSP沙盒其实已经能弥补跨源访问的限权问题了。
https://x.com/i/grok/share/GUx6ecaPUw74qofZcJsdkGAfW
https://x.com/i/grok/share/Lsd5JIEsDhS6viLWEwtVpvRv1
PHP实践:
https://x.com/i/grok/share/ofPQ4RCdQHOfN1PznpzRKepxc😅 CF竟然不支持 strict-dynamic SRI,还被开源社区打脸
https://x.com/i/grok?conversation=1986619246538072327 unsafe-inline
#linux https://x.com/i/grok/share/CPvgiMgM7i6i2dMScVN5QfyJX
#statement https://x.com/i/grok/share/J2cYWmSk7CbtOdS8D9WpBswat
https://forum.butian.net/share/2288
好吧,可能这就是设计者vs堆砌者思路的差异了。 是根本性上的。😒
这比C的 buffer[N] as code 牛逼多了
libc侧的RCE至少还能用 noexec/-fPIE 防一下,栈溢想利用就需要libc.so的地址,js呢,都是字符串……
CSP沙盒其实已经能弥补跨源访问的限权问题了。
https://x.com/i/grok/share/GUx6ecaPUw74qofZcJsdkGAfW
https://x.com/i/grok/share/Lsd5JIEsDhS6viLWEwtVpvRv1
PHP实践:
https://x.com/i/grok/share/ofPQ4RCdQHOfN1PznpzRKepxc
https://x.com/i/grok?conversation=1986619246538072327 unsafe-inline
系统内核(syscall)的本质不是沙盒或sched,是区分接口授权, CSP的初心也不是禁止origin,是记录正常用户的行为清单与界限
#linux https://x.com/i/grok/share/CPvgiMgM7i6i2dMScVN5QfyJX
提问: syscall基本被libc封完了,以最小权限原则,linux完全没必要接受libc.so以外地址段的caller,除非对 gcc -static。 为何要允许c语言的抽象被击穿呢?
#statement https://x.com/i/grok/share/J2cYWmSk7CbtOdS8D9WpBswat
https://forum.butian.net/share/2288
程序员没有对用户输入的感知能力,写不了健壮的代码, 这些沙盒手段都只是亡羊补牢, 尤其是sanitize本质上只是对ES6模板字符串的侧面弥补。
再比如,PHP,Pickle, FastJson, yaml 都因为能暴露type构造器而出现RCE。 这种漏洞也是能写出来的?
正常来讲,typed deserialize 是需要标明的,甚至是需要instanceof限制子类的,而不是默认。
好吧,可能这就是设计者vs堆砌者思路的差异了。 是根本性上的。
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
Java codegen 都没写过是怎么敢设计这种协议范式的? 不对,看他们 content-type 都要改成 vnd.XX.User+json 我就觉得这是 #ts 写上瘾了。 知不知道 fetch() 不能自动判定body类型
https://share.google/aimode/H5Xh1f2JR18pcKJJm #web
说到了escape的问题
我觉得http动词的设计也是有问题的,其实只需要 get put post 三个(但不是说定义GET,方便地址栏访问or拼接url.query就行了的.. 那是一种可选别名😃 )
patch 完全就是扯淡,put已经有了按key更新的语意,而把 post(rpc call)泛化一下,就是按初始值 or key 设定用户/文章等对象的意思
有些spec规范的设计越多,它的表意反而越少。 less is more.
不过这样 REST boys 就不能推广他那套 jsonHttp/RPC -> 按options自动判write权限的“跨端跨站ORM” 了? 哈哈。🤪
说到了escape的问题
我觉得http动词的设计也是有问题的,其实只需要 get put post 三个(但不是说定义GET,方便地址栏访问or拼接url.query就行了的.. 那是一种可选别名
patch 完全就是扯淡,put已经有了按key更新的语意,而把 post(rpc call)泛化一下,就是按初始值 or key 设定用户/文章等对象的意思
有些spec规范的设计越多,它的表意反而越少。 less is more.
不过这样 REST boys 就不能推广他那套 jsonHttp/RPC -> 按options自动判write权限的“跨端跨站ORM” 了? 哈哈。
Please open Telegram to view this post
VIEW IN TELEGRAM
www.google.com
🔎 HTTP里app实际有使用的method,以及全部的 - Google Search
duangsuse::Echo
> Jonathan Blow 自己开发给自己游戏开发用的编程语言,在笔记本上每秒可以编译50万行代码。而且是全新编译,没有中间缓存,没有增量编译。
> 编写高效的程序不需要你是天才。这并不需要什么魔法。只是不要在现在的臃肿不堪的工具链上去构建就行。
> 编写高效的程序不需要你是天才。这并不需要什么魔法。只是不要在现在的臃肿不堪的工具链上去构建就行。
Gcores
阻止文明倒塌:JonathanBlow在莫斯科DevGAMM上的演讲 | 机核 GCORES
PreventingtheCollapsingofCivilization
#design 软件幻灭 后续
😃 给tg团队 t.me 隔离设计的技术栈打个心~
这里 Blow 给出了他对于“软件明显在蓬勃发展”之直观感受的解释:软件正在享受硬件能力提升的红利,它只是“看上去”蓬勃发展而已。
Blow 的要点是:软件正在倒退,而人类,空前依赖软件。尽管,这和我们置身其中的用户的观感是相反的。波音飞机掉下来的主要原因,就是软件问题(没有针对极端工况测试)。文明衰退的速度如果很慢,我们能意识到这个衰退么?
机器学习是最明显的例子。一方面,它在二十年前不能存在主要是因为GPU性能无法支持而已。比如,我们使用软件给自己AI换脸成明星的样子,或者配上打赏挂饰,这个有趣的部分,只占那些app极小极小的部分,而UIUX的部分非常简单,另外的极重要部分却又极度复杂,包括把你的脸加载到屏幕上,以及处理你的点击,等等。
这就是科技退步的原因。代际之间的交流和传承,需要巨大的努力,这过程中有损失。
——如果代际的传承失败,文明就灭亡。
Blow 从正面描述了软件的结构:抽象层次的序列。机器语言、汇编语言、Fortran/C/C++、C#/Haskell/Javascript……在这个序列里,绝大多数工程师在最高抽象层次进行工作,因为这是“聪明、省力、高效率的”。
在这个抽象从低到高的序列里的某些位置,问题就出在这里。
Blow 认为,全行业的高抽象层次工作,多数人的“高效率”的另一面,是失去(或者从未拥有过)能力。
考虑 Facebook 作为一个软件的功能增加,和它要多雇佣的成千上万的工程师,二者相除得到的平均每人的价值创造是趋近于零的!这和“抽象层次越高,效率越高”明显矛盾。
“我们已经不指望软件能长期稳定工作了。”
“大家都充分认识到复杂之荒谬,简单之美——简化可以让事情变得更好。”
“程序员们忙着把简单事情复杂化的同时…… 电脑游戏却变得连最基本的事情都很难实现了。”
——https://www.gcores.com/articles/110509
这里 Blow 给出了他对于“软件明显在蓬勃发展”之直观感受的解释:软件正在享受硬件能力提升的红利,它只是“看上去”蓬勃发展而已。
Blow 的要点是:软件正在倒退,而人类,空前依赖软件。尽管,这和我们置身其中的用户的观感是相反的。波音飞机掉下来的主要原因,就是软件问题(没有针对极端工况测试)。文明衰退的速度如果很慢,我们能意识到这个衰退么?
机器学习是最明显的例子。一方面,它在二十年前不能存在主要是因为GPU性能无法支持而已。比如,我们使用软件给自己AI换脸成明星的样子,或者配上打赏挂饰,这个有趣的部分,只占那些app极小极小的部分,而UIUX的部分非常简单,另外的极重要部分却又极度复杂,包括把你的脸加载到屏幕上,以及处理你的点击,等等。
电脑上一切软件都经常 bug,以至于用户对于一切软件“重启试试”成为不假思索的操作?!包括 Emacs 的问题、Visual Studio 不能处理最最简单的指令,只能连续报错,微软 Word 的字符换行 bug 二十年后仍然没有消灭,像幽灵一样此起彼伏;于是他为了缓解自己的愤怒想打游戏,打开 Epic Store 和 Steam 又连续遇到 bug……
Blow 从游戏图形计算的角度给出了一些“最最基本的,但你不能直接做的事情”,其中一个好懂的例子是,把一个程序拷贝到另一个设备(就像C++深拷贝一样,安装并不是单纯的复制文件内容)
安装程序不是为了对接 CPU,而仅仅是为了解决操作系统层面不可思议之多的兼容问题,其绝大部分是我们不想打交道的。你不能直接编写一个独立程序进行编译和容器化的 linking。而微软为了能让人这么做,专门设计了一个 vswhere 的软件。
这些库/服务本身可能是在变化的、并且没有被中心化地存储和管理,这样一来我们就陷入了无穷无尽的debug的、重启服务的、互相同步的……我们自身所不能掌握的问题海洋之中。
现在,大家竟然在积极主动建设着这样一个SDK!程序员们忙着把简单事情复杂化的同时……
电脑游戏却变得连最基本的事情都很难实现了。
“第一代 TTL(逻辑门电路)是那帮胡子花白的老头子做的,他们知道其中的道理;现在的工程师都是毛头小子,学校毕业过来搞生产,他们不知道内部组装的改变,会会产生磁场,而磁场变化的相互干扰,没有被设计者纳入考虑,因为他们不理解。
这就是科技退步的原因。代际之间的交流和传承,需要巨大的努力,这过程中有损失。
——如果代际的传承失败,文明就灭亡。
Blow 从正面描述了软件的结构:抽象层次的序列。机器语言、汇编语言、Fortran/C/C++、C#/Haskell/Javascript……在这个序列里,绝大多数工程师在最高抽象层次进行工作,因为这是“聪明、省力、高效率的”。
在这个抽象从低到高的序列里的某些位置,问题就出在这里。
Blow 认为,全行业的高抽象层次工作,多数人的“高效率”的另一面,是失去(或者从未拥有过)能力。
考虑 Facebook 作为一个软件的功能增加,和它要多雇佣的成千上万的工程师,二者相除得到的平均每人的价值创造是趋近于零的!这和“抽象层次越高,效率越高”明显矛盾。
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
现代editor的输入延迟远输于42年前开发的Emacs。还有比编辑器更简单的功能吗?每敲击一次键盘,你所需要做的仅仅是更新一个小小的方形区域
#js 嗯…… 我现在就在PoC一个比 Prismjs.com,CodeMirror,Monaco(VSCode) 更正确的span高亮方法,基于2021之后的DOM
PGO得出的结果是,即便不考虑HTML parse开销,Range API 也比堆叠<span.高亮类型>好😒 , #code 见下
https://x.com/i/grok/share/6EUWYNSsyq7Ixk6BvdVoFdxV3
https://x.com/i/grok/share/vwCog17kkAn4lD58VEDgjxgrF
让Blink去计算 contain: paint ,显然是比JS background-clip:text+canvas Worker 绘制彩色矩形要好了(我也在gh上PoC过),而且百行代码即可😄
我对这个实现很乐观,虽然它明显比 span[ContentEditable] 要考虑更多区间更新的问题,但结合js侧配套的增量compiler,或许以wbr分词的 new Range(#text) 也是能自动延展的?
希望以后能自己创建相关的工具链。😃
#draft #vibe
PGO得出的结果是,即便不考虑HTML parse开销,Range API 也比堆叠<span.高亮类型>好
https://x.com/i/grok/share/6EUWYNSsyq7Ixk6BvdVoFdxV3
https://x.com/i/grok/share/vwCog17kkAn4lD58VEDgjxgrF
让Blink去计算 contain: paint ,显然是比JS background-clip:text+canvas Worker 绘制彩色矩形要好了(我也在gh上PoC过),而且百行代码即可
#AI 看不到的是更多的文档
https://microsoftedge.github.io/Demos/custom-highlight-api/
https://htmlspecs.com/css/css-highlight-api-1/#range-invalidation
我对这个实现很乐观,虽然它明显比 span[ContentEditable] 要考虑更多区间更新的问题,但结合js侧配套的增量compiler,或许以wbr分词的 new Range(#text) 也是能自动延展的?
希望以后能自己创建相关的工具链。
#draft #vibe
这个高亮parser基于 eat(字符流),Bisect(区间链表),ast; 2+4+3 个接口,只针对(字面量or函数)的层面增量解析
s=eat('hello'):
`s(1)==s(-1) ='h', s(1)=='e'`,可结合 s=df(eat)() 打印调试关键语法
`s(/.*/), s(JSON.parse)` ,支持 s.ws=/\s+|#.*$/ 等,当 s.hl=='', 读项前自动跳空格(字面量内不跳),并保留 s.wsPre+='其空格'
s.by=Bisect(基于H5 span[attr],Text 等, 通过PahQL(el)设置):
'he llo'
by(0, s=>eatVar); by(0, s=>compileDef); 注册区间更新,肯定不能和parsec/递归下降那样return,咋搞下面会说 也有CSV(C=列A+B)的demo
by(2, '[BYGRP].'); 添加字面高亮(2字表示)。 BYGRP{vgbl}共5x4种基础颜色
by(5, {metaROW:0}); 添加函数上文,重复时只留最外层
by(3, '\r3\r-3'); 选区增删。\r开头即删掉llo一词,并显示 'he \xBB' 以指示当前区间和光标
s.env: 为动态作用域。当文本指代相同变量时,替换为第一个 DOM Text
s.fun(id,kv?); s.ret.pop(); 维护def或{}命名空间
s.var(); 注意,函数统一为 [body, args, void 0, locals, {kw}] 格式
s.exp('-', args): 创建(赋值)调用。在PahQL结果上可以 .As({'-':({k,v})=>v }) 或 .AST({}) 转换
ast:
s.inHole().As() 编译时快照候选值, ho.As(u=>u+1) 单向绑定, inHole((A,B)=>A+B) 可多路监听候选
PahQL提供 eatDef=(s,at二参数)=>at.ret(自动重解析) 的简写。在QL里,会将exp调用加入最近的 s.fun('-forif'?, 静态attrs?) 基本块,但无视 [/:/, s=>的值],需通过eatSym()(s)手动组合递归返回
调用约定为 -return等语法 --forif等块 /全局调用 ->具名函数值 。s.fun('-for') 后可能要调用 s.ret.push()
code[ontruncate,text-spans] 在全局更新时应检查 s.by{.errs .body} ,你要在此对 `"正在插入 \" 哦", /**/` 等读时断尾/读后有余的input单独容错
.sloc 可以在def节点保存报错位置
.scmPutback[''] 基于行首/变量名来匹配def内的注释, unparse时缩进 ['\nindent']='2 '
基本块(span.def)在被增量splice 后,会聚焦其id,方便简单遍历.body时做剪枝。
REPL和补齐需要在input不完整,或含'wtf.\xBB'时做print(PS1)或 .show(elems) 提示
二进制input,无需Bisect!直接解析引用: new Blob([bytes, [嵌套的struct数组], bytes]) ,unparse时flat()“序列化”输出
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
#security CSP沙盒(tool)居然不是默认的? 任何一个富文本也可能导致 js/html 注入😒 这比C的 buffer[N] as code 牛逼多了😅 确如 yinwang.org 所说,把代码加个引号就当成数据、参数、用户输入,还在test出问题时"escape",怎么想的。 一开始就该用代码模板(ES6``)嘛 libc侧的RCE至少还能用 noexec/-fPIE 防一下,栈溢想利用就需要libc.so的地址,js呢,都是字符串…… CSP沙盒其实已经能弥补跨源访问的限权问题了。…
YouTube
Dear Functional Bros
Access experiments at CodeAesthetic.io
Discord, deleted scenes, song names and more at patreon.com/CodeAesthetic
Discord, deleted scenes, song names and more at patreon.com/CodeAesthetic
#post #bin #os lib.so是库对象?是C模块? 谈谈纯函数、全局表容器、Worker线程模型
随着React的火热,大家应该都听说过「纯」函数式编程(#FP) 这个规范了。纯意味着不更改变量和外部状态(例如stdIO),但它和 .c 的ABI(.o 和最终输出的 .so) 有啥关系呢?😅
在点出关联之前,我要发表一段很典的评论: 90%的PFer不懂FP。 考虑一个
pure fun 一词,不是说把所有 loop variant 存在栈上跳来跳去(伪递归tailrec),或是做 全局深拷贝+顺序执行转隐式this调用链("Monad") 的文字游戏就纯。
Haskell? 若要论“如何处理所有调用以 make dev happy”,Promise才是多任务届的顶流,CPS捕获栈帧闭包、捕获回调也不算什么。
😒 让我们重新 interface 纯函数: 不得破坏全局状态(可以复用执行容器); 默认单赋值(状态树集中,CPU缓存友好); 限制变量树的深层 &mut (即,值类型,==就是equals,根本不需要“地址相等”来优化Map.get,禁止地址)
换句话说,😅
当然啦,用
用 n=ref(0) 取代 mut n=0; 就更定义式了。它是真的数学组合器(n=1 vs 1=n, 代码也能有交换律),巨适合UI框架,能消除不少对可变量的需要。
但咱不在这里对 #FP 大做文章了。综上,FP没Reacter们想的那么抽象,到处加memo和freeze,它才是OOP的另一半或后继。
#AI锐评 https://x.com/i/grok/share/KlHa2s9CLU2VwnLH8kS3HvFnt
lib.so是库对象?是C模块? 这里就有了答案: .bss.size==0 and .tls线程局部==null 时是模块,否则模块也是新对象,和😝
点题了:如果你没绞尽脑汁的尝试把32G的游戏塞进8G内存里,这个区分确实很难理解。 但能理解\=能实现。
先说回libc生态。系统级单实例,0拷贝或CoW缓存,听起来很快! Web Workers 和 Rust 线程模型也都基于此。
它们使用
1. 顺应http微服务、Docker容器化的潮流,通过给消息id注册回调,即可实现+1CPU的请求响应或+N的计算集群,比pthread.join高到不知哪里去了😒
2. 每个线程都是变量隔离、代码共享的,不存在 @ThreadLocal 这类需求,无关于多线程、IPC、RPC,一次部署到处调用
3. 因为不隔离内存段,Worker进程间的协议非常好写且快 (aka. Actor模型)
但1个诅咒就足以让大家敬而远之了:
首先,共享运行时依赖树,并不能提升首屏速度,冷启动并非代码的瓶颈(除非 import jieba 等极端个例)。
而 py,js,lua,java,rb,... 包括它们依赖的DLL,这么多代码,怎么可能不做进程沙盒呢?
C 的模块和线程模型是脏的,不纯的,就像一开始没有提供HTML模板${}转义的PHP,也就像一开始没划分 ES Modules 的js。
让lib.so学习Worker,全局单实例,这不是处理 segfault,it sets your house on fire。 Vue服务端跨域请求污染如此,上文 setTimeout() 的id真的不隔离,又如何呢?😱
Shared Objects, 无疑是理想的,但真正能服务于系统上的所有App时,却需要一个函数白名单。
HTTP GET 其实就是纯函数的概念:它不改变状态,哪个源调用都能共享全局的cookie, 但是,就连tg大牛的BotAPI都破坏了这个约定。
从操作系统的职责看,真的需要跨源共享模块时,复制独立的 JSContext() 等全局环境或许不可避免,但可以用进程快照实现热替换;另一方面,编程语言也要接纳“默认final/const”的设定,而不是在(深拷贝vs浅拷贝)的鱼和熊掌上打折扣。
纯函数,更需要「化堵为疏」,就像OOP用this替代全局那样,去demo,并解决模块全局的开发体验痛点, 而不应将 Functional Programming 当神教或“银弹”去崇拜吧 ?😅
随着React的火热,大家应该都听说过「纯」函数式编程(#FP) 这个规范了。纯意味着不更改变量和外部状态(例如stdIO),但它和 .c 的ABI(.o 和最终输出的 .so) 有啥关系呢?
在点出关联之前,我要发表一段很典的评论: 90%的PFer不懂FP。 考虑一个
node &>/dev/null any.js 的环境,简单的 "log IO" 真的是“不纯的代码”吗? 请注意,stdout没法回环到原进程。pure fun 一词,不是说把所有 loop variant 存在栈上跳来跳去(伪递归tailrec),或是做 全局深拷贝+顺序执行转隐式this调用链("Monad") 的文字游戏就纯。
Haskell? 若要论“如何处理所有调用以 make dev happy”,Promise才是多任务届的顶流,CPS捕获栈帧闭包、捕获回调也不算什么。
换句话说,
def y(x): n=x*2; n=n+1; OK(n) 等效于是纯的,因为等号对变量的修改可以inline(n=2x+1) ,甚至 id=setTimeout(继续,1s) 也是纯的,因为每个app拿到的id并不会互相影响, random()>0.5 也是纯的,因为随机seed能被进程级重放…… 让我们用本质而非「字面形式」理解这些新概念(yinwang.org ...)当然啦,用
chkstk=(n, r=0)=>(n==0)? r : chkstk(n-1, r+1) 代替含糊不纯的 for(r=0; n!=0; n--,r++){} 在理论上很赞(哪怕是死递归,都比随手卡死调用栈 or libuv 的while(1)可控,因为有闭包!)用 n=ref(0) 取代 mut n=0; 就更定义式了。它是真的数学组合器(n=1 vs 1=n, 代码也能有交换律),巨适合UI框架,能消除不少对可变量的需要。
但咱不在这里对 #FP 大做文章了。综上,FP没Reacter们想的那么抽象,到处加memo和freeze,它才是OOP的另一半或后继。
#AI锐评 https://x.com/i/grok/share/KlHa2s9CLU2VwnLH8kS3HvFnt
大家应该没听说过 .c 编译产生的 .o ELF 是什么结构。好,我们看看:
`file /lib/libcurl.so*`
/lib/libcurl.so.4.8.0: ELF 64-bit LSB shared object, dynamically linked
`readelf -Sh $_ |tbl-hl 'text=代码;rodata=字面量;bss=mut全局;data =val全局;dynsym=dlopen函数链接;'`
注意, PROGBITS 代表这一个Segment是系统级单实例的,仅存的 .bss:NOBITS 会在库构造器里'\x00' malloc,剩下的都被C虚拟机无视,只用于 gcc,gdb,pref 除错。
AI展开: https://x.com/i/grok/share/jyixQkW0SNiIKtpGboy5LFUsG#:~:text=Linux%20动态%20PIE%20进程执行的绝对核心,
中科大真人快打: https://lug.ustc.edu.cn/wiki/user/boj/linkers-and-loaders/#38-目标文件中的数据结构
#tool 高亮注释
`tbl-hl() { sed -E "$(sed -E 's|([^=]+)=([^;]*);|s/\1/\x1b[38;5;208m\1\x1b[0m(\2)/g;|g;' <<<$1)"; `
lib.so是库对象?是C模块? 这里就有了答案: .bss.size==0 and .tls线程局部==null 时是模块,否则模块也是新对象,和
__import__('numpy').sys.argv 一样。点题了:如果你没绞尽脑汁的尝试把32G的游戏塞进8G内存里,这个区分确实很难理解。 但能理解\=能实现。
先说回libc生态。系统级单实例,0拷贝或CoW缓存,听起来很快! Web Workers 和 Rust 线程模型也都基于此。
它们使用
post_onMessage队列 + SHM共享状态(SharedArrayBuf) 多线程互调,性能和安全兼顾,有3大好处1. 顺应http微服务、Docker容器化的潮流,通过给消息id注册回调,即可实现+1CPU的请求响应或+N的计算集群,比pthread.join高到不知哪里去了
2. 每个线程都是变量隔离、代码共享的,不存在 @ThreadLocal 这类需求,无关于多线程、IPC、RPC,一次部署到处调用
3. 因为不隔离内存段,Worker进程间的协议非常好写且快 (aka. Actor模型)
但1个诅咒就足以让大家敬而远之了:
首先,共享运行时依赖树,并不能提升首屏速度,冷启动并非代码的瓶颈(除非 import jieba 等极端个例)。
而 py,js,lua,java,rb,... 包括它们依赖的DLL,这么多代码,怎么可能不做进程沙盒呢?
C 的模块和线程模型是脏的,不纯的,就像一开始没有提供HTML模板${}转义的PHP,也就像一开始没划分 ES Modules 的js。
让lib.so学习Worker,全局单实例,这不是处理 segfault,it sets your house on fire。 Vue服务端跨域请求污染如此,上文 setTimeout() 的id真的不隔离,又如何呢?
Shared Objects, 无疑是理想的,但真正能服务于系统上的所有App时,却需要一个函数白名单。
HTTP GET 其实就是纯函数的概念:它不改变状态,哪个源调用都能共享全局的cookie, 但是,就连tg大牛的BotAPI都破坏了这个约定。
从操作系统的职责看,真的需要跨源共享模块时,复制独立的 JSContext() 等全局环境或许不可避免,但可以用进程快照实现热替换;另一方面,编程语言也要接纳“默认final/const”的设定,而不是在(深拷贝vs浅拷贝)的鱼和熊掌上打折扣。
纯函数,更需要「化堵为疏」,就像OOP用this替代全局那样,去demo,并解决模块全局的开发体验痛点, 而不应将 Functional Programming 当神教或“银弹”去崇拜吧 ?😅
Please open Telegram to view this post
VIEW IN TELEGRAM