MongoDB定容集合

MongoDB定容集合(capped collection) 用于定义一个大小固定的集合:

1
db.createCollection("coll_name", {capped: true, size:100000})

当插入新的数据导致存储空间超出预设大小时,旧的数据会被清除。但这个表里面的文档是不能被手动删除的,只有 drop 整个表才行。不许删除的原因是为了保持每个文档在磁盘上的位置不变。另外,文档的更新是有限制的,即必须在不增加文档占用空间的前提下才能生效,比如减少字段或减少值的长度,如果更新后的文档比原文档占据更多的空间,就会更新失败。Capped Collection主要用于存储日志信息和缓存一些少用的文档。

unit8array转换为字符串

unit8array 格式是8字节无符号整数数组,如果把它转换为 string 类型呢?

  1. 如果不是 utf8 编码的话,可以用下面的方法:

    1
    2
    3
    function uint8arrToStr(uint8arr){
    return String.fromCharCode.apply(null, uint8arr)
    }
  2. 如果使用了 utf8 编码,在浏览器上可以用下面的方法:

    1
    2
    3
    4
    5
    6
    7
    8
    9
    // 把 Uint8Array 转换为 String
    function uint8arrToStr(uint8arr){
    return new TextDecoder("utf-8").decode(uint8arr)
    }

    // 把 String 转换为 Uint8Array
    function str2Uint8arr(str){
    return new TextEncoder("utf-8").encode(str)
    }

Read More

utf16转换为utf8

如何把 utf16 编码的字符串转换为 utf8 呢?

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function utf16to8(str) {
var out, i, len, c;

out = "";
len = str.length;
for(i = 0; i < len; i++) {
c = str.charCodeAt(i);
if ((c >= 0x0001) && (c <= 0x007F)) {
out += str.charAt(i);
} else if (c > 0x07FF) {
out += String.fromCharCode(0xE0 | ((c >> 12) & 0x0F));
out += String.fromCharCode(0x80 | ((c >> 6) & 0x3F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
} else {
out += String.fromCharCode(0xC0 | ((c >> 6) & 0x1F));
out += String.fromCharCode(0x80 | ((c >> 0) & 0x3F));
}
}
return out;
}

Read More

react登录认证

用 react 框架做项目时,如何实现登录认证呢?即登录成功加载当前页,否则跳转至登录页。可以写一个高阶函数来实现这个目的:

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
import React, { Component } from 'react'
import { connect } from 'react-redux'

export default function(ComposedComponent) {
class Auth extends Component {
componentWillMount() {
if (!this.props.auth.authorized) {
this.props.history.push('/login')
}
}

componentWillUpdate(nextProps) {
if (!nextProps.auth.authorized) {
this.props.history.push('/login')
}
}

render() {
return <ComposedComponent {...this.props} />
}
}

const mapStateToProps = state => ({
auth: state.auth
})

return connect(mapStateToProps)(Auth)
}

Read More

用docker申请letsencrypt通配符证书

用 docker 申请 letsencrypt 证书的好处就是不需要在宿主机上安装依赖,只要用下面的命令即可:

1
2
3
4
5
6
docker run -it --rm \
--name certbot \
-v /mnt/letsencrypt:/etc/letsencrypt \
-v /mnt/bak/letsencrypt:/var/lib/letsencrypt \
certbot/certbot \
certonly --manual --agree-tos --server https://acme-v02.api.letsencrypt.org/directory --preferred-challenges dns -d *.YOUR-DOMAIN.com -d YOUR-DOMAIN.com

具体的命令释义如下:

1
2
3
4
5
6
-v /mnt/letsencrypt:/etc/letsencrypt -v /mnt/bak/letsencrypt:/var/lib/letsencrypt # 挂载目录,certbot申请到的或备份的证书会放在这两个目录
--manual # 交互模式
--agree-tos # 同意服务协议
--server https://acme-v02.api.letsencrypt.org/directory # 指定使用acmev2协议的服务器,因为通配符证书的申请需要这个协议
–preferred-challenges dns # 使用dns检验来证明你拥有这个域名
-d *.YOUR-DOMAIN.com -d YOUR-DOMAIN.com # 指定了需要申请证书的通配符域名,根域名要额外再写一次

Read More

热敏打印机原理及其驱动相关知识

【说明】本文内容均来自网络,用于学习热敏打印机相关知识。

热敏打印机的工作原理是打印头上安装有半导体加热元件,打印头加热并接触热敏打印纸后就可以打印出需要的图案。

热敏打印机化学反应是在高温下进行的,当温度低于60℃时,纸需要经过相当长,甚至长达几年的时间才能变成深色;而当温度为200℃时,这种反映会在几微秒内完成。

打印机安装驱动的原因就是打印机厂商千差万别,不同的打印机往往都有各自的驱动,很难实现万能驱动。但是,在 POS 打印机行业却有一条捷径,就是现在市面上的 POS 打印机基本上都支持爱普生指令,也就是说,只要将程序和打印机联通,直接向端口里面写爱普生指令就可以控制打印机,打印机接受到爱普生指令以后,自行进行解析,然后打印出相应的内容。

Read More

axios忽略https证书错误

使用 axios 请求 https 网站的数据时,如果证书已过期,会报错:

1
Error: certificate has expired

可以使用下面的方法忽略证书错误:

1
2
3
4
5
process.env.NODE_TLS_REJECT_UNAUTHORIZED = '0' // 不拒绝过期的和无效的证书
const agent = new https.Agent({
rejectUnauthorized: false
})
axios.get('https://something.com/foo', { httpsAgent: agent })

jenkins 学习笔记

这里采用 docker 容器来安装和部署 jenkins,首先下载官方镜像:

1
docker pull jenkins/jenkins:lts

然后启动:

1
2
3
4
5
6
7
8
9
# 临时运行
docker run -p 8080:8080 -p 50000:50000 jenkins/jenkins:lts

# 长期维护
docker volume create jenkins-data # 创建数据卷
docker run -d -p 8080:8080 -p 50000:50000 \
-v jenkins-data:/var/jenkins_home \
--name jenkins \
jenkins/jenkins:lts

然后命令行会随机生成管理员密码,先记下来,如果忘了,也可以用下面的命令查看:

1
cat /var/jenkins_home/secrets/initialAdminPassword

Read More

yarn 安装时出现 node incompatible

今天用 yarn 安装依赖失败,报下面的错:

1
The engine "node" is incompatible with this module. Expected version ">=4 <=9". Got "10.14.2"

网上很多人说用 yarn --ignore-engines 可以解决这个问题,然而这样做是有风险的。这个问题产生的原因是依赖包 upath 导致的,它在 package.json 里面限制 node engine 只能是 4~9 版本的,只要把 upath 给升级就行了,解决方法如下:

1
2
3
rm -rf node_modules/
rm yarn.lock
yarn install

这样就会更新 upath 到最新版本。

centos 安装 mozjpeg

首先安装 nasm 环境:

1
yum -y install build-essential nasm libtool

然后下载源码编译:

1
2
3
4
5
6
7
wget https://github.com/mozilla/mozjpeg/archive/v3.3.1.zip
unzip v3.3.1.zip
cd mozjpeg-3.3.1
autoreconf -fiv
./configure
make
make install

安装后的可执行文件所在的目录是 /opt/mozjpeg/bin

1
2
3
4
5
6
7
8
[root@VM_156_24_centos mozjpeg-3.3.1]# ls -hl /opt/mozjpeg/bin
总用量 268K
-rwxr-xr-x 1 root root 56K 1月 23 10:04 cjpeg
-rwxr-xr-x 1 root root 45K 1月 23 10:04 djpeg
-rwxr-xr-x 1 root root 53K 1月 23 10:04 jpegtran
-rwxr-xr-x 1 root root 14K 1月 23 10:04 rdjpgcom
-rwxr-xr-x 1 root root 63K 1月 23 10:04 tjbench
-rwxr-xr-x 1 root root 14K 1月 23 10:04 wrjpgcom

a.jpg 按照 80% 的压缩率保存到 a1.jpg

1
/opt/mozjpeg/bin/cjpeg -quality 80 a.jpg > a1.jpg

cjpeg 默认的压缩率是 75%,-quality 参数可以自定义压缩率。