#design 事件脚本 颜色 排版
https://github.com/tc39/proposal-signals
https://joeduffyblog.com/2015/11/19/asynchronous-everything/ #csharp
https://tttttt.me/TypeChat/56825 二维码和火星文
State of Text Rendering 2024 (Score: 150+ in 13 hours)
Link: https://behdad.org/text2024/
Comments: https://readhacker.news/c/6aXT7
https://m1.material.io/style/color.html#color-color-palette
Material Design 1 那令人惊艳的色板想必大家都不陌生,那么如果我们强行把这个色板按照 Material Design 3 进行重新编排,会变成什么样呢?
我做了个小实验,结果如图,只能说有点惨。
网址:https://sjjscl.csb.app/
https://github.com/tc39/proposal-signals
https://joeduffyblog.com/2015/11/19/asynchronous-everything/ #csharp
https://tttttt.me/TypeChat/56825 二维码和火星文
State of Text Rendering 2024 (Score: 150+ in 13 hours)
Link: https://behdad.org/text2024/
Comments: https://readhacker.news/c/6aXT7
https://m1.material.io/style/color.html#color-color-palette
Material Design 1 那令人惊艳的色板想必大家都不陌生,那么如果我们强行把这个色板按照 Material Design 3 进行重新编排,会变成什么样呢?
我做了个小实验,结果如图,只能说有点惨。
网址:https://sjjscl.csb.app/
GitHub
GitHub - tc39/proposal-signals: A proposal to add signals to JavaScript.
A proposal to add signals to JavaScript. Contribute to tc39/proposal-signals development by creating an account on GitHub.
score To.b8(100) #bytes8 i64
name "仓颉"
- task -index(0L) as: dd=index #debug disp
wg CoPU.waitN #lock1, atom(0)..
(0~4):(index)
wg+CPU.add: task(index)
wg()
(0~40).forks(4, Sum.ln, CPU.fadd:(x) dd=x.0/10, 666)==[666]^4
cnt: count 0
w1 CoPU.lock1
(0~1k): CPU add:
w1: count{+1} #synchronized
?? Row
Rectangle -width-height(0L 0L)
- area as: width height
?? Flyable
- fly
?? Flyable #去掉这行变sealed
Bird()
- fly say:'Bird flying'
?? Row
Article()
-titleValue Cnt("")
-title Cnt{titleValue}: titleValue=An
?? RMem #类似函数值,只允许 a.Str, RMem.eq(a,b)
Rect --w-h(. 0L) #可选参数、类型按参数名
- area() 1w 1h
?? To.s
- printSize say:'The size is {N}'
?? IPay
- pay “?” #- pay To.s
?? Row IPay
USD -n(cnt 0.) #可变的列
- pay "${n}"
Order -payment(IPay) #对代理的重写
- pay "In-order {An^1.pay}"
?? HasArea
- area To.n
?? IDraw
- draw -g(Geo2D)
?? Shape IDraw HasArea fn?? #强行插入为接口+构造器
Square()
- area 100
- draw -g as: g.text("wtf") N2(50 50),
#plt #design 把 仓颉 的示例拿最新河图重写下 http://www.bilibili.com/video/BV1YE421A7np
现在单字符已经成为政治正确了😅
幸好,设计了 To.s 这样避免画风突变,以及策划了.pyl 洛书采用原有类型名
单字类型的好处是,非常统一,在js里能用只有一俩字不同的表达式
这样,无论在什么语言里,我的范式都是不必重新学的
我还挺需要“正常化”这些为电脑做牛马的人类编程语言了,只需约法三章:
允许块调用(){}{}: 即匿名def:(x-y str int)的装饰器,并让:_x=arg0.x,允许省略[]{}的:,
启用bash调用赋值链,即 x_1 [1x 2].0; git help() init(); vars: n 0。 a x 2; 应被自动sed为 a=[x, 2]
为小写类型支持typefns.range.as等、让f'{x}'等于f(['', ''],x),这样就能通过库跨语言粘贴简单的逻辑
inc(0,9):(i)
i%2==0: say: f'{i} even'
Bilibili
编程简史:仓颉-最爱Shift键的语言_哔哩哔哩_bilibili
2024年6月21日,华为开发者大会上,华为首次公开发布仓颉编程语言。主打全场景、高性能、强安全以及原生智能化。这是第一个真正意义上的国产编程语言..., 视频播放量 65333、弹幕量 395、点赞数 1690、投硬币枚数 173、收藏人数 619、转发人数 195, 视频作者 织点代码, 作者简介 织个点,然后撬动星球,相关视频:【尚学堂】仓颉编程语言,仓颉零基础视频教学,从入门到精通,学习仓颉编程语言,一套就够了!,⚡️零基础入门学习「仓颉」编程语言⚡️,有了华为“仓颉”语言,就是中文编程的天下了…
#design #tool https://fixupx.com/stammy/status/1815800758199361629?s=46
https://www.freefaces.gallery/
https://motherfuckingwebsite.com/
https://keyboardsimulator.xyz/
http://interface.watch
https://www.elmo.chat/ #ai
https://github.com/bugbakery/audapolis tts
https://github.com/trholding/llama2.c/blob/master/runq.c
拒绝一切 neofetch #linux
拒绝 NV显卡,非炼丹术士,用不上
拒绝一切 lib32 ( 禁用 multilib ),所以咱和 wine 八字不合
拒绝一切 拖家带口的软件,相比直接安装 shellcheck 会带上一大堆 haskell ,我更喜欢直接去 GitHub 拿二进制文件来用
话说 AUR 源和 homebrew 类似,提供的是食谱,是 midi,不是 wav,不是 bin
所以清华 TUNA 放弃 AUR 没啥问题,反正真正阻止你用 AUR 的是开盲盒般的 GitHub 访问体验
Arch 实际上体验成本不高,archinstall 已经非常可用了,不过在愉快地设置安装前推荐去 /etc/pacman.d/mirrorlist 里把国外源都干掉,国内源留一两个 https 的就足够
pacman 一开始接触会觉得非常反人类
常用的首字母就俩 :
S 从网上
Q 从本地
后面就可以开始叠 buff 了 :
i 列出包信息
y 更新缓存
l 列出包文件
s 找包
还有俩特殊的 :
Rs 删 Rd 忽略依赖地删
F 通过文件找包 Fy 前文 + 更新缓存
炸 grub 不怕,因为压根不用 grub
systemd 的魔爪已经
用 systemd-boot 取代了 grub
用 systemd-networkd 取代了 NetworkManager
grub 引导挂了从启动盘启动,按 gentoo 方法把系统挂上,重新 grub-install 一下问题就解决了
https://tttttt.me/kotlin_cn/110568 #故事会
https://www.freefaces.gallery/
https://motherfuckingwebsite.com/
https://keyboardsimulator.xyz/
http://interface.watch
https://www.elmo.chat/ #ai
https://github.com/bugbakery/audapolis tts
https://github.com/trholding/llama2.c/blob/master/runq.c
拒绝一切 neofetch #linux
拒绝 NV显卡,非炼丹术士,用不上
拒绝一切 lib32 ( 禁用 multilib ),所以咱和 wine 八字不合
拒绝一切 拖家带口的软件,相比直接安装 shellcheck 会带上一大堆 haskell ,我更喜欢直接去 GitHub 拿二进制文件来用
话说 AUR 源和 homebrew 类似,提供的是食谱,是 midi,不是 wav,不是 bin
所以清华 TUNA 放弃 AUR 没啥问题,反正真正阻止你用 AUR 的是开盲盒般的 GitHub 访问体验
Arch 实际上体验成本不高,archinstall 已经非常可用了,不过在愉快地设置安装前推荐去 /etc/pacman.d/mirrorlist 里把国外源都干掉,国内源留一两个 https 的就足够
pacman 一开始接触会觉得非常反人类
常用的首字母就俩 :
S 从网上
Q 从本地
后面就可以开始叠 buff 了 :
i 列出包信息
y 更新缓存
l 列出包文件
s 找包
还有俩特殊的 :
Rs 删 Rd 忽略依赖地删
F 通过文件找包 Fy 前文 + 更新缓存
炸 grub 不怕,因为压根不用 grub
systemd 的魔爪已经
用 systemd-boot 取代了 grub
用 systemd-networkd 取代了 NetworkManager
grub 引导挂了从启动盘启动,按 gentoo 方法把系统挂上,重新 grub-install 一下问题就解决了
https://tttttt.me/kotlin_cn/110568 #故事会
FxTwitter / FixupX
Stammy (@Stammy)
now this is a side project
dnaugsuz
https://tttttt.me/hyi0618/3476?comment=1182 突然想吐槽一句🌝 我要是尊重业界这群自以为专业,动辄几十k代码堆砌出「劳动成果」的魔法师 尊重这些搞笑的过度工程、这些空有篇幅,而无功能点的大class 谁去尊重那些不断被强制更新,软件体积耗电量不断翻倍,功能却越来越卡、慢的用户? 谁去为新程序员踩的坑熬的夜买单? 谁去为谦卑的Pythonic、和WebAPIs的正确道路添砖加瓦? > 你会买百公里耗油100升,甚至1000升的汽车吗?在软件行业,业界一直这么做。 > …
#statement os #design
程序员为了教条规范放弃常识,就是最大的形式主义。
幸亏我学了元编程,不必被那些文字游戏所蒙蔽,可以有自己的心智模型。
只要穷举了「设计模式」们的Reason,就能跳过所有空洞的抽象,稍加设计,代码结构才能直观反映用户的视角。
如果,我没有遇见Prolog(https://tomstu.art/hello-declarative-world)和numpy、没有对C ABI和lisp的认识、不会写解释器和DSL,不能将协程/Reactive/OOP等“新框架”与C语言的旧需求对比着看,我肯定要被业界不沾边的教条主义牵着走。
“优雅的程序与它读写的数据,在结构上直观对应——Daniel Friedman”
从前后端到终端,从红黑树到递归和DP.. 有哪种代码不需要拆分业务逻辑、计算各色的数据?无非是晦涩或明确、重复或简洁、充满机翻感或编程如写诗。
富有语意的代码,“免费”的序列化与各种绑定..注入..的魔法,在lisp的时代就已经初具雏形。
别忘了对象树与GC、靠lambda隐藏部分参数的这个概念,就是他们的首创。 Javaer设计了那么多模式,很少有Visitor,ProxyDelegate 这样能跨语言保持一致的东西;然而60年前的函数式操作符,所有主流语言里竟然都是一个样!
部分程序员弄出来的私货,终究是暂时的闪烁,只有纯粹为语意服务的 functionals ,才能成为永久的光明。
React之流的各类“榜一”,对前人的工作有尊重吗?不幸地,沉溺于重造webkit等上游的轮子的他们,不屑于接受软件工艺的点化。
幸亏我遇到了先贤们的示例代码和优雅范式,他们对技术「自顶向下」的reasoning,才是真正与读者的平等交流,让大家能「早点休息」
而不是把对方视为copycat或翻译AI。
可怕的不是草台班子,而是你依赖的草台班子,抄袭魔改了另一堆草台班子……
如果一个人话都说不利索,讲概念难以简明扼要、一语中的,凭什么他靠写“新语言”的代码就能突破? 封问题,一定是消而不灭,照猫画虎尔,搞出更多让人头疼的坑。所以要兜售“永续学习论”“知识价值”咯..
其实,就是库的设计者一代不如一代。说是你不聪明不正经,那是在逃避编程语言的天职。
C诞生50年了,它所能实现的预处理期计算、单函数读写结构、栈参数和this变量的同构、
os级协程、将bytes重解释为"Proxy对象"如结构体的变量绑定,依然是后继寥寥, 更别说ndarray、正反函数、跨语言调用对象的这类常理化接口了,在编程界基本不存在!
Can programming be liberated from C-like OOP style? 😒 How long will it take?
https://tonsky.me/blog/centering/ #css ...
程序员为了教条规范放弃常识,就是最大的形式主义。
幸亏我学了元编程,不必被那些文字游戏所蒙蔽,可以有自己的心智模型。
只要穷举了「设计模式」们的Reason,就能跳过所有空洞的抽象,稍加设计,代码结构才能直观反映用户的视角。
如果,我没有遇见Prolog(https://tomstu.art/hello-declarative-world)和numpy、没有对C ABI和lisp的认识、不会写解释器和DSL,不能将协程/Reactive/OOP等“新框架”与C语言的旧需求对比着看,我肯定要被业界不沾边的教条主义牵着走。
“优雅的程序与它读写的数据,在结构上直观对应——Daniel Friedman”
从前后端到终端,从红黑树到递归和DP.. 有哪种代码不需要拆分业务逻辑、计算各色的数据?无非是晦涩或明确、重复或简洁、充满机翻感或编程如写诗。
富有语意的代码,“免费”的序列化与各种绑定..注入..的魔法,在lisp的时代就已经初具雏形。
别忘了对象树与GC、靠lambda隐藏部分参数的这个概念,就是他们的首创。 Javaer设计了那么多模式,很少有Visitor,ProxyDelegate 这样能跨语言保持一致的东西;然而60年前的函数式操作符,所有主流语言里竟然都是一个样!
部分程序员弄出来的私货,终究是暂时的闪烁,只有纯粹为语意服务的 functionals ,才能成为永久的光明。
React之流的各类“榜一”,对前人的工作有尊重吗?不幸地,沉溺于重造webkit等上游的轮子的他们,不屑于接受软件工艺的点化。
幸亏我遇到了先贤们的示例代码和优雅范式,他们对技术「自顶向下」的reasoning,才是真正与读者的平等交流,让大家能「早点休息」
而不是把对方视为copycat或翻译AI。
可怕的不是草台班子,而是你依赖的草台班子,抄袭魔改了另一堆草台班子……
如果一个人话都说不利索,讲概念难以简明扼要、一语中的,凭什么他靠写“新语言”的代码就能突破? 封问题,一定是消而不灭,照猫画虎尔,搞出更多让人头疼的坑。所以要兜售“永续学习论”“知识价值”咯..
其实,就是库的设计者一代不如一代。说是你不聪明不正经,那是在逃避编程语言的天职。
C诞生50年了,它所能实现的预处理期计算、单函数读写结构、栈参数和this变量的同构、
os级协程、将bytes重解释为"Proxy对象"如结构体的变量绑定,依然是后继寥寥, 更别说ndarray、正反函数、跨语言调用对象的这类常理化接口了,在编程界基本不存在!
Can programming be liberated from C-like OOP style? 😒 How long will it take?
https://tonsky.me/blog/centering/ #css ...
tonsky.me
Hardest Problem in Computer Science: Centering Things
Somehow we forgot how to center rectangles and must find our way back
duangsuse::Echo
#security 回顾 regreSSHion: RCE in OpenSSH server<9.8 https://www.bilibili.com/video/BV11U411U78q 这一漏洞的描述听起来像是 WannaCry(SMB) 和 Log4Shell 级别的。实际上,该漏洞的利用不太可能。 2014年,OpenSSL加密库中的一个缓冲区溢出漏洞被公开。该缺陷被称为“心脏出血”,这次是它的回归 由glibc free() 数据竞争,导致heap链表 use-after-free 而使得glibc…
#os #design 作为编程语言爱好者,谈谈RCE这些bug的根源吧: 程序员没做错, Dennis Ritchie 们错了 😅
为什么“溢出”基本上是C的专属呢?因为老冯的时代,“汇编器是在浪费 CPU cycle” 这种反人性的设计,被推崇为《程序员的自我修养》 (x86汇编的应用与骇客少,不讨论单片机界的情况) #recommend
就像JS人不懂
初学C的人很奇怪为啥 1+1 可以而 "a"+"b" 却不行(还必须 strcat 或 sprintf), 'a'+'a' 更是居然==194!厘清
不过,随着对 x=1; (X==1) 以及从0开始数
但我们先回到"基础类型"。C的 struct,union,[] 是有严重安全隐患的,「这只是性能的牺牲品」?
#rust 已经告诉我们 redox-os.org/ 这样复杂的系统也能默认内存安全, Python 则证明了仅仅靠运算符重载、Rc<T> 这样幼稚的引用计数,就能组装出了不起的AI应用
struct{} 的问题是“地址相关性”。就为了与x86的一些硬件地址对接(1% cases),C让一切数据类型都与 bytes(char*) 直接对应,以便映射到某个内存页位置、通过
(alloc相当于单实例版的现代
这就造成了 memleak, segfault(空指针和类型错误的cast, 例如把小结构cast成大结构) 甚至 "更适合C语言体制的SQL注入"
这里说的,就是子类型里的
并且,哪怕你能够通过一些信息压缩掉int Tag ,用
比如,为什么ES6要推荐一个“凑字数”的 const x= 而不是 let+let mut x? 为啥 Java 到处都是 public final 🔘 Str wtf() ?
你可能是第一次意识到“subtyping” 保存着type tag,但这些真的是编程里的基础(你设计任何"前后端"时都应该考虑的),或许,只是在像XML那样复杂的上层框架里这并不直观。
C99(ISO9899,P61)甚至专门定义了“退化到指针” 和'\0'结尾字符串的行为-它还好意思把这当特性! gcc 实现了常量区间的越界检查,这是说谎:
gcc的"静态检查"只是对stdlib的缺陷涂脂抹粉,并没有消除过度追求低内存,所带来的隐患
并且,只要区分定义
连Ruby 💎和WebKit的作者们都知道可以这样("污点值" taint 和 TrustedTypes),今天有人称其为 contract{}.. 也行吧
然而,即便有了OS的ASLR/Nx保护,stack/heap overflow 今天还是个问题。如果你写
所以
与for和if 对应的数据结构!!它们的重要性无需多言: 如果数据能随意纂改,fn{} 这些代码块、甚至只是算式 的正确语意就无法得到保障。
至少你还能庆幸,与 main(..) 等调用对应的
OOP只不过是把C的病态类型修了一修,它自己还有“读json都要搞反射,但Class对象被认为性能低”所造成的一堆问题
log4j 们是把bug的产生从“代码的语法” “内存结构的语法”往上提高了一层,并没有消灭问题。 能消灭问题的,恐怕只有少写代码,多思考吧。
从某种意义上,缓冲区溢出、反射低性能、线程(ret2调用栈)与 async(ret2回应函数)间的鸿沟,都是『两种语言问题』,即C,Java,JS 这样的语言为了解决框架们的需求
它们原来的心智模型,无法跨越 编译期/运行期、 堆内存/栈内存/json、本机/远程、可信数据/需验证数据,甚至仅仅是 正确/错误 (Object/Error和null) 而一致地存在,就产生了许多需要学习的class libs,以及与它们的宣传不相称的复杂性和log4j那种bug
我最近在设计的逻辑式编程范式,就是为了从心智模型的层面统一这所有的『两种语言」。 祝我成功吧 🌚
实际上呢, linux 这些内核所提供的虚拟内存段(vma https://tttttt.me/dsuse/19844) 实现,通过把内存解释为对象图,这种4K页隔离也完全能删掉, ELF, SHM, CRIU.org 那些高深的结构也就会和普通的JVM对象(对比下"class" PATH?)、多线程、序列化 一样朴素
因为C会和WASM那样安全,没有驱动程序的“引用”,就不能越过内核调用rm -rf 那种事情(yinwang 2013)。 所以fd,socketfd 这些“RPC对象号” 也就不必存在; 线程就只是让while(1) 每隔几千次暂停1次的协程,调度器、主循环evpoll 也可以消失。
用 eBPF 的人都知道我在说什么,现在有足够多的中间表示比x86指令集更优秀,甚至更简单,完全能从汇编上来做“虚拟化”
学内核本质上就是学"4件套",而这4项任何一个普通极客都有所认识: 👀
byte format: ELF,EXT4,boot process(cpio), .. 这是用户最关心的: exe,so,apk 互不兼容,尽管他们的系统“一样高级”,C盘D盘容量一大一小,哪怕你的SSD是512G的
net: AP, Bluetooth Peering, tcp实现, 自然需要多线程和管道, 要考虑"异步" 也就是回调地狱的解决;最重要的是,Web的API和格式(FTP..)是超越运行时差异的存在,它比加了私货的SDK文档更能体现问题的本质
usb: hid键鼠触摇, hdi显示与摄像, 声音, ACPI SMART, 各种传感器.. 或许它们的“设备总线”不是USB,但我们只关心硬件的性能 而非接口!
vm:
不过编程本身是无关于计算机的,就像天文无关于望远镜。
“编程赞歌是组合搭配的赞歌,框架伟大是拆分置换的伟大。代码是流动的数据,内存是暂停的程序——感想”
为什么“溢出”基本上是C的专属呢?因为老冯的时代,“汇编器是在浪费 CPU cycle” 这种反人性的设计,被推崇为《程序员的自我修养》 (x86汇编的应用与骇客少,不讨论单片机界的情况) #recommend
就像JS人不懂
1+"1", 1-"1"
为啥会不同,初学C的人很奇怪为啥 1+1 可以而 "a"+"b" 却不行(还必须 strcat 或 sprintf), 'a'+'a' 更是居然==194!厘清
return struct{}
与*alloc、class Reader{}与UTF16编码,以及它们在C++的平替,就需要更久了不过,随着对 x=1; (X==1) 以及从0开始数
for(i=0) use(a[i])
的区分,常量级语法和"基础类型" 就不再是问题,转而学习函数对象、链表、fopen()、KV 这些有语意的类型了但我们先回到"基础类型"。C的 struct,union,[] 是有严重安全隐患的,「这只是性能的牺牲品」?
#rust 已经告诉我们 redox-os.org/ 这样复杂的系统也能默认内存安全, Python 则证明了仅仅靠运算符重载、Rc<T> 这样幼稚的引用计数,就能组装出了不起的AI应用
struct{} 的问题是“地址相关性”。就为了与x86的一些硬件地址对接(1% cases),C让一切数据类型都与 bytes(char*) 直接对应,以便映射到某个内存页位置、通过
malloc(N) free(obj)
链表来瓜分glibc mmap(brk)到的进程内存(alloc相当于单实例版的现代
memScoped{}
即 zig ArenaAllocator 。C的"弱类型"设计错误有多深远?直到2004 Linux 2.6.8 才支持Nx 即heap默认不可执行的"保护"..)这就造成了 memleak, segfault(空指针和类型错误的cast, 例如把小结构cast成大结构) 甚至 "更适合C语言体制的SQL注入"
这里说的,就是子类型里的
Animal() as Duck, Rect(1,2) as Square
,要么是表格验证的语意错误,要么从语法上就不该对struct Animal {
enum Tag{Duck,Cat}
union v {
struct Duck{int beck} //实现上会移到外部且把继承的项前置(便于在Animal{}外扩充),以及有virtual vs final 的虚表双指针,顺便用于实现闭包
}
}
并且,哪怕你能够通过一些信息压缩掉int Tag ,用
rawtypeof<Animal> xx; xx(1).beck
也比默认强转好太多了。 "默认行为"的重要性被严重轻视了比如,为什么ES6要推荐一个“凑字数”的 const x= 而不是 let+let mut x? 为啥 Java 到处都是 public final 🔘 Str wtf() ?
你可能是第一次意识到“subtyping” 保存着type tag,但这些真的是编程里的基础(你设计任何"前后端"时都应该考虑的),或许,只是在像XML那样复杂的上层框架里这并不直观。
int a[]={1,2};
这样的“数组”,它的长度只能用静态的sizeof得知,也就是 a[N]
里N必须是个常数,对它的求值才是安全的。C99(ISO9899,P61)甚至专门定义了“退化到指针” 和'\0'结尾字符串的行为-它还好意思把这当特性! gcc 实现了常量区间的越界检查,这是说谎:
range(A=0,B)
类型的缺失从一开始就是个错误。实际上,2int=1long ,区间slice有的内存开销,与它能带来的软件安全是不成比例的。gcc的"静态检查"只是对stdlib的缺陷涂脂抹粉,并没有消除过度追求低内存,所带来的隐患
并且,只要区分定义
a[int32_t], a[index_t]
的实现,对后者只定义一些编译期检查(private constructor),就既安全又高效。连Ruby 💎和WebKit的作者们都知道可以这样("污点值" taint 和 TrustedTypes),今天有人称其为 contract{}.. 也行吧
然而,即便有了OS的ASLR/Nx保护,stack/heap overflow 今天还是个问题。如果你写
sprintf(buf, "%d",0)
编译器会提醒你改用 sprintf_s
或cout,sstream<<所以
main(int narg, char** aarg){}
用什么替换? main(vector<str>)
吗? 恭喜你重新发明了“很慢的” Python,只是还没有它好用与for和if 对应的数据结构!!它们的重要性无需多言: 如果数据能随意纂改,fn{} 这些代码块、甚至只是算式 的正确语意就无法得到保障。
至少你还能庆幸,与 main(..) 等调用对应的
cli_args a0={.raw = new string[]{"/bin/echo",}}
"构造器"只是不太好写🥰,没有RCE那么严重的缺陷 OOP只不过是把C的病态类型修了一修,它自己还有“读json都要搞反射,但Class对象被认为性能低”所造成的一堆问题
log4j 们是把bug的产生从“代码的语法” “内存结构的语法”往上提高了一层,并没有消灭问题。 能消灭问题的,恐怕只有少写代码,多思考吧。
从某种意义上,缓冲区溢出、反射低性能、线程(ret2调用栈)与 async(ret2回应函数)间的鸿沟,都是『两种语言问题』,即C,Java,JS 这样的语言为了解决框架们的需求
它们原来的心智模型,无法跨越 编译期/运行期、 堆内存/栈内存/json、本机/远程、可信数据/需验证数据,甚至仅仅是 正确/错误 (Object/Error和null) 而一致地存在,就产生了许多需要学习的class libs,以及与它们的宣传不相称的复杂性和log4j那种bug
我最近在设计的逻辑式编程范式,就是为了从心智模型的层面统一这所有的『两种语言」。 祝我成功吧 🌚
实际上呢, linux 这些内核所提供的虚拟内存段(vma https://tttttt.me/dsuse/19844) 实现,通过把内存解释为对象图,这种4K页隔离也完全能删掉, ELF, SHM, CRIU.org 那些高深的结构也就会和普通的JVM对象(对比下"class" PATH?)、多线程、序列化 一样朴素
因为C会和WASM那样安全,没有驱动程序的“引用”,就不能越过内核调用rm -rf 那种事情(yinwang 2013)。 所以fd,socketfd 这些“RPC对象号” 也就不必存在; 线程就只是让while(1) 每隔几千次暂停1次的协程,调度器、主循环evpoll 也可以消失。
用 eBPF 的人都知道我在说什么,现在有足够多的中间表示比x86指令集更优秀,甚至更简单,完全能从汇编上来做“虚拟化”
学内核本质上就是学"4件套",而这4项任何一个普通极客都有所认识: 👀
byte format: ELF,EXT4,boot process(cpio), .. 这是用户最关心的: exe,so,apk 互不兼容,尽管他们的系统“一样高级”,C盘D盘容量一大一小,哪怕你的SSD是512G的
net: AP, Bluetooth Peering, tcp实现, 自然需要多线程和管道, 要考虑"异步" 也就是回调地狱的解决;最重要的是,Web的API和格式(FTP..)是超越运行时差异的存在,它比加了私货的SDK文档更能体现问题的本质
usb: hid键鼠触摇, hdi显示与摄像, 声音, ACPI SMART, 各种传感器.. 或许它们的“设备总线”不是USB,但我们只关心硬件的性能 而非接口!
vm:
内存和CPU的分时复用
,按上面的说法,这是专门为掩饰C语言的缺陷所设计的。 难道Linux所提供的功能,比JS靠WebKit能利用的还多吗?为什么vscode只需要单线程,一些服务却总爱“加塞”,这其实就是C语言没办法“注册回调闭包” 导致的卡线程与线程池优化.. 全是与IO的业务逻辑无关的东西!不过编程本身是无关于计算机的,就像天文无关于望远镜。
“编程赞歌是组合搭配的赞歌,框架伟大是拆分置换的伟大。代码是流动的数据,内存是暂停的程序——感想”
www.redox-os.org
Redox - Your Next(Gen) OS - Redox - Your Next(Gen) OS
The Redox official website
❤3
#linux #design #statement
最近在设计OSon(一个基于JSON的类lisp计算图语言) 的一种强类型根rootfs 标准,打算用cbor(json zip),flatbuf 作为sysfs和etc的标准编码,它们的标准很简洁, cbor甚至只用0b111(7)种情况编码了可变结构
https://cstriker1407.info/blog/cbor-simple-note/
https://flatbuffers.dev/flatbuffers_internals.html#:~:text=scalar%20data%20is%20stored%20with%20a%20variable
这对JS是有用的,因为要搞 await uu.com.google 即 //com/google //$http//google ,也要想办法修改各种语言作为shell,像 coreutil.cat(/txt/a) 什么的
幸运的是,http和本地文件类型(MIME Content&file magics) 普遍被程序员尊重 👍,让网络和本地路径、音视频等格式的API统一化不太难,我只添加environ.T_PATH='array' /sys/T/*.flat,ALL.py 两个和一些util就能完成
不过我要吐槽一下UNIX的多用户和权限: 这根本就是废物,就像 ls -l 里跟在mug(drwx--- root root) 后的硬链接数一样。
就连UNIX自己的 /lib 也不用硬链模式,也包括 /sbin 不是su, /usr 不是user..
实际上,硬链接只是 protected Rc<inode> nlink; 而已,对任何UNIX外的文件系统都无用,是实现细节!然而tar;cpio 都包含了类似的变量,真不知道照着文件管理器画瓢为啥那么难
绝大部分情况下,UNIX是“双用户模式”:PID1(root)+UID 1k(wheel) ,最多加个普通用户做后台服务 😄
UNIX的“先知们” 则是幻想着youtube集群该调用 useradd 去创建数据库用户,或是让http跟着unix的属主属组鉴权…… 然而,它只留下了 chmod +x
http ftp 没人这么玩,甚至http都被 {code:,msg:} 篡了。Windows的公共/本地视频文件夹 被xdg抄过来了,但只有前面一半,所以Linux的安全只是区分root么?
$ id 会显示用户和组——基本上gid==uid,就像进程组和多线程,用 strace echo 你会发现调用的是 exit_group(0) ——所以设计exit是干什么?
syscall 这些东西倒无所谓(libc,msvc 都被Python.NET淘汰了),groups 我是要用docker容器名换掉了。 实际上,即便如此,组的权限也没有用处
HOME/视频 现在分为 ./my.v/ ./.prot.v/; 除了 .{local/bin,etc} 等隐藏文件外都是public
这样UNIX的用户/组和权限就都有意义了: 用户=app, 组=依赖的服务。 对于uid<1000 的容器可以自动支持setcap httpd 什么的
//{sys用以支持引导和PATH里的CLI/API/UI, dev编程虚拟设备(系统级ffmpeg支持),v服务(根目录叠加层sndo),etc配置,UID/家目录}/ 运行时五项堆叠
整个内核只隔离两个地址空间: app+Chrome等解释器 在受管, Apache等可信ELF+WASMbpf等解释器+驱动+调度/分配器 在Ring0
整个系统只使用四个权限: //USER/*/.{*,prot.*} 是711和771 其他不含//sys/bin,lib64是777,反正也会被容器随便覆盖掉。
"可执行权"其实已经被setcap位细分好了,SUID这些trick被用于决定是否可信
- 任何对sys,dev,etc的读写总是允许的,只是有不可见项且限制于shell,要用 sndo -U 应用到用户
- v,HOME照常鉴权,只是照上表弱化UNIX的文件本位
大家都知道,对于OS这样历史悠久的app,ancestors' evil 真的不可修复,也有些人吐槽mp4编码容器设计得很烂,webp压缩率很好,但小白只知道mp4和png
不过,假定有JetBrains或荷兰人那样的技术,实现 kt=javaAPI, java->kt; py3=2, py2to3 的前后兼容虽然麻烦,但也是可能的 😅
//$http/ 被设计为实现URI的另一种字面,不与URL冲突(href=//example.org/ 总是带点),可以借助浏览器和编译器插件实现
不过 /txt/a ./HOME //sys 这是与旧格式混淆的,但它们仍然比(ls -a 只添加俩 . ..)优雅。URL似乎不需要./
很少人知道 overlayfs(Dockers) 的功能甚至是Linux自带的:
https://github.com/openthos/printer-analysis/blob/master/移植/PRoot一种用户态chroot实现简介.md
最近在设计OSon(一个基于JSON的类lisp计算图语言) 的一种强类型根rootfs 标准,打算用cbor(json zip),flatbuf 作为sysfs和etc的标准编码,它们的标准很简洁, cbor甚至只用0b111(7)种情况编码了可变结构
https://cstriker1407.info/blog/cbor-simple-note/
https://flatbuffers.dev/flatbuffers_internals.html#:~:text=scalar%20data%20is%20stored%20with%20a%20variable
这对JS是有用的,因为要搞 await uu.com.google 即 //com/google //$http//google ,也要想办法修改各种语言作为shell,像 coreutil.cat(/txt/a) 什么的
//$http/info/cstriker1407/blog/cbor-simple-note/
上面的链接看起来就会更跨平台幸运的是,http和本地文件类型(MIME Content&file magics) 普遍被程序员尊重 👍,让网络和本地路径、音视频等格式的API统一化不太难,我只添加environ.T_PATH='array' /sys/T/*.flat,ALL.py 两个和一些util就能完成
不过我要吐槽一下UNIX的多用户和权限: 这根本就是废物,就像 ls -l 里跟在mug(drwx--- root root) 后的硬链接数一样。
就连UNIX自己的 /lib 也不用硬链模式,也包括 /sbin 不是su, /usr 不是user..
实际上,硬链接只是 protected Rc<inode> nlink; 而已,对任何UNIX外的文件系统都无用,是实现细节!然而tar;cpio 都包含了类似的变量,真不知道照着文件管理器画瓢为啥那么难
绝大部分情况下,UNIX是“双用户模式”:PID1(root)+UID 1k(wheel) ,最多加个普通用户做后台服务 😄
UNIX的“先知们” 则是幻想着youtube集群该调用 useradd 去创建数据库用户,或是让http跟着unix的属主属组鉴权…… 然而,它只留下了 chmod +x
http ftp 没人这么玩,甚至http都被 {code:,msg:} 篡了。Windows的公共/本地视频文件夹 被xdg抄过来了,但只有前面一半,所以Linux的安全只是区分root么?
$ id 会显示用户和组——基本上gid==uid,就像进程组和多线程,用 strace echo 你会发现调用的是 exit_group(0) ——所以设计exit是干什么?
syscall 这些东西倒无所谓(libc,msvc 都被Python.NET淘汰了),groups 我是要用docker容器名换掉了。 实际上,即便如此,组的权限也没有用处
HOME/视频 现在分为 ./my.v/ ./.prot.v/; 除了 .{local/bin,etc} 等隐藏文件外都是public
这样UNIX的用户/组和权限就都有意义了: 用户=app, 组=依赖的服务。 对于uid<1000 的容器可以自动支持setcap httpd 什么的
/a pwd路径
/blk/a pwd字节(均覆盖无扩展名情况)
///google 网络路径,基于HTTP类型和编码
//$http/com/google 完整URI
./{my,prot}.[agevzmM]/
用户,小组的 a音频 g图像 e文档 v视频 z下载和压缩 m项目 M设计和3D 。自动带有.前缀//{sys用以支持引导和PATH里的CLI/API/UI, dev编程虚拟设备(系统级ffmpeg支持),v服务(根目录叠加层sndo),etc配置,UID/家目录}/ 运行时五项堆叠
整个内核只隔离两个地址空间: app+Chrome等解释器 在受管, Apache等可信ELF+WASMbpf等解释器+驱动+调度/分配器 在Ring0
整个系统只使用四个权限: //USER/*/.{*,prot.*} 是711和771 其他不含//sys/bin,lib64是777,反正也会被容器随便覆盖掉。
"可执行权"其实已经被setcap位细分好了,SUID这些trick被用于决定是否可信
- 任何对sys,dev,etc的读写总是允许的,只是有不可见项且限制于shell,要用 sndo -U 应用到用户
- v,HOME照常鉴权,只是照上表弱化UNIX的文件本位
大家都知道,对于OS这样历史悠久的app,ancestors' evil 真的不可修复,也有些人吐槽mp4编码容器设计得很烂,webp压缩率很好,但小白只知道mp4和png
不过,假定有JetBrains或荷兰人那样的技术,实现 kt=javaAPI, java->kt; py3=2, py2to3 的前后兼容虽然麻烦,但也是可能的 😅
//$http/ 被设计为实现URI的另一种字面,不与URL冲突(href=//example.org/ 总是带点),可以借助浏览器和编译器插件实现
不过 /txt/a ./HOME //sys 这是与旧格式混淆的,但它们仍然比(ls -a 只添加俩 . ..)优雅。URL似乎不需要./
很少人知道 overlayfs(Dockers) 的功能甚至是Linux自带的:
https://github.com/openthos/printer-analysis/blob/master/移植/PRoot一种用户态chroot实现简介.md
cstriker1407.info
【转】物联网专用数据交换格式CBOR | cstriker1407的笔记本
本文转自【 https://www.jianshu.com/p/76adec5e61f8 】,有删改
duangsuse::Echo
#linux #design #statement 最近在设计OSon(一个基于JSON的类lisp计算图语言) 的一种强类型根rootfs 标准,打算用cbor(json zip),flatbuf 作为sysfs和etc的标准编码,它们的标准很简洁, cbor甚至只用0b111(7)种情况编码了可变结构 https://cstriker1407.info/blog/cbor-simple-note/ https://flatbuffers.dev/flatbuffers_internals.html#…
https://blog.csdn.net/dog250/article/details/100998838 #net #os #design
POSIX 中实际上有3种类型的文件: hex=block=buffer读写, ktty=char=内核终端文件, ptty=基于pid的终端文件, syn=socket=分pid/fd生成的文件
分别用于管理磁盘和内存(/dev/mem)、kmodule(ioctls)、虚拟终端(就是有width的,能控速的hex, $ stty)、socket(tcp/udp)
“一切皆文件”和其它的原则比如“组合小程序”等是相辅相成的。如果“一切皆文件”被破坏,那么便很难简单串接小程序实现复杂逻辑
socket没有标准文件的open和close操作,不能cat一个socket,也没法向一个socket里echo数据。因此就出现了socat,netcat这种大家都说好,但实际上没有必要的微型网络程序。
系统内核,其实就是会用MMU 4K页表保护自己的libc。
这就像,js要用 eval() import PATH 里的模块对象,同时需要沙箱技巧(setInterval..) 保证自身的设备和CPU不被独占
但因为C的代码都是unsafe{}, 需要用一种丑陋的方法隔离"syscall, ioctl" 这些类似于HTTP的调用,不能像WASM那样,内核和PATH里的代码存在一个地方。
你们可能听说过 gopkg/mvn 和 goroutine/jvm线程 ,那就是safe的PATH/函数对象和线程(池)调度器,这些虚拟机都有等同于操作系统的功能
而且更快速,例如, Looper() 调度不同的 ()=>函数 不需要保存和恢复>4K调用栈, 仅仅=闭包.call(返回地址在回调里)
这也是为什么有libuv这些东西
POSIX 中实际上有3种类型的文件: hex=block=buffer读写, ktty=char=内核终端文件, ptty=基于pid的终端文件, syn=socket=分pid/fd生成的文件
分别用于管理磁盘和内存(/dev/mem)、kmodule(ioctls)、虚拟终端(就是有width的,能控速的hex, $ stty)、socket(tcp/udp)
“一切皆文件”和其它的原则比如“组合小程序”等是相辅相成的。如果“一切皆文件”被破坏,那么便很难简单串接小程序实现复杂逻辑
socket没有标准文件的open和close操作,不能cat一个socket,也没法向一个socket里echo数据。因此就出现了socat,netcat这种大家都说好,但实际上没有必要的微型网络程序。
系统内核,其实就是会用MMU 4K页表保护自己的libc。
这就像,js要用 eval() import PATH 里的模块对象,同时需要沙箱技巧(setInterval..) 保证自身的设备和CPU不被独占
但因为C的代码都是unsafe{}, 需要用一种丑陋的方法隔离"syscall, ioctl" 这些类似于HTTP的调用,不能像WASM那样,内核和PATH里的代码存在一个地方。
你们可能听说过 gopkg/mvn 和 goroutine/jvm线程 ,那就是safe的PATH/函数对象和线程(池)调度器,这些虚拟机都有等同于操作系统的功能
而且更快速,例如, Looper() 调度不同的 ()=>函数 不需要保存和恢复>4K调用栈, 仅仅=闭包.call(返回地址在回调里)
这也是为什么有libuv这些东西
blog.csdn.net
Linux socket文件系统体现“一切皆文件”-CSDN博客
文章浏览阅读1.3w次,点赞12次,收藏46次。来自《实例演绎Unix/Linux的"一切皆文件"思想》大家习惯了使用socket来编写网络程序,socket是网络编程事实上的标准。我们知道,在Unix/Linux系统中“一切皆文件”,socket也被认为是一种文件,socket被表示成文件描述符。但socket的行为并不很像文件。比如:无法用 “open一个路径” 的方式打开一个socket,必须用socket系统调用来创建。文件..._linux socket文件
#design #dontknow
https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/
Dijkstra: 在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始?
为了表示区间 i=2 3 .. 12 可以写
a. 2 ≤ i < 13
b. 1 < i ≤ 12
c. 2 ≤ i ≤ 12
d. 1 ≤ i ≤ 13
哪个更适合作为标准?看一致性!
i=1..<12 的差正好是长度,也就是说,这样区间的列表正好能描述代码高亮,省得去算 A+1 ≤ i ≤ B
不过, i=0<..1 的差也是长度,但那样 range(3) 和 my_list[:3] 的长度就不直观了
C里,a[0]=*(a+0); a[rand()%n(a)] 用于选随机数-- (x%n)<n ; a.index(x) 没找到时是-1,正好能 suffix(s:="a.txt",x:="."); s[s.index(x)+1:]
(s[0:i], s[i:]) 更是能二分一个字符串
既然如此!为什么我要从1开始数? 因为常识。
假设你没学过编程,哪个更自然?
无论区间还是分割,都应当用专门的类型描述,典型的用例就是LRC/VTT字幕(二者的区别是lrc字幕时长可以不写)
如果用Range建模lrc文件,恐怕会很生硬
https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/
Dijkstra: 在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始?
为了表示区间 i=2 3 .. 12 可以写
a. 2 ≤ i < 13
b. 1 < i ≤ 12
c. 2 ≤ i ≤ 12
d. 1 ≤ i ≤ 13
哪个更适合作为标准?看一致性!
i=1..<12 的差正好是长度,也就是说,这样区间的列表正好能描述代码高亮,省得去算 A+1 ≤ i ≤ B
不过, i=0<..1 的差也是长度,但那样 range(3) 和 my_list[:3] 的长度就不直观了
C里,a[0]=*(a+0); a[rand()%n(a)] 用于选随机数-- (x%n)<n ; a.index(x) 没找到时是-1,正好能 suffix(s:="a.txt",x:="."); s[s.index(x)+1:]
(s[0:i], s[i:]) 更是能二分一个字符串
既然如此!为什么我要从1开始数? 因为常识。
-a [1 2 3]
(a first) == a#1
a#1 + a#2 == 3
a#1~2
a (inc 1 -2): (i) a#i
a=[1 2 3]
a.first == a.0
a.0 + a.1 == 3
a.(1~1)
inc(1, a.iLast-1): (i) a.i
let a = [1, 2, 3]
a.first == a[0]
a[0] + a[1] == 3
a[0:1]
a[0:-1]
假设你没学过编程,哪个更自然?
无论区间还是分割,都应当用专门的类型描述,典型的用例就是LRC/VTT字幕(二者的区别是lrc字幕时长可以不写)
如果用Range建模lrc文件,恐怕会很生硬
Docle の Blog
Why Numbering Should Start At Zero
前言在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始?如果这是惯例,为什么不是其他的惯例呢?Edsger W. Dijkstra 教授的这个小备忘录也许可以解开我们的疑惑。 原文链接:http://www.cs.utexas.edu/users/EWD/transcriptions/EWD08xx/EWD831.html 译文为
duangsuse::Echo
#design #dontknow https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/ Dijkstra: 在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始? 为了表示区间 i=2 3 .. 12 可以写 a. 2 ≤ i < 13 b. 1 < i ≤ 12 c. 2 ≤ i ≤ 12 d. 1 ≤ i ≤ 13 哪个更适合作为标准?看一致性!…
#design 为什么不该是从 0 开始?
这些基于数组区间的理由都对,但更具说服力的 ,恐怕是序号i的自身
数组
但这一点暴露了更大的不对称: 没有 -0、无法用0(NULL)代表无效项 🤗
CS还有自己的约定俗成:
其实该返回NaN吧,可惜int没有null值
综上,我认为1-index更适合app和数理化的语境,0-index只是C和算法八股文留下的负资产
嘛嘛,对于forEach也写
在70% FP模式匹配/列表查询上,下标这个概念都不存在。C数组要实现SQL查询又该多难?
这些基于数组区间的理由都对,但更具说服力的 ,恐怕是序号i的自身
数组
a[0]= *(a+0)
用在URL上,那就是 blog blog1 blog2.. 显然比 blog blog2 blog3 更合理,不需要一开始就知道blog名重复,再比如playlist/0 就代表从项#1开始放 而不显示整体但这一点暴露了更大的不对称: 没有 -0、无法用0(NULL)代表无效项 🤗
py[-1]=a[len(a)-1]
已经广为接受了,上条里甚至滥用find+1做了取后缀和随机,那么,凭什么 a[0:]=a 而 a[:-1]!=a
? range不能是slice?a#1~-1, [a#1, *a#2~-2, a#-1]
大概比 a[0:len(a)], [a[0], *a[1:-1], a[-1]]
对称吧? 这可是0-index最擅长表达的“首尾相接子序列”啊?CS还有自己的约定俗成:
[0].indexOf(1)==-1
,你们有没有想过,为啥pid0,uid0,fd0 都是NULL,唯独列表的404是-1 ? 其实该返回NaN吧,可惜int没有null值
综上,我认为1-index更适合app和数理化的语境,0-index只是C和算法八股文留下的负资产
嘛嘛,对于forEach也写
for(i=;i<;i++)if..
样板的人来说,以上优雅性大概无关紧要。在70% FP模式匹配/列表查询上,下标这个概念都不存在。C数组要实现SQL查询又该多难?
https://nolebase.ayaka.io/笔记/🐔%20免费浪漫/什么是适合ADHD的工作?.html #dalao blog #design 布局很不错
#tool jsoncanvas 有很多UML,chart 的示例 https://mermaid.live/
#tool jsoncanvas 有很多UML,chart 的示例 https://mermaid.live/
Nólëbase
欢迎来到小音和猫猫的知识库 Nólëbase,这里是 📒 笔记分区 很高兴你对 Nólëbase 感兴趣! 首先 Nólëbase 是完全可以在本地无网络环境的情况下使用的!你可以在跟随如何下载到本地的指引下载或者克隆之后使用 Obsidian 和 Logseq 这样的知识库软件打开,也可以用 Typora 这样的 Markdown 编辑器打开进行浏览和编辑,这意味着即便你不具备任何的编程技能,...
https://github.com/tuteng/Best-websites-a-programmer-should-visit-zh?tab=readme-ov-file#针对那些想开始一个小的项目但是无从下手的人
#tool awesome list
#dev #learn 公案 zen 入门 https://github.com/ts25504/awesome-koans#:~:text=编程语言的学习也有一种公案形式的学习方法,是我见过的最好的学习一门新的编程语言的方式
重构浣熊 🐿收录的10种流行 #OOP Design Pattern 掩盖了哪些语言特性的缺失 ?
https://refactoring.guru/refactoring/when
https://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html
#web #design 推荐 https://component-party.dev/
https://github.com/RimoChan/match-you/blob/slave/mother.kt :偷偷发给同事启动,他电脑上装好的依赖就会被删掉,然后他就得自己配环境了!..
#tool awesome list
#dev #learn 公案 zen 入门 https://github.com/ts25504/awesome-koans#:~:text=编程语言的学习也有一种公案形式的学习方法,是我见过的最好的学习一门新的编程语言的方式
重构浣熊 🐿收录的10种流行 #OOP Design Pattern 掩盖了哪些语言特性的缺失 ?
https://refactoring.guru/refactoring/when
https://www.ruanyifeng.com/blog/2017/02/fp-tutorial.html
#web #design 推荐 https://component-party.dev/
https://github.com/RimoChan/match-you/blob/slave/mother.kt :偷偷发给同事启动,他电脑上装好的依赖就会被删掉,然后他就得自己配环境了!..
GitHub
GitHub - tuteng/Best-websites-a-programmer-should-visit-zh: 程序员应该访问的最佳网站中文版
程序员应该访问的最佳网站中文版. Contribute to tuteng/Best-websites-a-programmer-should-visit-zh development by creating an account on GitHub.
最近设计一种跨语言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的思路是正确的
作者是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
https://github.com/ibraheemdev/modern-unix #tool #rust
#bash #linux #design https://www.micahlerner.com/2021/07/14/unix-shell-programming-the-next-50-years.html
三篇关于强类型IO的博文
和我的想法撞车了, 但我有信心在API设计上超过他们 😊
#bash #linux #design https://www.micahlerner.com/2021/07/14/unix-shell-programming-the-next-50-years.html
三篇关于强类型IO的博文
和我的想法撞车了, 但我有信心在API设计上超过他们 😊
层叠 - The Cascading
Telegram 发布了 Direct Messages for Channels 功能。本台将使用此功能替代目前的频道反馈 bot。 https://telegram.org/blog/direct-to-channel-trim-voice-and-more #today
#tg #design 再次吃掉第三方函数的用户群😂
- vote, quiz
- comment+replies
- reaction ,甚至是bot无读写权限的
- translate, 会员
- inline 卡片, instant view @IVcontest
- statistics, 流量数据统计
- @wallet, 不过这个被反垄断了
- 投稿bot
只有一个 /ban 命令和验证码,天然就属于bot😅
还有一些小trick, topics ,慢速模式,inline stickers
独立开发者,再也没有「记账本」「todo」这么简单的mod可以加了🤓
- vote, quiz
- comment+replies
- reaction ,甚至是bot无读写权限的
- translate, 会员
- inline 卡片, instant view @IVcontest
- statistics, 流量数据统计
- @wallet, 不过这个被反垄断了
- 投稿bot
只有一个 /ban 命令和验证码,天然就属于bot😅
还有一些小trick, topics ,慢速模式,inline stickers
独立开发者,再也没有「记账本」「todo」这么简单的mod可以加了🤓
#design 时间轴
https://freefrontend.com/css-timelines/
#css 滚动、抖动动画
https://easingwizard.com/ #tool
https://developer.chrome.com/docs/css-ui/scroll-driven-animations
https://www.smashingmagazine.com/2023/09/path-css-easing-linear-function/
https://freefrontend.com/css-timelines/
#css 滚动、抖动动画
https://easingwizard.com/ #tool
https://developer.chrome.com/docs/css-ui/scroll-driven-animations
https://www.smashingmagazine.com/2023/09/path-css-easing-linear-function/
Freefrontend
CSS Timelines
Create CSS timelines for resumes, project tracking & historical displays. Get responsive, animated designs with ready-to-use code examples.