所有由罗佳(博主)发布的文章

Oculus Quest2

这是去年买的东西了,昨天翻以前拍的照片的时候才想起来这东西的开箱图一直忘了发。

这个一体式VR头显当时特别多宣传,最近几天好像又出现了一波宣传,主要是确实也不错,于是只体验过一次谷歌的辣鸡DayDream的我没管住自己的手,就下单了。我是淘宝代购的,来的是亚马逊的箱子。

这个一体式VR的好处就是既可以用里面自带的魔改quest安德猴系统直接运行安卓普通app和安卓vr app,也可以连电脑上玩电脑vr游戏,我买的时候还需要有线连接电脑,无线串流需要买第三方App,现在官方已经支持WiFi6无线串流了,延迟要求不高的话WiFi5也可以。

继续阅读Oculus Quest2

[ffmpeg]转码后音画不同步

音画不同步多半是在vfr(可变帧率)和cfr(固定帧率)之间转换的时候视频帧时间戳没有更新导致的,不知道为啥ffmpeg会默认以这种一定会导致错误的方式工作,但我们手动加入参数后就可以修正这个问题。

如果是一个vfr视频,ffmpeg默认会转换成cfr,如果不希望它转换的话,则在前置参数的位置加一个`-vsync passthrough` ,视频帧率模式就不会被转换了,这样只要原视频音画是同步的,那转出来音画肯定也是同步的,因为时间戳完全没有变。

【佳佳拆解】SurfaceBook换电池

这是一个月前的事情了,到现在突然想起来拍的照片还没发,另外这次拆解是翻车的,外屏爆了,然后寄出去换外屏,对方又不知道弄了点啥东西在我内屏里,最后软磨硬盘俩星期才给我重换了个屏,不过他给我的屏侧面看偏光很严重,远不如我原来的屏,大概不是原装的。耳机线也被我切断了,换了一个。

以下是拆解正文。

继续阅读【佳佳拆解】SurfaceBook换电池

[MySQL]This function has none of DETERMINISTIC, NO SQL, or READS SQL DATA in its declaration and binary logging is enabled

MySQL中创建函数的时候如果出现了这个错误,表示创建语句中缺少错误中所示的3个函数行为声明,只要根据需求加在Begin前面就可以了。

如果你不确定,那就需要加`DETERMINISTIC` ,如果这个函数不会去操作数据库就写`NO SQL` (不是完全不能有SQL语句),如果需要读取数据就加`READS SQL DATA` 。

比如

CREATE DEFINER=`root`@`%` FUNCTION `poi`() RETURNS int
    NO SQL
BEGIN
	SELECT 1+1 into @r;
	return @r;
END

[Node.js]解决‘gbk’ codec can’t decode byte 0x80 in position

每次换一个环境执行npm i都会碰到这样的问题,记录一下解决方法,

方法1:手动去报错的文件里指定编码为UTF-8,我自己第一次解决这个问题就是用的这个办法,刚刚想找找看有没有别的解决方法的时候发现别人也有去手动改源码的,放个参考链接

简单地说就是找到报错的那行,给open函数加个`encoding=’utf-8’` 参数就可以解决问题,但这样属于改了人家文件,更新后还是会变回去的,所以现在我不这样做了。

方法2:去控制面板的区域设置里到“管理”标签页下,“更改系统区域设置”,把“Beta版:使用Unicode UTF-8提供全球语言支持(U)”勾上,然后重启一下,python就会默认用utf-8来读文件了。

这个方法会改变整个系统的默认代码页,最主要的影响是会导致使用非Unicode的程序乱码甚至崩溃,还有在gbk设置时以ansi保存的含有中文的bat脚本会乱码。如果影响不大的话倒是可以让系统一直保持在这个区域选项上,影响某些软件的正常使用的话在执行完需要的编译任务后还得改回去。在这种模式下可以使用“locale emulator”这样的软件以Chinese模式启动程序,以解决程序的乱码和崩溃问题。

方法3:我没试过,理论上应该可行,从python本体入手,把它的默认编码设置成utf-8,参考这里的方案2。这个没用

[MYSQL]删除JSON数组中特定数字

这问题折腾了我一下午,首先是mysql中没有现成的方法来寻找数组中数字的位置,然后是谷歌百度bing用中文和英文搜索都没找到可用又不烂的办法,爆栈网有一个高票答案,但是似乎并不对,JSON_SEARCH只能用来搜索字符串在json中的位置,数字不支持,不知道他是怎么得到结果的。

经过我晚上的继续摸索,翻遍了官方所有json相关的文档,终于让我拼出了一个方案,就是用`JSON_TABLE` 先把数组转成表,然后用where剔除里面不要的数字,再用`JSON_ARRAYAGG`转回json数组,以下是示例代码
“`sql
set @j='[1,2,5,8,9]’;
select JSON_ARRAYAGG(b) from JSON_TABLE(
@j,
“$[*]”
COLUMNS(
b int PATH “$”
)
) as `破mysql连个数组查找方法都没有`
where b<>5;
“`
这样就可以得到结果[1, 2, 8, 9],5被删掉了。

这个方法虽然并不优雅,但也没办法,谁叫MySQL连在数组里找数字的位置都做不到呢。

继续阅读[MYSQL]删除JSON数组中特定数字

[MySQL]对json字段中的数组创建索引

Mysql中在json字段里存放数组时,如果需要快速查找到包含某个数字或字符串的数组,则需要在这个数组上建立索引,其`multi-valued` 索引能满足这种需求。

在已有表的情况下,执行以下语句创建一个数字数组索引:
“`sql
ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->’$.指向数组的对象名’ AS UNSIGNED ARRAY)));
“`
这个语句把json字段中的一个数组以无符号数组读出,并对每个数字进行索引,这样要寻找包含某数字的数组时,将使用索引提速。

如果数组内的成员都为字符串,可以这样创建索引(要注意,该表的排序规则需为`utf8mb4_0900_as_cs`,否则会报错):
“`sql
ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->’$.指向数组的对象名’ AS CHAR(255) ARRAY)));
“`

接下来使用类似这样的语句查找拥有某个数字的数组所在的条目
“`sql
SELECT * FROM 表名 where 要找的数字 MEMBER OF(json字段->’$.指向数组的对象名’);
“`
或同时查找多个数字(字符串查找同理)
“`sql
SELECT * FROM 表名 where JSON_CONTAINS(json字段->’$.指向数组的对象名’, CAST(‘[1,2,3,4,5]’ AS JSON));
“`
使用了该索引后,作用在相关字段上的`JSON_OVERLAPS` 函数也会使用索引。

参考:https://dev.mysql.com/doc/refman/8.0/en/create-index.html

Certify申请Let’s Encrypt 错误 DNS problem: query timed out looking up CAA for

这是一个多月前开始出现的问题,我想着本来一直都好好的,会不会只是let’s encrypt服务器抽了,说不定过段时间就好了,但是一直到现在都没好,于是就来研究一下这个问题。

标题上这个错误是查询域名的CAA记录超时,我查了一圈CAA是个什么东西,大概就是说要有这么条记录,内容是允许哪个机构颁发什么样的证书。

使用Certify测试时发现在Cloudflare里面会自动添加对应的TXT记录,但是从没自动添加过CAA,既然是必须条目为啥它不添加呢。我在寻找相关问题时别人都是DNS解析服务不支持CAA记录,然后换个服务商解决的,cf又不是不支持。

我怀疑是不是软件问题,于是手动去cf添加了一个CAA记录,这下终于不会出现这个错误了。添加方法如下:

点添加记录按钮添加一个CAA记录,要给哪个域名设置就在名称写哪个域名(根域名写@保存会自动变为完整域名,子域名写子域名),TTL随意,CA域名那里写证书机构地址,比如Let’s Encrypt就写letsencrypt.org,前一个“标记”表示这条记录允许的是上面名称里写的那一个域名还是那个域名通配的子域名。

保存了之后再去Certify中申请证书就可以成功了。

 

如果还遇到了cf返回的错误“Cloudflare DNS API :: An error occurred while sending the request.”,可以试试把设置中cf的验证方式从“邮箱+Global API Key”改成“API Token”。

 

 

Sony WF-1000XM4

一个月前买了个WF-1000XM4,当时是看到了bili上的评(guang)测(gao)视频,然后发现这耳机可能还不错,于是就开始找着买。

当时正好是618,不得不说利用信息差清库存真的可恶,到处都是在甩卖WF-1000XM3的,而且都宣传得好像XM3是最新款一样,因为4才刚出,很多人应该都不知道。

然后是使用感受

优点:

  • 作为蓝牙耳机来说音质是我到现在感觉最好的。
  • 续航不错,环境音模式可以从上班一直撑到下班正好没电,下班前拿下来充电十几分钟可以撑完回家路上听音乐和吃晚饭看视频的时间。

缺点:

  • 一个月内碰到过两次触摸没反应,就像触摸模块没启动一样,要放进耳机盒重新拿出来才能恢复。
  • 环境音模式下如果出现特别尖锐的高音(如椅子摩擦地砖、门禁按键音),耳机会进入自闭模式停止收入环境音,可能是出于保护耳朵考虑,但进入自闭模式后有一定概率不恢复环境音模式,而且两只耳机是分开的,会出现一个自闭一个不自闭的情况,无法恢复时需要用手去摸一下自闭耳机的触摸键才能解除。
  • 环境音模式没有降风噪,这是个严重的问题。降噪模式的降风噪也不能算完美,所以骑车和大风外出的时候如果想好好听音乐只能关闭环境音和降噪模式。

至于降噪效果我没用过别的真无线入耳,没得对比,但个人感觉效果还是不如WH-1000XM3的,特别是侧躺或手撑头时脸部受压迫变形会导致漏音。

2022-11-19更新

现在这副耳机我已经用了1年多,我就目前为止的使用体验来做一些评价:

左耳在去年冬天的时候已经因为低温时触摸失灵更换过了,但更换的耳机和另一只比起来在环境音模式下明显有轻微的底噪,而且换回来的这只在包入狭小空间后(比如戴上雨衣帽子)有一点概率会产生高频噪音,类似拿着话筒在音响前面产生的那种噪音。

我会想要写这段更新,主要还是因为现在右耳又不行了,就从最近开始现在它在耳机盒里充电最多只可以充到90%,有时是80%,并且在佩戴半小时后就开始报电量低,已经出现了电池寿命严重折损的情况。有时候从耳机盒里拿出来的时候它还有点温热,我怀疑它是不是里面有地方漏电。关键保修期只有1年,现在已经过保几个月,出现这种问题已经没法免费更换了。官网上标价更换一只耳机的费用是500多元,那我还不如重新买个别的耳机。左右两只耳机接连出现问题,讲道理这个耳机的整体质量真的对不起当初发售的时候1999元的价格,如果它的使用寿命只有这么短,我就算每年都随便买个稍微便宜点音质还行的耳机,用一年就扔都比它划算。

另外我还要补充一个之前没有提到的缺点

  • 这个耳机无法用湿手进行正常的触摸操作,即使是一点手汗或刚洗完手大概擦了一下(不完全干)的情况下去触摸都会导致触摸被持续按住的状态(手松开了触摸状态依然在),这点是最让人恼火的,因为它保持触摸状态的时候我就无法进行后续的点击操作,直到它上面的一点水被擦掉或者蒸发掉为止,耳机都处于无法控制的状态!很多时候我想双击一下切歌,然后点的第一下就把触摸锁定了,耳机自己长按进入了语音助手模式,怎么都调不回来。就冲它这点,我就肯定不会花钱去进行保外换机了,这样的体验根本不值得!

 

下面是图

继续阅读Sony WF-1000XM4

[Node.js]Incorrect arguments to mysqld_stmt_execute

这是一篇错误处理记录,该错误出于node-mysql2模块,我找到的相关issue在此 https://github.com/sidorares/node-mysql2/issues/1239

今天把代码推上服务器跑起来直接报错,但是不管我怎么检查我写的代码都没有问题,最后只能上网找,然后搜到了这个issue。

问题就出在8.0.22以及之后的版本的Mysql Server对于使用prepared statement传输的数值类型数据表示方法不一样了,导致支持prepared statement的mysql库按照原来的规则传输数据时发生兼容性问题而报错。

在库作者按照新方法修好之前,临时的解决方案可以是覆写连接或连接池的execute方法,在其中把所有数字参数用`.toString()` 转换成字符串,这样就可以正常使用prepared statement了。

[Node.js]sharp模块处理图片方向错误

这篇博文是对于该模块https://www.npmjs.com/package/sharp的笔记,这是一个nodejs上用于处理图片的模块。

遇到的问题是该模块处理手机拍摄的照片时(带有EXIF方向信息的图片),不会自动按照该图的EXIF信息先旋转图片到正确的方向再进行处理,导致处理完的图片会转向错误的方向。

然后我翻了一下API文档里的rotate部分,光看第一行就可以知道这并不是一个bug:

rotate the output image by either an explicit angle or auto-orient based on the EXIF `Orientation`  tag.

如果调用rotate时不带参数的话会根据EXIF信息的方向进行旋转,也就是说它是特意默认不自动旋转的,要解决这个问题只要在调用所有处理函数之前先调用一个没有参数的`rotate()` 即可。

比如

sharp(图片路径)
.rotate()
.resize(200, 200)
.jpeg({quality:90}).toBuffer();