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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可退出
suse小站(面向运气编程): https://WOJS.org/#/
Download Telegram
duangsuse::Echo
我不是很喜欢最后那个算 padLeft 和 padUp 的 大致就是 lineW = (cfg.font_size + sp_h) * scale lineH = (cfg.font_size + sp_v) * scale cols = int(image.width / lineW) rows = int(image.height / lineH) padLeft = (image.width - (cols*lineW) + sp_h) /2 padTop = (image.height - (rows*lineH)…
(h_sp, v_sp) = spacing
(w_item, h_item) = (d+sp for d, sp in zip((font_size, font_size), (h_sp, v_sp)) )
(m, n) = (int(full/d) for full, d in zip((width, height), (w_item, h_item)) )
padLeft = (width - (m*w_item) + sp) /2
padTop = (height - (n*h_item) + sp) /2

🤔 两点。 (0) 即便 width - (m*w_item) aka. width - (int(width/w_item) *w_item) 可以用 width % w_item 替换(并且甚至可以上 Python 的 divmod)我也没用(因为我没发现不止可以用 divmod,哈哈)
(1) (a/2+b/2) 不是永远都可以合并去 (a+b)/2 的,比如浮点高精度,但这里可以。
(2) 即便可以把 padLeft, padTop 写成 value destruct 的形式,我也没那么写,这都是为了可读性。
duangsuse::Echo
(h_sp, v_sp) = spacing (w_item, h_item) = (d+sp for d, sp in zip((font_size, font_size), (h_sp, v_sp)) ) (m, n) = (int(full/d) for full, d in zip((width, height), (w_item, h_item)) ) padLeft = (width - (m*w_item) + sp) /2 padTop = (height - (n*h_item) + sp)…
下文直接上骚操作:
(width, height) = imageBounds(image)
global font_size

(h_sp, v_sp) = spacing
(w_item, h_item) = (font_size+sp for sp in (h_sp, v_sp) )
(m, n) = (int(full / item) for (full, item) in zip((width, height), (w_item, h_item)) )
(padLeft, padTop) = (int( (full % item + sp) /2) for (full, item, sp) in zip((width, height), (w_item, h_item), (h_sp, v_sp)) )

*最后一条 zip(a, b, c) 真心不推荐,这条是真闹着玩的。
This media is not supported in your browser
VIEW IN TELEGRAM
这段代码可不止是我意淫出来的,而是真的可以用 :P (虽然这个例子相对简单)
duangsuse::Echo
这段代码可不止是我意淫出来的,而是真的可以用 :P (虽然这个例子相对简单)
for i in range(0, n):
x_text = padLeft
for j in range(0, m):
area = (x_text, y_text, x_text+w_text, y_text+h_text)
shadow = image.crop(*area)
x_text += w_item
avgc, is_draw = averageColor(shadow)
if not is_draw: continue
draw.text(area[0:2], next(chars), font=font, color = avgc if cfg.font_color == None else cfg.font_color )
y_text += h_item

这段代码也不是我瞎写的,也是真的可以用(
最喜欢能够直接替换上去,试运行的代码了

cfg.font_color = rgbColorBack(cfg.font_color) if cfg.font_color != None else None
y_text = padTop
for i in range(0, n):
x_text = padLeft
for j in range(0, m):
area = (x_text, y_text, x_text+w_item, y_text+h_item)
shadow = image.crop(area)
x_text += w_item
avgc, is_draw = getAvgColor(shadow, keyc)
if is_draw:
draw.text(area[0:2], next(chars), font=font, fill = cfg.font_color or rgbColorBack(avgc))
y_text += h_item
这个调试过才是可以直接替换的(看来还是不能脱机颅内执行
不过,我对 y=padTop; for i { x=padLeft for j { x+=w } y+=h } 这种风格好像也没本质帮助,要好好重构只能上 LayoutPlanner 了(
This media is not supported in your browser
VIEW IN TELEGRAM
duangsuse::Echo
不过,我对 y=padTop; for i { x=padLeft for j { x+=w } y+=h } 这种风格好像也没本质帮助,要好好重构只能上 LayoutPlanner 了(
不过虽然不能杜绝这种 y=padTop; for i { x=padLeft; for j { x+=w } ; y+=h } 的风格,要说方法倒是也有
很简单,不一定要给 i, j 留位置因为它们根本就没被引用!实际上它们只是相对于 x, y 的“计数变量” (i, y = enumerate(range(y_min, y_max))) 而已。
亲数学系的程序员也可以用 i*h_item 直接替代 y,如果你不嫌每次算很麻烦的话(不过这倒是一种很吸引人的做法……因为这样就可以并行计算,虽然众所周知绘制都一般是单线程的)
不过反正 Python 和 Kotlin 一样提供了 range(不知道一些静态语言为什么没有,emmm),所以只需要 for y in range(0, height, h_item) 即可…… 连 i, j 和 n, m 都省了 😂 反正 n = height/h_item
duangsuse::Echo
不过虽然不能杜绝这种 y=padTop; for i { x=padLeft; for j { x+=w } ; y+=h } 的风格,要说方法倒是也有 很简单,不一定要给 i, j 留位置因为它们根本就没被引用!实际上它们只是相对于 x, y 的“计数变量” (i, y = enumerate(range(y_min, y_max))) 而已。 亲数学系的程序员也可以用 i*h_item 直接替代 y,如果你不嫌每次算很麻烦的话(不过这倒是一种很吸引人的做法……因为这样就可以并行计算,虽然众所周知绘制都一般是单线程的)…
#Learn #dev #tip 有些人可能看不习惯 n_item, x_item, y, h, w, i, j, n, m, 甚至 h(orizontal), v(ertical) 这类缩写中 n x y 这样的字符总被放前面的情况(
其实在物理式子的命名里,这种做法很流行(事实上,物理系命名法相当接近日常编程会使用的命名方式了,它一点也不“数学”),它把“类型”缩写放在命名的头部。

众所周知,本 duangsuse 是推崇零文档的(代码就是最好的文档
而不是把文档写成逻辑的重复,文档只应描述一些特殊的值/状态要求。

一般我们说“中文编程”排除某些“机器翻译”实例之外,另一些实例不能写出优雅好看的大项目的原因也在于此——相较英文,中文把最能体现一个句子意图的词放在了最后面,这个问题使得它在程序设计上阅读起来有点不舒服。
然后就是这样,不对我少写了个 / 2 ……
嗯…… 我知道为什么重影了。 边角处重影是因为 y 和 x 的区间过大,过大是因为 range 并非整除区间, start <= i < stop 就可以,y,x 的最后一次迭代 item 的 h,w 将不足。 要切换模式,可以预先把 stop 变成 it - (it%d_item) aka. it-(it/d_item)*d_item
这个版本大概就是这样
🌝 #Python #code 这个宇宙太疯狂,大海掀翻小池塘~
./Montage.py -seq 'DOGE酱' -font-size 8 -spacing :-5,-5 -font /usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc --draw-color-code 'averageColorIfDifferThreshold(it,(0x8f,0x79,0x52))' --new-image-code 'cloneImageColored(it, (0x8f,0x79,0x52))' -scale 2.0 ~/图片/v2-20e303a57602cb2a062018baf28b6f62_720w.jpg Good Ending
命令行调用起来有点麻烦,还得写一大堆代码,看来这个灵活性平衡才最重要……
duangsuse::Echo
有没有必要再自己重写一遍
This media is not supported in your browser
VIEW IN TELEGRAM
所以说我会重写的,不过到此为止算了(下一步再维护的话就得做子贴图而非文本绘制了,而且argparse也要改…… 算了
目前这个也是没用到 AllFold,只有 MapFold 的。
Forwarded from duangsuse Throws
#dev #JavaScript #Haha 草,我竟然做出来了……
一个车夫,赶着1辆马车,车上坐着5个人,每人拿着5个袋子,每个袋子里装着5只大猫,
每只大猫带5只小猫,每只小猫带着5只老鼠干粮
问:这道题里一共有多少条腿? 😂

衬衫的价格是 9 磅 15 便士。ES6。

const
laoshu = n => n*4,
mao = n => laoshu(n)*5 + 4,
bigmao = n => mao(n)*5 + 4,
daizi = n => bigmao(n)*5,
ren = n => daizi(n)*5 + 2,
cheche = n => 2 + ren(5);

answer = cheche(1) //13104
Forwarded from 憨憨的碎碎念 | #成为打工人 (wuhang2003 - 疯狂赶作业ing)