npm install 的时候进程自动被kill

今天在DigitalOcean的机器上,安装blog,打算作为自己的博客使用,不过在npm install的时候,总是被系统kill掉。

无奈因为买的最便宜的机器,内存只有500M,所以,只能使用虚拟内存使用。

这种被kill的情况,也会发生在开虚拟机的时候。

命令如下:
因为一般我登录DO的服务器都是直接用root身份的,这样说起来是不安全的,一个不小心容易出事。
所以,以下命令,因为登录的身份不同,是可以把sudo去掉的。

Css布局:position的定位方式

最近看到有人来面试,当问道position:absolute是如何定位时,总是答到

相对于`position:relative`来定位

好吧,我必须承认,绝大多数情况下,我们都是这样做的,所以看起来也就是这样了。
但,实际上,标准上写的是相对于第一个position不等于static的元素,如果没有这个元素,就相对于body

我觉得弄懂标准是一个前端必须的技能,就像在打字的时候就键盘的按键都处于什么位置,而不是按下去试一试才知道按下的是什么。

了解这个问题,可以在调试的时候少几次尝试和迷茫。

backbone-fundamentals 前言

前言

很久以前,“富数据web应用”(data-rich web)是一个矛盾的说法。但现在,这种web应用随处可见,并且你需要知道如何构建它们。

传统意义上来讲,web应用把繁重的数据放置在服务器端,服务器再把载入完成的HTML页面推向浏览器。因此,客户端那边的JavaScript被限制住无法提升用户体验。到了现在,这种情况被转变了——客户端应用可以在需要的地方,从服务器上拉去原始数据并在浏览器里面渲染这些数据。

想一下Ajax技术的购物车向里面添加物品的时候而不需要刷新整个页面。起初,jQuery成为处理这种需求的范例。它的原理就是发起Ajax请求然后更新页面里的文本以及其他东西。然而,这种jQuery所依赖的模式使得我们要把数据模型隐式的放在客户端。随着服务器不再是唯一知道我们物品数量的地方,这就暗示这种演变自然而然的会有一些波折。(不太会翻译,原文是:it was a hint that there was a natural tension and pull of this evolution.)

然而,随着与服务器交互的无规则的代码的增长,代码变得臃肿并且越来越复杂。好的架构在客户端上变得不可或缺 —— 你无法仅凭一些厉害的jQuery代码保持你的应用的健壮性。更有可能的是,你最终会在业务逻辑中陷入噩梦般的UI callbacks,最终也逃避不了被下一个继承你代码的人丢弃的命运。

谢天谢地的是,有很多并且还将有更多Javascript库可以帮助你提升代码的架构和可维护性,使得人们可以非常容易的构建健壮的界面而不需要付出太多的精力。Backbone.js 迅速成为解决这类问题的最流行开源框架之一,这本书将会带领你来进行一个深入的实践。

在刚开始学习基本知识的时候,通过一些练习,去学习如何在构建应用的时候,同时保持其组织性以及可维护性。如果你是希望自己写的代码拥有更好的可读性、架构、可扩展性,这份指南可以帮上你。

提升开发者的水平对我来说很重要,这也是为什么我给这本书使用 Creative Commons Atribution-NonCommercial-ShareAlike 3.0 Unported license.欢迎大家来修正存在的问题,并且我很希望我们可以保持社区一直都有最新的源码。

我还要感谢Jeremy AshkenasDocumentCloud 创建了 Backbone.js ,以及社区成员的贡献使得这个项目的发展完全超出了我的想象。

express 框架:Can't set headers after they are sent 错误的一个原因

今天在写接受github的Webhooks服务时,使用了shelljs库,用来执行github发来的仓库更新信息。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
var shell = require('shelljs')
var express = require('express')
var router = express.Router()

router.post('/',function(req,res){
// 打印出github发来的所有信息
console.log(req)

res.end('ok')

shell.cs('../') // 注意这行
shell.exec('git pull')
shell.exec('pm2 restart all')
})

结果怎么都提示Can't set headers after they are sent,通常这个原因都是已经使用过res.send等方法之后,又去设置header或者status导致的,但是我已经结束了请求,然后执行脚本,按说不可能出现这种问题。

使用postMan自己模拟请求,发现确实返回ok,但是程序依然报错崩溃。

后来发现第11行的一个代码写错了,应该是shell.cd('../'),导致后面代码直接报错,不过我用pm2看日志的时候没有发现undefiend is not a function之类的信息,反而直接是express报错。

当我修正这个之后,就没有问题了。通常看着Can't set headers after they are sent这样的错误,都是直接去找处理请求方面的问题,没想到在之后代码报错也会产生这样的错误。

留下此篇,给看到的人提个醒。

github - webhook服务签名算法 - nodejs

前言

webhookgithub推出的一项免费服务,当仓库出现变动(pushissue变动等)的时候,会向仓库设置的指定地址,发送一个post请求,请求包括非常多的内容。

我自己开发的weichat.io部署在DigitalOcean上面,每次更新代码都要远程登录到服务器上手动更新代码。

我初中(2004-2007)的一个数学老师,曾经说过,聪明的人都是很懒的,当时用来举例如何用最简单的方式解决题目。近几年也有看到文章讲过类似的话。正因为懒,所以才会有这么多工具出现。

说了几句题外话,言归正传。一开始我找的方式是git hook,指定某个行为之后执行某个脚本,脚本就是shell。在网上搜了很多文章,觉得还是不够优雅。

无意中看到github提供的webhook服务,设置方便,还可以配置签名。

Nodejs使用MsgPack存入到Redis的一个坑

最近在做的项目中,需要用到往Redis中存入一些信息。之前都是用 JSON.stringify() 成字符串,再保存到Redis中,同时需要在Redis脚本中需要使用 cjson.decode() 命令,变成lua的table,再进行一些操作。
既然这样,那就不如用 MessagePack 官网
MessagePack 简称 msgpack ,按照官网上所说,它 like Json,但是 fast and small ,我一看,矮油,这个很好啊,正好我需要多次调用json对象的压缩和解析。

先安装它在node上的包 msgpack5

1
npm install msgpack5 --save

我在这里加上 --save ,这样在下载到本地时候,在当前目录下的 package.json 会自动添加依赖,带版本号滴呦,很省心有木有~

在用到 msgpack 的js文件中引入即可。

1
var msgpack = require('msgpack5')();

注意,这里有个小坑,就是引入的时候,必须当做函数运行一下,也就是后面加上那对括号。不然使用的时候,是代码不是调用。

JavaScript引用对象的复制

JavaScript引用对象复制

JavaScript有6种数据类型,分别是:

  • Boolean 布尔
  • String 字符串
  • Number 数字
  • Null
  • Undefined
  • 对象

其中,是分为 基本类型引用类型
Boolean、String、Number、Null、Undefined都是基本类型。基本类型是按值访问的,意思是说,操作的是保存在变量中的实际值。

安装hexo需要注意的一些坑

前言:

因为电脑系统问题,整个盘格式化了,之前配置的hexo都忘记上传到网盘上。
现在放在百度云盘的目录下,会自动上传。
但是,部署hexo的时候,要关掉百度上传,不然会出现文件读取错误。
这里的所有坑都在windows平台下,linux下的同学可以先去外边玩耍了。

前期准备的坑

为了能够使用hexo,需要先安装 nodejs , npm , hexo , git 。

安装nodejs

截止现在nodejs版本为0.12.1,其中中间版本12(偶数)代表是稳定版,1是小版本号。

安装nodejs只需要到官网上下载msi安装包即可,自动安装,自动写入PATH环境变量,很便利有木有~

这时,请按下 开始按钮 + r ,出现运行窗口,在里面输入 powershell ,然后回车出现蓝底的命令行界面。

在里面输入 node -v ,将会返回 v0.12.1 ,这是我安装在电脑中nodejs目前的版本号。

如果你很快就到了这一步,那么恭喜你,你运气不错,因为到这里才开始有坑出现。

客官请看下面。