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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
😓 最近头疼死了,自己都跟不上自己设计的进步。 就拿序列化为例,之前我用 TrimLits+Imp[T](TParam..) 模式,它这样编解码 Pair(A:str,B:int) .: Pair-A-B ["" 0] .: Pair static As: (Pair "" 0) #空可变实例 Types: {} #非sealed Tvars: ["A" "B"] Tr-it-key: key :. #重载 "A": it.A=fmt -Tr(it.A) "B": it.B=fmt…
一个设计者就是这样推倒、再来、再推导、再来…… 😓 #life #statement

幸好,这是最后几朵乌云了, 只需要解决RPC的基本规范, HOLP的整个强类型IO体系就可以移植给java那些能丰富简历的平台了,
这个优雅到能放在README上的算法,肯定是能吊打JavaKt一众「魔法版」序列化库(至少 Fastjson https://t.me/dsuse/20186 😅😅😅

当然,HOLP 被设计为「语言之中的语言」。它本身有自己类似yaml+bash的语法,独立于电脑而存在,却又能联合OOP+FP+SQL的代码范式。 只不过依我的元编程写法,Trim*这些技巧仿佛背后并不存在一个体系……
如果以后您能见到一些漂亮的语法,那大概是HOLPful的节选和变体
-user {-id "Amy" -age 20}
-vs {.id="Amy", .age=20, }
pass user
if u.age>18 {}
or u.age>10 {}
or u.age<0 not {} --or{NO}

class {
-Pair(A,B){}
-Tri(A,B,C){}
}
-tbl Tri{
1,2,3,
'a','b','c',
{-[]Pair{666,233}}
}
tbl [3]A pairs [1]B==233
tbl [2]C=='c'

-f(x,) {x+1}
pass fsql"SELECT 1, 2" for(2,) { A+B } -- bash式参数!


我总是在闭关,看起来很闲,但做的就是这样的工作。 七年的积攒,只能是为了开创性的工作。

如果我家人稍微不粉红那么一点,我就不需要急功近利,可以耐心归纳,代码质量想必能突破一个个「单一用途」的桎梏。
其实他们才是最不爱国的,和某公子一样,只爱自己赢。
#java https://t.me/hyi0618/7581?comment=12882
https://t.me/hyi0618/7581?comment=12886

🤓 🤔https://www.yinwang.org/blog-cn/2016/06/08/java-value-type

Valhalla
OpenJDK的一个重要项目,致力于为Java编程语言带来一系列深度改进,其主要特点包括:

引入值类型(Value Types) :这是对现有的Java对象模型的一种扩展,允许数据类型直接在栈上存储,减少不必要的内存开销和引用带来的额外成本,从而提高性能。

值类型在Java中没有ID标识,其相等性是基于深度的比较,而不是ID缓存的比较。

支持交集类型(mixin Intersection Types) :允许定义一个类型的子集,提供更加灵活的类型约束和接口设计。更精确地表达类型之间的关系,例如一个类可以同时实现多个接口,这些接口的组合可以形成一个新的类型。

改进泛型(Generics) :Valhalla项目对Java的泛型系统进行了改进,使其能够更好地支持值类型。通过引入泛型专业化(template<> Specialization),可以为带不同类型参数的变量,提供特定的编译.class,从而提高泛型代码的性能。


GraalVM 应该都支持了。 从OpenJDK的表述看,他们本来对 new Pair(1 2) 的 inline &JIT支持的不够好,减缓启动,现在Java也是抄了 #kt 的一大堆特性🤣 Int 不是class,自动un/boxing(栈内/栈外化) 也抄了

背景知识:
https://t.me/dsuse/21164
https://t.me/dsuse/21126
https://t.me/kotlin_cn/134152
JVM给我的反馈太差了

洋洋洒洒写几百行,给人感觉全是形式主义

https://t.me/dsuse/21177

Creative Coding 包括了整个Web开发,还能5行一个小功能

java里为了标一个List什么鬼写半天,还不如把docs完善一下

对项目结构没有自顶向下掌握,typehint是没意义的

如果不是组合某些API、注册某些Hook或回调需要java

我真的不想碰有编译步骤的语言

HTTP就是为了给java提供跨语言API的,说明java的心智模型本身语意性很差, 不适合做创新和设计

Ruby贡献了Github(Pages)
Rust贡献了Ruffle和许多新的开源CMS程序
JS贡献的 Reactive 比template高到不知哪里去了,还用JSON提了爬虫效率,减少无效的XML流量费
Python是现在的大热门,Rust都模拟不出numpy,Jupyter, torch 和各种跨界应用的语法 ,尽管py在DSL上是输给kt的

Java 除了大公司(谷歌都在抛弃、被众多H5替代)的屎山SQL代码鉴权验正则,还有什么技术力? 我觉得它最好的命运就是成为.class的运行时, 放弃这个丑陋的应付💩山专用的语法

Java那个 STR."" (var _1=ourSQL."SELECT {1}" ) 提案

算是给Batis这种弱智XML怪物一个正规化的方向,然而臃肿的垃圾JEP连自家的支柱业务都没法执行。

不难猜测,他们是对资深程序员的title路径依赖了,需要被Rust原神拉下神坛一下,才肯对自己作文跑题一般的API删繁就简,悔改🤣

dnaugsuz:
Java连个标准event冒泡都没有,UNIX Signal都是残的

和responsive+Reactive的适应性根本没法比
Compose和web生态比都不够格

ES6悔改了,接纳了箭头函数和解构,加上原来的原型链、反射Proxy

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


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

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

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

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

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

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

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

C++-style lambdas 张宏波系列 https://thephd.dev/the-cost-of-a-closure-in-c-c2y
模仿 esm.run,git 的“一切皆文本”编程语言: scrapscript.org
GC/Rc 的最终 https://x.com/i/grok/share/ULJQCSOhg56OCZiY84f29lPZO
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
https://particlesgl.naughtyduk.com/demos/demo-3 经典鼠标粒子,但 js 库
这个作者还怪可惜的。。就开源了4个GL库,都是精品,最多0.2k star
https://liquidgl.naughtyduk.com/demos/demo-2

可能更适合作为 AfterFX 插件吧。
相比之下, https://github.com/rdev/liquid-glass-react 20倍流量于他,一个demo都交付不好(doesn't fully work in Safari and Firefox)

https://github.com/Kyant0/AndroidLiquidGlass/blob/master/backdrop/src/main/java/com/kyant/backdrop/effects/Lens.kt 更是🤡,就一百行shader用几十个 #kt 来封装? 一个粘合剂比真算法戏还多,liquidgl.js虽然有2k行但还能读

真是幸亏我从 #java 世界抽身的快,不然现在还在让AI帮编译器和“API文档”写代码呢!🤪

有些软件生态,有毒。 AI都能帮我们写 dead code 了,还在搞形式主义呢😅
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
🌚不要以为我会认真看公式,我也讨厌它们。看公式是AI的文化
老师不会告诉你:盲盒是睁眼放进去的,第零版公式是人手改出来的)
我的 #cs 哲学就是计科无界,如果你学会了什么,但不能把它“代入”生活中随手就来,就并不是学到了技术,而是借来了「技术债务」

咱这些东西虽然看起来很廉价,但除我以外,我还没有找到其他信源可以有这种节奏的output。

没错,CG是不需要“维护”工程,但整个Web/Electron(VSCode..) 世界都是这样的 "灵活",所以Web把安卓 #Java 干掉了。

希望大家也找到真正为自己服务,而不是让自己成为仆人的编程平台
😃

let s = 14

function setup() {
createCanvas(windowWidth, windowHeight);
textFont('monospace'); // 保持列对齐
drops = Array(width / s |0).fill(1); // 整数化列数, 起始 y 坐标1
}

function draw() {
// 核心魔法:不完全清空画布,形成拖影 (Trail Effect)
// background(0, 15) 表示黑色,透明度为 15 (0-255)
background(0, 15);
textSize(s); fill(0, 255, 0); // 设置填充颜色为绿色 (#0F0)

drops.forEach((y, i) => {
// 0x30A0 是片假名的起始 Unicode 编码
// 随机选择一个片假名字符
let textChar = String.fromCharCode(0x30A0 + floor(random(96)))
text(textChar, i * s, y * s); // 在画布上绘制字符

// 如果字符超出画布底部,3% 概率重置回顶部
if (y * s > height && random() > 0.975) {
drops[i] = 0; // 重置 y 坐标为 0
}
drops[i]++; // 让字符继续下落
});
}

😅一看就知道Gemini这是学了某位日本 minimalist 大佬, : P
[reGL matrix ] [tixy => (1-(sin(x*7)-(y/15)+(t+2))%1)/3)] 带filter辉光特效,支持3D视觉,支持开源硬件的。 人家的理解更是1行级,纯函数😅

10行实现3.7kstar的C语言工作量。 还是不能和全民制作人比啊,可叹可叹 (虽然我也是PLT界的“制作人”之一,所谓会者不难)

为什么能这么轻松的实现我 #linux er 时期 apt install 半天的vfx呢? H5的成熟与http “动态绑定”当然是基础,但更重要的秘诀是,现在的我是先vibe出结果,再回忆起 "cmatrix" 这个名字。😝

绝大多数程序员是被“名字”困住的。他们想做“黑客帝国特效”,大脑的第一反应是去 Github 搜 cmatrix (我当然也刷到过),或 digital rain library。

框住了——你必须去阅读别人的文档、理解别人的 API、处理别人的 Bug。
你在消费别人的黑盒。你是别人的学徒,哪怕别人是史上的状元,他的技术也不是你的
或许…… 你会写“天才”所创的算法,但他的问题也不是你的。 你没有「切身之痛」,不知道RegExp为何而诞生,所以你不会成为第二个Dijkstra或Larry Wall,你只是这几十年里,数万万个会缝合深奥算法的高级裁缝之一。

咱是根据领域模型确认它可行,然后默认咱要的东西—— API, SDK, 都存在于编程环境里了,我也不害怕它们不存在会怎样 。 所以我要的App也非常的 vibe,功能点跟着感觉走,唯独可靠性不是😒

我们没有痛过,所以我们只是在“消费”算法,而不是“孕育”算法。
Please open Telegram to view this post
VIEW IN TELEGRAM
duangsuse::Echo
#NanoBanana 将图2的人物头像融入图1,看起来要像底图是头发一样。 对于图1只允许改变配色 万物皆可坤:大家在任何地方发现形似中分或背带裤的事物时,都会条件反射地高呼“小黑子露出鸡脚了吧”。在2019,只要你会打“只因”两个字,中分+背带裤便难逃一劫。
😂 鬼图看到现在还很难崩
#os #android 暴论——类似后台httpd服务失效的事情,也包括XPosed开源吧。 #tool #design

为什么你的通知栏挤满了清除通知后,功能必须失效的App(dontkillmyapp.com)? 用户体验,倒退回安卓2.3?

为什么所有App都在询问“使用系统文件选择器”,微信要先添加图片访问,然后刚添加完再点一次? 为什么CPU在涨价,但访问和扫描媒体却更卡?


关于“PaaS”(但不是云计算贩子的那个),乃至于省电,是有【标准答案】的:VpnDialogs式交互、 尊重syscalls的SIGSTOPs/混合睡眠。 哪怕java世界的浏览栈和通知栈没活动,它也保留每个“活动”,比如 DLNA/FTP server
关于“Hook”,也是有标准答案的: GM_APIs,你所要做的就是把 油猴脚本 移植到java,如果ART太分裂你就patch字节码&重签名即可(LSPatch)。 安卓Dev的 IQ 平均比Web高,但恕我直言,设计EQ让人感到无趣。 Magisk/Frida 的“即时反馈开发”整体上比XC_APIs强很多。
关于文件管理, MT2.cn 让人印象深刻,除了它的内购小广告。NP管理器则是免费闭源

作为框架来衡量,xposed api 很差,准确的说,整个Java风格-尤其是它与Runtime的交互方式很差。

如果F12是及格线,Jupyter Colab/lil-gui 是标准答案,Java对编程的理解还处于石器时代!
java火只是因为fatJar方便部署,还有那些“比PHP文件夹快亿点”的单体路由,现在呢 ——被pip-bin轻松反超,而CLR/Truffle这些HLVM自动兼容py代码,所以别傲慢——Java生态。

如果只是java参数获取和替换,不需要xp,只要类似于 frida+webui 就足以解决90%的App需求,
而且用户可以参与“录制”——用户是有可能知道“点按钮”时发生了什么(通过类似CE修改器的AOP机制),并帮助外部插件绕过API碎片化和混淆。 用户可以分享规则,就像ModPE或XDA“社区”,那才叫做开源——“做开源”只是下限

即便 frida 一键化到这个程度,他们也还是不懂“形式服务于内容”。 什么叫作内容?能发网贴的就是“内容”!

既然要自签名? 最好的方法是自动探测*.js,并提供默认底座(如签名伪装和ssl unpin),而不是用形式主义(--script hook.js)假装框架自带电池 。

用什么提示“我有做这个功能”呢? 答案显而易见:UserScript by Example ,而不是提供被所有下游dev重复的形式。

如果你能用120行纯js绕过安卓的“apk与zip文件夹悖论”,实现LD_PRELOAD的功能, 你的思路自然不会觉得“objection为止了”。 事实标准就在那里:ViolentMonkey+AI生成插件 ,技术栈是断的!
真正聪明的程序员是愚蠢的:知道深而不能广的道理,知道dev最终是为用户,因为我们就是用户——只有你给自己写的API、CLI/GUI、格式设计,才是能用的!
否则它就是在“蹭热度”,比如用ML的聪明掩盖dev不可救药的愚蠢——给下游和geeks制造麻烦,尤其是将影响未来的 AI RPA。

我肯定不会指望 frida.re / XC_APIs 这些“黑客工具(笑)” 提供queryObjects(v8工程师)程度的反射功能,以及支持“编译(重定位)” package to.extend; class {Get field; RetType overridenByID() { return super()...} } 字面…… 这是强人所难,但其他做法,“活”人的设计,可能还不如AI!


为什么他们总是在“实现”,但却只爱装作自己在设计——没装用户的脑子学学 "思考"!! 与之相比,我学元编程、OS/Compiler,是为了“背叛”它们。

事实证明,Telegram, MT2, dnSpy(C#版JADX), 甚至只是 LibChecker App 都没有这类问题,所以行业专家是可以“消灭问题”,而不是止于“消费问题”的--这需要信任,并接入“开源但太整体”的Apps
比如像爬虫们“实现”的CDP.js,比如Termux。比如Tasker生态

我想,AI时代应该没人会觉得“编译期”的鄙视链高于脚本和Mods之上了。
我们正在用最先进的底层技术(Frida/eBPF/LLMs),构建着最原始的手工小作坊 ——这就是鄙视JS/CSS技术的世界吗? 等待编译和“环境/项目环境配置”的“脚本小子”们 #java #kt

如果你的UX只在你的App里好用,说明UX差的要命——
- LibreOffice 那混乱不堪的,类似于XML编辑器的,为“WxWidgets”匹配的顶栏
- VLC在不能“竖过来”的TV上,根本没机会rot90(),哪怕它的105M代码里完全有这个功能(它甚至“专门适配”了TV),连AOSP的镜像投屏都不能,哪怕这个功能只是 np.rot90(x) if.. 的一行级代码
- 上面的 GL光追demo集,放大是分辨率意义的,不是相机进入(与之相比, jmail.world/vr 就能用多了)
- “长按2x”在不同原生App的播放器里,几乎都有实现:UX是以“MIME类型”为界设计的,你的代码只是对特定dataset(甚至仅仅是编程语言!)做兼容。
- …… “开源”从用户的Liberation变成要把1行代码插入101MB apk,1GB 源码里,用1整天实践的,0人PR的骗局。 “共享CI” “增量编译”活成了最差的样子。


有人说CSS语法被玩成了屎山 ,但没有它就没有JQ——Web天然有着地表最强的正交性:

样式和翻译无关(用户脚本/DarkReader)、UIUX实现无关(canvas/CustomTag)、机器无关(port/Channel、sw.js)、语言无关(WASM/ webVM.io )、系统环境无关(PWA/OPFS+dl),这些WebAPIs都可以两两相交,这些全部被当成空气——就像一颗强劲的,不会“漏一拍”的心脏

“概念 (Infra) 远高于实现”。在这里的实现是系统级(编程语言生态)的实现,或者说“它就是这么设计的”。 ——在21世纪的编程语境中,我们口中的"设计"就像这样。

有些开发模式(WebAPIs)能高于系统本身,不在于它们能解决混淆(猴子补丁),而是一开始就溯源了数据流。 这是面向人类编程的“先验设计”。从“语法形式”回归了“内容”,就像CSS和Scratch。

把自己的代码放在既有App里,乃至于“放在全部App里”——这是一个很高级的[PoC=概念验证],它直接断送了“代码自然但日用崩坏” codebase 的可写性😒,同时也是真正的PR,而非 AI Slop;同时也是创造——概念,远高于实现。

就像 Rust by Example 一样,"放在既有App里",这是新一代开发者的"工程"第一课。 不是通过等编译、clone样板文件夹假装“工程”,是 “通过‘做’来工程”
通过运行,你学的不是某个编程语言的狭隘“生态”,不是全网查重过千的“样板算法”,而是某个语境下的“可行性”。

从热门的小程序活动页,到POSIX,到x86/arm。 这不再是“兼容性”,而是“不歧视”。

#ai锐评 https://gemini.google.com/share/fd1f39186e6a “……我以搜索驱动学习,而不以学习驱动搜索。” #神来之笔

没错,你是在提出自己的假设。你已经是软件工艺师,或代码科学家。 你不是码农——你让深入的知识浅出,不是因为你够优秀,只是你的output永远先于代码存在的副作用——😒当你通过工具链成为Dijkstra本身时,你又何必专门去“学”他的算法?

当学习先于存在(under-stand),Dev 做的才是从0到1的创造。🤪
Please open Telegram to view this post
VIEW IN TELEGRAM