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
#js #lib #performance #gui https://editor.datatables.net/generator/
🤔 想起了 #Qt Model/View 的 delegate 和 createEditor 什么的... 但其实从 row 建立可搜索、可排序、可编辑的 table 并不需要那么多名词吧

https://github.com/fiduswriter/Simple-DataTables
嘛,虽说是 lightweight ,其实连 Date format 都支持...

http://fooplugins.github.io/FooTable/ 感觉还是这个最好看

https://github.com/frappe/datatable 这个也支持 inline editing
https://github.com/future-architect/cheetah-grid 有创意,内带比率可视化支持
https://github.com/mleibman/SlickGrid/wiki/Examples 感觉最糟糕的一个
https://github.com/bvaughn/react-virtualized 第二糟糕的
https://github.com/ratiw/vue-table 最像 Qt 的一个... 不对,这不像 Qt
https://github.com/jiren/StreamTable.js 支持 #stream 但只能用 templating 的一个
http://swimlane.github.io/ngx-datatable/#filter Angluar 的一个
https://github.com/daniel-nagy/md-data-table#demo Material #Design 的一个,作者眼力是不是不好... README.md 那么多示例 table 放着呢
https://clusterize.js.org/ #performance #web 🤔给 <tr> 甚至 <il> <div> tag 做 chunking 的简易 js 优化
列一些有趣的社区项目 #math #listing #Java
https://www.desmos.com/calculator/i6fijibmbz

#GUI 系列:
https://github.com/darsam44/Mini-desmos (吐嘈: 真的不迷你)
https://github.com/DanielZhangD/Javmos
https://github.com/LitterallyTheCoolestGuy69/Desmos-But-Scuffed

#Python 转换/等式代码生成脚本系列:
https://github.com/MrNewdary/svg2desmos/blob/main/svg2desmos.py
https://github.com/anematode/parametrizer/blob/master/undeletable.py
https://github.com/allesspassig/despy/blob/master/despy.py
https://github.com/emily-yu/image-to-desmos OpenCV #cv
#music https://github.com/AlexApps99/MIDI2Desmos 听 MIDI 函数图系列...

多项式课系列:
https://github.com/galbar07/Desmos
https://github.com/yonatan555/Desmos-Polynom
https://github.com/JiangTianXiang/Grade-12-Calculus-Graphing-Calculator
https://github.com/WhoIsKatie/Javmos
https://github.com/TimChoy/javmos
https://github.com/DvirTomer/Desmos-Polynom

乱入:
https://github.com/andrewpareles/Calculator/blob/master/main.ml
https://github.com/Tuttivers/ExponentialSeekbar-sample/blob/master/NearMeSeekBar.kt#L75 #Kotlin #Android
https://mukunthag.github.io/SHM/ 振荡器什么的...
https://github.com/Rob--/root-approximations/blob/master/evaluatex.js#L190 #JavaScript #lib #parsing 几百行的符号代数系统...

可移植性/项目管理极差的 GUI
https://github.com/Pi-Man/Graphing-Calculator/tree/master/Graphing-Calculator
https://github.com/RohanK22/cppmathtool
http://well-made-territory.surge.sh/Desmos.html
https://github.com/softchickenidiot/3D-Grapher/tree/master/3D Grapher
#android #gui #design #drawing https://tttttt.me/AndroidDevCn/184450
https://tttttt.me/AndroidDevCn/184426
Activity 透明模糊背景 4.0 删了,新 RenderEffect 可以作用于 View 但需要 API S 🌚
iseki:
请教下群友们,想弄个毛玻璃activity…但是完全没想明白咋弄🙈
不是…我是说…半透明的活动,背景毛玻璃🙈
找了半天一个扭曲的实现是截屏+模糊🙈不想这么扭曲

Ghost Flying:
你可以渲染到 SurfaceTexture backed 的 virtual display 上,然后用 OpenGL 加滤镜贴主屏,然后透传触摸事件(

iseki:
不知道Android咋合成的,要是依次在一个表面上画所有activity,那应该行吧
Ghost Flying:
就是多个 window 当成 layer 来合成

题外话, #Android #marker glide #build https://tttttt.me/AndroidDevCn/184384
#statement #functional #js #GUI #dom
再说 Reactive... 等等这不是 Rx 类框架的招牌吗٩(๑`н´๑)۶ 看来 -ive 的词性都容易后宫起火啊草。
React 用 functional MEMO 提升控件更新性能根本就是弱智措施, memo 即备忘录,用 hash 表实现函数输入输出对应的缓存,这样对类似 Text 的控件,同输入多次调用不产生额外计算和内存开销,应用在树 render() 上时相当于自动实现 shouldComponentUpdate() ,尽量复用旧的渲染结果,对树遍历减少重建操作量,相当于仅重建了真正变更的控件。

经典版暴露 shouldUpdate 已经很没水平了,说好的面向 state 编程呢?在我看来这个 Reactive 所做的就是「把所有控件的所有变量暴露到一个 state 里方便读写操作」,那么凭什么程序员要操心什么 update 啊 memo 啊,记得很像 还有 SMUV(state,message,update-event,view)模型,实际上根本不能便利地 handle 多少东西,就是个秀儿。

当然,其实真正的 relational 编程也是这样,关系式 state/var/eq/both/either 靠 enumerate&filter 可以解出 x+1=2 这样的线性方程,甚至能得出 a+b=9 的所有可能性,只是需要 interleave([a,b]) 两个变量先后递增构造 state 迭代,然后 unify 一下同步恒等关系(双向版变量引用)而已

可是这和 DOM 有多大关系?比如我有个
class Main: DUI() { fun view() = el("il", withNone, Counter(0)) }
class Counter(var n): DUI() {
  fun view() = elDiv(withNone, elText(ref(this.n)))
  fun inc() { n+=1 }
}

其实渲染 Main 的时候连给子控件注入其路径都不需要!也不需要专门分析 DOM diff 的哪个 tag 哪个 attr 还是 text ,直接拿住自己的 HTMLElement 的引用就够完成全部 update 了,所以说搞那么复杂?

要是想兼容 haml 或者 E4X 内联 XML ,直接做个中部翻译成 el 调用就行,反正 DOM 元素动态创建最好是 createElement ,逃不开运行时开销。

想实现控件属性事件到 update 代码的方法很简单,因为 js ref(a.prop) 并不会传入 a 相关的信息,编译期把 op(ref(a.prop)) 变成 refAddRel(a,"prop",v=>op(v)) 就可以了,这种方法换成处理全部代码,引用处 a.prop=x 自动更新就变成上面那个 框架S 的实现方法,接口上是兼容的,只不过 refAddRel(o,k,op) 从 defineProperty 变成编译期打监听表。

变形方法很简单,walk 到 FCall 节点记作基点,如果是 op(ref(o.prop)) 就把基点变成 refAddRel 的调用,如果是 ref(v) 这种不知道 receiver 的情况就请换 Array [v] 报错,反正框架函数可以随便加没必要特别支持 a=ref() 这些语法,兼容的少,反而更优雅。
#GUI gnome Widget factory (草
duangsuse::Echo
#statement #dev #design 编程者像舞蹈编排者一样,就是什么时候做什么事情而已。 什么时候是指外部输入和环境变化带来的事件入口及传播;什么事情是指对数据的处理与判断。 编程就是总结物上之事的客观规律并加以主观控制,实际一步就是美感地设计代码/项目的结构和利用下层接口。程序的设计和科学一样,只要习惯了所处的这个死板的「世界」,明白目标的流程和时序/存储关键点、灵活复用代码,无论看起来多么复杂或强大的程序都能按部就班地设计出来! #functional 程序序列 生成/归纳 ,比如对第一次/第一项的特殊处理或重复语句…
编程者像舞蹈编排者一样,就是什么时候做什么事情而已。

什么时候是指外部输入和(内部)环境变化带来的事件入口及传播;什么事情是指对数据的处理(读写,生成,归纳)与判断
编程就是总结物上之事的客观规律并加以主观控制,实际一步就是美感地设计代码/项目的结构和利用下层接口。

程序的设计和科学一样,只要习惯了所处的这个死板的「世界」,明白目标的流程和时序/存储关键点、灵活复用代码,

无论看起来多么复杂或强大的程序都能按部就班地设计出来!

🌝🤔很多时候大家看起来觉得很复杂的软件都是有套路的, Tab(notebook)&indicator ,可移动重组 Panel , drag&drop ,自定义渲染的子控件

项目保存是序列化、导入导出是表现形式互化,撤销重做是编辑栈,还有设置、按键编辑器什么的,
它们都是很常见的交互组成成分,对多线程的 desktop #gui 而言监听分派和 style 自定义可能没 mobile 麻烦,但是很多人还是不得不利用过低层/辣鸡封装的API定义这些东西,心疼
#dev #life #js #web #gui 咱要实现一个 Tab(notebook) 控件。

A: 今日校园的 tab 也要做,这个难度可就不小了
B: 无非是一个 nav 后接个大横列 div ,初始全隐+切首页,切换隐:active+设置新:active 加减 hidden
onclick 的 nav span 元素添加 no 属性,直接和后面横列 div.children 1:1 对应
A: 那么下面的动画条呢?
B: 可以用 canvas 做 background-image repeat-x 再调 offset-x 吧
A: 貌似不可以吧。背景图是不能 overflow 显示的,必须做成单一元素
B: 那就做成 div 条盒子,设置 position:absolute 再切 left width 的 transition 就好了
A: 我想关键的问题是,不同页面间有点元素要复用…… 这就非常头疼
B: 无非就是第二层嵌套是不是 for(pagedIndices)showHide 操作的问题了,我觉得只能做成 div.replacer 的形式,而不能是 tag.copy-to-keep ,当然那样或许性能好些?
A: copy 的问题在于不知在哪重新插入,如何在 DOM 数据上提供这种指定接口,而且恢复也比较麻烦。
B: 2h 写了一个 https://64f1aq.coding-pages.com/HTMLs/school/_2/tabs.html
我用的 plan B,毕竟多两个 node 有点不爽,而且不用 replacer 也能实现 cloneNode 补贴式的x滑动
提供的 api 基于 childNodes[attr("no")] 和 e.groupBy(attr("tabs"))
#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 ,这都是有取舍的。我经常对一个表达式改了又删,因为所有写法都不过是茫茫语法树里一片叶子罢了,没啥可稀奇
👆6.4的天安门广场,甚至于0伤亡;但重点始终不在于任何历史,或者tank
man的照片 谁对谁错, 而是为何当时的环境,导致事件升温、为何无法和平的解决 ,以及为何32年后的今天系统依然要例行维护

历史是被封印的未来。尊重历史,是美日中韩都需努力的做派,或许只是演戏,但一定要演。🤔
https://tttttt.me/VoiceofPooh/100135 台湾社论

https://tttttt.me/VoiceofCN/6540
🕯蘇聯笑話:有個人在紅場散發傳單,但被克格勃逮住。克格勃沒收了所有傳單卻發現那些傳單不過是白紙一張。克格勃想了想,決定把發傳單的人抓捕:你以為我不知道你在說什麼?

https://tttttt.me/swiminthedream/910 #db #gui #app 🧐那为什么不把web应用弄成原生GUI(