写代码如坐禅(转)

当编译占用你时间时你会怎么做。不只是编译,即使是在等待任何短暂的计算机操作结束,这段时间你会干些什么?

和你的工作日休息比起来这点时间是微不足道的,但是总的来说它还是能对你的生产率和幸福感感带来巨大帮助的。

顺便说一下,这篇文章内容不是只针对开发者和程序的。它对任何使用电脑的聪明人都有效。后面还会附上图片。现在让我们开始吧!

为什么要写这篇文章

我最近开始在我的工作习惯里使用某种时间管理技巧来提升我的生产率,减小压力,并帮助我的身体和大脑得到休息。我基本上想要在不被打扰的 100%注意力集中的一两个小时里工作,然后就是 20 到 30 分钟的休息。

然而,我几乎立刻就进入了一个巨大的问题里:当我正在编译或部署什么东西时,我会自动地打开邮件客户端,facebook,新闻阅读器,新闻站点中的某一个或几个。这是一个坏习惯。它很难改掉。它扰乱了我本来专注的注意力。

所以我决定搜索相关资料。在 StackExchange 有一个关于“编译时应该做什么”的论坛。投票最多的答案是“减少编译时间”一类的。然而,这些答案并不能解决更多的普遍问题:在电脑上工作时总是有些事项是需要时间来等待的。

与之不同的,论坛上的人多半建议那些时间可以做些什么(类似收发邮件或是看新闻),这是一个差劲的想法。一个好的建议是这个——“同一时间干多件事是不好的”。我赞同这个观点。但其他人呢?不认为?好的。这个答案令人失望。所以在这篇文章里,我将深入探索这个问题并且向你展示最理想的方法。

两种类型的程序员

有两种极端原型的程序员——“禅宗的程序员”,我们称为心如止水的程序员,还有“不能克制分心的程序员”,我们称为心绪不定的程序员。两者都是非常极端的,所以他们应该处于贝尔钟形曲线的两端,对吗?

错。实际上,心绪不定的程序员是难以置信地普遍存在着。

图片的效果要比文字有用,所以我现在用图片来说明两种程序员的精神世界的状态。

心如止水的程序员

心如止水的程序员会怎么做?

他写代码。这是他做的唯一的事情,这也说明了一切。也许更重要的问题是什么事情他没有做:他没有受分心的影响。专注的注意力,专注的修改,专注的编码。一到两个小时的纯代码时间,然后才是 20-30分钟的休息,通常是离开电脑。之后他会继续开始写代码。(以上所说的时间只是一个例子。他可以用其它方式安排时间——不过他总是能平衡并搞定长时间的生产率。)

他的思维像平静的水缓慢地流动。当然它不像那种恒久不变的凝固的冰。

这就是心如止水的程序员精神世界看起来的样子:

写代码如坐禅:你是哪一类程序员

心绪不定的程序员

即使你的精神世界现在看起来像一个心如止水的程序员,只要你在编译的时候打开了 Facebook 或者检查了你的邮件还是做了其它什么事情。几分钟之后它就会像这样:

写代码如坐禅:你是哪一类程序员

女士们先生们,这就是你检查你的邮件和打开 Facebook 后的状况。如果你还拥有一堆实时通知,即时通讯,还要去检查你的 RSS 源和推特,结果就是大脑像上面图中变成碎片的灾难一样。

你可能还没有完全从这张图恢复过来。不在特定的某天,任何时候都有可能发生。即使你把精神世界所有无用的东西最小化到任务栏,它仍会留在那里,不停地引诱你,消耗你的精神资源。朋友,时间就这样走了,你会困惑它是怎么不见的。

顺便说一下,如果你是一个心绪不定的人,你还是可以看看我们网站的网页漫画!不必立刻回来把这篇文章读完。别忘了订阅那个漫画源!看完所有的漫画后可以分享给你的朋友并聊聊!做这些事不会过于分心的,真的!

心如止水的程序员与心绪不定的程序员之间的区别

心如止水的程序员更倾向于长期的幸福感和生产率。他有能力高度集中注意力,关注目标。

心绪不定的程序员更倾向于短暂的满足感,长期这样不能到达全部的潜力并且会对他自己的身体和精神带来双方面的伤害。他不能定下心来集中注意力。

为了彻底领悟这点,我们首先需要理解我们的大脑是怎样工作的。

我们的大脑是怎么工作的

事实上我们不能完全知道,不过,基于我们现在已有的理解,心理学家已经提出了一些有用的类比方法,可以帮助我们领悟复杂的东西。

电脑的类比

你的大脑像一台电脑。当然,它要比一台个人电脑复杂多了,不过电脑的比喻说法可以让我们形容许多在大脑里运行的进程。有些东西像硬盘,有些东西像内存和中央处理器,还有进程和线程,它们的确需要一些时间来访问信息并计算数据。

很明显我们的大脑拥有一定的容量在任一时刻集中注意力。你可以很好地集中在某一东西上,或是不太好地集中到几样东西上,但你不能两者都做到。把注意力从一个任务转到另一个任务甚至会影响认知能力,特别是两种毫不相干的任务。

只要你把意识关注在某样东西上,就会花些时间处理它和它所分配的资源并会从内存和后台进程里初始化它。它可以存在几个小时甚至几天。最近的关注到的东西在任何时刻都会不断出现的。即时你没有注意到它们在你的大脑里流动,它们一直都在那儿——而且它们占用资源,使你不能集中注意力。

抽屉的类比

另一种有用的比喻说法是柜子里的抽屉。你的大脑像存放东西的抽屉。每个抽屉都是拥有数据且互相连接的,基于某种上下文关系和概念。在特定的时间里,一些抽屉是打开的,一些是关闭的。打开的抽屉代表着你当前的精神空间,它们很容易访问到。

主要的问题是关闭抽屉是需要很长时间的,而打开它们是非常快的。

所以,当你在工作时,注意力转到新的地方,它会立即打开一堆抽屉。当你回到工作状态时,那些抽屉仍然是开着的。这样唯一的好处是可以提高你的创造力和头脑风暴——但是不需要的抽屉开着会有影响的。它们抑制左脑的思维并降低注意力。

编译时应该做什么

在等待电脑执行操作的时间里,你的行为可以判断出你是一个心如止水的程序员还是心绪不定的程序员。

主要的意见是:

1. 不要分心

2. 短暂的休息

保持注意力并不是那么难——你必须要切断你大脑的电源,或者保持注意力集中在你的代码上。不过,关闭大脑效果更好。这样会进入一个微冥想状态,在短暂休息之后它仍会有效。

为什么要进入冥想?好的,你的大脑每天都在咀嚼代码,为什么不给它一个休息呢?此外冥想科学上被证实能不断增加幸福等级。想象一下每天进行两次 30-60秒表面上看起来不重要的冥想所带来的长期优势吧。

现在,短暂的休息时应该做些什么?从以下内容中选择任何事,按你的想法组合在一起。你可以把它们按照这个顺序全部做一遍,这取决于(也可以不在意)这些行为所需要的时间。

1. 站起来

2. 眺望远处

3. 把双手放在脑后,斜靠在椅子上

4. 伸长双腿,把双手尽量举高

5. 闭上双眼

6. 轻揉眼睛

7. 慢慢地把头向各个方向转,舒展颈椎

8. 闭上双眼然后深呼吸

9. 倒一杯水(要小心路上别被同事分心了)

你也可以做任何主要身体参与而不影响思维的事——静力锻炼,变戏法,决斗,哈哈。

顺便说一下,如果你的老板不给你足够的时间做以上的任何事,那么推荐他来看这篇文章。让自己更快地恢复精神并保持注意力,比看起来在工作其实已经分散注意力并很快就感到累的情况要好很多。

伸展放松是很有益处的。我上一次见我的理疗师时她发现我的肩膀很多地方很紧绷。她告诉我这可能是因为我坐在电脑前双手总是弯曲造成的,所以肌肉缩短而且不能用力。那我应该怎么做最好呢?举高我的双手,试着举到最高。这是我在编译或是等待电脑执行操作时常做的一件事。

你可能已经听说过当你在用电脑时进行有规律伸展放松和短暂休息是一个不错的想法。问题是怎么做到——即使你设置了一个计时器,但假如到时你正处在一个复杂的事情,正做到一半的时候怎么办?这样看来就无法实现了。然而,如果你在编译时短暂休息一下,就能很好地做到了,你甚至可以把它养成一种习惯,让它变得更“自然”!现在编译就开始能提醒你做伸展放松了。这太令人不可思议了。

编译时你不应该做的事情

我其实想用力点击我的主页,这样做能让事情变得简单,这里有一张你在编译时不应该做的事情的列表。以这种方式思考:这些事情不仅会使你不能集中注意力,还会让你的思维和身体不能很好地短暂休息。

1. 阅读你的 RSS 源

2. 阅读新闻(任何新闻)

3. 收发邮件

4. 浏览各类社交媒体(facebook, twitter, google+, linkedin, reddit)

5. 观看视频

做以下两件事要比上面的好一点,但依然不推荐:

1. 和同事聊天

2. 读一本物理书

专注的注意力和专注地修改

我马上就要结束这篇我所想的每日工作流程的理想方法——禅宗程序员的文章了。

保证生产率和效率的关键是注意力 100% 集中在你现在正在做的事情上,做完后再把注意力完全转移到其他地方。注意力从一件事情到下一件事情的过渡不能有任何的拖泥带水。

把你的工作时间分成1-2个小时一段。注意力 100% 集中在这些时间段里。然后是 20-30分钟的休息,完全可以做任何事情。在休息时间你可以浏览你的邮件和社交媒体,当然,散个步打个盹吃些健康的点心会更好。休息结束后,检查任务管理软件(比如,我用的是我的 Swift To-Do List)里下一个工作是什么,再开始另一段需要百分百注意力集中的工作。在较大程度上,这与番茄工作法有点相似。

休息不是可以选择要不要的。别想去跳过它。你的身体需要休息。即使你在做你喜欢的工作,你也需要休息一下——在这种情况,你会在接下来的时间段里有动力做更多事。

你的工作流程看起来应该像这样:

(任务 1 – 任务2)- 休息 – (任务 2 – 任务 3 – 任务4) – 休息 -(另一个1-2小时的时间段) – 休息 ……

不要让它完成起来是像这样混乱随机,让人看不下去的的:

任务 1 – 邮件 – 任务 1 – Facebook – 任务 1 – 任务 2 – 短暂休息 – Facebook – 任务 2 – 邮件 – reddit – 任务 3 – 邮件 – 休息 – 任务 2 – 邮件 – 任务 3 – 推特 – 黑客新闻 – 推特 – 任务 1 – 任务 3 – 休息 – 任务4

如果你的工作流程是像上面这样,那你既不能完全放松也不能做完你能完成的事情。这是最低级的方法。这不仅浪费了你的潜力和时间,也让你长期身体会不适。

我不想撒谎。集中注意力真的不容易。它很困难,因为当你没有集中注意力时,你基本上会朝着相反的方向过去。习惯和根深蒂固的惯例像潜意识一样难改变。

好消息就是,你还可以练习。你可以学习怎样去集中精神。这是每个人都可以学的技能,而且它非常有用,值得为之努力。

——转载于 Jiri Novotny+,作者由于 Windows 平台任务管理软件的困扰。他把这篇用户文章投递在 ComponentOwl.com,因为他的 Swift To-Do List 要使用 Component Owl 上基于 .Net 框架的 Better ListView 作为它的核心组件。

Posted in 心理学 | Leave a comment

我为什么向后端工程师推荐Node.js(转)

科普文一则,说说我对Node.js的一些认识,以及我作为前端工程师为什么会向后端工程师推荐Node.js。

“Node.js 是服务器端的 JavaScript 运行环境,它具有无阻塞(non-blocking)和事件驱动(event-driven)等的特色,Node.js 采用V8引擎,同样,Node.js实现了类似 Apache 和 nginx 的web服务,让你可以通过它来搭建基于 JavaScript的Web App。”

我想不仅仅是Node.js,当我们要引入任何一种新技术前都必须要搞清楚几个问题:

  1. 我们遇到了什么问题?
  2. 这项新技术解决什么问题,是否契合我们遇到的问题?
  3. 我们遇到问题的多种解决方案中,当前这项新技术的优势体现在哪儿?
  4. 使用新技术,带来哪些新问题,严重么,我们能否解决掉?

我们的问题:Server端阻塞

Node.js被设计用来解决服务端阻塞问题.下面通过一段简单的代码解释何为阻塞:

Js代码:

//根据ID,在数据库中Persons表中查出Name
var name = db.query("select name from persons where id=1");
//进程等待数据查询完毕,然后使用查询结果。
output("name")

这段代码的问题是在上面两个语句之间,在整个数据查询的过程中,当前程序进程往往只是在等待结果的返回.这就造成了进程的阻塞.对于高并发,I/O密集行的网络应用中,一方面进程很长时间处于等待状态,另一方面为了应付新的请求不断的增加新的进程.这样的浪费会导致系统支持QPS远远小于后端数据服务能够支撑的QPS,成为了系统的瓶颈.而且这样的系统也特别容易被慢链接攻击(客户端故意不接收或减缓接收数据,加长进程等待时间)。

如何解决阻塞问题

可以引入事件处理机制解决这个问题。在查询请求发起之前注册数据加载事件的响应函数,请求发出之后立即将进程交出,而当数据返回后再触发这个事件并在预定好的事件响应函数中继续处理数据:

Js代码:

//定义如何后续数据处理函数
function onDataLoad(name){
   output("name");
}
//发起数据请求,同时指定数据返回后的回调函数
db.query("select name from persons where id=1",onDataLoad);

我们看到若按照这个思路解决阻塞问题,首先我们要提供一套高效的异步事件调度机制.而主要用于处理浏览器端的各种交互事件的JavaScript。相对于其他语言,至少有两个关键点特别适合完成这个任务。

为什么JS适合解决阻塞问题

首先JavaScript是一种函数式编程语言,函数编程语言最重要的数学基础是λ演算(lambda calculus) — 即函数对象可以作为其他函数对象的输入(参数)和输出(返回值)。

这个特性使得为事件指定回调函数变得很容易。特别是JavaScript还支持匿名函数。通过匿名函数的辅助,之前的代码可以进行简写如下:

Js代码:

db.query("select name from persons where id=1",function(name){
    output(name);
});

还有另一个关键问题是,异步回调的运行上下文保持(本文暂称其为”状态保持”)。我们先来看一段代码来说明何为状态保持:

Js代码:

//传统同步写法:将查询和结果打印抽象为一个方法
function main(){
    var id = "1";
    var name = db.query("select name from persons where id=" + id);
    output("person id:" + id + ", name:" + name);
}
main();

前面的写法在传统的阻塞是编程中非常常见,但接下来进行异步改写时会遇到一些困扰:

Js代码:

//异步写法:
function main(){
    var id = "1";
    db.query("select name from persons where id=" + id,function(name){
        output("person id:" + id + ", name:" + name);//n秒后数据返回后执行回调
    });
}
main();

细心的朋友可能已经注意到,当等待了n秒数据查询结果返回后执行回调时。回调函数中却仍然使用了main函数的局部变量”id”,而”id”似乎应该在n秒前走出其作用域。为什么此时”id”仍然可以访问呢,这是因为JavaScript的另外一个重要语言特性:闭包(Closures)。接下来我来详解闭包的原委。

在复杂的应用中,我们一定会遇到这类场景。即在函数运行时需要访问函数定义时的上下文数据(注意:一定要区分函数定义时和函数运行时两个不同的时刻)。特别是在异步编程模型中,函数的定义和运行又分处不同的时间段,那么保持上下文的问题变得更加突出了。因为我们在任务执行一半时把资源交出去没有问题,但当任务需要再次继续时我们必须还原现场。

在这个例子中,db.query作为一个公共的数据库查询方法,把”id”这个业务数据传入给db.query,交由其保存是不太合适的。但我们可以稍作抽象,让db.query再支持一个需要保持状态的数据对象传入,当数据查询完毕后可以把这些状态数据原封不动的回传。如下:

Js代码:

function main(){
    var id = "1";
    var currentState = new Object();
    currentState.person_id = id;
    db.query("select name from persons where id=" + id, function(name,state){
        output("person id:" + state.person_id + ", name:" + name);
    },currentState);//注意currentState是db.query的第三个参数
}
main();

记住这种重要的思路,我们再看看是否还能进一步的抽象?可以的,不过接下的动作之前,我们还要了解在JavaScript中一个函数也是一个对象。一个函数实例fn除了函数体的定义之外,我们仍然可以在这个函数对象实例之本身扩展其他属性,如fn.a=1;受到这个启发我们尝试把需要保持的状态直接绑定到函数实例上:

Js代码

function main(){
    var id = "1";
    var currentState = new Object();
    currentState.person_id = id;
    function onDataLoad(name){
        output("person id:" + onDataLoad.state.person_id + ", name:" + name);
    }
    onDataLoad.state = currentState ;//为函数指定state属性,用于保持状态
    db.query("select name from persons where id=" + id, onDataLoad);
}

我们做了什么?生成了currentState对象,然后在函数onDataLoad定义时,将currentState绑定给onDataLoad这个函数实例。那么在onDataLoad运行时,就可以拿到定义时的state对象了。JavaScript的闭包特性就是内置了这个过程而已。

在每个JavaScript函数运行时,都有一个运行时内部对象称为Execution Context,它包含如下Variable Object(VO,变量对象), Scope Chain(作用域链)和”this” Value三部分。如图:

图片来自ECMA-262 JavaScript .The Core

其中变量对象VO,包含了所有局部变量的引用。对于main函数,局部变量”id”存储在VO.id内。看起来用VO来代替我们的currentSate最合适了。但main函数还可能嵌套在其他函数之内,所以我们需要ScopeChain,它是一个包含当前运行函数VO和其所有父函数scope的数组。

所以在这个例子中,在onDataLoad函数定义时,就为默认为其绑定了一个[[scope]]属性指向其父函数的ExecutionContext的ScopeChain。而当函数onDataLoad执行时,就可以通过[[scope]]属性来访问父函数的VO对象来找到id,如果父函数的VO中没有id这个属性,就再继续向上查找其祖先的VO对象,直到找到id这个属性或到达最外层返回undefined。也正是因为这个引用,造成VO的引用计数不为0,在走出作用域时,才不会被垃圾回收。

很多朋友觉得闭包较难理解,其实我们只要能明确的区分函数定义和函数运行两个时机,那么闭包就是让函数在运行时能够访问到函数定义时的所处作用域内的所有变量,或者说函数定义时能访问到什么变量,那么在函数运行时通过相同的变量名一样能访问到。

关于状态保持是本文的重点,在我看到的多数Node.js的介绍文章中并没有详解这里,我们只是知道了要解决阻塞问题,但是JavaScript解决阻塞问题的优势到底在哪里,作为一名前端工程师,我想有必要花一些篇幅详细解释一下。

而之所以我叫它”状态保持”因为还有一个非常相似的场景可以类比:

用户从A页面提交表单到B页面,如果提交数据校验不通过,则需要返回A页面,同时保持用户在A页面填写的内容并提示用户修改不对的地方。从提交到校验出错再返回继续填写是一个包含网络交互的异步过程,这相当于填写表单这个任务过会儿再继续。

在传统网页开发中,用户的状态通过请求传递到服务端,交由后端状态保持(类似交给db.query的currentSate)。而使用Ajax的网页,因为并未离开原页面,那么服务端只要负责校验用户提交的数据是否正确即可,发送错误,返回错误处相关信息即可,这就是所谓前端状态保持。可以看到这个场景里边服务端做的事情变少了,变纯粹了。正如我们的例子中db.query不再存储转发第三个state参数,变得更在轻量。

我们看到通过JavaScript函数式语言特性,匿名函数支持和闭包很漂亮的解决了同步编程到异步编程转化过程中遇到的一系列最重要的问题。但JavaScript是否就是最好的?这就要回答我们引用新技术时需要考虑的最后一个问题了。

使用Node.js是否带来额外的困扰,如何解决?

Node.js性能真的是最好么?不用比较我们也可以得到结论,Node.js做无阻塞编程性能较难做到极致。何为极致?处理一个请求需要占用多少内存,多少cpu资源,多少带宽,有丁点浪费就不是极致。阻塞式编程浪费了大量进程资源只是在等待,导致大量内存和cpu的浪费。在这方面Node.js好很多,但也正是因为一些闭包等JavaScript内建机制也会导致资源的浪费,看下面的代码:

Js代码:

function main(){
    var id = "1";
    var str = "..."; //这里局部变量str存储一个2M的字符串
    db.query("select name from persons where id=" + id,function(name){
        output("person id:" + id + ", name:" + name);//n秒后数据返回后执行回调
    });
}
main();

至少整个数据查询过程中,变量str所使用的2M内存并不会被释放,而str保持下去可能并没有意义。前面已经解释过闭包的原理,闭包并没有智能到只包起来今后可能被访问到的对象。即使不了解闭包的原理,也可以通过一段简单脚本验证这点:

Js代码:

function main(){
    var id = "1";
    var str = "..."; //这里存储一个2M的字符串
    window.setTimeout(function(){
        debugger; //我们在这里设置断点
    },10000)
}
main();

我们在回调函数当中只设置一个断点,并不指明我们要访问哪个变量。然后我们在控制台监视一下,id和str都是可以拿到的。

所以我来猜想一下,性能极端苛刻的场景,无阻塞是未来,但无阻塞发展下去,或者有更轻量的脚本引擎产生,或者JavaScript引擎可能要调整可以disable闭包,或者我们要通过给JS开发静态编译器在代码发布前自动优化我们的代码。

静态编译是如今JavaScript技术领域的又一个热点,我们都知道JavaScript是解释型脚本语言,在运行时自动编译。但是运行时编译只是将代码转为机器码执行,却并未覆盖传统编译型语言在编译阶段所做的任务。比如,语法检查,接口校验,全局性能优化等等。

最常见的JavaScript静态编译就是脚本压缩工具,在代码发布到线上之前,我们通过各种压缩工具,将代码压缩,达到减少网络传输量的问题。而在这个时间点,已经有越来越多的事情可做,比如:Google利用ClouserComplier提供的系列编译指令,让JavaScript更好的实现OO编程。也有GWT,CoffeeScript这样的项目,将其他语言编译为JavaScript。在淘宝我们在代码静态编译阶段来解决因JavaScript细粒度模块化改造引入各种性能问题,也用来对第三方提供JavaScript代码进行一定的安全检查。

我们期待前面的代码经过静态编译器编译后变成如下结果:

Js代码:

function main(){
    var id = "1";
    var str = "..."; //这里局部变量str存储一个2M的字符串
    db.query("select name from persons where id=" + id,function(name){
        output("person id:" + id + ", name:" + name);
    });
    str = ""; //通过这一行,及时释放不必要的内存占用。
}
main();

除了性能方面的担忧,使用Node.js进行编程增加了代码编写的复杂度。因为我们习惯于阻塞式编程的写法,切换到异步模式编程,往往对于太多多层次的callback函数嵌套弄得不知所措。老赵最近开发了项目JSCEX正是要解决这个问题,它让大家在遵守一些小的约定后,能够仍然保持同步编程的写法进行代码开发。写完的代码同样通过静态编译器编译成异步回调式模式的代码再交给JavaScript引擎执行。

Node.js还要解决什么问题

说了这么多,无阻塞编程要做的还远不止这些。首先需要一个高效的JS引擎,高效的事件池和线程池。另外几乎所有和Node.js交互的传统模块如文件系统,数据访问,HTTP解析,DNS解析都是阻塞式的,都需要额外改造。

Node.js作者极其团队,正是认清问题所在以及JS解决这些问题方面的优势。基于Google开源的高效JavaScript引擎V8,贡献了大量的智慧和精力解决上述大部分问题后才有Node.js横空出世。

当前Node社区如此火热,千余开源的Node.js模块,活跃在WebFramework,WebSocket,RPC,模板引擎,数据抓取服务,图形图像几乎所有工程领域。

后记

本文主要的信息来自Node.js作者在JSConf09JSConf10上的分享。 而作为前端开发,着重讲了函数式编程,闭包对于无阻塞开发的重要意义。我期待这篇文章能够给前端和后端工程师都带来收获。

同样作为前端开发,不得不再插几句,说说服务端JS能够解决的另一个问题:当前的Web开发前后端使用不同的语言,很多相同的业务逻辑要前后端分别用不同语言重复实现。比如越来越多重度依赖JavaScript的胖客户端应用,当客户浏览器禁用JavaScript时,则需要使用服务端语言将主业务流程再实现一次,这即是前端常说的”渐进增强”。

当我们拥有了服务端JavaScript语言,我们自然就会想到能否利用Node.js做到”一次开发,渐进增强”。解决掉这个为小量用户,浪费大量时间的恼人的问题。这方面的实践,YAHOO仍然是先驱,早在一年多前开始YAHOO通过nodejs-yui3项目做了很多卓越的贡献,而淘宝自主开发的前端框架Kissy也有服务端运行的相关尝试。

JavaScript在诞生之时就不仅仅是浏览器端工具,如今JavaScript能够再一次回到服务端展示拳脚,感谢V8,感谢NodeJS作者,团队和社区的诸多贡献者,祝Node好运,JavaScript好运。

关于作者

李穆,前端工程师,就职于淘宝广告技术部架构组,淘宝花名:李牧,专注淘宝广告引擎和业务系统前端开发。个人博客:http://limu.iteye.com

Posted in javascript | Leave a comment

ASP.NET性能优化之反向代理缓存

到目前为止,我们讨论了把缓存存放在ASP.NET的输出缓存中(内存和硬盘),以及浏 览器缓存中,而大型站点的另一种常用做法是将缓存部署在反向代理服务器上,这类缓存我们通常称之为反向代理缓存,比如Squid和Varnish。这两款 软件通常都部署在非WINDOWS平台上,对于Windows平台上的Asp.net来说,其实一样能使用,我们完全可以把反向代理软件部署在LINUX 上,然后代理会路由到后台的WINDOWS WEB(IIS)服务器。总之,非WINDOWS的世界很精彩。

当然,无论是squid还是varnish都有Windows的扩展版本。本文为了简便起见,基于varnish的Windows版本来描述的。

varnish的官方站点:https://www.varnish-cache.org/

varnish的Windows版本:http://www.cygwin.com/,如果要编译过的直接可用的版本,在这里:http://www.software112.com/products/cygwin-varnish-cache.html

1:将varnish配置为IIS的代理

首先需要为varnish准备配置文件,比如,可以为default.vcl,内容如下:

backend default
{
     .host = "192.168.0.77";
     .port = "80";
}
sub vcl_fetch
{
    remove beresp.http.Set-Cookie;
}
sub vcl_recv
{
    remove req.http.Cookie;
}

在我们要示范的这个实例中,这3个配置都不能少,如下,

backend default:指定我们的IIS站点的地址和端口;

sub vcl_fetch:这是一个varnish函数,它varnish从后端服务器,也就是IIS中获得数据后被调用;

sub vcl_recv:varnish函数,表示客户端请求杠杠到达反向代理服务器时被调用;

由于varnish默认在碰到http头中含有Cookie相关标识时直接忽略缓存,所以我们需要上面的两个函数针对Cookie做特殊处理。当然,目前这两个函数只是简单而野蛮的删除标识,实际的应用中我们可能需要根据实际情况为它们加上一些判断条件。

2:启动varnish

下面的命令为我启动varnish:

C:\varnish\bin>varnishd -a :8011 -T :8088 -f c:/varnish/etc/default.vcl -s file,c:/varnish/var/cache,100M

-a:8011表示,让varnish监听在8011端口。由于我测试环境下varnish和iis是在同一台机器上,所以IIS已经占用了80,我这里只有使用其它端口。

-T是为varnish指定一个管理端口;

-f指定所要使用的配置文件;

后面的参数只是让varnish使用文件缓存,大小为100M,当然,应该根据实际情况指定大小;

启动varnish后,如果我们请求http://地址:端口/,就可以等到200OK状态码,那表示varnish已经在正确滴接受请求。

3:一个实例

创建asp.net页面,内容如下:

protected void Page_Load(object sender, EventArgs e)
{
    this.Response.AddHeader("Cache-Control", "max-age=60");
    this.Response.AddHeader("Last-Modified", DateTime.Now.ToString("U", DateTimeFormatInfo.InvariantInfo));
    DateTime IfModifiedSince;
    if (DateTime.TryParse(this.Request.Headers.Get("If-Modified-Since"), out IfModifiedSince))
    {
        if ((DateTime.Now - IfModifiedSince.AddHours(8)).Seconds < 60)
        {
            Response.Status = "304 Not Modified";
            Response.StatusCode = 304;
            return;
        }
    }
    string conn = "Data Source=192.168.0.77;Initial Catalog=luminjidb;User Id=sa;Password=sa;";
    using (DataSet ds = Common.SqlHelper.ExecuteDataset(conn, CommandType.Text, "select top 1* from NameTb a, DepTb b where a.DepID = b.ID ORDER BY NEWID()"))
    {
        var result = ds.Tables[0].Rows[0]["name"].ToString();
        Response.Write(result);
    }
}

对该页面进行压力测试,100个用户,1000个请求,得到的结果如下:

image

如果没有缓存,则结果如下:

image

可以看到吞吐率有非常大的提升。

4:监控varnish

可以使用varnishstat命令,对varnish进行监控,在上面的压力测试中,如果我们使用监控,得到的结果如下:

image

在本例中,我们可以看到共请求了1000次,其中999次命中缓存,那是因为第一次显然肯定是要从IIS中拿输出滴。

5:管理varnish

可以通过多种途径来进行varnish的管理,包括更改配置、停止服务、启动服务、清理缓存等。可以通过varnishadm命令进行管理,如果你是在远程的话,可以使用telnet来进行管理:

telnet 192.168.0.77 8088

其中8088就是我们刚在启动varnish的时候指定的管理端口。连接上之后,stop停止服务、start启动服务,可以敲入help查看所有命令。下面的命令,清除所有缓存:

purge.url *$

6:谨慎引入varnish后带来的缓存变化

引入varnish后,可以发现使用强制刷新(ctrl+R5)后,动态行为发生了改变,即客户端浏览器会去VARNISH上请求数据,但是此时的 缓存中已经存在静态的缓存内容,varnish会首先根据请求的HTTP头去和这个缓存内容判断得出需要是否更新,即由于缓存内容的存在,请求不会去 IIS上进行缓存协商。这个时候,缓存中的静态内容会直接返回给客户端浏览器,这样一来的话,我们在Page_Load中的代码就根本不会执行,因为它是 在IIS中的。

要避免这种情况的发生,我们必须更改VARNISH配置文件,让VARNISH碰到强制更新的时候,忽略缓存,直接去IIS上请求,为配置文件增加如下函数:

sub vcl_hit {
    if(req.http.Cache-Control~"no-cache"||req.http.Cache-Control~"max-age=0"||req.http.Pragma~"no-cache"){
        set obj.ttl=0s;
        return (restart);
    }
    return (deliver);
}

经过上面的修改后,再次使用强制更新varnish将会忽略缓存,到IIS上去拿正文。

参考:

https://www.varnish-cache.org/docs/trunk/reference/varnishlog.html

https://www.varnish-cache.org/trac/wiki/Introduction#TheVarnishConfigurationLanguage

http://www.docunext.com/wiki/Varnish

http://cd34.com/blog/infrastructure/no-esi-processing-first-char-not/

本系列之前篇:

1:ASP.NET性能优化之构建自定义文件缓存

2:ASP.NET性能优化之让浏览器缓存动态网页

3:ASP.NET性能优化之减少请求

本文首发于AgileSharp-创业互推平台

注:转自 http://www.cnblogs.com/luminji/archive/2011/10/17/2178759.html 。

Posted in 性能优化 | Leave a comment

“行为的塑造”把你从惰性中拯救出来(转)

所为“行为的塑造”,就是通过小步反馈帮助我们达到目标。斯金纳说”教育就是塑造行为”;那么我们该如何“教育”自己的惰性,通过强化去塑造行为呢?斯金纳采用连续接近(successive approximation)的方法,对趋向于所要塑造的行为方向不断地给予强化,直到引出所需要的新行为。例如,训练鸽子或老鼠头抬到一定的高度,只有当其头朝着实验所需的方向抬起来时才强化,下一次要求再多一点,直到全部达到所需的方向和高度。这时,新的行为就塑造成了。我们是否也可以用这种方法来拯救噢我们的惰性呢?-psytopic.com

一般在学习和生活中,我们都可能有这样的经验,就是当说想要作某件事情的时候,但过了好久发现还是没有做;或者觉得有力气使不出来;或者总觉得生活是灰色和抑郁的等等。

这类情况反应在生活中,就是生活好象总是被一种惰性缠绕,知道那不好,但又不知道从何处入手来改变。

从心理学操作性反射的原则为基础,对于人类的行为方式进行观察后,心理学家提出这样一种改进方式,以纠正惰性生活方式,并由这种惰性生活方式的结束而带来整个人生的良性改变。这也叫普瑞马法则。

普瑞马法则:就是如果把一件更难完成的事情放在比较容易完成的事情前面做。那更难完成的事情就可以成为比较容易完成的事情的强化刺激。换句话说,把不愿意干的任务或者工作放在喜欢完成的任务之前。如果经常完成困难的、有挑战性的任务,那么工作能力就会增长;相反的话,工作能力就要下降。也就是说,把好玩的事情留在后面做。

这种设定是任务导向而不是时间导向,也就是设定任务而不是设定时间。比如,“我每天要完成N的学习量”,而不是“我每天看N个小时的学习书”。当人按照时间计划来工作时,他所关心的是干了多少时间而不是工作的进度,而当人按照完成任务的数量的计划工作时,就能控制住整个的进度。工作的进度决定了工作什么时候被完成,工作者什么时候可以“休息”,这样,就能够有效地完成工作而不再受工作的限制。

如果您对这篇文章感兴趣,相信你会对PSYTOPIC同样感兴趣,网址是psytopic.com 。这是Psytopic的指纹密码:aHR0cDovL3d3dy5wc3l0b3BpYy5jb20=,您可以凭这个指纹在google搜索到我们的网站。

你如果有兴趣坚持尝试一周以下方式,你会发现你整个人会很不同了,如果能继续坚持,那惰性生活方式就会永远不敢再接近你,而你将在人生获得你愿意的成就。

先可以用一天到两天时间给自己作一个行为记录,把你通常每天要作的事情记下来,这包括记录你所有的生活活动。这样你即使粗粗的记,大约也会有几十件。然后把其中一些如果吃饭等必须完成的事情剔除。在此之后,你把剩余下来的几十件事情按照你的兴趣排列,把你最不喜欢作的事情放在第一位,把你最喜欢作的事情放在最后一位。

最后,你就可以在以后一周内进行行动了,每天一早起来,从你最不喜欢的事情开始作起,并且坚持作完第一件事情,再作第二件事情……这么一直作到最后一件你喜欢的事情。

在整个过程中,你开始会稍觉得困难,但你只要花很少的力气稍稍坚持,你就能顺利进行下去。千万在中途不要跳跃那个先作不喜欢的再作喜欢的计划。

这种方式是一种强化作用的方式,先一件困难的事情完成后,再作稍困难的事情,那是一种对于前面行动的强化,然后继续,强化的效果会越来越大,一直大到你觉得你有力量来完成任何事情。

对于改变惰性生活方式,这种方式具有很大的效果。而对于经常抑郁心情的人,这种生活方式将直接改变表现为抑郁的行为,而很容易的使抑郁的情绪结束,而只要坚持,抑郁的生活方式就会永远结束。通过结束惰性或抑郁的行为,而结束惰性或抑郁的心理。

如果你试试,并且多一些坚持,你将发现这是多么有趣的事情。

注:转自http://www.psytopic.com/mag/post/behavior-shaping-to-rescue-you-from-inert.html

Posted in 心理学 | Leave a comment

Twitter新搜索架构将采用开源Lucene(转)

除了重新设计了UI,在后端,Twitter也带来了非常巨大的变化。今天,Michael Busch 更新了Twitter Engineering Blog, 给我们带来了一些搜索方面改进的细节。

刚开始Twitter的实时搜索引擎是基于Summize技术,Summize是Twitter 于 2008 年收购的一家公司。但是从那以后,Twitter开始显著成长:每秒 1000 条推和 12000 个查询,一天下来要 10 亿查询,从那里起,Twitter 的工程师团队就开始寻找一个替代品了,因为旧式的基于MySQL的系统已经面临了巨大的挑战。

所以Twitter开始转向一个新的搜索架构,选择了开源的Lucene。

先不说Lucene的优势,首先它在实时搜索方面就有一些缺点,所以 Twitter 重写了它的部分架构,但是仍然支持 Lucene 的API。重写的部分包括:

* 改进无用数据收集的性能

* 无锁数据结构和算法

* 逆序遍历 posting 列表

* 有效的早期查询终止

Twitter的目标是,信息发布10秒内即可被搜索服务索引。Twitter称,该公司目前只利用了新搜索服务后台约5%的资源,每秒能够索引的Twitter消息数量可以达到当前的50倍。使工程师们”至少支持更大负载“的使命向前迈进了一步。

值得注意的是,就在一个月前,Google曾发布了Instant即时搜索功能,并向美国用户正式推出,当用户在谷歌搜索框中输入“W”时,谷歌便可以为其提供当地的天气预报。如果用户最终并未使用“weather”(天气),而是选择了其他关键词,搜索结果页面也会即时刷新,并进行相应的改变。

在Google的Instant即时搜索引擎中,部署了新的缓存系统,用以处理高速度的查询要求,同时连续性地抓取网络内容,并为这些内容重新建立索引。

对于即时搜索技术的未来,我们很难判定谁能代表未来,但不可否认的是,在面向社会化网络时,以Twitter的Lucene架构和Google的Instant技术将是代表未来搜索引擎的重要技术方向。

Posted in Lucene | Leave a comment

Stack Exchange的系统架构(转)

Stack Overflow是我最喜欢的问答网站,没有之一,原因是它能解决我学习程序过程中遇到的大多数问题,而 Quora知乎更多的是拓展我的视野。(不要和我提百度知道,百度知道是小学生用来做暑假作业的!)

目前Stack Overflow每月不重复的访问用户超过1600万;每月网页浏览量(PV)增长了近6倍,达到9500万。已经发展壮大成了 Stack Exchange Network,而这个网络包括Stack Overflow、Server Fault和Super User等,旗下总共拥有43个网站,而且发展势头良好。

Stack Overflow的变化翻天覆地,而不变的是他们开放的心态,所以才有了这篇架构分享的文章。最近,他们写了一系列文章分享他们如何应对这样的快速增长。

(期待后面有时间把上面提到的文章都翻译一遍)

在过去的一段时间里,Stack Exchange到底发生了哪些明显的变化呢?

  • 更多:更多的用户,更多的PV,更多的数据中心,更多的站点,更多的开发者,更多的操作系统,更多的数据库,更多的服务器…更多
  • Linux:Stack Overflow因使用Windows系统而著称,现在他们使用越来越多的Linux服务器,比如HAProxy(负载均衡), Redis(NoSQL数据库),Bacula(数据备份系统),Nagios(远程监控软件),日志,路由器都运行于Linux系统,几乎所有需要并行处理的功能都是由Linux处理。
  • 容错:Stack Overflow目前为两条不同的线路使用了两个不同的交换机,增加了更多的冗余服务器,将一些网站服务运行于第二个数据中心。
  • NoSQL:Redis作为整个网站的缓存层。这是一个巨大的改变,以前并没有将缓存作为一个独立的层分离出来。Redis是一个运行于Linux的NoSQL数据库。

遗憾的是,一些我关注的问题并没有从中找到答案,比如面对这么多不同的系统,如何解决多租户的问题(Multi-tenancy 是一种软件体系结构,在这种体系结构中软件运行在 software as a service 服务商的服务器上,服务于多个客户组织即 tenant)。但是,从中我们依然可以学到很多。下面是收集的一些数据列表:

统计信息

  • 每月9500万次浏览量
  • 每秒800个HTTP请求
  • 每秒180个DNS请求
  • 每秒55M流量
  • 1600万个用户(Stack Overflow的流量在2010年增长了131%,全球每月不重复访客增至1660万人)。

数据中心

  • 1个机架放在俄勒冈州的Peak Internet(用于放置chat和Data Explorer)
  • 2个机架放在纽约州的Peer 1(用于放置Stack Exchange Network的其余部分)

硬件设备

  • 10台戴尔R610 IIS Web服务器(3台专门用于Stack Overflow):1个英特尔至强处理器E5640,2.66 GHz四核,8线程;16 GB内存;Windows Server 2008 R2
  • 2台戴尔R710数据库服务器:2个英特尔至强处理器X5680,3.33 GHz;64 GB内存;8个硬盘;SQL Server 2008 R2
  • 2台戴尔R610 HAProxy服务器:1个英特尔至强处理器E5640,2.66 GHz;4 GB内存;Ubuntu Server
  • 2台戴尔R610 Redis服务器:2个英特尔至强处理器E5640,2.66 GHz;16 GB内存;CentOS
  • 1台戴尔R610 Linux备份服务器,运行Bacula:1个英特尔至强处理器E5640,2.66 GHz;32 GB内存
  • 1台戴尔R610 Linux管理服务器,用于Nagios和日志:1个英特尔至强处理器E5640,2.66 GHz;32 GB内存
  • 2个戴尔R610 VMWare ESXi域控制器:1个英特尔至强处理器E5640,2.66 GHz;16 GB内存;2只Linux路由器;5台戴尔Power Connect交换机

 开发工具

  • 编程语言:C#(ASP.NET)
  • 集成开发环境(IDE):Visual Studio 2010 Team Suite
  • 开发框架:Microsoft ASP.NET Framework 4.0
  • Web框架:ASP.NET MVC 3
  • 视图引擎:Razor
  • 浏览器框架:jQuery 1.4.2
  • 数据访问层:LINQ to SQL,一些原始SQL
  • 源码控制:Mercurial和Kiln
  • 比较工具:Beyond Compare 3

软件与技术

外部组件(一些没有包含在开发工具中的代码)

  • reCAPTCHA
  • DotNetOpenId
  • WMD - Now developed as open source. See github network graph
  • Prettify
  • Google Analytics
  • Cruise Control .NET
  • HAProxy
  • Cacti
  • MarkdownSharp
  • Flot
  • Nginx
  • Kiln
  • CDN: 没有使用,所有静态内容从sstatic.net来提供,这个快速的、无cookie的域用于将静态内容分发到Stack Exchange系列网站。

开发人员和系统管理员

  • 14名开发人员
  • 2名系统管理员

内容

  • License: Creative Commons Attribution-Share Alike 2.5 Generic
  • Standards: OpenSearch, Atom
  • Host: PEAK Internet

更多可以学习的架构知识

  • 使用HAProxy替代Windows NLB 的原因是:HAProxy成本低廉、易于使用,还是免费的;而且通过Hyper-V,很适合作为网络上的一个512M虚拟机“设备”。它还在服务器的前端 工作,所以对服务器来说完全透明;而且作为不同的网络层,更容易排除故障,而不是与你的所有窗口配置混杂在一起。
  • 没有使用CDN,因为与捆绑在现有主机方案中的带宽相比,连亚马逊CDN这样“便宜的”CDN其费用都非常昂贵。按照亚马逊的CDN费率和Stack Overflow的带宽使用量,每月至少要付1000美元。
  • 备份到磁盘上,便于快速恢复;备份到磁道(tape)上,便于历史归档。
  • SQL Server的全文搜索机制集成度差,问题多,功能弱,所以改用了Lucene。
  • 最感兴趣的是HTTP请求峰值,因为他们需要确保可以处理的过来。
  • 所有站点都运行在Stack Exchange平台上。Stack Overflow、Super User、Server Fault、Meta、WebApps和Meta Web Apps都运行相同的软件。
  • 给StackExchange的用户进行区分是因为拥有不同专业技能的人不适合不同主题的站点。你也许是世界上最出色的大厨,但并不是说你就有能力修复服务器
  • 尽量把一切都放到缓存中。
  • 所有匿名用户可以访问的页面都使用缓存输出缓存输出给用户。
  • 每个站点有三种不同的缓存:本地缓存、站点缓存和全局缓存。
  • 缓存中的大部分项目在超时(通常是几分钟)后过期,但从来不被明确删除。当宣布某个特定的缓存项目无效时,他们使用Redis messaging消息传递机制,向“一级”缓存发布删除通知。
  • Joel Spolsky不是微软的忠实粉丝,他并不为Stack Overflow做出技术决策,他认为微软的协议是存在问题。需要你自己去考虑Hacker News commentor
  • Stack Overflow为自己的输入/输出系统选择英特尔X25固态硬盘组成的RAID 10阵列。这个RAID阵列消除了可靠性方面的任何问题;与FusionIO相比,固态硬盘的性能确实很好,而价格又便宜得多。
  • 微软许可证的总标价约为24.2万美元。由于Stack Overflow使用Bizspark,所以没在支付总标价,但他们能付的最多也就这么多。
  • 英特尔网卡取代了博通网卡。这解决了他们之前面临的问题:连接中断、数据包丢失和地址解析协议(ARP)表损坏。

 缓存信息

上面提到了Stack Exchange每个站点有三种不同的缓存:本地缓存、站点缓存和全局缓存。线面就来看看每个缓存的作用。

本地缓存:只能通过1对服务器/站点来访问。

  • 为了限制网络延迟时间,Stack Overflow使用了本地“一级”缓存(基本上是HttpRuntime.Cache),缓存服务器上最近设定/读取的值。这样就可以把网络上的缓存查找开销减小至0字节。
  • 缓存里面含有用户会话和等待的视图数更新等内容。
  • 缓存完全驻留在内存中,没有网络或数据库访问。

站点缓存:可以由一个站点(任何服务器上)的任何实例来访问。

  • 大部分缓存的值进入到这里,热点问题ID列表和用户验收率就是两个典例。
  • 缓存驻留在Redis(位于不同的数据库,纯粹为了易于调试)。
  • Redis的速度很快,缓存查找中速度最慢的部分就是读取字节并写到网络上。
  • 值被发送到Redis之前先进行压缩。Stack Overflow有许多处理器,大部分数据是字符串,所以得到的压缩比很高。
  • Redis机器上的处理器使用率为0%。

全局缓存:全局缓存被所有站点和服务器共享。

  • 缓存内容包括收件箱、API使用限额和另外几项真正全局的内容。
  • 缓存驻留在Redis中(位于数据库0,同样为了易于调试)。

注:转自:http://www.biaodianfu.com/stack-exchanges-architecture.html

Posted in NoSQL, 网站架构 | Leave a comment

Redis资料汇总专题(转)

很多朋友反映,说NoSQLFan上的资料不少,但是要找到自己实用的太难,于是萌生做这样一个专题的想法。通过将不同NoSQL产品从入门到精通的各种资料进行汇总,希望能够让大家更快的找到适合自己的教程或文章进行阅读。

本篇为Redis部分的资料汇总。保持持续更新。

1.Redis是什么?

2.Redis内部实现

3.Redis应用、优化及运维

4.Redis发展现状及展望

5.相关新闻

注:转自http://blog.nosqlfan.com/html/3537.html

Posted in NoSQL | Leave a comment

add video function to picseekers.com

see this demo:

Posted in 设计 | Leave a comment

Mobile Web App Frameworks: 10 Great Frameworks(转)

Mobile web app frameworks are in high demand as more and more users switch to using mobile devices for the majority of their computing needs.  If you’re an application developer and you’re not developing or porting your apps for mobile use, you’re missing out on huge potential customer bases.

Although developing one of the best mobile apps can be challenging, there are some great mobile web frameworks that can help you out, speed up your development and give you a leg up on the competition.

Here’s our selection of 10 great mobile web app framework options.

If you liked these mobile web app frameworks, check out these other posts:

Enjoy!

 

Sencha Touch Framework

Sencha Touch is the world’s first app framework built specifically to leverage HTML5, CSS3, and Javascript for the highest level of power, flexibility, and optimization. We make specific use of HTML5 to deliver components like audio and video, as well as a localStorage proxy for saving data offline. We have made extensive use of CSS3 in our stylesheets to provide the most robust styling layer possible.

Mobile Web App Frameworks

jQuery Mobile

jQuery mobile framework takes the “write less, do more” mantra to the next level: Instead of writing unique apps for each mobile device or OS, the jQuery mobile framework will allow you to design a single highly branded and customized web application that will work on all popular smartphone and tablet platforms

Mobile Web App Frameworks

jQTouch

A jQuery plugin for mobile web development on the iPhone, Android, iPod Touch, and other forward-thinking devices.

Mobile Web App Frameworks

The M Project

The-M-Project contains all UI and Core files to build jQuery Mobile based mobile HTML5 Apps. Its hosted in a git repository. Feel free to checkout the latest version of The-M-Project and replace it with the version included in Espresso.

Mobile Web App Frameworks

DHTMLX Touch – HTML5 JavaScript Framework for Mobile

DHTMLX Touch is a free HTML5-based JavaScript library for building cross-platform mobile web apps. It’s not just a set of UI widgets, but a complete framework that allows you to create eye-catching, robust web applications for mobile and touch devices.

By using a wide choice of available UI elements, you can build interactive mobile apps for business or entertainment. The online Visual Designer tool provides a codeless, drag-and-drop environment to build touch interfaces. Download the DHTMLX Touch framework and start developing your own mobile apps now!

Mobile Web App Frameworks

WebApp.Net

WebApp.Net provides many API so that most of the work is done for you. No need to waste time on AJAX coding, it is already buit-in. You just need to download the package and look at the provided demo website to start with it and take a quick look at the documentation. All you need is a WebKit based browser to test your first web application.

Mobile Web App Frameworks

Wijmo – jQuery UI Widgets

Wijmo, a mixture of JavaScript, CSS3, SVG, and HTML5, is a complete kit of over 30 UI Widgets. It is an extension to jQuery UI with every widget built to its standards and framework. Each widget is ThemeRoller-ready.

Mobile Web App Frameworks

960 Grid on jQuery-Mobile

jquery-mobile-960 is a port of 960 grid to jquery mobile. It merge the flexibility of 960.gs, and the ease of jquery mobile. It aims to bring more flexibility to jquery-mobile layout and thus make it easier to use on tablets. I loved jQuery-mobile ability to make an application by just describing its structure in HTML5. It makes applications real fast to develop. But jQuery mobile layout is currently rather raw. They only split the width in even parts, providing little controls to the designer. It uses an custom API with names ending with a, b, c or d, ui-block-a for example. Not the classic grid-4 or span-3, so it feel awkward. All in all, i felt jquery mobile layout was uselessly difficult to use, especially on large screens such as tablets. 960 grids are flexible and well known. So i used ported 960 grids to see if it helps.

Mobile Web App Frameworks

SproutCore HTML5 Application Framework

SproutCore applications move business logic to the browser so they can respond to your users’ taps and clicks immediately, avoiding an agonizing roundtrip across often intermittent network connections. SproutCore’s robust bindings system allows you to create data-centric applications. Just describe the state of your application and how the data flows from your models to your views and let SproutCore do the rest. Semantic templates allow you to write HTML and CSS that update automatically when your models change—like magic. And an in-memory database lets you intelligently manage and query your data and synchronize with your server.

Mobile Web App Frameworks

NimbleKit

NimbleKit is the fastest way to create applications for iOS. You don’t need to know Objective-C or the iOS SDK. All you need is to know how to write an HTML page with Javascript code.

Mobile Web App Frameworks

注:转自http://creativefan.com/mobile-web-app-frameworks/

Posted in 插件 | Leave a comment

2011年手机产品设计趋势(1):精致实用的界面(转)

前言

2010年底Apple在线软件商店App Store中的软件数量超过30万个,而Google在线软件商店Android Market里的软件数量已经突破10万,Windows Phone 7也于今年10月正式发布,随着手机硬件造价的降低和应用数量的上升,移动互联网的发展前景普遍被看好。但是移动互联网没有固定盈利模式之前,如何依靠产品优秀的用户体验侵占手机桌面和用户琐碎的时间是众开发者们面临的主要问题之一。

汇总本年度手机应用程序和热点问题之后,不难看出其中的趋势性特征,如精致的界面、操作体验、基于硬件的应用和消息推送等问题。可以预计的是,在2011年的产品设计中这些特征会逐渐得到强化。

精致实用的界面

iPhone2

自从iPhone 4视网膜屏幕(Retina Display) 发布,成为迄今为止在移动设备上能见到的最细腻、显示细节最清晰的屏幕,326显示精度比普通印刷品还要高,而以往普通手机的96像素,Android平台各种手机在120-240像素区间内,iPhone 4之前的屏幕也只有164像素。

clock

高精度意味着同样大小的屏幕上可以显示更多的细节,这对界面视觉设计要求也更高。出色的设计也能让你的应用程序脱颖而出,同时美观的界面看起来更好用。

2-81 m9

为了保证视觉效果统一性,各产品都不遗余力地弥补终端差异性,wap网站通过识别终端分辨率和平台显示不同的视觉效果,客户端也会在Android平台达到屏幕完美适配。

多主题

weico2

在安装包容许的情况下,为应用程序设计多套主题也是设计师满足用户多样化需求的手段之一。优先满足主体需求,也能照顾到用户的个性化需求。

控件

设计师也不再满足于系统提供的看起来千篇一律的标准控件,特别是Android平台黑乎乎的表格视图让人难以忍受。后半年新出的应用程序大多采用更为美观的自定义控件,提升用户体验的同时注重产品的品牌形象。

m4 m3

根据产品的实际情况修正的自定义控件,也能带来操作上的便利。如可爱的小地陪没有使用Android的下拉框控件,虽然单栏一次无法展现多个选项,但是去掉了弹框能减少了操作步骤和等待时间,而小米分享将引入网页和iPad中的气泡框。由于设计经验有限,需要避免网页设计的照搬,设计适用于手机的控件是交互设计们需要关注的问题。

字体

spiekermann15

早期Nokia为了满足低像素手机的字体显示要求,设计了点阵式字体Nokia Sans,为了让用户一眼就能识别出Nokia,该字体一直沿用至今。但手机渲染字体的能力已经显著提升,针对高分辨率设计的Android的Droid和iPhone的Helvetica更能适应显示要求。

ziti

但是界面中过多的细节也会有损用户体验,如像素提升一倍,对界面中的文字的阅读享受并没有相应成倍提升,相反字体过于锐利反而会干扰阅读,造成视觉疲劳,甚至不如低精度的电子书。现在还处在手机界面设计的早期,还没有像网页设计那样多种设计风格,也正如现代主义那样,“形式追随功能”的功能主义特征仍是先期产品设计的原则,避免过度设计。

布局

wp77

顶部标题栏、中部正文和底部工具/标签栏是常见的手机界面布局,根据操作情境在调用合适的控件。一方面设计要关注如何让界面更为巧妙地布局,如在标题栏中显示Tab分栏和充分利用表视图,另一方面似乎如何巧妙都不满足用户的屏幕显示尺寸的需求,主体部分最大化已经在部分应用程序和操作系统中有所体现。如随着操作Android自带浏览器chrome掩藏地址栏,而Windows Phone 7掩藏状态栏。

尺寸

95ca_Twittergoldenratio_thumb

在网页设计中栅格系统和比例关系能大大提高网页的规范性,页面中所有组件的尺寸都是有规律的。

golden

图片来自Tencent CDC Blog

如上图的布局尺寸主要包括比例和模数尺寸,界面设计中不存在孤立的元素。除了色彩之外,布局和采用有联系的模数尺寸和建立界面元素的联系,看起来更为协调,,克服视觉的不确定性。但一方面手机端界面设计还需要考虑手指点击,另一方面手机屏幕统一程度低,同样的设计在各个终端看起来不尽相同,规范性尺寸设计较低。但是未来如条件容许,科学精确性设计是必然化趋势。

注:转自http://daichuanqing.com/index.php/archives/2281 。

Posted in 设计 | Leave a comment