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

技术相干订阅~
另外有 throws 闲杂频道 @dsuset
转载频道 @dsusep
极小可能会有批评zf的消息 如有不适可以退出
suse的小站(面向运气编程): https://wojs.org
Download Telegram
duangsuse::Echo
#py 周刊 #recommend #tool 带有 "Android 子系统", taskmgr,... 的网页版Win12 demo 🎨 #algorithm Hello Algo 多语言实例 #tool EasySpider +可视化编程 #android 高级包管理器 js: await using fp = openFile() Flask 深入探索: 请求上文、会话、CORS fastapi-users:开箱即用的 FastAPI 用户管理库 Django 发送带有验证链接的电子邮件…
#web 前端真的是需要新血液了…… 连个绝对定位和drag,resize 都那么稀罕
https://zhuanlan.zhihu.com/p/654984542


htmx 也是魔怔了,React(SSR组件)确实烂,但把烂代码放在node侧,那也是一样的,而是是反直觉的。 Vue都算最良心的了

htmx 在Django, Streamlit 之类爆火可能取决于前后端谁主场的问题, 反正我会站JS,py和直连DOM比谁更成熟不用说的

Van 支持 hydrate 了,好吧…… 好像只+1行代码 ,看起来就是纯replace
init: Number(dom.getAttribute("data-counter")),


再看到 interface Props {const{} = van.tags 我有点失望,不过 link({rel: "icon", href: "logo.svg"})
确实比 link(wKV({})) 好看,也更一致…… 很多接口要定型了。😐

本来我想去建议Tao加个 state(0)(x=>x+1) 的用法,因为只有非JSX非模板的框架,能用好这种写法
后来觉得算了,只支持“选中”也怪割裂的,何况它的列表模板还在用map 甚至不支持真正的hydrate,可以遇见到它以后也很难支持:低抽象度这时是缺点。Van和Eqv差得太多了
duangsuse::Echo
还有一些FP的错误 #design »=: (我们知道,OOP对象 constructor() 就是一个“多方法函数”,等同 when(arg0, {run:(self)=>overridedFun ,.})的闭包。是这样的「高阶函数」 - 函数作为值并不稀奇, 相反,滥用 partial(f) 与compose而非this链来隐藏参数,虽等价于 obj.bind.f ,却是一种无序亦无类型的表达习惯。typeclass是和C一样的无心智模型,这种散漫 不值得被崇拜 Python,Rust,Go 都…
https://www.zhihu.com/question/631144121/answer/3299457578

#js #java #web #news React系还有一张刁图,让我感叹 sql`${}` 居然都能成为稀奇事(虽然之前我想用但没找到包。貌似用BaaS有 prisma
目前还只有JS能做str安全注入

当然20年前C#就支持ASP, Razor还支持 <button formAction="@( () => await Db( $"INSERT INTO Bookmarks VALUES ( {slug} )" ) )" >

前后端同构当然更合理(并不是像PHP那样的伪共用),但不要区分use client和use server更好

原来Javaer才意识到自己只是 CRUD boy??
#js #ai Discord 其实Web版直接按 Ctrl+L 右方向 输入 "/0" 回车就可以跳到一楼
https://support.discord.com/hc/en-us/community/posts/360032043971-Scrolling-up-to-the-beginning-of-a-conversation

找了一下,发现全端都有这个 oldest message 看不到的问题,一般靠搜索和手动滚 😅
用机器人的话,可以每天对top10频道 pin message#0

请用 discordjs/rest 实现获取论坛A 的 top10个频道并 pin their message#0

const { REST } = require('@discordjs/rest');
const { Routes } = require('discord-api-types/v9');

const rest = new REST({ version: '9' }).setToken('your token here');

// 获取论坛A的ID
const guildID = 'your guild id here';

// 获取论坛A的所有频道
rest.get(Routes.guildChannels(guildID))
.then(channels => {
// 按照你的标准对频道进行排序并获取前10个频道
const top10Channels = channels.sort(/* your sorting function here */).slice(0, 10);

// 对每个频道执行固定操作
for (const channel of top10Channels) {
rest.put(Routes.channelPin(channel.id, '0'))
.then(() => console.log(`Successfully pinned message in ${channel.id}`))
.catch(console.error);
}
})
.catch(console.error);

> 请实现userscript(用于Discord): [aria-
label="子区标题"].ondblclick= location+='/0'
每次 transitionend时若url包含 /threads/ 注册此函数

#web 😅 scroll to top 都没有但有滚到最下和 Adv. Search 也是逆天,就像disc必须登录才能看一样
duangsuse::Echo
#py #tool 浏览器缓存 图片 爬虫 python a.py 'x\.com' 200 ~/.cache/chromium/Default/Cache/Cache_Data/* python imgdump.py 'www' 100 `ls --sort time --reverse ~/.cache/chromium/Default/Cache/Cache_Data/*` #code import re,struct, os def ls_cache(urlRegex, kbSizeMin,…
#security #linux #reveng https://mastodon.social/@AndresFreundTec/112180083704606941
https://boehs.org/node/everything-i-know-about-the-xz-backdoor
https://twitter.com/Blankwonder/status/1773921956615877110
发现后门的人还只是一个 pg 社区的开发者


#tool srt 我来示范一下怎么获取全集字幕吧,《国宝特工》
>准备ASR服务+降噪优化
pip install -U openai-whisper demucs

>下载视频全P
yt-dlp -f0 https://www.bilibili.com/video/BV1Rx411j7aw?p={1..52}
>ffmpeg concat all m4a, start seek 110s, to wav 16k
audcat() { for f in `find *.$1|sort -n`; do echo -e "file '$f' \ninpoint $2"; done>ALL.txt; ffmpeg -f concat -safe 0 -i ALL.txt -ac 1 -ar 16000 -sample_fmt s16 -y ALL.wav; }
audcat m4a 110s
>去BGM
#demucs --two-stems vocals ALL.wav; mv separated/*/vocals.wav ALL.wav
#因为配置低就不示范了
>20M一个文件夹(24min一集,建议5集一批), 用同样原理把{1..6}/a.srt 收集回来
find *.m4a|sort -n|pr -aT -10|nl|xargs -L1 ruby -e'puts "mv "+ARGV.rotate.join(" ")'
mkdir {1..6}
for f in `find * -type d`; do cd $f; audcat m4a 110s; cd ..; done
#find -name *.m4a -exec mv {} $PWD \;

>识别生成中文srt
whisper --model base --language Mandarin ALL.wav
>去除回音代表的行
>transform srt file a (using srt.parse), iterate over a[], when a[i] not in a[i-1:i-N], keep it
for i in {1..11};do echo>>a "# $((i*5))前的5集";srt-process -f print --input ep$i.srt >>a; done

import srt,sys

# Set N value for checking against previous N lines
N = 2

_,srt_file=sys.argv
subs = list(srt.parse(open(srt_file)))
noDup=lambda cap,i: cap.content not in [c.content for c in subs[i-N:i] ]
filtered_captions = [cap for i,cap in enumerate(subs) if noDup(cap,i)]

# Save the result to a new SRT file
with open("ep" + srt_file, "w") as f:
f.write(srt.compose(filtered_captions))


https://pypi.org/project/SpeechRecognition/ 也可以用Azure等云服务
最后,如果能买API Key 的话可以直接用
curl https://api.openai.com/v1/audio/transcriptions \
-H "Authorization: Bearer $OPENAI_API_KEY" \
-H "Content-Type: multipart/form-data" \
-F file="@/path/to/file/audio.mp3" \
-F "timestamp_granularities[]=segment" \
-F model="whisper-1" \
-F response_format="srt"

https://platform.openai.com/docs/api-reference/audio/createTranscription#audio-createtranscription-response_format
#web GPU(类似 waifu4x https://real-cugan.animesales.xyz/) https://huggingface.co/spaces/Xenova/whisper-web
https://huggingface.co/spaces/aadnk/whisper-webui

>#china #ai 代购我不知道,API黄牛倒是不少,但免费的可以薅
据说 Claude.ai 更好,但也封锁了
国区魅力时刻:https://www.bilibili.com/video/BV1ip421U7Qx 大清苏联重现

如果你没有VISA(不能注册Azure的GPT或ASR/TTS),只有微信,可以用 https://openai-hk.com/?i=25623 这个中间商,起步价10块(有更好的推荐请私我.. 😓

whisper-1 0.006美元/分钟 0.0426人民币 每段限25MB
curl https://api.openai-hk.com/v1/audio/transcriptions -H "Authorization: Bearer $OPENAI_API_KEY" -H "Content-Type: multipart/form-data" -F file="@ALL.mp3" -F "timestamp_granularities[]=segment" -F model="whisper-1" -F response_format="srt"
网页版 https://github.com/openai/whisper/discussions/1018
和离线版是一样的

主要是Whisper的听说性价比在目前能算SOTA吧,而且能顺带充一个GPT4和midj(1个问题3毛钱啊)
可以在 ChatHub.gg (Alt+J) 使用代理商的API,各种 client webui, 本地GLM也都能用

我看了一下,淘宝有卖apikey的(openai不让搜了),gpt3 一口价5块,无需帐号。 也能用Whisper服务 🥰
单靠官方APIkey 只能限权,不能量贩,除了虚拟手机卡注册,这大概是公用号.. ( 我当时也很惊讶gpt4可以直接卖key) 现在gpt3栏大街了,我把sk贴出来:
OPENAI_API_KEY= ssk - X6muuhftCItNxCFy6bP7T3BlbkFJlkcCKxV8Js2v3mnoCAtZ
ssk - v4SRWkhYGKu7EoUeIMJuT3BlbkFJFii1vkU3ZCdO7dyoADrG
我当时也很惊讶gpt4可以直接卖key
#think #web #tool
https://cssgridgenerator.io/
https://crocotile3d.com/
https://fixupx.com/Oroshibu/status/1808500235263418441?t=BtGGBHj9jnN2AReHW2VTWA&s=19
三視圖?

有趣的建模工具
帅啊!
螺莉莉的黑板报:
(๑•‌ㅂ•‌)و✧
https://dataset.wav.pub/

https://brython.info/demo.html
https://github.com/Distributive-Network/PythonMonkey
#py
螺莉莉的黑板报:
https://github.com/baskerville/plato/blob/master/README.md

你们 rust 真是啥都能干……

https://www.sea-ql.org/SeaORM/

这东西好用么……求教……

https://gitlab.com/coolreader-ng/crengine-ng

有趣的引擎

https://chinese-font.netlify.app/ font
https://typst.app/universe/package/bob-draw
#svg

https://ivanceras.github.io/svgbob-editor/

#code
duangsuse:
大量复制粘贴十分抽象
list有那么难用吗
难道你没注意到近十行只变了1个参数
AIGC也没脚本化得这么严重吧

我看还是用list first!null好了,这么八股文…… 大家现在都是用get null取代预判has的

这种到处预判的风格,很像你找大佬问问题,先发「您在不在」,他只好回个在,然后你不在线……

表达式化比你想的要多哦:

>Spring如何把 @Autowired T xx; 换为 var xx=find(T.class)

var Ts = [T.class].map( applicationContext::getBean);

你在class{}里加那一堆定义,如果只引用了一次,就完全不应该引用。 到底都是要查bean的

从code smell来看,只使用了1次的变量名是无效的;如果只是为了易读新建变量,只能证明你的helper fn命名的有问题

kt已经有!! 了,还想要更多
Java 一大特色,注解属于元数据,和函数调用有重大区别

duangsuse:
那这是定义“随用随扔”变量名的理由吗
函数和变量是这么用的?
java以省略[""] 为由引入太多常量复杂度的优化了,都要所谓框架来解决

纯粹是make compiler happy,把一个schema弄成它能读懂的class,然后再强转Any来构造class而已

js里一个字典让java用就是这么麻烦,其实能用几次呢? init完就扔了,根本不是性能瓶颈。

注解的本意,应该和py的 @decorator 一样,是接受class元数据的编译期函数才对

而不是等到运行时才去查什么field有哪些@属性 然后逐个.set()

要动态生成一个类型,来获取注入,简直无理取闹。 明明就该在编译期产生Registry.get&fillNew的样板函数

这是属于既把元编程的路封死了,还不让基于注解的注入框架提供统一的“反射”方法

其实jawa懂这个道理,但它偏偏就做得很烂,就会个@Override
duangsuse:
为了编译速度这也太幽默了,其实,jvm作为栈机 基本就是带类型签名的GNU dc计算器,不需要什么编译优化

如果递归下降一遍,校验下类型 生成个push call 就能花什么编译时间,属于是用PHP的方式搞算法了

而且javac的能力还远没有到c预处理器的程度,为了优化? 我看是他们不在乎程序/类定义的优雅性

什么序列化啊,也没有做规范,和py能 import json,yaml,toml,marshal 能比?就一个用来RPC的ObjStream,还被业界遗忘,哈哈

汤姆猫是大专必学

虽然汤姆猫的Biz程度也就比Node http-server强半点吧

所以问题就是Result类型为何没有重载 !!, 让它看起来仿佛只是带有错误消息是null

凭什么!! 只能校验 Type? 呢?
assert也是乐观/悲观路径
Exception也是,为什么不能一起判定了?
还非得搞个ifEmpty, ifBlank.. ifNullOrBlank..
莫名其妙

duangsuse:
这不是废话吗?例如买30天大会员,肯定是30* 24*60*60秒后失效,这才是世俗意义上的电脑时间

看到py关于时间和日期/时差有3个API
我就觉得抽象

audit就是一个不懂AOP的,其实unix可以靠strace审查syscall,win32的 sysinternals.com 也有进程日志功能

与其自己搞个无人知晓的轮子,不如封装别人的,两全其美
把OS的活都包揽了,难道py是要运行在Ring0把内核驱动都带上? 那必须支持啊

绷不住了,抽象程度直逼jawa

一开始就不该搞所谓orNull
默认 first{}!! 就够了

我在js里都是把Error视为object返回值的特例,和null是一个意思
这样就不存在什么orNull orElse的,catch表达式也免了

就是语言设计者对值体系的理解不过关,例如NaN就是numbers的null才对,而不是什么number?
这样才能用统一的方法去报错/换默认值

可悲的是一开始就没把悲伤/快乐路径当问题啊,真是异常搞心态

duangsuse:
幽默IDE
完全相信它的API有一大堆根本用不上的class
忸怩作态的软件没必要去维护

kcp是这样的,可 import ast 自 https://python-future.org 就没变过😋
py只是用:隔离一个表达式先于=执行,就实现了高贵语言们的静态检查

既可以用于静态分析,也能在运行时查看f.annotation ,完备的数据不需要反射

btw. 大佬应该会做一个DSL
Message.invoke{ id==mid }
Message.select{ id==mid }//多项

可是这种写法才是真正的SQL逻辑式

既然Msg(id=)能构造数据, Msg{id==} 就能查询
这不是很合理么 #kt

很简单,如果做得太标准,以至于移植到任何一门语言里都没必要修改的话
就没人给官方docs贡献流量了

duangsuse:
https://www.liuwj.me/posts/ktorm-introduction/
🤔 一个SQL函数.xml codegen 能被吹爆,还有人卖课是我没想到的
ES6里一句 sql${} 解决的东西,哈哈

「没想到他文化程度那么低」……

怎么会呢,语句能缓存,再怎么也比一次加载完dao好

你要是不喜欢,或者不相信语法糖有缓存,可以做成生成函数的形式
例如
updateId=f=sqlFn2{a,b-> Pair{B/b, A/a}}
f("bye",0)

所以说,如果你不相信DSL能被缓存,可以转为生成sql函数的形式啊

这不是MyBatis++ ?

https://github.com/JetBrains/Exposed/blob/main/exposed-core/src/main/kotlin/org/jetbrains/exposed/sql/Op.kt#L184

我只能说,缓存键要么是调用点或次数
要么是函数
似乎很难单独缓存DSL对象,除非对它们的构造器
幸运的是, key eq x 里x的修改能缓存,因为它是参数

https://jetbrains.github.io/Exposed/frequently-asked-questions.html#q-how-to-get-a-plain-sql-query-which-will-be-executed

https://stackoverflow.com/questions/74821893/postgresql-arrays-instead-of-extra-table-in-a-many-to-many-relationship
涨姿势了,以后 1:N用数组json N:N用join

duangsuse: #fp
要是kt能允许编译期生成一部分表达式,就没这问题了😅😅😅

可惜啊, unquote{bash(q(trim("trimedStr")))} 这当然是lisp的专利
其中q() 被生成为一个字面量,就像闭包捕获:
fun bash(s)=trim(s).let:
paste {system(it)}

并没有所谓的编译期,因为编译器能访问所有lib API


0开销不是瓶颈问题,但事关语言的脸面

明明就很有用,可被一些人理解为「并非瓶颈的东西」
然后被rustc拿来完魔法

要我说他们就是傻屌,只不过是把闭包「捕获」的实现方式,改为内联字面量(unquote)
就能轻松突破编译、运行的动静边界,根本没有引入任何新API ,没有什么循环展开和 kotlinpoet javapoet的区别

他们做成什么样了? 正则的缓存还不如py的拿dict查😅