QQNT会每月创建重复资源文件

QQNT是去年腾讯放出的新架构QQ客户端,我在去年12月更新到了这个新版,已经用了3个月,今天发现了这好像有个问题。
这是一个关于接收的图片和视频资源产生重复文件的问题。

原来的PC QQ是把接收到的所有图片放在一个目录中,所有视频放在一个目录中,分别按照QQ自己的hash规则命名,当客户端接收到消息,需要加载图片或视频时将会先按照资源的hash在存放资源文件的目录中查找,如果没有就会从服务器下载一份。这是很河里的做法。

新版的QQNT在这一套接收资源文件的流程上基本上差不多,但有一个地方不同:它在每个类型的资源目录中又以“年-月”的格式加了一层目录,这个“年月”目前看下来指的是附件资源所在消息的发送年月(我这甚至出现了2019-06的资源目录)。这将导致每个月的消息附件资源(图片,表情,视频)不共享,上个月消息中接收过的表情图片在这个月对于QQ来说就不存在了,要重新下载一份。对于缩略图来说也一样,因为缩略图目录也在每个月的目录中单独有一个。

QQNT存放这些资源的路径是”C:\Users\用户名\Documents\Tencent Files\QQ号\nt_qq\nt_data”,其中”Emoji”里面是表情图,”Pic”里面是表情图以外的图片,”Video”是接收到的任何视频,可以发现它们里面全都以年月的子目录对资源进行分隔,我用Everything直接对Emoji目录查找,按文件大小排序,就已经发现了大量完全相同的表情文件出现在不同月份的目录里。

以下是在Everything中搜索到分别存在于1月和2月目录的相同表情文件




这样重复的表情文件和图片文件还有很多,随着时间推移,这种每个月不共用附件资源的特性根据接收消息数量的不同可能会导致空间占用快速增长,每个月都产生大量的重复文件(已确认每个月出现的相同文件都是单独的文件,并不是硬链接)。

目前不理解为什么要这么做,如果是为了避免在一个目录中存在大量文件导致文件系统操作效率降低的话,按照其”avatar”目录中的做法就很好,直接按文件hash的开头来划分子目录即可。
如果QQNT之后也坚持以这种方式存放文件,那用户就要注意定期清理本地重复文件。至于重复下载对服务器资源造成的浪费,那反正也不关用户的事🤔。

继续阅读QQNT会每月创建重复资源文件

TypeError: Descriptors cannot not be created directly. Downgrade the protobuf package to 3.20.x or lower

今天启动sd-webui的时候报了这个错误,由于启动之前更新过所有扩展,所以可能是哪个扩展的依赖版本冲突了,这时候按照它的提示将此模块降级即可。

首先进cmd并激活项目的venv,不激活会安装到全局去,然后执行

pip install protobuf==3.20.2

执行完后可能会有提示依然和某个模块不兼容,但是我试了一下可以正常启动webui了

升级到windows11之后游戏帧率暴跌

从win10升级到win11之后一开始我发现vr帧数超低,然后我发现不只是vr,战舰世界的帧率也超低,但任务管理器里看GPU占用竟然几乎到了90%,然后我就网上找解决方案,有什么显卡设置里关GPU硬件加速的,有关闭窗口化游戏优化的,有关闭Game Bar的,我全试了一遍都没用。

直到我偶然点开Afterburner,发现显卡跑在一个很低的频率上,然后我直接把它的频率配置重置了一下,瞬间就恢复正常性能了。

怀疑是win11什么节能功能修改了显卡相关设置。

[TrueNAS]解决使用USB硬盘柜导致多块硬盘被识别为一块

这篇文章不是用来帮你在TrueNAS GUI里找到不显示的硬盘的,而是使用命令创建Pool。

由于大多数USB硬盘柜或者硬盘盒会硬编码一个序列号,而且接入的所有硬盘都会提供这同一个序列号给系统(不知道这是什么脑梗逻辑),又因为TrueNAS平台本身就是靠硬盘序列号来区分硬盘的,所以就会导致它的硬盘列表里只显示你插入的其中一块硬盘。

虽然TrueNAS不显示同序号的其余硬盘,但它们在系统里却是存在盘号的,所以你其实可以直接用命令创建池。

以下操作需要执行shell命令,请打开ssh服务后通过ssh连接操作,不要使用gui的终端,因为gui的会话时间太短了。

首先要找到列表里看不到的硬盘,执行以下命令,你就会看到一堆linux给硬盘分配的盘号,比如sd[abcdefg…]这样按字母顺序排下去的

lsblk

如果你插了很多硬盘,搞不清到底是少了哪块,可以去GUI的硬盘列表里扫一遍盘号,比如我的列表里就是少了sdc,再在lsblk命令的结果里确认一下sdc设备的空间大小,确认和你加的盘相符那就是那块了。

知道盘符之后就好办了,直接找个zfs的使用说明参考一下,手动创建池即可,比如这个:https://docs.oracle.com/cd/E19253-01/819-7065/gaynr/index.html

参考:我这里做了个raid1,执行以下命令创建池,创建一个raid1池,其中使用sdc和sdd盘做镜像

zpool create 池名 mirror sdc sdd

现在你的池创建好了,但你会发现在GUI的存储标签页里看不到它,在数据集里面可以看到它,但创建数据集之后也无法共享。这是因为直接使用命令创建的池缺少一些步骤,导致这个池不仅挂载点不对,而且系统池记录中没有这个池,所以大部分操作都是不允许的。

要解决这个问题很简单,我们只要先把这个池导出(export):

zpool export 池名

然后再用GUI的导入池功能把它导入进来,池的所有功能就正常了。

最后注意,由于TrueNAS是用序列号来区分硬盘的,所以使用此方法创建的pool不要在gui中执行硬盘替换等操作,可能会出问题!相关操作请使用zfs、zpool命令操作。

 

其它歪门邪道:

如果你和我一样是让TrueNAS跑在Windows宿主的虚拟机里的,那么可以让新加入的硬盘先在宿主里格式化成NTFS后生成vhd放在里面,接着让虚拟机把vhd挂载成虚拟机的硬盘,这样就有不一样的序列号了,但这么做就多了一层处理开销,也增加了意外情况下出错的风险,个人建议尽量不要这么做,除非使用vhd对你会有其它什么好处。这么一说其实其它平台的宿主也可以用其它虚拟磁盘来搞出不一样的序列号。

[TrueNAS]替换系统盘阵列中的坏盘

TrueNAS中的系统盘池不能在GUI中直接操作,所以需要敲点命令来替换坏盘,这里做个记录

首先查看zfs状态

# zpool status
 pool: boot-pool
 state: DEGRADED
status: One or more devices are faulted in response to persistent errors.
        Sufficient replicas exist for the pool to continue functioning in a
        degraded state.
action: Replace the faulted device, or use 'zpool clear' to mark the device
        repaired.
  scan: scrub repaired 0B in 00:00:39 with 0 errors on Sat Nov  4 03:45:40 2023
config:

        NAME        STATE     READ WRITE CKSUM
        boot-pool   DEGRADED     0     0     0
          mirror-0  DEGRADED     0     0     0
            sdc3    FAULTED      2    17     0  too many errors
            sdd3    ONLINE       0     0     0

可以看到是sdc这块盘不行了,所以我们要替换它。

首先把它offline:

zpool offline boot-pool sdc3

然后把这块盘拔了,插进新盘,去web gui的磁盘页面看看新盘获得的盘号叫什么,我这里分配到了sde,所以接下来使用sde替换sdc3

zpool replace -f boot-pool sdc3 sde

由于boot-pool的内容其实很少,所以稍微等一会儿就同步好了,期间可以继续用`zpool status`查看同步状态。

阻止GooglePlay框架自动升级后导致“保护机制认证”错误再次出现

最近从我爸那意外获得了一部华为Mate60Pro,虽然我本来是不会去用这种不能root 也不能刷机的手机的,但都到手里了也不能就当摆设,正好我的小米Mix2s刷了lineageos之后长久以来蓝牙微信通话声音一直不从耳机出的问题让我困扰很久了,这次就顺便把Mate60Pro当作主用机,把Mix2s换成备用机,原本当备用机的Pixel XL就正式退役了,因为它的闪存明显开始出问题了,会出现部分照片或视频损坏的现象。

换机之后自然第一件事是把谷歌框架弄上,不然连chrome都没法用。虽然不能root,但好在网上有利用备份恢复机制把谷歌框架恢复进手机的方法。这里简单提一下就是利用华谷套件APP把该装的都装了之后,最后解决无法过play保护验证的问题,华谷里面最后一步点进去是要收费的,其实网上一查都有教程,比如这个,解决了这个问题之后会发现过一天,这个错误提示就又出现了,我反复折腾这几个app,折磨了我好几天。

主要问题出在我们自己注册GSF ID的方法可以在20版本(可能21也行)的“Google Play服务”通过验证,但该服务APP会被自动升级到最新版(目前是23),且GSF ID同时会变,不知是因为ID变了还是验证方法变了,反正在23版本下你再去按流程注册新的ID清app数据也没用,一定要退回旧版play服务去注册才能过验证。

我查了一下也有人发现这个问题,他用各种禁止相关app访问网络的设置试图防止play服务自动更新,让play服务一直保持在旧版。但这样也有问题,就是有时候就是需要新版的play服务才能完成一些操作,而且保不准什么意外就让play服务又更新了,这样就很麻烦。我也尝试了一下,不管是禁止play服务还是play框架访问网络,它都会自动更新,我总不能把play商店断网吧。

然后我发现了这个方法,我目前几天测下来还没有出问题。简单说就是在解决了“保护机制认证”的错误之后,直接用以下adb命令把“谷歌服务框架”禁用

adb shell pm disable-user 'com.google.android.gsf'

然后play服务就无法获取GSF ID了,同样我们可以在“Device IDs” app中确认GSF ID已经无法获取了。我猜原理是这样:play服务获取不到ID,就无法进入下一步验证流程,那么原本验证通过的状态就会一直被保留下来,同时play服务的版本也可以保持更新。

继续阅读阻止GooglePlay框架自动升级后导致“保护机制认证”错误再次出现

[nginx]the “listen … http2” directive is deprecated, use the “http2” directive instead

新版本nginx出现了标题上的提示,其实就是把http2配置从listen指令里分出来了,修改方法很简单,只要把原来的http2去掉,然后在下面加一个`http2 on;`就行了。

原来:

server {
    listen [::]:443 http2 ssl;
    .....
}

改为:

server {
    listen [::]:443 ssl;
    http2 on;
    .....
}

就这么简单,但我为什么要写这篇?因为我搜索这个警告的时候发现搜索结果全是清一色抄的同一篇错误的文章,那篇垃圾文章莫名其妙让你删除http2就完事了,对如何添加这个新指令只字不提,看得我来气。

解决硬盘设备变成SCSI设备后在CrystalDiskInfo里不显示的问题

前几天买了一块宏碁掠夺者GM7 4T版本,回来装到主板上的第二m.2硬盘位之后发现进系统在CrystalDiskInfo(以下简称CDI)里不显示,不管怎么调设置怎么重新扫描都不出来,于是我看了一下磁盘精灵(DiskGenius),发现里面竟然显示这个盘的接口是SATA,我知道这肯定是这软件的判断错误,但不知道到底是哪里出了问题。

网上查了下,说和AHCI还有RAID模式有关,进bios里看了一下它里面关于AHCI什么的设置只和SATA接口的硬盘有关,而且调了也没解决这个nvme ssd被识别成SCSI设备的问题,于是我怀疑是不是这个第二m.2接口接上去就是会变成这样的,我就把主m.2槽的系统盘和它对调了一下,这下好了,俩盘都变成SCSI设备了。然后我还作死尝试删除驱动让它重新识别成nvme设备,结果就是一个下午加上晚上3小时我都在修复系统,因为转完loading的圈圈电脑就会直接重启,看了一下启动日志是加载完disk.sys之后其它的所有驱动就都无法加载了,显然是加载了disk驱动之后对硬盘的读写就出现了错误,当然和我删除的驱动有关。

后来我好不容易通过其它电脑开虚拟机把这个盘里的系统覆盖安装了,装回主机里成功启动后打开CDI看了一下发现所有盘都扫描不到了,我想起来是bios里把ACHI切成RAID了,但现在切回ACHI我的系统又进不去了,我开始怀疑会不会其实有一个驱动可以让硬盘就在SCSI控制器下正常工作,所以我翻了一下AMD官网上我这个主板芯片组的驱动列表,发现确实有和raid有关的驱动,装好之后所有的硬盘就都可以在CDI里显示出来了。我觉得这里要批评微星的主板驱动列表,放驱动也不放全,如果他那有这驱动我一开始就打上了,就没后面那么多事情了。

虽然现在我所有的硬盘都不小心被我变成SCSI设备了,不过只要装好驱动其实也是照常用的,也能正确获取SMART信息。最开始我发现网上也有不少人问硬盘变成SCSI设备了怎么改回来,因为没相关驱动的时候CDI等软件是无法获取硬盘的SMART信息的,这样对于硬盘的健康状态就心里没底,虽然我还是不知道要怎么改回来,不过把RAID驱动装好也是一个解决方案,虽然我们用不上它raid的功能,但它提供了获取这些信息的接口。

[node.js]同时使用canvas模块和sharp模块出现“The specified procedure could not be found”错误

升级到最新的node之后这俩模块是彻底没法共存了,之前还能通过降级其中一个模块来兼容一下,现在我怎么试都没法成功运行了,于是尝试找解决方案。

然后我发现这是由于两个模块使用的同名链接库不兼容导致的其中一个模块报错,似乎就是个无解的问题,偶然发现一个替代方案:https://github.com/Brooooooklyn/canvas

如果本来只使用了标准的绘制功能,那么可以连代码都不用改,直接替换掉依赖就可以解决问题,如果使用了非标准canvas方法,那么可能需要做一些小修改,比如将图片导出为png等格式时的额外参数之类的情况。

基本上要进行的操作就是删除`package.json`中的`canvas`依赖那行,然后直接执行`npm i @napi-rs/canvas`,npm就会自动删除`canvas`模块并安装`@napi-rs/canvas`,然后把代码中的`require(“canvas”)`换成`require(“@napi-rs/canvas”)`即可。

使用css grid制作一个活跃度砖墙

我也不确定这个到底叫什么,就是Github那种根据提交的代码次数改变方块颜色的动态墙,在这里暂时就叫活跃度砖墙。

这篇文章早就想发了,不过最近沉迷看番,一直都没写,我制作的版本在这里可以看到:https://blist.9baka.cc/user/luojia

基本思路就是往一个 `display` 为 `grid` 的容器里塞方块,让 `grid `的 `grid-auto-flow` 为 `column` ,这样方块就是纵向排列的了,然后用 `grid-template-rows: repeat(8, 1fr)` 把行数分成固定的8份,列数会自动根据格子数量增加,最后对所有砖头使用 `aspect-ratio: 1/1` 来把它们固定为正方形(当然你要别的形状也可以),样实现的墙里面的格子可以自动根据整体的宽度改变大小。

和Github以及大多数地方不同的是,我用颜色把每个月区分开了,这样看起来更直观一些。

效果如图

继续阅读使用css grid制作一个活跃度砖墙

伪装成TiWorker.exe的病毒

我的surfacebook不知道从什么时候开始,只要一会儿不操作就会开始风扇狂转,每次风扇开始狂转我都会尝试查找到底是什么东西在抽风。

我用了很多办法,像是蹲守任务管理器,蹲守任务计划的正在运行的任务都找不到到底是哪个程序在抽风,最终用process explorer定位到有时候是一个TiWorker.exe进程,有的时候是System进程,然后又打开System进程的线程列表观察,只能等它抽风,因为鼠标一动就会停止,System进程里抽风的线程名称我忘了,只记得我查过它的用处好像是在空闲时间优化.net框架下的什么东西。然后我又查了一下关于TiWorker.exe的异常行为,基本都说是windows更新在电脑空闲的时候执行更新任务,我就信了。

接着就是很长时间我都没再管这个问题,想想更新就更吧,顶多就是风扇开始狂转的时候动一下鼠标就停了。

但是昨天我才发现我的电脑根本就不能进入睡眠状态了,就算是我手动点睡眠,它也只是屏幕黑掉之后开始风扇狂转。我就觉得这肯定不对了,再怎么样更新也不会在你点了睡眠之后开始更,而且除非我手动再次点亮屏幕,否则风扇根本就不会停下来。 继续阅读伪装成TiWorker.exe的病毒

大龄单身狗的日常