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
Forwarded from &'a ::rynco::UntitledChannel (Rynco Maekawa)
Nginx 的核心开发者、公司创始人 Igor Sysolev 决定退出开发。
https://www.nginx.com/blog/do-svidaniya-igor-thank-you-for-nginx/

Igor 坚持在 Nginx 上工作了 20 年,其中有近 10 年都是一个人在开发。他的成果已经成为了现代互联网发展的基石。
#algorithm UnionFind、三角分形(精简版)

如果要实现 Set 你会怎么做?每次 add(x) 时去重遍历 uniq() 吗?
现在按数组Array(N).fill(0).map((x,i)=>i) 实现 Set<Int> 。每位与一个索引关联,初始是和自己
当加一对 a-b ,把它们的位置赋上彼此,就能知道在不在同集合内——不行,如果还有a-b-c 咋赋值?
答案是 a->b 关联 b->c 再关联,因此 find() 变成链表遍历后最终同一。然后 add(a,c) 先找这个"b",把它->c
最终这个 Map<Int,Parent=Int> 会变成树状数组,只是不被遍历。UF集也有a-b小size侧优先-> 权重,和max()时顺便合并快查法

UF=(N,up=Array(N).fill(0).map((x,i)=>i) )=>(a,b,eq=true)=>{
let max=i=>{for(;i!= (i=up[i]);); return i}, iA=max(a),iB=max(b)
if(eq&&iA!=iB)up[iA]=iB; return eq||iA==iB //不上obj,写不好..
}
let o=UF(3); o(0,1);o(1,2)
o(0,2, false)==true


//给不懂的同学:N是(Map状数组)项个数,up是“父数字” ,eq代表不仅查询还建立a-b 连接关系。 UF算法与up[] 是1:1 ,所以随便起了个o=UF() 数据来功能test
这个相当于List<Set<Int>>
另外 UF,BFS 都是在节点图上判断两点是否联通,如果需要路径则用 DFS ,如从节点 2 的[+3,*3]边怎么走到 "9":
dfs=(link,flink,out,chk=(e,e1)=>{let k,k1;if(e==e1)return[]; if(!out(e)) for(k of link){k1=chk/*找!*/(flink(e,k),e1); if(k1)return k1.concat(k) } })=>chk
ten=dfs(["+3","*3"], (a,k)=>eval(a+k), a=>a>10)
ten(2,9)
->+3*3 (chk完还应reverse下.)
//当然比较hack,如果是专门讲我就会用正经let函数
然后最短路径可以用Dij狄图算法(也可优化权重边),也有A*啥的寻路法。 pip,apt 等依赖工具就是简单BFS可达搜索搞定;我不搞OI懂的不多
#inm 比较喜欢的数字论证生成器可以是这样 11 = 11*-4+51+4

我找了两个与算法解读比 较差的博文:
https://blog.csdn.net/dm_vincent/article/details/7655764
https://www.cnblogs.com/SeaSky0606/p/4752941.html
还有正经算法解读: https://zhuanlan.zhihu.com/p/63123489
大家可以比比它们的信息量。

你要咋画 Xecades大佬的三角分形 (三角内接倒三角,其三边与我顶点继续如此)?
本来是要在中线拿3点(shift遍重组,或者手写配对)和带深度递归的,可看起来只需要
#js #code
document.write`<canvas id=eg>`
{
let sq=Math.sqrt, dim=(e,[w,h])=>{e.width=w,e.height=h}
y = Math.min(innerHeight, innerWidth * sq(3) / 2)
g = eg.getContext("2d");
g.fillStyle = "blue";

let P=[[0,y],[y / sq(3),0], [2*y / sq(3),y]],p=[...P[0]] //左顶右
dim(eg,P[2]);dim(eg.style,["100%","100%"])

setInterval(() => {
let j=0,i = Math.random() * 3 >>0
for(;j<2;j++) p[j]=(p[j]+P[i][j])/2 //随机选方向游走
g.fillRect(...p,1,1)
})
}
//g;画布,dim:宽高wh ,sq:三角(点->点)xy距离的计算, j:仿造向量的计算同时应用于xy

就够了。GLSL 里画三角
#define v1 float
v1 PI=3.14;
v1 ply(int N,vec2 p){
//多边形. 三角[0,y],[y / sq(3),0], [2*y / sq(3),y] 都没了..
v1 d, TURN=2.*PI;
// space to -1~1.
p = p *2.-1.;

// Angle and radius from the current pixel
v1 r = TURN/float(N);
v1 l = atan(p.x,p.y)+PI;
d = cos(floor(.5+l/r)*r -l)* length(p);//distance-shape

return 1.0-step(.4,d);//也可smoothstep(a,b,v)模糊锐边
}
void mainImage(out vec4 bg, vec2 P){P/=iResolution.xy;
P.x *= iResolution.x/iResolution.y;
bg=vec4(0,0, ply(3,P), 1.);//左中 蓝三角
}
// 这个我没法注释,因为SL图形和数学几何关系大。有的时候看不懂也不是因为故弄玄虚,而是那个领域本身难懂。比如我define v1=float 和rld仨变量变 degRee(不用a因为编程有数组要命名),length,distance 后对第三块代码难度影响不大,因为核心不是浮点有几个字

(不过要画三角分形就会难许多了,而且Xe的游走三角是靠边点累积来的,SL不支持累积..)
可以看出,物理的矢量是非常高明的代码复用,少做了很多结构性的事,却照样实现图形效果,而且更可调参——例如靠点集计算就做不到 ply() 边缘模糊的效果
Forwarded from dnaugsuz
我一直在培养这个,但方向可能和你们有点不一样。准确的说,我就是从你们的命名法和严谨结构/排版过来的
我是用单字符表示用途,但这个定义表(物理命名法)还不知名,也就是说目前只有我能看得ok..

许多程序不是增长命名就能读懂的(比如把x都换成item, 不会增加你对算法思想的理解,只会让你觉得算法的基础操作很“工程”,好像是懂了但也只方便死记)。 在很短的篇幅里,只能说这么多,但有一个长的 introduction 就可以易懂了;但长文章读起来也是费劲的,所以我最终选择保持现状
然后是王垠质疑相对论这回事,我来谈谈看法。
动机不想猜,他博客就起的“我在扯淡”,当然也有不少内容不是扯淡,尤其是科普和讲故事,比如,写个+-*/带参数吧,尼玛 #zhihu 上函数式的人全给(因为不成熟啦,对自己而言做法过时啦,.)删了,剩下些大学编译原理在parser上磨叽,几百行代码,结果还不如王某人(2012)的好,这个领域国内CS是这个水平; 但一些人觉得因此自己就是大佬了,没有认识到大佬的责任(随他呢,也无法道德绑架),对CS挺可惜,尽管往大说这些也没啥用(未必,你看Babel,TS,Swagger )

但相对论有没有用,或者是不是领域性的骗人,也轮不到外专业的人来批评,首先物理乃至CAD工程界人也不都是用相对论的,包括王垠说的“牛顿真正力学”使用者,他们觉得没问题,那就没其他研究者的事了。 就是物理的一个细节有问题,你能逼所有研究者瞬间换说法或者模型,吃力不讨好,何必呢
物理式表示法不差,改正了数学的很多问题,而物理也是应用学科(数学也分卷和正经的两部分的),与其写这样的阴谋论小作文还不如列公式和实验数据可信点,民科就是天天用语文抨击他不信(也不懂)的理论,都要把语文的名声搞差了,但其实会表达是很有用的,并不是智商高就能做。


以前我只会优化代码排版命名,也不会画图,所以觉得«算法»的代码已经足够好了,现在看来仍有可改的地方呢

现在一些娱乐(学术/工程)界人士编程,
每一句都和“天空是空的,仙人掌是长刺的,空气是摸不着的”一样既准确又废
但是带上稀奇古怪的符号、巨长巨短的名字,“精心设计”不知哪该注目的图示,就变成至理教科书了,名字后加个“代数”。谁有权定义代数?它是有什么技术标准规范,必须写成空洞重复的形式才能叫代数?同样是代数,有些人的式子就很有意义,另一些人就在玩起名游戏,请问代数和名字相关还是和范围、图示这些涵义更相关啊? 总是附庸数学,你懂数学没有? 中国多少人通过高中大学的测试,你在数学上含糊就很牛?

我真的不懂那个思维导图是怎么火起来的,自动排版软件又模糊,排出来的连接最后读着看很麻烦,关键是他们在 presentation(SmartArt..)外的地方以png吹这玩意,还说帮助学习,开课赚钱,看着都困难。 其实思维导图创建起来不困难,读起来本应是有动画和引用,可不知道为什么商业软件就挺散,而且作图者也不会用;现在许多做公众号的圈子会分享这些,也就看一乐呵
#python #code #telegram #tool 修正tg desktop 的复制成员名太长
重构 https://alemangui.github.io/pizzicato/ 的代码简直是种折磨,我鸽了3,4天了(当然也是因为天气凉和频道更新。 最开始是想作为WebAudio的练手,的难度下降版,,,) 没想到在我解决人脸识别和画布几何扭曲算法后, 这个东西卡了我很长时间……

你们不知道……🤪 我原以为声音好听=代码好看,没想到这个作者纯纯就是前端,勉强写了个player UX ,全TM是 getByID 拿{} 去传.. 真的还不比我们班同学的复制粘贴。 menu 和article的结构大量重复倒不说, sound-effect 的顺序在网页、snd,effect 侧有三种,而每effect 又有参数,要传全是Element的配置{} ,4种顺序..天哪,真不知道为了一个 presentation page 怎么会如此大费周章唉

前些天我好容易把 snd-effect 给zip 起来,原计划是尽量保留原有结构(#-id我都保留了..) 最后这个UX的中间对象可能模仿不了他 😂,我再也忍不了他这个代码了
duangsuse::Echo
重构 https://alemangui.github.io/pizzicato/ 的代码简直是种折磨,我鸽了3,4天了(当然也是因为天气凉和频道更新。 最开始是想作为WebAudio的练手,的难度下降版,,,) 没想到在我解决人脸识别和画布几何扭曲算法后, 这个东西卡了我很长时间…… 你们不知道……🤪 我原以为声音好听=代码好看,没想到这个作者纯纯就是前端,勉强写了个player UX ,全TM是 getByID 拿{} 去传.. 真的还不比我们班同学的复制粘贴。 menu 和article的结构大量重复倒不说,…
我说大点吧,他这个Pizz icato 看起来很厉害听着也不错,但最终只是 sound source->effect 的单向连接,做成UI 最多整成处理mp3和input getUserMedia 的多声效(GainNode)“配置面板”,这是表现力的极限了。那个生成random()白噪声 和sinewave啥的根本没用处,作者理解不了 WebAudio 为何是基于 AudioNode connect().connect 的吧……看他这个产品页 这还值1.4k star ,真的我不想看pz.js的代码到底长啥样,肯定是一大堆复制粘贴,把我的好印象都破坏了,根 Howler.js 一样

作者根本没想好就开始暴露API了,包络(参数动画) attach/release 开始加在SoundSource上,后来许多又没有此属性,除了 masterVolume 还创建一个 淡入淡出GainNode 去做切换.. 我思量着混音器也不是这么用的啊。 不过它的每个特效都有音量(这时倒可配置起来了,然而特效不支持fade hhh ,节点都用上了 请问 source.volumeGain 和 source.eff[0].volGain 有区别吗)
其实没糟蹋 WebAudio 的项目有很多,比如 p5js.orgwavesurfer-js.org ,一看就知道绝对不是喜欢跨文件复制粘贴的人做得到的 :sob

感觉作者真是有把这个项目当项目做,可是他的HTML真的令我十分头痛啊…… 重构期我都产生700行待改代码和3,4个JSON了,不过我把那个滑条配置默认区间 用函数简化了,算是积累点观察法经验;但是看这种代码真的心累…… 🦀

https://okazari.github.io/Rythm.js/ 创意不错
https://github.com/stewdio/beep.js 只有键盘API.
https://github.com/gridsound/daw GS-工作台 和可视化编程 https://noisecraft.app/browsehttps://github.com/surikov/webaudiofontaudiotool.com 厉害
https://preziotte.com/partymode/ 巨赞的可视化 #signal
https://github.com/rserota/wad#showcase https://github.com/Theodeus/tuna 太虚
http://slang.kylestetz.com/ 编程语言最糟的用途
https://howlerjs.com/ 其实还不错.. 支持分段和3D位置
https://github.com/collab-project/videojs-record 录屏录音
wad和tuna 是啥玩意, bbc/peaks波形是咋..打不开
我是这么“保持原汁原味”的……现在看来可真傻 😂早知道会坚持不下去,依然在重复
duangsuse::Echo
我是这么“保持原汁原味”的……现在看来可真傻 😂早知道会坚持不下去,依然在重复
修好了。这是我第一次重构1.4k star 的项目,也应该是我最后一次“保留原项目风格”…… 复制堆砌 此言不虚 (吐槽: 代码里我无数次用 ()=> 和 ... 以及for() 简化重复 还叫没改风格,非得在Node上才叫改? 😳

(反驳:要是我的JS项目绝对不会出现一整块 o[k]=o[k1] 的代码,早换Obj.assign 乃至列表chunk(2):kv了,可这是 production readily ,要条理清晰.. (被打死

动苏甘拜下风,我对这种代码的维护经验还是不够的…自认写不出同时往HTML .menu,article 和JS里的3个部分里粘贴的,当你添加一个 example ,要改动3文件6位置..
亲爱的各位订户,各种层面上这样的代码,你们今天写了吗?(逃 🙊
duangsuse::Echo
#python #code #telegram #tool 修正tg desktop 的复制成员名太长
我开始讨厌学校里照本宣科了,如果不是因为不熟悉 #JavaScript 这种「动态语言」,怎么会写出如此执掌的代码……我太阳
学校的JS理应把重点,首先让他们写 deep copy 和 deep eq 之类熟悉{} 然后再科普ES6新语法,以及Babel,TypeScript 在完全无需考虑兼容这回事
DOM最少也要把 innerHTML 和 Text 的区别教了,别只AJAX下载html,省得一些人文H不分
Forwarded from dnaugsuz
如何看待V2EX未经允许公布用户邮箱和手机号? - Sion Kazama的回答 - 知乎 #隐私 #net #china
https://www.zhihu.com/question/270687757/answer/355878537
Forwarded from Solidot
AI 将伦勃朗的杰作转化成 5.6TB 数据

2022-01-21 19:16

伦勃朗的《夜巡》的高分辨率图像现在已上网。容量为 7170 亿像素,分辨率为 0.0005 毫米。阿姆斯特丹国立博物馆发布了一张由人工智能构建的、伦勃朗《夜巡》的超高分辨率图像。原作长近 15 英尺,高超过 12 英尺,自 1900 年代初以来一直在密集地进行修复。新数字图像实际上已根据历史记录重建了多年来被破坏的部分。
👆 #ai #cg 使用特殊相机拍摄 5cm 8439 张并以AI拼合,整个文件5.9T,一个像素比血球还小。提供了一个Google地球式的web查看缩放

#android #hardware ,UEFI
Eric, [2022/1/22 下午10:20]
什么时候才能普及运行可以由用户审查、修改、替换的第一阶段引导加载程序的计算机?
封闭的固件导致难以发现和清除的恶意程序,这是行业应该反思的。

事实是,行业不但没有反思反而变本加厉,从所谓的「安全启动」,到完全锁定的引导加载程序(在移动设备上很常见)。所以这可能我有生之年都看不到了吧
Forwarded from Solidot
黑客将恶意程序植入到 UEFI 固件中

2022-01-22 20:06

卡巴斯基研究人员 透露了植入到 UEFI 固件中的恶意程序 MoonBounce。该恶意程序被认为来自于 APT41 aka Winnti 或 Double Dragon。恶意程序修改了主板上名为 SPI flash 的元件,它不在硬盘上,因此格式化硬盘或更换硬盘不会清除恶意程序。修改后的固件镜像允许攻击者拦截引导序列的执行流,引入一个复杂的感染链。研究人员认为,黑客对 UEFI 系统的工作原理有着深刻的理解。感染链只在内存中运行,硬盘上没有留下攻击痕迹。黑客主要对 IT 行业、社交媒体、电信、非营利组织和医疗机构进行攻击。
元宇宙 #Haha 极其声草
https://zhuanlan.zhihu.com/p/460537291 宠物 人
“ 可是,猫主子的地位,是如此的虚妄。血猫产业的存在,恰恰因为所谓猫奴对猫主子的爱是有限的。他们可能会花几千块给猫主子输血,却绝对不肯花上几万乃至几十万去说服别的猫奴自愿带着猫主子献血。
正是这种供求差价区间的存在,导致了血猫产业的诞生。一只吃着三文鱼长大的高贵的猫,随时可能因为猫奴不愿承担成本,而一夜之间沦为流浪猫,最后变成血猫。

就像曾经高贵的奥托.冯.哈布斯堡,在被奥地利驱逐后,流浪到四十岁才有条件结婚。当一头猪盼望着成为猫,或是当一只血猫盼望着成为猫主子,它们自认为这是一种阶级跃升,其实在人类眼里毫无意义。
杀死一只猫比杀死一头猪,或许心理成本略高。然而一两千块钱的利润,就足以让人类克服心理压力,以杀猫为职业。
#plt 呃,这几天眼睛有点疼,那个网页重构也接近尾声了(目的就是交个PR),马上把雄狮扭眼的”热度蹭完“,我就能开始二进制pybind了 ……但是到2月我就必须开始制作一个H5动画礼物,以现在这个效率…… (而且之前说的 Java 入门又鸽子了,尽管对话框和离线javac的问题解决,其他内容还是需费精力

说真的我没一次蹭上国内热度,因为每次都是我趁机学了些”没用的“(比如彩字符画、粒子动画、MBR程序、C指针和数组啦),然后数据不好看 😂
这次也是一样,我用shift重映射圆心距l=1~len 环上像素的方式扭曲一块矩形,这个方法是我自己想的(思而不学(我刚刚上网搜了,没写我这么直白的…… (Android.drawBitmapMesh, web没内建不规则变形)
类似 http://deepred5.com/oppai/ , http://www.htmleaf.com/Demo/201909185795.html (woc dat #gui )这样的。 #Vocaloid 爱好者平时爱看的2D骨架变形是这么做的。
不行这个Grid2Fullscreen #cg webgl实在是太厉害啦 (原作 https://github.com/Anemolo/WebGLDistortionConfigurator . barba.js.org/ 主页动画也很有趣..

它们的原理类似三角形贴图: Mesh=小网格缩放到图片,其上控制点可以移动,相当于小三角在翘曲,例如全向手指位靠(圆挤压 fisheye/pinch C#)
https://blog.csdn.net/lufy_legend/article/details/8084367
当然啦, GLSL 10行内基于笛卡尔座标系() 实现圆的变形是很容易的
https://www.shadertoy.com/view/XsVSW1
翘曲(k=3)
l=length(xy),r=atan2(x,y); //圆心座标<=>直角
l=l*l*k; 放大 //sqrt(dot())速率试试
l=sqrt(l)*k/1; 挤压
p = l * vec2(cos(r)*0.5, sin(r)*0.5);
//xy就是p的新位置

甚至 p *= length((p-mous)* vec2(w/h,1)); fragColor = texture(iChannel0,p);
vec2 p = center - uv ;
float d = length(p),
factor = .5 * sin( iTime ),
f =d>.5?0.: exp( factor * ( d - .5 ) ) - 1.;
fragColor = texture( iChannel0, uv+ /*normalize*/(p/d) *f);

算下距离都能做到同样效果(就是我实现漩涡扭曲滤镜的原理

如果只是圆形其实并不困难,重要是在符合直觉…… (啊草
a:数组,x:项,k:键,q:真假,d:{}表 #code
let a="run (\\f x. (+ (+ x 2)3))  (f 1)".split(/([()\s\\\.])/g).filter(s=>s.trim()!=''),i=0;
层=(tk)=>{for(let x,q;x=a[i];){i++;if(x==')')break;q=x=='('; tk.push(q?(x=[]):x); if(q)层(x)} }
glo={run:a=>a[a.length-1], ['+']:([a,b])=>a+b }
eva=d/*scope*/=>a=>a.values? (a[0]=='\\'?eFun:eCall)(d,...a) : !/\d/.test(a[0])?d[a] : +a//num
eCall=(d,kf,...a)=>(d[kf]||console.error)(a.map(eva(d)) ) //单步规约
eFun=(d,_,kf,...x)=>{let nArg=x.indexOf('.'),ka=x.slice(0,nArg);x=x.slice(nArg+1);x.unshift("run")//解析:切分 //v 名值表允嵌套
d[kf]=a=>{if(a.length!=nArg)throw `bad arity for ${nArg}`; let old=zipMap(ka,a, (k,v)=>{let v0=d[k];d[k]=v;return[k,v0]});
let r=eva(d)(x);old.forEach(([k,v])=>d[k]=v);return r } }

zipMap=(a,b,f)=>a.map((x,i)=>f(x,b[i]))
层(_6=[]); eva(glo)(_6)

调用时才去zipMap(形/实参) 然后解析变量,在运行了KV表仍存在,故称『动态作用域』。 若把 eFun:eva(d)(x) 注意不是微分! 里d.copy()保留,就无需 let old ,且支持『词法域』 just=x=>()=>x, f=just(0/*x是参数0吗?*/) ,若编号变量、独立调用栈,不返回编程(eCall: 内项Promise.all 后才done +-*/)就实现 continuation(断续函数,协程)

有赖于F12 ,在eCall上打断点/ logs=f=>a=>{console.log(...a);return f(a)};glo["+"]=logs(glo["+"])
再次调用 glo.f([1]) ,可以看到计算过程。 Java上用class造解释器同理,只是给 (run ,if, 1/""/true) 的语义(\f. 内是多表达式) 专门建立Node了而已,因为我们必须区分(顶层/函数内) 是”语句列表“而非调用的特殊「语义」(解释器只看语法树,不知”层级关系“,解析信息必编码为此IR中间表式),S-表达式里用x[0]标注足矣。 解析到此”非规范“AST是完全一样甚至更快的

Node和S-expr 一样吗? let a=1,b=2 或 import a.* 应该是S不能表达的语法吧? (= a 1 b 2) (use-all 'a)/甚至变import作用域表 就可以。把x[0]当节点类型即可。另外S的本质(前序算式)可以和后序的+-*/优先链、.[]()左先链 结合,算符后序 按*+重排序

欸,大家也看到我编程风格的变化了:宁可用特殊语法+自己注释也不愿用工程的做法.. 主要是省字数,这里是教程 😅
但如果是省字数却弊大于利的情况,我会写自然点:例如 s.trim()!='' 也可写 !/\s/.test 或 !!s.trim ,这都是有取舍的。我经常对一个表达式改了又删,因为所有写法都不过是茫茫语法树里一片叶子罢了,没啥可稀奇
解析器(同时分词)和树遍历(以栈)、集合类型论+型参(in-out性)与推导、二进制组/支结构、(虚表,双指针)多态/(函外量编号保存)闭包/(值变量归一)解构、伪递归,不完整求值等流控 都到齐了,就差实践经验和CPS变换的协程/序列<T> 不会了 🤔

嘛,但那些大佬也对这些没有帮助。说到底最后出力的还是工程界的各位,明明做过那么多尝试,写文出来还是很精炼,很默默无闻