这里我们用google的两步验证器
插件名:Two Factor Authentication
如果你不知道这插件怎么用,就继续往下看。
我按照http://ucren.com/blog/archives/549 的思路把字符串转换成零宽字符穿,但是不限代码,可以用来转换任意字符串
项目地址:https://github.com/JiaJiaJiang/stringHider
在线工具:https://jiajiajiang.github.io/stringHider/
============2018/10/14更新===========
修复了无法转换ascii码表以外字符的bug
(开始学lua
便于发车的小工具
地址:https://github.com/JiaJiaJiang/toDataURI
选择文本或者文件模式,填好内容或者选择文件
可自定义Content type,一般空着就好
然后点转换。
即可发车。
转换结果让别人粘贴在浏览器地址栏即可。
Demo:http://pages.luojia.me/image-diff/
用于对两张图片进行像素对比,相同的像素结果为白色,不同的像素结果为黑色。
做这个东西是因为某群在讨论QQ的火炬传递页面到底有没有藏什么东西,为了证明它们真的是一模一样的图片,我就做了这东西。。。
我想画幅画贴上来,可是画了一半发现不好看,就不贴上来了。
我想唱首歌贴上来,但是找不到感觉,还是不唱了。
我想用GUItar弹首歌发上来,但是老弹错,还是不发了。
于是这个月的博文可能就要废了
写了个用于google两步验证的类,由于使用到Buffer和加密模块,所以仅可用于node
用javascript写了个base32的编解码函数
const charTable=[
'A', 'B', 'C', 'D', 'E', 'F', 'G', 'H',
'I', 'J', 'K', 'L', 'M', 'N', 'O', 'P',
'Q', 'R', 'S', 'T', 'U', 'V', 'W', 'X',
'Y', 'Z', '2', '3', '4', '5', '6', '7',
'='
],allowedPeddingCount=[6,4,3,1,0];
function str_split(str,length){
if(typeof str !== 'string')return [];
let a=[],i=0;
length||(length=1);
do{
a.push(str.substr(i,length));
i+=length;
}while(i<str.length);
return a;
}
const Base32={
encode:function(str,padding){
if(!str)return '';
let binaryString='';
for (let i = 0;i<str.length;i++) {
let bin=str.charCodeAt(i).toString(2);
binaryString+=('0'.repeat(8-bin.length)+bin);
}
let fiveBitBinaryArray=str_split(binaryString,5),base32='';
for(let i=0;i<fiveBitBinaryArray.length;i++){
let bin=fiveBitBinaryArray[i];
base32+=charTable[parseInt(bin+'0'.repeat(5-bin.length),2)];
}
let x=binaryString.length%40;
if (padding && x != 0) {
if (x == 8)base32+=charTable[32].repeat(6);
else if(x===16)base32+=charTable[32].repeat(4);
else if(x===24)base32+=charTable[32].repeat(3);
else if(x===32)base32+=charTable[32];
}
return base32;
},
decode:function(str){
if(!str)return '';
let paddingMatch=str.match(/\=+$/),
paddingCharCount=paddingMatch?paddingMatch[0].length:0;
if(allowedPeddingCount.indexOf(paddingCharCount)<0)return false;
for (let i=0;i<4;i++){
if (paddingCharCount===allowedPeddingCount[i]
&& str.substr(-(allowedPeddingCount[i]))!=charTable[32].repeat(allowedPeddingCount[i]))
return false;
}
str=str.replace(/\=+$/,'');
let binaryString = "";
for (let i=0;i<str.length;i+=8) {
let x='';
if (charTable.indexOf(str[i])<0)return false;
for (let j=0;j<8;j++) {
let bin=charTable.indexOf(str[i+j]).toString(2);
x+='0'.repeat(5-bin.length)+bin;
}
let eightBits=str_split(x,8);
for (let z = 0; z < eightBits.length; z++) {
let y,cd=parseInt(eightBits[z],2,10);
binaryString+=((y=String.fromCharCode(cd))||cd==48)?y:"";
}
}
return binaryString;
}
}
用一个看起来似乎有点不恰当的办法,用Error对象
(new Error).stack
获取到的是字符串形式的调用栈。
不知道还有没有其它办法来获得调用栈。
取名为GUItar,不想写代码的时候制造点噪音

由于这篇文档原来不知道翻译的什么狗屁东西,而且还那么多人编辑过,我决定把它翻完。
MDN现在关闭注册了,如有不对请指出
https://developer.mozilla.org/zh-CN/docs/Web/API/Canvas_API/Tutorial/Hit_regions_and_accessibility
经过一晚上和半个上午的折腾,网站搬家到vultr了。
虽然是用docker部署的,不过由于mysql镜像有问题,我花了不少时间来研究是哪里出问题了,结果最后换了个镜像版本就好了。
就conoha那样态度恶劣自高自大的服务商,真的是不能省心得用,既然大家都从conoha逃走了,那我也逃走吧。
现在把那只vps当做ss节点用了,坐等被封。
基友联动:https://www.blackglory.me/no-more-conoha/
今天中午收到了Conoha发来的邮件,说我的vps影响到了其它用户,已经被封了。
吃完饭立刻回了一封邮件问他们为什么被封了。