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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
#ce #plt 带步骤的四则计算器。递归逆波兰。22行代码 浅先=`;=;+ -;* / %` 流=(a, _s=[...a].values())=>()=>_s.next().value 切2D=(s,sp0,sp1)=>s.split(sp0).map(s=>s.split(sp1) ) {let t={},k; 切2D(浅先,';',' ').forEach((x,i)=>{for(k of x)t[k]=i}); 符深大=t} 符链=(s,l)=>{let a=[],add=x=>a.push(x)…
#bilibili >那你现场写代码😄
回复 @iiicp :以上是()和算数表达式的求值栈生成,加起来10行。 活动期分析后就可以临时变量到寄存器,或者干脆每个+-用既有栈变量。
当然,C会比JS多费不少代码

但我是认真觉得40分钟太长。如果真的细节到此程度,你可以加提纲,先说说要写啥、涉及啥流程和修改,再放PPT​

你能火是我想不到的,第一期视频我就认为会石沉大海。因为我也会写些涉及文本结构和计算机绘制的东西,在B站这些很少,因此更要注意可重看性。

如果你打算更100天,回头发现这些录屏复习起来很困难,应该就会意识到简洁和代码大纲的必要性了[藏狐]​


@iiicp :Up哥,就是parser这块,看的不是特别懂,可能是,编译原理,语法树,这块,没怎么弄懂​。

1 是常量, a 是变量
a+1 是表达式, (a+1)+1 含括号也是:单项a亦可为(中缀链)
if(a) a+=1; 是语句
表达式都有「值」,语句都能「执行」
表达式也是语句。而在C里,(a=(b=c)) 有效,py里f(x:=1) 有效
它们可以互相引用,像 if(表达式)语句; {语句;},构成嵌套树结构。
最深项先执行,把树变为值称「解释」,
保留中间数据,即区间推断/地址安排称「编译」​
编译的目标是可执行,比如函数,再由「虚拟机」的调用语法填参执行至ret/throw,函数内和脚本顶层是一样的;Java大定义和{},= 内则不同

(为什么要说这么笼统的东西啊喂!😫

常量来自tokenizer分词器,如 "str" 1.0 ,特殊名字如 true 是具名常量;C宏就替换为词条列表
变量可以是 能import的全局表键k、第j号局部、外i层函的第j局部:参数是调用时检查的n或vararg个局部量

(a)=>()=>a 称为词法作用域,a就引用上1层第0号局部-同时是参数。
闭包=匿名类型的值,根据上值(upval)组 "this" 的不同行为不同,它是数据和程序的交汇,Java new-匿名子类。有种Church丘奇编码法: true=\y n. (y) ;false=\y n. (n) ,因为函数是值,能到处传,可以这样。
(值)任何计算的参数,和结果
(弱类型)变量是编译期尚不确定的值,因此+-等需针对2Number有定义..
(强类型)变量值有范围确定。子类型里必是成员集更大的 :T 子类(多态/覆写);可试每位置<TP>归一,类型推导
(副作用) 计算值不能描述的效果。只有数学没副作用,程序只有内存和CPU,限定mut的范围

只有值都到齐才能计算(常量折叠)。其实编译和运行期只是语言执行的实现方式导致的区分,语言本身不限定静态或动态
其实OOP或FP只是数据结构语法导致的区分,算式本身只是参数凑齐,计算更新,单函数不限制功能个数

https://t.me/dsuse/17412
我们都很可怜😔 无论闭包或this都不是廉价的东西,至少不是热销的
#ai#game 魔改就很热销, #algorithm 如前缀树也很热销

Lua和JS,Py里无论有无「独占」名字,函数都是闭包。C等 里函数只是代码指针,也没有局部函数。
一般的Ruby,Java/C#/C++ 则对OOP和FP的等效概念做了较大区分
PHP和Unix族之类我不清楚,它们像操作系统改行来的🌑
#web 过去有那么多 HTTP-API 是因为没有 WASM ,现在能客户端计算,能做的更方便了
比如 canvas 能画 video ,video.srcObject=nav.mediaDevice

之前在B站看这个face-api.js (TF.js weights 只有jsdelivr托管) 都不知道它 matchDim{w,h} 以及取vid.width是在做啥,才发现是重复取设置,resize.. ,在网上找的旧版API都不能用🌑,只能自己把画框框 找到,发现和这个一样
#web 真的是很有力的设计, WebSQL,WebGL/2D,fetch Blob,Paint/Cache Worker,history浏览栈, ObjectURL/VFS, CSS和SVG无缝兼容、DOM模板;这都是许多其它平台"赖以知名"的工作,在浏览器里这么普通暴露了统一简洁的API,许多设计远比其它语言里的等效物高级-DOM有文本等价,也能用来填模板,和最初的PHP比就是思想层次上的差别,比现在的常见模板更规范,只是一些人觉得非得设计lexer 才叫模板语言😒想想 JavaEE 的选择为啥越来越杂 ,不就是因为都在嫌不够炫不够严谨吗?

按下F5就能看到执行效果,控制台敲下就查得到文档;直接切tab就开始搜示例,毫无IDE的芥蒂

JS是同时有C的短写语法和 FP模式匹配,适合临时草稿和正经代码,还能用元编程简写,整个web就只有这一门程序语言,没有杂七杂八的构建语言啊、资源、模板和套话啊
ES6引入的 `` 和 Proxy{} 也很有用,结合 with() 甚至能并肩Ruby元编程,但是一点也没Ruby的繁杂,很合理的引入了扩展性

除了前端界听风是雨、金钱至上的一些坏毛病,webkit技术真的太牛了
duangsuse::Echo
#web 真的是很有力的设计, WebSQL,WebGL/2D,fetch Blob,Paint/Cache Worker,history浏览栈, ObjectURL/VFS, CSS和SVG无缝兼容、DOM模板;这都是许多其它平台"赖以知名"的工作,在浏览器里这么普通暴露了统一简洁的API,许多设计远比其它语言里的等效物高级-DOM有文本等价,也能用来填模板,和最初的PHP比就是思想层次上的差别,比现在的常见模板更规范,只是一些人觉得非得设计lexer 才叫模板语言😒想想 JavaEE 的选择为啥越来越杂…
#statement web所做最好的事就是所见即所得,数据更新-程序重做 相当自然,不像一些平台里要大堆代码,因此才有了 DevTools 这样优秀的查看工具

当你要在网页画画,唯一的选择就是 canvas API,没有那么多专用名词要记,基于CSS和Blob也容易后台绘制和下载,API只是最直接的,不需要任何教程,而Path2D上只有不到8个成员,不会提供什么“工具类”-CSS 语法足够了

一些人觉得代码和结果太直接会让开发者养成不会思考的坏习惯,这根本是错的,只能让思考的层次更高,从而产生更多好玩的应用。有种别用 inline color picker 之类☹️
duangsuse::Echo
🌚层叠的标签打得比我好,溯源也到位,内容我关注的其它频道没有……它变了 反正我也没打算搞IT🤪 层叠的风格的确变认真了,来源也多了,和它一年前相比 https://t.me/outvivid/2603
https://t.me/outvivid/3320
我感觉应该收回😒 因为它这个新闻 #plc4x 打得毫无意义,也没解释 PLC..4x? 到底是干啥用的,'faker.js' 好歹半俗半释吧😒

说句题外话,我觉得 Marak 根本没分清 opensource 和代码变现的关系,开源并不是对软件的声望没帮助的,他开始选择MIT就是个错误,但现在换许可也于事无补了。 倒不如说如果 faker 选择 free trail 闭源,那许多人哪怕用小数据集sample 或者开源替代也不会用它吧
你一开始做个产品页,会有压力

数个开发非常费力的js小众ui(模拟gimp面板啦..)框架, 代码混淆器就是做得很认真,但好像收益..额不 人气也不如开源"低功能"版本的东西吧😒

一边想挣同行的钱,一边不想用更友好的开源方法(我们不是啥都买冤大头用户..),成交量就会有损失

最终问题是面向公司用户时,MIT许可证不能强求别人付钱,被白嫖,甚至有一些刁民或奸商声称是独立做的

每次看到这种把开源当私有原创的🐶独立开发者就来气,您改名您🐴呢,核心做法谁的你不懂,拿来就原创?国内是有不少! 更别说自己还是被 retool.com 付2k USD就套壳的冤大头

所以实际上是原作copyright的问题... 就主动投毒死循环来说,我觉得.. rollup供应链攻击的确该改进🌑,是js界该改进
大家应该会原谅他,毕竟被火烧家了

但,MIT是他自己选的,那时怎么会知道火了仍穷的世态炎凉呢😒
#web #english
CSS cascade 级联样式表
HTML hyper超文本 文档
HTTP 文档传输协议
HTTPS +SSL socket layer 安全传输层
DOM 文档对象模型/树
URL uniform/unique 全局资源定位 locator
JSON JS对象表示 notation
CSV comma, 切分值
PNG portable 跨平台网络图像
SVG scalable 可缩放 vector矢量 图
FTP 文件传输协议
SQL 结构查询语言
SDK standard 基础开发 kit 套件
Forwarded from Programmer Humor
[other] Web Dev Acronyms
https://redd.it/s42xxo

by @programmer_humor
MAT / IFW 禁用方案分享:
导致星巴克崩溃无报错的S服务
此服务似乎来自梆梆安全加固企业版 com.secneo.apkwrapper.r.S
胡乱分析了一下,这个 S 服务会访问 int com.secneo.apkwrapper.H.o(Context) 静态方法,这个静态本地方法,当本地库返回值小于等于 0 时会直接调用 System.exit(0); 所以也没有错误日志出现。
本地库为 libDexHelper.so / libDexHelper-x86.so

#reveng 🌚为了帮助大佬(如 GetDex)们秀memdump和art插件等 #aop 基本操作啊

>我一直想加固到底有什么用呢?
它不也是防君子不防小人的东西吗?甚至于所有字节码如果想让系统运行的话,那系统一定要可以识别这个字节码。
那如果一个系统本身在加载字节码的地方提取了一份,当搜索已加载代码中的引用,来不停的请求 loadClass 之类,那么加固外壳的解密功能完全不可能拒绝系统的这种请求。最终依然会被探索出被加密代码的解密字节码(


稍微有点 #bin#assembly 常识也不会相信这些吧,难道不是不理解struct才相信二进制和mem不可读?
掌握程序=听天由命,掌握解释=掌控程序 🌚

我对IT交流的科普力是失望的,代码写得🌸时非常开心,一谈到低层抽象都有武德了,就会用个序列化/反编译工具;当初万能汇编器的时代去哪了
Forwarded from 神奇的笔记 (立音喵)
加固是坏文明(x
Forwarded from 螺莉莉的黑板报
让我来了解一下家里的内网结构┐(´д`)┌……
#China #net 🤔确实呢。百度贴吧 虽然闹出过事情,但许许多多贴吧的内容都是很好的,精品或许消失了,最后就像没存在一样……所以开源真的很好
#net 播客...KODI 项目有插件吗 🤔 >主播似乎有一些误解,作为小宇宙的后端开发,我稍微解释一下吧。 我们没有“只认某某平台”,像主播使用的Github Page,小宇宙内也有很多节目是建立在Github Page上的,也有像《Anyway.FM》这样完全自建RSS的节目。 公告功能在短暂的内测后,也是在几个月前就开放给所有主播,也并不存在迟迟不愿为主播提供的情况。 认领节目的过程确实是遇到了Bug,但在收到了主播的反馈后我们就解决了问题,随后主播也就正常认领了。 作为开发,因为Bug给这位主播造成了不好的用户体验,确实感到抱歉,也希望大家理解,没有那么多别有用心吧。
#ce 看到new WebAudio 就想到Blender 着色器节点,节点能不能表达为 f(a,f1(b)) 的形式呢?即便无关执行序(新旧值问题),不行,因为f1的输出可复制多个

SSA单赋值正是带执行序的 Node图,只是节点图里变量都是靠连接表示,而程序变量是有时序指代的,例如 a=1; if(q)a=a+1; f(a) 间这个a就是运行时不同,在LLIR里 c=phi a,a1 就是把来自不同前BB(if,.)的计算整合,当然你也可以直接store&load,就没有SSA问题了;IR form也就是为便于优化,现在在函头alloca mem2reg就成。
https://www.zhihu.com/question/24992774

SSA本来是无关内存变量或寄存器的,全交给分配器解决是放哪。(Lua)是干脆算计算栈最大深度,然后编号位置 不复用,而FFI(native函数)的 CDEF 调用约定和 struct{} 靠指针 load/store 就行了,也是SSA Value;现在的做法或许更好,C语言里for(;;)也不止能迭代1变量,变量值源自哪个{} 就是很难区分的

#statement 我觉得好的程序应该是一个模板,填哪里的哪种数据都能用的那样,仿佛只是数据的脚本和限制,话筒交给程序输入
程序不该内嵌有太多常量
我开始用对照输入输出的方法设计程序、以其他的领域方法和视角思考API能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊
duangsuse::Echo
The Java maintainers chose to generate the implementation class in runtime. This is done by calling java.lang.invoke.LambdaMetafactory.metafactory. Since the arguments for that call (return type, interface, and captured parameters) can change, this requires…
然后呢华为方舟也是做了个 jbc2mpl && mplcg 的示例,其实主要是移植 #jvm 的感觉, virtualcall (invoke-virtual, invoke-special/static 是普通函数) 方法查找模式都复刻了,也有些if,while 的高级Node,但许多库..哪怕 javacore/libjavacore.mplt 的 rt.jar 和 j.l.String 都没开源,在 #zhihu https://www.zhihu.com/question/343431810 可以看到

#java #learn 这个 invokedynamic 呢,暴露为 j.l.invoke.CallSite ,咱看看用法
#code
class FnRun{
interface R{void run();}
static R f1;
static public void main(String[]a){
f1="".isEmpty()? ()->{ a[0]=""; } :new R(){public void run(){a[1]="";} };
}
}
javap -c FnRun FnRun$R
""?是为了规避常量折叠。无论多复杂,带><转型的常量表达式 sun javac 都是能执行的..妈耶,在框架限制内你可牛

会得到自带的FnRun.<init>=super() 和 main():
..我们用 #python #code 重构一下字节码表示
//L5 "".isEmpty
ldc String
Fvirt String.isEmpty:()Z
5^ifeq //br.not
aload_0
Fdyna #,0:run:([String;)LFnRun$R; //重点!
14^goto
new FnRun$1 ^5 //here
dup
aload_0
Fspec FnRun$1."<init>":([String;)V
putstatic f1:LFnRun$R; ^14 //goto
//L6
return

在非static 方法里 aload_0=this 。在这里 new FnRun$1(a) 被翻译为 new, dup, (a) Fspecial, putstatic 即 {R o=new R; init(o); f1=o}, o值引用了两次
所以Java闭包为啥不能改 ()->{a=new String[]{};} ,在()->{}外也不行? —因为它就是个构造器,Kotlin 使用 IntRef 化来实现完整的局部量共享。

因为代码一样 Fdyna 直接初始化了 FnRun$R.run ,然后 callsite$0 开 javap -v 才能看到,待会说

然后new R(){}的
class FnRun$1 implements FnRun$R {
final java.lang.String[] val$a;
//<init>: L5
aload_0
aload_1 ; putfield val$a:[String;
aload_0
Fspec Object."<init>":()V
return
//run:L5
aload_0 getfield val$a:[String;
iconst_1
ldc String#3
aastore //还有iastore fastore..IntArray啥
return
Java8的动态调用不止是新增opcode
j.invoke.MHs.lookup().findVirtual(Obj,"hashCode",methodType(int))
就是方法句柄
它被 .invoke() 的地方就是动态调用点(callsite) ,bootstrap 方法(^) 用于查找句柄指代的函数实现,只做一次

Fdyna 0:run:([String;)LFnRun$R;
callsite$0 REF_invokeStatic= invoke/LambdaMetafactory.metafactory:(Linvoke/MethodHandles$Lookup;LString;Linvoke/MethodType;
Linvoke/MethodType;Linvoke/MethodHandle;Linvoke/MethodType;)Linvoke/CallSite;

明显这个 metafactory(Lookup,String,MethodType,...) 做了字节码new 的工作,只接受 aload_0(this) 和
FnRun.lambda$main$0:([LString;)V
NameAndType 就创建了内部类 FnRun$R 的对象,这一步只是“调用一个尚不存在的class构造器”,我们负责生成&加载相关类 🤔,并链接-给出代码位置
-Djdk.internal.lambda.dumpProxyClasses=.

但剩下的3参数太多了: SAM methodType(void.class), implMethod, 泛型SAM描述符
没错,invokedynamic 的lookup函数的参大多在编译期确定,甚至不能是 Object 😒

当然用反射newInstance就太容易了,Google dx 使用 RuntimeDesugar 转化^ lambda$ ,当然这都是过去式了, #Kotlin 万岁
super<PT_2>.say()
的自由祖父类指定可以用:

class PT_2 {void say();//parent T
class PT extends PT_2 {}
class T extends PT{void say(){}//新版本
void main(){
MHs.lookup().findVirtual(ParentT_2.class,"say",MT.methodType(void.class)).bindTo(this).invokeExact();
}

你不能手写 invokedynamc 而只能由 j.l.invoke.* 工具类invoke()时生成,因为调用是在字节码层,不是运行期元数据反射 😒

除了查找函数签名的实现,用户代码不会涉及其他关于计算栈的东西,和最常见的 invokevirtual 是完全一样的,而因为lookup的实现有限制, MHs 提供了 collectArguments,guardWithTest,countedLoop 等一系列组合器帮助修改调用,比如加点参数,对Groovy 不定长参 函数转化 这样就很有帮助

顺便: invoke-interface 是劣化的 virtual 。虚方法是单继承得来,成员有唯一索引;接口方法可被多 class implements ,无法做覆写查找的缓存。但能去虚化内联时一样
super()的话是 invokespecial ,不能通过继承被覆盖也无需查找
总之这个Java8引入的 INDY 主要是关于性能前提的,如果以 #js 程序员的视角会觉得这些都不如 new Proxy({}, {get,set}) 😂

我不想再谈了,也没啥用;还不如做JVM脚本语言—但也不得不考虑Dalvik dex的兼容性?

拿这种东西当知识不如直接说: SAMFunc/*void()*/ f=()->{} 编译期生成对 j.l.invoke.LambdaMetaFactory 静态同名方法(Lookup,String name,MethodType) 的调用,并把结果CallSite (仅首次计算)再次调用;这个“元工厂”把()->{}代码生成为 new T(){} 的具体class加载,返回它 static get(...localvars) 的调用句柄,于是得到目标接口的对象

为什么必须用dyn: 没有为什么,也不是因为参数类型不确定。反射交给目标SAM函的NameAndType 也能按照impl的参数(=field)动态定义/init this implements SAMFnType ,来创建o.impl()的代理。Android 最初就是反射直接Proxy class

当你写 class Out{int a; new T(){a} } ,相当于生成一个 Out$1 extends T ,它的构造器把(编译器确定共享序的)局部变量存在this,内部代码是有两个上下文的,()->{} 里也一样,只是这次 Out$1 的创建由运行时metafactory()负责,动态链接 T getLambda(int a); 完全是 Oracle 的私货,Kt 1.5 才支持这个 code size 优化

这些内容太细节,工程界自然完全不知道,所以说是什么“metafactory本身的签名不定” “创建调用的参数不确定” —的确不定,但重点是在T子类this.getClass() 定义不确定,这就涉及闭包,而今天的人都tm不知道{x+1}等函数是有词法上下文,由编译器统一保存位置的! 🥲

因为每个开发者眼前都只有自己的一亩三分地,编程是为效果
然而框架的开发者却不懂这个道理,想传教自己的设计有多“可扩展” 😒

我就好奇啊,中国也没几个人真做字节码框架啊,考的有意义吗? 觉得很厉害??🤔🙏

ref: https://jakewharton.com/d8-library-desugaring/ dex 上 stdlib-jre8 的 hashcode, notnull 测试都转换回老版本了,同时兼容Stream等新API
duangsuse::Echo
#Kotlin 今天再写一遍灰度(黑白)化 🤪 import java.io.File import javax.imageio.* import java.awt.image.* object ImGray{ @JvmStatic fun main(vararg a:String){ ImageIO.read(a[0]).mapPix{val(r,g,b)=Byte.cut(3,it); val l=(r * 299/1000 + g * 587/1000 + b * 114/1000); Byte.cat(l…
简而言之,元工厂需要 T,ftype,f 三个参数动态绑定这个 ()->{} 的构造函数 FnRun$R run();,T=([String)LFnRun$R 编码在invoke(0,mtype) 指令内,ftype 和 f 是 invoke的静态(bootstrap#0)参数 ()V , private static FnRun.lambda$main$0:([LString;)V
运行时会创建一个 class Real$R {String[] a; run(){return code.run(a);} static getLambda(String[] a){/**/} }
run的代码会作为一个成员复制,真的还不如 inner class 闭包得好.. 按道理这都能做 !effective final可变量共享

也幸好这不是考题



嗯.. 不过编程就应该是脱离代码的思考,学会做法后就要脱离做法,现在的工程界…… 我还是觉得太冗 🌑
如果要沦陷在起名字里,对不起我没兴趣,为了统一个口径浪费那么多字符、阅读时间。 好的代码和框架一眼就看出缘由和效果,不必许多名词帮忙强调

好的程序员脱离代码,反而是在拥抱计算机。 因为任何语言和API都只是完成计算机工作的方式,语言和代码终究也只不过是目的,对人而言缘由却是最重要的
算法是代码的缘由,各种通信和检查的用途目的是它存在的缘由

持有代码很重要,但拥有能产生无数代码的心和手,对完整目标流程的理解,了解它们的缘由,才是真正掌控了某种程序呢!
科学观察某种事物,往往是为了更好的推测和掌控
能更深刻的理解,说不定就能做到更赞的事情

>#statement 我觉得好的程序应该是一个模板,填哪里的哪种数据都能用的那样,仿佛只是数据的脚本和限制,话筒交给程序输入
程序不该内嵌有太多常量
我开始用对照输入输出的方法设计程序、以其他的领域方法和视角思考API能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊
#security
>在有对方 ec public key 和自己 ec private key 的时候,协商一个 aes key 出来
为啥要协商,DH可以单向安全传输吧
>不协商如何DH(可MITM
DH 是Diffle-Hellman? (RSA啥

duangsuse, [2022/1/16 下午3:35]
"个奇妙的密钥交换协议, 称为Diffie-Hellman密钥交换协议/...这个机制的巧妙在于需要安全通信的双方可以用这个方法确定对称密钥
那我就是这个意思,

噢.. 我刚才是想B公钥A再安全发信,但不能确认确实是.. B只有再校验 才能安全

>Homomorphic encryption 是一种加密形式
就是用户加密 上传了某个东西服务器直接对加密数据计算

计算完毕返回给用户,用户解密
能获得正确运算结果
主要用ML来求解 只要某种意义的噪音不超过一个范围 就能正确解密
This media is not supported in your browser
VIEW IN TELEGRAM
#web Web Audiotool.com 某软件/游戏大佬的作品之一,太厉害了