duangsuse::Echo
人 间 失 格 编程 连 续 8 小 时;只为一些无聊的位图处理……
This media is not supported in your browser
VIEW IN TELEGRAM
悲惨的起因,只是因为在 GitHub 上看到别人有用 Python+Pillow 写这个:
https://github.com/FerryYoungFan/SimpleTextMontage
虽然数学不好,对某些关系不那么扁平的数据处理也会非常吃力的 duangsuse 就头脑发热地想:
『这么简单的程序,我怎么可能不会写?我一定要写出来看看』
结果就杯具…… 😭 不过还是有一点收获,就是我学会了如何用 color average 插值写位图 scale 算法
虽然花了我至少 6 个小时的时间才完成到可以生成图片(本来应该只要一个小时,可是被 argparse 坑了…… 我不该一上来就填那么多参数),但感觉也还可以,而且我没有在任何关键问题上查资料,也没有看太多次 help
学习还是有效果的,毕竟我学会了这些 API:
我的 Gist 上有 Kotlin 字符画 ASCII Art 生成器的源码
看了 FerryYoungFan 的版本,10:52-11:27 花了半个多小时,好像不是提前写好了的,唉
算法上,除了
不过设计上,没有扣像、 (keyColor, keyThres, keyRatio) 、自动渐变的背景色 (刚才我以为 count avgcolor 是拿来判断背景色的…) 和 xy padding
另外 (keyColor, keyThres), keyRatio 我还是会写的,之前的 Kotlin ASCII Art 就用到了 filter 色值的算法;只不过这个是按照 abs 符合要求色块数目来取舍是否生成文字
如果我使用高效的 Numpy/Pillow 内建函数,而不是我手动的 average 插值 scale 算法(Montage.clippy) 的话,就可以拿来处理视频(否则太慢了,处理不过来),实际上 B 站也有一个罗小黑战绩《晚安喵》的这种视频,有心人不妨试试重构。
#Python #tools #DIP
https://github.com/FerryYoungFan/SimpleTextMontage
虽然数学不好,对某些关系不那么扁平的数据处理也会非常吃力的 duangsuse 就头脑发热地想:
『这么简单的程序,我怎么可能不会写?我一定要写出来看看』
结果就杯具…… 😭 不过还是有一点收获,就是我学会了如何用 color average 插值写位图 scale 算法
虽然花了我至少 6 个小时的时间才完成到可以生成图片(本来应该只要一个小时,可是被 argparse 坑了…… 我不该一上来就填那么多参数),但感觉也还可以,而且我没有在任何关键问题上查资料,也没有看太多次 help
学习还是有效果的,毕竟我学会了这些 API:
Image.open(path)
Image.new(space, coord, fill)
Image#width, Image#height
Image#convert(space)
Image#getpixel(p) -> tuple
Image#setpixel(p, tuple)
ImageDraw.Draw(img: Image)
Draw#text(p, txt, font=, fill=)
ImageFont.load_path(path)当然一般来说为了性能(其实当然在 DIP 的时候算法是最重要的)都直接用 JVM 的
ImageFont.truetype(name, size=fntsz)
ImageFont.FreeTypeFont
awt.BufferedImage 吧……javap javax.imageio.ImageIO
javap java.awt.image.BufferedImage 我的 Gist 上有 Kotlin 字符画 ASCII Art 生成器的源码
看了 FerryYoungFan 的版本,10:52-11:27 花了半个多小时,好像不是提前写好了的,唉
算法上,除了
[xs[k:(k+2)] for k in (0,2,4)] 这种没见过(也不是不会写)都知道不过设计上,没有扣像、 (keyColor, keyThres, keyRatio) 、自动渐变的背景色 (刚才我以为 count avgcolor 是拿来判断背景色的…) 和 xy padding
(w- colPxs*m) /2
也没有加 textVsp 和 textHsp 文字间距,和图像边角的间距,我的版本写的更活一点,不过大概是没有太大意义的……另外 (keyColor, keyThres), keyRatio 我还是会写的,之前的 Kotlin ASCII Art 就用到了 filter 色值的算法;只不过这个是按照 abs 符合要求色块数目来取舍是否生成文字
如果我使用高效的 Numpy/Pillow 内建函数,而不是我手动的 average 插值 scale 算法(Montage.clippy) 的话,就可以拿来处理视频(否则太慢了,处理不过来),实际上 B 站也有一个罗小黑战绩《晚安喵》的这种视频,有心人不妨试试重构。
#Python #tools #DIP
GitHub
FerryYoungFan/SimpleTextMontage
简易文字蒙太奇生成器. Contribute to FerryYoungFan/SimpleTextMontage development by creating an account on GitHub.
duangsuse::Echo
悲惨的起因,只是因为在 GitHub 上看到别人有用 Python+Pillow 写这个: https://github.com/FerryYoungFan/SimpleTextMontage 虽然数学不好,对某些关系不那么扁平的数据处理也会非常吃力的 duangsuse 就头脑发热地想: 『这么简单的程序,我怎么可能不会写?我一定要写出来看看』 结果就杯具…… 😭 不过还是有一点收获,就是我学会了如何用 color average 插值写位图 scale 算法 虽然花了我至少 6 个小时的时间才…
usage: montage [-h] [--convert coding] [--output-format encoder] [-o [opath]]
[--output-fmtstr opathfmt] [--text TEXT] [--grayscale]
[--text-grayscale gray-texts [gray-texts ...]] [--scale ratio]
[--scaleXY x y] [-fnt [fpath]] [-fntsz size] [--preview cmd]
[--preview!] [--print-render-src]
image [image ...]
Simple montage graph generator
positional arguments:
image Images (path) for input
optional arguments:
-h, --help show this help message and exit
--convert coding Convert image color coding (RGBA)
--output-format encoder
Python pillow image encoder type in [png webp pdf bmp
dib gif ico jpeg ppm xbm tiff tga]
-o [opath] Output to file directly (Text)
--output-fmtstr opathfmt
Output filename format like out_@_#.png
--text TEXT Text to be embeeded
--grayscale Use grayscale and text output
--text-grayscale gray-texts [gray-texts ...]
Character for grayscale picking
--scale ratio Text-image scale ratio X.Y
--scaleXY x y, -sxy x y
Size skip of collecting X/Y (override)
-fnt [fpath], --font [fpath]
Font TTF/OTF glyph path, if like `:name`, treat as
font(TrueType/FreeType) name, not path
-fntsz size, --font-size size
Font size (avaliable for fonts by :name)
--preview cmd Preview command (don't do save)
--preview!
--print-render-src Print Render source
by duangsuse, see also https://github.com/FerryYoungFan/SimpleTextMontage
' '.join(iter('金玉其外败絮其中'))
金 玉 其 外 败 絮 其 中 (指cmdline vs. DIP 算法)(大嘘)……
./Montage.py doge.jpg --text "汪" --font :/usr/share/fonts/wqy-zenhei/wqy-zenhei.ttc -fntsz 20 Image (640, 640) Scale None
TextXY (20, 22) Clipped (32, 30)
gimp Mondoge.jpg.png莫名为自己抽提逻辑的觉悟而自豪,原来这些程序可以这么好看…… 而且蛮可扩展的 #FP
duangsuse::Echo
莫名为自己抽提逻辑的觉悟而自豪,原来这些程序可以这么好看…… 而且蛮可扩展的 #FP
硬核手动
bytearray…… 不知道有没有提高性能的效果,估计有也是反效果……💭 刚才看到 Electorn-ssr 的 (啊,好像是 SSR Android 的……)speed test,忍不住想起之前我设计了半天……
🤔 其实想过很多,但是要用的话都忘记了…… 这些只是大概,我觉得用独立的组件+并发的池子可能会好一些
inline fun idp<T>(x: T) = x
fun testService(svc: SSR.Profile) {
title.text = "正在测试 ${svc}…"
val res = avgFetchSpeed(svc)
text += res.either(idp, Units.MillSeconds::preety)
}
fun speedTest() = profiles.map(...).foldRight(async {}) { t, r -> t; r.await() }
fun speedTest() = Promise.all(profiles.map(::testService)) 🤔 其实想过很多,但是要用的话都忘记了…… 这些只是大概,我觉得用独立的组件+并发的池子可能会好一些
📝 这周末的任务(反正一定不能完成的!) #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,失去新鲜感了?
想太多,什么都做不了,大概总有一天会麻木的吧。最怕找不到目标了,消遣的人也越来越少了。
当然我不是说大家都在做自己的『事』(其实我没看见几个人在特别地写什么新项目的),只是莫名其妙好像都没人了一样……
- 重写 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,失去新鲜感了?
想太多,什么都做不了,大概总有一天会麻木的吧。最怕找不到目标了,消遣的人也越来越少了。
当然我不是说大家都在做自己的『事』(其实我没看见几个人在特别地写什么新项目的),只是莫名其妙好像都没人了一样……
JavaScript 需要另一个方面的改善… 它可以用 Inline IIFE 来应付不能用 lambda 的函数,但太难看了,也不便于设定上下文 context。
node.appendChild((function (key, value) {
var newNode = document.createElement("div");
newNode.setAttribute(key, value);
return newNode;
})("a", "b"));一来… 好在 JavaScript 本质混乱邪恶,IIFE 有不止一种写法…
括号层数 -1:
node.appendChild(!function (key, value) {
var newNode = document.createElement("div");
newNode.setAttribute(key, value);
return newNode;
}("a", "b"));
括号层数 -1:
node.appendChild(!function (key, value) {
var newNode = document.createElement("div");
newNode.setAttribute(key, value);
return newNode;
}("a", "b"));
二来,IIFE 基于函数,能传参数:
node.appendChild(!function (context, key, value) {
context.newNode = document.createElement("div");
context.newNode.setAttribute(key, value);
return context.newNode;
}(window, "a", "b"));
node.appendChild(!function (context, key, value) {
context.newNode = document.createElement("div");
context.newNode.setAttribute(key, value);
return context.newNode;
}(window, "a", "b"));
duangsuse::Echo
JavaScript 需要另一个方面的改善… 它可以用 Inline IIFE 来应付不能用 lambda 的函数,但太难看了,也不便于设定上下文 context。 node.appendChild((function (key, value) { var newNode = document.createElement("div"); newNode.setAttribute(key, value); return newNode; })("a", "b"));
推荐一个 tco 函数 #JavaScript #FP
目前 bug 很多,我时序逻辑和递归不咋样…… 不过第二天好一点了
这是《ES6 标准入门》上比较困难的代码示例
function _argveq(xs, ys, rb_i) { var i = rb_i | Math.min(xs.length,ys.length);
if(xs.length !== ys.length) return false;
while (i!==0) { --i; if(xs[i] != ys[i]) return false; }
return true;
}
// op tailrec must rewrite its first argument
function tco(op, argveq = _argveq) {
var tailrec = false, cargs = null;
return (...args) => {
if (tailrec) { cargs = args; return; }
else { tailrec = true;
var res0=null, old_cargs; // (reursion manager layer)
cargs = args; // start first L1 rec
// 也可以换成 while(cargs!==null), saved_cargs = cargs; cargs=null; res0=op(..saved_cargs); 反正目标就是『消耗』这次的参数
while(true) {
old_cargs=cargs; res0=op(...cargs);
if(argveq(cargs,old_cargs))break; }
tailrec = false;
return res0; } // Exit tailrec
};
}
你可以拿它写这什么的,还蛮好玩const incre= tco((c) => { console.log(c); incre(c+1)});
const $declen = tco(function (dc, n) {
if (n < 10) return dc;
return $declen(dc+1, n/10);
});
const declen = $declen.bind(null, 1);
declen(1000) // 当然也可以用参数默认值 目前 bug 很多,我时序逻辑和递归不咋样…… 不过第二天好一点了
这是《ES6 标准入门》上比较困难的代码示例
duangsuse::Echo
血本啊…… 现在真的是越来越没劲写代码了。虽然现代啊,是比十年文革的时候强太多了,但是我这样的杯具还总是存在啊。 今天我亲爷又来监督我上学,其实现在,在电脑前我居然好像已经失去了对编程生活的效率和灵感追求了,很可惜……
感觉会越来越不好一样,虽然看起来觉得可以……
其实如果生活不能正常进行的话,能够做自己喜欢的事情意义不大呢。
之前也不是没有成功过,可是如果一个星期只能有一天的时间,就别想我不连续十几个小时坐在这里……
目前,放假的时候和《百年孤独》里某位一样…… 天天粘着不放
但是却什么都不太能干出来
到学校里就百无聊赖,白白浪费一个星期的时间
我已经损失了不少视力,也对身体健康产生了不好的影响,而且学校里需要做的事情是越来越差了
我没办法看 CS 的书,伤心地…… 也不想带手机玩游戏、看课外书,则貌似有不好的效果,好像是已经山穷水尽了
不知道该怎么办,好像做成的事情是越来越少了,如果说『纸上谈兵』的话,每天都有这样的例子,可是实战呢,却一拖再拖,最后不了了之
我真的不是天才啊,要是天才的话肯定不上机也可以有很大的长进,可我的抽象和模拟能力毕竟有限啊!我一个月不敲键盘也会忘记键位的啦!每次遇到麻烦或者不确定一点的问题就已经很令人头疼了,最后还什么都没有写出来!基本功越来越生疏了。
带消磨时间的书去学校,看来没有什么效果,虽然一周过得更快了,但一点用都没有……
活着的目标是什么呢…… 大概就是等永远放假了吧,反正就不要再回去学什么 OO 反应 XX 函数了
我就是觉得什么都可以再简单一些,就是觉得有些东西我不会去学,不知道有没有错。
谁的青春不迷茫?现在才知道不管你是否真正迷茫都难不迷茫,因为迷茫和模糊的人很多,如果不迷茫一点,反而会被环境压得很迷茫…… 你以为现在在玩 video game 看番的肯定迷茫,其实虽然好像是没干什么但至少很充实啊!
我就是想做技术,仅此而已啊,当然是不能自己成全了。
其实如果生活不能正常进行的话,能够做自己喜欢的事情意义不大呢。
之前也不是没有成功过,可是如果一个星期只能有一天的时间,就别想我不连续十几个小时坐在这里……
目前,放假的时候和《百年孤独》里某位一样…… 天天粘着不放
但是却什么都不太能干出来
到学校里就百无聊赖,白白浪费一个星期的时间
我已经损失了不少视力,也对身体健康产生了不好的影响,而且学校里需要做的事情是越来越差了
我没办法看 CS 的书,伤心地…… 也不想带手机玩游戏、看课外书,则貌似有不好的效果,好像是已经山穷水尽了
不知道该怎么办,好像做成的事情是越来越少了,如果说『纸上谈兵』的话,每天都有这样的例子,可是实战呢,却一拖再拖,最后不了了之
我真的不是天才啊,要是天才的话肯定不上机也可以有很大的长进,可我的抽象和模拟能力毕竟有限啊!我一个月不敲键盘也会忘记键位的啦!每次遇到麻烦或者不确定一点的问题就已经很令人头疼了,最后还什么都没有写出来!基本功越来越生疏了。
带消磨时间的书去学校,看来没有什么效果,虽然一周过得更快了,但一点用都没有……
活着的目标是什么呢…… 大概就是等永远放假了吧,反正就不要再回去学什么 OO 反应 XX 函数了
我就是觉得什么都可以再简单一些,就是觉得有些东西我不会去学,不知道有没有错。
谁的青春不迷茫?现在才知道不管你是否真正迷茫都难不迷茫,因为迷茫和模糊的人很多,如果不迷茫一点,反而会被环境压得很迷茫…… 你以为现在在玩 video game 看番的肯定迷茫,其实虽然好像是没干什么但至少很充实啊!
我就是想做技术,仅此而已啊,当然是不能自己成全了。
duangsuse::Echo
JavaScript 需要另一个方面的改善… 它可以用 Inline IIFE 来应付不能用 lambda 的函数,但太难看了,也不便于设定上下文 context。 node.appendChild((function (key, value) { var newNode = document.createElement("div"); newNode.setAttribute(key, value); return newNode; })("a", "b"));
IIFE 是什么,对了以后本频道的维护者都注意一下,提到任何不是小白级别的名词都记得加个注释…… 比如 RAII 你要写 RAII(Resource Acquiring Is Initializing) #Telegram