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
#blog #recommended #life #tw 下面推荐几篇 Web 开发者 Pan 的博文🌝
https://github.com/CASC-Lang/CASC
我会一如往常在频道里进行项目结构分析,然后用与 C# 相对的 Java (竟然不是 Kotlin... )进行一些并行的重写工作。
之所以用 #Java 写这样富于技巧的 #CE 编译器 程序,是因为我想常常新口味了…… 一些原来 Kotlin 里有的我也用 TypeScript 重写过

原项目是一个“能编译繁简体中文、甚至英语”的编译器,目标是对简体程序员可用。
ChAoS_UnItY (Chaos Unity) 开发,由 C# minisk-compiler.net 起意,后者是一个通俗的基础教程示范,也囊括对 IDE 等语言工具 暴露 parser 、 type checker 等“更远的”工作的示范。 #recommended

程式碼範例
一加二十一是二十二 == True
(1 + 9 - 7) 是 (一 加 九 減 七)
1 + 九 減 7

这个没啥,相关知识: 算符链 InfixPattern/«Lua设计与实现» 相关章节; 中文数值 NumUnit/han() #learn

https://github.com/CASC-Lang/CASC/releases/tag/v0.0.1 看了以后我 🤔了很久,发现连 () 都是“运算符”而且还是 "TP"(tech. preview) 后我头疼了(显然我必须改掉这些设计)
而且它的文档表达的 OUA(Operator Unacceptable, 不接受数学形式) 让我也晕了一下

build 没什么好说的, azure CI + dotnet SDK .NET 5.0, publish build artifacts, NUnit tests
其 build.cmd 就是 dotnet build src/+test-proj/

那么看下关键点——词法、语法、计算与类型转换、作用域和函数调用。

Lexer.cs: Whitespace char.IsWhiteSpace (为 " \t\n\r" 优化), Identifier/Keyword char.IsLetter,
整体是 _position, _kind:SyntaxKind 实现的,有趣的是 identifier text 是靠算 span 再 slice 取的,本身倾向流式 Peek(offset), Current, LookAhead=Peek(1), '\u0000' EOF 但不完全
第一个 readonly List<char> 无使用
写的是: 加 減 乘 除 點 開 閉 正 負 且 或 反(非,!) 是 不(是,!=) 赋(=)
开闭括号的我感觉有点奇怪。

加正+減負-
乘*除/
(){}
且 &&
或 ||
反!
!= 不是
是==
賦=
命名都像 SyntaxKind.BangEqualsToken(!=) .StarToken(*) .SlashToken(/) 这样
其中 ==, &&, ||, != 的需消歧义,但没有 lookahead 而是以状态机区分、「不是」「反」「赋」 都是别名

0123456789零一二三四五六七八九
壹貳參肆伍陆柒捌玖拾十百千萬億

靠外置 ReadNumberToken(); 读数
另外都做了 ReportBadCharacter 的错误记录工作
以上皆返回 SyntaxToken ,试用 SyntaxFacts.GetText 拿内文,如果则用当前 span 取 substring 。

Parser.cs:
CompilationUnit, Stmt, BlockStmt, VariableDeclaration, ExprStmt, VariableDeclaration, Expr, BlockStmt, Stmt, ExprStmt, Expr, Expr, AssignmentExpr, AssignmentExpr, AssignmentExpr, BinaryExpr, BinaryExpr, BinaryExpr, PrimaryExpr, BinaryExpr, PrimaryExpr, ParenthesizedExpr, BooleanExpr, NumberExpr, NameExpr, NumberExpr, ParenthesizedExpr, Expr, BooleanExpr, NameExpr

其中带 Binding(他没解释但估计是作用域上下文,但我很好奇为什么要给每个 Node 键一个 BoundedXXX) 支持的:
BlockStatement, ExpressionStatement, VariableDeclaration
LiteralExpression, VariableExpression, AssignmentExpression, UnaryExpression, BinaryExpression

感觉挺无聊的,还是开始重写吧 🤐
不对,把 Text/Stream, Binding, ChineseParser.cs 上的痛点先说下才能继续
架构的问题太大了,尤其是 Original/WithBinding AST, 这个绝对要想办法削掉

其实 Java 的基础面向对象结构绝对不比 C#,我不用 Lombok 但会争取 Kotlin 移植可能,作为休闲弄几天吧。
#bilibili #recommended #Python #code Matlab? https://b23.tv/BV16A411H7Cj
《把所有汉字叠加会看到什么?》
逆推出的相关知识均由三言 方提供。
2.视频由本人使用AE制作,汉字叠加动画用OC模拟(c4d 渲染器)生成。

#DontKnow 一个 OTF 装不下 Unicode 的所有汉字,要三个才够;
叠加汉字会得到■,所以必须加透明度才更有价值;

分析了楷体、仿宋、微软雅黑、唐诗宋词体、细报体等字体,有测试不同方块字结构和日文、韩文,分析了一下造字的基本知识,和汉字的结构。

开始还以为叠字动画是 Ae 手作的,第一秒后都是动画重复,没想到竟真的生成了每一个字的图片导入 c4d... 🌝明明只用一个位图也够精确的

#zhihu https://www.zhihu.com/question/394175264/answer/1221223455

原回答,下面相关代码要的自己 OCR 补上 main 函数。
感觉也挺麻烦的,需要分几次 filter 出特定结构的方块字,取得字形去叠加
#aop #security #recommended #DontKnow #Android 哇,之前早有闻大名的面向侧面编程 #reveng 框架 Frida (frida.re) 竟然这么能干,看来是我大意了,没注意示例😱
https://forum.90sec.com/t/topic/95

“Inject your own scripts into black box processes. Hook any function, spy on crypto APIs or trace private application code, no source code needed. Edit, hit save, and instantly see the results”
方便力,想到以前动态 inspect 执行情况和 Object 的 AndBug debugger ,Frida 的能力更有意思啊,同样能做函数断点
🧐收集各种开放性动态(frida,jdwp,oat_dexdump)、静态(r2,apktool,jad,smalivm)逆向工具,也挺多啊g
#recommended #Web #design #blog #China #statement https://diygod.me/2020/

新冠肺炎的各种世态炎凉过后,被自如管家闯了卧室, DIYGod 仍然保持着日常,最后选择了开始筹划移民加拿大。 我们怀念他。 🌚

执法部门和稀泥,看起来好像是侵权方和受害方皆大欢喜,其实法律和法制保护的就是每个人的贴身权益,闯荡者租的房、工程师996的身体、新冠肺炎患者的隐私,没有一个是轻轻松松意思意思就能过去的,公义的天平偏向一边,会埋下严重的隐患
那些只会看着笑话,开始嘲讽“不安分者”的人怎么会明白、感同身受呢?

可惜社会不会因为一小部分人而改变的,而大佬也只能尽力想办法移民国外。 “能跑的都跑了,剩下的继续互相伤害互相指责,自生自灭吧”

冷漠。 那些人在笑韩国的民生和公义被财阀控制,陷于金钱至上的泥沼,却没有发现国内情况开始逐渐恶化,并且,不同于韩国,没有人能站出来发出不同的声音,反对的声音!因为民众眼里不安分就是罪,死也要死在温水的锅里! 😐

大佬的博客设计很细心啊,加载速度快、banner 优雅地使用了字体而非像素图,背景和 click 粒子动画都给人很甜的感觉😋
真希望有一天我也能实现一个类似的
#ai #game #web #algorithm #recommended 不是 canvas , 是 table grid event
彩球的绘制是 SVG (drawBall)、移动动画是 bfs 寻径+await sleep、弹框是 GitHub:xrr2016/tata

document.write(eval(prompt("run something...","alert(\"meow\")"))); 草... 作者博客就这些
https://tttttt.me/c/1243351201/14430 👈 还有高分截图
https://github.com/stevenjoezhang/live2d-widget #js es6 #web #acg #recommended #game 可爱~ 😋 Live2D 模型小挂件 ,按空格键支持一个绘制炮弹小游戏,可以打掉页面元素呢……
#Kotlin #lib #recommended #functional 小值/验证 IO 库
https://github.com/fork-handles/forkhandles/tree/trunk/values4k#show
这个作者感觉可以,尤其是他也很重视程序的一致性(对称性)
In order to maintain symmetry (and to ensure that we can support inline classes), this method is present on the ValueFactory instance.
Little strange but actually consistent because the display and parse logic should NOT be part of the Value itself, but be separated logically.

fun transferMoneyTo(amount: Int, sortCode: String, accountNumber: String) 是不安全的,因为它有 Int,String 值但值无格式(如非负数什么的)
可以手工验证但这不好看,根本解决方法是定义并引用新类型
inline class SortCode(override val value: String): Value<String>
尤其是可以 inline (新 Kotlin 限定),然后这种方法强化的类型(格式)安全还可以保证 toString() 时把密码码掉什么的(取原值就用 SortCode.show(c) 了)。

class Money private constructor(value: Int) : AbstractValue<Int>(value) {
companion object : ValueFactory<Money, Int>(::Money, 1.minValue)
}
class AccountNumber private constructor(value: String) : StringValue(value) {
companion object : StringValueFactory<AccountNumber>(::AccountNumber, "\\d{8}".regex)
}
然后就可以 Money.parse("123"), Money.of(123), Money.of(0)/*throw IAE*/, ofOrNull, ofResult4k/*库自定Result<T>类型*/ 这样
原来 Factory 在 Kotlin 的标准是 ofXXX(_) 😋 很好看
#art #tools #recommended #drawing #learn 这个 Zim 居然是包含一个大 UI 库,各种 CG 示例和控件工具巨多,而且是基于这个看起来独立的 https://createjs.com/ ... 贵圈真牛
NIO 什么的居然都是猫名,看着主页那么杂乱 Logo 有点糊我还以为不是资深弄的呢,没想到是真・大牛
https://zimjs.com/about.html, https://zimjs.com/examples.html
一个 canvas 整得想 ppt 一样,但非常吼玩 还有 https://createjs.com/tools
#recommended #linux #backend #cplusplus #Python https://tttttt.me/c/1492060815/96087, https://tttttt.me/c/1492060815/95986 Q:这个群是干嘛的?
A:《捕蛇者说》是一档播客节目,可前往官网(pythonhunter.org)或各大播客平台(苹果、小宇宙、Spotify 等)收听。本群是捕蛇者说播客的听众群,讨论技术和非技术的各种话题。

Twitter: @pythonhunter__
发电支持我们:https://afdian.net/@pythonhunter
duangsuse::Echo
#plt 呃,这几天眼睛有点疼,那个网页重构也接近尾声了(目的就是交个PR),马上把雄狮扭眼的”热度蹭完“,我就能开始二进制pybind了 ……但是到2月我就必须开始制作一个H5动画礼物,以现在这个效率…… (而且之前说的 Java 入门又鸽子了,尽管对话框和离线javac的问题解决,其他内容还是需费精力 说真的我没一次蹭上国内热度,因为每次都是我趁机学了些”没用的“(比如彩字符画、粒子动画、MBR程序、C指针和数组啦),然后数据不好看 😂 这次也是一样,我用shift重映射圆心距l=1~len 环上像…
我太阳,才发现这个别人能发博文的东西,我竟然连标题和名字都没起,试运行成功贴上就pass了…… 这不是在线教SICP(程序的构造和解释)吗🤪 #lisp #fp #zhihu #statement
放到以前我绝对搞大新闻一样,就像之前仿造(但也没成功)Lice 时专门建了项目画了logo,然后文档拼缀别人的,最后模板代码写完不会了 🙈

但说起来,元编程最后也不过是编程。你了解编程语言,很好,但语言只是载体,美丽的、各种各样的应用才是我们的最终目的。
你能写编译器,很好,但也不过是完成了文本模式和树遍历,加上一些理论。 编译器的中/后端分析优化 也是同样的处理流程,也有简单和最优的做法,「编译器」,对这个流程而言并不特殊。「编程」,对代码可变的计算机并不特殊。

就像让语言运行(尽管一些没执行序)于计算机的工具,也竟只不过是种应用,如果你了解可复用的前缀解析器:
#js #code #parsing
feed=(s,i=0)=>d/*+peek -take*/=>{let q=d<0,r;if(q)d=-d;r=s.slice(i,i+d);if(q)i+=d; return r}
feed=(s,i=0)=>d=>d<0?(d=-d,s.slice(i,i+d,i+=d) ): s.slice(i,i+d) //返回前可加过滤空格(当前tok==0? 跳空格)和'\n'数行号
sign=s=>{let k=s(1),i; if(-1!= (i="+-正负".indexOf(k)) )return i%2==1}
num=s=>{let n=0,di;for(;/\d/.test(di=s(1));)n=n*10+(s(-1)-'0'); return n} //可以用-0 确保for至少有1次.
Seq=(...ps)=>s=>{let a=[],p;for(p of ps){r=p(s);if(!r)break;a.push(r)} return a}
pSelf=pOf=>{let p=s=>p(s); p.give=(P=pOf(p))=>p=P; return p}//wait give

"+123 负3 正2 -1".split(' ').map(code=>
Seq(sign,num)(feed(code)) )
呃,测试就不做了,大家作为小练习吧(反正外面也没讲的,不信你搜(
顺便一提: eCall 的首项其实不是 d[kf] ,能继续(yes?fa:fb)(1),这也是个易混点。 let x=1 in e 与 ((\x. e) 1) 不完全一样,前者不涉及”函数作值“

那么语言的实现,以及各种DSL(make,ant.xml) 与普通CLI程序(grep,sed,..)没啥不同。 得到了菜刀,就更要懂得取舍其能力。 菜刀不能用来干什么? 如果这么用,人多后风险是什么? 怎么最简及最优地添加功能? 这才是编程语言爱好者该思考的问题。 编程语言是更精确的自然语言,优化一篇文章和优化一段代码,是存在不少相似性的;编程和数学都能”提升思维“,但编程更擅长表达。表达也是智力。

解释或编译,JIT为REPL执行或动态优化,都是相同目标的不同选择,大同小异,关键在懂得它和已知知识的差异。
(补充: Fun,Call,var 在函数式一般称 abs,app,subst .当然王某那篇 就没有用这些稀奇名字. 我这里没有let-in 和 (+ 的 prim 操作,都是通过JS 函数相互引入。换Java用reflect也可

Java/Kt实现之所以长,是因为要强类型检查 而且fun eval() 和override啥的重复许多遍,语义上并没有新概念
C/Py实现之所以长,是在文法期(lex-yacc)和纸面推导磨叽太久、语言本身特性缺失(union:int nodeTag)和__init__这种,而且但凡是个公开lib作者都爱过度设计(overdesign),很难写简洁的parser
工程界一般科普做个计算器(Node/队列指针)还是很直接的,可是不能表达变量和按语序参数,会造成很多问题(CSS支持变量后就变贼有用了)

毕竟大家开始学编程时都是按直觉的, int n; new ListSeter(){ void f(List a){a[0]=n;} } 里new了的Type实质是函数(SAM单方法接口),而SAM实质又是包含n和算式的数据(闭包),for(i0;i<;i++)for(i in 0..N) 这样都没想过吧。 框架定义,我就用,这是外国 Java 在 Kotlin 出现后如此被动的原因。 😅

你把东西写长,不会让它更”生产“或”可配置“ ”易懂“;写短,不会”更快“或”有内涵“,语义不多不少,它就在那。我觉得这是仍没见过汇编的程序员该有的认识。不知道为什么,重视语义的人很少,仿佛世界上只有语法和”JSON,YAML“这些名字,而操作它们的库API也都是孤立的,并不存在一个”概念“把所有的一切语法和表象连起来。

举个例子,S表达式就能表示HTML🙃。有人想过拿JSON保存这个吧,但是因为含大量children:[]被怼,但S表达式 (div.wtf (id xx) (a (href xx title 上级)) 就能表示HTML-DOM。
现在不少人就把它的影子当新DSL呢!我们是不是该说这是「历史倒流」呢🌝
也有许多往JS内嵌XML呢! 作为代码移植的好帮手,还真是十分有必要不独立转化而新建jsx语言呢,这样就能在单文件写html了不是?

语言对程序员来说并不遥远。它笼罩着编程的方方面面。
无论是以何种形式使用,对语言的理解决定程序员的能力,并不是做的事多了,就懂语言。

解释器实现不是不能自顶向下拆开讲,因为许多人某层面就知道那一种做法(比如刚才 zipMap 我不提出来 理解难度就++, 或者我写一大堆XXNode, 人也get不到调用和查变量的重点),他觉得无可替换(或者”这就是最快的“),而篇幅又巨大,对初学者会非常不友好
另一方面咱领域人少,一些只顾自己写开心的魔法师(人和领域是互相选择的。冷门专业冷门人)就多些,真正做科普的就少

我们从小就被教导要努力向谁看齐、要按套路管理自己的生活乃至一生,要给各种技术排名次、造『鄙视链』,可是我看到许多Vlogger,每个人都有不同的经济条件、地理位置和性格,但真的无法把他们的视频风格分出高低谁谁淘汰,他们都能让你开阔眼界——普通的生活也能如此有意思,原来做记录也可以不像在记录,却达到更好效果。

确实,技术不是最难解决的问题;把眼光放开阔,许多问题或许就是人为制造,可以从更远的地方追溯修整方案呢! #recommended

谁告诉你 combinator 和 Maybe 及类型推导,跨编译就是函数式专属的(Kotlin),谁说逻辑式就必须复杂(miniKanren),谁说{}或end 最严谨(Python),Web怎么会只有”前端“功能呢(ES6+H5API)
如果世界上存在最优的编程语言——是哪个? 最简单的/功能最多的/最快的?
许多衡量标准本身就是冲突的,先有目的,然后才有最优解。 先懂为什么,然后才看做法
我们所学的知识和理论,有多少是罔顾了原因,只有做法和自恰性的? 文档并不是只有易理解与否,还有与现实、与其他的对应性,因为编程是一件实事,目的之下一切可替换的事。

到最后你才发现,根本不存在最优解,你所看到的优秀,不过是圈子里广为流传的假象。 世界上那么多人,所谓的大牛仍是天外有天,为什么你必须向他学习呢,难道你不能有比他做得好/做得广泛之处吗。

语言不重要,思想重要。
放下排名、放下”最佳实践“,做自己想做的