分类目录归档:笔记

[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备份网站

接触node.js有感

今天我出于好奇接触了一下node.js。
由于还有点js基础,看起来不是很费劲,先不说我学到了什么,我想说的是我发现了自己一直以来的错误观念。

原来我认为:访问一个url,它的地址就是对应的服务器路径。比如http:\\blog.luojia.me\1.html,这里1.html就是对应网站目录里的1.html。
但其实并不是,url应该当作一整个字符串来看而不是分成目录层级或文件,如何处理这个1.html文件的请求完全是由服务器程序说了算的。

也许和我有一样误解的人还没看懂是啥意思,那就举个例子:
我在用node.js启动一个最简单的hello world服务器时,访问了同目录下的其它文件,结果浏览器结果还是那个hello world页面,也就是服务器在不解析url的情况下,完全不可能访问到任何文件。这个问题自己尝试的时候比较好理解,但是就我这极渣的表达能力可能说不清楚。

总之就是说明了url路径和服务器路径并没有一定的相关关系,这也就是服务器路径重写的原理。

另外nodejs给了我一点惊奇,我原以为它类似于php需要个像apache或iis这样的服务器来运行,没想到它本身就可以做成服务端(虽然PHP似乎也有内置的服务器功能)。从编写代码层面来说,如果php是用钢筋混凝土在造房子,那nodejs就像在造钢筋混凝土材料,然后再搭房子。虽然当我看到连静态文件都得自己写代码路由的时候我有点想找小伙伴来一起惊呆,不过从零配件角度来看还是可以理解的。

再另外,每改一次代码我就得ctrl+c停掉服务器再启动真是太不科学的设计了吖,难道没有debug模式自动监视文件更改吗。(到底有没有我也不知道,有的话求方法)

函数指针利用

在C++里,变量有指针,比如int *a;之类的,指针的用处是很大的,可以让程序操作过程更加灵活。
我写这篇文章是为了记录刚刚自己无师自通的函数指针和它的用法。

一般的函数用法类似这样【只是举个例子我懒得写return了_( •́ ​ω •̀ 」∠)/_】

int a(){
	cout<<"这是a函数";
}
a();
//输出结果:这是a函数

继续阅读函数指针利用