[Nginx]特殊后缀路径不走反代地址

一个很迷惑的问题整了我一晚上,我在服务器上新加了个网站,用nginx反代到一个后端,但是因为是复制的另一个有静态文件的网站的配置来改的,忘了删nginx的root配置了,于是这个本该是单纯反代的配置就有了一个静态文件输出的功能.

在我发现问题把root选项去掉了之后,它依然保留了静态文件输出的功能,而且文件路径改到默认静态文件目录了,我甚至可以打开nginx的默认index.html,不管我怎么改,一些特定后缀的地址都会被nginx拦截下来当作静态文件去找,然后返回404,根本不pass到后端去。

在我翻了一圈配置文件看到底是哪里出问题的时候,发现了在一个expires.conf里定义了这么两个规则

location ~ .*\.(js|css|html)$ {
	expires 10d;
}
location ~ .*\.(gif|jpg|jpeg|png|bmp|swf|mp4|mp3)$ {
	expires 30d;
}

所有出问题的后缀都是这里面定义的后缀,当我把这几行全都注释掉了之后重启了nginx,这个问题竟然就解决了。

但更奇怪的地方是,在这个出问题的站的配置上根本就没有include这个配置文件,我到现在还是没搞清到底是咋回事。

总之 It Works!

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=<code>{{EJS5}}</code>@<code>{{EJS6}}</code> FUNCTION <code>{{EJS7}}</code>() 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数组,以下是示例代码

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 索引能满足这种需求。

在已有表的情况下,执行以下语句创建一个数字数组索引:

ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->'$.指向数组的对象名' AS UNSIGNED ARRAY)));

这个语句把json字段中的一个数组以无符号数组读出,并对每个数字进行索引,这样要寻找包含某数字的数组时,将使用索引提速。

如果数组内的成员都为字符串,可以这样创建索引(要注意,该表的排序规则需为utf8mb4_0900_as_cs,否则会报错):

ALTER TABLE 表名 ADD INDEX 索引名((CAST(json字段->'$.指向数组的对象名' AS CHAR(255) ARRAY)));

接下来使用类似这样的语句查找拥有某个数字的数组所在的条目

SELECT * FROM 表名 where 要找的数字 MEMBER OF(json字段->'$.指向数组的对象名');

或同时查找多个数字(字符串查找同理)

SELECT * FROM 表名 where JSON_CONTAINS(json字段->'$.指向数组的对象名', CAST('[1,2,3,4,5]' AS JSON));

使用了该索引后,作用在相关字段上的JSON_OVERLAPS 函数也会使用索引。

 

要注意的是,如果数组不是像{"group":[2,4]} 这样对象中的数组,而是字段中直接存放了一个数组[2,4] 的话,索引不起作用,原因不详,但使用explain解析语句时候就是全表查询。

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