魏正大的博客

小小的世界,大大的梦想


  • 首页

  • 归档

  • 标签

  • 留言

看见

发表于 2018-10-20

《看见》

花了半个月断断续续看完了柴静的《看见》。这本书值得重新再看一次。

这次看这本书,用手机看,一目十行,有时候看着看着走神了,有时候动动手指就多翻了几页,或者在电梯里地铁里吃饭排队时匆匆看两眼。碎片时间让文章没了上下文,没了沉浸感。用手机看书是方便,随时随地,但不适合看一些有深度的书。

这本书是一个时代的记忆——非典,汶川地震,奥运。也记录了各式各样的人和群体——双城集体服毒的小学生,戒毒所里被卖去卖淫的女人,采访同性恋,不知道犯了什么罪就被关了二十八年的人,因家庭暴力杀死丈夫的女人,山西的环境污染,采访用高跟鞋踩死小猫拍成视频传到网上的女人,华南虎照片真假事件,福建涂岭拆迁户不同意搬迁,户主的儿子——一个刚复员回来的年轻人,二十三岁——被开发商砍死,农村征地问题,采访卢安克,药家鑫事件。

阅读全文 »

Node.js 使用 RSA 做加密

发表于 2018-09-25

RSA

RSA加密算法是一种非对称加密算法。

假设 A 与 B 通信。A 和 B 都提供一个公开的公钥。A 把需要传递的信息,先用自己的私钥签名,再用 B 的公钥加密。B 接收到这串密文后,用自己的私钥解密,用 A 提供的公钥验签。

为什么要先签名后加密?如果你先加密后签名,非法用户通过获取的公钥就可以破解签名,破解之后就可以替换签名。

详细的原理可以参考以下文档:
RSA算法原理(一)
RSA算法原理(二)

node-rsa

在 node.js 中使用 rsa 算法,我们使用的是 node-rsa 这个包。

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
const NodeRSA = require('node-rsa');

const a_public_key_data = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----';
const a_private_key_data = '-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----';

const b_public_key_data = '-----BEGIN PUBLIC KEY----- ... -----END PUBLIC KEY-----';
const b_private_key_data = '-----BEGIN PRIVATE KEY----- ... -----END PRIVATE KEY-----';

// 生成 A 的公私钥对象
const a_public_key = new NodeRSA(a_public_key_data);
const a_private_key = new NodeRSA(a_private_key_data);

// 生成 B 的公私钥对象
const a_public_key = new NodeRSA(a_public_key_data);
const a_private_key = new NodeRSA(a_private_key_data);

const text = 'Hello RSA!';

// 加签并加密
const sign = a_private_key.sign(text, 'base64', 'utf8');
console.log('A 私钥加签:', sign);

const encrypted = a_public_key.encrypt(sign, 'base64');
console.log('B 公钥加密:', encrypted);

// 解密并验签
const decrypted = a_public_key.decrypt(encrypted, 'utf8');
console.log('B 私钥解密:', decrypted);

const verify = a_public_key.verify(text, decrypted, 'utf8', 'base64');
console.log('A 公钥验签:', verify);

serialize

阅读全文 »

用node.js写一个jenkins发版脚本

发表于 2018-09-25

背景

每次到网页里手动发版有点烦,写个脚本来提高开发效率。

CFG

在 jenkins 设置里获取 API TOKEN。
把 host 和账号密码拼接起来就可以通过鉴权。

1
2
3
4
5
6
7
const token = {
user: '',
password: '',
}

const host = 'jenkins.xxx.cn';
const basicUrl = `http://${token.user}:${token.password}@${host}`;

BUILD

阅读全文 »

七牛视频切片方案

发表于 2018-08-07

使用七牛 sdk 上传视频并做分片操作。

step1 生成 token

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 qiniu = require("qiniu");

var accessKey = proc.env.QINIU_ACCESS_KEY;
var secretKey = proc.env.QINIU_SECRET_KEY;
var mac = new qiniu.auth.digest.Mac(accessKey, secretKey);

var bucket = proc.env.QINIU_TEST_BUCKET; // 对象存储空间

//带数据处理的凭证
var origin_filename = "avthumb_test_target.mp4"; // 源文件名
var save_as_filename = `${origin_filename}.m3n8`; // 分片后的文件名

var saveMp4Entry = qiniu.util.urlsafeBase64Encode(`${bucket}:${save_as_filename}`);
var avthumbMp4Fop = "avthumb/m3u8/noDomain/1/segtime/15/vb/440k|saveas/" + saveMp4Entry;

var options = {
scope: bucket,
expires: 3600, // 凭证有效时间
persistentOps: avthumbMp4Fop, // 视频上传后触发预转持久化,切片处理
persistentPipeline: "video-pipe", // 多媒体处理队列
persistentNotifyUrl: "http://api.example.com/qiniu/pfop/notify", // 回调通知地址
}
var putPolicy = new qiniu.rs.PutPolicy(options);
console.log(putPolicy.uploadToken(mac));

生成不同作用的凭证可以查看官方提供的示例nodejs-sdk example。

以上代码为生成上传视频并进行切片处理的凭证。上传相关的文档查看七牛上传策略。

切片动作是由persistentOps参数触发并启动一个异步任务,

persistentOps 详解

阅读全文 »

Sequelize 基本操作

发表于 2018-01-10

sequelize 基本操作

Sequelize 是 Node 的一个 ORM(Object-Relational Mapping) 框架,用来方便数据库操作。

配置 sequelize

以 mysql 为例

首先我们要引入npm包,sequelize 依赖 mysql2 作为底层驱动,暴露出自己的 API 让我们调用,在转成 mysql 语句进行执行。

1
2
"mysql2": "^1.5.1",
"sequelize": "^4.28.6"
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
34
const Sequelize = require('sequelize')

// 连接数据库
const sequelize = new Sequelize('database', 'username', 'password', {
host: sqlconf.host,
dialect: 'mysql', // 这里可以改成任意一种关系型数据库

pool: {
max: 5,
min: 0,
acquire: 30000,
idle: 10000,
},
})

// 测试连接是否成功
sequelize
.authenticate()
.then(() => {
console.log('Connection has been established successfully.')
})
.catch(err => {
console.log('Unable to connect to the database', err)
})

// 根据 model自动创建表
sequelize
.sync()
.then(() => {
console.log('init db ok')
})
.catch(err => {
console.log('init db error', err)
})

我们可以调用sync()根据 model自动在数据库中创建表,也可以不调用,自己手动创。如果使用了 Sequelize 的 Associations,这必须通过 sync() 生成表结构。

创建 model

创建模型,告诉 Sequelize 如何映射数据库表

阅读全文 »

解决 iPhone 微信 H5 无法自动播放音乐问题

发表于 2017-11-29

使用 wx sdk 在html导入sdk js文件。(如果网站是https导入的sdk也要使用https!)
然后在 wx.ready 中设置 play 方法并复制给全局变量 fm,当需要使用的时候再调用 fm()

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
// 全局变量 fm2
var fm2;

wx.config({
debug : false, // 这里为false
appId : '', // 以下随意填写即可
timestamp : (new Date()).getTime(),
nonceStr : '',
signature : '',
jsApiList : ['checkJsApi']
});

wx.ready(function() {
$('#music1').play(); // 第一段音乐页面加载后自动播放
$('#music2').load(); // 第二段音乐等待,触发 fm2 时播放

fm2 = function () {
music2.play();
};
});

fm2(); //调用之后即可播放

promise 和 async 的用法

发表于 2017-10-27

promise

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
34
35
36
37
38
39
40
// 先构造一个 promise 函数
// resolve 和 reject 都是一个函数
// resolve 在成功时调用
// reject 在失败时调用
function promise() {
return new Promise((resolve, reject) => {
let tar = Math.random(0, 1)
if (tar > 0.5) {
console.log('suceess')
setTimeout(function() {
resolve('resolve')
}, 1000)
} else {
console.log('fail')
setTimeout(function() {
reject('reject')
}, 1000)
}
})
}

// then 和 catch 第一个参数为resolve状态时的回调,第二个参数为reject状态时的回调
// catch 相当于 then(null, reject)
promise().then(
(resolve) => console.log('then', resolve)
).catch(
(reject) => console.log('catch', reject)
)


// then 后面还可以接 then 一直链式调用
// 第一个 then 接受的参数是 resolve 函数传过来的参数
// 第二个 then 接受一个参数是第一个 then 返回的值
promise().then(
(resolve) => (resolve + 1) // 接受 resolve 返回 resolve + 1
).then(
(plusOne) => console.log(plusOne) // 接受 resolve +1 并打印
).catch(
(reject) => console.log('catch', reject)
)
阅读全文 »

阿里云云服务器的端口配置问题

发表于 2017-05-23

心血来潮花了9块9(学生价)买了个阿里云。因为后端只会一点 Node,所以上来第一件事就是按照官方教程把部署 Node 项目这个教程撸了一遍。

问题描述

官方教程代码

1
2
3
4
5
6
7
8
9
10
11
const http = require('http');
const hostname = 'ECS公网IP地址'; // 这里把文字换成自己的公网IP地址
const port = 3000;
const server = http.createServer((req, res) => {
res.statusCode = 200;
res.setHeader('Content-Type', 'text/plain');
res.end('Hello World\n');
});
server.listen(port, hostname, () => {
console.log(`Server running at http://${hostname}:${port}/`);
});

一段简单最简单的 Node http服务器,成功运行后可以在页面输出 Hello World。

阅读全文 »

《图解HTTP》读书笔记

发表于 2017-04-23

TCP/IP 协议族

TCP/IP 协议族按层次分为以下4层:应用层、传输层、网络层和数据链路层。

应用层决定了向用户提供应用服务时通信的活动。DNS服务、HTTP协议处于该层。

传输层对上层应用层,提供处于网络连接中的两台计算机之间的数据传输。TCP协议处于该层。

网络层用来处理在网络上流动的数据包。数据包是网络传输的最小数据单位。该层规定了通过怎样的路径到达对方的计算机,并把数据包传给对方。IP网际协议位于该层。

链路层用来处理链接网络的硬件部分。包括操作系统、硬件驱动等。

阅读全文 »

一个 Vue + Node + MongoDB 博客系统

发表于 2017-04-22

源码

耗时半载(半个月)的大项目终于完成了。这是一个博客系统,使用 Vue 做前端框架,Node + express 做后端,数据库使用的是 MongoDB。实现了用户注册、用户登录、博客管理(文章的修改和删除)、文章编辑(Markdown)、标签分类等功能。

很早之前就想写一个个人博客。学了 Vue 之后,把前端部分写出来,然后 Node 一直拖拖拉拉的学了很久,中间又跑去实习了一段时间,所以直到回学校之后才列了个计划把这个项目实现了。

翻出之前写的前端部分,好丑啊,干脆推掉重写吧。前端模仿的是 hexo 的经典主题 NexT ,本来是想把源码直接拿过来用的,后来发现还不如自己写来得快,就全部自己动手实现成 vue components。

实现的功能

  1. 文章的编辑,修改,删除
  2. 支持使用 Markdown 编辑与实时预览
  3. 支持代码高亮
  4. 给文章添加标签
  5. 支持用户注册登录

使用到的技术

前端

  1. Vue.js
  2. vue-cli
  3. vue-router
  4. vue-resource
  5. element-ui
  6. marked
  7. highlight.js

后端

  1. Node.js
  2. Express
  3. Mongoose

基本思路

前端使用 vue-router 操作路由,实现单页应用的效果。使用 vue-resource 从后台获取数据,数据的处理全部都在前端,所以后端要做的事情很简单——把前端打包好的数据存进数据库中和从数据库中取出数据。前后端使用统一的路由命名规则。

阅读全文 »
123
魏正大

魏正大

JavaScript, Node.js

27 日志
18 标签
GitHub
© 2018 - 2019 魏正大
由 Hexo 强力驱动
主题 - NexT.Gemini
你是第 666 位来访的小伙伴 本站总访问量 888 次