duangsuse::Echo
400 subscribers
3.84K photos
105 videos
574 files
5.07K links
duangsuse技术相干订阅
这是 @duangsuse 与技术有关的发布频道
duangsuse 的另外有 throws 闲杂频道
@dsuset
转载频道 @dsusep
duangsuse 有coding,github,gitlab帐号和bilibili帐号

极小可能会有批评zf的消息 如有不适可以退出

suse的小站:https://piped.stream
ps 另有别名 popf.rip
ʕ•̀ω•́ʔ✧ 🐶🍎🏠生死🐜
(>ω<)岂因祸福避趋之 一鿕
Download Telegram
#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, *cache_files):
key_marker = struct.pack('Q', 0xf4fa6f45970d41d8)
def deco(b):
# header is 8+4+4:keylen+4+ bytes[keylen]
key_len = struct.unpack('I', b[12:16])[0]+4
key = b[20:20+key_len].decode()
body = b[20+key_len:b.find(key_marker)]
if len(body)>kbSizeMin*1024 and re.search(urlRegex,key):
return mstrip(100,re.sub('[\x00/]','', key)),body
mapFiles(cache_files,deco)

mstrip=lambda n,s: s if len(s)<n else f"{s[:n//2-2 -2]}..{s[n//2:]}"
def mapFiles(a, fOut):
os.system('rm -rf png;mkdir png')
for i,file in enumerate(a):
with open(file, 'rb') as f:
if f1:=fOut(f.read()):
k,v=f1
with open(f'png/{i}-{k}', 'wb+') as out_f:out_f.write(v)

if __name__ == '__main__':
import fire
fire.Fire(ls_cache)


你可以逐文件夹拼图: #bash 各种相对路径真的吐了
vcat() { cd $1;a=`find *|sort -n|xargs printf "-i %s\n"`
ffmpeg $a -filter_complex vstack=inputs=`wc -l <<<$a` ../$1.png ;cd -;}
for f in `ls`;do vcat $f;done

for f in find * -type d; do thunar -B $f/*; done #按文件夹 批量重命名
cp-id() { i=1; for x in "$@"; do X=$(basename "$x"); cp "$x" "${i}-${X%.*}.${X##*.}"; i=$((i+1)); done; }

最开始考虑了 https://t.me/dsuses/5305 和binwalk但太慢

mkdir a tar
cp `grep 'x.com' -FRl ~/.cache/chromium/Default/Cache/|find -size +200k` tar
binwalk -C a -D image:png tar/*
find a/ -name '*.png'|nl
#ai #tool #algorithm 对比
我比较了一下三个AI免费码农,发现还是bing稍微有点能力
但实际上还是不如手写的(只需replace(/RE/)1次)可能我问的太杂了,GPT基建还任重道远啊

我也是说可以直接compile() 一个字典来分词
dicts=Object.entries({你:"我", 好:"坏" })
dicts.reduce((s, [A,B])=> s.replace(A,B), "你好" )

这样真的很慢
不过jspy界也确实是天上地下,很多人不会正则只知AC

请编写关键词替换.js
let [str, hint]=subs("这群老 板指鼠为鸭,简直是黄 世 仁" )
dicts=[[{黑:"白", 鼠:"鸭"}, "请勿造谣呦"], [{黄世仁:"人民公仆", 老板:"周扒皮"}, "用词不合社会主义"] ]
去空格匹配,期待 hint=="请勿造谣呦\n用词不合社会主义"
若无匹配回null


这样GPT5应该就能代替程序员写全栈了

> 正则不太适合做这个业务,还是用原汁原味AC自动机,再优化的话研究下GPT的token怎么搞的
GPT确实要涉及到NLP。BERT,LSTM 什么的seq2seq推理技术
它应该不是一个按关键词或简单的权重图来分
只是一个计费手段而已,好像也没法省token
非AI的算法往往更快 也不靠GPU
都是应用层的程序员太垃圾,才给人一种算法很慢的错觉
unity内核的开发者和jspy人根本不是一个级别, 学信号处理和数控的都是魔鬼
>做GPT接入的时候,又套了层向量数据库和Java的注解开关,以优化上下文接口的流量
https://cloud.tencent.com/developer/article/2356967
搜了一下,发现VecDB是用于Fine-tune的知识库文件吧,
通过 openai.Embedding API 可以查找问题相似度,类似人脸匹配,从而实现领域术语prompt
我还以为是要webhook让openai反查的,原来只是prompt工程
#plt #recommend 写了一个类型推导科普
😅 完了,感觉我都要变 yinwang.org
他10年前的抱怨我全都有,而且我比他还少点实践
https://gist.github.com/duangsuse/8fa4ae8c627e5c3c6044522a84ccebf4

还好好搜了一下各种中文blog
没找到好的内容,草
明明各种大学都有开编译原理依照 static typed
做compiler前端的是吃白饭的么? 都在教一些又过时又get不到重点的东西一样

这kt编译期显然不是古早的 Matcher() 那个级别
使用Var()来收集类型信息是 https://tomstu.art/hello-declarative-world 里就有的 unification ,但那个支持dfs,比如解X+Y=1。kt可以直接拟合(fit)
现在的React也开始习惯于「变量作为值」了,不过用Signal()深赋值取代diff的还是去年,发展得挺慢

https://justinpombrio.net/2021/03/11/algebra-and-data-types.html
还是ADT更好看些
https://isomorf.io/#!/tours/of/overview/7/python #tool 这里还提了一个跨语言可视化代码编辑器

https://sokra.github.io/source-map-visualization/ sourcemap 可视化 #js
https://github.com/mozilla/source-map?tab=readme-ov-file#generating-a-source-map eval
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
#ai #tool gpt4客户端直接用 https://app.nextchat.dev/#/
我在 https://openai-hk.com/?i=25623 有个号,想试用 你可以找我问apikey
似乎很简短的算术题都需要0.1元,gpt3是1分钱
duangsuse::Echo
Photo
#science 最近很火那个十万流明手电仅需550W,0.2度可以开20min:
14包邮/XHP50大单体LED 18W=12V1.5A通过USB-A 2.6klm 165lm/W
25包邮/XHP70 30W 12V2.4A 4.2klm 181lm/W https://www.mouser.cn/new/cree/cree-xlamp-xhp70-2/
🌝BV1pZ421y7mg 组装了7粒 28klm,200块200W的成本
已经是只有无人机能找出差别的亮度了(户外手电发烧友大部分都懂行懂DIY)
目前,市价的200lm/w转化率,只有十年前的飞利浦LUXEON Lime, 科瑞XLamp XPL在0.3A气温85。即便不像充电宝容量那样假,也有厂家店家虚标。。。
一些手机带有环境光传感器 #tool https://intel.github.io/generic-sensor-demos/
https://gettopics.com/zh/calc/water-heating-time
https://www.dianziaihaozhe.com/gongju/Wh_mAh/

谈到虚标,
不使用40块的usb/C口电表(或者电流超过12A量程),怎么靠称验货呢?
首先是选「带配料表👍」的可信商家,淘宝更多:聚合物锂电池批发 极品配件之家 炬为CC表 nicun逆变器

2024市价磷酸铁锂、三元铝壳、三元软包 电芯的储能Wh/kg=180,210,*1.2倍
如果同类同重量电瓶/电芯达不到的,充电宝声称自己是,那可能是为电压做串联拉高了成本
如UCI=12v20Ah1C=3S2P*3V10Ah
或者是1260软包比18号,21号圆电芯更便宜、单体>3C动力电芯价格更高(150包邮18Ah,加350W逆变器只需210...)

UCI指标里,C=220Wh 意味着11v2a 22W的投影仪能使用10小时,但热电器大概就带不动。 锂电池除了UCI规格,内阻发热 寿命 自放电 低温容量 也很重要

想通俗的理解锂离子电池倍率越大容量越小(C=20Ah, I=0.5C=10A,同容量标称3C的比0.5最大1C的贵一倍) 可阅读
https://zhuanlan.zhihu.com/p/670353928

#好物 DIY潜水式冰箱(30,半导体-水冷热交换法):
15+9+3包邮/12707 67W温差74+铝水冷头带1m线+40mm铝散热片
5包邮/365泵 8W
并联焊接、AB胶粘合4个原件。串联泵-水冷头之一,另二线挂保温箱外循环

电热管:对120W的充电宝,0.2L洗脸水从26度到60度,花费20分钟,150W电热管耗电<20%
一瓶康师傅烧开, 11.45v-10.7v
20分钟后要断电5分钟,最终耗半小时,理论上是75Wh的电量
duangsuse::Echo
#linux #bing USB共享网络的SOCKS代理? #bash #tool cat>/etc/udev/rules.d/99-usb.rules <<OK ACTION=="add", SUBSYSTEM=="usb", RUN+="/bin/su duangsuse bash -c 'export DBUS_SESSION_BUS_ADDRESS=unix:path=/run/user/1000/bus; (sleep 2;eval `base64 -d <<<ZGNvbmYgd3JpdGUg…
#bash #tool USB 5V pwm/pcm 以及stdio.file命令行科普
https://wiki.archlinux.org/title/Fan_speed_control 使用$ sensors; pwmcontrol 控制风扇

lsusb的基于udev,不适用于sysctlfs 所以查看:
usbdev(){ usb-devices |node -p 'fs.readFileSync(0,"utf8").replace(/T:  Bus=(\d*).*Port=(\d*).*MxCh= 0[\s\S]*?Product=(.*?)\n/g, (_,i,j,k)=>`# ${k} /sys/bus/usb/devices/${+i}-${+j+1}\n`)';}

可以用powertop调
发现2.6内核已经不能调,而且电源也是软关闭,如同 usbguard-qt
不过,如果驱动(rndis..)不对可以 usbreset

无论使用 usbguard list-devices; dmesg|grep udev; sysfs都无法diff到USB LED头的差别

唯一的可能是 rtcwake -m mem -s 60; 需要BIOS支持睡眠断电
以及购买集线器 uhubctl -a off -p 1
https://github.com/mvp/uhubctl?tab=readme-ov-file#notable-projects-using-uhubctl
DEB http://launchpadlibrarian.net/448511434/uhubctl_2.1.0-1_amd64.deb

xurls(){ eval $(node -p 'process.argv.slice(1).map(s=>{try{s=`$(wget -c -nv --show-progress ${new URL(s)};ls -rt|head -n1)`}catch{}return s}).join(" ")' $*);}
alias DEB='xurls sudo dpkg -i --force-depends'
alias RPM='xurls sudo rpm -ivh --nodeps' #应支持 rpm://$(dnf download)

diff <(echo hello world) <(echo foo bar)
pushd $(mktemp -d); $0; cd; rm -rf `dirs +1` #进入临时目录
xdg-mime query default application/x-deb #dbus注册表
#learn #bash with #tool 入门+优质冷知识 😋
图为 asciinema.org/explore 。没有 #linux 的极客可打开 WebVM.io
Linux Deploy; (Mac)Git Bash; winetricks; screenfetch 甚至 bashttpd; pacman/OpenRC init 基于bash

shell 是类似 Windows.ps1 但使用纯文本或行IO的脚本编程语言。 每当你看见awk|sed|grep ,那就是在 #sql select访问属性、文本替换、where过滤了
Dijkstra说,用BASIC编程的人“脑子已经坏了”,作为运维你要尽力避免这一点。用AI写命令思路也是要正确! 😨

因此在思考时,你应当用pwsh的API模型: Get-Date|select Year; dir|?{$_.CreationTime.Year -lt 2024} ,而不止是 date '+%Y' ; find . -maxdepth 1 -type f -not -newerct 2023.12.31
更不是 网关=ip r|awk '{print $3}' 这样的糟粕

— 快捷键 (bind -p|grep '"\\C')
⬆️⬇️滚动历史, Alt/Fn⬅️➡️ 跳词/跳行,Tab补齐, ls \ mydir 或fc:多行命令
nl $HISTFILE|tac|less 默认保留500条可清空
^=Ctrl, M=Alt e=ESC
^M T 打开cmd窗口 ^L清屏 ^D退出
!cd 执行最近1次cd开头的命令, sudo !! 补齐为上一条命令
touch a; ls $_
#操作同一个文件
^a^b 改参数重执行

^U ^Y 剪切和粘贴行,nano同款
*.mp4 ^xg #查看符合正择的文件,免ls|grep
^A# ^E# 意为正则/^$/。script录制时(例如 history 3) 添加注释

^M F1~F6 一般含几个tty串口,通过 echo>/dev/tty2 即w;write,您可以装得像电脑有第二个人在用一样 还需要协作 😅
duangsuse::Echo
#learn #bash with #tool 入门+优质冷知识 😋 图为 asciinema.org/explore 。没有 #linux 的极客可打开 WebVM.io Linux Deploy; (Mac)Git Bash; winetricks; screenfetch 甚至 bashttpd; pacman/OpenRC init 基于bash shell 是类似 Windows.ps1 但使用纯文本或行IO的脚本编程语言。 每当你看见awk|sed|grep ,那就是在 #sql sele…
— Linux与命令行
"外壳"提供了调用软件的人机接口。在 kernel.org 已对内存cpu分时分址复用、解码/dev/sdXY 分区, /sys/内设外设+网 ls {/proc,/sys/class}/net 的基础上。这是DOS.COM 所不具有的
.bashrc 和 etc/XXX.d/ 以run-command而非json注册表的方式配置设置,这既先进又落后。 rc的灵活性远优于yml,但bash的无类型,单全局表 将其化神奇😅为腐朽了(毕竟1971年老古董)
pacaur -S xonsh elvish pwsh
拥有更合理的弱类型API

您的终端通过 ANSI 清屏=printf '\e[2J\e[14t' 来控制显示效果,但对于TUI应用..有少数stdio管道不能实现的接口, https://docs.python.org/zh-cn/2/library/termios.html .iospeed.O_NONBLOCK
->py termios 如何进入非阻塞(游戏按键)模式?编写 key echo demo
->表格出所有ANSI escape,然后函数化为 clear=lambda: CSI('2J'); ...
bash连接到的tty服务器=$(fuser -s $(readlink /proc/$$/fd/0)) ,如 xfce4-terminal;ssh;tmux

— 进程管理
^C终止 ^Z挂起到jobs
htop; powertop TUI监视器
yes sir|tee just-like.dd
nohup zenity --entry --text="请输入您的姓名:" &
tail -f nohup.out
time sleep 1

#记录3态时间的后2Sum是CPU占用率 ,sys时间较高=IO密集型
jobs -l 查看pid; fg bg 继续任务$!, kill -9 $(pidof bash) 杀死

— 命令的组合 &; >< 与括号展开
{cat,echo}|grep #不要这样做! 使用'<'或arg1输入文件常量,'>>', &>/dev/null 赋值文件。尽量不要使用 >

&>fp 即 1>fp 2>&1; freopen了两个换行流文件(stdbuf -oL),就像 import subprocess.Popen(stdin=-1) 它可被读写
less -f /dev/stdin &sleep 1 &&echo>>/proc/$(pidof less)/fd/0 hi
lsof /tmp/; ss; strace -etrace=openat,getdents64,connect ls
您使用lsof即可知道进程打开了什么(网络)文件

表达式if\else
zenity --question --text="确认要执行吗?" && echo "您已确认执行。" || echo "您取消了执行。"
test -f nohup.out &&wc $_

for,case在文尾。 罕见于urls|xargs cat
a=hih;echo ${a:0:2} ${#a} ${a//h/H} $((10/3)) {01..9..2} {good,bad}boy {z..a}

hi 3 HiH 3 01 03 05 07 09 goodboy badboy..
{} 允许并列,嵌套和正择 🥰
使用可嵌套的 $() 取代`` 除了可以调用文字替换API, 还能提升组合力
diff <(echo hello world) <(echo hello bar)
less <<<Good #配合 ruby -p; node -e 胶水使用
JS=$(cat <<OK
heredoc,就像""仍能内插${} ''
OK
)

不过sh系都支持多行字符串
可以手动 tmp=$(mktemp); trap 'rm -f "$tmp"' EXIT

— 目录管理
文件夹名/拖放 转到。不要用cd那个太古板了
mkdir -p 目录/树
ls -lh; tree; du -h 读目录,计算df大小
echo>>a.txt 记录
rm -rf * 清空$(dirs)
^xg #查看符合正择的文件
cp;mv 复制和移动到arg-1即 $_
chmod {+x,755} 设置可执行

set -s noglob 以禁用*正择
可深度遍历
,匹配多个斜杠。正则[0-9]仍有效,但'?' 变成了(.), [^\d]* 成了 *[![:digit:]] ,从find和sed的使用来看😅bash的RegExp是🤡
ls !(*.mp4)
echo **/*.mp4

替换文件扩展名(thunar -B ,不得不说单字符很脑残,何况bash连对象键值都停留在get/set函数名) https://wangdoc.com/bash/string#搜索和替换
fp=a.x.mp4; echo ${fp%.*} ${fp##*.}
echo ${fp/.*/} ${fp/*./}
a.x mp4
a mp4
for fp in *; do [[ $fp =~ \.png$ ]]&&ls "$fp"; done

自至剪贴板
a=$(xclip -selection clipboard -o); base64 <<<$a|xclip -selection clipboard

练习:封装这些功能为函数或basename式CLI工具,加什么参数你看着办,这幼儿园Perl我看着就难受

— sh变量
不支持str和float算式,支持?:
pargs() { echo "$@"; }
pargs x y #x y. 不像argv它不含$0
echo $PS{1,2} #为什么大佬教你要 "$var"呢?试试在文件名里加空格或 echo $(cal) ?牛逼啊,还能SQL注入了!默认语意这么脑残
IFS=":" # read分隔符为冒号, 遍历可执行注册表
for dir in $PATH; do
echo "$dir"; done
export PATH #bash连字符串变量也不默认传给子进程
#有无屏幕, 其实 .bash_login 就是tty-only
(xdotool sleep .1 search --name tty windowsize 100% 100%)& alacritty
[ -z $DISPLAY ]&&startx /bin/sh atty.sh

read id; ${id:=Peter}
read id; ${id:?Oh no Peter}
#不建议用 declare -i c; c=1+2 或let=运算,可以
((a=1,b=2)); array=([2]=c [0]=a [1]=b) #读取 "${array[0或@]}"


— 权限
您的系统通过chown和setcap来管理特权,所有文件通过 umask: ugo(user grp other)三权分立,一般为 644, 755(=rwxrxrx 对于目录x允许进入)
6(rw-)即是位旗 0b100+0b10+0; echo $[2#100+2#10],644以此类推
特别地,wheel 用户组(类似win/droid的SYSTEM) 可使用/bin/sudo 来鉴权到sudo的所有者root。为了防止 LD_PRELOAD注入应使用 visudo 修改配置
find / -perm /4000
列举所有自鉴权模块如su
sudo setcap cap_net_bind_service=+ep $(command -v python)
#允许bind 80端口
# cat /etc/{,g}shadow /etc/{passwd,fstab,sudoers,ssh/sshd_config} 只有root能查看。权力越大责任越小,rm -rf /* 😱享受特权吧!

— 古怪的语法
先前学过java的大佬,会觉得 if-fi case-esac for-done 比Lua和Matlab还啰嗦,这是因为bash采取了shlex 而且和TeX一样不懂变通
if [ ]; then, for in ; do 更像是2条命令(do eval字符串 done) 而不是“块”, forkBomb() { sleep; } 尾分号同理
bash 区分命令和计算的$()也很含糊,但在pwsh上都是 ()
#bash #tool 测一测您的笔电电池,还有多少容量? 🔋
eval `cat /sys/class/power_supply/BAT0/* |grep -o POW.*`
echo $POWER_SUPPLY_ENERGY_FULL{,_DESIGN} 1000/ /p|dc


科普:Li-ion 电池都有百次以上的循环寿命,且其电压U与剩余容量C成反比,要提升寿命,需要在闲置时把电量保持在70%左右

'L16M2PB2' Battery by SMP#14845 ⚡️
IU=16720000 mW
C0=.76C=24160000 mWh
C=.90design=31640000 mWh
U=8373000 mV > 7500000 mV
Lm=100% 💡
nCyc=205🔋
CpW=1.444h

BAT -h
IU=16.749 W
C0=.82C=26.15 Wh
C=.90design=31.64 Wh
U=8.481 V > 7.5 V

😅我对AI的代码复用率和准确性醉了, 大家复制粘贴切勿模仿,1个排版模板浪费了我个把小时
😅 echo */ 可以显示文件夹,但 !(*/) 不能显示非*.* 格式的文件名, 我想对bash作者说你设计glob设了个 🐓……自己都玩不明白还要 find -depth1 😅

另外, /sys/class/power_supply/BAT$i/ 是个完全能 i=select 的主,类如章节选择完全可以绑定为 select '-no' ls [0-9].mp4 ,既能read还能Tab。
有glob匹配您还要做select语句,您也真是 极大方便了应用层啊!?
只能评价为连pwsh都不如, 就像DBus之于COM,完全没有为API user 服务的意识

BAT() {
i=0;eval `cat /sys/class/power_supply/BAT$i/!(*/) 2>/dev/null|grep POW`
st=$([[ "$POWER_SUPPLY_STATUS" == C* ]] &&echo ⚡️)
tput setaf 6 bold;
echo "$(quote $POWER_SUPPLY_MODEL_NAME) $POWER_SUPPLY_TYPE by $POWER_SUPPLY_MANUFACTURER#$POWER_SUPPLY_SERIAL_NUMBER $st"
echo "IU=${POWER_SUPPLY_POWER_NOW} mW"
echo "C0=.${POWER_SUPPLY_CAPACITY}C=${POWER_SUPPLY_ENERGY_NOW} mWh"
tput setaf 1;echo "C=$(echo "scale=2;(${POWER_SUPPLY_ENERGY_FULL}/${POWER_SUPPLY_ENERGY_FULL_DESIGN})" | bc)design=${POWER_SUPPLY_ENERGY_FULL} mWh"
echo "U=${POWER_SUPPLY_VOLTAGE_NOW} mV > ${POWER_SUPPLY_VOLTAGE_MIN_DESIGN} mV"
tput sgr0;
echo Lm=$(echo `cat /sys/class/backlight/*/{,max_}brightness` 10/ /p|dc)0% 💡
echo "nCyc=${POWER_SUPPLY_CYCLE_COUNT}🔋"
echo "CpW=$(echo "scale=3;(${POWER_SUPPLY_ENERGY_NOW}/${POWER_SUPPLY_POWER_NOW})" | bc)h"
}
unit() { node -p 'process.argv[1].replace(/(\d+) m(Wh?|Ah?|V)/g, (m,n,k)=>n/1e6+" "+k)' "`cat`" ;}
https://github.com/cunarist/rinf
https://www.visioncortex.org/vtracer/
由螃蟹驱动的位图描边转矢量工具 #tool svg

https://www.lummi.ai/
https://github.com/adobe-webplatform/shaderdsl

有趣
有趣
http://topcoat.io
搞点传统的 #css
https://github.com/Web-Media-Foundation/infrastructure/blob/master/packages/ogg-polyfill/src/OggVorbisPage.ts #js #bin

隔壁实现完了 Vorbis 的解码前端(只带解编码元信息,不带解成 PCM 的部分),八百多行

https://t.me/im_RORIRI/17034
#statement
其实也不难,只要你知道你程序依赖的领域、最小的功能是啥,解决问题必须先确定范围;知道自己在干什么、与旧案有何区别、又为何不同,才配叫工程。

比如二进制吧,像bmp那样用一个struct就能parse的东西很少,因为C拿指针掩盖了带长数组、也无常量池等规范,但继续用 u/int32_t 那样的概念也没意义,不如叫 +-1 2 4 8 吧。甚至C bitfield也应该拿bitflags换了。
凡是用不到的专业概念,比如bitsize,全部抛弃掉,这样才有机会
避开前人留的坑

除了 read(bView, ['*', [4 4,'Num2 x y']]) 这样的带长数组,struct的json化也可以基于Proxy,以实现0copy序列化、push、sort啥的

总之就是确定最小问题是什么,然后组合、复用、降低复杂度来换算法的高效能
#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查😅
#design #tool https://fixupx.com/stammy/status/1815800758199361629?s=46
https://www.freefaces.gallery/
https://motherfuckingwebsite.com/
https://keyboardsimulator.xyz/

http://interface.watch
https://www.elmo.chat/ #ai
https://github.com/bugbakery/audapolis tts
https://github.com/trholding/llama2.c/blob/master/runq.c
拒绝一切 neofetch #linux
拒绝 NV显卡,非炼丹术士,用不上
拒绝一切 lib32 ( 禁用 multilib ),所以咱和 wine 八字不合
拒绝一切 拖家带口的软件,相比直接安装 shellcheck 会带上一大堆 haskell ,我更喜欢直接去 GitHub 拿二进制文件来用

话说 AUR 源和 homebrew 类似,提供的是食谱,是 midi,不是 wav,不是 bin
所以清华 TUNA 放弃 AUR 没啥问题,反正真正阻止你用 AUR 的是开盲盒般的 GitHub 访问体验

Arch 实际上体验成本不高,archinstall 已经非常可用了,不过在愉快地设置安装前推荐去 /etc/pacman.d/mirrorlist 里把国外源都干掉,国内源留一两个 https 的就足够

pacman 一开始接触会觉得非常反人类
常用的首字母就俩 :
S 从网上
Q 从本地
后面就可以开始叠 buff 了 :
i 列出包信息
y 更新缓存
l 列出包文件
s 找包
还有俩特殊的 :
Rs 删 Rd 忽略依赖地删
F 通过文件找包 Fy 前文 + 更新缓存

炸 grub 不怕,因为压根不用 grub
systemd 的魔爪已经
用 systemd-boot 取代了 grub
用 systemd-networkd 取代了 NetworkManager
grub 引导挂了从启动盘启动,按 gentoo 方法把系统挂上,重新 grub-install 一下问题就解决了​
https://t.me/kotlin_cn/110568 #故事会
duangsuse::Echo
#sysadmin Arch #linux 一次滚挂历程(差一点) *原因:很久没滚,GNOME mutter wm莫名有了键盘焦点的bug。 未使用 -Syu 以至于为一些旧的包 --ignore icu 的升级,谁知xml依赖它呢?另外还 --overwrite'jupyterlab/*' *差点滚挂: 不能 systemctl restart display-manager ; pacman -S 启动不了!而且我的tty1开的是支持中文的 cage kitty (虽然不会bootloop 🙉 并非btrfs…
#sysadmin Arch #linux 一次莫名其妙的boot卡第一屏
ps. #tool #github https://chromewebstore.google.com/detail/webdevauthn 比那些付费垃圾TOTP(sha1 6b) 厉害多了 😅

经过PE验证, $esp/boot/initramfs-linux.img #约40M 莫名其妙成了空文件,必须重新 https://wiki.archlinuxcn.org/wiki/Mkinitcpio -g initr.img
没法直接从其他发行版iso照搬

一看Arch liveCD 都1G多了 😅就选择Alpine,但手里的U盘不方便直接dd,需要 isolinux 启动(应该使用 https://www.ventoy.net/cn/index.html 的)

众所周知, GRUB 采用 1vm+2init 执行Linux,第一次init在内存盘,第二次明明也可以让grub传指针进来(squashfs,iso9660) 却莫名其妙要指定/proc/cmdline 去 find .iso 以便 mount /media/cdrom
Ubuntu 的是 boot=casper iso-scan/filename=/a.iso 但Alpine不吃这一套

因此最终你要对.iso 敲两次代码……

#grub.cfg
menuentry "find iso" {
find --set=iso a.iso
}
menuentry "boot $iso" {
loopback l0 $iso
linux (l0)/boot/vm*
initrd (l0)/boot/initr*
}

然后在毫无文档的init fallback 上挂载

mount /dev/sda2 /tmp #反正不能直接从GRUB里传/dev号,不通用,也不能直接 find -d1 /media ,需要逐个mount..
mount -t iso9660 -o loop /tmp/a.iso /media/cdrom #不能自动探测loop0/cdfs,全默认fat
fdisk -l #输出是正常的,然而mount不是!


然后OpenRC依然会挂,而且连bash都没有(不能用 arch-chroot https://wiki.archlinuxcn.org/wiki/Chroot😅😅

for p in sys dev; do mount --bind /$p /mnt/$p; done
chroot /mnt /bin/bash <<OK
mkinitcpio -g a.img
OK


替换一下 $esp/init*,这样就不卡第一屏
gdbus call --session --dest org.gnome.Shell --object-path /org/gnome/Shell --method org.gnome.Shell.Eval 'Main.lookingGlass.toggle();'

gnome-control-center 也坏了,草,是我的 nm-iwd 导致的
靠这些垃圾发行版还不如USB cdc上网

最后说个冷知识: /dev 树并不是在内核里定义好的
而是由init脚本(udev)创建,在切到第二个init(systemd) 后,看起来就像内核搞的一样 😄
devtmpfs 只是 -o size=固定的 tmpfs
/dev/null 这些统称为内存设备: https://github.com/torvalds/linux/blob/master/drivers/char/mem.c#L696
完整列表见 device.rst

Linux内核的启动参数,主要是 root=/dev/ram0 ,通过pivot_root的新方式都是在可脚本环境下挂载/的
initrd由多个 .cpio.gz 构成,真希望能把.iso 与挂载脚本也加进内存去啊😅😅 为啥非要从u盘
https://run.tournament.org.il/extracting-multi-layered-initramfs/
https://github.com/owenson/tiny-linux-bootloader/blob/master/bsect.asm#L112
http://boot.ipxe.org/ 网络启动

#learn
https://wiki.archlinuxcn.org/wiki/Arch_的启动流程#Getty https://wiki.archlinuxcn.org/wiki/块设备持久化命名
https://mickyching.github.io/kernel/linux-vfs-introduction.html
https://kernel-tour.org/fs/devtmpfs.html
https://github.com/0voice/linux_kernel_wiki/blob/main/文章/设备驱动/Linux操作系统学习之字符设备.md#三-字符设备基本构成

魔数解析 https://ty-chen.github.io/linux-kernel-0x400000/
https://uniondong.github.io/docs/linux/linux_driver_develop_basic/一文秒懂linux字符设备驱动/#21-cdev
https://github.com/torvalds/linux/blob/master/fs/binfmt_script.c #! 的由来
手写fs https://linux-kernel-labs.github.io/refs/heads/master/labs/device_drivers.html

ps. #rust 😅 macro 是教你这么玩的么,简直是对元编程的侮辱 declare_err!(EPERM, "Operation not permitted.");..
一个KV表写成这B样,唉 https://github.com/torvalds/linux/blob/master/net/9p/error.c 都不好意思了
#tool kotlin 命令加速器 https://gist.github.com/duangsuse/50937b30cbf24a6be0eb69da3a7231b3

./catdo bash #export JAVACMD=$PWD/catdo

time kotlin -e 1+1
2
VM .: jstack 331655
2
real 0m2.769s
real 0m3.121s

time kotlin a.main.kts
real 0m1.176s
real 0m1.397s

灵感
>make a mainClass invoker(argv[0]=fqName) in jshell, poll on fqName.txt(NUL-splitted, prepend argv[1:])
if exists, just rewrite fqName.txt, then run reptyr $(lsof -t fqName.txt)
sudo sysctl -w kernel.yama.ptrace_scope=0

use newWatchService to impl watch(Map<Str, Runnable>){}, minimal, in jshell

结果 😅 实现监听就花了大篇,
void main() {
watch(mk(c->{
c.put("a.txt", () -> System.out.println("File modified"));
}));
}

在使用rePTY恢复REPL的标准流时,又发现好像和后台开个终端没区别
因此把焦点放在 main() 的static环境的缓存上,基于pipe实现请求响应
反射的调用省略,总之是单类应用
因为一些莫名其妙的上游bug花了一整天
echo=lambda x:x[::-1]
def bind(f, u=open("a.txt",'wb+')):
while True:
while (ln:=u.read())==b'': pass # see also for fd,ev in select.poll():
u.seek(0); u.truncate(0)
u.write(f(ln)); u.flush() #echo >>

bind(echo)