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

IIS反向代理站点跳转域名被替换

今天一个破问题浪费我一下午的时间,我一直在找自己代码是不是有什么问题,或者是不是express有什么bug,结果到最后发现原来是iis的问题。

如果是在win上用iis反代站点的话,通常都会用iis的requestRouter插件,在他的设置页面Application Request Routing里网上的教程通常都勾着Reverse rewrite host in response headers这一项,就是因为这个设置导致后端返回的http头中location指定的跳转地址被替换为了此站点的地址,不知道这是个什么智障操作。

TrueNAS启用pkg包管理器

这是一篇小笔记,truenas默认没法使用pkg install来安装包,会出现以下报错

pkg: file:///usr/ports/packages/meta.txz: No such file or directory
.....
pkg: file:///usr/ports/packages/packagesite.txz: No such file or directory
Unable to update repository local

解决方案是进入/usr/local/etc/pkg/repos/ ,把local.confenabled后的yes改成no,把FreeBSD.confenabled后的no改成yes即可。

 

方案来源 : https://www.justinsilver.com/random/fix-pkg-on-freenas-11-2/

[MySQL]在普通字符串字段中存放json数组并索引

之前有一篇文章写的是在mysql中使用json字段时为其中的数组创建索引,它有个问题就是当该字段本身存放的就是一个数组时(不放在对象下的属性中),这样创建的索引不生效,原因不明。因此要使索引生效需要把数组放在对象下的一个属性里。

现在我发现,如果想要在mysql中存放一个可以索引的json数组,其实根本不需要使用json字段,即使是普通的字符串字段存放的json数组也可以用同样的方法进行索引。

比如现在有一个字段tags,类型为mediumtext,在其中一行存放了以下字符串:

[1,2,3,4,5,6,7,8,9,10]

然后将其解析为json来创建多值索引:

ALTER TABLE 表 ADD INDEX tag_idx((cast(JSON_EXTRACT(tags, '$') as unsigned array)))

接着在查询数据时也把该字段解析为json进行使用:

SELECT *
FROM 表
WHERE JSON_OVERLAPS('[1,2]',JSON_EXTRACT(tags, '$'))

在这样的查询中,mysql就会使用到这个json数组的索引,因此如果一个数据仅仅是为了作为数组使用的话就没必要套个对象放进json字段了,使用普通字符串字段即可。

[MySQL]member of 不走索引

刚刚发现程序里有一个语句,是一个unique主键 member of(返回json数组的子查询),但它就是不走主键索引,接着我把子查询换成了一个手写的json串,像这样

SELECT
    tag_id
FROM
    tags FORCE INDEX ( tag_id_unique ) 
WHERE
    tag_id member of (JSON_EXTRACT( '[1,2,3]', '$' ))

发现即使是指定了索引也还是不走索引,可能member of就是这样的机制? 目前原因还不清楚,于是我先用了另一个办法。

继续阅读[MySQL]member of 不走索引

25岁

25岁啦。

这一年没做什么值得瞩目的项目,多数时间还是用在处理公司一大堆繁杂小事上了,同时也在做公司的在线系统和平台。

由于每天都公司和家两点一线的原因,周末也不高兴出去玩,所以到现在还是单生狗,现在是大龄单生狗了。

按照惯例,我应该要画一张琪露诺作为新的头像,但目前还没开始画,等画完了贴上来。

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

[javascript]字符串映射到固定颜色

碰到一个需要给图表上数据打颜色的场景,我希望对于同一个名字的数据每次出来的颜色都是一样的,于是想了半分钟,搞出了这么个方案

function strToRGB(name){
	let sum=0;
	for(let s of name)sum+=s.codePointAt(0);
	return [sum%128,sum%126,sum%124];
}

原理是把每一个字符的unicode值累加起来,然后对这个和分别取3个余数。

除数选1到256都可以,选多少取决于希望结果出现在哪个范围,我这里为了让结果颜色偏暗,所以选了128左右的除数。

MySQL mbind: Operation not permitted

刚刚mysql启动不起来了,翻了翻docker日志,里面全是mbind: Operation not permitted ,然后netstat看了看也没别的程序占用端口,怎么就没权限监听端口了呢。

咕咕查了查,都是说和docker-compose有关的答案,但是我没用它,只好再研究是什么原因。

直到我编辑了一个文件然后保存的时候终于知道是什么问题了,它报了个硬盘空间不足,估计又是什么log把硬盘撑爆了,然后就du命令一路找,找到了一个9个多G的docker容器log,删掉它之后重启docker,mysql也可以启动起来了。

为了防止问题再发生,给docker容器设置了个log大小限制。

Windows半夜自动开机

首先容我说一句,搞出自动唤醒电脑更新系统这个策略的人是烧饼,搞出更新后无视用户任务自动重启电脑的人也是烧饼,说不定还是同一个人。

从Win10开始就有不少人遇到了这个问题,最后发现是系统更新半夜唤醒了电脑,关闭方法是在“任务计划程序”里找到”\Microsoft\Windows\UpdateOrchestrator\Schedule Wake To Work”这一项,把它禁用,如果提示权限不够无法操作,可以搜索一下如何禁用这个任务计划。

这篇文章我要说的是另一个问题,自从升级到Win11之后,之前在10里面已经改过的设置又被改回来了,又开始每天晚上自动开机跑更新,而且即使再改,它依然会被恢复到默认状态,晚上还是会自动开机,真实烧饼行为。于是只能换个办法来解决这个问题,我找到的一个办法是,既然任务计划唤醒电脑靠的是唤醒定时器,那么只要把唤醒定时器整个禁用掉应该就好了。

关闭方法是在当前的电源计划设置里找到“睡眠”→”允许使用唤醒定时器“,把启用改成禁用即可。现在几个晚上下来都没有再出现自动启动的情况了。

继续阅读Windows半夜自动开机

INSERT ON DUPLICATE KEY UPDATE导致自增字段不连续

今天做一个自用小图库的时候发现保存的tag_id没一会就已经上万了,但是实际的tag数量才只有600个左右,找了一会儿发现是ON DUPLICATE KEY UPDATE 导致的。

简单来说就是由于mysql在执行语句之前不知道它会进入insert还是update模式,为了一致性只能先取一个自增id,不然如果进了insert模式就没有id用了,就是这样导致即使该语句实际上进入的是update模式也会导致自增id+1。

网上有找到修改innodb_autoinc_lock_mode来解决的方法,但是我改成0了之后依然会导致进入update模式后自增+1,不知道为什么。

还有的说在程序里先select,再决定是insert还是update,但这样并发会导致问题,如果select和后续步骤之间有别的请求插入了满足条件的条目,就会导致错误。

方案1

我用暂时了这样一个笨办法,关掉自增,然后手动设置id为最大值+1,其中tag_idname 都是unique 字段

INSERT INTO <code>{{EJS23}}</code> ( <code>{{EJS24}}</code>, <code>{{EJS25}}</code>, <code>{{EJS26}}</code> )
VALUES	(( SELECT id FROM ( SELECT max( tag_id )+ 1 AS id FROM tags ) AS tmp), 'valueA', 'valueB') 
ON DUPLICATE KEY UPDATE <code>{{EJS27}}</code>=VALUES(<code>{{EJS28}}</code>)

由于insert里不能直接select被insert的表,所以需要在select外面再套一个select,变成两层子查询。

但这样做也有一个很明显的缺陷,因为用的不是数据库自带的自增,于是自然也就没有LAST_INSERT_ID ,所以如果需要获取刚刚插入数据的id的话,就得再进行一次查询。

好在可以根据affectedRows判断此语句发生了更新还是插入,如果影响的行数是2的话那就是更新,如果是1就是插入了一条新数据。

注意,这个方法只适用于单个事务依次执行,如果是并发会造成死锁!

方案2

这个问题只在InnoDB会出现,所以如果对并发要求不高的话可以直接改成MyISAM引擎解决问题。

 

如果有什么别的好办法希望可以给我留言,谢谢。

第一次做破解软件

今天是国庆假期最后一天,我本来打算今天装个win11然后补完赛马娘第一季的,结果还没睡醒就被公司的人打电话来叫醒说一个软件显示注册过期了,这软件还特别重要,必须要可用。

关键是前任网管并没有给我交接这个软件安装人员的相关信息,软件里关于界面也没留联系方式,软件说明书文档里写着注册码要问物业或机器销售方要,我就是物业,机器不知道是谁装的,于是我只能远程把软件拉回自己电脑上开始尝试破解。

一个上午没有任何进展,一直被ida稀烂的文字编码拖着后退,字符串列表完全找不到关键词。你说它同样是UTF-16的字符,有的就能显示有的就是乱码,再加上这软件有的中文是GB系编码,有的是UTF-16LE编码,光是找注册相关代码的地址就找了一下午,IDA都换了4个版本。

最后编码问题还是靠vscode解决的,在vscode里直接用UTF-16LE编码打开程序文件,找到里面需要的中文字符串,再新建一个文档保存成UTF-16LE,再用hexeditor插件打开来,再用字节码搜索字符串在程序里的地址,再找引用这个地址的代码段,再改汇编测试。

IDA这东西往程序里patch还不能连续patch,连着改会把程序改坏,坏了好几次我才发现不是我改的汇编有问题,于是又写了个bat每次patch前一键把程序复原,再patch测试。

一直折腾到现在现学现做用了15个小时终于破解好了,写这篇日志的时候已经是第二天1:30了,有计划的一天完全浪费了,头发也没来得及理,番也没看,win11也没装,自己的事啥也没做,淦。