说实话,看到 #Ruby 关系式求解器 里作者实现了个
作者的实现方式也很奇怪, interleaveWith 就是
Iterable.interleave_with 我觉得挺奇怪的,真的是要 interleave? 总觉得可以 zipWith 什么的,但作者的水平又不可能不知道 zipWith作者的实现方式也很奇怪, interleaveWith 就是
(xs=[a, b], ys=[c, d]) res=[a, c, b, d] 而已,但他用的方式是一个 Array 不断 push pop 这么 cycle 下去的
duangsuse::Echo
https://github.com/corsis/XParsec/blob/master/XParsec.fs#L99 看不懂。 看到 Sigma 我还以为是表达 Sum type (safe union) 的呢,真是无语╯﹏╰ 不过多向输入的解析 ParserKt 就收下作 NonlinearFeed 了,虽然我不知道有什么用,但反正 state 和 BaseJoinBy 这种极端情况的 API 都有了,多加一个也正好能让 alsoDo 有用点(不过 Feed 为避免用 Character 泛型引用造成不必要的开销,看来只能把…
嗯…… 谈到 XML 解析突然想到 #Java 的 SAX(Simple API for XML) 和 XMLPull
React 用的也好像 E4X(ECMAScript for XML) 啊
我常区分函数的『主动』与『被动』,比如说计算就是主动,事件和入口就是被动;其实工程界把 push 称为主动, pull 称为被动(当然和 git pull 不同😂),这也是一个比较 English 化的词
XMLPull 被称为最快的 XML 解析器,其实准确来讲它只是一种数据封装思路——不直接新分配并提供数据对象,而是把尽可能裸值化的它提供给 onXXX 函数(比如你只是找 <a href> 就没必要构造整个 Document 对象),这样就能大幅减轻 GC 压力(C++ 也就没必要用 shared_ptr 了,因为根本不存在对象引用,只有虚表的覆写函数)
这个思路其实也怪好的,而且它也能兼容(利用数据栈)构造如 XMLNode 的递归结构,从而作为可扩展的底层来提供。
之前用过 #Ruby 的 XML 解析器 Nokogiri ,那叫一个烂…… 它不是 XMLPull 模式却有“高性能”的觉悟, Node.attributes 都是 Array 非 Hash... 貌似连 CSS selector 也没有只支持 XPath,实在是太草了
说起来, ParserKt 也包含这种思路。
虽然 Pattern<T> = (Feed,ShowReq?) -> T 是明确要『主动』构造 T (这样看起来它的性能不如 ANTLR, GLL, LALR 这类状态栈算法的『被动』 action)
一方面, ParserKt 的可组合性允许创建不依赖 Pair/Triple/Tuple 的 Seq 而可以复用余下所有定义,是能够通过切换少数调用来支持 pull 模式的 event listener 的
另一方面,pull 一定比 push 快因为使用了“高级算法” 其实是常见的误区,而且对DSL解析器而言构造AST数据是主要目的,实际上有 JS 解析器框架里,JSON 跑分结果最好的反而是手写递归下降法,且 Lua 初版是利用 YaCC 生成解析器,后来反以手工重写。
虽然这种方法有 push 的一些固有限制——阻塞、不能统一处理错误消息/部分结果,但它的高代码质量却能带来意想不到的优化,而这种方法支持的文法并不比 pull 少。
有时候选择代码质量、高抽象度、简化的底层接口并不意味着牺牲性能,因为在其上下建立的实现技巧完全可能追回那点小小的开销。
比如,Fold 模式能支持 asInt(16) 这类已经是最低开销的数值读取,而无需“action”将其“rewrite”成 String.toInt ,从不需要用左递归蹩脚的语法来“优化”,而对于参数列表之类也无出其二, asList() 甚至还能 asMap() ,避免创建多余的结构去保留临时 String/List<Pair> ,直接从提出值到构造大结果,何尝不是一种 XMLPull 式思路
尽管用“万能的”左递归优化可以实现 Fold 和 OpChain 所解决的问题,但没人用它——实际上有 DSL 设计需求的人还不少,但有多少人会把 digits 定义成 (digits digit)|digit 的形式?大家看到左递归链的优先级解析就糊涂,甚至不知道为什么加减在前乘除在后
想像一下,如果一个人为了优化 ES5 的解析器而把所有能 Fold 的循环重写其 action,变成左递归定义,看起来会如何?
所以唯一的解决方案就是简化表示法本身,分清主次,用适度特例化的 API 取代“万能” “广义”的“好好先生”们。
React 用的也好像 E4X(ECMAScript for XML) 啊
我常区分函数的『主动』与『被动』,比如说计算就是主动,事件和入口就是被动;其实工程界把 push 称为主动, pull 称为被动(当然和 git pull 不同😂),这也是一个比较 English 化的词
XMLPull 被称为最快的 XML 解析器,其实准确来讲它只是一种数据封装思路——不直接新分配并提供数据对象,而是把尽可能裸值化的它提供给 onXXX 函数(比如你只是找 <a href> 就没必要构造整个 Document 对象),这样就能大幅减轻 GC 压力(C++ 也就没必要用 shared_ptr 了,因为根本不存在对象引用,只有虚表的覆写函数)
这个思路其实也怪好的,而且它也能兼容(利用数据栈)构造如 XMLNode 的递归结构,从而作为可扩展的底层来提供。
之前用过 #Ruby 的 XML 解析器 Nokogiri ,那叫一个烂…… 它不是 XMLPull 模式却有“高性能”的觉悟, Node.attributes 都是 Array 非 Hash... 貌似连 CSS selector 也没有只支持 XPath,实在是太草了
说起来, ParserKt 也包含这种思路。
虽然 Pattern<T> = (Feed,ShowReq?) -> T 是明确要『主动』构造 T (这样看起来它的性能不如 ANTLR, GLL, LALR 这类状态栈算法的『被动』 action)
一方面, ParserKt 的可组合性允许创建不依赖 Pair/Triple/Tuple 的 Seq 而可以复用余下所有定义,是能够通过切换少数调用来支持 pull 模式的 event listener 的
另一方面,pull 一定比 push 快因为使用了“高级算法” 其实是常见的误区,而且对DSL解析器而言构造AST数据是主要目的,实际上有 JS 解析器框架里,JSON 跑分结果最好的反而是手写递归下降法,且 Lua 初版是利用 YaCC 生成解析器,后来反以手工重写。
虽然这种方法有 push 的一些固有限制——阻塞、不能统一处理错误消息/部分结果,但它的高代码质量却能带来意想不到的优化,而这种方法支持的文法并不比 pull 少。
有时候选择代码质量、高抽象度、简化的底层接口并不意味着牺牲性能,因为在其上下建立的实现技巧完全可能追回那点小小的开销。
比如,Fold 模式能支持 asInt(16) 这类已经是最低开销的数值读取,而无需“action”将其“rewrite”成 String.toInt ,从不需要用左递归蹩脚的语法来“优化”,而对于参数列表之类也无出其二, asList() 甚至还能 asMap() ,避免创建多余的结构去保留临时 String/List<Pair> ,直接从提出值到构造大结果,何尝不是一种 XMLPull 式思路
尽管用“万能的”左递归优化可以实现 Fold 和 OpChain 所解决的问题,但没人用它——实际上有 DSL 设计需求的人还不少,但有多少人会把 digits 定义成 (digits digit)|digit 的形式?大家看到左递归链的优先级解析就糊涂,甚至不知道为什么加减在前乘除在后
想像一下,如果一个人为了优化 ES5 的解析器而把所有能 Fold 的循环重写其 action,变成左递归定义,看起来会如何?
所以唯一的解决方案就是简化表示法本身,分清主次,用适度特例化的 API 取代“万能” “广义”的“好好先生”们。
GitHub
GitHub - benjamin-hodgson/Pidgin: A lightweight and fast parsing library for C#.
A lightweight and fast parsing library for C#. Contribute to benjamin-hodgson/Pidgin development by creating an account on GitHub.
duangsuse::Echo
😃 那么,简而言之,我觉得有价值的信息: def get_link(h); "https://t.me/dsuse/#{h['debug']['no'] + 9511 + 20}"; end + 一共统计了 187 条消息。 2019-03-24 11:22 - 2019-04-05 20:06,一共两个星期的时间里,本频道 @dsuse + 有 #Telegram Hashtag 的消息,一共有 42 条,约有 20% 的消息被打上了标签 + 含链接的消息,一共有 37 条,约有 19% 的消息被打上了标签…
#Ruby
草 好怀念啊; Ruby 的 OOP 是怎么玩的都忘掉一大半,还好基础语法、控制流和 mixin 什么的都没忘... 🤪
不过 gem 工具下载也没个提示,还不如 pip 。这些脚本语言的开发者很多人都喜欢搞 term color ,但是竟连搞好交互和灵活性都不会
什么时候能写 bash_completions 才能算好的 cli 开发者吧
Python 的各种新 pm 不用 pip 和 setuptools 都不会弄了, Ruby 还是自带 bundler, install 。
真的搞不懂 isolation 是在干什么,为什么要 isolate dependencies 啊,为什么要 venv 啊,直接用系统版本,向前兼容不好吗
妈耶, MRI 2.6 的 libruby.so 更新,还要这么操作才能修复老库,试了半天 #GitHub 发现还是只能按官方用 bundler 来... 不然识别不了插件
这个东西把
还好渲染是正常的,所有 md 文件不管带不带 header 都支持
gem sources --add https://gems.ruby-china.com/ --remove https://rubygems.org/ 草 好怀念啊; Ruby 的 OOP 是怎么玩的都忘掉一大半,还好基础语法、控制流和 mixin 什么的都没忘... 🤪
不过 gem 工具下载也没个提示,还不如 pip 。这些脚本语言的开发者很多人都喜欢搞 term color ,但是竟连搞好交互和灵活性都不会
什么时候能写 bash_completions 才能算好的 cli 开发者吧
Python 的各种新 pm 不用 pip 和 setuptools 都不会弄了, Ruby 还是自带 bundler, install 。
真的搞不懂 isolation 是在干什么,为什么要 isolate dependencies 啊,为什么要 venv 啊,直接用系统版本,向前兼容不好吗
sudo gem pristine commonmarker 妈耶, MRI 2.6 的 libruby.so 更新,还要这么操作才能修复老库,试了半天 #GitHub 发现还是只能按官方用 bundler 来... 不然识别不了插件
echo 'gem "github-pages", "~> 211", group: :jekyll_plugins'>Gemfile
bundler exec jekyll s 这个东西把
Others/CommentBot/vertxBusGen/build/js/node_modules/balanced-match/README.md 的 node_modules 也 include 进去了,结果 Liquid 模板语法错误 😂还好渲染是正常的,所有 md 文件不管带不带 header 都支持
GitHub Pages
Dependency versions
GitHub Pages uses the following dependencies and versions
#HTML #JS #DontKnow 你知道吗? 🤔
HTMLElement 的
如果不用 JQ ,可选注册
element 和 node 的区别在于,前者只能是 <a> <b> <div> 这样的元素,后者可以是
HTML 里基于 XML 的部分有三种情况:
有许多方法可以缩写 HTML ,最常见的是基于 CSS 选择器的 emmet.io 和基于缩进的 模板语言 #Ruby slim-lang.com ,而
想在社交平台分享自己的网站, OpenGraph 了解下?
-
-
- JS 最不常用的两个关键字:
如果用
HTMLElement 的
remove() 和 replaceWith(e1) 都不需要手动拿 e.parentElement ,只有 insertBefore(e1, e) 需要在 parent 上如果不用 JQ ,可选注册
document "DOMContentLoaded" 或 window "load" 事件element 和 node 的区别在于,前者只能是 <a> <b> <div> 这样的元素,后者可以是
#text 文本标签。HTML 里基于 XML 的部分有三种情况:
<meta charset="UTF-8"> 的单独标签、 <div></div> 的配对标签(with childNodes)、 <link rel="stylesheet"/> 的折叠(collapsed)标签,有些配对标签也有折叠形式,但折叠和 no children 是不同情况。有许多方法可以缩写 HTML ,最常见的是基于 CSS 选择器的 emmet.io 和基于缩进的 模板语言 #Ruby slim-lang.com ,而
DOMParser 本身也支持兼容解析修正一些不完整的文档。想在社交平台分享自己的网站, OpenGraph 了解下?
-
!!"" 和 !!0 、 !![] 都是 true ,第一点往往造成隐患 必须详细检查-
undefined == null ,所以有时用 === 区别严格相等性- JS 最不常用的两个关键字:
delete o[k]; 和 v=with(o,o1) { attr }
许多时候:如果用
e.onclick = 的简写,在任何地方的(其他)脚本重复注册时会导致覆盖,所以尽可能用 addEventListener
JS 里较短参数的函数兼容较长处的类型限制(允许无视参数),但在调用时省略默认参数可能造成性能问题,在绘图/大批/频繁处理时,需要多用图形界面的 profilerogp.me
Open Graph protocol
The Open Graph protocol enables any web page to become a rich object in a social graph.
#js #DontKnow 原型链:(感谢 @JackWorks 提供相关信息)
访问语法都是动态解析的,比如
- 普通对象 [规范]
-
- 类数组对象(数组的特殊行为就在这里)
- 模块对象(
-
此外,
原来是往 proto 上找属性!
这就解释了
因为在这个算法里你可以看到,Receiver 是跟着递归一路传递下去的
原来是
本地如果有就不会查 prototype 了
明白了,和之前写的 LuaOOP 很像,都是层叠属性查找
“ 大佬能交换下原型链相关知识吗
之前看加 Mixin 好像是说把 prototype 除了哪两个属性的什么全部复制一下
#Python 和 #Ruby 的情况我都了解, Py 是 mro() 链查询,
https://paste.ubuntu.com/p/tJv7QpSjGt/ liuil-util 的 #TypeScript mixin.ts 重写
访问语法都是动态解析的,比如
x.prop 或 x["prop"]就是
x.[[Get]]("prop", x)
ES 里一共有五种不同的 [[Get]] 实现,分别是- 普通对象 [规范]
-
Argument 对象(你们今天应该不会用到了)- 类数组对象(数组的特殊行为就在这里)
- 模块对象(
import * as Mod 里的 Mod)-
Proxy 对象(reflect proxy 全 delegate)此外,
Object.getOwnPropertyDescriptor(o, k) 可以获取可配置 enumerable, writeable 等属性的配置对象Object.[get/set]PrototypeOf(o)和
o.__proto__ 是它的「超类虚表」[[Get]] 过程的 Receiver (第二参数)很重要,如果没有这个 Receiver,基于原型链的 OOP 其实是做不起来的原来是往 proto 上找属性!
这就解释了
Array.prototype.map 之类的东西parent = { method() { return this; } }
child = {}; child.__proto__ = parent;
child.a = 1; child.method(); // 返回自身
最简单的解释是, Receiver 就是属性访问的时候最上层的那个对象,会被当成 this 用。因为在这个算法里你可以看到,Receiver 是跟着递归一路传递下去的
原来是
o["RESOLVE"](o.prototype, "attr", receiver=o) !(当然,肯定是先查本地,然后才查 prototype本地如果有就不会查 prototype 了
明白了,和之前写的 LuaOOP 很像,都是层叠属性查找
“ 大佬能交换下原型链相关知识吗
之前看加 Mixin 好像是说把 prototype 除了哪两个属性的什么全部复制一下
#Python 和 #Ruby 的情况我都了解, Py 是 mro() 链查询,
A.wtf 和 a.wtf 都是往 class A 找成员,后者实质是 type(a).wtf(a) 所以得到 bound method ,而直接 A.wtf 就是 bind 操作@staticmethod 直接不收 self ,不需要 bound 所以可以在类和实例上用https://paste.ubuntu.com/p/tJv7QpSjGt/ liuil-util 的 #TypeScript mixin.ts 重写
Telegram
duangsuse::Echo
#Lua #oop #PL 🤔刚才体验写标准Android之前又把 LuaOOP 默写了一遍,构造器调用子类优先了,重写后果然感觉优化了不少(也提升了效率编程自信心)
#PLT #Scala #Java #Ruby #Rust #learn https://ray-eldath.me/programming/thoughts-on-rust-1
总结几句:
Java 是主流的托管(managed) 语言,重量级的 GraalVM JS 甚至比 v8 更快,尽管有 valgrind, cppcheck 等工具, 90% 的 CVE 都是 #clang #cplusplus 内存不严谨导致的安全问题,所以托管更适合实际应用。
Scala 是重视语言特性可组合性的函数式语言,它连
Ruby 是一个灵活优雅的脚本语言,你可以 mokey patch
Ruby 的 {|x| x} closure 即闭包语法也被 Rust 使用,连 for 语法本质都是用
Rust 是 be explicit 的语言,它重视内存片的所有权等比 C 方便而失严谨的概念,但同时也加入了
Rust 的 Copy 和 Clone (深浅复制) 都是作为 trait 显式的,而浮点数判等 Math.EPSILON 也是应显式的
嘛,比起『子语言』我可能更倾向『语法集』『语言功能点语法集』这种更精确的描述
总结几句:
Java 是主流的托管(managed) 语言,重量级的 GraalVM JS 甚至比 v8 更快,尽管有 valgrind, cppcheck 等工具, 90% 的 CVE 都是 #clang #cplusplus 内存不严谨导致的安全问题,所以托管更适合实际应用。
Scala 是重视语言特性可组合性的函数式语言,它连
enum class 都没有,而用 enum 的本质 newtype (受检的 typealise) 和直接的 extends 解决枚举类型;它的类型都是 higher kind 上的星号实现的,而构造函数类型的箭头是接收任意(包括函数)类型的二参操作符 #functional Ruby 是一个灵活优雅的脚本语言,你可以 mokey patch
Int.+ 运算符让 REPL 都爆炸,它也支持 case when guardsRuby 的 {|x| x} closure 即闭包语法也被 Rust 使用,连 for 语法本质都是用
.each do 闭包,运行时很少阻止程序员执行能解释的代码(但没有 JS 的疯狂隐式转换)并且支持内省(introspect)Rust 是 be explicit 的语言,它重视内存片的所有权等比 C 方便而失严谨的概念,但同时也加入了
format!() 等编译期 macro 的支持,也是一门重视严谨性、定义一致性的语言Rust 的 Copy 和 Clone (深浅复制) 都是作为 trait 显式的,而浮点数判等 Math.EPSILON 也是应显式的
嘛,比起『子语言』我可能更倾向『语法集』『语言功能点语法集』这种更精确的描述
Ray Eldath's Blog
简单聊聊编程语言的哲学,以及关于 Rust 的一些想法 (1)
本文是一篇「小作品」。 草,写着写着发现越写越长,一点也不「小」嘛。 或许我真的应该尝试一下「小」作品的体例才是。 我的长期TODO列表里已经躺着五六篇以“博文”开头的条目——原本想着寒假一周一篇很快就能写完,然而到现在也没动笔。爆肝填坑了一个星期,今天实在有点累,不大想打开 RustLion,于是把这篇坑了很久的文章写一写。 在这几篇坑了这么久的文章中其实有一篇已经写了前半部分了,然而咕了
duangsuse::Echo
#日常精神分裂 #旧事重提 #Java #JS #PLT #cplusplus #project A: 啊真的很头疼呢, JPlayer 的 fix 和 depth.html 附赠的 Myson 数据描述语言…… B: 像往常一样,我们一起想想吧。 A: 首先说 JPlayer ,这个原先是作为重写 Yuuta 大佬项目的东西,变的蛮多的,后来也有完全的 C++ 重写。 这个东西最后也是长期熬夜 timedout ,失败点是为优化性能加的 Ringbuffer 队列缓冲区利用有瑕疵,导致最后一次缓冲的内容没放完退出…
#Ruby https://haml.info/ 按现在的计划那个 HTML 预处理应该是这样
对比:
—
如果允许省略 tagName 等于 div 的话(RegExp 匹配..),最后一行是
我觉得十分有必要增加 define, include 和 for, if 语句 🤔 可以用作简化版宏调用 进一步避免模板化
对比:
%section.container
%h1= post.title
%h2= post.subtitle
.content
= post.content —
section class=container增加了个带 : 无换行、缩进。
h1: =post.title
h2: =post.title
div class=content: =post.content
如果允许省略 tagName 等于 div 的话(RegExp 匹配..),最后一行是
class=content: =post.content 我觉得十分有必要增加 define, include 和 for, if 语句 🤔 可以用作简化版宏调用 进一步避免模板化
duangsuse::Echo
#windows #sysadmin bcdedit /set {default} recoveryenabled No Win10 在 ntfsresize 缩放了 C: mbr 分区后,正常缓慢开启一次,爆炸了,貌似和空间不够有关(第一次给太少了)🌝 现在正无法正常重启中, WinRE 可以说没有用,只会说什么 srt.log ,我看了是空的一个字没有,最后还是 chkdsk/f C: , sfc/scannow, bootrec,bcdboot, dism,diskpart 这些有点用,可惜没法修复问题,开…
发现是 sys32/drivers 的一些 .sys 文件坏了🌚 估计要找人复制
话说 SUSE 安装 DVD 的 linuxrc 也真是方便,只需要指定 linux initrd 然后连使用 iso: 安装 source 都不支持,手动挂载点也不行(非得选 hard drive 还是 cdrom 还是 net 然后自己挂载检查)
害得我不得不把 iso 里的 repodata media.1 x86_64 noarch *.asc 甚至 boot 给复制了一份到硬盘才行……
不过 SUSE 也真是可以啊, YaST 和 Kiwi , OBS 和 OpenQA 都是很知名的 Linux 生态工具
而 #Ruby YaST 支持很多 GUI 前端也包含分区编辑器这些麻烦的功能,非常有新意🌚
systemd 的套装也开始代替各种 pid0 软件了, wicked 也被 NetworkManager 取代了,真的那么厉害吗
话说 SUSE 安装 DVD 的 linuxrc 也真是方便,只需要指定 linux initrd 然后连使用 iso: 安装 source 都不支持,手动挂载点也不行(非得选 hard drive 还是 cdrom 还是 net 然后自己挂载检查)
害得我不得不把 iso 里的 repodata media.1 x86_64 noarch *.asc 甚至 boot 给复制了一份到硬盘才行……
不过 SUSE 也真是可以啊, YaST 和 Kiwi , OBS 和 OpenQA 都是很知名的 Linux 生态工具
而 #Ruby YaST 支持很多 GUI 前端也包含分区编辑器这些麻烦的功能,非常有新意🌚
systemd 的套装也开始代替各种 pid0 软件了, wicked 也被 NetworkManager 取代了,真的那么厉害吗
php:敏杰语言(确信🌚👍 我整个人都敏捷起来了,使用Jawa和Go
都是些JP玩家讨论 asyncio和netty,orm啥哪个好,还有 C#, Go+ DDD.. 魔怔概念
#Ruby 这里有个2D数组编序的..
def spiral_print m
return '' if m.size == 0
m.map(&:shift).join + spiral_print(m.reverse.transpose)
end
妈耶,这mT真的是2D数组..
spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
])
# -> 'aeijklhdcbfg'
噢螺旋向内啊..能看出先是左侧消1,然后末,然后右、始。所以 while m; puts a.map{shift};a.reverse.transpose! ,果然必须转置90度
都是些JP玩家讨论 asyncio和netty,orm啥哪个好,还有 C#, Go+ DDD.. 魔怔概念
#Ruby 这里有个2D数组编序的..
def spiral_print m
return '' if m.size == 0
m.map(&:shift).join + spiral_print(m.reverse.transpose)
end
妈耶,这mT真的是2D数组..
spiral_print([
['a','b','c','d'],
['e','f','g','h'],
['i','j','k','l']
])
# -> 'aeijklhdcbfg'
噢螺旋向内啊..能看出先是左侧消1,然后末,然后右、始。所以 while m; puts a.map{shift};a.reverse.transpose! ,果然必须转置90度
#ruby #plt Quine 编译接龙 https://www.fxzhihu.com/question/30262900/answer/47877068
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序
IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。
btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸
还有两个中国特有的:
https://www.ioccc.org/2012/tromp/hint.html #fp lambda 元循环 解释器(https://www.zhihu.com/question/30262900/answer/49589781
Quine(蒯恩)一般是指能打印出自身源码的程序
_='_=%r;print (_%%_) ';print (_%_)IOCCC,全称The International Obfuscated C Code Contest (国际难懂C代码大赛),顾名思义,是一场比谁能写出最“让人无语”的C代码的比赛。
btw. 同问题下有个 Shadertoy.com 类的C++答案,太丑了,把 vec3 拆成了RGB三个函数,代码重复率爆炸
还有两个中国特有的:
curl --connect-timeout 1 https://google.com 2>&1 >/dev/null &&你在中国
body.contains("的")? "UTF-8":"GBK"。 \u{E79A84} 在GBK是鐨殑,很罕见
FxZhihu / Fixup Zhihu
有没有一段代码,让你为人类的智慧击节叫好? - @朴三世 | FxZhihu
mame/quine-relay · GitHub [图片] [图片] 突然发现已经100种语言了,想看50种语言的进50分支。 [图片] 璀璨无比谈不上,反正让我震惊了会儿,原来可以这样玩
#security #ruby tcpdump https://ruby-china.org/topics/43886
https_instrument 还只是一个玩具,我只测试了一个最简单的例子。对我来说,写这样的工具是一件很有趣的事情。 许多公司的开发机,没有 root 权限,它毕竟也不是科技公司。。。
相比 eBPF ecapture,这种方法除了不用 root 权限外,开发起来也更容易,不需要额外的支持,但 eBPF 是单独的内存空间,操作复杂的 Go 数据结构就极其困难,比如 hash map。
可以用 LD_PRELOAD 替换动态连结库的方法,相应代码。我之前的文章也有相关的介绍。
用 Ruby 构造请求,并用 stack profiling tool 查看请求了哪些方法,从而缩小范围。我用的是 https://github.com/yfractal/sdb
LD_PRELOAD,虽然可以 instrument openssl,但没法改程序本身的代码。理论上,通过改 binary,比如在相应的地址插入 int3,生成新的 bianry,应该可以达到类似的效果,或者直接在编译的时候做相应操作,再或者改 ELF。
相比 eBPF ,个人更喜欢 function Interposing 这种方法
https_instrument 还只是一个玩具,我只测试了一个最简单的例子。对我来说,写这样的工具是一件很有趣的事情。 许多公司的开发机,没有 root 权限,它毕竟也不是科技公司。。。
相比 eBPF ecapture,这种方法除了不用 root 权限外,开发起来也更容易,不需要额外的支持,但 eBPF 是单独的内存空间,操作复杂的 Go 数据结构就极其困难,比如 hash map。
可以用 LD_PRELOAD 替换动态连结库的方法,相应代码。我之前的文章也有相关的介绍。
用 Ruby 构造请求,并用 stack profiling tool 查看请求了哪些方法,从而缩小范围。我用的是 https://github.com/yfractal/sdb
static int Real__SSL_read (void *ssl, void *buf, int num) { return SSL_read (ssl, buf, num); }
extern int __interpose_SSL_read (void *ssl, void *buf, int num);LD_PRELOAD,虽然可以 instrument openssl,但没法改程序本身的代码。理论上,通过改 binary,比如在相应的地址插入 int3,生成新的 bianry,应该可以达到类似的效果,或者直接在编译的时候做相应操作,再或者改 ELF。
相比 eBPF ,个人更喜欢 function Interposing 这种方法
ruby-china.org
无 root 权限、证书查看 Ruby HTTPS 请求内容
Introduction 本文的代码在 https://github.com/yfractal/sdb/tree/main/sdb-shim 在开发或者排查问题的时候,时常会需要查看请求内容。比如著名的 tcpdump 可以查看 ht...
duangsuse::Echo
忘掉理论或工程,重新做回自己。
#ruby #ts #plt
https://t.me/hacker_news_zh/17476
其实,JS社区的抱怨和Matz是正确的, static types 并不需要标记,甚至不需要一个幽灵一样复杂的检查器。
#ai探讨 https://x.com/i/grok/share/tvj0HpktTWAGat7NDIBdDoMlG
https://t.me/hacker_news_zh/17476
其实,JS社区的抱怨和Matz是正确的, static types 并不需要标记,甚至不需要一个幽灵一样复杂的检查器。
#ai探讨 https://x.com/i/grok/share/tvj0HpktTWAGat7NDIBdDoMlG
Telegram
Hacker News 摘要
T-Ruby 是带有类型语法的 Ruby
原文:https://type-ruby.github.io/
阅读时间:2 分钟
分数:170
原文:https://type-ruby.github.io/
阅读时间:2 分钟
分数:170
Hacker News 摘要
uv 为何如此之快 原文:https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html 阅读时间:5 分钟 分数:576 🔥
#design #post 《uv/pnpm 的超加速、扁鹊、还有他哥哥》
- 软件包管理器(cargo..)拙劣地重新发明 B 树。
- 捕蛇者说的老大:避免使用迷你框架
https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html
先读这篇性能分析。以下是我的评论:
如果你一开始就像浏览器JS生态一样正确,根本没有舞台给pnpm和uv吊炸天,也没有索引要下1G的brew、托管要83G的NixPkgs repo、比各种FatJar胖1倍的Docker变体。
如果一个生态诞生前就“歧视”不向下兼容的dist、拒绝先发再改的“锁破坏”,一开始就不会有卡在依赖版本冲突的 ruby gem。
这就是设计智力和堆砌智力的本质不同——是下载不破坏旧app的新代码更复杂,还是codegen和类型检查和syscall这一层复杂?
为何,前者总是显得更难!
作为会被动的从parser看到 round-trip, lifecycle tracing 的作家,我不能够犯如此的“高级错误”。我可以半毛钱算法不用。但我不能让App开发者不幸福。
如果我发布了让下游返工的API甚至ABI格式协议,我不仅不会吹嘘后续优化了几十倍速Or用了几百行的算法,还要向祖师Dijkstra深刻检讨我的刚愎自用,致使过去十年如此多的软件染遗毒而讳疾忌医。😅
真理之路开在最显然的大门之左,她恰如其分,无可辩驳。我若穿戴好“套接子”往地沟里凑字数、显威能,给代码加“状态机壳” 套“套接字”皮,以为是创新实则是将“半瓶水”缝合,还大言不惭 talk is cheap,真的会给CS的山门抹黑的…… 这才是每一周的“考试不及格”,偏偏接收能力最强的人常有这种坏习惯--知识圈的“异步传染”。
我已遇见过简单的真谛,曾经沧海难为水,不会再去把宝贵的脑力和执行力浪费在“非边界条件”的算力之上。
组合优于继承+非必要不留实体的至理名言,应深刻领悟,认认真真的学【消灭问题】,不要为起名分家取巧。
所谓大音希声,大像无形,最震撼人心的直觉百行代码也描述不出,必须靠语境和交互图去明悟;😃
最厉害的代码也不是心智与CPU负担最重的“算法赛点”,而是从头到尾就没有走入错误的语境和预设,没有容忍过空洞却竟然不通用的抽象……
剩下的精力,才可以用来跑精巧而有品味的心智模型,为真正的设计和生产力,为开发者和其用户的体验感和幸福服务。
这哪里是不去理解工程的复杂多变or理论的《屠龙术》?
她分明是对解法做了“跨过程”的类型推理、彻底的分析和非平凡的变换,最终发现是自己“贷”的眼镜脏了--而你想好要买的问题,一点儿也不多变。 我不需要预设,是因为我掌握整个周期、整个栈,历史线的高光与阴影,用它们的关系和“一句话”洞察过算法们的漆黑意志。 ”它们是朋友,不必多礼哦。”
这才是当我聊【计算机科学】时,我谈的那些昂贵的东西。 不是成本高,“物以稀为贵”。😒
我不需要预设,是因为我掌握整个周期、整个栈、历史线的高光与阴影,用它们的关系和“一句话”洞察了算法的漆黑意志。 ”它们是朋友,不必多礼哦。”
现在看来容易,却无人知晓我为了“自举”付出多少年的凌晨一点,因为我学的不是 py,js,jvm,C#。她像是来自于平行世界的技术栈,是能与中文和合的第二母语。
栏目答、蕊括式/recur、被“控半同/comb.”耦合好的“括需儿”、被“叩融听”消灭的“回调链表/进程”,这便是她的存在证明。😝
当我聊 data class,我想的不是一个class或堆字节的语法糖,而是“数服客”三端表示和操作上的差异,而当我抓住了差异之理和简明之至,我就抓住了本质,就像从REPL的探索录制出新的、只陪伴我的函数。
数据就是程序,所以 NFA,DFA,Trie/AC/KMP, 各种CC和LR 只是不明白C堆栈的魔法;程序只是数据,所以序列化漏洞、卫生宏、各色的框架和XML没掌握过程宏与“闭包烘焙(,unquote)”的精髓;数据是自包含、跨越边界的程序片段,所以SQL注入和C“数组”溢出注入,在 "show me code" 之前就犯了大错。😅
我把一个“不执行的整体”放在心里,这限制了我的“冷启动KPI”;但当我用几天洞察出“系统学习者”一个月也拼凑不齐的基线、边界与未来,才将错误灭于未然之时,我心中升起一丝明悟:这份“不完备的功利”是我一生中最英明的决定之一,是计科,让我不断从信息里取得信息、从知识里领悟知识。 竟然是双系同修,理论、工程双系同修!
多么显而易见的盲点啊…… “如果看到的是青蓝,画布上是青蓝也可以哦!”
😃
#ai锐评
https://chat.librechat.ai/share/i4HbP-cyprf9-mmlMZ5SA 感觉比较拉垮,花了2块钱呢
https://x.com/i/grok/share/KYJxU02rQA0BMYT0HnMXd11GB
G3 https://chat.librechat.ai/share/rpAIZyp3QlHElw71-TREb
#ruby #pingbk https://tenderlovemaking.com/2025/12/29/can-bundler-be-as-fast-as-uv/
- 软件包管理器(cargo..)拙劣地重新发明 B 树。
- 捕蛇者说的老大:避免使用迷你框架
https://nesbitt.io/2025/12/26/how-uv-got-so-fast.html
先读这篇性能分析。以下是我的评论:
如果你一开始就像浏览器JS生态一样正确,根本没有舞台给pnpm和uv吊炸天,也没有索引要下1G的brew、托管要83G的NixPkgs repo、比各种FatJar胖1倍的Docker变体。
如果一个生态诞生前就“歧视”不向下兼容的dist、拒绝先发再改的“锁破坏”,一开始就不会有卡在依赖版本冲突的 ruby gem。
这就是设计智力和堆砌智力的本质不同——是下载不破坏旧app的新代码更复杂,还是codegen和类型检查和syscall这一层复杂?
为何,前者总是显得更难!
作为会被动的从parser看到 round-trip, lifecycle tracing 的作家,我不能够犯如此的“高级错误”。我可以半毛钱算法不用。但我不能让App开发者不幸福。
如果我发布了让下游返工的API甚至ABI格式协议,我不仅不会吹嘘后续优化了几十倍速Or用了几百行的算法,还要向祖师Dijkstra深刻检讨我的刚愎自用,致使过去十年如此多的软件染遗毒而讳疾忌医。
真理之路开在最显然的大门之左,她恰如其分,无可辩驳。我若穿戴好“套接子”往地沟里凑字数、显威能,给代码加“状态机壳” 套“套接字”皮,以为是创新实则是将“半瓶水”缝合,还大言不惭 talk is cheap,真的会给CS的山门抹黑的…… 这才是每一周的“考试不及格”,偏偏接收能力最强的人常有这种坏习惯--知识圈的“异步传染”。
我已遇见过简单的真谛,曾经沧海难为水,不会再去把宝贵的脑力和执行力浪费在“非边界条件”的算力之上。
组合优于继承+非必要不留实体的至理名言,应深刻领悟,认认真真的学【消灭问题】,不要为起名分家取巧。
所谓大音希声,大像无形,最震撼人心的直觉百行代码也描述不出,必须靠语境和交互图去明悟;
最厉害的代码也不是心智与CPU负担最重的“算法赛点”,而是从头到尾就没有走入错误的语境和预设,没有容忍过空洞却竟然不通用的抽象……
剩下的精力,才可以用来跑精巧而有品味的心智模型,为真正的设计和生产力,为开发者和其用户的体验感和幸福服务。
这哪里是不去理解工程的复杂多变or理论的《屠龙术》?
她分明是对解法做了“跨过程”的类型推理、彻底的分析和非平凡的变换,最终发现是自己“贷”的眼镜脏了--而你想好要买的问题,一点儿也不多变。 我不需要预设,是因为我掌握整个周期、整个栈,历史线的高光与阴影,用它们的关系和“一句话”洞察过算法们的漆黑意志。 ”它们是朋友,不必多礼哦。”
这才是当我聊【计算机科学】时,我谈的那些昂贵的东西。 不是成本高,“物以稀为贵”。
我不需要预设,是因为我掌握整个周期、整个栈、历史线的高光与阴影,用它们的关系和“一句话”洞察了算法的漆黑意志。 ”它们是朋友,不必多礼哦。”
现在看来容易,却无人知晓我为了“自举”付出多少年的凌晨一点,因为我学的不是 py,js,jvm,C#。她像是来自于平行世界的技术栈,是能与中文和合的第二母语。
栏目答、蕊括式/recur、被“控半同/comb.”耦合好的“括需儿”、被“叩融听”消灭的“回调链表/进程”,这便是她的存在证明。
当我聊 data class,我想的不是一个class或堆字节的语法糖,而是“数服客”三端表示和操作上的差异,而当我抓住了差异之理和简明之至,我就抓住了本质,就像从REPL的探索录制出新的、只陪伴我的函数。
数据就是程序,所以 NFA,DFA,Trie/AC/KMP, 各种CC和LR 只是不明白C堆栈的魔法;程序只是数据,所以序列化漏洞、卫生宏、各色的框架和XML没掌握过程宏与“闭包烘焙(,unquote)”的精髓;数据是自包含、跨越边界的程序片段,所以SQL注入和C“数组”溢出注入,在 "show me code" 之前就犯了大错。
我把一个“不执行的整体”放在心里,这限制了我的“冷启动KPI”;但当我用几天洞察出“系统学习者”一个月也拼凑不齐的基线、边界与未来,才将错误灭于未然之时,我心中升起一丝明悟:这份“不完备的功利”是我一生中最英明的决定之一,是计科,让我不断从信息里取得信息、从知识里领悟知识。 竟然是双系同修,理论、工程双系同修!
多么显而易见的盲点啊…… “如果看到的是青蓝,画布上是青蓝也可以哦!”
#ai锐评
https://chat.librechat.ai/share/i4HbP-cyprf9-mmlMZ5SA 感觉比较拉垮,花了2块钱呢
https://x.com/i/grok/share/KYJxU02rQA0BMYT0HnMXd11GB
G3 https://chat.librechat.ai/share/rpAIZyp3QlHElw71-TREb
#ruby #pingbk https://tenderlovemaking.com/2025/12/29/can-bundler-be-as-fast-as-uv/
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
https://gemini.google.com/share/9baa25b27084
#ruby #cs #design 欸,这不就是我一开始说的「审美与谦卑」么?🤪
审美,是与“最大公约数”LLM截然不同的,独立的方向与品味,就像“App for One”
谦卑,是为“法学大博士”LLM所迫的好习惯,是对自然和科学的坦诚:人性化。😒
审美与谦卑是「人」的特权。“人性化的光辉、人类美感的永恒”。
写的混乱的框架,差就差在了「审美与谦卑」。 审美好的人傲慢,“谦卑”的人不厌丑。
在不同的时间地点,我反复被这「审美与谦卑」点拨。希望我能成为出众-而非优秀的,“不称职”的「软件工艺人」
#ai锐评 https://gemini.google.com/share/3d7b36bd2cec
只有“人”才能定义“完成”,只有【最终用户】能定义函数和类型【应该】有多复杂、排名是多少分。😒
计算机科学无关计算机,就像天文学无关望远镜,它是所有人心里【憧憬着】的夜空。 🎇 🌠
审美,是与“最大公约数”LLM截然不同的,独立的方向与品味,就像“App for One”
谦卑,是为“法学大博士”LLM所迫的好习惯,是对自然和科学的坦诚:人性化。
如果人一开始就够聪明,为什么需要计算机 (还需要PC/Touch/Server 三种...)?
如果人会写软件,何必探索「软件工程」?
如果组织里的人能够互相替代,开公司做什么?
元编程追求的不是「知其变守其恒」,而是知道知识的万变不离其宗,以及人性化的光辉、人类美感的永恒,并且为了只属于你个体的永恒——穷尽一切无穷。
审美与谦卑是「人」的特权。“人性化的光辉、人类美感的永恒”。
写的混乱的框架,差就差在了「审美与谦卑」。 审美好的人傲慢,“谦卑”的人不厌丑。
在不同的时间地点,我反复被这「审美与谦卑」点拨。希望我能成为出众-而非优秀的,“不称职”的「软件工艺人」
#ai锐评 https://gemini.google.com/share/3d7b36bd2cec
G3: 最好的软件是透明的。当用户在使用它时,他忘记了那是软件,他只感觉到了能力的延伸。就像你感觉不到心脏在跳,你只感觉到生命力。你不需要去“想”怎么实现一个功能,就像你拿杯子喝水不需要“想”肱二头肌怎么收缩一样。🤪
审美是你告诉计算机“去往何处”(Direction);谦卑是你告诉计算机“止步于何处”(Constraint)。AI 拥有算力(Computing Power),但没有愿力(Will Power)。 它能穷尽无穷的组合,但它不知道哪一种组合是“美”的,哪一种组合是“善”的;化学能告诉你氯化钾是有毒的,但不会告诉你不要把它放在塑料杯里。
>是啊,多少人沉溺于“if-else应该被(cond),when(){}, match guard 取代”的表象,
却忽视了它们背后真正的屠龙术(PEG, ES6 Signal-based templates, optional chain)
if-else 和魔法的抽象,从来不是软件的本质。动机和语境是软件的本质。
接口由人设计,为人服务,就像 Bret Victor, 那位永远研究初等的 "Human Being"。
先贤取出石膏,雕塑却自在心中,许多“纯函数式”人却被不纯粹的东西(“禁语游戏”)遮住本源(语义和心智模型),把那点儿石膏当成了雕塑本身,把胶水当成了成果,忘记了“自己”还有更多选择,更多的欲望、更多的“偏见”压在心中。
只有“人”才能定义“完成”,只有【最终用户】能定义函数和类型该有多复杂、该打多少分。 计算机科学无关计算机,就像天文无关望远镜,它是所有人心里【憧憬着】的夜空。
只有“人”才能定义“完成”,只有【最终用户】能定义函数和类型【应该】有多复杂、排名是多少分。
计算机科学无关计算机,就像天文学无关望远镜,它是所有人心里【憧憬着】的夜空。 🎇 🌠
Please open Telegram to view this post
VIEW IN TELEGRAM