#net 播客...KODI 项目有插件吗 🤔 >主播似乎有一些误解,作为小宇宙的后端开发,我稍微解释一下吧。 我们没有“只认某某平台”,像主播使用的Github Page,小宇宙内也有很多节目是建立在Github Page上的,也有像《Anyway.FM》这样完全自建RSS的节目。 公告功能在短暂的内测后,也是在几个月前就开放给所有主播,也并不存在迟迟不愿为主播提供的情况。 认领节目的过程确实是遇到了Bug,但在收到了主播的反馈后我们就解决了问题,随后主播也就正常认领了。 作为开发,因为Bug给这位主播造成了不好的用户体验,确实感到抱歉,也希望大家理解,没有那么多别有用心吧。
#bug apple webkit 🙏 IndexDB 的名称会暴露给任何js,跨域 https://t.me/outvivid/3325
Telegram
层叠 - The Cascading
FingerprintJS 分析称,Safari 15 的一个漏洞使得网站可以跨域追踪用户。此漏洞影响 macOS 上的 Safari 15 和运行 iOS/iPadOS 15 的设备。
此漏洞的原理是:当某网站在 Safari 创建一个 IndexDB 时,同名 IndexDB 也会在其他站点使用的存储中被创建。部分站点创建的 IndexDB 名称包含用户 ID,因此此漏洞可以被用来对用户进行跨域追踪。这种追踪甚至可以在后台标签页中实时进行。
用户可以在此网站测试漏洞效果:
https://safarileaks.com/…
此漏洞的原理是:当某网站在 Safari 创建一个 IndexDB 时,同名 IndexDB 也会在其他站点使用的存储中被创建。部分站点创建的 IndexDB 名称包含用户 ID,因此此漏洞可以被用来对用户进行跨域追踪。这种追踪甚至可以在后台标签页中实时进行。
用户可以在此网站测试漏洞效果:
https://safarileaks.com/…
#ce 看到
SSA单赋值正是带执行序的 Node图,只是节点图里变量都是靠连接表示,而程序变量是有时序指代的,例如
见 https://www.zhihu.com/question/24992774
SSA本来是无关内存变量或寄存器的,全交给分配器解决是放哪。(Lua)是干脆算计算栈最大深度,然后编号位置 不复用,而FFI(native函数)的 CDEF 调用约定和 struct{} 靠指针 load/store 就行了,也是SSA Value;现在的做法或许更好,C语言里for(;;)也不止能迭代1变量,变量值源自哪个{} 就是很难区分的
#statement 我觉得好的程序应该是一个模板,填哪里的哪种数据都能用的那样,仿佛只是数据的脚本和限制,话筒交给程序输入
程序不该内嵌有太多常量
我开始用对照输入输出的方法设计程序、以其他的领域方法和视角思考API能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊
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能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊
Zhihu
Phi node 是如何实现它的功能的? - 知乎
看《编译原理》只明白它的起作用的机理是怎么样的,但是(到了汇编/机器码的阶段)它是如何实现的呢?是…
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…
然后呢华为方舟也是做了个
#java #learn 这个 invokedynamic 呢,暴露为 j.l.invoke.CallSite ,咱看看用法
#code
""?是为了规避常量折叠。无论多复杂,带><转型的常量表达式 sun javac 都是能执行的..妈耶,在框架限制内你可牛
会得到自带的FnRun.<init>=super() 和 main():
..我们用 #python #code 重构一下字节码表示
所以Java闭包为啥不能改
因为代码一样
然后new R(){}的
它被 .invoke() 的地方就是动态调用点(callsite) ,bootstrap 方法(^) 用于查找句柄指代的函数实现,只做一次
没错,invokedynamic 的lookup函数的参大多在编译期确定,甚至不能是 Object 😒
当然用反射newInstance就太容易了,Google dx 使用 RuntimeDesugar 转化^
除了查找函数签名的实现,用户代码不会涉及其他关于计算栈的东西,和最常见的
顺便: invoke-interface 是劣化的 virtual 。虚方法是单继承得来,成员有唯一索引;接口方法可被多 class implements ,无法做覆写查找的缓存。但能去虚化内联时一样
super()的话是 invokespecial ,不能通过继承被覆盖也无需查找
总之这个Java8引入的 INDY 主要是关于性能前提的,如果以 #js 程序员的视角会觉得这些都不如
我不想再谈了,也没啥用;还不如做JVM脚本语言—但也不得不考虑Dalvik dex的兼容性?
拿这种东西当知识不如直接说:
为什么必须用dyn: 没有为什么,也不是因为参数类型不确定。反射交给目标SAM函的NameAndType 也能按照impl的参数(=field)动态定义/init this implements SAMFnType ,来创建
当你写
这些内容太细节,工程界自然完全不知道,所以说是什么“metafactory本身的签名不定” “创建调用的参数不确定” —的确不定,但重点是在T子类this.getClass() 定义不确定,这就涉及闭包,而今天的人都tm不知道{x+1}等函数是有词法上下文,由编译器统一保存位置的! 🥲
因为每个开发者眼前都只有自己的一亩三分地,编程是为效果
然而框架的开发者却不懂这个道理,想传教自己的设计有多“可扩展” 😒
我就好奇啊,中国也没几个人真做字节码框架啊,考的有意义吗? 觉得很厉害??🤔🙏
ref: https://jakewharton.com/d8-library-desugaring/ dex 上 stdlib-jre8 的 hashcode, notnull 测试都转换回老版本了,同时兼容Stream等新API
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在非static 方法里 aload_0=this 。在这里
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
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的动态调用不止是新增opcodej.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
Zhihu
如何看待方舟编译器于 2019 年 8 月 31 日开源? - 知乎
华为表示 show you the code,希望有大佬可以借此机会解释解释何为方舟编译器?
duangsuse::Echo
然后呢华为方舟也是做了个 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 可以看到…
jbc.py
725 B
#python #code javap 字节码简写工具, 仅供上午使用..
https://time.geekbang.org/column/article/12564
https://xie.infoq.cn/article/6d30b8221c1a967ec32ac3b9c MethodHandler 相关
https://time.geekbang.org/column/article/12564
https://xie.infoq.cn/article/6d30b8221c1a967ec32ac3b9c MethodHandler 相关
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
也幸好这不是考题
—
嗯.. 不过编程就应该是脱离代码的思考,学会做法后就要脱离做法,现在的工程界…… 我还是觉得太冗 🌑
如果要沦陷在起名字里,对不起我没兴趣,为了统一个口径浪费那么多字符、阅读时间。 好的代码和框架一眼就看出缘由和效果,不必许多名词帮忙强调
好的程序员脱离代码,反而是在拥抱计算机。 因为任何语言和API都只是完成计算机工作的方式,语言和代码终究也只不过是目的,对人而言缘由却是最重要的
算法是代码的缘由,各种通信和检查的用途目的是它存在的缘由
持有代码很重要,但拥有能产生无数代码的心和手,对完整目标流程的理解,了解它们的缘由,才是真正掌控了某种程序呢!
科学观察某种事物,往往是为了更好的推测和掌控
能更深刻的理解,说不定就能做到更赞的事情
>#statement 我觉得好的程序应该是一个模板,填哪里的哪种数据都能用的那样,仿佛只是数据的脚本和限制,话筒交给程序输入
程序不该内嵌有太多常量
我开始用对照输入输出的方法设计程序、以其他的领域方法和视角思考API能描述的问题
心中的程序没必要符合什么不得了的约束
因为代码也是数据啊
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来求解 只要某种意义的噪音不超过一个范围 就能正确解密
>在有对方 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来求解 只要某种意义的噪音不超过一个范围 就能正确解密
Wikipedia
加密
过程
This media is not supported in your browser
VIEW IN TELEGRAM
#web Web Audiotool.com 某软件/游戏大佬的作品之一,太厉害了
duangsuse::Echo
#web Web Audiotool.com 某软件/游戏大佬的作品之一,太厉害了
WebAudio 相关 —抛弃python pydub啥的啦,浏览器多方便!
https://github.com/audacity/audacity/blob/master/src/effects/Wahwah.cpp#L391 freq=3.7 depth=.85 reso=3.4 哇哇
https://p5js.org/examples/sound-filter-bandpass.html 有交互创意
https://wavesurfer-js.org/example/bars/index.html 的方便波形可视化(Region循环,ELAN字幕,Bar/timeCursor/line,MediaSession)还有 marker,minimap,playhead 等超强可配置
https://collab-project.github.io/videojs-record/#/examples 的WebRTC技术音视录制工具,支持 Chromecast record(maxLength=60)saveAs()录屏和 doc.pictureInPicture Window. URL.createObjectURL(player.recordedData)
https://alemangui.github.io/pizzicato/ 的硬核声效与 WebAudio ScriptProcessor/FFT-Analyser Node IOBuffer,还有……
https://github.com/andrzejlisek/AudioSpectrum/blob/master/filter.js 地狱绘图-巨型项目-代码烂得不行
https://t.me/dsuses/5034
https://github.com/audacity/audacity/blob/master/src/effects/Wahwah.cpp#L391 freq=3.7 depth=.85 reso=3.4 哇哇
https://p5js.org/examples/sound-filter-bandpass.html 有交互创意
https://wavesurfer-js.org/example/bars/index.html 的方便波形可视化(Region循环,ELAN字幕,Bar/timeCursor/line,MediaSession)还有 marker,minimap,playhead 等超强可配置
https://collab-project.github.io/videojs-record/#/examples 的WebRTC技术音视录制工具,支持 Chromecast record(maxLength=60)saveAs()录屏和 doc.pictureInPicture Window. URL.createObjectURL(player.recordedData)
https://alemangui.github.io/pizzicato/ 的硬核声效与 WebAudio ScriptProcessor/FFT-Analyser Node IOBuffer,还有……
https://github.com/andrzejlisek/AudioSpectrum/blob/master/filter.js 地狱绘图-巨型项目-代码烂得不行
https://t.me/dsuses/5034
GitHub
audacity/Wahwah.cpp at master · audacity/audacity
Audio Editor . Contribute to audacity/audacity development by creating an account on GitHub.
duangsuse::Echo
WebAudio 相关 —抛弃python pydub啥的啦,浏览器多方便! https://github.com/audacity/audacity/blob/master/src/effects/Wahwah.cpp#L391 freq=3.7 depth=.85 reso=3.4 哇哇 https://p5js.org/examples/sound-filter-bandpass.html 有交互创意 https://wavesurfer-js.org/example/bars/index.html…
https://tinyrave.com/tracks/69-ode-to-joy #signal #tool
https://www.shadertoy.com/view/XlBGzm
https://www.shadertoy.com/view/XlXSWB Praat
https://tinyrave.com/tracks/10-interstellar-theme-song 果然信号处理就是人均data转化 codegen ,啥都会啊
https://www.shadertoy.com/results?query=star 这每张都是壁纸.. #cg
https://tinyrave.com/tracks/23-wizards-and-warriors-midi-nes m
https://www.barretlee.com/blog/2014/02/28/cb-webAudio-filter/
https://www.redblobgames.com/x/1618-webaudio/ 编玩边学 和解释: https://www.cnblogs.com/xy2c/p/7501327.html
#dalao https://andremichelle.io/lab/ ^大佬眼里的大佬。这个是贴图伪3D,他写了很多Flash 几何/曲线(flower,ocean,)/游戏算法(如Bezier碰撞体),可用 ruffle.rs 试玩. 免费DAW audiotool.com 也是他写的-是的,完全和各种社区设计引擎平级的个人..
https://github.com/andremichelle
有B站号,图形和物理模拟巨佬 https://www.shadertoy.com/user/iq
两个人都看似和国内硕博一样,甚至更低端,但实则比@3b1b更稀有
https://permadi.com/java/rayc/Rayc.java ^大佬**3 ... 这是3D扫描渲染.. 图形学大佬都说excellent, 肯定非常牛逼了
https://justintaddei.github.io/webaudio/ 是简单的频谱仪
基于 tf.js 还有个 https://magenta.tensorflow.org/demos/web/ 和 softsynth.com , dgen.co
https://oosmoxiecode.com/archive/js_webgl/particles_morph/index.html
https://avseoul.net/particleEqualizer/
https://www.shadertoy.com/view/XlBGzm
https://www.shadertoy.com/view/XlXSWB Praat
https://tinyrave.com/tracks/10-interstellar-theme-song 果然信号处理就是人均data转化 codegen ,啥都会啊
https://www.shadertoy.com/results?query=star 这每张都是壁纸.. #cg
https://tinyrave.com/tracks/23-wizards-and-warriors-midi-nes m
https://www.barretlee.com/blog/2014/02/28/cb-webAudio-filter/
https://www.redblobgames.com/x/1618-webaudio/ 编玩边学 和解释: https://www.cnblogs.com/xy2c/p/7501327.html
#dalao https://andremichelle.io/lab/ ^大佬眼里的大佬。这个是贴图伪3D,他写了很多Flash 几何/曲线(flower,ocean,)/游戏算法(如Bezier碰撞体),可用 ruffle.rs 试玩. 免费DAW audiotool.com 也是他写的-是的,完全和各种社区设计引擎平级的个人..
https://github.com/andremichelle
有B站号,图形和物理模拟巨佬 https://www.shadertoy.com/user/iq
两个人都看似和国内硕博一样,甚至更低端,但实则比@3b1b更稀有
https://permadi.com/java/rayc/Rayc.java ^大佬**3 ... 这是3D扫描渲染.. 图形学大佬都说excellent, 肯定非常牛逼了
https://justintaddei.github.io/webaudio/ 是简单的频谱仪
基于 tf.js 还有个 https://magenta.tensorflow.org/demos/web/ 和 softsynth.com , dgen.co
https://oosmoxiecode.com/archive/js_webgl/particles_morph/index.html
https://avseoul.net/particleEqualizer/
#learn #cg 《OpenGL杂谈》 🔬
GL提供了特殊类型 vecN (
SL是没helloworld却有计算力的语言,和CSS一样,明明print都写不了却能定义动画
尽管SL能保持个buffer-state,不要尝试只用SL完成一个功能机械的app,不然就太丑了。SL适合写动态壁纸和滤镜类的东西 #建议
除了社区不重视代码质量(冗长或空语义的极端,如uv=uniform=readonly graph-arg)、不善用struct、场景与渲染不切分、和复用/可配置力问题、shader含字符位图硬编码(GLSL不擅长的用途)等人的问题,也关于计算领域 🤔
为什么GLSL看起来和C很不同?不谈多out 函数和内部gl_物理变量,显卡的计算和CPU的单线模式差异很大。比如画个圆吧,
因为执行顺序根本对时差更新/绘制结果毫无帮助,你逐个往画布叠对N叉 tree 好用,可对数学分形 还不如把“端点迭代”完全打散,越散越适合GPU计算。
显卡计算是没有顺序和“整体图像”的,几何都必须能按xy-颜色来“绘图”,因此着色器和 Painter 完全是两种东西,当然也有办法把arc(x,y,l)->float 峰值clamp 封装成函数,并且用数学方法mix()
数学(此为几何相关)应用相关命名随意已经是普遍现象了,
>“ s一般用来代表一个"scalar"(标量)。所以是一维数字。t是因为字母表s后面的字母。不能继续用u和v是因为uv已经被他们用来作计算用的坐标了。因此就用了向前的字母了。(strq)淡然,后来他们发现r与rgba的r冲突了,就用p替换了r。就是stpq了。
动画工具一般用t来表示时间的概念,所以就不用s和t来表示纹理的坐标了。因此,他们就用了u和v(UV贴图),因为他们根本不关心相关的计算。
s和t的命名来自于对平面的描述:r=r0+sv+tw (r0是平面任意一点,vw是定义向量,st随选)
uniform 意义也非常迷,它的意思是CPU和GPU间统一,许多人拿 uvec,uv 简写这ND座标/颜色/etc.,但SL里真有uvec2的类型-照传统编程早该改了,SL界硬是成了传统,想学图形先换术语,脑子里没对应表100%看不懂 😟
这是在GL(带一张 ShaderToy.com/new 贴图)显示 hello world ,带着注释里的问题阅读
SL的逻辑不能用常规迭代/判断来解释,在进入图形学公式前,需要先习惯这种思维方式。许多程序员这辈子没机会,你看到了就是有本事。 所有平台,Web,Android,DX/Unity/Xorg 都支持OpenGL ,机器学习框架也开始GPU计算,不想黏合点特效装逼?看不出咋调参可不行!
你肯定会吐槽:逐点贴图?肯定很慢吧! 其实GL是最快的图形方法了。计算量大但都易优化,它是很低层的绘制API,和各种层次的painter不在一条赛道
在迈向并发的时代,一头什么都会的牛和一大群只会+-*/的鸡 硬件选择发展后者,应用层各有各好,但在图形上答案显然还是简单的-简单比线性好
#math 这是一个曼德博(朱丽亚)集的分形图,在SL上反而比在JS更合适,不需要手动迭代虚数P(x,y)
应该也能感受到数学计算里不需要太多边界判断,靠sin,mod 等就能展示复杂的图形。比如这个 fireworks. fascinating graphics, made eazy, 类似的有效作品120多个
OpenGL着色器杂谈今天就到这里
ref:
https://zhuanlan.zhihu.com/p/32788146 Py julC
https://blog.csdn.net/cuckoo1/article/details/108083508 js分形
https://www.shadertoy.com/view/Wtt3Wl OTF bezier
https://www.shadertoy.com/view/XsyXzw 音乐粒子
https://www.shadertoy.com/view/7dKGDK 基础着色
https://www.cnblogs.com/chen9510/p/11447292.html UBuffer 跨着色器传递
GL提供了特殊类型 vecN (
xyzw/rgba/stpq 来引用/自由重组均可;可iub前缀表示类型)和matNxM (m[i<N][j<M])以及 texture(sampler2D,xy) ,支持严格 int/float percision ,支持struct和传统C的控制流及GL特有 cube/shadow,代码的特性由 compile 环境/GL驱动决定(比如GLES就不支持break,许多不能?:和%=mod,**=pow,不同类型?:)。SL能计算frag颜色和vert点-geom顶边,对应渲染和物理计算(一个很草的事实是,基于GL计算的渲染引擎在CG界遍地开花,各有各好 🤪)SL是没helloworld却有计算力的语言,和CSS一样,明明print都写不了却能定义动画
尽管SL能保持个buffer-state,不要尝试只用SL完成一个功能机械的app,不然就太丑了。SL适合写动态壁纸和滤镜类的东西 #建议
除了社区不重视代码质量(冗长或空语义的极端,如uv=uniform=readonly graph-arg)、不善用struct、场景与渲染不切分、和复用/可配置力问题、shader含字符位图硬编码(GLSL不擅长的用途)等人的问题,也关于计算领域 🤔
为什么GLSL看起来和C很不同?不谈多out 函数和内部gl_物理变量,显卡的计算和CPU的单线模式差异很大。比如画个圆吧,
g.arc(x,y,l, 0,2PI);g.fill() 后它就出现在画布(或用SDL/VGA)上了,因为这里有个“显示缓冲”位图的概念,所有图形存留在这里直到clear-SwapBuffers(一个冷知识,glFinish计数比FPS适合图形学跑分用),画圆可以迭代xy=(sint,cost) t=0~2PI 来累积圆上点,这个过程是线性的,多核CPU一次能画几个?尽管能LUT(查表)优化、能模拟Vec来复用同半径的结果,一次也只能画一个。对于几万个粒子来说就更鸡肋了,因为执行顺序根本对时差更新/绘制结果毫无帮助,你逐个往画布叠对N叉 tree 好用,可对数学分形 还不如把“端点迭代”完全打散,越散越适合GPU计算。
显卡计算是没有顺序和“整体图像”的,几何都必须能按xy-颜色来“绘图”,因此着色器和 Painter 完全是两种东西,当然也有办法把arc(x,y,l)->float 峰值clamp 封装成函数,并且用数学方法mix()
#define v1 float矩形xywh也可用类似手段。不过shader里这些形状不是必需品(paint里确实是)
v1 circle(vec2 P, vec2 p, v1 l) {
v1 d = length(P - p) - l;
return 1.-clamp(d, 0.,1.);
}
void mainImage(out vec4 bg, vec2 P){vec2 L=iResolution.xy, p=P/L;
vec3 c = 0.5 + 0.5*cos(iTime+p.xyx+vec3(0,2,4));
bg=vec4(mix(c, vec3(.87,.37,.23), circle(P, L/2., L.y*.3 ) ) ,1);//试给圆半径 *mod(iTime,1.)
}
数学(此为几何相关)应用相关命名随意已经是普遍现象了,
>“ s一般用来代表一个"scalar"(标量)。所以是一维数字。t是因为字母表s后面的字母。不能继续用u和v是因为uv已经被他们用来作计算用的坐标了。因此就用了向前的字母了。(strq)淡然,后来他们发现r与rgba的r冲突了,就用p替换了r。就是stpq了。
动画工具一般用t来表示时间的概念,所以就不用s和t来表示纹理的坐标了。因此,他们就用了u和v(UV贴图),因为他们根本不关心相关的计算。
s和t的命名来自于对平面的描述:r=r0+sv+tw (r0是平面任意一点,vw是定义向量,st随选)
uniform 意义也非常迷,它的意思是CPU和GPU间统一,许多人拿 uvec,uv 简写这ND座标/颜色/etc.,但SL里真有uvec2的类型-照传统编程早该改了,SL界硬是成了传统,想学图形先换术语,脑子里没对应表100%看不懂 😟
这是在GL(带一张 ShaderToy.com/new 贴图)显示 hello world ,带着注释里的问题阅读
float l=.06;答案:P的0值是确定点,for(i)if() 是为确定当前P对应的t[i] 。 P*.5 是因为原字体图太小了——那为啥P/2 呢?不该是有t[i]的位图yx偏移,就够在当前P画字了? 作为只懂g.fillText 的程序员不会考虑怎么从像素级别对应! P缩小了,同高区间就只含低 texture 视口,于是贴图放大了! 和数学函数缩放一样。类似写法在SL里很难规避,也没法文档
void mainImage(out vec4 bg, vec2 P) {
int[] t = int[](72,69,76,76,79,32, 87,79,82,76,68,33);//"Hello World"
P = P/iResolution.y - .3/*为什么能调x位置?全屏试试*/; P.y += .05*sin(3.*P.x+iTime) -.4;
for(int i=0; i<int(iMouse.x*.02)%12;i++,P.x-=.1)if (length(P-l)<l)
if(false)bg+=vec4(1)/*<能解释了吗? .5调成1.试试?>*/;else bg+= texture(iChannel0, P*.5 + fract(vec2(t[i],15-t[i]/16)/16.)).x;
}
SL的逻辑不能用常规迭代/判断来解释,在进入图形学公式前,需要先习惯这种思维方式。许多程序员这辈子没机会,你看到了就是有本事。 所有平台,Web,Android,DX/Unity/Xorg 都支持OpenGL ,机器学习框架也开始GPU计算,不想黏合点特效装逼?看不出咋调参可不行!
你肯定会吐槽:逐点贴图?肯定很慢吧! 其实GL是最快的图形方法了。计算量大但都易优化,它是很低层的绘制API,和各种层次的painter不在一条赛道
在迈向并发的时代,一头什么都会的牛和一大群只会+-*/的鸡 硬件选择发展后者,应用层各有各好,但在图形上答案显然还是简单的-简单比线性好
#math 这是一个曼德博(朱丽亚)集的分形图,在SL上反而比在JS更合适,不需要手动迭代虚数P(x,y)
#define cxmul(a,b) vec2(a.x*b.x - a.y*b.y, a.x*b.y+a.y*b.x)这是一个”老相片“视频滤镜,展示了GL无所不能的inputs... ,猜猜它是怎么处理颜色的
#define R iResolution
//#define JulC vec2(.383,.13)
void mainImage(out vec4 bg, vec2 P){
vec2 z,c = P/R.xy *4.-2.; c.x=c.x* R.x/R.y +(.2-iMouse.x/R.x)*15.; c/=1.2+iMouse.y/R.y*20.; z=c;
#ifdef JulC
c=JulC; //v 猜猜看,怎么调参数.
#endif
float i=.0,N=abs(sin(iTime/32.0))*64.0, v;
for(; length(z)<2. && i<N;i++)z =true? vec2(z.x*z.x-z.y*z.y, 2.*z.x*z.y)+c : cxmul(z,z) + c;
v=i/N;
bg = vec4(v,v,v,1);
}
void mainImage(out vec4 bg, vec2 P){
vec2 p = P.xy / iResolution.xy;
//p.y = 1.0 - p.y; // invert
//p.x = 1.0 - p.x; // flip
vec4 c = texture(iChannel0,p);
float c0 = (c.r + c.g + c.b) / 3.0; // grayscale
c.rgb *= abs(vec3(cos(c0),sin(c0),atan(c0) * sin(c0)) );
bg = c;
}
以上三个示例里,大家都能感受到GLSL对向量(元组)计算 帮助是很大的应该也能感受到数学计算里不需要太多边界判断,靠sin,mod 等就能展示复杂的图形。比如这个 fireworks. fascinating graphics, made eazy, 类似的有效作品120多个
OpenGL着色器杂谈今天就到这里
ref:
https://zhuanlan.zhihu.com/p/32788146 Py julC
https://blog.csdn.net/cuckoo1/article/details/108083508 js分形
https://www.shadertoy.com/view/Wtt3Wl OTF bezier
https://www.shadertoy.com/view/XsyXzw 音乐粒子
https://www.shadertoy.com/view/7dKGDK 基础着色
https://www.cnblogs.com/chen9510/p/11447292.html UBuffer 跨着色器传递
duangsuse::Echo
#learn #cg 《OpenGL杂谈》 🔬 GL提供了特殊类型 vecN (xyzw/rgba/stpq 来引用/自由重组均可;可iub前缀表示类型)和matNxM (m[i<N][j<M])以及 texture(sampler2D,xy) ,支持严格 int/float percision ,支持struct和传统C的控制流及GL特有 cube/shadow,代码的特性由 compile 环境/GL驱动决定(比如GLES就不支持break,许多不能?:和%=mod,**=pow,不同类型?:)。SL能计算frag颜色和vert点…
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
This media is not supported in your browser
VIEW IN TELEGRAM
👆 https://www.cnblogs.com/tkgamegroup/p/4228255.html ” Mandel 是 Julia 的缩略图,图形内座标就是Julia 集更联通的julC “
#blender 好吧,不是blender(草
#blender 好吧,不是blender(草
duangsuse::Echo
#learn #cg 《OpenGL杂谈》 🔬 GL提供了特殊类型 vecN (xyzw/rgba/stpq 来引用/自由重组均可;可iub前缀表示类型)和matNxM (m[i<N][j<M])以及 texture(sampler2D,xy) ,支持严格 int/float percision ,支持struct和传统C的控制流及GL特有 cube/shadow,代码的特性由 compile 环境/GL驱动决定(比如GLES就不支持break,许多不能?:和%=mod,**=pow,不同类型?:)。SL能计算frag颜色和vert点…
#cg 也是非常有创意的领域,而且也有技术
第一个烟花就只这点代码(都不够按行算了):
这就是几何学的魅力
对于我们普通程序员,也是很值得思考🤔的- 仅仅使用一个数字,多写点算式就能实现复杂控制流的功能,仿佛变量都不必存在一样
也好像是禁语游戏-不使用常规绘制法,如何绘图
这也是函数式编程的特征啊
所以是顺序执行,还是怎样怎样,有许多代码可以实现一个程序,只要思想不滑坡,你就永远是菜鸡-只是菜的清醒罢了😂
第一个烟花就只这点代码(都不够按行算了):
#define N(h) fract(sin(vec4(6,9,1,0)*h) * 9e2)
void mainImage(out vec4 o, vec2 P) { //fireworks[SH17a]
vec2 u = P/iResolution.y;
float e, d, i=-2.;
for(vec4 p; i++<9.; d = floor(e = i*9.1+iTime),p = N(d)+.3, e -= d)
for(d=0.; d++<50.;)
o += p*(1.-e) / 1e3 / length(u-(p-e*(N(d*i)-.5)).xy);
u.y<N(ceil(u.x*i+d+e)).x*.4 ? o-=o*u.y : o;}
第二个也只有20行稀疏的代码 https://www.shadertoy.com/view/4sjBWR这就是几何学的魅力
对于我们普通程序员,也是很值得思考🤔的- 仅仅使用一个数字,多写点算式就能实现复杂控制流的功能,仿佛变量都不必存在一样
也好像是禁语游戏-不使用常规绘制法,如何绘图
这也是函数式编程的特征啊
所以是顺序执行,还是怎样怎样,有许多代码可以实现一个程序,只要思想不滑坡,你就永远是菜鸡-只是菜的清醒罢了😂
duangsuse::Echo
本来说可以移植 SDL 甚至支持 WebAudio 和 改写 sharder 渲染支持 stereo 的 (哪怕只是预求和一下 可大佬 size 计算变量貌似没弄全)。 但这个原版代码本身有一点冗余(其实有 sync locks 的一大堆尚无应用意义代码)、试用语言特性的意图, C++ 的简洁性很难(就连 flat 文件树都得拿自写预处理工具去保证),如果用 Py/JS 的话性能又不好,我觉得还是算了( 代码链接后 400k 也算小了 这个是 Mivik 版。 https://t.me/dsuse/16598…
更实际的GLfw/FFTw示例看这里
https://t.me/dsuse/16598
这里我们是要纯GL绘制一个柱状图,首先得按宽度比率切出vert,然后用geomerty(图形由顶点构成) 从points EmitVertex~EndPrimitive连出图形,最后frag只填平色就行
float y = mix(-1., 1., clamp(y_in, 0, 1)), x=mix(-1.,1., (float(gl_VertexID) + 0.5) / u_count);
gl_Pos = vec4(x, y, 0, 1)
//geom
layout (points) in;
layout (points, max_vertices = 1) out;
glPos=gl_in[0]; Emit //顶点0直接输出
layout (triangle_strip, max_vertices = 5) out;
P(l,-1) (r,-1) (l,y) (r,y)
就能生成一个□+\ 的几何
每个顶点都可以带颜色等附加信息,geom也能设置out fColor
bar vert的重力计算在这些之后每帧应用,绘制 y=texture(fftBuf,vertIdx),就能实现一个缓动的频谱图了。
glClear(00wh)
use(shader)
glBindVArray(vao)
glDrawArray(POINTS,0,N)
动苏第一次完全不知道 shader 除了着色贴图还能处理几何,后来觉得 geom 一定是先于 vert 运行(当成点和边了 😂),然后发现geometry shader 画矩形有四个点,vert 却只有2个,于是认为 vert 能决定宽高,或者有重复计算 🤣其实不懂绘图
https://blog.csdn.net/q1398284020/article/details/80181803 着色器变量
https://t.me/dsuse/16598
这里我们是要纯GL绘制一个柱状图,首先得按宽度比率切出vert,然后用geomerty(图形由顶点构成) 从points EmitVertex~EndPrimitive连出图形,最后frag只填平色就行
float y = mix(-1., 1., clamp(y_in, 0, 1)), x=mix(-1.,1., (float(gl_VertexID) + 0.5) / u_count);
gl_Pos = vec4(x, y, 0, 1)
//geom
layout (points) in;
layout (points, max_vertices = 1) out;
glPos=gl_in[0]; Emit //顶点0直接输出
layout (triangle_strip, max_vertices = 5) out;
P(l,-1) (r,-1) (l,y) (r,y)
就能生成一个□+\ 的几何
每个顶点都可以带颜色等附加信息,geom也能设置out fColor
bar vert的重力计算在这些之后每帧应用,绘制 y=texture(fftBuf,vertIdx),就能实现一个缓动的频谱图了。
glClear(00wh)
use(shader)
glBindVArray(vao)
glDrawArray(POINTS,0,N)
动苏第一次完全不知道 shader 除了着色贴图还能处理几何,后来觉得 geom 一定是先于 vert 运行(当成点和边了 😂),然后发现geometry shader 画矩形有四个点,vert 却只有2个,于是认为 vert 能决定宽高,或者有重复计算 🤣其实不懂绘图
https://blog.csdn.net/q1398284020/article/details/80181803 着色器变量
Telegram
duangsuse::Echo
#project #music #abeat
简单的音乐图形化,初学 OpenGL/信号处理 的试作品,部分参考 https://github.com/hannesha/GLMViz (目前仅支持在 PulseAudio 环境下运行):
https://github.com/Mivik/abeat
简单的音乐图形化,初学 OpenGL/信号处理 的试作品,部分参考 https://github.com/hannesha/GLMViz (目前仅支持在 PulseAudio 环境下运行):
https://github.com/Mivik/abeat
想用WebGL+WebAudio复刻abeat 和 constQ 频谱图录制,至少能录个音,
想重写 xecades 的xy fourier transform 可视化
想做哔哩哔哩上看到的视频隐写 信号处理,base64
想复刻xecades的手写数字识别,然后讲机器学习
可是还有太多之前的东西也没定义,那个java博文和el框架也没做,往往不得不填补过去
想做简单的sexp编译器,变量解构和闭包都构思了,没有精力完成
可是Pizzicato的页面修改还没发PR、扭脸的视频还没有发,拖了两天了
一个人脸识别都这样艰难
太累了啊,这样奔波
昨天晚上又是4点,很久没有好好睡觉了
想重写 xecades 的xy fourier transform 可视化
想做哔哩哔哩上看到的视频隐写 信号处理,base64
想复刻xecades的手写数字识别,然后讲机器学习
可是还有太多之前的东西也没定义,那个java博文和el框架也没做,往往不得不填补过去
想做简单的sexp编译器,变量解构和闭包都构思了,没有精力完成
可是Pizzicato的页面修改还没发PR、扭脸的视频还没有发,拖了两天了
一个人脸识别都这样艰难
太累了啊,这样奔波
昨天晚上又是4点,很久没有好好睡觉了