分类目录归档:笔记

ESP8266 快速改变输出引脚状态

在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双通道内存

原本我的电脑是两根8G阿斯加特内存插在两个通道各一个槽上组的双通道,最近发现有的时候不够用了,所以又买了一条16G的内存。

之所以这点破事也要写一篇文章,是因为这个过程里我一边调试一边蓝屏了十几次,觉得有必要记录一下。

这是原本的插法

现在是这个插法

两个通道上各凑满16G组成双通道32G

继续阅读双8G加单16G双通道内存

[C++]std::async异步操作 笔记

相关文档:http://zh.cppreference.com/w/cpp/thread/async

这只是一篇个人学习笔记,如有错误欢迎指出

咕了C++一段时间,我又回来学习了,这次是关于STL里自带的线程相关的模板函数async 。

async可以非常方便地用来创建一个异步任务,不同于基于libuv那种事件轮回型的异步编程,这个异步是使用一个新的线程来执行任务,而coder不用自己去管理新的线程。

继续阅读[C++]std::async异步操作 笔记

[C++]lambda表达式笔记

我刚开始学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++]lambda表达式笔记

[Javascript]获取触发message事件的源iframe

翻了翻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);//获取消息源
});

 

[Javascript]清空数组

var a=[123,234,345,567];

a.length=0;//清空了

上面的清空方式虽然非常不合字面含义,不过还确实清空了。。。

 

 

 

var a=[123,234,345,456];

a.splice(0);//清空了

这方法倒是符合字面含义了,不过这个操作会返回整个一个新的数组,所以可能性能不如上面的一种方法。

[Javascript]不要试图给字符串添加属性

虽然我以前就吃过一次这个亏,不过昨天又犯这错误了。

虽然js里万物皆对象,不过也不是啥对象都可以加属性的,比如字符串。

var qweq='asdasdasdas';
qweq.miao=123;

console.log(qweq.miao)//undefined

所以字符串是没法添加属性的,同理,数字、Boolean也不能添加属性。

我发现它们都是传值型变量诶。因为本体只有一个值,所以不能添加属性吗。

PHP传入参数

今天我才知道php脚本用php直接执行的时候是可以传入参数的,这样本地共享session就不需要建个服务器再访问啊什么的。
这里放个例子
文件a.php

<?php
    $args = getopt('a:b:');
    print_r($args);
?>

执行 php a.php -a miao -b 123

结果

Array
(
    [a] => miao
    [b] => 123
)

[PHP]禁止json_encode显式转换为UTF8编码

我今天发现弹幕播放器载入的弹幕虽然不多,但是传回的弹幕json却很大,于是我想起了一个鬼故事[json_encode对[非正常字符]的显式utf8转换],所以很多弹幕数据会被转换成字符形式的utf8码『\uxxxx』,虽然英文字符和中文字符实际上占用的大小不一样,不过把文字显式转换成utf8码仍然是额外消耗空间的,json完全可以保留原本的文字进行json格式化。

那么现在问题来了,会画画的妹纸好还是会唱歌的妹纸好呢
那么现在问题来了,json是否可以直接取消utf8转换呢?如果可以那真是极好,要是不可以的话还得在转换以后正则替换掉所有utf8码。

还好json_encode的第二个设置参数可以设置

 json_encode(数组,JSON_UNESCAPED_UNICODE);

这样就可以取消utf8显式转换了,某视频的弹幕返回的json也从90+K变成了50+K。

SSL不被浏览器信任

上周末我给luojia.me的几个子域名都配置了https,本吊丝果断使用免费证书。

但是配置的时候发现了一个奇怪的问题,就是我的免费证书在Android里用啥浏览器都不被信任,chrome告诉我系统不信任这个证书(所以这篇文章的标题又起错了呢づ ω ど),难道是Android特别鄙视免费证书吗。
后来觉得不怎么可能,抱着死也要用免费证书的心态,我开始使劲解剖搜索引擎,终于,最后在一篇和这个问题没什么关系的文章里看到了一点思路。(文章地址已经不知道了。。)

文章里说网上的ssl配置教程各种复制粘贴,各种缺少步骤啥的,于是写了个超完整的配置说明。
我在那里面发现他的配置里有3个文件路径,但是我只有两个。那么问题可能就出在这里了,我从沃通获取的压缩包里确实也有3个文件,不过根据网上的神教程,我只配置了两个文件
继续阅读SSL不被浏览器信任

正则表达式匹配引号内内容

用正则匹配引号内容还是很常用的嘛,于是我来发一篇相关文章。也是因为我自己用到了,并自己写了个,所以来记录一下。

匹配所有的成对单双引号

/((?<!\\)['"`]).*?\1/g

匹配效果是:寻找一个没有被转义的单引号或双引号,然后匹配包括引号在内的内容,直到下一个对应的没有被转义的单引号或双引号,这样匹配可以不受单双引号嵌套的干扰。

如果只要引号内的内容,只要给.*?加上括号即可,只是这样似乎没法一次匹配所有的结果

/((?<!\\)['"`])(.*?)\1/

然后提取编号为2的结果即为引号里的内容

Canvas文字绘制性能测试

做了个canvas文字测试,看看效果如何。
由于代码中包含了图片的base64码所以放在最后了,测试结果如下:

//代码内容:一张写了5个蓝色喵的图片和5个无任何样式的喵字各绘制十万次
123.8950000006298	//图片
153.4990000000107	//文字
91.63100000114355	//图片
150.8400000002439	//文字
88.55799999946612	//图片
150.93399999932444	//文字
88.62000000044645	//图片
150.16500000092492	//文字
87.77499999996508	//图片
149.93399999912072	//文字
87.90600000065751	//图片
149.8909999991156	//文字
87.98000000024331 	//图片
65.1319999997213 	//文字

为了尽量准确一点,避免浏览器热身等原因我把测试放在循环里进行多次测试。
可见文字渲染确实是效率比较低的,不过这里还不是太明显。
这里的文字渲染还是无任何样式的,平常应用的时候不可能就这么用没样式的字,所以我还要再来一个有样式文字渲染测试。
继续阅读Canvas文字绘制性能测试

【复习】C++定义变量

好久没动C++了,几乎都给忘得差不多了,于是我来打一些复习笔记的说。

写了那么久的js都已经没有主函数的概念了。。。所以出现了函数到处定义,变量到处定义,企图动态修改类之类的事情,然后就是一堆错误信息<(。_。)>

首先从定义变量开始

//括号里代表写不写都一个意思
(signed) short (int) a;
(signed) int miao;
(signed) (long) int b;
(signed) long long (int) d;
unsigned short (int) c;
unsigned int;
unsigned (long) int d;
unsigned long long (int) bilibili;

float e;//-3.4e38~3.4e38
double f;//long double的默认形式 -1.7e308~1.7e308
(signed) char g;//-128~127(不同值代表不同符号)
unsigned char h;//0~255
bool i;//true/false

继续阅读【复习】C++定义变量

使用git备份网站

这两天我突然想备份一下网站,总是担心啥时候openshift会挂掉。

一开始我想直接把网站打包下载下来,但是现在我的网络太不争气了,下载只有10K/s的速度了。。。。这得下到什么时候(ーー;)
于是我就想把网站备份到在线服务上去,然后发现了各种备份wordpress的插件巴拉巴拉巴拉。。。。

但是感觉这样每次备份都要把整个网站打包发出去实在太伤身了啊,于是我就想到了用git来备份这个方法。。இ௰இ,这样只要朝备份服务器push改动的文件就行了,而且这样也方便在网站搬家的时候直接从备份拉取,免了上传下载的烦恼。

那么接下来就开始做吧!

1是设置git服务的教程,已经有了的跳到底下看2

继续阅读使用git备份网站