liuliaixue

当白云悠然褪去我已等不及登上高山仰望西方的天空但最美的不是夕阳是夜色如水月色流离


  • 首页

  • 归档

  • 标签

how-to-compile-vscode-on-ubuntu18.04

发表于 2019-11-11

最近听说 vscode 出了 web 版,想体验下,直接下官网源码编译

编译环境 ubuntu18.04

  1. 下载 master 分支上的压缩吧,11M 左右
    https://codeload.github.com/microsoft/vscode/zip/master
  2. 解压
  3. 安装依赖
    1. npm 不行,提示用 yarn
      1. 用 yarn 提示等级低,需要升级
        1. 到这里遇到不少问题,最后找到官方的说明文档,安装依赖
        2. 其中有几个库(libx11-dev)不兼容,需要降级,由于是重要更新所以apt不允许安装旧版本,需要手动更新,具体方法是sudo apt install [software]=[version]
  4. yarn
  5. yarn web 正常启动
  6. yarn watch 下载 ffmpeg 和electroc后启动

踩了不少坑,主要 一个是没有及时找到官方的说明文档https://github.com/microsoft/vscode/wiki/How-to-Contribute, 一个是官方维护的库apt不能自动安装(libx11-dev), 不知道该怎么搜这个问题,没有搜到关键字(https://blog.csdn.net/qq_38491310/article/details/86510666)

node-v10 install

发表于 2019-09-30
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
#!/bin/bash

wget https://nodejs.org/dist/v10.16.3/node-v10.16.3-linux-x64.tar.xz

xz -d node-v10.16.3-linux-x64.tar.xz
tar xvf node-v10.16.3-linux-x64.tar

echo `pwd`

echo "" >> ~/.bashrc
echo "export NODE_HOME=`pwd`/node-v10.16.3-linux-x64" >> ~/.bashrc
echo "export PATH=\$NODE_HOME/bin:\$PATH" >> ~/.bashrc
echo "" >> ~/.bashrc

source ~/.bashrc

https 原理

发表于 2019-09-17

基本原理原理

对称加密

加密和解密用的同一套算法,比如

原文 “abc”, 加密 “所有字母序号+1”

密文 “bcd”, 解密 “所有字母序号-1”

非对称个加密

基于大数的分解困难,加密解密用不同的文件
原文 “abc…”, 加密 “私钥”

密文 “…bcd”, 解密 “公钥”

加密传输

A 保有私钥,将公钥发给 B

A:原文加密成密文, 取原文的hash
发出的消息为密文 + hash

B:将密文解密成原文1, 取原文1的hash1
如果hash===hash1,则原文是从 A 发出的,并且原文 === 原文1没有被更改过

证书

在于如何将公钥发给 B?

或者说如何证明给 B 发消息的是 A?

和加密传输类似,需要向一些可信任的机构申请证书

CE 的私钥, A 取得 CE 的公钥, 浏览器也有 CE 的公钥

A: A的信息中包含自己的信息,比如域名,将其发送给CE
CE: CE将 A的信息用私钥加密,并将A的信息取hash,加在一起就成了 A 的证书

浏览器(用户 B): 与 A 通信系时先取得A的证书,用 CE 的公钥解密验证 hash,即可取得A的信息

这个信息是经过CE认证的,浏览器预先信任了CE,所以也就信任了A的信息

也就证明了这个证书确实是A的, 浏览器确实在与 A 通信

创建docker镜像并连接到docker数据库

发表于 2019-09-16

1 首先拉去 mongo 镜像并启动

1
sudo docker run -d -p 27017:27017 --name local-mongo mongo:3.2

2 创建一个简单的服务器镜像,总共两个文件

1
2
3
4
5
6
7
8
9
// app.js
const http = require('http');

http
.Server(function(req, res) {
console.log(new Date());
res.end(new Date().toString());
})
.listen(4040);
1
2
3
4
5
6
7
8
9
10
11
12
13
14
#Dockerfile
FROM node:10-alpine

MAINTAINER shangbi "liuliaixue@qq.com"

WORKDIR /home/backend

COPY app.js /home/backend

EXPOSE 4040

# RUN ls /home/backend
# RUN node -v
CMD node /home/backend/app.js

测试过程中可以在 Dockerfile 打印点东西,打包好了可以 docker logs 查看日志,方便查看问题

1
2
3
4
5
6
# 创建镜像
sudo docker build -t liuliaixue/lmc:1
# 启动容器
sudo docker run --name server1 -p 4040:4040 -d liuliaixue/lmc:1
# 查看服务器log,标准输出
sudo docker logs -f server1

然后可以在浏览器里访问 http://localhost:4040

3 创建一个连接了数据库的服务

1
2
3
4
5
6
7
8
9

const mongoose = require ('mongoose')

// connect to mongo db
const mongoUri = 'mongodb://db/lmc'
mongoose.connect(mongoUri, { keepAlive: true });
mongoose.connection.on('error', () => {
throw new Error(`unable to connect to database: ${mongoUri}`);
});

注意这里的 mongoUri 是mongodb://db/lmc,因为下一步 把 mongo 的 ip 映射到了 db

1
2
3
4
5
6
7
8
9
10
11
12
13
14
FROM node:10-alpine

MAINTAINER shangbi "liuliaixue@qq.com"

WORKDIR /home/backend

COPY .docker.env /home/backend/.env
COPY ./dist /home/backend/dist
COPY package.json /home/backend

RUN npm install

EXPOSE 4040
CMD node /home/backend/dist/index.js
1
2
3
sudo docker stop server1
sudo docker run build -t liuliaixue/lmc:2
sudo docker run --name server2 -p 4040:4040 -d --link local-mongo:db liuliaixue/lmc:2

启动服务器,这是用--link 把 mongo 地址映射db

此时可以进入 server2 查看 hosts cat /etc/hosts


ref:

https://www.cnblogs.com/lighten/p/6900556.html
https://www.oschina.net/translate/dockerlinks?cmp

mongo 中级 聚合

发表于 2018-08-22

聚合的四个关键字 count,distinct,group,mapReduce

1
2
3
4
5
6
7
8
9
db.user.find();

{_id: ObjectId(0000000000000000001)', name: 'alan', age: 20}
{_id: ObjectId(0000000000000000002)', name: 'wei', age: 21}
{_id: ObjectId(0000000000000000003)', name: 'Lee', age: 23}

{_id: ObjectId(0000000000000000004)', name: 'Fee', age: 20}
{_id: ObjectId(0000000000000000005)', name: 'D.D.', age: 23}
{_id: ObjectId(0000000000000000006)', name: 'Cd', age: 20}

count

1
2
db.user.count()
// 6

distinct

1
2
db.user.distinct('age')
// [20, 21, 23]

group

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
db.user.group({
key: {age: true},
initial: {users: []},
$reduce: function(cur, prev) {
prev.users.push(cur.name)
}
})

/*
[{
age: 20,
users: ['alan', 'Fee', 'Cd']
},{
age: 21,
users:['wei']
},{
age: 23,
users: ['Lee','D.D.']
}]

*/
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
db.user.group({
key: {age: true},
initial: {users: []},
finalize:function(out) {
out.count = out.users.lenght
},
condition: {age: {$lt: 22}},
$reduce: function(cur, prev) {
prev.users.push(cur.name)
}
})

/*
[{
age: 20,
users: ['alan', 'Fee', 'Cd'],
count: 3
},{
age: 21,
users:['wei'],
count: 1
}]

*/

mapReduce

the process:

dd

refs:
cnblogs
1
cnblogs

git branch

发表于 2018-07-11

开发一段时间后发现本地有很多已经合并了的分支,但是一个一个删除又很麻烦,写个脚本把develop以外的全删了

show all branch beside master

1
git branch | grep -v "develop"

delete all

1
git branch | grep -v "develop" | xargs git branch -d

React lifecycle

发表于 2018-07-11

React Lifecycle

首次渲染

1、getDefaultProps(): Props
2、getInitialState(): State
3、componentWillMount
4、render
5、componentDidMount

修改state后更新

1、shouldComponentUpdate(): boolean
2、componentWillUpdate
3、render
4、componentDidUpdate

修改 props

1、componentWillReceiveProps(nextProps: Props)
2、shouldComponentUpdate
3、componentWillUpdate
4、render
5、componentDidUpdate

ref: https://segmentfault.com/a/1190000004168886

handle error in promise

发表于 2018-07-10

在使用promise嵌套时,容易忽略一点,promise中的回调有错误不会被catch到

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
const fs = require('fs');
const reader = (file) => {
return new Promise((resolve, reject) => {
let row = ''
const rs = fs.createReadStream(file, { encoding: 'utf8' });
rs.on('data', chunk => {
row += chunk
console.log('@chunk', chunk)
throw new Error('Error in callback')

})
rs.on('close', () => resolve(row))
})
}

executor = async () => {
try {
await reader('./test.js')
} catch (e) {
console.log('Error in reader')
}

}
executor()

这错误在Error in callback,并且错误没有被外层catch到,导致程序退出

正确的写法,handle callback中的error

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
const fs = require('fs');
const reader = (file) => {
return new Promise((resolve, reject) => {
let row = ''
const rs = fs.createReadStream(file, { encoding: 'utf8' });
rs.on('data', chunk => {
try {
row += chunk
console.log('@chunk', chunk)
throw new Error('Error in callback')
} catch (e) {
reject(e)
}
})
rs.on('close', () => resolve(row))
})
}

executor = async () => {
try {
await reader('./test.js')
} catch (e) {
console.log('Error in reader')
}

}
executor()

一个游戏的二进制文件修改

发表于 2018-07-10
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
29
30
31
32
33
const fs = require('fs')

const filepath = './paul.dll'
const point = 0x0000BFD0;

const bf = fs.readFileSync(filepath)

let datas = []

for (let i = 0; i < 12; i++) {
datas.push(bf[point + i])
}

console.log('origin', datas)
console.log('should', [0x55, 0x8B, 0xEC, 0xB8, 0x44, 0x27, 0x00, 0x00, 0xE8, 0x63, 0x7E, 0x0F])


const updatedDatas = [0x80, 0x35, 0x5D, 0xA0, 0xB3, 0x01, 0x20, 0x33, 0xC0, 0x40, 0xC2, 0x08]

for (let i = 0; i < 12; i++) {
bf[point + i] = updatedDatas[i]
}

let temp = []
for (let i = 0; i < 12; i++) {
temp.push(bf[point + i])
}
console.log(temp)
console.log(updatedDatas)

fs.writeFileSync('dd.dll', bf, 'buffer')

console.log('new paul.dll was created')

mongo 入门

发表于 2018-06-05

简单的增删改查

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
                
show dbs; // 数据库列表

use testdb // 使用一个数据库[testdb]

db // 当前数据库

db.user.insert({name:'Alan',age:25}) // 表[uesr]插入一条数据

db.user.find() // 表[uesr]查找所有数据

db.user.find().pretty() // 表[uesr]查找所有数据并格式化显示

db.user.update({name:'Alan'},{name:'Alan',age:26}) // 表[uesr]更新数据

db.user.remove({age:25}) // 删除数据

show tables; // 当前数据库的表
show collections // 当前数据库的表

细说增删改查

insert 插入

1
2
db[collect].insert(object);
db.user.insert({name:'li',age:27,height:150,weight:60});

find 查找

>, >=, <, <=, !=, =
1
2
// 操作符:"$gt", "$gte", "$lt", "$lte", "$ne"                 
db.user.find({name:'liu',age:{$gt:20}})
And OR In NotIn
1
2
// 操作符: "", "$or", "$in", "$nin" 
db.user.find({name:'liu',height:{$in:[150,160]}}) ;
正则匹配
1
db.user.find({name:/^liu$/})
复杂查找
1
2
3
4
5
6
// 操作符:$where
db.user.find({
$where: function() {
return this.name == "liu";
}
})

update 更新

整体更新和局部更新,整体更新只保存整个新文档,局部更新一部分数据

$inc 这条数据的增量
1
db.user.update({age:27},{$inc:{age:1}});
$set 这条数据的终值
1
db.user.update({age:27},{$set:{age:28}});

remove

删除,同简单操作

strat,limit

db.count.find().limit(3).skip(2)

12…6
Alan

Alan

55 日志
92 标签
© 2019 Alan
由 Hexo 强力驱动
主题 - NexT.Muse