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
duangsuse::Echo
接续上次贪吃蛇,但也最终没弄出多玩家和朋友玩,而且连 dt 时差都没算,额(当然弄出来了也很不满意,因为高二的大佬都会给五子棋加 AI 了 贪吃蛇难度巨--) 下课后几个同学开起这段小程序的玩笑,「怎么没豆呢」「吃了都蛇咋不长呢」,还问我能不能搞出植物大战僵尸来(当然不行啦,除非只有字符画 但也要300行最少) 我熟悉了下 C++ ,用的 new struct * 和 std::queue ,中间出了三次非常有意思的问题。 1. 动画不动但帧明明在刷新(当时快崩溃了 根本不知道为什么 还以为渲染有问题),地图蛇头…
#school #life #cplusplus #web #algorithm #statement snake&dom 🤔
感觉这个实在是太幼齿了,下次一定要加速啊(关于游戏 只会一两个模板就太可惜了)

对了,没有网的话怎么消磨时间呢? #Google #DontKnow Dragon Trex 小恐龙!
这个东西的源码不在页面上,查 event 注册什么的应该也看不到,但通过 Performance 快照,或者 Network 查 canvas 更新的 initiator 能找到 VMno 脚本号,可以看见它把 Runner 类暴露了。

作弊小技巧: r=new Runner(); r.gameOver=console.log; r.restart();
这样 Trex 就不会 GG 了,而是永无止境地跑下去 -_-|| 仔细看还能发现月亮 spirit 是有圆缺更替的,非常细心。
整个脚本是没带框架的,还包括碰撞检测程序,啊真是非常完整呢。
duangsuse::Echo
#web #js #api https://stackoverflow.com/questions/4386300/javascript-dom-how-to-remove-all-events-of-a-dom-object iframe 标签可用 .contentDocument Node 可用 .getRootNode() 获得 # document window.getEventListeners().click[0].listener() 可以枚举事件监听 本来打算用 ev=>ev.sto…
#js #web #DontKnow DOM 小提示! 😘
1. with(e.parentNode){ insertBefore(e1, e); removeChild(e) }可以用 e.replaceWith(e1) 替换
2. e.remove() 等于 e.parentNode.removeChild(e)
3. children, firstChild, prevElementSibling 不会获取到 text node 而 childNodes, parentNode, nextSibling 会
4. e.onXXX 的 event handler 里 return true 可以停掉链传播
5. event handler 都是函数值,函数不必真的有名字,只需持有函数的引用,并不一定真是带 name 的 (感觉写得好废啊
6. document.body.contentEditable=true 你会发现浏览器就像 HTML 编辑器!(designMode 亦可) ⭐️
7. document.elementFromPoint(x,y) 你会发现想实现 Ctrl+Shift+C 很简单!
8. AJAX 是异步 JS/XML XMLHttpRequest open send 的缩写,已被 fetch("http://").text() .json() Promise API 取代;PJAX 是 pushState JS/HTML 的缩写,意为能控制 navigator history API ,实现跨页播放器可用它
9. 设置 inner/outter HTML 的速度没有 createElement 快!请不要靠拼接 HTML 渲染视图,而要靠它做缓存等工作
10. e.setAttribute(attr,v) 是忽略大小写的,否则也可直接用 e[attr]=v
11. createElementNS 主要用于创建 SVG namespace 下的 tag ,这些 tagName 是不能按平常方式 create 的

12. JS 支持 (new Date).getTime() 语法,这个调用类似 performance.now()
13. cloneNode(true) 可以只复制节点 HTML ,相当于 outterHTML=outterHTML
14. 许多浏览器的控制台的 CSS warning 默认不显示,你可以启用它。 除了 console.log 还有 info, debug 等其他 logging 方法 ⭐️
15. Cookie 是 HTTP API 用户登录 session 的主要实现方法,被持久化的登录信息,一般存储在 localStorage ; 是 Storage.prototype
在浏览器插件里, chrome.storage.sync 是能被自动同步的配置,与单页的只能 localStorage 相对。
此外浏览器插件利用 chrome.runtime.sendMessage 能在 background 与被注入的 pagescript 之间交换数据
16. alert(); prompt("title", "默认"); confirm(); print() 往往不被推荐使用,因为 UI 框架往往有更漂亮的非阻塞替代 ⭐️
17. (un)? escape(), encode/decode URI (Component)? 是常见的编解码 API ,如果你要拼接/解析 URL ,必须用后者来兼容 &name=(含等号,&,? 等特殊符内容) 这种参数;如果你要让 URL 更可读(像解码 Unicode)可能就要用 decodeURI
18. document.execCommand("copy") 能复制已选内容,一般结合 Form 元素 input 的 select() 操作
19. 很多人都用 <script defer src=""></script> 取代 JQ 的 $(op) 或者说 document.addEventListener("DOMContentLoaded",op);
20. JQ 比较意思的地方除了链式调用、选择器 expr 支持,还有它封装的 Animation 、 Tween, easing 与队列。
duangsuse::Echo
#js #web #DontKnow DOM 小提示! 😘 1. with(e.parentNode){ insertBefore(e1, e); removeChild(e) }可以用 e.replaceWith(e1) 替换 2. e.remove() 等于 e.parentNode.removeChild(e) 3. children, firstChild, prevElementSibling 不会获取到 text node 而 childNodes, parentNode, nextSibling…
#html #dom #API #doc #dontknow
https://duangsuse-valid-projects.github.io/Share/HTMLs/school/ 🌝新写了个弹球动画,我真是 HIGH 到不行,赛高哩HIGH哒≈

https://developer.mozilla.org/en-US/docs/Web/API/Web_Animations_API/Keyframe_Formats

还有之前的剪贴板我也查了
document.querySelectorAll("[contenteditable]").forEach(e=>e.onpaste=(ev)=>{ e.execCommand("paste",false,ev.clipboardData.getData("text/plain")); })

[在线Html编辑器粘贴过滤技术详解(一)_weixin_33910460的博客-CSDN博客](https://blog.csdn.net/weixin_33910460/article/details/89910701)
[JavaScript如何获取粘贴事件的剪贴板数据(跨浏览器)? - 问答 - 云+社区 - 腾讯云](https://cloud.tencent.com/developer/ask/186776)

另外在找的时候我发现一个 1k star 的 JS DOM 变动静态库,思想挺有意思的,不用 MutationObserver 和 NodeIterator,TreeWalker (document.createXXX(e).nextNode() ) 什么的,而是利用了自定义 @keyframes 的事件 animationStart 。 API 类似 inotify , on(selector,op) 这样

https://github.com/muicss/sentineljs
然并暖,到 DevTools events/debugger 面板看看 DOM Events 的归类就能发现有一大堆 DOM 变动的事件支持嵌套次序🌚
$0.addEventListener("DOMSubtreeModified",console.log); $0.getRootNode().body.setAttribute("contenteditable","")
稍有常识的人不难看出,如果我们的 API 继续前进,类似的魔法还能有价值吗?
#html #learn #dontknow 谈谈 IE 时代开始的 XHTML, HTML4 相关的格式之争吧。

<!DOCTYPE html> 为什么和 <!-- 那么像?其实这个标签是 HTML5 才引入的,类似 ES5 的 "use strict"; 它只是「使用新版格式」的标记

早先的时代,web就好像 (Linux 用户所见的) man pages ,HTML 就像今天看到的 markdown,并不严谨,并没有被广泛采用的规范(对 UI 而言,人杂是 web 的缺陷;心乱是 mobile 的缺陷;框架多是 desktop 的缺陷)

HTML 2,3,4 都是 retro-spec ,即先被广泛实现再有标准,而规范的制订主要是帮助兼容「含错误的网页」(真的搞不懂一些人成天爱 -webkit -moz -egde 前缀 CSS1,3 标准属性的是干什么)

比如说, <br> 和 <br/> 及相同模式的 hr,dt,p 标签,对一些浏览器可能显示,另一些无法兼容,这就导致了客户端(用户代理)差异,而规范统一了错误兼容法,即 HTML 的格式。

W3C 尝试以 XML 规范 HTML ,它指定了 application/xhtml+xml 的强制错误检查格式,但被写惯非 XML 兼容扩展的开发者拒绝了,无奈只能允许用旧 application/html 分发文档,不进行错误检查,只是做了 xml schema 规范。
所以说一些上个时代的网站(比如 gnu.org)声称自己支持 XHTML 1.0,只是说兼容了此规范,并不代表没有使用 undefined behavior 的错误兼容。当然随后 1.0 的附录 C 被取消, xhtml+xml 也不能用了(不向后兼容)

Apple WebKit 和 Gecko, Chrome与Opera 合作的 Blink 等新渲染器取代了 MS IE 的时候, W3C XHTML 2.0 尝试复辟检查的老路,并且完全向 XML 靠拢(众所周知很多应用协议基于 XML 数据建模),竟不向后(前进者的背后!)兼容了!于是 Mozilla&Apple 发起了 WHATWG 规范组,它设计了现在被广泛使用的 HTML5 ,现有引擎支持 H5 不会 break 现有的网页。
#DontKnow #推测性 #web 关于两个常见交互/功能设计!二维码登录和「划屏手势同时使用 pager 和 paged banner」

一般而言,网站使用 cookie (本意是临时的标识符)获取用户的登录身份。不同设备有不同网络地址,最好不要复用 cookie ,服务端一般要写专门的逻辑支持「手机扫码登录」。

但是,所需最小的信息交换和直接共享登录 cookie(token) 的方法是一致的。网页端显示的二维码蕴含已登录客户端和自己都明白的一个「读写位置」,它能写的数据可能是固定的,比如由已登录客户端请求服务端写入新 cookie ;但本质仍是通过「二客户端都知晓的读写位置」来实现,只是掩盖了直接读写的操作且支持了事件

为了监听到登录事件,往往选择暴露 WebSocket 接口

== 很多时候 DOM 树上接受某事件的元素不止一个。 举个(不同平台的)例子, Android 上一些 ViewPager 里可能有横向滚动条,为什么只有滑动到滚动条末端 pager 才会翻页?

从嵌套序来看是 pager 包含了(其子项) ScrollView ,但对于用户的输入 event ,传播责任链是深者优先——直接目标 Scroll 会处理这个交互。

如果滚动条已到最左而仍收到 swipe 手势,它就不能截获(intercept)此事件仅由自己处理,故此其父项 pager 就有机会往左翻一页;反之,如果它明白事件的涵义是滚动自身,则可以消耗它而不影响父视图。
噢, Reactive 就是 c=a+b 自动更新 c 呀,我之前想了几次呢。 一般不用 onresize 之类的事件很麻烦呢 #Web #DontKnow #JS #lib
而且还能做到数据变动视图自动更新,耳不仅是单向的视图更改数据,有点意思。 #functional #ce
然后对于控件的 computed() 用了特殊语法 $: a+b (label statement) 表示,应该说也是很实践性

“ 在「古典」React 里,你不得不写 shouldComponentUpdate, 在现代 React, 你同样需要引入 useCallback 和 useMemo,手动地缓存函数,来避免性能问题。

同样是使用 Virtual DOM 的 Vue 却没有这个问题,因为 Vue 的机制(依赖收集)决定了它不必重新执行整个 UI 函数来换取新的 Virutal DOM 树,当某个状态更新的时候,它明确地知道应该 diff 哪些节点。

这么看 React 真是傻逼,不过是提供了无作用域的 state ,竟然要重渲染整体 UI?难道不能收集出有哪些变量节点用了被更新变量么,这不是基础操作?
#cs #math #dontknow FizzBuzz (%3=0, %5=0) 可以用这种方法解决
mapOf(1 to "$n", 6 to "Fizz", 10 to "Buzz", 0 to "FizzBuzz"}[n**4%15]
一般都方法是判断 %3 %5 %(3*5) 或者用 && 连接前两项
#CG #cv #DontKnow #cs encoding
duangsuse: #kotlin #Dontknow
dsl marker 是干啥的啊, top{ sect{fn()} } 里top的this不对sect起效? 就是说禁止外层隐式this?

平行线:
禁止隐式传递外层this,之前写gradle时候把minSdkVersion配置写buildType,结果实际调用的外部android层的this

duangsuse:
利用编译器处理解决流行问题是kt独有的
当然butterknife也是,但我觉得不算编译器
这些概念-变量绑定在动态语言和现在的 viewtree DSL 里不值一提

タナバタ カヤ:
官方都不推荐了

duangsuse:
对解释器嵌套作用域而言隐式this是特性,就像js with({a:1})a
所以要实现仅1层隐式this
dslmarker XLang
XLang class A{ fn top(FnOn<A>)
,sect }
拒绝A外的this变量,应该易想到

groovy就算了,早点让kts取代它

一群javaee 语序都写不顺的工程师,写几个exprlang就开始折腾简写语言,当然会落入设计不严谨的大坑
螺莉莉的黑板报
http://tridiv.com/ 用 CSS + HTML 画三维物体的可视化编辑器。 你们……CSS 上脑的人好可怕……
#DontKnow 一如既往的Y-up 座标系(左手比枪xy, 中指z) 。 原来向y旋转是要改变x角度吗..向z旋转要改变y, 角度z 就是相对x了,对横长方体不明显..

正方体有6面,十字架展开 tp lt ft rt 凸字形:最上=顶面, bm bk 底和后,相信类似3D盒动画大家见过 --_- 。它们的 #CSS transform:
rotateX(90deg) translateY(-50%)
rotateY(90deg) translateX(-50%)
translateZ(2em)
rotateY(-90deg) translateX(-50%)
rotateX(-90deg) translateY(-50%)
translateZ(-2em) rotateY(180deg)
顶底(i=0,-2) 的角度是对应的,轴=X
前后(2,-1) 移动轴=Z —只是前后次序
左右(1,-3) 轴=Y

当你正面(xy)正方体,它可以在X/Y=横纵 距一个外点旋转(xy位置改变),Z 就是四方本身的倾斜度
X不是横向旋转,而是“所有点绕X轴转”

然后通过 rt-lt{width} bk-ft{} 这些调参

它给每个对象创建CSS .cub-19 .face 我最佩服的..
https://developer.mozilla.org/en-US/docs/Web/CSS/transform-function/rotate3d()
#web #tool 笔记本 https://xwmx.github.io/nb/
https://ia.net/presenter .md=>.ppt
#js https://tttttt.me/swiminthedream/1256 无界面的社交网络🌚🌝

#dontknow css 可以在浏览器里即时编辑🌚: style[ContentEditable]{display:block}
所以H5是未来的技术(

#algor #py #dalao http://whatbeg.com/2016/11/16/godtianpinyin.html 自己写谷歌拼音?
#hard #sql #rust https://zhuanlan.zhihu.com/p/596119553 图论优化器
https://caniuse.com/css-snappoints #web
#dontknow #CSS Scroll Snap

可以替换 splide.com 用js模拟的拖拽轮播图,可grid化,配合 anim-timeline:scroll(#id) 可实现滚轮ppt驱动动画 🌚👍

CSS 相比 YAML 把 03:01 解析为24小时制秒数😅就好得多https://ruudvanasseldonk.com/2023/01/11/the-yaml-document-from-hell

另外,DOM的resize和visible(Intersect) 也是有Observer 的
DOM和CSS就是多元化 #UI 实际上的标准
#DontKnow #linux #tool
有没有那种能存档linux 进程的调试工具啊,就像GBA里的存档键
涉及 vmem,fd, linker 等问题.linux ptrace没有
Linux 太硬了,都不给这种简单的进程级hibernate工具?

预装了,叫CRIU。感觉Linux和win32 里也有好的成分,比如 ld hook , overlayfs, qemu-user, D-Bus, rundll32和C#COM , WSL, CRIU, https://github.com/rami3l/pacaptr 包管理

垃圾 docker pause 居然不给进程 snapshot 的机会,是把cgroup CPU轮转给停掉

我想用进程快照玩游戏,这样就能复活,也不容易存死档
但是貌似只有VMware UI 最方便

(import multiprocess 挺好玩,最近封装AI库就用到了进程池。二进制数据封送直接传参就能过去
进程池的全局变量是复用的, 不会浪费时间
(补: Docker 2014 就支持了进程冷恢复,但fork需要 -dir 参数导出,新容器加载
#code #bash
echo "{\"experimental\": true}" >> /etc/docker/daemon.json
sudo dockerd
docker run -d --name looper busybox /bin/sh -c 'i=0; while true; do echo $i; i=$(expr $i + 1); sleep 1; done'
docker checkpoint create looper c1

docker start -i --checkpoint c1 looper
#py #dontknow 不好的写法
e.g. 不使用 main 而难于import
使用map,filter 而不用(for if), 或在for里修改集合
忘记 typing,pathlib 或 r"rawstr" 正则
把 np.array 视为iter
用注释“重写”代码 ,却不解释代码为何存在

依赖注入DI 在 Py 著名的PIL绘图里为何不存在 -被{kv:函数值}化了!
#plt #bing #talk 不会思考它没学过的资料..
我想写类于Java 类型系统的类型检查器,请提供类型的数据模型
>很好地提示了TypeVariable,Method 等反射接口
请举几个函数式例子, 说明 check(def) 如何证明调用是有效的
> "g(x, x) = x * 2"; // 是无效
利用 Haskell data 编写类型的数据模型
>很长地细化了反射接口

请了解js的 PEG 和递归下降技术, 解释 num,str 的嵌套列表 和csv的PEG文法
>很成功举出可运行的示例+test
>可示例只观感上正确 ,且使用了PEG不支持的leftRec

既然有了解析器,借鉴lisp标准做一个 js 调用器,能实现对 (fun filterMap(xs f) ) 的定义,要支持 fun when let = 几函数
>听不懂

为什么你不太熟悉实现这些,但很会写 snake,tetris 这种js游戏代码呢?
>我利用我的内部知识和一些在线资源来拼凑出一个可运行的结果

在经济上, 程序员的工资完全取决于其工作的难度吗? 如果AI让难度变低,对编程界会有什么影响呢?一些人觉得AI掌握了他们在小圈子里独有的技术, 从而让这种技术廉价化了,你能举几个回应吗

>AI 可以帮助程序员提高效率、创造力和协作能力,让他们更容易解决复杂的问题,但可能会取代一些低层次或重复性的编程工作,导致一些程序员失业或降低收入
程序员需要不断地学习新的技术和知识,AI是要帮助他们更好地使用和发展他们的技术

有解析库支持在定义 parse 的同时对应地支持toString 吗? 基于递归下降算法如何让 list 文法同时支持parse和toStr (stringify,dumps) 呢
>没有,ANTLR有吗? 不知道咋做
几个支持unparse 的库: csv , xml2dict, pyast
传统的: https://pegjs.org/online ,jison


https://www.compart.com/en/unicode/plane
理论上来说,既然能解析一种文法, 就一定可以把生成的数据还原回来
>正确,还原的字符串可能和原始的字符串有一些细微的差别,比如空格,换行,注释

这种正反函数的概念,对 HTML 数据绑定也有效, 意思是能被 render() 就能被爬取, 你能举出例子吗
>不懂,但有人答过js怎么做数据绑定
你能解释 parse-unparse 和 mmap() 的区别吗,假设mmap能够映射AST
>那就不需要parse了,但我也不熟悉。 mmap() vs read(buf) chunked
js Blob DataView 的封装

Tree-sitter is a parser generator tool and an incremental parsing library. It can build a concrete syntax tree for a source file and efficiently update the syntax tree as the source file is edited
https://github.com/tree-sitter/node-tree-sitter

我有 1, (1), (1 20) 这样的递归模式要用 Perl 正则匹配
> (\d+|\((?R)+\)) 和 (?<R>\d+|\((?&R)(?:\s+(?&R))*\))
$ pcretest 能校验配对,但很脏

#rust #dontknow 离谱的循环
let c = loop {
if Q() {
break "answer";
} else {
break None;
}
};

fn first(:Iter):Option = for x in list {break Some(x);}
else default {None}

so for, while, while let 该咋办?😒易放难收
#py
for x in []: pass
else: return "没有"
#design #dontknow
https://docle.github.io/2018/08/26/Why-Numbering-Should-Start-At-Zero/
Dijkstra: 在我们平时接触使用的大多数编程语言中,编号都是从 0 开始的。接受了这是一个惯例后,很少有人会去想为什么是从 0 开始?

为了表示区间 i=2 3 .. 12 可以写
a. 2 ≤ i < 13
b. 1 < i ≤ 12
c. 2 ≤ i ≤ 12
d. 1 ≤ i ≤ 13

哪个更适合作为标准?看一致性!
i=1..<12 的差正好是长度,也就是说,这样区间的列表正好能描述代码高亮,省得去算 A+1 ≤ i ≤ B

不过, i=0<..1 的差也是长度,但那样 range(3) 和 my_list[:3] 的长度就不直观了
C里,a[0]=*(a+0); a[rand()%n(a)] 用于选随机数-- (x%n)<n ; a.index(x) 没找到时是-1,正好能 suffix(s:="a.txt",x:="."); s[s.index(x)+1:]
(s[0:i], s[i:]) 更是能二分一个字符串

既然如此!为什么我要从1开始数? 因为常识。

-a [1 2 3]
(a first) == a#1
a#1 + a#2 == 3
a#1~2
a (inc 1 -2): (i) a#i

a=[1 2 3]
a.first == a.0
a.0 + a.1 == 3
a.(1~1)
inc(1, a.iLast-1): (i) a.i

let a = [1, 2, 3]
a.first == a[0]
a[0] + a[1] == 3
a[0:1]
a[0:-1]


假设你没学过编程,哪个更自然?
无论区间还是分割,都应当用专门的类型描述,典型的用例就是LRC/VTT字幕(二者的区别是lrc字幕时长可以不写)
如果用Range建模lrc文件,恐怕会很生硬
#sql #dontknow https://avi.im/blag/2024/sqlite-facts/

>It is maintained by three people. They don’t allow outside contributions.
CREATE TABLE t(value SPONGEBLOB) --- This is BLOB type!

最崩不住的一条语法无检查
#dontknow #android #sysadmin

在信号不好、网速慢时,如何关闭5G😋

- 开发者模式:频繁点击 设置/我的设备/OS版本
- 搜索 「选择菜单」/menu ,选择sim卡图标项,启用
- 在双卡设置页点击手机号右箭头,网络类型,选择LTE

ps. 5G的好处是网速快、不滞后、容积率高,缺点是覆盖小、成本极高、用的人很挤、缺乏配套应用。