背景

今天在写脚本的时候遇到这么一个问题,cp复制过程中报错:

1
cp: will not overwrite just-created `xxxx'

没来由的,cp这么基础的命令怎么还会出错?想了想我这命令也就复制的文件多一点,可能是cp的文件太多了,导致cp参数超限了。于是开始验证,同样的复制命令,删除了一些文件之后就cp成功了。

虽然根据谷歌查找到的资料显示,我这cp的源文件长度还远没有到达最大限制。不纠缠于此,既然文件太多了,那么使用xargs来复制吧。

xargs

直接附上命令:

1
find ${src_dir} -type f | xargs -i cp {} ${dst_dir}

由于cp是二元操作,需要传入源文件,这里需要使用xargs的替换模式。使用-i参数,然后可以使用{}表示来自标准输入的参数。

背景

前面博文总结了favlink的用户登录验证系统。说到登录验证那必然少不了用户名、密码的验证过程,而密码的操作也离不开加密,解密,毕竟不能明文存储吧!本篇就简单总结一下favlink开发过程中用到的nodejs加解密库。

crypto简介

Crypto是包含在nodejs内核中的,主要提供加密、解密、签名、验证等功能。利用了OpenSSL来实现其加密技术。

使用方式

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
var crypto = require('crypto');
//加密
function encrypt(str,secret){
var cipher = crypto.createCipher('aes192',secret);
var enc = cipher.update(str,'utf8','hex');
enc += cipher.final('hex');
return enc;
}
//解密
function decrypt(str,secret){
var decipher = crypto.createDecipher('aes192',secret);
var dec = decipher.update(str,'hex','utf8');
dec += decipher.final('utf8');
return dec;
}
  • 我们先来看加密操作。
    crypto.createCipher(algo,pwd),该函数接收两个参数,一个加密算法,一个密钥字串,返回一个’Cipher’对象。
    加密算法有很多种,我这里使用的是’aes192’,可以运行下面的代码查看所有支持的算法:

    1
    2
    var crypto = require('crypto');
    console.log(crypto.getCiphers());

    cipher.update(data[,input_encoding][,output_encoding]),该函数可接收三个参数,编码可选(输入只能是'utf8','ascii','binary'之一,输出只能是'binary','base64','hex'),返回指定编码后的加密数据,如果编码缺省,则返回buffer类型。
    cipher.update()可以运行多次,但只能在cipher.final()之前运行。
    cipher.final(output_encoding),返回指定编码的加密字串。

  • 解密操作
    解密操作类似,首先先定义解密用decipher对象,保持和加密所用的密钥、加密算法一致;
    然后使用decipher将加密字串解密即可。

示例

  1. 加密

    1
    2
    encrypt("helloworld","weird sheep");
    //Output: faf46f87e8befb82bc643805cfd753a6
  2. 解密

    1
    2
    decrypt("faf46f87e8befb82bc643805cfd753a6","weird sheep");
    //Output: helloworld

在读

已读


指数基金投资指南

年过而立,是时候该考虑如何理财了。去年在大牛市时踏入股市,亏了个屁滚尿流。懵懵懂懂中接受了风险教育,实战中的教训给我这个小白上了结结实实的一课。如今对资本市场已经不再是”初生牛犊不怕虎”,充满敬畏之心的我开始思考从理论上补充知识。这是我近期完整读完的一本有关指数基金理财的书,书中介绍了指数基金的基本知识并结合实例说明了如何进行指数基金定投。由于基础知识的缺乏,部分内容如定投计划的制定看的并不太明白。总体说这本指数基金定投入门电子书还是不错的。


天朝崛起

内容及写法都一般吧,看书名还以为是写”本朝”的崛起经历,由于是在百度阅读上下载的也没细看就下了。看了内容才发现这是一本有关历代封建王朝的兴衰简史。流水账式的叙述了王朝的兴起背景、王朝盛兴的过程及统治策略、王朝的特点。比较适合对中国史已经比较了解的看看,宏观上纵览下整个封建时代的王朝兴衰。


岛上书店

“我告诉你,生活中每一桩糟糕的事,几乎都是时机不当的结果。每件好事,都是时机恰到好处的结果。” – 兰比亚斯
“我们读书而后知道自己并不孤单。我们读书,因为我们孤单;我们读书,然后就不孤单,我们并不孤单。” – A.J.F
羡慕A.J.F拥有阿米莉亚这样志趣相投的灵魂伴侣,即使最后作者还是安排了他病死。我想大家都会羡慕的吧~


消失的地平线

很久没读书,熬夜看完了这本著名的乌托邦小说。然而跟很多看完”深受震动”的人的观感不一的是,我却并没有这般感受,甚至觉得有些许的”价值观扭曲和强加”之感。主人公一行”误入”香格里拉,其背后的真相竟然是”亦基督亦佛”的大喇嘛们寻找香格里拉继承人的一番”阴谋”,正如马连森说的一样,”这和织网的蜘蛛布下的陷阱有何区别”?而理想国度里的”长生不老”我想并不是所有人的理想目标,这个世界,有淡然的康韦,也有急躁的马连森,在如今这个多元化的世界里,并不能说慢节奏的闲适生活就比快节奏的忙碌生活高明多少,重要的是每个人的自由选择。反正在我看来,”无所事事”的”长生不老”并不是那么有吸引力。”任何人类的情感敌不过五年的分离”,我想这样的闲适和淡定的源头不是真正的”入定”,大抵是一种类似”心死”的苦闷吧?那些不是那么主动愿意留在香格里拉的人们,如马连森和洛岑,即使拥有了长生不老,香格里拉是他们的理想国吗?


活着

很早就知道余华以及他的《活着》,困顿的青少年时代买不起的书只有现在补上。余华在这本书里以冷静地近乎残忍的笔调描写了一个无比绝望而又无比坚强的”活着”故事。再一次让我叩问活着的意义。”人是为了活着本身而活着的,而不是为了活着之外的任何事物而活着”。福贵的苦难也是那个时代中国人的苦难的缩影,在命运的洪流面前个人的力量好像真的很渺小。童年也曾经历了一段艰难而困苦的日子,每每看到这些苦难的经历和故事,总难免不了一些唏嘘感叹下的泪湿眼眶。


javascript异步编程

目前看过最好的一本技术翻译书,没有翻译腔,技术表达也比较到位,让人很有阅读欲,文字描述甚至可以说很有文采。

阅读全文 »

背景

我在业余开发了一个藏经阁项目,它是一个完全针对用户定制化的网址收藏导航网站。因此用户注册和登录验证就成了最基本的需求和问题。
藏经阁使用了Node Express框架进行开发,因此本篇简单总结一下Node使用session和cookie进行登录以及权限验证的过程。

Cookie和Session

首先我们先来了解一下登录验证的原理。

众所周知,HTTP是一个无状态协议,所以客户端每次发出请求时,下一次请求无法得知上一次请求所包含的状态数据,如何能把一个用户的状态数据关联起来呢?

比如在淘宝的某个页面中,你进行了登录操作,当你跳转到商品页时,服务端如何知道你是已经登录的状态?

首先产生了Cookie这门技术。Cookie是http协议的一部分,它的处理分为几步:

  1. 服务端向客户端发送cookie
  2. 浏览器保存cookie
  3. 每次请求浏览器都将cookie发送给服务器

cookie虽然很方便,但存在一个很大的弊端,就是cookie中的数据可以在客户端被修改,这就存在很大的风险隐患。恶意用户可能会通过伪造cookie来假冒别人登录。
为了解决这个问题,就产生了Session。

Session

Session的数据是保留在服务器端的,session的运作通过一个session_id来进行。session_id通常存在cookie中,在express中,默认是connect.sid这个字段。当请求到来时,服务端检查cookie中保存的session_id,并通过session_id与服务器端的session数据关联起来。

因此,当你访问网页时,服务端随机产生了一个1024比特的字符串存在客户端的cookie中。当你下次访问时,cookie会带有这个字段,然后浏览器就知道你是上次访问过的某某啦。由于session数据是存储在服务器的,并且session_id是随机产生的,位数也足够多,所以也不用担心被人伪造。伪造的成功率比坐在电脑前写代码被突然天降的流星砸死的概率还低。

阅读全文 »

MongoDB数据备份

1. 语法
1
mongodump -h dbhost -d dbname -c collection -o dbdirectory
  • -h: mongodb所在服务器地址
  • -d: 需要备份的数据库实例名称,如test,如果不指定将备份所有的数据库
  • -c: 指定需要备份的数据表,如果不指定备份所有collection
  • -o: 数据备份存放的路径,如不存在需要提前建立,如:./backup,备份完成后备份数据会被存放在./backup/test
2. 示例
1
mongodump -d favlink -o ./favlinks

上述命令将本地数据库的favlink实例备份到当前路径的favlinks目录下,备份完成后的数据如图显示:

阅读全文 »

背景

Hexo作为纯静态的博客系统决定了它要想实现一些诸如评论、统计等需要后台支持的功能时只能依赖第三方服务了。
站点的访问量统计,我使用的是”站长统计”,但有时候我们写了博客文章也想更方便的查看每篇文章的阅读量。这时候站长统计就不太方便了,要是能在每篇博文上直观地展现阅读量数据就好了。

网上搜索了下”hexo 访问统计”绝大部分都是提到了一个叫做”卜算子”的第三方服务,但使用个人的工具总是不那么让我放心,于是一直没有采用还是决定自己动手,鉴于不想自己搭建后端服务(穷,买不起vps…),还是想找找看有没有更专业点的第三方服务。于是一番搜寻后还真找到个:firebase
本篇博文即是在firebase的基础上,为hexo博客增加文章阅读量统计,适用于”Next”主题,其他主题可供参考。

firebase使用

  1. 首先需要注册一个firebase账户
    访问firebase官网,注册账户

    点击右上角”SIGN UP WITH GOOGLE”

  2. 创建应用
    注册以后会自动创建一个应用,也可以自己创建一个新的应用

  3. 官网提供了QuickStart文档,可以看看,也可以直接跟着我下面的步骤操作

  4. 读写数据API
    根据官方的文档,写入数据通过set命令,读取数据通过on(value)触发。transaction方法可以在原有基础上修改数据,这个方法正好可以给我们用来统计阅读量。
    全部的API见这里,我们只用上述的ontransaction在合适的时候触发更新数据即可。

阅读全文 »

Intermediate Algorithm

承接上篇,本篇继续总结freecodecamp中级算法的第11-21题。

11. Convert HTML Entities

Convert the characters &, <, >, “ (double quote), and ‘ (apostrophe), in a string to their corresponding HTML entities.
将HTML的特殊字符转义

1
2
3
4
5
6
function convert(str) {
// &colon;&rpar;
return str.replace(/&/g,"&amp;").replace(/</g,"&lt;").replace(/>/g,"&gt;").replace(/\"/g,"&quot;").replace(/\'/g,"&apos;");
}
convert("Hamburgers < Pizza < Tacos");
阅读全文 »

Intermediate Algorithm

戳此处查看前一篇基础算法

1. Sum All Numbers in a Range

We’ll pass you an array of two numbers. Return the sum of those two numbers and all numbers between them.
The lowest number will not always come first.

求和给定数组约束范围内的所有数字

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
function getMaxMin(arr,op){
if(op === "max"){
return Math.max.apply(null,arr);
}else {
return Math.min.apply(null,arr);
}
}
function sumAll(arr) {
var sum = 0;
var min = getMaxMin(arr,"min");
var max = getMaxMin(arr,"max");
for(var i=min;i<=max;i++){
sum += i;
}
return sum;
}
sumAll([1, 4]);
阅读全文 »

背景

jenkins是一个基于Java开发的持续集成工具,通常用于监控持续重复的工作,用于自动化测试领域再合适不过了。
本文是我利用jnekins来进行任务分发而做的一篇关于jenkins的学习使用初步入门。
通常在进行简单的远程任务调度上,我们可以使用ssh进行远程操作运行命令,但一旦机器增加(多机器调度)或者运行命令复杂(多参数任务)时,ssh就显得不那么方便了:命令写起来麻烦,参数的各种转义也很容易出错,可读性变差。这时候通过jenkins来管理多机器调度就显得很方便了。

安装

1. 依赖及安装

以下以Red Hat发行版为例,其他安装方式可以戳标题链接查看
jenkins依赖Java7及以上版本,可以通过java官网安装也可以通过命令行安装
yum安装为例
sudo yum install java

然后安装jenkins:

1
2
3
sudo wget -O /etc/yum.repos.d/jenkins.repo http://pkg.jenkins-ci.org/redhat/jenkins.repo
sudo rpm --import https://jenkins-ci.org/redhat/jenkins-ci.org.key
sudo yum install jenkins

阅读全文 »