分类目录归档:佳佳工具

[stable-diffusion-webui]更新所有扩展 脚本

适用于由git安装的扩展,把这个bat文件放在stable-diffusion-webui的目录下,然后执行即可更新所有扩展。(需要电脑上安装有git)

和webui本身自带的更新功能相比,这个脚本的优点是所有扩展是并行更新的,比webui那种一个个的更新快到不知道哪去了。

注1:更新扩展前请先关闭webui。

注2:并不建议没事去更新插件和webui本体,因为这些项目的更新和合并都很随便,并没有严格的兼容性测试和问题测试,所以有一定的概率更新完就不能正常启动了。

[expressjs]捕获路由和中间件的异步错误

express本身可以写async函数作为路由或者中间件(以下简称路由)使用,但如果在其中直接抛出异步错误的话则不会被捕获并传递给错误处理路由,需要在每一个async路由中手动写try/catch来捕获并处理错误,这显然对于拥有统一错误处理逻辑的框架是不友好的。

我不知道为什么express始终没有在4.x版本添加这个支持,看起来这应该并不会导致什么兼容性问题,即使不默认全局开启这个功能,也可以添加一个选项或开关函数来允许使用者开启异步错误捕获,但它始终没有这么做。

在这之前npm上也已经有一些可以实现这个功能的补丁包,不过它们几乎都是给创建出的app实例的所有相关路由方法套了一层壳在里面try/catch错误,导致如果是自己用一些特殊方法创建的路由对象,就失效了。

我原本用了一个直接修改express源码中相关原型方法的包,叫做express-async-errors,不过这个包没考虑到项目引用其它位置的express包的情况,它直接在代码中对相关源文件进行了require,导致无法作用于项目外依赖库的express,所以我重写了一个,而且源码比它还要简单,因为我直接把`Layer`类的handle方法改成了`async`函数,然后在里面`await`我们的路由函数,目前还没发现什么副作用,在我的项目中直接使用没有出现问题。

包地址:express-async-error-patch

`asyncPatch`函数需要传入一个创建出来的app实例, 为的是能获取到app所属的express包里的构造函数,不是为了在实例上包装方法。该函数在任何阶段调用都可以,只要在处理请求前调用即可。

[BiliBili]视频右键菜单工具(油猴脚本)

地址:https://gist.github.com/JiaJiaJiang/c54abe1227917af3d3825dfa098b9473

安装:在浏览器有tampermonkey插件的情况下,点上面链接里的RAW按钮安装

功能:

  • 右键视频变速按钮:添加新版播放器中被砍掉的右键菜单视频变速按钮
  • 跳过OP、ED快捷键:ctrl+左右键可以跳过一般op和ed长度的时间(1分30秒)
  • 右键截图按钮:点击后将当前视频画面完整截图并在新窗口中打开

 

node-socksInTheMiddle

写了个用于修改http、https请求和响应的node服务,它会启动一个socks5服务端,然后把你的代理设置成这个服务端口,在代码里写上你的修改逻辑即可。

名字取自Man-In-The-Middle,把人改成了socks。

NPM : https://www.npmjs.com/package/socksinthemiddle

Github : https://github.com/JiaJiaJiang/node-socksInTheMiddle

继续阅读node-socksInTheMiddle

itisModelViewer 模型查看器

花几天用three.js糊了一个用于在网页上加载模型并查看的小东西,名字随便起的,用于以后显示一些物体的扫描建模和3D打印做的模型。

地址:https://github.com/JiaJiaJiang/itisModelViewer

目前代码没高兴整理,反正本来写的也不乱,就是对象的方法排序不太讲究。加载器只写了gltf一家和fbx的,虽然加载器都是现成的,不过因为我把js打包了,现在已经有1M多了(没压缩),所以我不用的加载器我都没写进去。

现在也还没写UI,只支持拖动查看,有生之年应该会加入从场景中的相机视角查看以及控制灯光之类的。

在前面那个win hello摄像头的文章里我已经把模型插进去了,这里再放几个演示,如果本页有模型没有加载出来就刷新一下,我的土豆服务器可能不太愿意把文件吐出来

继续阅读itisModelViewer 模型查看器

IPFS工具

现在博客几乎变成了记录看番进度的专用工具,久违地动了动代码写了个小工具都忘了发出来了

那么这边是演示,内含仓库链接: http://pages.luojia.me/IPFS_tool/

工具介绍:检查列表里的ipfs网关并可以选择用来打开下面内容预览的ipfs路径,地址hash里带上path参数时打开后会自动检测并用响应最快的网关打开资源。也可以带上gateway参数指定使用的网关

目前只有以上功能,以后没事做的时候可能还会支持ipfs目录浏览  直接显示网关返回的目录页面就行了

如果你看到有人发出一个以Qm开头的神秘代码,那么就可以用这个工具来加载它。

下面提供几个ipfs资源hash供测试

图片

视频

音乐

其它

[Node.js]file-namer 文件重命名工具

昨晚写了个重命名工具,使用正则表达式匹配并替换文件名。

现在给npm包起个合适的名字是真难

GitHub: https://github.com/JiaJiaJiang/node-namer

效果

$ namer -f "/.+(?=\.txt$)/" -r "#COUNTERpoi$&"
match: /.+(?=\.txt$)/   find: /.+(?=\.txt$)/   replacement: #COUNTERpoi$&
Match list:
1.txt   >       1poi1.txt
2.txt   >       2poi2.txt
3.txt   >       3poi3.txt
4.txt   >       4poi4.txt
5.txt   >       5poi5.txt
6.txt   >       6poi6.txt
7.txt   >       7poi7.txt
8.txt   >       8poi8.txt
9.txt   >       9poi9.txt
10.txt  >       10poi10.txt
11.txt  >       11poi11.txt
12.txt  >       12poi12.txt
13.txt  >       13poi13.txt
14.txt  >       14poi14.txt
15.txt  >       15poi15.txt
16.txt  >       16poi16.txt
17.txt  >       17poi17.txt
18.txt  >       18poi18.txt
19.txt  >       19poi19.txt
20.txt  >       20poi20.txt
21.txt  >       21poi21.txt
22.txt  >       22poi22.txt
23.txt  >       23poi23.txt
24.txt  >       24poi24.txt
25.txt  >       25poi25.txt
26.txt  >       26poi26.txt
27.txt  >       27poi27.txt
28.txt  >       28poi28.txt
29.txt  >       29poi29.txt
30.txt  >       30poi30.txt
31.txt  >       31poi31.txt
32.txt  >       32poi32.txt
33.txt  >       33poi33.txt
34.txt  >       34poi34.txt
35.txt  >       35poi35.txt
36.txt  >       36poi36.txt


36matches found.
Confirm?    (control+c to exit)

Finished. 36succeeded,0failed

 

【工具】listen

今天写了个小工具,用来显示声音的波形和频谱。音源可以是麦或者音乐文件音乐文件可以直接拖入。

在线演示:https://jiajiajiang.github.io/listen/https://pages.luojia.me/listen/

项目地址:https://github.com/JiaJiaJiang/listen

默认会进入麦克风模式,如果想要显示本地音乐的频谱的话可以直接把音乐拖入。

继续阅读【工具】listen

[Javascript]进制转换

由于coding gists即将关闭,所以把此代码片搬到博客

js的Number支持直接使用toString转换到最多36进制(0-9a-z),而此函数支持转换到由传入进制表定义的任何进制。

默认进制表为0-9a-zA-Z的62进制

/*
COPYRIGHT luojia@luojia.me
MIT LICENSE
*/
function conv(n,o,t,olist,tlist){//数,原进制,目标进制[,原数所用字符表,目标字符表]
	var dlist='0123456789abcdefghijklmnopqrstuvwxyzABCDEFGHIJKLMNOPQRSTUVWXYZ',
		tnum=[],m,negative=((n+='').trim()[0]=='-'),decnum=0;
	olist||(olist=dlist);
	tlist||(tlist=dlist);
	if(negative)n=n.slice(1);
	for(var i=n.length;i--;)
		decnum+=olist.indexOf(n[i])*Math.pow(o,n.length-i-1);
	for(;decnum!=0;tnum.unshift(tlist[m])){
		m=decnum%t;
		decnum=Math.floor(decnum/t);
	}
	decnum&&tnum.unshift(tlist[decnum]);
	if(tnum.length===0)tnum.unshift(tlist[0]);
	return (negative?'-':'')+tnum.join('');
}


conv(1234,10,2)			//"10011010010"
conv(15,10,16)			//"f"
conv('ABC',16,10)		//"9846"

conv(3245670,10,10,null,'零一二三四五六七八九')		//"三二四五六七零"
conv('①②③',10,2,'〇①②③④⑤⑥⑦⑧⑨')					//"1111011"