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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
即使是这样的宏处理器而已,比隔壁的 EPL 高到不知哪里去了,这种弱智翻译怎么好意思称为汉语编程?
duangsuse::Echo
Model 部分基本完成
那么就到这里了,这的确是一种不错的方法,可惜花的时间也是比较长...

https://github.com/duangsuse/GeekSpec-GeekApkv1.0b/blob/master/geekapk-1.0beta-zh_CN/models/comment.api-inline.md#entity-relation-comment

Entity Relation comment

Belonging to User by author
on delete set -1
Belonging to App by app
on delete set -1
Belonging to Comment by replies
observes delete onParentCommentDeleted
Has many Comment "reply" by Comment.replies
observes attach onNewReply

从这里就可以很明显地看出,如果一个用户删除了自己的帐号,他的评论默认不会删除,而是设置到一个保留的 『Ghost』 帐号下
如果一个应用被删除了,它的所有评论会被保留并且移动到一个『垃圾箱』应用下,不过这个行为应该改改的,我想想...

如果一个评论被删除,则它的所有子评论会被移动到系统新建的保留评论下... 不过 replies 字段是不可变的,应该修改以满足这种使用方式
如果评论有新的回复,则应该通知它的所有者
Forwarded from Hacker News
Learn more programming languages, even if you won't use them (Score: 101+ in 1 day)

Link: https://readhacker.news/s/3ZRtq
Comments: https://readhacker.news/c/3ZRtq
👍 @RainSlide 总算有人发了...
不过一直要说的事情很多,比我周假的时间多....
现在正在准备一下...
#fix #cs 首先说两件错误:

1. #Python #cg #font 关于 freetype.py 的矩阵循环命名不当

出事的消息 👉

首先,不得不说 duangsuse 不是完全的了解 Python(比如说,我不理解 Python 元编程比如运算符重载、没有完整使用 Python 函数式编程、decorator,map 类数据结构,和 assert 等特性...),不过这其实也没啥

然后在吐槽丸自己后,我们来看看不对在哪里

def draw_bitmap(image, bitmap, x_pos=0, y_pos=0):
x_max = x_pos + bitmap.width
y_max = y_pos + bitmap.rows
for row, i in enumerate(range(x_pos, x_max)):
for col, j in enumerate(range(y_pos, y_max)):
if i < 0 or j < 0 or i >= WIDTH or j >= HEIGHT:
continue
pixel = image.getpixel((i, j))
font_pixel = bitmap.buffer[col * bitmap.width + row]
pixel |= int(font_pixel) * ALPHA
image.putpixel((i, j), pixel)

为了阅读方便,我删除了注释、内联文档并且修改了一些语义无关的缩进。

这个函数呢,其实很简单,我们这么描述它:

draw_bitmap 一个『原图』(像素积通常比『叠加图』要大)和一个『叠加图』,再给一个『叠加图 x 轴偏移量』一个『叠加图 y 轴偏移量』
draw_bitmap 会按照偏移量将叠加层混合到原图上(超出的部分忽略),并且利用 putpixel 设置原图像素,最后返回空

它是怎么做的呢?(算法)

我们假设有一个平直角座标系(并且,假设你的图片按照『最符合常识』的方法被放在第一象限),这就是我们对『Python Pillow Image』的高层抽象,我们忽视颜色系统等细节。

首先,假设我们确保原图一定比叠加大,那么,简单的算法可以这么描述:

foreach bx by. ox = bx | ix, oy = by | iy

或者说,就是简单的叠加混成

那么,其实这个混成算法就是:

1. 算出添加『绘制』偏移量(像素)后最大的 x 轴和 y 轴索引
2. 循环,枚举『原图』偏移绘制化后的索引 ix iy,并且还要枚举『叠加图』的索引 bx by:
假若索引越了原图的索引范围(不可能越叠加图的索引,因为我们是要枚举它的全部索引的,而对它是不加偏移量的),跳过
否则,用索引去拿 i 图和 b 图的像素,混合(按位与运算,RGB 颜色系统 int32 格式里可以这么做,不能用加法,因为这 32 位是分成 3 部分 0x0-0xff 256 色深而不是真正的 integer)
然后设置原图像素

== 那么错在哪里?

其实算法没有错(我抄的,我承认,而且这也不是很厉害的算法,甚至有点幼稚,也没用三角函数等 CG 库用户级别基础...)

    for row, i in enumerate(range(x_pos, x_max)):
for col, j in enumerate(range(y_pos, y_max)):

下面循环算法结构相关的代码:

if i < 0  or j < 0 or i >= WIDTH or j >= HEIGHT: continue
pixel = image.getpixel((i, j))
font_pixel = bitmap.buffer[col * bitmap.width + row]

为啥不对呢?命名名错了。

所谓的 row,列,所谓的 col,行,离散数学里会提到的,二维矩阵基础,不熟悉则可以说无法搞任何的信号处理、线性代数、计算机图形学、(尤其是)关系代数,数据分析怕不是都有点困难户
所谓学计算机科学需要数学功底,其实很多都是这种的,离散数学不知道别想毕业(虽然现在很多大学 CS 比较水... 真的,就是搞搞运维,还不如软件工程的呢... 然鹅,我觉得不知 NS 图、UML 是啥的大有人在

我恰巧不熟悉,其实它是这么说:

for ix, bx in enum_with_index(ixs, ixe):
for iy, by in enum_with_index(iys, iye):
... 这段代码会遍历两个图片指定像素偏移后 b 与 i 重叠的部分

bitmap.buffer[col * bitmap.width + row]

后面这一行代码,稍微有点常识的人🐸 不难看出, 根本不对!访问计算表达式应该是 row * width + col(数学公式里 row 可能叫 n、col 可能叫 m)(这也体现出了“反直觉”『从 0 数』的一个好处,另外一个不识二进制人不知道的事情是,C 语言里数组指针的第一个元素的确是从 0 这个偏移量开始的,往后 n 个元素就是 *(ary + n * sizeof(t)) 这个数据,n = 0 时恰巧是第一个元素,当然即便是 CLR 也支持非零基的和多维度的数组,不过和那个无关,等到你们开始用 JDK 的高层抽象后,就不识得 C++ 的 std::arraystd::vector 了... 所见不过是『一组有序数据』... 那一层的直觉的确是『从 1 数』... 说起来其实不知道的人现在还蛮多的...)

那么错就在这里:

for row, i in enumerate(range(x_pos, x_max)):
for col, j in enumerate(range(y_pos, y_max)):

实际是(而且我代码缩进也有点莫名其妙了,我随了大流,其实这两个不应该显示出其嵌套关系的,因为是『平级』的枚举):

for row, n in enumerate(range(x_start, x_end)):
for col, m in enumerate(range(y_start, y_end)):

完美了!(跑)

2. 关于『第一个 x86 汇编程序』对机器栈的理解和模拟错误

出事的消息 👉

首先,会写 x86 / arm 汇编(或者 C inline assembly、或者 LLVM IL)本来就不应该被视为很厉害的技能,因为上个世纪的人打孔带、机器代码(可能也是利用打孔带,或者... 什么?)都手写过了(当然不是这个世纪的计算机可能)

(当时我写的是 intel 风格 386-compatible 的汇编)(其实是 AT&T 风格的... 我更喜欢 intel 风格的其实)

而且,按照老冯(冯·诺依曼)的说法,我们怎么能用 assembler 呢!怎么能用邪恶的 assembler 浪费处理器(即便是 CPU 而不是更没算力的 MCU、PLC...) cycle 呢?
当然都过去了哈哈,现代的计算机一秒内不知能进行多少整数运算... 还有并行处理呢!如果有显卡浮点也不成问题

duangsuse 该被批判的(

所以下次再敢膜我有时候会直接写汇编什么的,小心被 😫 哦(跑

sysprintf:    
mov %rsp, %rbp # stdcall # 不应该是 stdcall,其实这里我不关心到底是 stdcall、fastcall 还是 cdef 什么的,因为这个函数是被仅仅内部使用(hidden)的,题外话,其实这句没有用,这层栈帧不需要任何空间

mov $1, %rax # sys_write
mov $1, %rdi # use stdout

pop %rsi # string ptr # 错!先 pop 出来的明明是长度而不是数据指针,后 push 的($20)先 pop,实际上我被 rsi 这个名字(我以为是 source indicator)糊住了
pop %rdx # length # 弄反了!

syscall

ret

以上,不过顺便说一句,虽然现在因为某些原因(想做一些好玩的工程... 不过,话说其实我并不懂字面意义的软件工程学科)duangsuse 『停止』了信息科学/计算机科学的学习,但是,还是能发现自己的『智商』在提高!因为模拟分析能力得到了大幅增强!
duangsuse::Echo
#fix #cs 首先说两件错误: 1. #Python #cg #font 关于 freetype.py 的矩阵循环命名不当 出事的消息 👉 首先,不得不说 duangsuse 不是完全的了解 Python(比如说,我不理解 Python 元编程比如运算符重载、没有完整使用 Python 函数式编程、decorator,map 类数据结构,和 assert 等特性...),不过这其实也没啥 然后在吐槽丸自己后,我们来看看不对在哪里 def draw_bitmap(image, bitmap, x_pos=0…
顺便就说说两件事情:

1. 之前有一次想法中提到『RangeMap』这种数据结构的(我开始考虑滚动字幕的算法优化支持),其实根本不需要,因为二分查找就可以了(其实我开始打算就是封装 bsearch...)(在知道当前播放位置和可以比较跳转时轴的时候可以进一步取子序列优化,基本操作是根据时轴查歌词),Java 的 Arrays API 有封装

2. duangsuse 之前有不少次对自己能力有估量错误的(高估了)
希望你们都能理解,我经常这样
现在 duangsuse 基本是暂停了学习,所以很多时候 CS 的内容可能要发少一点了,唉 😿

不过还是会经常使用一下已有的技能的,
这个星期主要看了一点 Agda(record... corecord,typed printf,数组越界检查实现,parser、interpreter 什么的)
此外也有一点代码例子吧... #ann 人工神经网络机器学习的我肯定没看
冰封哥总是不会停止学习的,对吧?不过我可能要停止一会... 因为实战的时间实在是太少了,我没兴趣(虽然理论都搞不好)看理论

总之,之后的学习,到底要到什么程度,到底该怎么学,怎么协调数据结构算法、异步和消息驱动、并行编程、图形前端和计算机图形学、计算机网络、信号处理、机器学习、软件工程学科、函数式编程、编译原理、关系代数、Web 应用设计、图形用户界面应用设计、嵌入式、操作系统、密码学、信息学、线性代数这些方向,得看我自己的选择。(虽然其中很多我没开始或者不算入门,比如数学什么的...)
duangsuse::Echo
那么就到这里了,这的确是一种不错的方法,可惜花的时间也是比较长... https://github.com/duangsuse/GeekSpec-GeekApkv1.0b/blob/master/geekapk-1.0beta-zh_CN/models/comment.api-inline.md#entity-relation-comment Entity Relation comment Belonging to User by author on delete set -1…
没人打星... 考虑到这个只是 draft 的原因就算了,但我真的写了几个小时的... 那我就设置 vote 吧,既然怕污染自己的 GitHub star 列表就在这里打星... 别吐槽『毛都没有』什么的,看在 GeekSpec 0.1 的确有两个工具(虽然没和 Gradle、Maven 什么的集成)的份上好歹打颗星...
https://github.com/duangsuse/GeekSpec-GeekApkv1.0b 吼不吼啊? 🐸
anonymous poll

吼,概念不错 – 1
👍👍👍👍👍👍👍 50%

上面的不吼兼而有之 – 1
👍👍👍👍👍👍👍 50%

不吼,格式有点太冗长了
▫️ 0%

不吼,严重怀疑是否真的能如你说的那样利用 Markdown 文档生成代码
▫️ 0%

不吼,严重怀疑预处理器是否能实现
▫️ 0%

不吼,严重怀疑 Markdown 解析器是否能实现
▫️ 0%

不吼,还没有写出 API 规范格式呢
▫️ 0%

懒得看了
▫️ 0%

👥 2 people voted so far.
#Android #dev ... 怎么又扯到 drakeet 又是这种撕逼...
Forwarded from AlPlank [Courtyard]
我是简体用户…无语。
Forwarded from duangsuse Throws
恕我直言(情商为零)我觉得,所谓不擅长回复的『技术人员』不适合叫做技术人员,真正的技术人员从来不害怕在任何时刻任何场地任何谈起任何领域的技术,他们会在生活中看到程序题,在不知道别人的抽象、模型时根据目标问题领域自己弄出自己的模型猜测,把一切符号背下来,一切 pattern 也都熟练于心、为自己的编程写工具、实现自己使用的程序设计语言,从高级控制结构看到指令流,学习 IDE 快捷键、重构,彻底理解测试、打包、部署和构建系统,至少不会做出有安全漏洞的设计,不断尝试攻破新的效率顶峰,从布局到 SIMD 到 TCP/IP 至网络层硬件内核驱动甚至密码学、机器学习、线性代数、数控、函数式编程,都不该害怕,这样才配叫做真正的技术人员。

如果你连 RSA 算法怎么手算都不知道,你怎么可能拿汇编去写一个 RSA 加解密实现?甚至可能带单指令多数据优化的
如果你连拼音有几个声母几个韵母、韵母是什么、声调是什么都不知道,怎么可能开发出语音合成软件?
如果你没有能力查找『不是你领域知识』的资料,没有看论文的能力,(假设你不学编译原理)编译器你怎么会写?解释器、Visitor Pattern、Annotation processor、2D 物理引擎这些哪里写得出来?
如果你连数学矩阵都不会,DIP (数字图形处理)算法对你来说就是天书,如果你连 sin cos 函数都联想不到直角三角型的图像,无法动动脑子就得出调用参数,五角星你都画不出来
如果你连关系代数、记录、外键都不清楚,那 SQL 和 Pg 的扩展对你来说只是抄
如果你连基础算法、暴力查找、IO 都搞不懂,那别指望应用编程了

🤔

编程应该是在脑子里,在生活中,你看到一个打水器、一部电梯都会想到要用什么控制平台,要怎么编程,而不是跟着已有的代码和 StackOverflow 走,有一句特别扎心的话:

离开了网络、GitHub,StackOverflow,现在还有多少程序员能编程?

我觉得最好的程序员,肯定都是在睡觉时都能想到人工神经网络学习回归运作的。

我们学校也有不少会各种奇葩技能的同学,比如魔方、折纸、飞扑克牌,我都不会(甚至篮球都不会打)... 不过我觉得,对现在的『程序员』『软件工程师』要求还是太小了... 居然只会会一种事情...

这就是我对技术人员的看法,在我看来,我的最终目标就是成为这种技术人员,在这之前,都不能拒绝学习
AlPlank [Courtyard]
我是简体用户…无语。
性格变化大... 不会就是我害的吧... 🤔 23333
哦... 那也好,至少我又能看他的技术了... 不过我这次绝不评论 🤔... 不过其实也很无聊的(除非我想写些 Android 应用,但 WinForm、Qt 的一些子系统,比如 resouces 抽象我都不是特别熟,Java 的稍微好一点),如果我做完了自己的安排就去看,待会发链接。
Forwarded from LetITFly News (LetITFly 让技术飞) via @like
https://t.me/drakeets/1605
我认为 Drakeet 的频道没增长多少粉丝的原因有一条是:国内来 Telegram 的 Android 开发者(相对于爱好者(用户)而言)还是太少了。

虽然频道主不喜欢基于微信的公众号/小程序等平台,但频道主能理解并尊重 Drakeet 将后续的技术文章放到知识星球的决定。

经过和 Drakeet 短暂私聊,我了解到:
Drakeet 是喜欢 Telegram 这款软件的,他也会继续上 Telegram 接受纯纯写作的反馈等。

频道主在此建议在座的各位一起维护良好的交流氛围,不要让更多的人心寒。
duangsuse::Echo
哦... 那也好,至少我又能看他的技术了... 不过我这次绝不评论 🤔... 不过其实也很无聊的(除非我想写些 Android 应用,但 WinForm、Qt 的一些子系统,比如 resouces 抽象我都不是特别熟,Java 的稍微好一点),如果我做完了自己的安排就去看,待会发链接。
另外,本频道虽然是『技术频道』但『干货』(这里指,大家平时会用的东西,比如 MultiType 的使用... 好吧,或者说别的,Android 控件应该怎么写怎么支持 from XML 什么的)比较少(而谈程序设计语言理论的有一些,我最近想讲二维文法),所以大家懒得看吧。(有些干货,比如软件逆向工程,则是因为大家太菜(恕我直言,很多人的确是这样的),没人看得懂反汇编而已...)

👆 上面一句被喷『菜』的回复之前容我卖个小,对比一下年龄,我 17,高二在读,每周接触电脑的时间不超过 8 小时... 我用 Fedora + KDE,平时最喜欢 Java/Kotlin/Groovy/JavaScript/Ruby/Python,偶尔有可能写下 C/C++/Lua/Crystal/Rust/CSharp/Haskell/Scheme 再偶尔 Assembly/TypeScript/Shell/Perl/AWK/SED/PHP/VisualBasic/Octave/Dart/Go/Julia?/Scala?/Clojure?,非泛向编程的 Makefile/CMake/QMake/HTML/YAML/JSON/Regex/PEG.js/Ohm.js/ANTLR/Flex/Bison,托一位 PL/FP/PLT 大佬的福我还会一点 Agda,可是懒得看『类似』的 Coq 和 Idris、FStar,可是不会 rewrite 归纳证明... 不过 OO 软件架构、Future、Fiber(非对称 Coroutine, Sequence, Generator)、容器类、类型参数化、组件化、依赖注入、函数式编程、消息队列使用、多线程、进程抽象、响应式布局抽象还是会的

隔壁羽毛(一个 MSCLR C# 开发者)的频道都(为啥要说都)比本频道阅读率高,因为大概还是刷的慢一点。
本频道... 呵呵。 🤪

啥时候我搞得懂 Haskell Monad 的理论... 使用我是会的