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
duangsuse::Echo
#py #code #recommend 说到有趣的py接口,有个 iself() def read_as_io(f): class T(io.TextIOBase): read=lambda o,size: f(o) return T -匿名对象 之前写贪吃蛇 snk.c 就用到链表 不想缓冲区溢出的话Vec还是好的。C里你要实现[] 需要懂链表/strcat, rust 里你写 Vec<i32> push 就好了 Rust的生命周期现在基本不需要考虑(尤其是对应用开发时), type infer…
#py 周刊阅读笔记
https://t.me/NewlearnerChannel/12060
https://t.me/NewlearnerChannel/12097

https://www.kdnuggets.com/why-you-should-not-overuse-list-comprehensions-in-python
#code
primes =lambda upper_limit: [x for x in range(2, upper_limit + 1) if  x > 1 and all(x % i != 0 for i in range(2, int(math.sqrt(x)) + 1))]
primes(50)

#拆分后

is_prime=lambda num: num > 1 and all(num % i != 0 for i in range(2, int(math.sqrt(num)) + 1))

primes = [x
for x in range(2, 50 + 1)
if is_prime(x)
]

后面
def flatten_matrix(matrix):
def find_prime_indices(matrix, flattened_matrix):
求和排序的我不想写,因为明显可以用 yield和np.vectorize

# Parse&flatten the JSON string with deep"inner_key" into a Python dictionary
这个也不想,因为用match和递归更常见吧,elif isinstance 是什么py2地狱绘图

https://bernsteinbear.com//blog/simple-python-repl/#:~:text=readline%20API
https://www.skywind.me/blog/archives/2761
如何利用RegExp/创建REPL

出自 https://docs.python.org/3.11/library/re.html
#js #code 当输入 "3 hello 1world" 时展开缩写,并且补齐出现过的词

Lexer=kv=>{
let re=Object.keys(kv).map(x=>`(${x})`).join('|'), mf=Object.values(kv),m,i,j=0
re=RegExp(re, 'gy')
return (s,ontok)=>{
for(m of re[Symbol.matchAll](s)) ontok(
mf[(j=m.findIndex((x,i)=>null!=x &&i!=0))-1](m[j]), (i=m.index), i+m[0].length
)
}
}

f=Lexer({
'\\d+':parseInt,
'[a-zA-Z]+':s=>s,
'\\s+'(){}
})

rep=(txt,on, n=null)=>f(txt,x=> (x==null)?on(' '):
(x.substr)? (on(x.repeat(n)),n=null) :
(n=x)
)

buildAry=(f,a=[])=>(f(x=>a.push(x)), a)

buildAry(rep.bind(0,"3hi 1end")).join('')

因为JS部分都这么长,还是懒得移植到PyExecJS了,总之分词器、括号配对啥的可以靠正则,提供补齐列表也不难

就用 <body ContentEditable>+CSS.hilights 示例吧?
https://jsbin.com/kamufijomu/edit?js,output 😅

参考^回复,这样就有分词和括号配对高亮了?

—续周刊
https://github.com/stickfigure/blog/wiki/How-to-(and-how-not-to)-design-REST-APIs
十多项 REST API 的最佳实践规则,解释了规则的含义及实现
作者嘲笑了几家公司被广泛使用的 API,将它们作为规则的反例。

[Django 5.0 发布了!](https://docs.djangoproject.com/en/5.0/releases/5.0)
新增`Field.db_default` 参数,可设置由数据库计算的日期等默认值;`GeneratedField` 可以创建由数据库计算的列,简化了表单字段相关元素的呈现
FastAPI 已经支持 python-dependency-injector 实现依赖注入的方法。

[kolo VSCode 插件:查看 Django 应用的执行过程](https://github.com/kolofordjango/kolo)
具有帧可视化、漂亮的火焰图、显示执行了 SQL 查询的代码行
[autometrics-py:函数级的指标监测工具](https://github.com/autometrics-dev/autometrics-py)
只加一个装饰器,可检测函数的请求率、错误率和延迟,开箱即用仪表板、自定义告警、运行开销小

https://dev.to/taipy/new-open-source-vs-old-open-source-33k7
10 组在 Python 社区很知名的库的替代库,这里最没争议的估计是 Ruff 替代 Pylint,
其它则还有:Taipy/Streamlit、Polars/Pandas、Dask/PySpark、PyTorch/TensorFlow ……

[Python 借助 Gopy 库实现调用 Go.whl 包](https://last9.io/blog/using-golang-package-in-python-using-gopy/)
https://preslav.me/2023/11/27/python-is-easy-golang-is-simple-simple-is-not-easy/#:~:text=also%20at%20the-,core%20of%20Django,-%2C%20which%20speaks%20to

[对比 Python 与 Rust 的编程习惯用法](https://programming-idioms.org/cheatsheet/Python/Rust) 有意思的网站,可比较不同编程语言在 300 多项习惯用法上的区别
就像 https://component-party.dev/
https://kobzol.github.io/rust/python/2023/05/20/writing-python-like-its-rust.html
从 Rust 中学到的一些编程习惯:使用类型提示、使用数据类代替元组或字典、使用代数数据类型、使用“newtype”、使用构造函数、使用互斥锁等

[Python 工具箱系列文章](https://www.cnblogs.com/shanxihualu/p/17391082.html)
这是一个系列文章,目前包含 31 篇文章,最近介绍的几个工具是数据库相关的:Neo4j(一个 NoSQL 图数据库,使用 Py2neo 操作)、PostgreSQL

[trogon:为 CLI 程序生成友好的GUI](https://github.com/Textualize/trogon)
[当在终端输入“ls”后会发生什么?](https://www.warp.dev/blog/what-happens-when-you-open-a-terminal-and-enter-ls)(英文)
有一道很类似的常见的面试题:“当在浏览器输入 google.com 后会发生什么?”
[solara:一个纯 python、React-风格的ipywidget框架](https://github.com/widgetti/solara)
[用tkinter、PySimpleGUI 和 Jupyter Notebook 播放 GIF?](https://www.blog.pythonlibrary.org/2023/12/05/viewing-an-animated-gif-with-python/)
https://toga.readthedocs.io/en/stable/tutorial/tutorial-0.html#:~:text=()%0A%0A%20%20%20%20button%20%3D-,toga.Button,-(%22Hello%20world
Toga是跨平台的pyGUI
kanban-python:终端中的看板应用程序,和Vue TUI 一样
#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必须登录才能看一样
#js #code 上帝说,要有光? https://rcuv.hkbs.org.hk/CUNP1s/GEN/21/
// ==UserScript==
// @name 圣经高德
// @match https://rcuv.hkbs.org.hk/CUNP1s/GEN/*
// ==/UserScript==

$(document).on('keyup', e => e.which == 39 ? $('.nx').click() : e.which == 37 ? $('.pr').click() : null);
(function(){$(document).on('keyup',arguments.callee)

setTimeout(function() {
'use strict';

let AB={'耶和华神?':'高德', 那人:'亚当',女人:'夏娃'}
// 遍历所有文本节点,将其中的"a"替换为"b"。基于RegExp 和js字典提供一个 replace({a:b, A:B}) (str) 的方法
function replace(str, dict) {
const keys = Object.keys(dict), vals=Object.values(dict);
const regex = new RegExp(keys.map(key => `(${key})`).join('|'), 'gi');
return str.replace(regex, (s,...m) => dict[s.toLowerCase()] || (dict[s]= vals[m.findIndex(x=>x!='')]) || s);
}
function replaceTextContent(node) {
if (node.nodeType === Node.TEXT_NODE) {
node.textContent = replace(node.textContent, AB);
} else {
node.childNodes.forEach(replaceTextContent);
}
}

replaceTextContent(document.body);


},1000); })()


评价:缩进不对的地方是我手改的, 85% 是AI生成的
我一般只用 ()=> , 但用上 on('keyup',arguments.callee) 也挺有意思

AI提供全文替换的方法超过SO上的全部回答(虽然只是dfs

上帝的“帝”是一个相当世俗化的人间概念,用来形容一神教中的那个绝对之神很不妥,属于以凡人之心度god之腹。
关于「耶和华神」「上帝」 有个更贴切的翻译:高德 太原

把god 翻译为“高德”符合基督教中上帝是至高的善的定位,也有利于占据道德高地。
有人说“基因”这个词的翻译是非常绝妙的,“高德”这个词有异曲同工之妙。 😂

// ==UserScript==
// @name 括号树图
// @description 支持括号格式思维导图
// @match *://sketchviz.com/new
// @run-at document-body
// @grant unsafeWindow
// ==/UserScript==

//onclick=()=>console.log(式=read(prompt('括号嵌套')||'1 (2 3) 4'),图(式))
const
read=cod=>{let tok=cod.split(/\s+|([()])/).filter(x=>!!x).values(),
par=s=>{let a=[],x;for(;(x=s())&&x!=')';)a.push(x=='('?par(s):x); return a}
return par(()=>tok.next().value)//^ 一般需配对。此省行数
},
图=t0=>{
let sb=[],写=a=>{
let x0=a[0],x; if(x0[0]!='_')for(x of a.slice(1))sb.push(`${x0}->${(x instanceof Array)?写(x):x}`)
return x0
};sb.push(写(t0));return sb.join('\n')
},
hook=(o,k,f)=>o[k]=f(o[k].bind(o));

let it=unsafeWindow, _1=1
hook(it,'fetch',f=>(url,c)=>(0>_1--)?0: (c=>{
hook(editor.getSession().getDocument(),'getValue',f=>()=>`digraph G{${c[0]} ${图(read(f()))}[shape=${c[1]}}`); editor.setOptions({wrap:20,fontSize:20})
hook(it,'updateGraph',f=>()=>c[2]?f() :0)
it.onload=()=>it.$(".logo").removeAttr("href").click(ev=>ev.ctrlKey? (c[2]^=1) : c[3](prompt('Font,Node0')||'Sans,cds];rankdir=LR;') ); c[3]("Handlee,Mdiamond];")
})(["","",true, function(s){let[fnt,sty]=s.split(',',2);this[1]=sty;this[0]="graph,node,edge".split(',').map(k=>`${k} [fontname = ${fnt}]`).join('\n')}])
||f(url,c))
#learn #js #kt #java 🧵 📥
借机聊下线程、协程间的对应性,以及UI/UX应用与单次脚本间因何不同。(全栈)

调用返回要靠 -Xss 指定大小的线程栈,数组
调用异步要靠 ret() 参数指定的回调栈,链表, 也可以封装为 new Promise((ok,err)=>ok(0)) 。内部执行前都要传入then步骤,但不需要看调用栈
你可以把异步栈保存到[]{}里按需执行,称为调度。协程(async stack)和linux调度器的区别,仅仅是后者能跑死循环(分时复用CPU)
总之 线程栈=调用栈,异步栈=回调栈。

ps|head -n1 这样的管道write() 其实就是yield。这时read()不会等待/dev/disk/的CPU.IO信号,而视ps下一块缓冲的bytes (C对象的Channel)
信号,不是死循环轮询poll,它看注册推送push。不过Looper,HTTP-epoll请求响应 这种ddloop(detect-dispatch) 模式会混合两者
本来,为了不卡死主线每次IO或延时也要 launchThread{b=f.read(); rest(b)} 。封装为 f.read(回调) 就异步了:线程无关
生成器, yield(x, Ret) 会保留首次调用偷偷建的状态机Ret,第二次next(v),调Ret(v如异步结果)后即可返回x。 asyncFn=(args, op=0, Ret=(v)=>switch(op++){} )=>相当于协程对象

主线程sleep()往往要卡死UX,但 yield ret=>setTiemout(ret,1s) 却会立刻返回,同时允许ret()上文切换到其他线程池(ddloop,scheduler)继续执行
造成以上区别,是因为push比poll有普适性,它跨CPU地执行同一个函数,且有event/flow based 范式帮助模块复用。libuv和DOM就是对os.read,sleep.. 跨平台的线程池优化

既然如此,好像有UI+IO两个线程就够了,你干嘛~要多开线程
上文切换,只因,为能更好地压榨多核线程池
DOM代替大家做了划分,为多线提供了内存安全的Worker,但kt,go,py里暴露的技术细节有点多!

线程和 asyncio/suspend 相比有何劣势? linux上进程内是创建慢的进程组(fork)。在不调用OS资源时,永远使用协程"套娃"能减少到内核态的上文切换和内存消耗。像线程池存在的意义,就是免线程创建http连接等单任务
需要mutex锁的独占性资源,用协程读写更节省轮换
单协程轻量到1个回调就能保存,并发控制如 join(coroutineScope),go select,channel 可以用Promise.all,race,postMsg来"阻塞",因为它提供了进程模型所缺少的返回值。
线程即共享内存的进程,无需手动封送(marshall RPC)就能互调用,而json本意是保存会话(对象树)。 如果内存会话和机器都要隔离,就需要 Proxy(by=cookie酷卡/fd句柄) 验证对象API权限了
通过句柄而非密码访问API,是因为句柄能定期吊销,也便于审计。代理有时叫注入,Mapper,绑定

那么jdk19 虚拟线程 又如何? 有100w级的并发1s内完成的低开销,类似py的GIL
但绕过JDK的IO走 JNI Unsafe 读写文件或网络是无法实现异步调度,未实现 suspendCoroutine{it.resumeWith(Ok(0))} 这样的yield的扩展性
var vs = Executors.newVirtualThreadPerTaskExecutor(); //Executors.newFixedThreadPool(200)
for(var Y= new int[]{0}; Y[0]<3;Y[0]++)
vs.submit(() -> { int y=Y[0]; try{Thread.sleep(java.time.Duration.ofSeconds(y*1));} catch(InterruptedException e){}
System.out.print(y + " "); }).get();

最后,再了解经典的「并发模型」 就能读懂90%的企业级服务了

- ForkJoin,MapReduce 如把文件预分块(shader) 读http区间多线程下载
- Actor 直接按函数参数,自顶向下来分块(RPC)
- CSP 是上面说的多进程,靠 Channel<in T>, chan<- T 递交任务,流式的 make -j8
- 线程&锁 互斥资源不能被linux多核调度改乱套了,所以得加锁(synchronized)
#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
#code #cg 今天是3.14 PI 🥧 day !我们用纯 #js+svg在200行以内,完成以下3个特效吧 🦄🌈
- 用WASD操控的网页广告炸弹, websiteasteroids.com 🔘
- 指向你鼠标的emoji 😄
- 可调节内外起伏的,转圈的加载环,多层豪华版 📍

首先,需要引入绝对的主角:表示点xy或速度av的Vec2。有方向,有质量!
https://p5.readthedocs.io/en/latest/tutorials/vector.html#vectors-more-algebra

console.log(x=N2().turn(.5,2), x.a==.5, x.a++) //回滚到0.5!

let L,P,vel, vKbd //画布L 点P 速度v
function draw() {
background(220);
P._p(vel); P._lim(L); if(P.x<0||P.y<0)vel.v*=-1//进1步并检测碰撞
P.i(translate);rotate(vel.a*2*PI);text("⇨",0,0)//(1,0) 时a==0
}
function setup() {
vKbd={w:N2(0,-1),s:N2(0,1), a:N2(-1,0),d:N2(1,0), q:-.1,e:.1}
L=N2(400, 400), P=L.__.mm(2); vel=N2(0)
L.i(createCanvas)
}
function keyPressed(k) {
(k=vKbd[key]).turn? vel._p(k) : //to(k)
k? vel.a+=k :0
}

N2=(x,y=x)=>new _N2(new Float32Array(2),x,y)
data=(kv,T)=>{
let s=(T+''), sub=(s,f)=>s.replace(/(\w+)/g,f), kvs=kv.split(','), cg='',
vec=(k,v)=>`${k.substr(1)}(v){let a=this._,i=${kvs.length-1};while(i-->0)a[i]${k[0]}=${v}; return this}`
if(kvs[0]=='_') {
'+p *pp -m /mm %lim \tto'.split(' ').forEach(k=> cg+=vec(k,'v')+'_'+vec(k,'v._[i]'))
kvs.slice(1).forEach((k,i)=> cg+=`get ${k}(){return this._[${i}]}set ${k}(v){this._[${i}]=v}`)
}
T=eval(sub(s,(m,k)=>kvs.includes(k)?`this.${k}`:k).replace('{\n',`{constructor(${kv}){${sub(kv, `this.$1=$1`)}}`+cg))(); this[T.name]=T
}

data('_,x,y', ({cos,sin,atan2,sqrt,PI}=Math,tr=2*PI)=>
class _N2 {
get a(){return atan2(y,x)/tr}
get v(){return sqrt(y**2+x**2)}
turn(a,v){x=v*cos(a*tr);y=v*sin(a*tr); return this}
get __(){return N2(x,y)}
i(f){return f(x,y)}
set a(a){this.turn(a,this.v)}
set v(v){this.v1(); this.pp(v)} v1(){let v=this.v; if(v!=0)this.mm(v)}
})


emoji矩阵

let Pa, dPtr=1
setInterval(()=>dPtr=random(10,40), 3000)
function draw(){
clear()
Pa.forEach(([x,P,a])=>{
let d=N2(mouseX,mouseY)._m(P)
push();P.i(translate);rotate((d.a+.25)*2*PI); a.x=d.v%dPtr; text(x,0,a.x); pop()})
}

function setup(){
skins=['\u{1F3FB}', '\u{1F3FC}', '\u{1F3FD}', '\u{1F3FE}', '\u{1F3FF}'];
emj=[['👩', skins],['👨', skins],
...[...'🧘🫅👷👮👰🤵🫅'].map(x=>
[x, [...skins, '‍♀️', '‍♂️']]),
['👩', ['\u{200D}\u{1F9B0}','‍♀️']],
['👩', ['‍⚕️', '‍⚖️', '‍✈️']]
].map(a=>emojiVars(...a)).flat()
let L=N2(400,400), mid=N2(.5)._pp(L), m=8
L.i(createCanvas)
Pa=emj.map((x,i)=> [x, N2(i/m>>0,i%m).pp(40)._p(mid).m(140), N2(1,0)] )
}

emojiVars=(base,[m, ...m1])=>!m1.length?[base]: emojiVars(base, m1).concat(/\p{Emoji_Modifier}/u.test(base) ? [] : emojiVars(base.replace(/\u200D|$/, m + '\u{200D}'), m1));


转圈的花色环

let L0=400,L, A,B, tr=P=>P.turn(random(1), L0)._p(L).mm(2)
let L1=420, cir,pt
function draw() {
tr(A);tr(B)
let i=2, d=(A.__._m(B));
stroke(lerp(cir[0].value(),cir[1].value(), d.v/L0), 50, 100, 15);
while(i-->0)line(A.x,A.y, B.x,B.y);
P.a+=.01+pt.x; P.v=(P.v+pt.y)%L0 //习题:为何负P.v不向内扩?
fill(random(360),100,100)
L.__.mm(2)._p(P).i((x,y)=>ellipse(x,y, 10,10))
}
function setup() {
L=N2(L1); A=N2(0),B=N2(0), pt=N2(.1,0)
P=N2(0,L1/2), cir=[createSlider(0,360,15),createSlider(0,360,340)]
L.i(createCanvas); colorMode(HSB)
}
function mousePressed() {
pt.x=mouseX;pt.y=mouseY; pt._mm(L)
pt.i(console.log)
}


请在 https://editor.p5js.org/ 执行,注意保留N2= 以下的库定义。 🤗
另外,对比一下 https://vorg.github.io/pex/docs/pex-geom/Vec2.html
的实现行数,本文在手机上也就是1屏
至于扩展性、调用难度上就见仁见智了
功能上推荐 http://victorjs.org/
#js 后端 https://elysiajs.com/
import { Elysia, t } from 'elysia'

const app = new Elysia()
.patch(
'/user/age',
({ body }) => signIn(body),
{
body: t.Object({
name: t.String(),
age: t.Number()
})
}
)
.listen(80)


Against SQL lisp (🔥 Score: 152+ in 2 hours)

Link: https://readhacker.news/s/4Qg7v
(select
(where
(left-join
(table posts)
(table authors)
(fn (posts authors)
(=
(column posts author)
(column authors id))))
(fn (col)
(<
(as 'date (column col posts updated))
(make-date 'ymd 2021 1 1))))
(make-cols
(flatten posts)
("author-name" (column authors name))
("author-icon" (column authors icon))))

😱 🌐
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…
— CLI程序服务
getopts; complete 用于获取短参数和提供补齐。少数人用while shift/read;case 来解析
还有一个select in ; do,和py2 print 是异曲同工之败笔,请
->展示zenity的所有功能,并生成一个简短的MC风格的文字冒险

#!/bin/bash

while getopts ":n:s:err" opt; do #?未知 :空
case $opt in
n) n=$OPTARG ;;
s) s=$OPTARG ;;
err) isErr=1 ;;
esac
done
printf "%d*%s E%d\n" $n $s $isErr

ycm() {
local cur prev words cword
_init_completion -n = || return

case $prev in
-s) COMPREPLY=($(compgen -e -- "${cur}")); return 0 ;;
*) COMPREPLY=($(compgen -W "-n -s -err" -- "${cur}"));;
esac
}
complete -F ycm $0

使用 chmod +x a.sh; . a.sh 注册后./执行 即可Tab补齐

⭐️ #js #recommend bashrc
#允许拖放文件夹+远程 uc ls=wget
shopt -s autocd
uc(){ eval $(node -p 'gc={"?d1":"--depth=1","?dn":"--recurse-submodules","":""}; process.argv.slice(1).map(s=>{try{u=new URL(s),s=/^git/.test(u.host)?
`git clone ${gc[u.search]} git@${u.host}:${u.pathname.slice(1)}.git&&ls -td */`:
`wgetHL ${u}`;s=`$(${s}|head -n1)`}catch{}return s}).join(" ")' $*);}

wgetHL(){ python -c 'import pip._internal.cli.progress_bars as PB, time,sys, subprocess as P,re,functools as F
def hear(sh,vp):
nvp=len(vp)
for s in (po:=P.Popen(sh, stdout=-1,text=True,shell=True)).stdout:
for k,v in enumerate(vp):
if nvp==0:yield po
if not isinstance(v,str)and (m:=v.match(s)): vp[k]=m.group(1); nvp-=1
for po in hear(f"LANG=C wget -dc {sys.argv[1]} 2>&1", vp:=[*map(re.compile,sys.argv[2:])]):
time.sleep(1); f=iter( F.partial(open(vp[1],"rb").read,1), b""); print(vp[1])
sys.stdout=sys.stderr; [*PB._rich_progress_bar(f, bar_type="on",size=int(vp[0]))]
po.wait()
' $1 'Length: (\d+)' "Converted file name.*-> '(.*)'";}

#help真太烦人! mans(){ [ -z $(command -v $0) ]&&command-not-found $0 ||对$0依次使用 --help,-h,tldr,man,man -k  }
mans() {
[[ "$@" =~ / ]]&&cd "$(mkdir -p $@;echo $1)" ||(ev=MAN$1;[ -n "${!ev}" ] &&${!ev} "${@:2}") ||
([ -z $(command -v $1) ] &&command-not-found $1) ||(
for opt in "--help" "-h"; do $@ $opt 2>&1|mansHL &&break; done
sleepHL 2 &&for doc in "tldr" "man" "man -k"; do $doc $1 &&break; done
)
}
alias ?=mans grepp='grep --color=always -P'
#export COMMAND_NOT_FOUND_INSTALL_PROMPT=1
MANimport='pip install -U'; MANjs='sudo npm -g i'; MANdoc='docker pull'
MANfmt='[[/(?<=\s-[\w-.]+)(( | ?[=<\x27[])[^\s:,,]+)/g, 36],[/,? ?(\s-[\w-.]+)/g, 32],[/([A-Z][A-Z0-9_]{2,})/g,34]]'
command-not-found() { sudo pacman -S $@ ||pacman -Ql $@|grepp '/etc|lib/'; pkgcSel $1; return 0;}
mansHL(){ node -p "$MANfmt.reduce((str, [A, B]) => str.replace(A,\`\x1b[1;\${B}m\$1\x1b[0m\`), process.argv[1])" -- "$(cat)"; }

sleepHL(){ python -c "import pip._internal.cli.progress_bars as PB, time,sys
def delay(xs,dt):
for x in xs:yield x;time.sleep(dt)

dt=$1*10;t0=time.time()
try:[*PB._rich_progress_bar(delay(iter('?'*dt),.1), bar_type='on',size=dt)]
except:print(f'{time.time()-t0}s :) cancel'); sys.exit(1)";}

zenity-sel(){ s=`cat`; test -n "$s"&&zenity<<<$s --title "$1" --list $(eval echo --column={$2}) $3;}
pkgcSel(){ k=$(pkgconf --list-all | grep -P $(sed 's/lib/(lib)?/' <<<$1)|sed 's/ \s*/\n/'|zenity-sel "Debug package $1" cffi,usage)||return
for fp in $k $1/$1 $1 $k/lib$1/$1; do cpp -undef $(pkgconf $k --cflags-only-I) <<<"#include <${fp}.h>"|grep -v '^#' >sel.h &&break; done
(sleep 5&&sed -E 's/__attribute__[^;]*//g;s/__(inline|restrict)//g;s/typedef .*va_list.*//g;s/\w*va_list/.../g' -i sel.h)&
echo "import cffi; ffi=cffi.FFI();ffi.cdef(open('sel.h').read()); C=ffi.dlopen('$(pkgconf $k --libs)'[2:])"
#fuck u cffi, what <cdata>? Is strconv&cdef(errItem=ignore) that hard?
}

这样,您可以快速阅读调用帮助: for c in python node ruby lua "kotlin -h" "git init" pip sed awk grep nano bash;do ? $c; done
或者,下载存储库及文件 uc cd https://github.com/hyprwm/Hyprland?d1
uc ls https://mirrors.ustc.edu.cn/xbmc/releases/android/x86/kodi-20.2-Nexus-x86.apk

切换文件夹 ? a b/{1,2} c/ (在jupyter)安装依赖 ? import srt
🎁 允许用py调用系统上的.so 库如 pkgcSel caca alpm

作业:用文尾的知识,为mans编写自动补齐生成
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啥的

总之就是确定最小问题是什么,然后组合、复用、降低复杂度来换算法的高效能
#py #js #bin
不过你的下一个项目可以用 fitUint(nBit, obj,key){if o[k]undef or isF5:read else write} 这样的读取模式

能read,能解码,但是不能编码,听起来有点奇怪。 printf/scanf 都不是这样的

你明明知道一个struct的结构,能够免费实现load(),却无法修改保存你读到的东西,这不奇怪吗?

好吧,对工程界这是基本操作。Reader/Writer嘛
因为一般,人们只是把bin搞成JSON,而不会反过来,二进制都是旧程序员输出的东西了

struct datefld {unsigned short day : 5, month : 4, year : 14; };
https://en.cppreference.com/w/cpp/language/bit_field

那有没有可能按buffer读,但是对unaligned read,换bitfield(64)?
这样手写let x=readU8() ret{x} 的样板代码也会减少

py就有一个 cStruct
format = Struct(
"signature" / Const(b"BMP"),
"width" / Int8ub,
"height" / Int8ub,
"pixels" / Array(this.width * this.height, Byte),
)
https://construct.readthedocs.io/en/latest/intro.html#example

d = Bitwise(Struct(
Padding(2),
"x" / Flag,
Padding(5),
))
d.build(dict(x=5))
b' '
https://construct.readthedocs.io/en/latest/bitwise.html#bitstruct

ffmpeg那样开源又sota的系统工具太少了

我觉得jspy这些的API没做错,py这封装不是很完备么?只是习惯于类比文本和二进制的dev太少了,都是被迫在写

Hz写过ASN.1吗听说很快 还支持惰性XML

这玩意的stdint好像还是msdos的命名风格,真的直接按byte数定义binfmt不好么

其实穷人用 https://apps.kde.org/zh-cn/okteta/ 也行
还是Qt那帮人聪明,堪比ms
Forwarded from duangsuse
哎,没有心情看 #kt #book
看了下codegen技法,只能说近十例子里anko的风格相对优越,和html一样是用twig(类似erb)模板,然后作者函数复用还行,但也没有到90分的程度。

例如“贯穿全文”的DeepCopy(x:T)吧
js里相当于x就是T的反射,又一切皆可变,可以直接读写{...x}[ID], 只需
mapEachMember{if(it.isPrim) it else DeepCopy(it)}

kt里需要用构造器复制,先拿到 T.vars[ID].get(x)而非 x[ID],但依旧是 mapEachArg{getattr(x,it).primOrCopy} 的模式,这个至少适用于 Tuple$N的toMut和url参数绑定
这就是个小学算法,反射和List API 的良莠不齐却让它很难看。

重要的是独宠XXpoet 真的无力吐槽,和那个 https://t.me/dsuse/17514 一样,就一个不用导包,然后自带formatter。简直可以说是一碟醋级别的算法,甚至应该叫搞错重点

和我的tkgui https://t.me/dsuse/19768(py基于getattr等元编程,运行期生成等效调用赋值图代码)
都没法比,何况最近我在设计表达式级(fun{}内计算图)都能建模的跨语言、带裸类型推理、动静合一OOP元编程范式了,这种拙劣的"xml模板"实在写不起来

java确实是“病态类型”,而非什么静态检查。 连数据树的验证和walkDeep都要靠魔法,有什么资格谈类型签名的那些好处?
靠被默认值参数替掉的重载吗?

只能说,如果手头有电脑,我应该去吧那个sql dsl写了😒 而不是在这看java人像手写sql或xml那样拼接字符串
不知道 unquote(ast) 这种函数式代码生成,起码吧 quote(litOrID)做一下,免得被注入弄出无效代码啊

再说说全书结构,首先就没有谈元编程是什么,而是java老三套:环境配置、难题、抄代码

好吧,可是一个优秀的老师应该选循序渐进,但却对知识体系至关重要的例题: #learn #plt

- 为什么是靠C的#define 自主研发出易语言?预处理比str.replace多了哪些? 高亮分词后,灵活解释“常量字面”吧
> eval("[1,$x]") 是一种JSON解析器,可是x="][0]"时似乎有bug。 修好它,然后把js爆改为你希望的“易”语言(复用猜数游戏的REPL)。 完成后类似的bug应该仍然存在!
其实,js源码也有它的JSON.parse,它就是反射的原型。
- 比较下SQL的'?'、C printf、ERB/ES6模板,kt元编程最缺少的语法为什么反而是"$str"? 控制变量,就能明白pwsh和ts为何比bash和js有长期编程时的优越性

- if os==nt6: class: 与#ifdef _WIN7 凭什么是同构的? 动态类型,依旧是Java式的类型。宏,并不需要魔法
- 为什么Java8让 invokedynamic负责创建lambda,getMethod不也能.invoke吗
- 局部fun 一定要 ::引用的背后,藏着一种元编程,T.(A)与(T,A)->、(T?)!!的强转背后也是! 原来除了消除重复,她还让语言提供更有价值的“值类型”
- 为什么“闭包是穷人的对象”? C语言里回调函数去哪了?SAM接口又为何比到处new.object{}流行? 原来返回函数、重写接口也能费内存啊

- 为什么pyjs里很少人研究元编程,但却又有 python-future.org 与vue,babel这样的全民应用。 二者有何区别
- Proxy(obj)掉包属性,是动态类型元编程的专利吗? reflect.Proxy 能生成函数,还不止于DSL或AOP!
- 能不能通过函数重命名,用py风格的反射API实现KAPT的 @decorator ?哪怕只是封装Reflect?这能让你学习跨平台移植,收获超越本次需求的心智模型和视野
- Kotlin对dynamic类型表达式链条的“零修改”生成规则可以怎么实现,numpy里也可以吗? 这能帮你理解DSL和编译优化的本质

- “优秀的程序与其读写数据的结构直观对应”。纯函数式编程(例如rust的enum和if let) 做对了什么? 为什么你仍然选择不够纯的Kotlin? 这种enum能表示JSON乃至HTML的序列化结构。
- bash风格的参数有3种,其中一种如 ls -ar(all reverse) 传入enum:BitSet。用fun demo()出完整函数签名
- 以上问题和codegen无关,也没有教你具体怎么生成url/json/sql绑定类或函数,却给你了设计相关框架的能力!这次由我来回答,为什么javapoet是对pyjs里闭包list/dict的拙劣模仿,以及反射调用为什么就是在codegen!

所以。。 虽然《Ruby元编程》教你的只是一些OOP特性的“工作原理”,而案例较少,但我更喜欢它 --它让读者真正建立起了对"class"这个dict的理解,加上dyn(*arg,**kw) 本就可以用名字动态查,让读者对“把def和class 视为一种constObj去查询、实现复制粘贴、...”有了把握

而不是一个看似什么搞法和IR,ASM都贴出来了
实际上对你没有用,只是让工作失去焦点的troublemaker🌚🌝
#dalao https://www.kxxt.dev/blog/programming-thoughts/2022-04-16/
https://lutaonan.com/blog/code-artists/ #ai #dev 第二次提及了,不符合刻板印象的 #js👍
把 AI 当作是你的员工,就像某一天你突然只需要 $20 一个月就能招无数多愿意帮你打工的人,你很快就会发现,你最终会面临两种局面:

局面1:你将手足无措,你突然发现如果你不是实现函数的那个人,你就不知道你应该做什么了。从前你沾沾自喜的手写快排,手写红黑树突然变得一文不值,无处施展。
局面2:你将如虎添翼,你突然发现你曾经有很多想法没有精力和时间去实现,现在突然有这么多廉价劳动力将不厌其烦地帮你写代码

在这里我要申明,这篇文章我是写给有一定经验的程序员看的。对于没有什么经验的程序员,多写点代码总是好的
就像下面这个例子,我只要说一句 add tanstack query provider 就能让 AI 帮我把 @tanstack/query 加到我的程序里,但如果你没有任何代码经验,你连 query 是什么都不知道

#sql
https://github.com/duckdb/pg_duckdb
https://github.com/asg017/sqlite-vec
#asm C语言的变量符号
https://t.me/kaedeharakazuha17/3548?comment=26435
https://evian-zhang.github.io/learn-assembly-on-Apple-Silicon-Mac/1-底层的整数.html
https://nan-archive.vercel.app/debugger
#bash
https://github.com/kxxt/tracexec?tab=readme-ov-file#origin
可是 stra execve 也可以
alias stra='strace --quiet=attach,exit -f -e "signal=!chld" -e'
#js #code https://blog.axlight.com/posts/how-valtio-was-born/ jotai作者的博客

React 虽然很流行,很“FP”,但我不得不指出,它对“不可变”或者说「静态」的理解是有问题的…… 这点上居然输给了被它打败的MVP,MVVM等八股文

div(input(n=0)) 包含可变状态吗? 许多人觉得n是一个变数,那么, class ModelThis(var n=0) 凭什么能被称为「静态类型」呢? 视图的模型,到底是静态还是动态?

React 没有意识到,作为一个框架的职责,是维护JSON所对应的HTML模板;而函数式的作用,仅限于用mapfilter取代 forif 这些缺乏表现力的套路
“不可变”并不包含更多的超能力,实际上,它只是对「静态结构」的误解。JSON总是可变的,但它的Schema(struct,'type':union..)则永远是固定的!

集合类型,也包括函数,都能包含树洞。只要你定义了字典与HTML里树洞间的「对应关系」,并不需要什么设计模式就能秒杀各种UIUX。

>https://gist.github.com/duangsuse/c2703fae87c92826a482ef2dd9f523c6#file-note-woj-js-L35
口=holey
let A=口(0), B=A(x=>x+1)
A(2)

JSON.stringify({A,B}) //B: A+1 永远成立,无论保存在什么结构里
el(doc.body, el("div",{onclick:A((x,to)=>+x+1)}, el("input",{value:A}), el("u",B)))


这样就是一个Counter了 (代码比较烂就不贴完了,许多相关数据结构都还在设计中…… 相信最终会很优雅

我在React里看不到这种“口->口”(对象和箭头)构成的范畴,所以说它纯函数在哪呢?

如果React是基于关系式列表字典设计的,它只需要请 cage({n}) 把app所用到所有的洞锁起来就可以达成“状态树持久化”
何必解决什么View可变性的挑战?

btw. 冷知识: F12 是怎么显示函数源码 ƒ Object() { [native code] } 的? 🧐
https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/ui/legacy/components/object_ui/ObjectPropertiesSection.ts
https://github.com/ChromeDevTools/devtools-frontend/blob/main/front_end/panels/event_listeners/EventListenersUtils.ts