The shawshank redemption

肖申克的救赎


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

阅读全文

道士下山

《道士下山》–严肃的浪漫主义武侠。


《道士下山》2015年7月上映的时候,口碑极差,很多人说是烂片,网上各种吐槽,包括豆瓣也是。
我是看着陈凯歌的电影长大的,我就觉得陈凯歌导演拍出的片子,不可能太烂。
我花了一天时间仔细看了两遍,极为震感,这毋庸置疑是陈凯歌最有水平的一部电影。
这部影片在我心中的地位超过《无极》,它是有历以来最好看的武侠奇幻电影。
特意写了这么长的故事情节,后面有彩蛋哦。

阅读全文

mongodb schema design(2)

mongodb设计模式

在上一篇文章中我介绍了三种基本的设计方案:内嵌,子引用,父引用,
同时说明了在选择方案时需要考虑的两个关键因素。
1、一对N中的N是否需要一个单独的实体?
2、这种一对N关系中的N到底是什么样的规模?是一对少,一对多,还是一对非常多。
在掌握了以上基础技术后,我将会介绍更为复杂的设计模式:双向引用和反范式化。

阅读全文

mongodb schema design(1)

mongodb设计模式

No Schema –> Freedom Schema
数据库模式(Database Schema)是概念层数据模型在物理层描述的集合,
注意是数据模型在物理层的描述,而不是实现,实现是数据库引擎的工作。
在关系型数据库中模式也就是:
声明a表有哪些字段,b表有哪些字段,a表和b表是如何关联在一起的。
开始接触mongodb时也一直以为mongodb是无模式设计(no schema),
譬如我们在创建表时无需提前声明字段类型,直接使用即可。
但这只是mongodb模式设计的表象:没有模式就是最好的模式。
当我们要实现类似mysql中的多表join操作时,
这时你会发现mongodb模式设计的本质:自由模式才是最好的模式。
最近在简书上看到一篇关于Mongodb模式设计的文章
翻译略显生硬,理解起来有些吃力,看了原文后发现中文版省略了很多关键细节和代码,
所以我重新翻译了下,希望对感兴趣的同学有所帮助。
这里仍然要感谢译者,有些地方翻译得还是很精妙的。

阅读全文

frontend engineering code minified

前端工程之代码压缩

代码压缩在后端很少用到,在前端却成为一个必不可少的环节。
公司用的压缩工具是一个脚本,位于/utils目录,每次更改文件后,
都要进入这个目录,用./generate.do命令重新生成一下这个文件。
这个脚本是采用YUI compressor来压缩,用java来引入这个包,然后写各种钩子实现的。
很复杂,基本上前端人员是无法维护这个脚本的。
这个脚本已经写好了,对于前端人员来说只需要知道如何使用即可。
在项目中也确实如此,但直到有一天。
后端做了一个功能,他修改了些js,然后让我帮忙发布下这个js。
测试已经通过了,只需要发布代码到线上。
我按照惯例,发布上线了。
上线测试后发现有问题,一看js代码没改过来。
线上有问题,后端人员压力颇大,直接向测试说我这边没问题,是前端代码未更改过来。
我表示非常委屈啊,我是按照标准流程来做的。
随后我又重新试验了几次,发现问题依旧,然后找几个同事来帮忙,
他们都说很奇怪,不知为何会出现此问题。
我向后端反映了这个问题,我表示无能为力。
这时候后端人员开始发飙了,直接指责就是我的问题。
我感觉非常奇怪,出现问题了为什么首先追究是谁的问题,而不是寻求解决办法。
后来我实在没办法,主动去找团队的一个大牛帮忙。
看到这个问题后,大牛弄了一个多小时,终于搞定。
写了一行代码:

阅读全文

mongodb update

我就爱吃芒果

芒果很好吃,吃起来也很方便,皮拨了就可以吃,
什么,还要洗,妈妈告诉我:不干不净,吃了没病。
喜欢归喜欢,但你千万别把核都吃掉啊,
小时候,妈妈告诉我:吃了核,就得肺结核。

阅读全文

mongodb performance

壮哉我大芒果

第一次听说mongodb这个词时,第一时间想到的就是芒果。
随着mongodb风靡全球,芒果台的《还珠格格》在美国上映,
这一切都告诉我们:这世上没有什么事情是不可能的。
mongodb的性能有多强悍,我们来做下测试:

阅读全文

shallowCopy and deepCopy

js中的浅拷贝与深拷贝

拷贝什么东西

如果是原始数据类型,那没有什么好拷贝的,直接赋值一个新的变量即可。
如果是引用数据类型,譬如对象或数组、或者我们经常用到的json,事情才有挑战性。
首先我们确定了要拷贝的是对象(js中万物皆对象)

阅读全文

js string and array

如何快速颠倒一个字符串的顺序?

js的字符串对象中并没有直接内置这样的方法,但数组对象却内置了对应的方法,
按照上篇文章中介绍的apply机制,我们可以借助数组的reverse方法啊。

阅读全文

express router

用express框架如何实现前后端分离?

此前学习node.js期间follow了这个github项目:N-blog
基于这个版本做了一些改进,
譬如:页面样式的美化、登录支持多种方式、更新文章同时支持更新多个字段等。
详情可以查看我这个版本:(https://github.com/huluoyang/N-blog)
写这个博客项目是我第一次实战node.js,中途也遇到一些坑。
有些是express版本升级导致api变动导致,有些是我对node.js不够熟悉导致。
学习时都是按照别人写好的方法来做,做完后却觉得此前的实现不优雅,有太多限制。
N-blog项目前后端耦合得很紧,但如果我想做的是一个单页应用呢?
之前一直都是用express的res.render()方法来渲染视图,虽然功能已实现,
但一直想前后端分离,想用ajax来访问后端接口,根据返回数据由前端来渲染视图。
当用router.post(“/login”)来接收form表单提交没问题,用ajax提交却遇到拒绝请求这个问题。
实在很不解,查阅资料后发现express4.0后router成了一个单独的组件,有自己独立而且强大的route方法。
表单页面访问用router.get(“/login”),
表单页面默认提交用router.post(“/login”),
表单页面ajax获取数据用router.route(“/login”).get()。
表单页面ajax提交数据用router.route(“/login”).post(),
简单理解:
router是express的一个单独组件,
route是router组件提供的方法,
这个方法的强大之处是可以自定义接口,实现前后端分离。

阅读全文