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
#China #book #school #life 🏫📔 最近从本校的物理老师处得赠了一本 #Algorithm 算法书《算法》 Algorithms in C++ I-IV: Fundamentals, Data Structure, Sorting, and Searching by Robert Sedgewick
https://book.douban.com/subject/1116599/

这本书甚是有价值,不仅仅在它的三观、逻辑、数学、图示、新奇、编程实现上,我就不谈它的价格相比之下实在是不高了,质量上,高德纳(Donald Knuth)的学生,算法,不是盖的。

包括这本书的作者据称都是刚开始写 C++,一个离开计算机都能编程的人,又是计算机科学研究者、算法研究者…… emmm……

我从这本书(我第一次见到用 TeX 排版得这么好看的书,前一次是看 Kanru Hua 的信号处理(signal processing)论文和期刊切片,排版带内联的,虽然我没看懂)的代码块里了解到了原来还有人和我一样不那么遵循所谓的『代码风格』……
他们说,他们努力设计出了一套简洁、可移植的 C++ 编程模板(这里不是 template<> 的意思)。
尽管我不是很喜欢数学的表达方式,我还是得承认我实在找不出一点茬子了 — 比起我从其他书里,尤其是 LLVM Cookbook — 那简直无法入眼的 C++ 代码、类 — 那哪能叫设计啊?分明就是无序杂乱的方法定义!即便能够工作,却怎么也不可能达到 Algorithms 一书示例代码的层次。

虽然我的智商不高所以能实现的东西不多,但我觉得,我的代码依然相对而言较甜,而 Algorithms 一书的代码则是带点数学薄荷的咖啡,醇香微苦,不过 — 都从不油腻、不会拖泥带水让人无从入眼。

这本书里,我学(且暂时只学到)了快速查找、合并查找(不带权重和压缩的)(因为我智商低,而且最重要的是,我有别的事还要完成……)

#include <iostream>
const size_t N = 1000;
int main() { unsigned up[N], b, c; size_t it;
while (cin >> b >> c) {
auto a = up[b]; // R(a, b): up[a] = up[b]
if (up[c] == a) continue; // c R b
for(it=0; it<N; it++)
if (up[it] == c) up[it] = a; // R(it, c)
cout << b << " " << c; } }
其中的 unsigned up[N]; 也可以被泛化为 std::map<unsigned, unsigned>

这是快速查找(也可以作为实现集合数据结构的一种算法),怎么快速法呢?
是解决『传递性问题』的一种算法,它的合并操作速度较慢(所以也叫慢合并),不过判断速度很快。
我们知道,对于一个 M 个输入,它都只需要 O(1) 的时间复杂度来判断是否联通,可在更新时每次都要执行 O(N·M) 次比较 (==) 运算。

这个问题就是给你一堆『对』,如果它是新的,输出它,否则就继续下一个(C++ iostream 扫描器)。
因为快速查找(quick search)/合并(merge search)有 up(父树)所以也称树状数组。
1 2
2 3
4 0
0 1 — 4-0-1-2-3
我们的输入上有一个性质(property):forall a b c. a R b, b R c => a R c
我们管叫逻辑断言的传递性(transitive)。
1 R 2
2 R 3 => 1 R 3
4 R 0
0 R 1 => 0 R 2, 0 R 1 R 2 R 3 且 3 R 4
(因为 R(a=1, b=2, c=3) 得证 1 R 3R(a=0, b=1, c=4) 得证 0 R 4
细心的同学可能会觉得奇怪:假如我有 b - a; d - a,他们在树上不是一个树支的,可是却被认为在一起了。
其实这很正常:传递性关系是对称(symmetric) 的,也就是说 forall a b. a R b ≡ b R a
换句话说,这实际上不是一棵树,是一个树状的集合,因为集合关系 (a `是同集` b) 也具有传递性,即 『小鸡是小鸭同集、小鸭是小鹅同集,小鸡也是小鹅同集』
至于为什么像是树,这是因为集合传递性就是树状的

问题是:这不是一个逻辑问题啊,
上面的实现被称为快速查找,你可以注意到它把离散的 a R b; b R c 传递来了,至于为什么没有 a,是因为我们的实现方式是 unsigned up[N]; 数组,如果我们用的是 strcut { unsigned *up; } 就也还是一样……
我不会算法可视化,所以没有图(不像那个,我艹还是算法可视化专业研究者,计算机图形学基础啊。

至于合并查找(我不知道两颗树的权重算法和路径压缩该怎么做)(题外话,我自己设计了一个类似 Dijkstra 的 DFS 算法当然还没实现,关于狄克斯特拉算法我也自己想了6个细节,只等着写文。)

它就是
size_t i, j;
for (i=0; up[i] != i; i = up[i]);
for (j=0; up[j] != j; j = up[j]);
if (i == j) continue; // common ancestor
else up[i] = up[j]; // merge ancestor

也就是说,找到 a R b R c R … 里的这个 a,它的 parent 绝对是它自己,它就是最大的太爷爷。
(准确的说也没啥 parent 不 parent 的,一切都是临时的,比如我们每次把 c1 的 up 都置为 a,实际上只是需要一个『最大』的集合加入。换句话说,如果 c1 是以后被另一个 up=a 的 d 关联起来的,都一样)
如果他们有同一个太爷爷(也就是说,之前 up[x] = a c1 R a 的那种)
就是 up[a] = up[b] = up[c] 的情况(有关系的,我们都应用了相等关系的传递性,和传递性伴生的对称性)

就像 Rc(refcount GC)、hashmap 一样,树状数组也是只记录部分信息的,就是传递的关系,而不实际保持「继承」关系,所以才能有优化啊(要不然你只能 xs.filter { it.first == this }.exist { it.second == x } 递归下去[因为这一个表达式应该被叫做『存直接链接』],就不好了)(当然,也可以 dfs 或者 bfs。)


至于那个 O(...) 呢,书上也有在 Fundamentals 一节讲到,定义是:
对于所有 c、N0,若有 g(N) 使得对于所有 N0 < N,g(N) < c·f(N) 成立,则说 g(N) 是 O(f(N))。
就是说数学函数的变化率啦,数学喜欢 \lim_{n\to\infty}{\frac{a}{b}} 趋近于 0 表示 b 渐进地大于 a 什么的……

O(g(n)) = {f(n):存在正常量c和n0,使得对所有n>=n0,有0
唉,没一个讲清楚的,这些数学家真的会自然语言吗?真的知道啥是定语啥是状语吗?
看不懂的话,自己用反对称套一下给自己一个主语,不然算了,毕竟数学不是给常人用的。

书上还有讲状态机、形式化文法等常见计算机科学/算法问题的,不能不说是丰富丰富再丰富。
谈到算法:数组(二分查找、选择排序、冒泡排序、合并排序)、链表、递归(尾递归)、分治算法(快速排序)、哈希表、图(无向、有向无环、广度优先搜索bfs、深度优先搜索dfs、狄克斯特拉算法)、动态编程DP、线性规划、傅里叶变换、二项式、随机化、状态机、形式化文法、二分查找树BST、跳跃链表SkipList、哈希算法、非对称密钥系统……

现在时间比较不充裕,我只能暂时先写这么多。
尽管在学校里我几乎没读这本书,我还是非常感谢赠我这本书的老师,要不然,或许我自己是找不到它的,谢谢你!
更详细的书评/笔记等我以后,会慢慢发出来、写成文集。
但愿我能够理解那些烧脑精妙的算法、但愿我能设计出我所需要所有简单的算法、但愿不论我走到多远、多高,都能够保持不卑不亢,也不会忘记曾经那个真心爱着技术的自己。
真想早点睡…… 不得不先带头谈谈学校里打算谈的事,虽然
改天我要不要回顾一下之前的历史?

我果然还是进步得太慢…… 最近也才开始看得懂《编译原理实践教程》(指USTC资料,虽然我不是很看得上)和《深入分析GCC》

一般来说, #school 里我记录的笔记(很多是比较逗逼的,比如上面的修错,虽然修久了我会发现我连逻辑推导都做不到了)都会讲一遍
没做笔记的不会讲。

首先当然是 #book 好书(文)推荐

《她是龙》小狱
|Telegraph
注:使用 online OCR 字符识别,哦不,没找到多好的工具。
https://ocr.wdku.net/#
技术还是 Google,MS 家强
排版还要花时间,暂时出不来

他不知道,这个世界没有人有名字,所有人都只有印着一大堆标签的别称。他更不知道的是,其实故事以外的人也是这样的,即便是每个人都有着属于自己的名字,可还是得在脑门上贴上无数的标签过活,他们看别人的时候离开这些纸条就会失去判断力,却埋怨别人不肯了解自己的内心。
duangsuse::Echo
自动粘滞(sticky)Regex 有点牛逼啊,我之前的都是那些一匹配啥都匹配的,也不可能用 ?! negative lookahead 断言
那我就照本宣科地念了:
+ (信息)声音:就是物体的震动,振子的振幅,就是信号。
+ (信息)图像:就是一堆『像素』的二维矩阵xy……
+ 24bpp:(色彩深度)24个二进制位per pixel
其中一般是 R(8bits), G(8bits), B(8bits); BGR 也有
最多显示 1677万 (R*G*B) 种颜色
+ 32bpp:(色彩深度)一般是带Alpha混成像素色值的颜色
+ 灰度:心理学灰度公式(线性)
Y = 0.2126R + 0.7152G + 0.0722B
显而易见地,数学不好是不能做计算机视觉甚至数字图像处理的……
+ 信息学、熵(shang1)、电子(electron)、热
密码学、加密、隐写、编码技术、千年虫、64k-intro、DEOM技术、huffman算法

最小公倍数、最大公约数(gcd, greatest common division)、fibonacci、函数变化率

我也不知道为什么有这些东西,大概是我看小说看到的,我物理和数学都不好

+ 谈谈 Base=64 是啥意思
这还准备教 Base=1000 呢
后来我觉得我佛系了,我就扔一个公式就走人。

2**(8*n) = 64**x where n, x in N+
看起来这个等式不是很好解啊
两个未知数都在指数的位置
一个解是 n=4; x=3

那Base=1000呢
2**(8*n) = 1000**x
只能用miniKanren解了呢……

https://codon.com/hello-declarative-world
https://github.com/nd/mk.java/blob/master/src/main/java/MicroKanren.java

可是我不会啊…… 这里也有两个未知数呢
def solved(n, x); 2**(8*n) == 1000**x; end
上枚举吧, n=(1, 10]; x=(1, 10]
(1..1000).to_a.combination(2).map { |nx| [solved(nx[0], nx[1])||solved(nx[1], nx[0]), nx] }.find_all { |it| it[0]}

好像还是不行呢…… 可是第一个表达式是有办法的
[[3, 4], [6, 8], [9, 12], [12, 16], [15, 20], [18, 24], [21, 28], [24, 32], [27, 36], [30, 40], [33, 44], [36, 48], [39, 52], [42, 56], [45, 60], [48, 64], [51, 68], [54, 72], [57, 76], [60, 80], [63, 84], [66, 88], [69, 92], [72, 96], [75, 100]]
hhhhhh好无脑
+ 依照CFG(Control Flow Graph) 谈 return early

虽然我好像已经谈过了(而且这次显然我不会扯到SSA的PHI……),
就是说可以要在一个函数返回前添加固定的步骤,所以不能直接 return 这样
我们这里谈的不是和 calling convention 里栈帧末的收尾代码。

说点抽象的,如果我们一直用 if (p) {…} clean(); return;
实际上不管怎么样 if (p) 里面的东西,除非return跳转都会 fallthruclean(); return; (隐式return也一样)

但是如果你
if(!p) return;
if(!p1) return;
clean(); return;
就不一样了,显然直接 return 会跳过 clean();


那该怎么办呢?C宏(辣鸡宏)你可以很dirty的搞个
#define clean(x) { clean(); x; }
void do_sth() {
if (!p) clean(return);
if (!p1) clean(return);
clean(return);
}
#undef
很甜吧,但是稍微有点常识的人都不会用
还有,内联(inline)、嵌套(nested)函数是不允许的

C++ 你可以用 object + finializer,直接RAII(Resource Aquring Is Initialization)
可是 C 里面貌似没更好的解决方法。
一般来说都是
if(!p) goto out;
out: clean(); return;

+ 语文课上居然都谈到区块链
第一时间
《区块链离我们有多远》

我只知道金仨字面意义上的书记有一大堆,所以单单一个书记想伪造敲诈公款是不可能的……
别人说什么造假成本高于造假收益,反正就是密码学啊计算机网络那一些(可信计算?)的东西?


+ 我做梦居然梦到华为EMUI的计算器应用升级
居然还能递等式,还把括号里的东西加了箭头…… 其实我本来可以学学画dot图的,还是直白一点算了
大概是我想 Calc.kt 的二元链解析算法想过分了。
1 + 2 * 3 (梦里比这个复杂得多,我记得当时还是设计质能公式的一个略繁琐的物理算式…… 居然能那样)
= 1 + 6 — 箭头指着上面的 2 [*] 3……
= 7 — 还是有箭头……

+ #book
文章|书 名作者
《她是龙》 小狱
《手机城》 最安神
《盛夏方程式》 东野圭吾
《莫言谈教养》 任万杰
《生气有啥用,还不是在原地转圈圈》 程智超

+ 谈谈知识付费

有时候看到知识付费呢,总会觉得是『知识』要『付费』,付费修饰知识。
可是总觉得,很多人心里会是这么想,实际上却是理解为『能够付费的知识』呢。

就是说,『付费』以得到知识。
『付费』比知识更重要。

付费的东西一定比不付费的强吗?其实这是很大程度依赖上下文的,无法作概论。
知识付费其实不是新概念,实际上学术界也有不少不得不向出版社掏钱的情况,但付费从不是目的,只是为了取得知识不能不拿出来的一点小代价。

如果还看重的是知识的话,就要明白呢…… 不要叫『知识付费』,叫『付费的知识』。

+ 谈谈Calc.kt现在的(基于ADT栈的)解析算法错在哪里

比如,解析词条流 a + b * c + e % c * a
(优先级自己从下面我列的结果推)
(a + (b * c)) + [(e % c) * a]
这是正经情况。
然而实际上,解析器会认为是这样:

a (+) (b*c) (+) [(e%c) * a]
(a + [(b * c) + (e%c * a)])
看到区别了吗?ADT Stack 是右结合的,即便 (+) 的左优先级更大也是一样
只是因为,a+b*c 里要先解析乘法,导致栈是这样:
a (+) (b*c)
如果过一会又出现了加法会怎么样?答案是会归到 (b*c)里:
a (+) ((b*c)+a)
如果又是加乘呢?
a (+) (b*c) (+) (a*c)
所以遇到这种连续两次 (+) 的情况,就都会变成右结合(参考Recursion的reduce方法),实际上应该是左结合的
Expected: (a + (b*c)) + (a*c)
Actual: (a + ((b*c) + (a*c)))

+ 写两个递推式子
我也不知道有啥用,但是笔记上有。

y_0 = (inputs)
y_{n+1} = let x = y_{n} in f_{n+1}(W_{n+1}·x+B_{n+1})

0! = 1
n! = (n-1)!·n
当然也可以这么写,可这好像不是递推式了?
0! = 1
(n+1)! = n!·(n+1)
好奇怪啊

+ PL/0 实践的重点『难点』
1. 实现内嵌函数的作用域嵌套(nested function, leveled stack storage……)
2. 『一个好的解析器应该接受所有输入的所有部分且不能抛出错误』这个不算难,实现『「同步」的keyword token』也不难,就是跳过认不出的token
3. source map (指令序列pc到源码)(其实原教程没有)

+ PL/0 实践教程上的扩展题
虽然我觉得很废

—基础
注释:加入C风格 // 和 /**/
数组:多维数组
函数:传值调用
控制流:加入C风格 for, return,if elif else、exit
判断:(1) 短路求值 (2) && || ! (3) 表达式非零即为真
—提高
提供函数:print(_), print(_, _), random(), random(_)
提供intrinsic:CALLSTACK()
数组多维初始化,var i, j 快速初始化
函数:传地址调用
函数:传procedure调用
do while, switch 和 break, continue 甚至 goto, label
C风格表达式:比如 &, |, <<, ? : ternary 三元表达式, 赋值表达式(愚蠢


虽然照本宣科而且语言设计的也不好,但可见编译原理还是比所谓的『精通』强太多,因为编译原理就可以直接把 if else, do while, swich, break continue goto 什么的结构直接枚举出来,精通还太浅。
#book 这些是我在学校里想起曾经看过的书……
感觉还是没有什么进步啊
果然是这样吗?

— 注,书名作者名全都是我记忆里的版本,不对正确性作出担保
《ES6标准入门》by 阮一峰
《Kotlin极简教程》by 陈光剑
《The Little Scheme — 递归与函数式的奥妙》 虽然现在表述式(过程式,命令式)、定义式(函数式,声明式)、逻辑式(描述式)都不流行hhhh?就是那个 The Little Schemer 的中文版
《嵌入式Linux系统与工程实践》
《完美应用OpenSUSE》by 何晓龙
《算法图解》 Grokking Algorithms
《算法I-IV(C++实现)》 Algorithms in C++ I-IV: Fundamentals, Data Structure, Sorting, Searching by Robert Sedgewick
《Ruby元编程 II》 Metaprogramming Ruby II
《深入剖析Ruby虚拟机》 Ruby under a Microscope by Paolo Patrick
《CLR via C# 中文版》 CLR via C# by Jeff Richester
《快速轻量级JavaEE开发》 Continuous Enterprise Development in JavaEE
《Qt5.9 C++实战》
《操作系统笔记2019》
《一本通 二级C语言》
《软件工程导论》
《有趣的二进制》
《Internet原理与技术》
《手把手教你FPGA设计——基于大道至简的设计法》
《职场新生代 嵌入式600问》
《小白都能看懂的Python大数据分析》
《LLVM Cookbook中文版》 LLVM Cookbook
《深入分析GCC》
《深入理解Java虚拟机——JVM高级特性与最佳实践》by 周志明
《PHP内核分析》
《Lua设计与实践》by codedump
#book 《Kotlin 极简教程》怎么说用处也是蛮不小的。虽然内容新颖有深度,不过如果一定要提意见,就是有些东西的描述还可以再好好斟酌一下,是否足够简明、是否存在赘述或者该泛化没泛化的情况。
#Python #book #code 了解一下新华书店销疯了的书单:
text = """
我青年时代就读过:《西游记》《马可波罗游记》、左丘明《左传》、《我的故乡》、那楚克道尔吉、《吉檀迦利》《园丁集》《飞鸟集》 《新月集》、泰戈尔、《三国演义》《水浒传》、老子、孔子、墨子、孟子、庄子、伏尔泰、孟德斯鸠、狄德罗、卢梭、圣西门、蒙田、傅立叶、拉封丹、萨特、司汤达、莫里哀、大仲马、雨果、巴尔扎克、福楼拜、乔治桑、莫泊桑、小仲马、冉阿让、罗曼罗兰、《羊脂球》 、卡西莫多、席勒、歌德、海涅、莱布尼兹、黑格尔、康德、费尔巴哈、马克思、海德格尔、马尔库塞。

我还读过:托马斯·潘、《联邦党人文集》《常识》、梭罗、惠特曼、马克吐温、杰克伦敦、海明威《老人与海》、简奥斯汀、花兹(停顿)华斯、狄更斯、《猫》、《福尔摩斯》、卡尔马克思、弗里德里希·恩格斯、拜伦、雪莱、萧伯纳、培根、克伦威尔、约翰·洛克、托马斯·莫尔、亚当斯密、李约瑟、阿诺德·汤因比、《双城记》《雾都孤儿》《简·爱》《鲁滨孙漂流记》、汤显祖《牡丹亭》《南柯记》《紫钗记》《邯郸记》、莎士比亚、《威尼斯商人》《仲夏夜之梦》《罗密欧与朱丽叶》《第十二夜》《李尔王》《奥赛罗》《麦克白斯》,谢谢大家!
"""


def sortSplit(s, sep, op): return sep.join(sorted(s.split(sep), key=op))
from re import sub
print(sub(r":(.*?)[,。]", lambda m: sortSplit(m[1], "、", lambda s: 0 if s[0]=='《' else 1), text) )
duangsuse::Echo
#sql #ts Prolog 牛逼! 正确的关系式搜索+ 同时实现 parse 和 toStr 😱 #zhihu 灵感来源 e(E) -->{E = [I,Ea,Eb]}, %重写规则, 'eX'为优先级 %利用 链|e1(E) 括住内"*/" e1(Ea), op(I,"+-"), e(Eb); e1(E). e1(E) -->{E = [I,Ea,Eb]}, e2(Ea), op(I," */"), e1(Eb); e2(E). e2(X) --> number(X); ("(",…
#book #ts The Little Typer
1. 类型签名是命题,程序的语意是用+,[],. 构造int,void.
2. 命题的条件和自身,都是值;依赖类型可以把值放到类型(int[2],. )中去,从而构造关于值的命题。
3.Prolog 缺少抽象 refl_ID(X,X). 的模式,它的条件表都是全局给定,不能构造类型
4. 类型也可以有类型, #haskell HigherKind *->*, TypeFamilies 就是指这个(虽然和 #ts 一样过度设计

从结果上看,反而像 类型签名是证明,类型构造器是调用命题……
data Equal : a -> b -> Type where
Refl : Equal x x
fiveIsFive : 5 = 5
fiveIsFive = Refl = Equal 5 5

如果我换个语序,会更合理。
data'ab' _=_
- x=x Refl() 成立
- five() 5=5 Refl

这样,类型依然是命题,程序依然用Refl证明并构造了Equal,而且删掉了查重率60%的冗余语法
Refl : 右是一段程序。用这种隐晦的方法传变量是错误的。这个语法的问题远不止「类型含糊」, 对语序的修改,只算一种局部的优化。

为什么用 (
Refl : Equal
) 呢:它的亲戚,逻辑式语言都连「调用树」都不会组织,反而觉得 add-out(1,2,3) 更好看,加个类型学了“调用”,语序却远输OOP,真可谓一盘散沙

https://ksqsf.moe/posts/2019-02-18-dt-fun.html
https://mxm.ink/dependent-type/#依赖于类型的类型:list
https://agda-zh.github.io/PLFA-zh/Induction/#第一个证明结合律

https://www.idris-lang.org/pages/example.html
-- showOrRev(isInt, x) when isInt:
$Y: x.Str ; $N: x.flipLR

因为是宏,当然就不需要类型作为值了。内联后直接推导就知道

-- printf(:Str, :[Arg Str])
直接在编译期生成loop,也不需要什么ts体操+js强转了

when--'T' Link
Nil; Add(:T, :Link)

-'T' Link`+`(y:Link) when this:
Nil: y ; Add(x0,x): Add(x0, x+y)

-- useInline
可以直接计算Link拼接或解构后的值,避免手动分期求值
#recommend #science #社达主义 #book 《自私的基因》 https://m.youtube.com/watch?v=iomJJVY3CvY&t=481s
https://m.youtube.com/watch?v=MJ8u8RsxQ0Y&t=673s #LGBT 与神经多样性

Dawkins这位进化论捍卫者,根本没搞清楚天择/人择原理与一神论、无神论、多神论信仰 中间的关系,
就像他认为「一切生理活动的单位是细胞、一切化学反应的基石是粒子,因此医学与化学家是一群骗子,因为心肝脾肺肾都只是一滩细胞 哪来的临床教材」

人类发展由基因决定、人文基于文化基因,这并不是说人不是自己命运的主人,也不能证明人和动物都是DNA的奴隶。这就像读完《我即我脑》,最大的感悟竟是“怎么撬开头盖骨啊?我要解放自由意志,把暗中控制了我二十多年的🧠拿掉”,那才是脑子进水,是战争、贫穷和阴谋的导火索。

科学和逻辑可以告诉你氰化物有毒,却不能给你不向仇人下毒的理由;真正的理性,绝非违背人性与良知就能获得“进化”的这种歪理。
勇敢、智慧、有尊严和荣耀,这些人性里的闪光点,在特定社会环境(#文革)中,同样会导致灾难。 这些甚至无关于科学或宗教
他们完全能自称科学,却又如同为宗教信仰圣战!

科学主张不以万物有灵去解释因果规律,从而让工作简洁明确,但这与文艺复兴后的宗教生活是不违背的;科学家的信仰自由是人权。 违背人权的激进科学,就是对的吗?

「基本上,世界其他地方的 AI 发展,其前题是去「帮助」人,而新中国政府发展和推动 AI 的目的,则是去「取代」人,两者的取向是不同的。此所以,有评论认为这世界有些团体理解中的技术革命,他们的「初心」,从根本开始就是反人类,也不是没道理的呢!
若「新技术」出了问题或甚么意外,总之就不让它被报导就是了,就像那位消失在垃圾压缩站内的清洁女工张女士一样。

这样达尔文化的智力和「新旧革命」,究竟是聪明,还是误了卿卿性命?
duangsuse: #kt #book 元编程
http://www.bilibili.com/video/BV1XH4y1w7mT
https://drive.bennyhuo.com/zh-CN/talks/2018.11.17-%E4%BC%98%E9%9B%85%E5%9C%B0%E4%BD%BF%E7%94%A8%E6%95%B0%E6%8D%AE%E7%B1%BB%E5%9E%8B_final.pdf

https://weread.qq.com/web/reader/f7632a00813ab82d6g017b14ke4d32d5015e4da3b7fbb1fa
可以一起读
虽然我不觉得这点值65😊

如果numpy那种API/DSL都设计不出来
修改class的结构也只是给开发者们徒增烦恼罢了

举个例子,此章节的 gh/user/_name
如果只是把它当成URL路径,需要绑定,显然造成代码重复,与元编程的本意违背

而如果像 import fire 那样,知道URL的本质是class路径与def GET,POST等,也就是另一种CLI调用
就不需要写什么注解和函数名
甚至模块化都省了,一个文件足矣

不过是修理servlet.xml繁琐和不支持argbind和的“弱类型”问题
但何必要制造那么多问题呢?sql,http,那么简单的工具还用学

#parser #learn
说起来,AST也就是多方法的 ()->Any 而已
你甚至可以把方法名enum化,从而完全避免使用class
例如 sum(L(1), L(2)) ()==3 只需要两个fun
Object Algebra.. 嘛,用虚表override取代if,稍微快点,只是要parse两次

至于在js里,我一般用 [[JSON ',' +] '()' /] 这样的模式写ast
描述 (1, 2, 3) 这种正则
甚至连函数式都没用到。 数据结构本身就蕴含了for if流控,运算符重载本身就是编程语言

不需要任何范式来实现他们,“数据结构与程序语意直观对应”,这就是CS。
这……应该是一件很难听懂的东西吗? 为什么DSL都设计得那么刻意和拉垮?

甚至,构造函数也应该取代class{} 或tuple才对,为什么把参数传递到堆而不是栈里,就需要写所谓的struct? 它们都是把args打包复用而已
为什么把yield 外提为语句,变成
let then=回调=()=>switch{} 里的编号,就需要学什么func*和async,堆和栈,难道不是天生一体的么? 分页数组、“缓冲区”,难道不应该是跨语言的?

然而支持kwarg的python 却需要Namespace来实现这种等量代换😒 反而是Haskell可以这么写
然而它是真正的笨蛋美女😅

#oop
元编程,首先就要明白obj的本质是通过enum分派逻辑的(vararg Any)->Any ,也就是一个when(x)in constMap+super..
这样才方便添加和绑定方法签名

这样在语法上也就能理解为什么是{}包裹,以及filter{}为什么优于lambda和匿名override

py可以通过vars(o)实现静转动态
typing.Namespace(kw)反向
除了小写类型不能扩充,哪怕是Ruby元编程在直观上也无法和它相比了

duangsuse:
oop和rust go就是pp的扩充
不算重新学习过过程试

编程语言只不过就一张加减乘除节点图,问题是领域和API

看这本书的“层次结构”,就想到拿identifier叫name,拿classifier叫tag,拿些辞藻和皮毛当本质,哎
无聊
好像早点拿到电脑,多写代码
#cs #asm 一个极小的2byte指令和数据RISC(int=i8)
GP寄存器: R0~RE
mov RF, setInterval
smem 0x800, 输出
lmem 0x802, 输入
地址总线u16 通过RD:RE访问

#book Computer Science: An Overview http://v8cpu.qinyue.world/instruction-set.html
https://github.com/chyyuu/v8-cpu/tree/master/examples
https://github.com/vsergeev/v8cpu/blob/master/v8cpu_isa.txt

汇编期计算:
brElse: fn ;if{}else{fn} then..
addI R0,0xFA,R0 ;+=250
jumpL R0,'A' ;if(ch==0x41)
rodata_XX: db "Hello" ;常量池指针

ALU(fn Ra Rb Rw):
addi .+
addf d+
and .&
or .|
xor .^

MCU(fn Ra lit):
jumpl b.lt
jump b.eq
move .= Ra Rw
halt b.thread
rot .>>

ldst内存读写指令,在x86上从来都是mov多写法
loadm lconst "wtf"
loadb lconst_0
loadp larg, aload 0
1
Forwarded from dnaugsuz
哎,没有心情看 #kt #book
看了下codegen技法,只能说近十例子里anko的风格相对优越,和html一样是用twig(类似erb)模板,然后作者函数复用还行,但也没有到90分的程度。

例如“贯穿全文”的DeepCopy(x:T)吧
js里相当于x就是T的反射,又一切皆可变,可以直接读写{...x}[ID], 只需
mapEachMember{if(it.isPrim) it else DeepCopy(it)}

kt里需要用构造器复制,先拿到 T.vars[ID].get(x)而非 x[ID],但依旧是 mapEachArg{getattr(x,it).primOrCopy} 的模式,这个至少适用于 Tuple$N的toMut和url参数绑定
这就是个小学算法,反射和List API 的良莠不齐却让它很难看。

重要的是独宠XXpoet 真的无力吐槽,和那个 https://tttttt.me/dsuse/17514 一样,就一个不用导包,然后自带formatter。简直可以说是一碟醋级别的算法,甚至应该叫搞错重点

和我的tkgui https://tttttt.me/dsuse/19768(py基于getattr等元编程,运行期生成等效调用赋值图代码)
都没法比,何况最近我在设计表达式级(fun{}内计算图)都能建模的跨语言、带裸类型推理、动静合一OOP元编程范式了,这种拙劣的"xml模板"实在写不起来

java确实是“病态类型”,而非什么静态检查。 连数据树的验证和walkDeep都要靠魔法,有什么资格谈类型签名的那些好处?
靠被默认值参数替掉的重载吗?

只能说,如果手头有电脑,我应该去吧那个sql dsl写了😒 而不是在这看java人像手写sql或xml那样拼接字符串
不知道 unquote(ast) 这种函数式代码生成,起码吧 quote(litOrID)做一下,免得被注入弄出无效代码啊

再说说全书结构,首先就没有谈元编程是什么,而是java老三套:环境配置、难题、抄代码

好吧,可是一个优秀的老师应该选循序渐进,但却对知识体系至关重要的例题: #learn #plt

- 为什么是靠C的#define 自主研发出易语言?预处理比str.replace多了哪些? 高亮分词后,灵活解释“常量字面”吧
> eval("[1,$x]") 是一种JSON解析器,可是x="][0]"时似乎有bug。 修好它,然后把js爆改为你希望的“易”语言(复用猜数游戏的REPL)。 完成后类似的bug应该仍然存在!
其实,js源码也有它的JSON.parse,它就是反射的原型。
- 比较下SQL的'?'、C printf、ERB/ES6模板,kt元编程最缺少的语法为什么反而是"$str"? 控制变量,就能明白pwsh和ts为何比bash和js有长期编程时的优越性

- if os==nt6: class: 与#ifdef _WIN7 凭什么是同构的? 动态类型,依旧是Java式的类型。宏,并不需要魔法
- 为什么Java8让 invokedynamic负责创建lambda,getMethod不也能.invoke吗
- 局部fun 一定要 ::引用的背后,藏着一种元编程,T.(A)与(T,A)->、(T?)!!的强转背后也是! 原来除了消除重复,她还让语言提供更有价值的“值类型”
- 为什么“闭包是穷人的对象”? C语言里回调函数去哪了?SAM接口又为何比到处new.object{}流行? 原来返回函数、重写接口也能费内存啊

- 为什么pyjs里很少人研究元编程,但却又有 python-future.org 与vue,babel这样的全民应用。 二者有何区别
- Proxy(obj)掉包属性,是动态类型元编程的专利吗? reflect.Proxy 能生成函数,还不止于DSL或AOP!
- 能不能通过函数重命名,用py风格的反射API实现KAPT的 @decorator ?哪怕只是封装Reflect?这能让你学习跨平台移植,收获超越本次需求的心智模型和视野
- Kotlin对dynamic类型表达式链条的“零修改”生成规则可以怎么实现,numpy里也可以吗? 这能帮你理解DSL和编译优化的本质

- “优秀的程序与其读写数据的结构直观对应”。纯函数式编程(例如rust的enum和if let) 做对了什么? 为什么你仍然选择不够纯的Kotlin? 这种enum能表示JSON乃至HTML的序列化结构。
- bash风格的参数有3种,其中一种如 ls -ar(all reverse) 传入enum:BitSet。用fun demo()出完整函数签名
- 以上问题和codegen无关,也没有教你具体怎么生成url/json/sql绑定类或函数,却给你了设计相关框架的能力!这次由我来回答,为什么javapoet是对pyjs里闭包list/dict的拙劣模仿,以及反射调用为什么就是在codegen!

所以。。 虽然《Ruby元编程》教你的只是一些OOP特性的“工作原理”,而案例较少,但我更喜欢它 --它让读者真正建立起了对"class"这个dict的理解,加上dyn(*arg,**kw) 本就可以用名字动态查,让读者对“把def和class 视为一种constObj去查询、实现复制粘贴、...”有了把握

而不是一个看似什么搞法和IR,ASM都贴出来了
实际上对你没有用,只是让工作失去焦点的troublemaker🌚🌝
👍1
https://tttttt.me/dsuse/19830 #statement #book 「只给🔑不给🔒#china
😒莫名其妙把《kt元编程》看到 Compose, AtomFU 的部分了,占二成篇幅

不得不说,牢霍 这两张写得是最珍贵,但是最烂的。

@Composeable 上来就是说内部有啥结构啥流程和flag,报菜名
连期待编译出什么代码都没得

如果您是后端,不懂Compose在哪调用,为什么有 $changed 这些优化呢?不好意思,牢霍只负责教codegen,这个框架被设计来解决什么,比无魔法的Anko优越在哪,他是一点不关心。
纯流水账 ,基本只对同样要学八股的人有用。。

我在想, 自顶向下地编程和写文,是我用的唯一方法;它的好处是,一切代码都是有reasoning的,不服可以重写、重新选型,不是强加给你来死记硬背的

但是,迄今为止我阅读全部的中文资料,除了王银那种废话为主的低密度冷科普,没有这种「自顶向下」的作者。

为什么从根源认知一类问题, 从而区分本质与私货、明白为什么要这么写,对各种大牛就那么难呢?!
#book Leonard #ai 演绎 1984
https://m.youtube.com/watch?v=SSDRHVm38c8

在B站,错误的历史记忆似乎以叮咚🐔 和哈鸡米捆绑而留下来了 #ncov19

不过最近城投泡沫又有新活:房屋养老金想从上海开始收了,迫于舆论没收成。 当然从法理上讲,不是你的“传世宅邸”,没有交税的道理。
https://m.youtube.com/watch?v=fQv1Xq7zpLI&t=7m
地方政府:那我缺的营养这一块谁来补呀?
duangsuse::Echo
https://www.youtube.com/watch?v=R7o3VAIve-0 #news 紧跟实事 和被自己编户齐民的《商君书》五马分尸的商鞅差不多
#history 商鞅 法家 #tw #book《商君书》 https://www.fxzhihu.com/question/578476328/answer/3419312483 [细则]

> 秦国人只要一被发现出生,就被判了死刑。活着的目的,是为了立功,争取减刑。 秦始皇就是中国人的上帝和赎罪券
> 我待將軍如至親,將軍拿我換美金! 居民户口是国家的不动产~
> 最让我恶心的,是他自己不遵守制定法律。 君要臣死,臣不死不忠,你跑什么呢?被扎死,被车裂。 唯一做过的好事就是弃尸荒野,给野狗子加餐了。 中勒!
> 作为先进文明,保持高度警觉,维持军事、科技的绝对投入,对军国主义国家进行削弱和拔掉獠牙的改造打压,是必要之恶

> 商鞅的灵魂到现在都飘荡在中华大地上荼毒每一场无辜的人吃人,让他们互相成就..斗蛐蛐
> 1+1等于几?说出 1+1=3 也是暗令禁止的。“不知道”才是正确答案
> 大炮射程之内的真理,不就是谎言么? 秀才遇到兵是有理说不清,因愚而穷,越贪婪越恐惧,越恐惧越贪,一人外扩,一人内卷。🤗
> “愚弱疲辱贫掠壹”,仁义礼智信父子,哪一面,才是底色呢?
> 秦国有一条法律,叫挟书律。既携带,收藏书籍的,灭族。
> 商鞅以一己之力彻底灭杀了世界东方诞生科学的可能性。
> “民之难治”,只是因为他们还有自由意志,不是牛羊。

> 法西斯好歹还把雅利安人当人,重罚轻赏,利出一孔,比法西斯有过之而无不及。500多年的国祚毁于一旦
> 你什么身份也配替商鞅叫屈? 它眼里人生就三件事,种地交粮服徭役、当填线饱饱、上床生孩子,生生世世,老老少少,恩情利滚利。
> 大力度的搞惩罚,是为了维持统治。 但是刘邦只要搞一手负强化,就可以零成本的把你的所有投资,变成他的收益。

>随便翻翻给你摘两条:
民,辱则贵爵,弱则尊官,贫则爱赏。以刑治民,则求用;以赏战民,则轻死。
政作民之所恶,民弱;政作民之所乐,民强。民弱,国强;有道之国,务在弱民
国仁民诈。治富若贫,国趋富。 民有私荣,则贱列卑官;富,则轻赏。

刻意让老百姓处于地位卑下、贫困潦倒的状态,然后给予并仅给予“耕战”两条上升途径,这样,老百姓为了摆脱困境,就会奋力耕种拼死杀人、人吃人。
人类还天然崇拜、尊重各种杰出之人:长得好看的、力气大的、唱歌好听的、会画画的、德行高尚的、机智多谋的、知识渊博的……
———这就叫“私荣”,人的天赋、天材和自尊,商君禁的就是这个! 老师会告诉你,别整那些没用的玩意儿,为大秦耕战,「公平地」获得爵位,才是「唯一的、真正的」荣耀。

有人说,商鞅抢了贵族的蛋糕,都是贵族在抹黑他。 其实说狗咬狗是抬举他了。
商鞅这一套,只能在一个科学实干、人文礼乐尚未发育的环境中维稳。但是面对境外的春秋战国,一触即溃。因为巨婴比治国,科举抢人头,实在烂到家了。
立法是作弊,司法是作案,行政是作死,就像法西斯一旦停止侵略扩张,国祚必不足用,所以法西斯必然走向僵化毁灭 (与只存钱不消费=印钞偷银行 逻辑一样)。
完成了第一轮大一统,在短短15年之内,就如玩笑般被秦众人唾弃遗忘的秦国,第一次证明了这点。

当我们听到精秦人用吃穿住行的口吻自夸「斩获5颗一定能加官进爵」「大殿里职缺多的是」 「这是国家又给你的机会」, 对这般合法又“公平”的杀人越货献忠行为,还会感到惊讶吗?👻
「考台湾省公务员 关台人什么事」「7h22m打过去下午领二代身份证」「留岛不留人」「一分千人」, 已经奠定了这五千年拨乱反正又颠倒黑白的底色。

“利出一孔”的思维模式从未断绝,大秦时期是“耕战”,科举时代是“万般皆下品 学文寸步难行”,当今社会就是“升官发财 Jumping恒等式”。
所谓少数民族甚至俄族会举行摔跤、大力士、赛马等不以盈利为目的的传统体育比赛,他们高兴起来的时候,又唱又跳。 汉人做题家则对这些事嗤之以鼻,唯信仰钱、权、金牌和诺奖的性价比

可能最大众化印象的区别是:周制是分封制,秦制是郡县制。但实质上远不是这样,这只是最表象的区分,

周秦制最根本的区别是:周制(王道)是保民而王、民富则国强、王在礼下。秦制(霸道)是有道之国、务在弱民、事无大小皆决于上。
周制思想:民为贵,社稷次之,君为轻。——《孟子》
“郑人游於乡校以论执政。”——《左传·襄公三十一年》
用民之力,岁不得三日。—《礼记—王制》
王室会派采诗官去民间采访,收集民间怨气、疾苦,然后加以改良,采诗官相当于官方记者,而这就是所有诗词文化的源头:《诗经》
秦制思想:民弱国强,民强国弱。故有道之国务在弱民。——《商君书》
⭐️ 因此周本质上是一个“宪政联邦”国家,是一个明显的“民主共和的议法体系”,事实上中文“共和国”一词就是源自共和、周全,能制衡周王,而非中世纪的贵族「分封建制」
而介绍秦制相关政策就很简单:就是不允许民众议政,夸也不行,夸也要「依法」判刑。 「赏赐」,其实就是和种姓制度一样,穷人世袭制,嘲所谓同胞踏上一万只脚。
周礼并不比秦落后,更不该挨打。秦制(对外军国对内帝国主义)的发明人自己都清楚的很。 鞅曰:“吾说君以帝王之道比三代(周政) 而秦孝公曰:‘久远,吾不能待。 急于求成听不进去 鞅曰:然亦难以比德於殷周矣
法家,作法自毙的东西。

幸而,它们,只有1颗头脑,其他“人”听主体便得胜了。 自由世界,🇺🇸🇺🇦🇮🇱🇹🇼却有千千万万颗头脑、万紫千红的目标。
被以多欺少,也是没办法的事啊!
https://m.youtube.com/watch?v=9Mu9Cpy2rG0 管仲-连坐制
duangsuse::Echo
http://www.bilibili.com/video/BV1cFm8YGEKe #china #dev BLM DLM了🥰 https://zhuanlan.fxzhihu.com/p/704798293 Markdown编辑器 Mou 📱国内开发者和用户都是奇葩,一个想着办法不付钱,一个想办法挣快钱,猜猜最后谁受伤? #经济 🤗 btw. #apple 这方面真是闭源丁真,什么都吃,就知道用户够有钱,其实是群靠着开源上游,卖设计,设计上也不求上进的脚本小子。 吃定某款App,比如ytdl或C…
https://coolshell.org/articles/8398.html/ 🤔
这是一个 fortune 日历,尝试用 #js #code 爬取它的数据吧?

wget https://github.com/BetterTuring/HappyHackingCalendar/blob/main/【共享全文】了不起的程序员2021-文本.txt#L4533 #book

//Documents]$ xclip -o|bash
BKREF=/\w{2,7}(?=\))/g, BKDEF=/\(?<(.+?)>(.+?)\)/g
RE=(u, $,s=u.source, df={})=>(
s.replace(BKDEF, (m,k,v)=>df[k]=v),
RegExp(s.replace(BKREF, k=>df[k]), u.flags)
)
book={
re:RE(/(?<Ymd>\d{1,2}-\d{1,2})\n+(?<head>.*?)\[ (?<tag>\S+) \](?<body>.*?)\n+(?=Ymd)/sg),
*As(s) {
for(m of this.re[Symbol.matchAll](s)) { yield m.groups }
}
}

this.s??=prompt()
console.table(a=[...book.As(s+'0-0')])

pre=(fix,s)=>s? fix+s : s;

`mkdir qotd; cd $_ ; mkdir {1..12};`+
a.map(u=>`cat>${u.Ymd.replace('-','/')}<<OK
#${u.tag}
${u.body}${pre('\n//日码\n',u.head)}
OK
`).join('')