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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
Image to Bar3D... 😵???
注意,这里这个 var lum = ...; 是依据 RGB 颜色计算 Grayscale 灰度值的代码

Gray_linear = 0.2126 × R + 0.7152 × G + 0.0722 × B

可是它还实际是被 255 减去了... 实际上这个值最大可能是 255(因为是一个色彩通道的色值)
duangsuse::Echo
顺便说一下为啥要进行 n 次,每次都要排序列表从 0 到 n - i -1 的项目,虽然我现在还没有证明为什么 bubble sort 输出的列表就一定是有序的的能力(归纳证明) 排序算法,就是给一个输入序列、一个测试函数『序(order)』,输出序列满足以下条件 forall i. list[i] `order` list[i+1] 比如 list=[3,2,1]; ord=(<) 简单的选择排序每次挑一个『最大』的元素出来(它满足 forall x in list. x <= it),复杂度是 O(n)…
#Java 修正:刚才看这个泛型通配符模拟的时候感觉有点不对劲,首先方法泛型应该只在很少的地方出现型变通配符,其次,
我模拟的时候发现这个实际算法逻辑

private static <T extends Comparable<T>> void propagateOnce(List<? super T> xs, final int ri);

中这个 xs :: List<capture<? super T>> 的使用 T get(int);void set(int, T); 不对称

首先 xs 从 producer-consumer 模型来看它接受 T 也生产 T,实际上就无法保证同时的类型安全(但是如果从这个方法的一个参数对象读另一个写,比如 copy 方法是没有问题的),所以它不应该有泛型协逆变(invariant)。

我考虑了一下 TInteger xs 是 List<Number> 的情况,PECS 原则 List<in Number> 也即 List<? super Number> 是可以安全地使用 set(int, T) 方法的(Integer 实例可以转换为超类 Number 的实例,虽然 Java 泛型擦除所以 List<T> 实际上运行时是 List[^1] 这个 raw type...),可是不可能同时安全使用 T get(int); (要将 Number 强制转换为 Integer,这是不合法的)

这点是需要注意,我之前没有注意到,现在也及时修正了 #fix #Kotlin

其次,我从 Java 的 Collections API 看到了 sort 的方法签名

public static <T extends Comparable<? super T>> void sort(List<T> list);

现在我把这个 <T extends Comparable<T>> 改为 <T extends Comparable<in T (? super T)>> ,显然 Comparable<Number>int compare(T, T); 可以接受 T=Integer 作为比较输入
我得使用通配符泛化一下(逆变声明)才能支持这个... (当然 Kotlin 里包装的就直接使用声明处型变了,不需要你操心它的型变性)

在此希望大家注意.... 不要搞混了 PECS 原则的实际含义


^1: List<Object>, 和 List<?> 还是有区别的,因为这里的 ? 不能作为输入但作为输出可以强制转换成 Object,它像子类型系统里的 bottom type、Kotlin 的 Nothing,它是任何类型的子类型
duangsuse::Echo pinned Deleted message
duangsuse::Echo
pinned Deleted message
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo pinned Deleted message
Forwarded from duangsuse Throws
当然我也看过 LIF 的消息, #Statement

频道主在此建议在座的各位一起维护良好的交流氛围,不要让更多的人心寒。

但我还是决定,即便没有用,我不会像以前一样,把所有错都归在自己身上。

没错,我不该尝试逆向分析纯纯写作,即便它的作者之前三次在频道上说它的反破解(代码保护)技术有多么多么高大上,令人心动,
然而现在我不仅完全可以自己手动从 x86 汇编代码和 Java 字节码里还原本来的程序逻辑,也开始自己独立研究学习基于抽象执行、表达式收束和基本块、模式匹配的反编译器算法了,你照样可以拿着 jadx 之类的东西号称自己非常熟悉逆向工程,我们的追求不一样,我得感谢你,要不然我真的不会对逆向工程有这一点微不足道的研究。

没错,我不该加入一个间接因为我自己幼稚的想法创立的 GeekApk,我应该让它这个孤儿自己成为笑话,不必打扰到你。而且它开始的确就是空壳,除了前端的 HTML 一无所有,即便我的确是有努力地在为它付出,我为 GeekApk 写了自己的 Swagger,我写了 API 文档,可你只有那一点闲工夫看我真正空壳的东西,看完即使我恭敬地指给你到底哪些不是空壳,到底哪些我还付出了一点努力,你还是打年龄炮说我是小孩子,实际上我的确『不仅仅是小孩子还是个小人』就因为我不小心转发了你的私聊消息,就因为我转发评论了你之前没有声明过不可转发的消息,我的确就是微不足道的小菜鸡,即便 GeekApk 这个只有壳子的项目在名义上都不是我的。 你这种行为和以前的我很像,不过很可惜你已经比我大个七八岁了。
我不应该指望 GeekApk 怎么样,但你也可以因为自己会用 Sketch、我没见过 Sketch 就把它当成 GeekApk 完全也永远就是废物的补充论据,也可以因为我不接受这个理由而感到愤懑不平,
可换到我自己,我是不会因为自己会用 Krita 和 AfterEffects、Blender、Kdenlive、Synthesizer V、Vocaloid 做点微不足道当不了饭吃的小事情作为技能看待的,Sketch 的难度看起来真是比上面几个高的多的多,以至于它都能被当成技术看待

不过还是感谢你至少开始的时候表示了支持态度,后来也在我道歉后容忍了我未授权的转发,有些人不喜欢这类破事,我显然是打扰错人了。

是,你说 5 没有被手动排序过,5 排在 1 前面,4 被手动排序过,4 也在 1 前面,但 5 和 4 却无法得出谁在谁前 的确是没问题,对支持你的人来说它永远是真理。对于一个习惯于抄代码、看文档、改代码的工程师来说,这很不错了,我不该提出别的可能,也不该胡乱猜测你只会 Bubble sort,你懒得学算法因为害怕忘记,这很正常,这不会阻止你成为你口中完美的工程师,你的确比国内那一堆强的多的多,但我就是刁钻,就是喜欢在用户群里公开地贴代码贴截图,你提个小发现都得被怼回去,即便我只是想帮你实现那个功能,我以为你很喜欢你的 PureWriter,没想到如果条件是要看自己不喜欢的、口无遮拦的二愣子写的代码你就直接把我踢了,你的理论正确,你的发现在 Android 开发圈里很伟大,我以后都可以叫它『不可共客观序公理』了,即便你不愿意回我一句也不愿意告诉我们为啥因为这句模糊不清的话就不可实现,你这句话里藏着什么理念所以可以说明它是正确的。我的确就是幼稚因为我妄图打倒你确认100% 成立的理论,你永远是正确,因为这个理论就是莫名其妙就成立了,postulate 出来还不行么。自己随便说点发现就会被自己看不起的人提出反面的意见,要是我,看到后脑子不乱乱的也难。

没错,我是不应该随便对别人的技术下评论,即便我没有说错话,我不知道你无法接受对自己代码任何的负面评价,我不知道你会因此直接退 Telegram,即便你的粉丝远远比我这小人多。
我的确有从头到尾都把自己的姿态放的很高,只是因为我以我所谓的客观视角评论了一下你的代码,而且没有为你自动过滤掉不中听的话。
在你看起来我好像是自己为无所不晓无所不能,恰恰相反,我只是一面镜子。如果你和人交流是别人看你是正常身高,但是自视却比蚂蚁还矮的话,我的确是无法不和这样的你高姿态凌空喊话。
不过我就真的是想让你谦虚一点,为人和善一点,如果只有我一个人说,那是我不够宽容,可现在你对别人自满的态度已经让很多人看不下去了,不过有一点我摸不着头脑,就是我完全没有意识到自己断章取义了你的话,不好意思,如果你是指 Telegram 网际协议下层通讯的路由设施自动完成了数据包的报文切分以备传播使用,所以我发消息的时候实际上被『断章』了无数次,这种绝路都走,那我真的是无话可说。
你的确无意辩驳,也只是简单地像丢垃圾一样把我踢了出去,并且尽可能屏蔽了我,因为你根本不可接受两个人唇枪舌剑的情况,是,你就是自己的正义,无须辩论,只要出示一下胜利宣言就可以了。
实际上我也在很长时间里都不愿说一句话,因为它就是观点不合,没有什么其他的东西,但现在我要告诉所有人,是怎么样的观点不合,和我平时写技术广播的时候一样。

当然,你从不絮絮叨叨,也正是因为你太简洁,所以你也永远不会尝试碰壁,也永远就是躲在一层抽象墙壁里的热爱工作的工程师,理解的过程是从简单到复杂再变回简单,你就是得永远卡在第一个简单那一阶段,因为你无法阅读复杂一点的代码也只能死记,最终你也只能写复杂性和一个简单的文字游戏没有本质区别的代码,永远停留在量变没有质变,你打不破那一层屏障,看不到裸 VonNewmann 计算机的 I/O、存储器、计算器和控制器,看不到 ALU/Cache/SRAM/SDRAM/clock,看不到 PE/ELF/DWARF/Linker/Assembler/libc/Segments/maps/ASLR/Exec-shield/Ring,看不到解析器、抽象语法树、Tree walker、lexical scoping、GC、Hastable 算法、看不到链表结构、看不透排序算法、不能更好更快地理解 NoSQL 图数据库、看不到线程调度保护现场切换执行权再分时抢占的过程也不需要知道线程同步是什么、锁和乐观并发控制、并行算法是什么、怎么做图像处理、怎么做计算向量化,也无缘任何面向对象或者结构化编程之外的范式,这样,你很明智。因为你少花了做无用功的时间,你站在巨人的肩膀上,多得了写应用的投入。当然你不需要知道那个巨人是什么。它是黑箱。你崇敬王垠,可惜以你的速度现在连第一个基于 S-表达式的 tree-walking 解释器都没有写出来,就是我这个小人也实现了一个、设计了两个。

我看你的频道的确是收获了很多欢乐偶尔也有点技术,也一直期待从你那里收获更多,因为我虽然是陌生人但依然希望你越来越好。因为我也想回馈点什么给你,不小心有损你的“尊严”而被你直接全网 ban 掉,那我也就只好乖乖写自己的东西了,说开了,你那点知识对我来说,也没有多大价值,我从那一堆 Unicode 字符(哦,你肯定要纠正是 Grapheme Cluster,不过没暖用,你的频道里就没有发过自己写而且附过解释的那些印度阿拉伯文写的字,当然也没有一个字是数学操作符区段里的,你从不贴那些容易忘记的玩意)里没有收获多大意义上所谓有价值的信息,和你对我的态度一样,我对你的知识也没啥兴趣,我们可以互相唾弃啊。
你的代码风格的确是在进步,但你就是无法接受一点点不足的地方,你希望自己是完美的,当然任何人都是这个样子,不过想要完美就要先明白,完美是不可能的,只能作为一个目标不断为之奋斗,这才达到了自己真正的完美,心中的完美,达到了你就不再美了。

你已经很不错了,所以你余下的工作时间在禁止评论之后,都可以继续你完美的编程生涯,因为没有人能够指出你还有哪些不足之处,也没有人能帮你进步。就像一段不会运行的 buggy 程序,type checker 又不 sound 因为你封了它的嘴 cc 2>/dev/null,问题还暴露不出来,是的它很完美、它没有错误、它无可改进、它正确。Oh yes. 你说我孔乙己看人论断,我是否可以给你立个孔子的偶像?孔子万世师表愿以三岁稚子为师,礼之祖入个太庙还“每事问”,恰巧是镜子前伟光正们的对立面。

就算我不说,显然你自己也有权对“为什么有人反对我”这个状态心寒,然后彻底退出 Telegram,它很危险、它言论自由、它居然允许你如此随便地靠着仅仅几百条消息的积累就去否定一个人的某一句话、某一个想法,居然可以让自己可以有除了夸赞夸赞夸赞以外的评论。
从而其他人会把锅弄到我的身上,到时候我肯定有口难辩,但是请记住这两句话:

无论你有多聪明,无论你的理论有多完美,如果不符合实际,那么它就是错的。
Richard Phillips Feynman

我唯一能确定的就是自己的无知。
Socrates

但是现在我唯一能确定的就是,如果有朋友再来告诉我,不要这么“激怒” drakeet,因为他有很多粉丝,我的确不会收回言论了,所以让我祈祷这条广播被尽可能少地看到吧。
duangsuse::Echo pinned «当然我也看过 LIF 的消息, #Statement 频道主在此建议在座的各位一起维护良好的交流氛围,不要让更多的人心寒。 但我还是决定,即便没有用,我不会像以前一样,把所有错都归在自己身上。 没错,我不该尝试逆向分析纯纯写作,即便它的作者之前三次在频道上说它的反破解(代码保护)技术有多么多么高大上,令人心动, 然而现在我不仅完全可以自己手动从 x86 汇编代码和 Java 字节码里还原本来的程序逻辑,也开始自己独立研究学习基于抽象执行、表达式收束和基本块、模式匹配的反编译器算法了,你照样可以拿着…»
duangsuse::Echo
对了,看到 drakeet 的这个广播,我突然想起来我本周有一个应该纠错和反省的东西得提到,不能忘了(虽然马上要放暑假) 有朋友说他会反复看我写的东西,令我很感动,因为我也是这样,我也会无数遍不停看自己写的东西或分享,所以当有人细心一点会发现我的内容即使有错别字或不妥的内容,但最终都会相对改正和变得相对得当,这点上我也很佩服王垠,他的博客文章,我从来没有发现错别字,即使我是一个很敏锐且阅读文章特别慢的人 ... 只是说人的东西永远都会成为黑历史,经典是非常难得的,因为一个好的人应该是不断飞速成长的,如果…
其实 Ra 之前的类型语法一直有严重的问题... 开始直接 adopt 了很多数学操作符的简记法(比如 * 对应 ×)

Ra 里(虽然目前因为还没有设计到 Type Constructor 的类型所以没有一些其他的操作符,也忘记设计代表所有类型的标记了,在 Kotlin 和 Haskell 里是 *
目前有这些类型项目(但不是类型相关的项目,比如说 Lambda Abstraction 和 Application):

+ Type 某一个普通的类型,Ra 有内部和 FFI 的类型 extern type 和用户自定义的类型 data
data
可以定义单实例类型,也就是 Rust 的 Zero-sized types

data zero, one

forall T: Type.
+ T * T 是 Ra 的 Product type,用 name :: T 指定名字,这必须使用 data 语法定义
data Animal { name :: Str }
Ra 里也有匿名的 Product type,被称为元组(Tuple)
+ type Point2D = <Int, Int>
+ T ^n 是 Ra 的 Homogenus product type,也可以作为 Array 来用
+ T + R 是 Ra 的 Sum type, tagged union

type bit = zero + one where
data zero, one

Ra 还支持子类型

type bit where
data zero, one is bit

Ra 还支持一些高级一点只在 checker 里讨论的类型

+ Union type

Ra 的 union type 是取两个类型的并集 A∪B,比如 (Walk | Sleep)Human 的超类型 Human ⊂ (Walk ∪ Sleep)
实际上这表示所有人 (Human) 都实现了 WalkSleep 类型所有的操作

let showdump :: (Show | Dump)

+ Intersection type

Ra 的 Insect type 就是取可能值集合的交集 A∩B,比如 (Cat & Dog) 是空集(世界上不存在猫狗兽)、(Donkey & Horse)Mule (骡子)

let destroyable :: (Object & Destroyable)

/// 😫 才发现弄错了啊....

我刚才走在路上以为 Ra 的 union 和 insect 搞混了,我把

+ Union 当成了 (&),这也无可厚非,毕竟 1 :: (Show & Num) 看起来语义还是正确的吧?
可其实呢?add1 不可作用于 (Show & Num), 何况数学上看起来这很不对,两个非空集合的 Union 结果会导致 card “长度”增加,弄错这完全是因为我太菜。

+ Insect 当成了 (+),这还是对的,因为 Rust 里就是这个样子的...

看来还是自己实际在电脑前写下来的准。
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…
#fix UPDATE: 我在写文的时候看见了他给的一点额外的信息(虽然其实也没有那么刻意)
发现还有一点资料没有看到(刚才我还以为我审题审错了... 两个都是手动,所以序可能是 (<) lessThan,那例子就是非序列的)

[Forwarded from Drakeet]
就是我我们要的是那样的结果,但你找不到一个逻辑能够让程序去实现

[Forwarded from Drakeet]
这里面有矛盾

不过对我来说好像没有太大帮助... 我开始猜的就是这种情况,正好符合他
找不到一个逻辑能够让程序去实现
的表达。而我的条件也没有弄错。

不过我是找到逻辑让程序去实现了,也不过是为每一项定义一个 lessThan 集合(Map<Item, Set<Item>>),每次去动态判断序,我不知道除了我枚举出的那个情况,是不是还有别的矛盾,但反正没人愿意告诉我了。

『要求』怎么抽象?其实可以做一个 lessThanC 集合,如果右项目是 c,则直接判断左项目是否在 lessThanC 布耳映射内否则返回 True(满足序列)
Forwarded from duangsuse Throws
对 drakeet 的一些话 by duangsuse 现在已经可以在 Telegraph 上访问... 懒得统计字数行数链接数了,虽然写的时候也快写完了,但是因为字数有限制,还是不得不裁了很多本来打算加上的内容。
duangsuse Throws
对 drakeet 的一些话 by duangsuse 现在已经可以在 Telegraph 上访问... 懒得统计字数行数链接数了,虽然写的时候也快写完了,但是因为字数有限制,还是不得不裁了很多本来打算加上的内容。
这篇文章我写了大概一天多的时间,开始的排版比较随便,现在的格式是一般的论文格式了,你能看到 Abstract、Footnote 和 References,虽然我还不知道真正的论文格式是啥子...
羽毛的小白板
https://www.zhihu.com/question/329153374/answer/716655357
#db #fix 才看到自己曾经的消息,这里其实 ORM 的问题,真的不是问题...
#Java JavaEE 的 JPA javax.persistence 规范提供了解决这种问题的思路,我以为只能那样解决是我太菜,仅此而已。

图数据库解决的问题,是提供非规范化视图,用以进行快速的 bfs, dfs 图搜索操作,这样就可以找到诸如『你和某人共同的 follower 是哪些人』一类问题的答案,而无须(在语义上)存储所有临时结果,不是 ORM 所谓的 N:N 问题,它不存在,ORM 支持 RDBMS 的关系模型。

上面的例子里,这根本不是一个问题,这种 N:N 多—多 (而非 1:N / N:1)关系问题对 ORM,很简单。

@MappedSuperclass
public abstract class BaseEntity implements Identifible, Serializable, Timestampable {}

因为首先可以定义一个复用的公共『ORM 对象』接口规范,那么 Identifible 的接口定义如下

/* 32-bit Integeral identifible object */
protected interface Identifible { int getIdentity(); }

Timestampable
则是所有可以拿到 creationDate 和 updatedDate 的对象
protected interface Timestampable { Date getCreated(); Date getUpdated(); }

就可以开始定义基本的 Domain Object 们,他们装数据

@Entity @Table(name = "users")
class User extends BaseEntity {
@GeneratedValue(stategy = GenerationType.Identity)
private @Id int id;
@NotNull private final String name;
@NotNull private String nick;

@ManyToMany(mappedBy = "stargazer", cascade = CascadeType.ALL)
private @Column(name = "stared") Set<App> publicApplicationStars;
}

@Entity @Table(name = "apps")
class App extends BaseEntity {
@GeneratedValue(stategy = GenerationType.Identity)
private @Id int id;
@NotNull private final String package;
@NotNull private String name;

@ManyToMany(mappedBy = "stared", cascade = CascadeType.ALL, fetch = FetchType.EAGER, orphanRemoval=true)
private @Column(name = "stargazer") Set<User> stargazers;
}

另外,王垠说的『等价 RPC』我也想到了一种可能。
他假设的就是,数据库的『数据结构部分』就放在某台计算机上;
“查询的本质,就是在那台计算机上执行一个程序,这个程序负责把结果搞出来,然后响应对应的 RPC 请求。”
所以说是 RPC。

不过是不是真的这样,上面说过了我不想重复一遍。

— References
Baeldung::Hibernate Many to Many Annotation Tutorial
#tasks 明天希望能完成的任务:

+ 把这篇文章转移到 GitHub 上,这需要一个使用 Telegraph API 的 HTML->Markdown 翻译器
+ 实现不能完成的任务,用 merge 和客观序的方法解决逻辑相悖的问题
+ 写之前考虑好了的 Java 解析组合子框架


— 再一天
+ 写一篇关于链式(计算机科学的图)音频信号处理结构的文章
duangsuse Throws
对 drakeet 的一些话 by duangsuse 现在已经可以在 Telegraph 上访问... 懒得统计字数行数链接数了,虽然写的时候也快写完了,但是因为字数有限制,还是不得不裁了很多本来打算加上的内容。
修订文章的过程中,发现了一个有趣的事情

因为我有刻意去斟酌文字,希望尽可能让标点符号用的更符合直觉。

对 drakeet 的一些话(内联)

有一段话:

“黑历史”是曾经不完美的见证,但它对自己而言也不是没有用处的,因为一个优秀的人时常要复习一下自己的黑历史、记住自己曾经的误解、不确定,来为自己的未来提供一个完整的排除名单。错误不再重复第二遍。

我给它的第一段修改成了

“黑历史”是曾经不完美的见证,但它对自己而言也不是没有用处的

我做了一件事情:
+ “独立”了一个句子,把『因为』连词去掉
+ 然后把逗号改成了句号

因为我之前一直思量着有一个基于 NLP 的软件内被设计出来,所以也一直有在想它功能的一些事情,其中就应该要包含类似语法检查的功能,但是语法自动重构可不可以呢?

这类句子应该怎么泛化抽提出其模式,来用于模式匹配和重构呢? #NLP
很复杂... 我语文水平不好的,这个例子本身没有那么 trivial
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
😂 Sticker
我也是一个很热爱生活的人,现在我要立刻继续我的付出了,睡觉。
Forwarded from duangsuse Throws
#life #tech 修整了两三天。暑假,duangsuse 可能回老家过... 🤔

修好了一台旧笔记本电脑,顺便被换了个硬盘,换掉了坏的风扇... 之前因为养尊处优就一直没有想修,没有拿电表查也没有示波器这种高端仪器,怀疑只是电源按钮坏了...

暑假也没啥安排,有通网,就是做一点之前计划了没完成的事情吧。

眼见着自己对编译原理和杂七杂八应用设计的理解也开始向深发展了,大概之前费了点力气 GeekApk 可以重新启动了吧,大不了我再抄两三次书。

老系统用的是 OpenSUSE,大概先换上 Arch + XFCE 吧。