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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
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就开始折腾简写语言,当然会落入设计不严谨的大坑
duangsuse::Echo
#js yinwang的平滑滚动也是这思路,如果不想interval周期刷新 就只能取其半这样模拟函数 e=document.body,K="scrollTop", f=余=>setTimeout(()=>余<0?0: f(e[K]-=余*.7), 100);f(e[K]) 噢我说错了,可以 渐变=(v01,f=t=> eK=v0+ease(t)*(v1-v0) ,timeout f(t+=0.1) ) f(0) 这样的,就靠t参数变 v1=0 的情况内联下代码。 jq.swing 曲线类似 y=sinx/2+.5,因为正常y是…
javaee日志库的那个代码执行漏洞真是太哈人了,原来还能 Log.i("emm:{}","{java.os}") 这么用🤣 可是给营销号整了波流量

#py f''-string (没有在语法上支持的字串内插):学我没学到精髓😎
#js shcat ${"a.txt"} 时我能知道{}里是参数
#kt 虽然内插没es6灵活, infix fun 也能做dsl
duangsuse: #kotlin #typescript #plt
应该是kt的计划
我倒希望安卓写完web也能用(
go好像是tcp层的应用比较多,jvm都在http乃至data-json层

kotlinnative的gc模块体积应该降低了吧
总感觉不够取代C,尽管能充当FFI

反正 语言就是工具 好用就用 不好用就不用

kt敌手:groovy+jb家ide (不是

Go的协程讲真不如Kotlin设计的好

duangsuse:
和lua比呢
嗯对lua是多虚拟机协程,kt是编译期suspend fun

冰封说kt协程是基于cps(调用尾步骤编程)的,陈光剑的书也说ktcoro有 Continuation 的概念,可是我只懂typescript function* 的状态机化

说不定这俩就是一回事 俩名字,我只认 函数协程=闭包+指令位置保留

iseki
go天天吹协程,结果就拉成这个样子
坐等Kotlin解决下调用栈的问题(但估计解决不了)

duangsuse:
是啊有啥了不起的,lua openresty 不厉害吗

Science Yuan:
Cps是延续体传递,不是调用suspend时自动产生一个回调函数
然后调用栈就没了(渐渐远离调试

duangsuse:
当然不是,可也没更好的方式理解
毕竟不能说 1+2+yield 是函数

可es6里func*是不包含调用栈,只有闭包变量状态的;通过__awaiter 执行每个Generator对象

所以我觉得func*都可写成Iterator对象形式

iseki |
kotlin是通过ContinuationImpl执行的吧我记得
里面也是把层拆了,一层一层迭代来着,所以调用栈完全裂开
duangsuse::Echo
虚假的公务员:某公司不承认合同,调解无效,引导xx依法维权(指摊手送客) 真正的公务员:大致事件应该是这样的:公司要小刘他们家拆迁,刚开始他们家不愿意,然后公司就说先给你18万安置费,你们自行拆除,拆完后再签协议,承诺赔四套房子,如果违约,赔偿160万。 然后他们家拿了18万就把房子拆了,拆完公司却没有履行协议,未赔付四套房子(160万),然后他们没地方住了就去售楼处,影响到了公司的生意,公司就找人把小刘的父亲打了,小刘的父亲原本就有残疾,被打之后失去了经济来源,但是公司在这时候宣布破产重组,成了老赖,…
我觉得这件事说明中国人并不是不知道某组管理的习惯,只是不想关心而已🌚 但是因为暴力强迫拆迁这样的严重事件 还是有不少人站出来,包括一些不太自媒体的写手

可惜呢,墙是系统性的,现在许多社媒都封杀了
如果只是批评其实意义不大,我觉得就事论事吧 这个..
总之我不知道这是否能算一个风向标,

今天一个威逼签订、老赖拒不履行的合同,能搞得两老一小家破人亡,而法律睁一只眼闭一只眼,甚至有人说“法律上没法给他 公道” “已经很照顾了”,就不担心未来稍微穷苦小众一点的人被某些人“含泪抄家”?

在中国涉及地皮的东西背负半辈子已经够了,如果合法权益也是“君子协议”,信访和稀泥乃至倒打一耙,真的不知道未来如何?又想到之前的蛋壳公寓,老赖真的就能为所欲为吗🌚 法院和公诉呢
《中国速度》
#java #kotlin 元编程
duangsuse::Echo pinned «我觉得这件事说明中国人并不是不知道某组管理的习惯,只是不想关心而已🌚 但是因为暴力强迫拆迁这样的严重事件 还是有不少人站出来,包括一些不太自媒体的写手 可惜呢,墙是系统性的,现在许多社媒都封杀了 如果只是批评其实意义不大,我觉得就事论事吧 这个.. 总之我不知道这是否能算一个风向标, 今天一个威逼签订、老赖拒不履行的合同,能搞得两老一小家破人亡,而法律睁一只眼闭一只眼,甚至有人说“法律上没法给他 公道” “已经很照顾了”,就不担心未来稍微穷苦小众一点的人被某些人“含泪抄家”? 在中国涉及地皮的东西…»
当“人永远也无法相互理解”第一次被提出时,就已经是真命题了 #statement 😒
月亮乃至星空、宇宙对只能看见井壁的人来说就是幕布的小挂件🌕,但对另一些人是努力奔赴的全部

「燕雀🐓安知鸿鹄🦅之志」是傲慢吗?其实不是。燕雀望得一生平稳安逸👌,鸿鹄望得历遍大江南北,只是付出目的不同,付出及方式不一定有高下之分😾——真正的傲慢是拒绝交流🤐、故意造不平衡🥴,而因为这种区别就随口评价归类、猜忌敌视😡,是对同道、以及领域最大的傲慢🙃。 领域可以是你的饭碗,但绝没有狭窄到能拿在手里肆意嘲弄👾
duangsuse:
这个是必须的,很多人没有意识到 best optimizations should be sound

所以就弄得大家一些写法不知道该不该用,等不等价

这是好事,掌握自己的代码比相信stdlib的好,标准库有时也烂, jdk DataInputStream 烂到家了

drop和take: #fp
for(x in xs)if(!p(x))break ;yield x
for(x in xs)if(p(x))yield x; else break

firsts ,意思是 dropWhile{it>1}.first()<=1 ,且如果 0,2,3 那2,3保留;首项是0
是这个意思
>我以为和removeIf是一样的效果

duangsuse:
因为没有 <1 来阻止消耗,所以结果是空行;如果末尾有0 就是[0]
这个函数不是很有用,模拟控制流的

std collections 的函数不都是一样有用,映滤排组归(map filter sort zip reduce)比较有用,这些只在惰性Sequence比较有用
比如 kbd.takeWhile{it.key!='q'} 这样,有人叫它Observer或ChainableEvent...

kt的 associate (List.toMap) 就很不直观,all/any/none 在写时我也常只试 exists, has 这种😂

噗,居然javaee配函数式fold..
为什么我一直听说『泛化类型』,但很多人都是用范型,模范类型?😒
之前我也常constructor=架构器...
想起来好像没毛病,因为没class就没oop『架构』😂

不需要 a取若(不空)归纳(x),it.then(it1)。 空则x
的, empty().fold(x)=x

此外用 reduce{a,b->} 就是不用初值的,相当于hsk的 (fold f v xs) (fold1 f xs)

你可以 val f:(Array<>) =::listOf 这样试吧,反正推不出就指定

可是接受所有Func的函数又能做什么.. 不就是反射
类型系统、<T>参数 的意义是限制,这样我们就能知道某变量能干什么
兼容无限大、意义无限小,所有人都爱听的话很相同 意义不大

此外是一致性传播,比如<T> T.let{T->T} as T 里T是一致的,此外 (x as A).let(f) as B 里
f是 Func1<?super A,?extends B> 即in A-out B这样,A=Int则f入高至Any, B=Int则f出低至Nothing,比如 (Any)->R 也是种 (Int)->R ,比如 TODO():Nothing 可以在如何地方出现, listOf(break,return) ... 噗😵

duangsuse:
泛型型变性 variance 的问题我也讲了几遍了,感觉越来越精简😊

其实let/also 也是我刚刚说兼容很大的情况,所以大家都把它当语法了;但它的意义是无关应用目标的,只是语序变更

kt里基本不需要考虑, class A<T>里若T只在结果位置,没有setter 就是outT

不写框架的、只写fun 的情况这些没区别,就是 Array<out String> 你应该见过,也就这样作用
#android adb 权限🤔
#plt 回复 @幻の上帝 :原来你认识冰封和LH_Mouse[doge] 显然是做编译器喽, 我也做(kamet-dse),但只会前端。或许你应该试试讲科普,对概念理解得就会更具体。科普的语言简洁、顺序分明最重要,或许能遇到新东西[doge] 我这不就是遇到了吗​

我对var的理解是 int i=1 这样显而易见的不必多打字,语言规范更多是种导向而非阻碍,如果类型足够含糊(如val x=a[i])大家是会标明的,规范不该太绝对;而且J11好像引入局部量推导了
抽象不该有什么目的,它是为实现目-易读易配置/扩展/移植的用的。
理解和关联代码的成本重点不在类型,而是表达方式。 自然语言的问题就是不精确,但未必只是类型不够强导致的,还有语序、多态、作用域的不严谨;kt这些语言弱化类型不也没造成你说的那种易错吗;对人类而言命名就是一切,如果符号能阐明目的,类型就可简略;如果人连程序目标都不知道,类型没有意义,因为它就是用来限制算式目的的

如果你看我最新一期视频,你会发现我对几何绘制都是用「物理命名法」,在js里使用这种单字母 类型优先的起名 不需要思索,它和隐式类型不冲突

intel没有movq/l/bi这些的确更照应;语法对可读性至少起到上限-VB或APL 对工具app开发、普通人有多可读?
Lua的1始数组我觉得就不太利于% ,<N这类计算,但其实现在很少人写i+1这些了,都是forEach,map 这样;但从易错不易辨来说,我觉得理解准确就不会有大量低级错误,所以可读性至上
Forwarded from dnaugsuz
vscode混乱得很特殊,它的开发团队一边用node和css/dom 、用ipc执行插件,一边不相信 dom ,它的文档结构和事件体系不仅冗得很,而且大量无用代码/重造轮子

最典型的是滚动明明有 scrollTop,最多监听一下懒加载吧,它利用css top: 手算..
代码高亮和minimap明明可以利用background-clip一块生成, 它非得折腾流行的bind 什么dom diff,感觉就像群不懂前端的人把winform移植到网页一样

一边视图树/组件一边ipc/parse一边函数式 ChainableEvent(全标的内存泄露不让用...),还搞一大堆Disposable 「设计模式」,最后还不是 selection, text insert,undo 这些概念流程,命名、词重率长破天

如果你检查它的源码,会发现基本DOM提供的它都包了一层,连键鼠事件都以全无元编程的方法弄出Standard ,远比keybind(还不是 code|= Ctrl,Alt,S 查表..)所需的多,我甚至搞不清某个函数是从DOM还是它自己靠reqAnimFrame的 event队列(控件还支持冒泡和捕获序..)调度的😵
当你按下 Ctrl V (paste命令),差不多要传递4个文件,比如textarea,CommandDelegate才能到 codeEditor控件(Monaco)

还是Atom 好,至少它不一会选 ClientRect一会用 canvas measureText😂 、一边学ace/codemirror 用增量行绑定一边手算 top:233px

最近又加了啥工作区信任..IDEA都没
当然我还是会用的,只是说VSCode 真是一些人拽烂俗技巧的大熔炉🤪
只要不是公开api,肯定命名死长、无关概念 不同写法 贼多
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/include/getdex.h#L542 噢..原来在这里啊,decode 到art细节,然后
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/getdex.cpp#L22 这里拿到代码,填成员结构/CodeItem
是有ExtJNIEnv的自定Thread 缓存,用互斥锁创建size不冲突的dex
access,flock 都不常用啊,看来C程序员真得会看man ioctl.h 🧐 #statement 不要背书
ndk_dlsym 是用来兼容高版安卓的
cydia不知道用没用

https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/GetDex.kt#L63
clsLoader-path-dex元素-fix(内项)
只dump自己类加载器的项 https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainHook.kt#L40
会用 Xposed hook 应用 api-framework 上下文创建的 attachBaseContext ,在JNI调用 ART api 转写出dex

https://github.com/Mivik/GetDex/blob/master/app/src/main/kotlin/com/mivik/getdex/MainActivity.kt#L142
果不其然C段弄安卓都会自己写框架..拒绝xml

只是不知道dex是怎么nopped 的,我只听说叫壳(解密加载),难道新虚拟机里类结构必须预定义了?

#reveng 然后是这个 https://github.com/Mivik/Reedle Riru so注入
https://github.com/Mivik/Riru-Il2CppDumper 支持.net基址和Method dump的原版。 Prefer维护的 UnityStudio 也挺好用的
duangsuse::Echo
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/include/getdex.h#L542 噢..原来在这里啊,decode 到art细节,然后 https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/getdex.cpp#L22 这里拿到代码,填成员结构/CodeItem 是有ExtJNIEnv的自定Thread 缓存,用互斥锁创建size不冲突的dex access…
我是在找有梯度下降算法的项目.. 顺带多看几个
https://github.com/Mivik/tako/blob/main/src/main/kotlin/com.mivik/tako/phigros.kt jvm音游吗,完工了还是没有呢。。🤔感觉没渲染部分 只有chart

比我还少文档(我是尽量精炼),也是没办法了。大家的许多代码都不是用,更无法给人看的🙏
不可说,也不能说。

然后 mivik 现在也在弄一个缩小版的 kamet ,也支持concept(trait) ,语法上应该是扩充 val mut struct fun 那些基础了,但是cpp代码结构很精炼 #ce
https://github.com/Mivik/rin/blob/main/main/parser.cpp#L363

技术选择应该和ktkamet差不多,递归下降、peektake分词,尽量少用std::
https://github.com/Mivik/rin/blob/main/main/ast.cpp#L146 仍然是虚方法遍历cg

https://github.com/Mivik/rin/blob/main/main/function.cpp#L23
类C类型,支持函数主语和类型参数

https://github.com/Mivik/rin/blob/main/cli/main.cpp#L161 它还附了一个cli(无repl),没有llvm外的库

《我在怀疑华为方舟未来正不正经》
《一个没有假想客户的框架会在何时弄出仓颉呢》
《如果没有深刻认识自己的目标,靠照猫画虎只能当万年老二吧-胜于第一会是怎样,猜不到》
duangsuse::Echo
https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/include/getdex.h#L542 噢..原来在这里啊,decode 到art细节,然后 https://github.com/Mivik/GetDex/blob/master/app/src/main/cpp/getdex.cpp#L22 这里拿到代码,填成员结构/CodeItem 是有ExtJNIEnv的自定Thread 缓存,用互斥锁创建size不冲突的dex access…
感觉缺的太多了,大佬们真的是啥啥都会做,除了OI 基本CS的每个领域,从编译图形到网络,框架,调试工具,ML 全都会啊🤪 那么如果一个人比你小却比你牛,你就永远赶不上他了

所以为什么我们不在乎一些无关实事 的东西,因为非常清楚牛人真的太多了;科班套话外的牛人和技术侧面也太多了,大家都有自己的涉猎,真的没啥好比的,要比起来 这些 好像也不能加工资啊
那么为啥xx大厂就更牛呢。 #code
tg侧边栏的落雪特效: 每.5s/100 移动 P=随机点 随机(雪花,白球) .5s P+随机xy
前几天做的粒子动画实验,隔2状态随机1次 就很合适,可惜点赞不够 我懒得做 [xy,+-雪/白球 透明];而且雪花咋画呢.. 但tg客户端代码质量真不行,我估计它为这写了一个文件,但其实客户端交互动画挺多的。

#windows #api #hack https://t.me/yscschan/6968
Win32 窗口置顶zIndex问题.任务栏开始菜单 都是窗口
Win8+的Band层z序最大如果想在任务栏上显示UIAccess或注入CreateWInBand /SetWBand (shell32常规是注入?..
ysc发现有key EnableAMAccess (w32kfull.sys活动管理) 后可以使用后者自由提升窗口,key限取一次,SetShellWindow 登录时 pcshell.dll 管理,只能重启explorer.exe hook NtUserAcquirel 获取key ;好奇怪的私有API

窗口置底问题.Win8+ 桌面图标可独立窗口,只要 SendMessage 0x52C 给某窗口,它变成最底;再将 shelldll_DefView 图标下方 WorkerW 隐藏,ffplay --noborder xy=00wh=屏幕宽高 这样的播放器就是动态桌面
ShowWin(,SW_) SetParent(w,w0)
EnumWindows(f(w,argv)) FindWindow(k,fl=0) -Ex(in_w?,next?,k,fl)
SendMessageTimeout(w,k, 3x, dt, fl)

#py 计划
100粉的头图黏合Py PIL生成。为啥不是canvas或OCV或Java? Pillow Image.open/new/resize 和 getpix, Draw(im) 的API想必是熟悉了,这次我们要用100张图片 拼出小宽高的灰度图,流程是:mask.png w h *.png
若mask不存在,求得(x,y,cp) 网格排布 绘制。输出 mask 再编辑
否则,对 a=mask (x,y,resize(1,1)lum亮度) 和 b=cycle(im list) 共同 sort, imOut.paste(bim,axy) 后高亮图肯定在高亮mask点
#statement #dev #tech #oop 🌝
我已经物理命名法化了…明明之前说要慎用的,笑死

它是以单字符用途不假思索起名变量的方法,如 ab kv 意味配对,xywh 是矩点宽高,ijnm 是2D数组纵横i<n,c配置 e元素 f函数|文件 g图形Ctx
x 也是单项、xs xz 列表和休眠列表next(),ww 意为“w内的w”,w0 意味外层的w或之前的w,1~inf 只是编号,以此类推
o对象 p命题|点|指针 q真假 r结果|弧度 s字串|流 t时点 d翻译表|正负距离|细度 l长度 u链接|blob z休眠中

用途无关平台-View或Widget就该命名为eXX,配置状态只叫c, unord_map就是d或kVs的长名, 无所谓其实现细节,
如果它不兼容标准操作 就用语言让它兼容!如果它有多余功能,无视就好——因为标准操作就那几个
k是广义的键-有v配对就算-i18n resID 都算;如果量有限制(计算量的)意义,可以像i<N这样大写
dt时差 dur时长,cp bg/fg 是单双颜色,ev ex 事件异常,fp路径 im图片 ,
反正能少写就少——但是语义优先,所以它和 ijkplayer 的OI风格命名、匈牙利/魔术风格命名 简繁两个极端是本质不同的

程序是由「统一」和「领域」两部分API组成的,领域名词只有互相联系才有意义,而统一名词没有意义-只有动词能赋予它们意义;越广泛的概念,命名就越该简略-除了是这还能怎样呢? 我们用它的名词是有目的,还是只增加了理解难度呢?
getUnreadBlogs() 就应该写成 blogs.filter{it.unread} 的样子
名字是依附上下文而有意义的,因冗长或太杂脱离了表达目的,程序不过是看起来不可或缺的一堆废纸。再详细的重复名字,在不想看代码的人前都是对牛弹琴-为啥要在代码片段里管中窥豹呢,我一开始就知道要干什么,就自然知道什么变量是必须的,这种篇幅分配 不香吗?
因此我只适当地用介词,重点在前、易改点在后给函数起名,我从不给变量起名——它不值得专有名字;如果写软件,我会先确定有多少「领域」名词,之后代码便不会多加3字以上的变量;把舞台留给函数签名和//注释,这才是最好的文档。
#statement 《如何成为优秀的编程者》
试想你「最开始」接触编程时是为了软件设计?是为了mod闭源的程序? 编程都有目的,但忽视代码的结构 就会失去发展的可能。
代码怎样对大家都是一样的,但当你慢慢入行,必须通过更多的工具与语言,重新认识「编程」二字

入门时,要么是照着示例分析作用、拆拼,要么是强记空泛的体系理论和单项;其实这些不完全适合「编程」
理论需和实例配合着用,实例若缺乏更大视角与归类,也很难将功能点建立联系

「编程」是从脱离编程语言开始的,精炼自己的语言来取代C,Java 函数的语义,尝试让不同API实现相同功能——这就是「不用代码」的编程
计算机能做的千千万,排版/自动化、绘制统计、分析转化、机器人嵌入式,它们最统一的就是『程序语言』的定义结构和流程结构,只会按既定流程做「通信 鉴权 排版交互」,用几个社区库,太少了
实质性、独特的东西太少了;许多平台10行就能描述完,许多工作一个sh脚本+配置文件就可完成,它的难度只在于理解含糊冗杂的文档、堆砌定义、不直观的调试
我们需要理解语言的用法、摆脱既有代码的束缚,这就需要对程序动名词定义的结构有好的「语感」、对软件有涉及的领域概念有「代码外的理解」,除了这么写 你还有很多方法能表达——即元编程,这样你习得的才叫『编程语言』——通过思想而非文本编、有概念而非执行效果的程,最后映射到OOP,FP 的定义体或状态注册,API操作上

语感或「代码外的理解」,都不是示例或理论、一两张图能教给你的,儿童编程IDE也不行,需要自己动手、脑中模拟执行,这需要时间和精选的示例

作为优秀的程序员,每行代码为何存在 你都很清楚,而且会以val和fun 避免啰嗦的重复代码、重复行出现,对一个有语感的人而言就会讨厌重复;我想,没有真正的「脚本语言」或「编程范式」——汇编没有离去 但无结构编程消失了;只有把代码写得像面条流水帐一样的人。语言不应分领域,但分文化,更分人。请用有序柔和的语言对待编程,任何人都能成为「代码设计师」和「软件工艺师」,而不是只可孤芳自赏的「魔法师」

那么优秀和称职又有何区别呢?这就需要我们自己寻找了,在社会上,并不是所有事都能用科学、或技术解释,我只能告诉你我理解的编程是怎么样。表达自己,也是语言最重要的目的啊