写了个Browserify插件,之前一直没问题,但今天我改了点打包流程,结果一直报`write after end`错误,找了半个晚上,发现是因为我的插件函数写的是异步的,里面有个await异步读文件。
之前一直没出问题是因为后面的打包流程时间够长,能让这个插件正常执行完,但今天改了流程之后部分情况下很快就执行完了,于是当插件异步流程执行完后继续就出错了,修正方法是把异步文件读取改成同步的。
写了个Browserify插件,之前一直没问题,但今天我改了点打包流程,结果一直报`write after end`错误,找了半个晚上,发现是因为我的插件函数写的是异步的,里面有个await异步读文件。
之前一直没出问题是因为后面的打包流程时间够长,能让这个插件正常执行完,但今天改了流程之后部分情况下很快就执行完了,于是当插件异步流程执行完后继续就出错了,修正方法是把异步文件读取改成同步的。
不是我想水一篇博文,在解决完前一篇博文的问题之后,立刻就又碰上另一个奇葩问题,进程直接跑着跑着没了,留下一个错误码3221226505。
在我左思右想把代码改来改去,包换来换去之后依然不能解决问题,然后发现是canvas包的问题,之所以一直没有发现是它,是因为出问题的代码里并没有用到这个包,它是在别的地方被引用到的,可能它的二进制模块破坏了node的环境,导致别的代码执行的时候触发了异常导致程序崩溃。
这个问题其实也不是第一次出现了,而且每次都是因为项目中同时有canvas和sharp两个模块才出现问题,在某些版本下不会出问题,某些版本下又会出现不一样的错误,这次就是和上次不一样所以才没能快速发现。
就这点破事,又浪费了我一个晚上,这时候我真想给搞出这bug的人屁股上来一脚。
今天一个破问题浪费我一下午的时间,我一直在找自己代码是不是有什么问题,或者是不是express有什么bug,结果到最后发现原来是iis的问题。
如果是在win上用iis反代站点的话,通常都会用iis的requestRouter插件,在他的设置页面`Application Request Routing`里网上的教程通常都勾着`Reverse rewrite host in response headers`这一项,就是因为这个设置导致后端返回的http头中location指定的跳转地址被替换为了此站点的地址,不知道这是个什么智障操作。
找到虚拟机vmx文件,用文本编辑器打开,找到`usb.restrictions.defaultAllow = “FALSE”`,改为`usb.restrictions.defaultAllow = “TRUE”`即可。
这是一篇小笔记,truenas默认没法使用pkg install来安装包,会出现以下报错
“`shell
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.conf`中`enabled`后的yes改成no,把`FreeBSD.conf`中`enabled`后的no改成yes即可。
方案来源 : https://www.justinsilver.com/random/fix-pkg-on-freenas-11-2/
“`sql
show table status from `库名` where name=’表名’
“`
然后从中读取Data_length 字段就是该表占用的字节数。
我查的时候看到一堆答案都是遍历表里每个字段然后sum加起来计算,就没搞懂这是为啥。
这是一篇错误处理记录,该错误出于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了。
这篇博文是对于该模块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();
在Arduino中使用digitalWrite来设置引脚的高低电平其实并不只是做了改变引脚寄存器数据这一件事,所以它的效率并不高,在需要高频输出的场景下就会出现瓶颈。
最近我在写大型LED矩阵屏驱动板的时候就遇到了这样的情况,一轮loop的速度太慢以至于watch dog以为程序死循环了而导致重启。后来我查来查去发现可以通过直接改变寄存器的数据来改变引脚的输出电平,而且官方头文件里其实也有对应的宏可以进行相关操作,但我怎么试都没成功,最后在一个官方demo里发现了一个函数,效率也同样不错,所以抄出来记录一下
void ICACHE_RAM_ATTR __digitalWrite(uint8_t pin, uint8_t val) {
if(pin < 16){
if(val) GPOS = (1 << pin);
else GPOC = (1 << pin);
} else if(pin == 16){
if(val) GP16O |= 1;
else GP16O &= ~1;
}
}
只要调用`__digitalWrite(gpio引脚,0或1)` 就可以了。
==========更新===========
把这个函数写成宏可以更进一步提高效率
//pin最好为常数,以便编译器优化掉判断
#define __digitalWrite(pin,val)\
if(pin < 16){\
if(val) GPOS = (1 << pin);\
else GPOC = (1 << pin);\
} else if(pin == 16){\
if(val) GP16O |= 1;\
else GP16O &= ~1;\
}
原本我的电脑是两根8G阿斯加特内存插在两个通道各一个槽上组的双通道,最近发现有的时候不够用了,所以又买了一条16G的内存。
之所以这点破事也要写一篇文章,是因为这个过程里我一边调试一边蓝屏了十几次,觉得有必要记录一下。
这是原本的插法
现在是这个插法
两个通道上各凑满16G组成双通道32G
相关文档:http://zh.cppreference.com/w/cpp/thread/async
这只是一篇个人学习笔记,如有错误欢迎指出
咕了C++一段时间,我又回来学习了,这次是关于STL里自带的线程相关的模板函数`async` 。
async可以非常方便地用来创建一个异步任务,不同于基于libuv那种事件轮回型的异步编程,这个异步是使用一个新的线程来执行任务,而coder不用自己去管理新的线程。
我刚开始学C++的时候似乎还没有lambda表达式这东西。这个blog的第一篇可见文章在2012年8月,还有一些更早的都是些垃圾水文被我删掉了,开设这个blog的时间我记得在学了web一段时间之后,在那之前我也在各种免费php空间搭过wordpress用过一段时间,后来废了。在更之前我还坚持用自己写的“佳佳空间”当blog用了很长一段时间(虽然后来终于还是放弃了,因为写得太垃圾)。推算下来可能要到9年多前了,大概就是小学的时候?反正是在2011年之前,而lambda表达式是C++11标准里的,所以那时候应该确实没有这东西。
好了回到正题。
C++的lambda表达式和js里的有点不一样,它可以自己选择是否打通函数范围之外的上下文,以使用外面的变量。还可以选择如何打通(引用外部变量和复制外部变量)。
lambda函数的结构长这样
[外部变量规则]{函数体}//没参数省略括号
[外部变量规则](参数){函数体}//省略返回类型指定
[外部变量规则](参数)->返回类型{函数体}//到C++11为止的完整形态
C++20又加了一个形式,暂时就不写在这了,毕竟2020年还没到呢不着急,而且也没编译器实现了。
C++是我学的第一个编程语言,也是我第一个放弃的编程语言,然后我就进入web路线了。
现在感觉转入web还是个不错的选择,学到的东西比只学C++要广泛的多,现在重新学一学C++来弥补一下某些时候性能上的缺陷。
翻了翻message事件的属性,没找到可以直接获取事件源iframe的属性,想想也没毛病,毕竟事件也可以是其它窗口post过来的。于是想了个曲线方法。
先让发送源获取焦点,然后获取焦点元素。
window.addEventListener('message',function(msg){
//做一些事来判断是不是某个iframe发送的消息
msg.source.focus();
var sourceFrame=document.activeElement;
});
如果不想影响焦点的话,可以遍历一遍所有的iframe
function findIframe(win){
var fs=document.querySelectorAll('iframe');
for(var is=fs.length;is--;){
if(fs[is].contentWindow==win)
return fs[is];
}
}
window.addEventListener('message',function(msg){
var iframe=findIframe(msg.source);//获取消息源
});
用一个看起来似乎有点不恰当的办法,用Error对象
(new Error).stack
获取到的是字符串形式的调用栈。
不知道还有没有其它办法来获得调用栈。