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
顺口说一下,我准备先花 20 分钟左右开发个在 Android 上自动启用 USB Tethering (USB 绑定网络)的应用,虽然很简单
(如果以后可能的话,可能想开发一下原生(Like C++)应用的 Hook 插件,要研究怎么做的话会在频道上更新的)
然后把 METO 的 sm.ms 图床接口代码发上来快速分享给大家
然后给 Vultr 钱钱...
然后补充一下 Gekyll 的设计,有时间时写
然后给 InScript 添加新特性,假期结束前出总文档

最后有没有大佬愿意想方设法教教我 C# 的 asyncawait 是什么原理,我虽然看了《CLR via C#》上的 async 状态机的讲解和《ES6 标准入门》的讲解还是感觉不是很清楚其用途,“以同步的方式异步”?
#task
#task

- [x] 确保 InScript 草稿的安全
- [x] 广播预先规划的知识点们
- [x] 点名器
- [ ] Gekyll
- [ ] aRsi tree-walkig 解释器
- [ ] 想办法让 Telegram Desktop Text field 导航时学会将中文全角字符正确切分...
duangsuse Throws
#China #life 首先我们说说那个乘公交车『接钱』的问题 通俗地讲就是说你搭公车,结果带的钱不是不够,正好一张大约 5 块左右的整钱无法找开,因为现在公交没有售票员了,只好自己找钱的意思 for example: 小明一人搭公交车,手上 5 元人民币,票价一张 2 元 小明将五块钱投入收款箱,我们认为现在他手上有 2.5 张票,因为票价一张 2 元,半张就是 1 元 首先来了一个现金付款的吃瓜群众,小明对其说明情况后吃瓜向小明付款 2 元购买到车票(其实不是实物,不过可以认为是) 然…
然后我们说说这周的 #task 们:

首先是 Pickle 点名器(因为我注意到了可以加新特性,然后我又多花了点时间重新设计了一下,包括添加 Lua 脚本引擎来扩展和『函数库化』这个程序以增进扩展性),不过现在老师找到新欢了(seewo 那的某个课堂优化大师挺好用的,官方逼死同人啊...),算了等寒假吧

其次是扒谱(昨日青空),这周本来的任务。

讲笔记。讲完了(好吧还有几个)。因为我刻意没有记啥笔记,成天队列溢出太烦人了。

最后还有一件事和技术无关的,我决定在 @dsuset 里说。
duangsuse::Echo
开源在 GitHub:Essay-DIP-BMP-SIMD-Operation 正在准备完成剩下的东西... 这周事情挺多的,看来又是做不完 👉 Essay-Fibonacci-Generator Essay-Cached-Factorial-Stream Essay-Java-Annotations (Runtime, Processor, Andriod) JavaPrefer (Preference DSL) Essay-Android-Lime-Tokenize (Fragments & Item…
#task 这周本来还计划继续讲 Type system 相关的话题和:

Y 组合子,会从其求值时(beta reduction)的着重点 — (\x -> f (x x)) 是做什么的、为啥它能使 f 被执行、n+1 层函数的返回值如何传到 n 层函数去、递归停止的时候是怎么停下来的

找到了一些书上可能的错误点,也会讲一些

Lambda 的 Bool 和 Natural Number Abstraction、Monoid (含宏半群)

Bluetooth Socket (Java InputStream) IO 的使用,当然是写代码的

8085 嵌入式 MCU (微控制器)上的 DJNZ & NOP 延时(sleep)

Java Swing 基本图形组件的低效 LCD 滚动实现,当然是代码

关于位运算“加速”的一些科普常识(扫盲,因为不研究原理、而且实在不是很困难的内容)和使用注意(推荐还是不要使用)

进制是什么、大小端存储(这次是修复,因为我看完《嵌入式》,当然不是真正的书名后发现我的知识比那几位博士是多么浅薄,我居然连进位计数法都不科普出来,说明我不是真正理解,而且我对大小端的描述还不够具有实用性,不好理解,可能有很大理解偏差)

POSIX 的 (异步模式) Signal 是否会嵌套问题(看《嵌入式》到 MCU/MPU 的异常系统、异常处理、优先级、屏蔽、嵌套想到的,做实验)

LLVM Cookbook 的一些评论性质内容,比方说,吐槽它的代码风格不一致、排序不适合学习者记忆

关于学习方法的一些东西
#task 嗯嗯,那么明天又要上学了啊... 看来本来打算完成基本的计划都无法完成了呢,那计划就只有继续讲一些理论向的东西和开发一个应用算了

+ #PLT Zero sized types、Empty type(bottom type) 的 Sum(+) 和 Product(*): 为什么要给他们起这种名字

+ #Qt 5 Widgets 开发一个支持插件的 "Dullboy" 应用,其目的在于利用和 KDE Applet / Systemd 的集成,定时启动强制锁死用户界面一段时间,让我这种“工作狂”(无褒义,仅仅是我对自己的戏称)不能随便糟蹋身体健康 的说。

+ 顺带讲一下关于传统序列解析器架构策略相关的内容(比如命令行参数解析器)

+ 回复在 #Bilibili 《黑子的篮球》 S1 里看到的一个 NOIP 同好,虽然我不是 #OI 方面的说... 也不是不可能,但现在不是

== 这些是明显做不完的

+ #PL C++ 弄一个 REPL 支持的计算器,有所谓的 MidTreeParser 抽象和 ReplLexer 这种支持 Hook 上输入事件的 Lexer
+ LLVM 开发 Toy 语言的编译器,当然是照 LLVM Cookbook 画瓢,不过我是不会抄里面的不良实践的(比如,明明是返回 nullptr 却写成返回 0、到处使用 global linkage 的 static 变量)

+ Android 视图应用:Lime tokenize view
尝试开发一个使用 RecyclerView, Fragments, Services 的 Android 应用

应用向的人不准喷!不准喷!与你们无关!你们熟悉的我只是暂时没有时间去熟悉,也不要拿冰封哥的 CastleGame 数据库访问 show 我,比起 SQLite RDBMS,还是等会关系代数了或者说会图数据库了才能来说话!

+ Android 版本的 AllDreamWall & SDK

SDK 想做成 Maven 管理库的形式,不过不用为 Central 填写元数据,而且也只是自己发布的说
同样不准喷,真的不能喷啊... 这有什么的呢?

+ 默写一点关于 HTML4(5) 和 CSS 相关的东西,写点布局

+ 继续写完 smms.es6 (这个使用的 requests-promise-native)
#life #school #dev #task 今天的最后,发一下任务列表

很可惜我什么都没有讲、什么也都没有做。

+ (无线电通讯,电信)FDMA, TDMA, CDMA, GPRS, EDGE, LTE... 等知识
+ Engima encoding 写一个加密程序出来
+ ML,Python 的 Pandas 和 Mathplotlib 的使用
+ Jsonist Java JSON 解析和序列化库
+ 不同风格的 Lexer control flow: 怎么写程序更好看:if/switch
+ Para Kotlin Parser Combinator(后置了)
+ DFS 1004.C 修改建议
+ RandomPicture 从头至尾彻底重写
+ BluetoothUtils 默写: 我记忆力是真的变好了... 啊
+ e2immutable 默写: NDKBuild 不好记又怎么样,照样记得住 LOCAL_SRC_FILES 什么的
+ #FP Functional DFS 重写: 比 16 年的冰封还菜... 有时差啊
+ CheerIO Spider: 重构,因为已经记住了主要的库函数方法,而且它真的比较长...
+ #PL Dynamic scoping vs. lexical scoping
+ CMake 如何编写 基于 xxx-config 的 findPackage 函数: 重写 FindLibClang.cmake
+ Hannoi 塔问题、数学和逻辑

点名批评 duangsuse 瞧不起数学和数学老师,结果自己被大脸,其实你又有几时真正理解过递归?又有几时分清了啥是递归啥是计算机科学里的递归子程序?

+ kotlin.Intrinsics 和 -assumenosideeffects, 我之前居然不知道它到底是什么?

+ 树状数组离散化(下个星期的)

数状数组,就是有 void add(path, int); int sum(path); 的数组,然后时间复杂度空间复杂度我不知道
然后离散化和逆序对这可不是简单的题目啊... 以我的辣鸡数学水平
然后我现在连 Gauss-Jordan 算法都不会,怎么入机器学习线性规划啊,怎么入计算机图形学啊,怎么入系统编程啊....

+ C++ 的 template 实现 Nullable<typename T>,注意这个是工程下乡,我不应该被喷太菜(如果只是因为我讲它的话)

+ 编写 Java 的解析组合子框架;当然也是一个解释器、语言工具框架
+ 编写 Java 的 TypeBlackmagic Annotation Processor

— 这个库给 Java (8, 因为至少得有 Type annotation) 提供了:
类上的 @sealed@inner 断言
类泛型参数和方法泛型参数上的 @reifed 内联(实际 Class<T> 提供给某个 instance field 或者 local variable)
@kind 传递内联将 raw type 作为 type constructor 传递(或许有点天真?)

是因为必须得写这种代码:

abstract class Functor<T, A, B> {
abstract Function<? super T<A>, ? extends T<B>> fmap(Function<? super A, ? extends B> morphism);
}

但这代码真的有效吗?T 明明是泛型参数,可以正常解析吗?如果是 Kotlin 的话,可以加限制,不知道 Java 可不可以有

@in 和 @out 声明处型变
@override 小写版本 Override

@readonly @property 自动生成访问器

@properType 自动实际类型 Class<T> 注入

因为我想有一个 abstract class DynamicCheckedSealed<@reified T> {
  abstract Class<T> reifiedT;
@properType abstract static Class<T> REAL_TYPE;
static { checkSealedInstance(REAL_TYPE, klass); }
}
duangsuse::Echo
Current settled on this. 关于某排序问题,我最终总结『为什么会有这个误解』的结论就是: (原问题来自 drakeet 的 Android 应用 PureWriter 文章列表实现『同时自动/手动排序』功能) drakeet 想了这个问题,然后举了一个类似 a > b > c 的(可主观自动排序列表,降序排列, ord=(>))例子 其中 b 是被用户安排的项目,且用户希望 b > c 5 没有被手动排序过,5 排在 1 前面 (5 > 1) 4 被*手动排序*过,4 也在 1…
对了,看到 drakeet 的这个广播,我突然想起来我本周有一个应该纠错和反省的东西得提到,不能忘了(虽然马上要放暑假)

有朋友说他会反复看我写的东西,令我很感动,因为我也是这样,我也会无数遍不停看自己写的东西或分享,所以当有人细心一点会发现我的内容即使有错别字或不妥的内容,但最终都会相对改正和变得相对得当,这点上我也很佩服王垠,他的博客文章,我从来没有发现错别字,即使我是一个很敏锐且阅读文章特别慢的人 ... 只是说人的东西永远都会成为黑历史,经典是非常难得的,因为一个好的人应该是不断飞速成长的,如果黑历史没有精力去一一重新审视扶正,就会变得不负责任,或自己也不能接受,所以删除是好事。

很不幸,因为本频道全 TM 是没有用的计算机科学理论性较强的内容,而且一方面我又是比较正常洋文水平也不太差的学生,所以错别字本身就少的可怜,然后内容我又经常
无数遍不停看自己写的东西或分享,所以当有人细心一点会发现我的内容即使有错别字或不妥的内容,但最终都会相对改正和变得相对得当。
所以从来没有过错别字
这一点本频道一直以来的态度都可以证实,显然 judge 别人是不好的,但是我想这么干 🥺
这点上我也很佩服王垠,他的博客文章,我从来没有发现错别字,也从来没有看透过其内容,即使我是一个很迟钝且阅读文章特别不走心的人...

人的东西永远都会成为黑历史,经典是非常难得的,所以要努力努力再努力把自己整个人都变成黑历史,从不迟钝和后退~ I won't give up, no I won't give in
Til I reach the end and then I'll start again
No I won't leave, I wanna try everything
I wanna try even though I could fail
Try Everything

(敲黑板)因为一个好的人应该是不断飞速成长的

如果黑历史没有精力去一一重新审视扶正,就会变得不负责任但又那么有意义,或自己也不能接受
但即使这样我们还是希望能回首过去,发现自己曾经的误区、鼓励别人走一遍自己走过、不可或缺的理解之路,所以保留是好事。

#OOP #fix 这个要订正的东西关于面向对象编程多态的底层实现。

这里提到的面向对象编程多态是指子类型多态 (subtyping polymorphism)

这里出问题的广播是我给 Ra 程序设计语言写的一点小示例

data Person { name :: Str }

data Student is Person
{ grade :: Nat * class :: Class }

data Teacher is Person
{ classes :: Vec of Class }

abstract fun Person.briefDesc(): Str = "a person called $self.name"

这里 Person.briefDesc 其实是一个虚(virtual)函数

我所谓的优化看这里

昨天我阅读《Lua 的设计与实现》这本书的时候,看了一下关于 GC 和面向对象实现(其实就是子类型重写 override 多态)的部分

"""
Ra 的多态也是使用类似 C++ 虚表的方法实现的,不过 Ra 支持的多态不多,也不支持多继承,但可以 mixin traits

当你定义拥有 abstract 操作符 (self fun) 的类型时,Ra 编译器自动为这个类型(必须 data,也即 Product type,因为 Sum type 可以直接进行判断没有必要使用多态)

data Person { name :: Str * _briefDesc :: <Self> -> Str }
"""

data Person { name :: Str * _briefDesc :: <Self> -> Str }
这是错误的,因为它没有明显地使用虚表优化
虽然它的确可行(我出错是因为多方原因共同作用,但是归根究底可以认为是学习还不够深入、想的太少、对所有权和优化不敏感),其实,虚表应该是被一个类所拥有的,而不是它的实例
也就是说,不存在可能的 _briefDesc 闭包成员,只可以有一个全局(和类本身一个作用域)的地方存储它们的虚表,其中包含实际实现闭包的引用

vtables[Person] = map(:briefDesc to ...)
vtables[Student] = map(:briefDesc to ...)

因为只有类可以 override 它超类的虚方法,而实例只能是类的实例,所以所谓的虚表,和一个类是 1:1 的数量所有权关系。
具体暑假再讲 #task
📝 这周末的任务(反正一定不能完成的!) #task

- 重写 Montage

- 直接重写 Doku 库,删掉所有我不用的代码
留给上帝可怜它们吧

- 三个关于函数式 #FP 的小贴士
(1) 尾递归版本的 skipBytes 可读性比较
(2) 尾递归版本的十进制位数计算
(3) Tail-call-optimization: C 里面怎么做、翻译成循环怎么做、JavaScript 的 tco 调用管理器
- 一个关于函数式 flatMap 的小贴士
(1) (eta :: a -> t a) 和 (mu :: t t a -> t a) 是什么

- Kotlin 的 Job 抽象
- CustomOrd 序(order) 类
- Kotlin 的 Drip 上下文依赖注入
- 写文交流一下思想,谈谈关于编程学习的一些小建议

#book 《平凡的世界》这本书相当不错,推荐阅读。 #China
最近人越来越懒了…… 唉,不知道该怎么办,难道在学校里手闲会影响到写代码的热情?
还是说,该设计的都没有写成 11110101,失去新鲜感了?

想太多,什么都做不了,大概总有一天会麻木的吧。最怕找不到目标了,消遣的人也越来越少了。
当然我不是说大家都在做自己的『事』(其实我没看见几个人在特别地写什么新项目的),只是莫名其妙好像都没人了一样……
不写了、放弃了、累死了,这 Annotation Processor 是多麻烦,一个 AST 想解构还不容易啊…… 如果用 Visitor pattern 会方便很多,可我需要能够检查 path 的 Tree/Visitor,不知道有没有这种 API,这次只能暂时以二分查找最小的 (it >=k) 结尾吧,写点其他的吧…… #task
duangsuse::Echo
慢慢来吧,先写 RangeMap 算…… 🤔
#task 现在我们知道衬衫的价格是十五便士,所以你选择 C 语言,并将国考的答案填涂在显示器上,鏂不 😐

这周到底是有啥好康的东西,呢,又有哪些东西,因为我的时间不够所以不得不暂时没份呢?
感兴趣的朋友可以看这里。

+ 小说《抓周》 Share/Zhuazhou 的修改(订正)和 NumPreety.js
因为作者暂时用不上这本小说了,而且 NumPreety.js 还莫名有点困难(因为作者的数学不好,我还以为现在有改进了呢……)所以暂时就不修改(我一点也不惋惜)
NumPreety.js 是什么呢……

然后我就可以 new Stream(titles).zipWith(titles.withIndex().map(it => fmt(numpreety.hanShow(it.index)) )) ((t, t_no) => t.innerText = t_no)
可是这个把 9 转化成 250 转化成 二百五十 的函数,还有点难写…… 何况我没时间,而且困难的算法对我来说太多了,所以就没多说……

+ Dokuss
Dokuss 的 Byte/Short ZExt 特性是要加上的,只剩下最后一个类,就可以框架式的读写东西了……

+ Parser.kt / Reflex
我就想早点写这个,不过现在看看(Parser.kt 目前有的一点代码其实急需重构,我之前写的时候觉得手酸果然是有原因的,一个该子类的逻辑放错位置了)
我打算拿 Java 重写,也正是因为打算(滚回去)用 Java 的缘故
本来我们 Parser.kt 可是相当优秀的,它是 Kotlin/Common 1.41…… 现在一巴掌打回 Java 8
不过不要紧,我相信为了这一点体积的问题,也不至于会难看非常

+ Montage.py / Badge.dex
montage 也是很有意思但也有点麻烦(主要是,我是第一次写)的 DIP 算法
实际上,每次我实现自己之前设计的那种东西,往往都会浪费很多时间
Badge.dex,就是那个可以用 builder pattern 的 Spannable 快捷方式了
现在想起来,我可以用 Lombok……

+ PL/0 的解析器(和编译器)
前几天看了从 USTC GitHub 分享那拿到的一些资料,和 LLVM Cookbook
我早就想实现一个编译器了
并且,为了实现它,我还特意思考了一整天那个 Lua 的跳转链表,最后终于搞懂了跳转链表是怎么一回事、嵌套内层跳外层还是怎么着,以及它的确需要 loc, succ 两个(而不是两者之一)来构造的事实……
至于那个 bp, sp, lr (一般 bp 上就存储上一个 bp 的 link……)什么的,不用担心我搞不懂这些
存储的层次差需要动态维护,我当然会啊,不就是生成几个循环减法加法……
解析器还要支持『自动处理错误』(镇定原则)…… 这个,我的 Parser.kt 没考虑太多(它只提醒错误,不可能无视错误填上几个 Token 继续,而且 PEG 解析器不存在什么 Terminator……)
if (succ == next.loc) succ = next.succ; fold right 就可以了。
我还想了个『面向对象』 poly(name, Variants, Fields); is(v, type) 宏…… (当然不能面向对象,只是 sum type 一样的而已)

#defnie poly(name, Variants, Fields) \
typedef enum (Variants) name##Type;
typedef union (Fields) Poly##name;
typedef struct { name##Type type; Poly##name unwrap; } (name);

#define is(v, type) (v.type == type)

蛮没用,不过可以充当类似 sealed class 的东西,就是可以用来装 static Token 什么的
比 LLVM Cookbook 里面什么 type id,然后什么 string idVal; int intval; 啊强多了,那还能叫 scanner 模块么。
说心里话,我真的对代码有洁癖,所以我一点点不紧凑的代码也看不下去。

+ Java JNI 体验:TrieTree
因为我个人不经常写 C++(即便我的确是会写的,也会用 CMake, Qt 什么的),所以我还是打算用 C 写
这次我不觉得有时间可以实现了。(更不要说我开始计划的 byteTrie,还 8 bin(『散列』桶) 什么的……)
不过我还是很想把之前 CoolApk 的 liba 再蓐一把,体验一次 JNI 编程。(当然我也设计了很多方便使用的宏和代码风格,很甜)(内存管理么,首先部分程序员 C++ 内存泄漏很正常,其次不是有 shared_ptr, weak_ptr refcount 么

== 下面是真正意义上的骚操作,上周后来的时间我设计的

+ RangeMap,之前想了很久了,说白了就是一个有序表二分查找的简单算法数据结构(只不过之前我不懂得简化,所以一直眼高手低,在外围什么『区间冲突策略』的地方敲打)
显然,如果我们需要一个 Map<Int, V> (我指的是,你需要映射一大堆 key 的情况)的话肯定不能用 HashMap 吧(空间复杂度……)
可是线性查找又很慢
这样就有了省空间省时间的 RangeMap,缺点是因为 Java 的 Collection framework 没有 SortedList(而必须每次更新后,我也不想定义什么 SortedList,有它自己的原因)就必须每次去重新排序,不过基于增量排序算法的话不会有什么困难
排序问题是很经典的列表处理问题,已经有很多很成熟快速优雅的解决方案,在这里我不需要怀疑 Java 平台的能力。

+ DJD (duangsuse's Java Decompiler)
我这几天拿手画出来许多基于我基于 PL/0 处理机的汇编改造,然后又设计了一个能够侦测循环(我的方法是,每个 BasicBlock 我给一个 base,这样我就有机会检查控制流是否反在向跳转)的算法
然后我就有机会,基于抽象执行,(1) 把原来逆记法的二元链、方法调用折叠回表达式 (2) 而且还能提取出基本块

有了基本块就可以在上面进行进一步的模式匹配,然后就可以还原出 if () {} while () {} 这种高级结构了

当初我因为这个算法需要随机访问指令序列所以不能用 Feeder<E> 莫名伤心了很久,不过很不幸的是,(控制流分析过程中)为了能够判断 br 系指令是否跳转到了某个基本块中间(这样就必须 trunc 那个基本块了,因为基本块都是按顺序执行的,里面的指令不能有另外的前驱和后继)
,以及保证算法的优雅性,我必须使用 RangeMap 记录一个 ip (指令指针)位置属于哪个基本块

+ DiffAlgorithm #Algorithm
这个玩意包含两个项目: (1) DiffAlgorithm 的 Java 重写
(2) Java 的『状态机』(就是 onXsInput, onYsInput, onXsEnd, ……) 版本的重写
我都想好算法了,不过现在好像是没时间做了…… (因为事情比较多,而且不管怎么说,实现算法总是费时间)

+ 比较 TypeEqualizer 和传统的 instance check (operation model)
其实这也没啥,就是 TE 比别人『多』一个 toXXX() 转换而已
TypeEqualizer 是面向数值类型进行抽象建模、instance check 是面向操作进行抽象建模

所以他们之间有个明显的区别:如果要支持新的数值类型,则 TypeEqualizer 需要修改的代码少很多
如果需要支持新的操作,instance check 的版本方便不少

+ Trace.kt 没什么,我就是想让你们看看,天才写一遍和臭皮匠断断续续想一天能轻易拉开多大的差距
#task 我来总结一下被鸽子的小项目:
LiterateKt (怎么连 class Project(File, Config) 的子项目树模型都总结不出来…… 还总是在 Markdown 语法上纠缠,用 java.util.regex.Pattern 不就可以了,项目都可 # Include,root项目可以有 # LiterateKt )
Bank Editor (稍后会有重写之前的 Qt 周期执行小应用,就是 QSettingsQTimer ,顺便包括 rectangle(0,0,p*width,height) 的自定义绘制,signal/slot 模型的基础使用嘛…… 不懂得怎么抽提出子程序)
(稍后也会想复制那个 sin wave 用到 QAudioDevice 的小程序)
(稍后还会有一个简单的 GTK# TreeView 示例 )