• Base: An Acid Alternative – 摘要

    如果你的 Web 应用依赖数据持久化,那么系统的瓶颈大概率是数据存储。那么我们需要对应用进行扩展。 应用的扩展有两种方式,垂直扩展和水平扩展。最简单的方式是垂直扩展 – 把应用迁移到性能更好的机器上。但它有一些限制,最明显的限制是单机的性能是有限制的。同时垂直扩展比较费钱,因为需要重新购买新机器来替换老的机器。还有就是它带来的 vendor lock-in。 水平扩展更灵活,但更复杂。我们可以通过两个维度来进行水平扩展,如下图所示: 功能性切分。将服务于不同功能的数据拆分到不同的数据库里。

    [Read More...]
  • JavaScript原型链的读和写的内在行为不一致

    读写涉及原型链的对象成员微妙的不同 对于从原型对象继承而来的成员,其读和写具有内在的不对等性。比如有一个对象A,假设它的原型对象是B,B的原型对象是null。如果我们需要读取A对象的name属性值,那么JS会优先在A中查找,如果找到了name属性那么就返回;如果A中没有name属性,那么就到原型B中查找name,如果找到了就返回;如果原型B中也没有找到,由于此时已经到了原型链的最顶端,还是没有找到name,就直接返回undefined。在写的情况下,执行A.name=”aty”,如果A中有name属性,那么会修改name属性的值;如果A没有name属性,那么会在A中新增一个name属性,不会有查找原型的过程。 区分属性是否是从原型链上继承来的 使用Object.hasOwnProperty()函数。

    [Read More...]
  • 基于AngularJS构建的项目框架[五]

    Karma和Jasmine自动化单元测试 单元测试是我们开发过程中必不可少的一部分。在本项目中,使用Jasmine来写单元测试,Karma跑单元测试,Grunt启动Karma任务。 Jasmine Jasmine是一个Behavior-Driven的测试框架。说到Behavior-Driven,感觉这是在测试领域一个挺火的概念。BDD(Behavior-Driven Development)是根据使用实际的用户案例来驱动软件的开发。在这里不详细展开,具体的可以看:http://en.wikipedia.org/wiki/Behavior-driven_development。 Jasmine不依赖于任何其他JavaScript框架。它拥有灵巧而明确的语法,可以让你轻松地编写测试代码。当前的版本是2.2。一个典型的测试程序如下: describe(“A suite”, function() {

    [Read More...]
  • 基于AngularJS构建的项目框架[四]

    RequireJS介绍 异步模块定义(AMD) 谈起RequireJS,你无法绕过提及JavaScript模块是什么,以及AMD是什么。 JavaScript模块只是遵循SRP(Single Responsibility Principle单一职责原则)的代码段,它暴露了一个公开的API。在现今JavaScript开发中,你可以在模块中封装许多功能,而且在大多数项目中,每个模块都有其自己的文件。这使得JavaScript开发者日子有点难过,因为它们需要持续不断的关注模块之间的依赖性,按照一个特定的顺序加载这些模块,否则运行时将会放生错误。 当你要加载JavaScript模块时,就会使用script标签。为了加载依赖的模块,你就要先加载被依赖的,之后再加载依赖的。使用script标签时,你需要按照此特定顺序安排它们的加载,而且脚本的加载是同步的。可以使用async和defer关键字使得加载异步,但可能因此在加载过程中丢失加载的顺序。另一个选择是将所有的脚本捆绑打包在一起,但在捆绑的时候你仍然需要把它们按照正确的顺序排序。 AMD就是这样一种对模块的定义,使模块和它的依赖可以被异步的加载,但又按照正确的顺序。 本规范只定义了一个函数 “define”,它是全局变量。函数的描述为:

    [Read More...]
  • 基于AngularJS构建的项目框架[三]

    配置Copy Task 项目根目录下的Gruntfile.js,我们并没有直接在此文件中对各个Task进行配置,而是在单独的文件中进行配置。如果项目比较大或者希望复用Task,这样做比较好。当然如果项目比较简单,则可以直接在Gruntfile.js中直接配置了。 在Gruntfile.js中LoadTask grunt.loadTasks(‘grunt-config/tasks’); 具体的Task配置都在grunt-config/tasks目录中。 配置grunt-config/tasks/copy.js module.exports = function(grunt)

    [Read More...]
  • 基于AngularJS构建的项目框架[二]

    加载外部定义的Grunt Task 对于大多数的项目来说,所有的Task都定义在Gruntfile中。但对于一些比较大的项目,或者我们希望把某些Task作为复用的组件,那么我们可以把Task的配置文件写在另外的JavaScript文件中,Grunt可以从外部的这些文件加载。 相关的API为: grunt.task.loadTasks(tasksPath) 也可以用grunt.loadTasks(tasksPath)进行调用。为了方便调用,像grunt.task / grunt.config / grunt.option

    [Read More...]
  • 基于AngularJS构建的项目框架[一]

    项目的文件组织结构 Grunt 首先,我们项目用Grunt来实现项目构建的自动化。对于需要反复重复的任务,例如压缩(minification)、编译、单元测试、linting等,自动化工具可以减轻你的劳动,简化你的工作。像压缩、单元测试、linting等这些功能是通过Grunt的插件实现的。Grunt和Grunt的插件都是 Node.js 的包,通过npm安装,npm是 Node.js 的包管理器,类似Python中得pip_install或者Ruby中得gem。 创建一个Grunt项目 一般需要在你的项目中添加两份文件:package.json 和 Gruntfile。 package.json: 此文件被npm用于存储项目的元数据,以便将此项目发布为npm模块。你可以在此文件中列出项目依赖的grunt和Grunt插件,放置于devDependencies配置段内。

    [Read More...]
  • 在AngularJS项目中使用RequireJS

    在写大型Javascript应用程序的时候,我们往往把不同的模块代码放到不同的文件中。这样提高了代码的可维护性,但是,把这些Javascript文件有序并且一个不落地放到<script> tag中去就比较烦人了,特别是Javascript文件很多的时候。在大型的AngularJS的大型应用中当然也存在这种问题。幸运的是,我们有工具来管理Javascript文件的依赖加载问题。 本篇文章中,我们会看到在AngularJS中使用RequireJS来解决依赖加载的问题,并且使用Grunt构建工具把模块化的Javascript文件打包合并。 RequireJS简介 RequireJS是一个Javascript库,它的功能是让Javascript模块的Lazy Loading。这里的模块是指一个以RequireJS规范编写的Javascript文件。RequireJS支持AMD规范,它提供了一些简单的API来创建模块和声明依赖。(简单来说,require()用于声明依赖,define()用于创建模块。) 首先,RequireJS需要一个配置文件,其配置文件也是一个Javascript文件: require.config({ map:{ //

    [Read More...]
  • Python装饰器 – 九步入门

    第一步:最简单的函数,准备附加额外功能 # -*- coding:gbk -*- ”’示例1: 最简单的函数,表示调用了两次”’ def myfunc(): print(“myfunc()

    [Read More...]
  • Python中的__future__模块

    我们经常在Python的项目中有如下语句: from __future__ import unicode_literals, print_function, division __future__模块中包含了Python未来将会支持的一些语言特性,通过import可以把新版本的特性引入到老版本中。 feature optional

    [Read More...]