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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
#think #web #tool
https://cssgridgenerator.io/
https://crocotile3d.com/
https://fixupx.com/Oroshibu/status/1808500235263418441?t=BtGGBHj9jnN2AReHW2VTWA&s=19
三視圖?

有趣的建模工具
帅啊!
螺莉莉的黑板报:
(๑•‌ㅂ•‌)و✧
https://dataset.wav.pub/

https://brython.info/demo.html
https://github.com/Distributive-Network/PythonMonkey
#py
螺莉莉的黑板报:
https://github.com/baskerville/plato/blob/master/README.md

你们 rust 真是啥都能干……

https://www.sea-ql.org/SeaORM/

这东西好用么……求教……

https://gitlab.com/coolreader-ng/crengine-ng

有趣的引擎

https://chinese-font.netlify.app/ font
https://typst.app/universe/package/bob-draw
#svg

https://ivanceras.github.io/svgbob-editor/

#code
duangsuse:
大量复制粘贴十分抽象
list有那么难用吗
难道你没注意到近十行只变了1个参数
AIGC也没脚本化得这么严重吧

我看还是用list first!null好了,这么八股文…… 大家现在都是用get null取代预判has的

这种到处预判的风格,很像你找大佬问问题,先发「您在不在」,他只好回个在,然后你不在线……

表达式化比你想的要多哦:

>Spring如何把 @Autowired T xx; 换为 var xx=find(T.class)

var Ts = [T.class].map( applicationContext::getBean);

你在class{}里加那一堆定义,如果只引用了一次,就完全不应该引用。 到底都是要查bean的

从code smell来看,只使用了1次的变量名是无效的;如果只是为了易读新建变量,只能证明你的helper fn命名的有问题

kt已经有!! 了,还想要更多
Java 一大特色,注解属于元数据,和函数调用有重大区别

duangsuse:
那这是定义“随用随扔”变量名的理由吗
函数和变量是这么用的?
java以省略[""] 为由引入太多常量复杂度的优化了,都要所谓框架来解决

纯粹是make compiler happy,把一个schema弄成它能读懂的class,然后再强转Any来构造class而已

js里一个字典让java用就是这么麻烦,其实能用几次呢? init完就扔了,根本不是性能瓶颈。

注解的本意,应该和py的 @decorator 一样,是接受class元数据的编译期函数才对

而不是等到运行时才去查什么field有哪些@属性 然后逐个.set()

要动态生成一个类型,来获取注入,简直无理取闹。 明明就该在编译期产生Registry.get&fillNew的样板函数

这是属于既把元编程的路封死了,还不让基于注解的注入框架提供统一的“反射”方法

其实jawa懂这个道理,但它偏偏就做得很烂,就会个@Override
duangsuse:
为了编译速度这也太幽默了,其实,jvm作为栈机 基本就是带类型签名的GNU dc计算器,不需要什么编译优化

如果递归下降一遍,校验下类型 生成个push call 就能花什么编译时间,属于是用PHP的方式搞算法了

而且javac的能力还远没有到c预处理器的程度,为了优化? 我看是他们不在乎程序/类定义的优雅性

什么序列化啊,也没有做规范,和py能 import json,yaml,toml,marshal 能比?就一个用来RPC的ObjStream,还被业界遗忘,哈哈

汤姆猫是大专必学

虽然汤姆猫的Biz程度也就比Node http-server强半点吧

所以问题就是Result类型为何没有重载 !!, 让它看起来仿佛只是带有错误消息是null

凭什么!! 只能校验 Type? 呢?
assert也是乐观/悲观路径
Exception也是,为什么不能一起判定了?
还非得搞个ifEmpty, ifBlank.. ifNullOrBlank..
莫名其妙

duangsuse:
这不是废话吗?例如买30天大会员,肯定是30* 24*60*60秒后失效,这才是世俗意义上的电脑时间

看到py关于时间和日期/时差有3个API
我就觉得抽象

audit就是一个不懂AOP的,其实unix可以靠strace审查syscall,win32的 sysinternals.com 也有进程日志功能

与其自己搞个无人知晓的轮子,不如封装别人的,两全其美
把OS的活都包揽了,难道py是要运行在Ring0把内核驱动都带上? 那必须支持啊

绷不住了,抽象程度直逼jawa

一开始就不该搞所谓orNull
默认 first{}!! 就够了

我在js里都是把Error视为object返回值的特例,和null是一个意思
这样就不存在什么orNull orElse的,catch表达式也免了

就是语言设计者对值体系的理解不过关,例如NaN就是numbers的null才对,而不是什么number?
这样才能用统一的方法去报错/换默认值

可悲的是一开始就没把悲伤/快乐路径当问题啊,真是异常搞心态

duangsuse:
幽默IDE
完全相信它的API有一大堆根本用不上的class
忸怩作态的软件没必要去维护

kcp是这样的,可 import ast 自 https://python-future.org 就没变过😋
py只是用:隔离一个表达式先于=执行,就实现了高贵语言们的静态检查

既可以用于静态分析,也能在运行时查看f.annotation ,完备的数据不需要反射

btw. 大佬应该会做一个DSL
Message.invoke{ id==mid }
Message.select{ id==mid }//多项

可是这种写法才是真正的SQL逻辑式

既然Msg(id=)能构造数据, Msg{id==} 就能查询
这不是很合理么 #kt

很简单,如果做得太标准,以至于移植到任何一门语言里都没必要修改的话
就没人给官方docs贡献流量了

duangsuse:
https://www.liuwj.me/posts/ktorm-introduction/
🤔 一个SQL函数.xml codegen 能被吹爆,还有人卖课是我没想到的
ES6里一句 sql${} 解决的东西,哈哈

「没想到他文化程度那么低」……

怎么会呢,语句能缓存,再怎么也比一次加载完dao好

你要是不喜欢,或者不相信语法糖有缓存,可以做成生成函数的形式
例如
updateId=f=sqlFn2{a,b-> Pair{B/b, A/a}}
f("bye",0)

所以说,如果你不相信DSL能被缓存,可以转为生成sql函数的形式啊

这不是MyBatis++ ?

https://github.com/JetBrains/Exposed/blob/main/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Op.kt#L184

我只能说,缓存键要么是调用点或次数
要么是函数
似乎很难单独缓存DSL对象,除非对它们的构造器
幸运的是, key eq x 里x的修改能缓存,因为它是参数

https://jetbrains.github.io/Exposed/frequently-asked-questions.html#q-how-to-get-a-plain-sql-query-which-will-be-executed

https://stackoverflow.com/questions/74821893/postgresql-arrays-instead-of-extra-table-in-a-many-to-many-relationship
涨姿势了,以后 1:N用数组json N:N用join

duangsuse: #fp
要是kt能允许编译期生成一部分表达式,就没这问题了😅😅😅

可惜啊, unquote{bash(q(trim("trimedStr")))} 这当然是lisp的专利
其中q() 被生成为一个字面量,就像闭包捕获:
fun bash(s)=trim(s).let:
paste {system(it)}

并没有所谓的编译期,因为编译器能访问所有lib API


0开销不是瓶颈问题,但事关语言的脸面

明明就很有用,可被一些人理解为「并非瓶颈的东西」
然后被rustc拿来完魔法

要我说他们就是傻屌,只不过是把闭包「捕获」的实现方式,改为内联字面量(unquote)
就能轻松突破编译、运行的动静边界,根本没有引入任何新API ,没有什么循环展开和 kotlinpoet javapoet的区别

他们做成什么样了? 正则的缓存还不如py的拿dict查😅
#linux Sukka's Notebook:
Finally, the wait is over! Winbox 4 is here, now natively supporting Windows, MacOS, and Linux! 🎉

Windows: https://download.mikrotik.com/routeros/winbox/4.0beta1/WinBox_Windows.zip
MacOS: https://download.mikrotik.com/routeros/winbox/4.0beta1/WinBox.dmg
Linux: https://download.mikrotik.com/routeros/winbox/4.0beta1/WinBox_Linux.zip

MikroTik 释出了 4.x 版本的 WinBox(仍是 Beta)、原生支持 Windows、macOS 和 Linux,在 macOS 和 Linux 上无需再使用 Wine 启动 WinBox;除此以外,还原生支持暗色模式。

#web https://www.redblobgames.com/making-of/draggable/
Draggable objects
如何实现可拖拽的元素
Rachel: #android #css #web
写过复杂 UI 的人肯定知道要在复杂业务场景里把动画优化到 60 帧有多难

duangsuse:
为什么 shadertoy.comgl-transitions.com 用几行代码就能做到呢? 为什么@3b1b 一个人用py就能实现呢

还不是框架做得烂 https://tttttt.me/dsuse/19124

同意,类型系统不就是对字面和编译期键值的Matcher嘛, 占篇幅纯属过度设计

要是我,直接把 def(a:str) 写成 def(a~"")

现在ui还不是有用gl加速,结果到头来连满挣都做不到,一大堆空洞的class写得还不如numpy的那些公式

如果专业是指「我们必须保留所有历史错误」,我宁可保持饥饿、保持愚蠢

至少,对用字面量取代类型标注上是这样。 泛型也一样啊,写成 a=set() assert{a.add("")} 而非Set[Str]

我有一整个系统来替代现在的OOP和静态类型/编译期计算理论。

你不觉得typescript的类型标注是过度工程吗?作为把sql row 填到forif模板里的一些业务。
他们有这样依赖补齐、检查,完全是因为API的风格太含糊

动态类型只是在运行时能进行修改和(同名符号的)链接,方便元编程。 例如 for: class: 这种结构就是无效的

致胜优点是免编译(交互式编程/所见即所得)、隐式类型!
还有,在生态上,没有被缺乏语意的设计模式(例如序列化和依赖注入 aka with强类型KV:)所绑架

在子类型多态上,未必比得过静态OOP
难以拆箱(栈上分配)本该是一种可以被类型推导消除的副作用

我看到的是有初学者用 Cursor 写出类似字幕搜索的高层应用

编程的工程化,作为限制生产力的繁文缛节,如果只是 make computer happy,理应从人应该学习的部分去掉

例如,javac 用那一套class{}语法定义一个编译期字典,我们应该是做IDE插件去生成样板代码吗??
多少技巧模式是从语言缺陷来的?
狸::
说着要开发效率,用着到处加字段,SQL两百行,不合理拆分接口全部Object返

duangsuse:
还有全部POST :)

这样,其实你完全可以用WebSocket收发json吧

不是动不动脑子,这种业务组件根本不该让人写

白用了个http,就是当做饼干罐和 /git/push?url= 那样的子命令微服务吧🥰

直接跟py那样 import fire ,什么http服务器哎,封装为函数路径和调用算了。

就像以前还写什么argparse,哈,完全是样板代码
duangsuse::Echo
纯sdf, 顺手移植了一个给 numpy+tty 花了1小时吧: cv2.open(mode=HSL亮L).降采样为(stty size) mix(256色到" .*#"色) .追加\n列 .光标到(0,0)print 我用了比yes命令内存效能低的join'',但也不打紧 #performance fwrite() 就像CtrlV,要打'y'*500你是粘贴五百次还是多复制、缓冲? 把rows('<U1').buf分隔复制到 int8(w*h+1h),按帧yield给/dev/pts/0管道更省 若一开始就…
看最近几条逆天,我要聊哲学 #CS
操作系统不就是4片3口虚拟化么
时间内存存储程序,网口线口板口 #os #plt #embed #recommend
win,*nix,mac, aosp ios ;哪个不是只有这么点API和差异化 🦄?为了音视频和回应事件弄那么多框架外链新语法,不如3行 #web js。
bellard.org 那样的通才终究少数,搞出\0结尾无长度字串,连{}[]{type:}都没建模的libc算什么API啊?在位运算位flag上都被人打败 也配教人数据结构算法? 。 为这撒手掌柜的「千年虫哲学」服务的「编译器和OS」……

"It works"的「千年虫哲学」出现在4byte的13位时间戳、在'\0'结尾的CStr、在argc和snprintf等“最佳实践”、在将'❤️'算作2字符的JS和JVM(UCS-2的伪utf16)、在线程被窄化为while(1);join和各种设备信号的“同步IO”里 —evpoll为何不是默认呢,就因为C没“回调值”,轮询pull>推送onpush? 千年虫在几乎所有让你不分昼夜却不得要领的「术语」里……

时间片sched - 变通while(true)的死机, kotlin/go func 怎么不需要这些? numpy,GL 为啥不需要循环向量化?
内存片vm - 缝补struct{{}} Rc状态树, 缓解(编译期)检查缺位的骇客 enum { A(int) B(str) }, for(i:0~9)a[i], sql select${x}+1, scanf%s
存储片fs - 分簇存bytes&CoW复制断电不断写
程序设置依赖片elf,apt,regedt - 硬编码各种rc,ini和/lib/.so.版本 🤮,各发行版树格式不通,make系统ld.so优化一堆,却连 live compile/fatJar/minify 抖树都不懂……

网口tcp,ssh 双管道(socket), pipe闪存读写(等buffer就是等yield)
线口usb 注意方口圆口转接,通用的
主板口pciBus 安卓的dts
>__线程调度内存隔离、文件设备(fat32,ext4,IRQ)、 IP网络和并发工具(IPC,sem,mutex)__
>如果一个人写了线程池或malloc()或ELF文件链接器,声称自己写了操作系统 是可以的(GNU不就是)……

凑以上这些字数干嘛? 时间内存存储程序--片,网线板--口,就这么简单。 把双管道快取翻译成「套接字缓存」是啥逆天专家
OOP封装/多态实际上解决了 libc vm 化进程的问题,JVM,NET只需要查数组或union的越界,没有“syscall给驱动”,因此跨平台,何来segfault?顶多送个内存片swap和热更新热迁移(混合睡眠/分布式fork),做好函数间互相jump; yield(闪存或typed)的“IPC”。

IO? 直接说ip+fs 分片传输吧,检测点击长按、解码HDav到PCM也没见内核态自带啊,外设和性能也不必突破一切皆文件。
ip实际上靠http。纯socket没?args长度没返回MIME类型 ,URL就平替了 env key=v PATH/git/add-command?k1=v1#.mp4 .wav; 实现共享
ip和sh命令一样,带参数单文件而已。ip还附赠跨语言扁平读写(REST序列化)。 stdout本该可直接 print Blob(bytes,MIME);而stderr是loglevel变量,没意识到这让log4j竖子成名
用过 nc;curl 管道和GET,PUT都知道,http函数模型比sh优秀,实际上WebAPI/py调包远胜于UNIX。PJAX调用/PWA就是一种“上文切换”、IPC、/{etc,usr}软件格式

时间内存存储程序,网口线口板口,4片3口虚拟化 😊
逗号左半,pyjs javacs rust 包括C作者自己写的Go啊 Docker啊,哪个不比libc+Linux强, uv(vs ^CSIGINT或evpoll?) jemalloc(闪存0copy和0flush) psql redis/flatpak
逗号右半,Bun.js ip栈封装; WebUSB; Arduino; 各种图形界面设定,很简洁,一到hwinfo“元数据”就乱搞,像fastjson大师修注入似的。凑字数?给骇客留空间!
包括那个 ld.so 可绕过的chmod +x ,多用户真的比多app容器+人均root有用么? OS竟敢不按devs的喜好来部署。
《程序员的自我修养》大概比较了COFF对象的这几种分支,PE,ELF,甚似于apk。常量池.rodata、全称名mangle、字节码动态链接、菜单图标、自带资源树和签名,比之C++ 对象,不能复制修改,无虚表原型,无双指针框定类型,不线程局部而。

也就是缺个二进制 databind 写冷门硬件的“驱动”,不过那也无所谓,ASN1式的屎山只能像zig那样,自动C2zig
有人说用户态不够,memsafe 后还需要调度器呢。 谁要那个巨无霸4K起步的 struct task/PCB{} 啊,还有上文切换开销。画蛇添足? Lua, 2KGo, NTFS和安卓的FUSE, numpy 真多核……从API从源码开始做优化,删掉无意义的设计模式,四海皆效仿,才配叫编译器和OS!

我半年前1k阅读的稿,也是这样 libC sucks 的观点 https://tttttt.me/dsuse/19854
淫王也这么想 https://www.yinwang.org/blog-cn/2019/08/19/microkernel#:~:text=一个操作系统本应该
1🦄1
#life #js #web 独立开发者 < B站娱乐编程主播

>虽然说 wangEditor 没有带来直接收益,但是这中间带来的不管是咨询也好,知名度也好,最终都能反馈到慕课课程、1v1咨询,划水 AI 项目上来。

对于双越老师提到的动辄 1w 的网红服务,希望大家也能自行判别哈。相比之下,如果所谓的提供服务的人,连一些公开的输出都没有,是不值得信任的。
huashuiAI.com 付费开源项目模式的发起,如双越老师自己所说:"和当年做面试课程一样,这又是我的一个创新,全网唯一做线上项目的,且业务复杂、技术难度大"。

链接:https://zhuanlan.fxzhihu.com/p/721026909
就用双越老师自己的年中总结结尾吧:务虚年代,逆风飞翔
最近设计一种跨语言ABI,很苦逼, 没啥灵感, 就评论点文章吧 🙉 #learn #sql #web #design

作者是DBMS的维护者。谈到面向表单+外键的数据库,应该说SQLite的质量很高,它不会是为了过度设计而做的东西,但内存数据库和今天广泛用于 Geo/Vec/全文搜索/timestamp 的Pg方向不同。
而王垠是我同行,他对SQL的观点是:必然要连ORM,Redis这些套子,还不如直接 new $KV_HashMap +loaddump 解决了,反正索引算法都是BTree二分查找嘛,像读写配置文件那样CRUD,比夸张的创造一种RPC协议又套一次要简单
我的态度是,SQL作为API的学习成本很不必要,但从就业率和persist部署一致性的角度-我们还能做什么呢?? LINQ/JSON查询 那样架空SQL是合理的,但对企业应用,还是该有DBaaS的搞法,就像 mount -t 文件系统 有很多竞争者

但是文内还有些我不顺眼的地方,吐槽下……

>肤浅至极,给大家展示什么叫隔行如隔山。

他山之石可以攻玉,DB和OS/PL都是在x86上执行,都是靠算法PGO,说的好像换个SQL语法就爆赞了

>“就是C的struct, 就是指针, 为什么不能RPC”

struct和Row在数据类型上有动静态差异,而且SQL就是基于/tmp/shm的第一个 C RPC

>使用基本的数据结构,其实可以完全的表示关系模型以及被它所“超越”的那些数据模型
<怼:webapp在乎Bw-Tree是怎么实现lock-free的吗?用C写完了请加上一个buffer pool,WAL,disk-backed B Tree,并且写上所有高并发

王垠不该批评SQL这个API被实现为怎么样,SQL明显提供了单app做不到的缓存和事务性安全
new $KV_HashMap +loaddump 很简单,对象存储API很简单,但那并不是DBMS,倒不如说它解决了JVM的性能问题,让人们专注于优化$http.json
曾经嵌入式开发存在一些XML数据库,它们就是干啥啥不行,和JSON存储一样

>只要你有一个程序语言,你就可以发送这语言的代码,到一个“数据服务器”。服务器接受并执行这代码,对数据进行索引,查询和重构,最后返回结果给客户端
>如果你看清了SQL的实质,就会发现这样的“过程式设计”,其实并不会损失SQL的“描述”能力
<恭喜您发明了Spark。但是这怎么解决写入的问题?

unquote为常量(JSON.dump) 啊,他就是在批评SQL过于冗长罢了,其实程序员的工作范围是比Excel操作员高端的,说实话。
SQL存储函数完全能实现Java的中介功能,只不过没有直接暴露:3323:5432到公网的全栈文化罢了,DBaaS只是独立小程序的选择,许多人UAC验证都没做

>数据库的问题哪有那么困难,它其实跟“远过程调用”(RPC)没什么两样
<RPC最著名的问题就是怎么在保证性能的情况下靠近"Exactly Once"的广播call,数据库集群是一定要”Exactly Once“

类似于TCP:发送到Kafka的每批消息将包含一个序列号,该序列号用于重复数据的删除。与TCP不同,序列号将被持久化存储topic中,重启不会影响去重

>数据库系统存储设计的本质是简化以及优化程序和外存储的互动。

IndexDB确实就是更简单的类型化FS,是使用各种存储缓存的另一种范式

>DRAM读写速度大约10-20倍于SSD, 对于HDD更加明显, 硬盘延迟是80倍左右,同一份数据,在读写过程中自然地有多份copy。单独的数据库系统进程的职责就是, 在这样的硬件环境下,保证性能并且保证不会丢失数据。
>数据库的操作在加上transaction以后自带了对于断电等情况的应对,需要相对应加强代码的理论模型
>停电,系统崩溃这种事情不是人能控制的。灾难可以在任何时候发生。就算每次读写都直接走硬盘,写入的操作并不是一次完成的,简单的fprintf()都会发生只改了前缀的情况

谈到冗余备份,就不得不说 Pg VACCUM 语句和各种 &is_deleted=0 了,把笼子删了屎山只会跑得到处都是

不过就缓存&一致性问题,Linux 主流的jfs/bcache即日志文件系统/CoW写前复制 解决的蛮好的,并没有ACID那么复杂
而且说实话,真有人在乎意外断电,缓冲区的数据能不能恢复?(最多是CoW那样冲突留旧) 实时系统和RAID也不敢说啊。 软件层面试图硬抗,很天真

>我写C的时候只告诉电脑要一个变量”int a“,不告诉它要存在内存的哪里,还是放在寄存器里,也不告诉它整数是什么,存几个字节,真是一个不切实际的妄想啊。
>这年头你的数据库不把SQL编译成汇编都不好意思出去和人打招呼。

王垠对SQL的批评是,它太难配置了: [].mapNotNull() 或者简单的forif{},换成DB连接就有一大堆的麻烦的设计模式,而且SQL的数据类型(utf8mb4?)甚至语句/模板API,可以说设计得非常低级,让人欲吐不能,所以才有ORM和MVC框架的事情

基于解构匹配通配符的 Prolog 才是真正的SQL,但SQL的巧妙也确实是在有各种插件去 CREATE INDEX ,但这仍不涉及可推荐「共同好友」的图数据库

至于准备语句的JIT,恐怕也就是 template interpret 这种把switch(op[i]){case:}拼成汇编的低级玩法了,在单层for if 的SQL查询里这种内联汇编根本无关于算法优化。 PrologVM做过一样的蠢事

>由于“行”只能有固定的宽度,所以导致了你没法在里面放进任何“变长”的对象,tag数组,项目union都不行,A.B非得让B转90度竖过来,查两次
<normalization在很多情况下更高效(多个A的值指向同一个B, B表加一列等等)。
<如果是嵌套数组的,那么不止B的foreign key,A整个行的字符串都要重复好几次嵌套进去。更加不要说update的惊群效应,性能反而低
<Vertica是使用SQL的RDBMS。Column-Store诞生是为了更有效地解决大数据分析的问题(OLAP workloads),节省硬盘I/O(就是所谓列压缩),运用SIMD等等。不知道这和逃脱SQL有什么关系。

struct和Row在数据类型上有动静态差异,但确实很少有人利用动态table,这需要架构师学习
这方面王垠demo做少了, 比如 post.tags[], user.badges,.fo 确实应该单独立表,这样才能join查询。 json()数组这种存法,作为语法糖就够了,它不关系
你只是显示tags/fo数,没时间线什么的? 意识不到关系式数据库为啥「关系式」, 据说Q群就是1群1Table,就该这么用
列存储显然只是一种类似gzip的自动压缩,并不能优化双向索引

>数组需要一个字段来表示它的长度N,剩下的空间用来依次保存每一个元素,这样你只需要一个key就可以找到数组里所有的元素,而不需要把key重复N遍。
<把字典压缩理解错了?把run-length压缩理解错了?这怎么解决变长问题?

(Ary){u32 N; u8* bytes[N]} 可以解决str分配问题,如果DB有个常量池的话,套一层指针对缓存也好

>每一个“foreign key”,其实就是一个指针
>每一个join操作,本质上就是对指针的“批量访问”,找到它所指向的对象
<数据库里的foreign key不是pointer。数据库经常需要把数据更换位置来解决存储碎片化的问题,不可能用pointer来实现这个
<Join是由数据库查询优化器(Query Optimizer)来决定的,基础的算法就有nested-loop join, sort-merge join, hash-join等好几种,也会有用索引和不用索引,甚至半用索引

这就是你有所不知,bumpptr GC 全都有指针引用计数组,可以在某段页面清空后,通过memmove(to)并更新xref消除内存碎片,而不malloc
这就是为啥JVM/Lua的FFI都存在 Un?Pin(Object) ,foreign key不是pointer, 可托管内存同样不是pointer!

SELECT student.name, record.id, record.city
FROM student, record
WHERE Student.id < Record.id ;

^ 这样的join不离谱吗?我在Gitea里只见过 LEFT JOIN id=id ,还是王垠有理,SQL弱

总的来说,王垠对SQL的批评主要是流行语言的DB.API都太拉垮,私货满满了(包括ORM和KV/对象存储、配置读写等等),
他这么一说好像算法都差不多,每个app单 import db_impl 甚至json就省力气了,其实忽略了mapNotNull函数不能解决的:动态索引join、缓存和事务性安全、async并发的问题。
用FP的写法join和反查你是要写两行甚至加变量的,SQL只需prepare(fn).bind(arg)! 😅
最重要的是,C时代还不存在stdlib里有KV/ListGC算法甚至统一row格式的便利性,而那时就有json持久化和join查询需求了。就像 UNIX getent hosts , 这还是只读数据库

我觉得如果要优化,也是把 @data class 和 [x for x in if] DSL扩充下(groupBy,sort,page啥的),翻译到SQL连接上更合理,虽然数据库还涉及ABI兼容性(schema rollup)等运营日程,但Docker式DX至上DevOps的思路是正确的
👎1
duangsuse::Echo
最近设计一种跨语言ABI,很苦逼, 没啥灵感, 就评论点文章吧 🙉 #learn #sql #web #design 作者是DBMS的维护者。谈到面向表单+外键的数据库,应该说SQLite的质量很高,它不会是为了过度设计而做的东西,但内存数据库和今天广泛用于 Geo/Vec/全文搜索/timestamp 的Pg方向不同。 而王垠是我同行,他对SQL的观点是:必然要连ORM,Redis这些套子,还不如直接 new $KV_HashMap +loaddump 解决了,反正索引算法都是BTree二分查找嘛,…
结合上面一条看…… 啊,王垠说的挺对啊, UNIX 这个libc实现,是历史的倒退, 今天谈啥函数式、非阻塞(异步)、用户态驱动与 eBPF、Docker 部署、systemd ……

其实CDEF ABI 的设计错误就挺多的。 Object 是 .so 内存N:1映射, main() 要自己解析 argv env和ports 不统一, stdio和socket(同为双管道)接口不一致, 没有考虑UIUX所需的用户态驱动或者SELinux那样对root接口的细分。 大家好不容易hack过了,拿mainloop去写app,结果造成了 yield vs return 的染色问题……

就拿 setTimeout/curl 这些阻塞IO说吧,如果键鼠框架独立于主线程,通过 read() write() 这些线程(C协程)断续点等UX或IO结果,GCC 再支持个堆回调,是不存在需要管理Dispatcher的API的, 都怪UNIX没有考虑UI框架、线程池同步、事件批量监听! #web 与之相比真是太成熟了,无远弗届。

如果把 mmap加载( .so ) 当作是 new Object 呢,你会发现根本没有线程全局冲突的问题,也根本不该有import模块化和PLT hook 的问题, 新线程,就是OS把 __thread var 块的原型链设为.so ,然后补齐几个imported回调 ,pthread 本来就不该和 C++ new 有区别,别提那个和YaCC一样弱智的fork()了,程序员的傲慢而已,煤球用。 https://m4tsuri.io/2020/10/18/glibc-tls/
在Lua和JS里, 同样的事用 mod=( privateVar=1)=> ({exports}) 也能解决。

Linux 真就是一个劣化的JVM ,它的本意是支持 new wtf.c .so({staticsCoW}) 这样「面向PATH里的对象」,ELF即class, .text .bss rbp 堆/栈/常量池段分得好好的? 却认识不到这只是对OOP的拙劣模仿, __thread ABI 创建更显得OSdev们没点复用意识,没突破UNIX的烂尾楼
更别提许多C项目那个人机 ./configure 了,比Gradle还慢,这是因为它每次都检查你是否在用gcc或llvm以外的编译器打包!?

现在好了,都在给UNIX哲学擦屁股啊, 说的道理太多了, 都忘记业务本身有多浅显了,哈
https://x.com/JamesGoong/status/1902513306423980537 #web #经济 最看不起这种了不起划转一个数字, 就收大量手续费担保费的中介机构

Web3 就差一个跨平台跨端API,就能把这些两头吃,到处填表格跑断腿的玩意打成渣

把所有KYC要求全部丢给商户, 自己两头不讨好,用户体验差别就像什么呢? 像 OpenAI vs OpenRouter.ai

真不知道为了运行这种天怒人怨的合规性,追回了几笔诈资黑钱呢??
#web #security #js 前端打架
pg 大哥写了个总结!
https://mp.weixin.qq.com/s/1jjBMe525CtDaq1XrDztHQ

事的起因很简单:Next.js 出了个非常幽默的高危漏洞,一旦被利用,就相当于给小偷留了后门,直接绕过登录做想做的事。Vercel 作为 Next.js 的金主爸爸,刚被推上“欠解释、缺修复”的风口浪尖,Cloudflare 这边就先拿出补丁,摆出一副“我先替你们收拾烂摊子”的姿态。

还在 X 上抛出几句酸溜溜的嘲讽。就像一个隔壁大哥突然跑到你家门口说:“房顶漏了,我给你搭好防水布啦。对了,你们家装修可真够脆弱的嘛。” 这搁谁家听了,不恼也难。
你知道吗? #tg #web 使用了一种 自制编程语言(TL) 定义 MTProto ,后者 涵盖和HTTP一样广,但是TL语言的长难句多的如同梦呓…… 看起来它是优化ASN.1但是失败了 😅

TL里每个类型的修订版本,都有一个hash,甚至于 bool null list 都有,只是从来不变……
和REST一样,TL也有把dict读取作函数调用的方法,这时 blob.(type) 是远程方法ID

如果仔细了解下 Telegram Core 的开源信息,你就会知道为什么Signal不如它的一根毛了, 这都是什么绝绝子程序员啊 😅

我不得不吐槽,这命名都是什么鸟语; 但也可以说,如果tg开发者连学术都不会,没有能力重造轮子, Telegram 生态也不会如此独一份了

Telegram delivers messages faster than any other application.
Telegram has an open API and source code free for everyone.

Telegram lets you completely customize your messenger. (主题系统甚至 90% 用户都没在用,散户程序员都无力开发)
https://instantview.telegram.org/

就不说大家每天都在用的IV和TON平台了,官网上写了 Web&Linux 客户端的都是神人, Durov 的这个和 酷安 比,那酷安不是没法比。 技术上,资本上,云计算格局上,比不了鹅爹。 😅

谁懂老杜的含金量啊, 无论如何,这确实是一个尊重技术的 instant messaging 龙头

https://core.telegram.org/schema#Layer2
https://core.telegram.org/mtproto/serialize#polymorphic-type-constructors
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
让我觉得匪夷所思的是, FRP 脚本有很多,但基本都是拿到地址就(可以公网)测试了,就像你只是调用了一下curl而已 Linux hostnamectl 这个特性,似乎是可有可无的,存在感比蓝牙设备名还低 这就像一些 http/ftp-server 测试服务,启动后不会 print URL 句柄,要你根据port去猜 当我封装CF的公网tunnel时,理所当然就把此服务封装成 $HOSTNAME 了,回头一看我居然是异类。 😅 twistd -n ftp -r . python -m pyftpdlib…
#web #dev 这个真是懒得喷。 我理解的REST(可表达状态转移, curl https://wtf = count: x=>x+1) 是什么? 😅 😅

就是 db.GET PUT json, 加上过滤排序分页, 或许有些 /user/:id/follow 的页面可以手写下,也可能直接套模板生成(哪个平台没有一堆“收藏夹”啊..)

这种RPC当然毫无价值,类似于把本地存储换到线上,只是加个鉴权和双向搜索罢了,查重率100% 我是懒得手写的, GraphQL.org 也封装的明明白白。
我觉得奇怪的是,哪怕是在PyJS的全栈框架里, 我说的这种REST,对 BlogComment, Todos, PetShop 等基础CMS样板也没法做成和Excel一样简单; 那些淘宝上卖的(开源投自制) 也都没有重用重构的价值


这篇文章在替发明REST这个「高端概念」的大佬,抱怨工程师们什么呢? 是 HateoAS (讨厌OpenAPIs?? ) 没人玩。 😅
也不是讨厌,是用res.body XML上的nullable函数超链接,表示“用户有没有登录” “用户能不能删贴”,来「方便App跨版本」 等等,比SOAP好一点

这不是废话么?? 这都2025了还有人把活爹.XML(schema)当个宝呢。 你说说Java里怎么生成 OPTIONS / 啊? 有了 HATEOAS 接口,在JS里免client lib 直接调用的DX体验怎么样??

没有TG自己造传输层协议的能力,还抱怨工程上restful的理解了RESTful, 那比你强的就是懒得为REST这种高度自限性的RPC写框架,早自己玩更好的去了; 比你菜的又只会CRUD,最多拿 http/module/:pathArg 优化下可读性,对接下SQL或jsonKV, 你让他区分个 GET/POST 都懒

可不是被滥用和误解嘛, 纯属活该,自己不开发在那边画饼…… 你有没有意识到, api.x.com/OpenAPI.json 就是所谓的REST、免文档、自动发现函数、解耦合?

Java codegen 都没写过是怎么敢设计这种协议范式的? 不对,看他们 content-type 都要改成 vnd.XX.User+json 我就觉得这是 #ts 写上瘾了。 知不知道 fetch() 不能自动判定body类型,还要手动.json()一下……
如果你真能生成并用 OPTIONS /:type/:id 调用动态方法,那要http就没意义了(本质上是js rpc),所谓超文本又体现在哪。

我都可以给REST/HATEOAS重构成工程界可以接受的样子, 但我不会用单请求单响应。🙉

http方法本身也是烂梗, POST就是有body的GET,DELETE就是空body的POST, jQuery 里一直是这样重载的,十年了不见跨语言一点。 POST的“同名时冲突” 也是很脑残的约定,很多人只是为了在body里放文件上传一下, 根本就不该禁止,填写表格时多次检查。

🤡 https://roy.gbiv.com/untangled/2008/rest-apis-must-be-hypertext-driven
ps. 我是真的写过API生成的 https://github.com/duangsuse-valid-projects/GeekSpec-GeekApkv1.0b
SOAP砖家: https://coolshell.cn/articles/3585.html
Please open Telegram to view this post
VIEW IN TELEGRAM
2