一条命令引发的灾难

故事最早发生在2014年6月,那段时间我正在跟随github上的一个博客项目学习express框架。
中间正好用到了Mongodb数据库,那也是我初次使用Mongodb,给我的印象还是很不错的。
当我完成了这个简单博客后,我尝试发了十几条诗词,都是关于唐诗三百首的。
当时对数据库的了解非常有限,也不知道守护进程这些。
直到有一天我重启数据库发现之前的诗词数据都没了。
当时让我觉得非常奇怪,找来公司的技术大牛张春生帮忙,各种修复数据库的方式都试过了,依然没用。
在网上查找Mongodb丢失数据的问题,好家伙,不查不知道,一查吓一跳,这么多人都遇到过Mongodb丢数据的问题。
在看到很多人遇到和我同样的问题后,我心里告诉我自己,这问题和我没关系,是Mongodb本身的缺陷。

阅读更多

no-title

阅读更多

js中的继承

js中如何实现继承?

js是门超级灵活的语言,实现一种功能往往有多种做法,
ECMAScript没有明确的继承机制,es6引入了extend来实现继承,真的是大块人心。
但我们还是应该看看es6之前,改如何实现继承。
js中继承大体上可以分为两种:对象冒充和原型链方式

阅读更多

js中的拷贝

拷贝和继承有什么区别?

简单理解,huluoyang.gitcafe.io和hexo.com的关系就是继承,
hexo提供了博客的的网站架构、主题和插件等,
我不需要重新发明轮子,直接继承hexo就拥有了hexo的所有功能。
而Typecho与WordPress的关系就是拷贝,前者基于后者做了一个一模一样的博客软件。
当然Typecho发展得如何,与WordPress就毫无关系了。
拷贝就是我拥有你的功能,并且与你无关。
继承就是我拥有你的功能,而且与你密不可分。
一个是白手起家,一个是富二代创业,两者各有利弊。

阅读更多

how to choose a company?

优秀的程序员应该去什么样的公司?

每当我接受一个任务,打开项目的源码,随便一个文件几千上万行的代码时,头都大了。
嘴里念到:a piece of shit,心中一万只草泥马在狂奔。
这种只管功能实现,不管代码复用、后期维护,是否简洁易读的做法让后来接手项目的人头疼不已,
相信你我都曾经有过这样头疼的时刻。
一个公司最初的几个程序员奠定了公司代码的品质。
如果他们也是心浮气躁,干完活就行,打短工的心态。
那我只能说这样的公司只能喧嚣一时,必然活不长。
这样的公司我们见过太多了,其兴也勃焉其亡也忽焉。
我比较欣赏有自己节奏的公司,好的公司不会被对手、市场影响自己的节奏。
对手越是疯狂、市场越是极度繁荣,好的公司越应该冷静下来。
2013年刮起在线教育风、2014年刮起O2O风,看看现在活着的还有几家。
那些指望迅速占领市场份额的公司都活不长,每个产品都有自己的生命周期。
如果你硬要拔苗助长,就只能迅速灭亡。

阅读更多

js object and array

如何返回一个数组中的重复元素?

这个问题好像等同于:如何返回一个数组中被删除的重复元素?
我们换个测试案例,立刻就能看出问题所在。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
Array.prototype.distinct = function() {
var ret = [];
for (var i = 0; i < this.length; i++) {
for (var j = i+1; j < this.length; j++) {
if (this[i] === this[j]) {
ret.push(this.splice(j, 1)[0]);
//注意:this.splice(j,1)返回的是一个数组,这个数组只有一个元素
}
}
}
}
//
//for test
console.log(['a','b','a','d','b','a','e'].distinct()); //['a','a','b']

阅读更多

js double for loop

如何删除一个数组中的重复元素(可能有多个)并返回一个包含被删除元素的新数组?

先来看看淘宝UED官方博客的一个题目:(http://ued.taobao.org/blog/2007/11/job_test_explanation/)
请给Array本地对象增加一个原型方法,
它的用途是删除数组条目中重复的条目(可能有多个),
返回值是一个包含被删除的重复条目的新数组。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
Array.prototype.distinct = function() {
var ret = [];
for (var i = 0; i < this.length; i++) {
for (var j = i+1; j < this.length;) {
if (this[i] === this[j]) {
ret.push(this.splice(j, 1)[0]);
} else {
j++;
}
}
}
return ret;
}
//for test
console.log(['a','b','c','a','d','b','a','e'].distinct()); //['a','a','b'] 正确

阅读更多

js variable scope

变量作用域

变量的作用域无非就是两种:全局变量和局部变量。
长期以来我一直以为用var关键字声明的就是局部变量,直接声明的就是全局变量。
直到我在项目中发现在代码开头部分用var关键字声明的变量居然是全局变量,
我深刻记得当初这个发现给我自己带来的震惊,
长期地写业务代码真的并不能成比例地提高技术水平。
因为我发现很多人和当初的我一样,都搞不清这个变量作用域,
体现在代码中就是你经常看到全局变量,这是一种因为不深入原理,所以采用这种简单粗暴的解决方式。
因为搞不清变量作用域,为了自己开发方便,直接声明全局变量,丝毫不考虑这会给后期维护带来什么后果。
去看js权威指南后发现,var仅仅是个关键字而已,它本身没有任何意义,它并不能决定变量是全局还是局部。
决定变量是全局还是局部的是变量所处的作用域,
如果是在最外层或在块语句中,用var声明的就是全局变量,
而如果是在函数中,用var声明的就是局部变量。
es6引入了全新的关键字(let)来声明变量,我们不禁要问为什么?
难道仅仅是因为js只有函数作用域,没有块级作用域吗?
那我们继续追问,为什么要引入块级作用域?
如果你搞不清这个问题,你可以从自己熟悉的角度来提问:为什么要有函数作用域?
如果没有函数作用域,那js中就没有局部变量了,全部是全局变量,甭管是否用var声明。
也就是说函数作用域存在的目的就是为了减少全局变量的使用。
当你搞清楚了为什么要有函数作用域也就搞清楚了es6为何要引入块级作用域。
没错,它们俩的目的都是一样:创建局部变量环境,减少全局变量的使用。

1
2
3
4
5
6
for(var i=0;i<10;i++){
alert(i); //此处的i虽然是在for循环语句中定义,依然是全局变量。
}
for(let i=0;i<10;i++){
alert(i); //此处的i因为是用let定义,所以是局部变量。variable-scope
}

阅读更多

git push failure

技术的乐趣就在于解决一个个问题的过程中!

有一个问题纠缠我好久,一直没找到问题的原因。
在github上创建了个仓库,在本地上传总是失败。

1
2
3
4
5
cd bingo
git init
git add .
git commmit -m 'first commit'
git push -u origin master // 99%

阅读更多

The shawshank redemption

肖申克的救赎


《肖申克的救赎》是IMDB史上评分最高的电影,1994年放映的时候因为罪犯题材过于黑暗,加上同年好电影云集(阿甘正传等),造成《肖申克的救赎》票房惨淡,根本没什么影响力。

阅读更多