摘要: 今天是农历2011年的倒数第二天(像我这样的农民还是习惯于农历),最后一天上班,12点放假,明天坐灰机去四川(农民第一次坐灰机)。最后一天上班,工作上简单回顾下2011年所做、所感,给自己作一点客观的评价。阅读全文
posted @ 2012-01-21 11:43 慢热君Kevin 阅读(30) 评论(0) 编辑
摘要: 翻译一篇Nicholas C.Zakas的文章,原文在这里。自己看和翻译还是两码事,第一次这么正经的翻译,翻译得比较晦涩,喜欢英文原文的同学可以挪步,也可以选择对照英文阅读。阅读全文
posted @ 2011-12-03 17:17 慢热君Kevin 阅读(70) 评论(0) 编辑
摘要: 常见网站javascript架构会造成哪些问题,模块化的javascript的架构又有哪些优点来解决这些问题...阅读全文
posted @ 2011-11-27 22:12 慢热君Kevin 阅读(276) 评论(2) 编辑

  如何快速成为javascript高手?

  之前我拿这个问题问过我的同事,也问过国内的一些javascript高手。

  最近,我一直在拿这个问题问自己。之所以会有这个问题,我基于两个前提:第一、我自认为自己不笨;第二、我学习和使用javascript也有一段时间了,并且自己学习还算努力。

  思来想去,我觉得我应该先回答下这个问题:如何提高自己的学习效率?

  想象一下学校的场景,有一些知识,有的人就是学得比你快。为什么?可能他本来就比你聪明;可能他之前学过的、接触过的东西使他对这个知识有启发;可能他背地里比你花的功夫还多。不管哪一种形式,从旁观者的角度来看,他就是学得比你快,也就认为他的学习效率比你高。

  排除第一个答案不讨论。我们来讨论下第二个和第三个答案。

  答案二:“他之前学过的、接触过的东西使他对这个知识有启发”,我这里简单的归结为积累,关于积累问题,我上一篇博客程序员的学习和积累有谈到。

  答案三:“他背地里比你花的功夫还多”,还有现象本身“他花的功夫比你少,学得比你还好”,关键字都落在了“功夫”二字上。如何下功夫、功夫下在什么地方?这又引出了一个新问题。

  关于这个问题,纠结了这么多天,我的回答是:如何下功夫?动手!功夫下在什么地方?和工作有关的地方!

  说到这,我又想起了我深受毒害的应试教育。应试教育缺乏的正是动手和实践知识的场所或曰方式。很多时候我总是懒于动手,为什么懒于动手?难道是我真的懒吗?我不承认,我不动手是因为我找不到动手的理由,或是不知道如何动手。拿写一个javascript库或框架为例,为什么我到现在还没有写一个javascript库?首先我找不到写它的理由,现在这么多流行、易用且被广泛使用的javascript库或框架了,有必要再写一个吗?就算我写了,公司会使用它吗?如果没有对其他库或框架的深刻理解和认识,只是把各个库或框架中的一些东西拼凑在一起,甚至不知道其中一个函数实现的内部原理,那能叫我写的吗?其次,我找不到入手的地方。在没有对其他框架有深刻认识,自己能找到其中的缺陷、不足而加以修正和实现之前,我找不到入手的地方。

  解释下答案:

  功夫下在和工作有关的地方,这需要有强烈的责任心和主人翁意识。我们需要深刻理解这句话,“功夫下在和工作有关的地方”不是说,每天把上司交给自己事情做完、没有bug、达到需求就可以了。而是要做得更好,我想提出3点,也给自己树立目标:

  1、用最优的方案实现需求。在自己的已有知识结构、能力、经验上用最好的方式实现需求,在此基础上努力搜寻业界相关的解决方案比较优劣,选出最佳的方案,最终实现需求。

  2、关心自己已做完工作,关注业界的相关新思想、新技术、新理念,把已完成的工作,用最新最优的方案予以重构,并在适当的时机在产品上得以实现。

  3、关注自己所负责工作的未来,把产品当做自己的孩子,努力将他引向最美好的未来。努力将自己所负责的产品打造成为业界的标杆(特别是自己所负责的部分,那是自己影响圈内的事情)。

  动手。如果你知道了功夫该下在什么地方,也自然知道了要动手做什么,动手也会成为快乐的事情。

  不知道大家有没有这样的经历,当你有极大的渴望想把某件事情做好的时候,你会花很大的精力去研究怎样把事情做好,为此你会学习很多相关的东西,平时你可能花一周时间也学不会的东西,你花一个上午就学会了,还应用到了你要做到事情中,并且事后你会对所学过的东西印象深刻。

  这,就是我对“如何提高学习效率”这个问题的回答。

  很抱歉,写到这里我还几乎没有正面回答“如何快速成为javascript高手”这个问题,如果你已经有所收获了,我感到很欣慰。如果没有,再谈谈javascript,因为我目前还不算javascript高手,下面这段算画蛇添足也好,算狗尾续貂也罢。

  语言层面:编程语言之间是想通的,至少高级语言是想通的(相对于机器语言和汇编语言),javascript是一门特殊的语言,既可面向过程、又可面向对象。有人喜欢它弱类型语言的特性,而将其语言本身的特性发挥得淋漓尽致。有人喜欢java这类纯面向对象语言的严谨,而使用一些功能函数将其包装成完全的面向对象,并采用它实现了一些常见设计模式。所以说,真正要精通javascript这门语言本身,需要对其他语言的一些理解(至少是了解)。鉴于目前javascript从业人员的构成,非计算机专业科班出身的同学可能需要努力补补课。

  环境层面:javascript运行的环境目前有浏览器端和服务器端,将来可能有机会到嵌入式设备中。目前大部分应用主要集中在浏览器端,而浏览器厂商为了各自利益等各种历史原因造成的javascript运行环境兼容性问题,也是javascript从业人员较为头疼的问题。

  业务层面:很多其他语言有功能完善的底层API、工具包,抱歉,javascript暂时没有(浏览器端、nodejs开始有雏形,希望commonJS规范能够一路走好)。所以各种库、框架对于一些基本业务需求都提供了类似但非相同的实现。一个优秀javascript程序员需要辨别各种框架或库中的业务实现,或编写出自己的业务实现。

  综上,要在语言、环境、业务三个方面都精通,确实是需要花费很大的功夫。一个人的精力是有限的,其他语言积累几十年的东西,你想一个人在javascript得到实现是不太可能的。术业有专攻,不是说你是javascript高手,javascript的方方面面你都能做到最好。

  故,我认为“如何快速成为javascript高手?”, 无解。无法快速!

  “如何成为javascript高手”,动手,把功夫下在和工作有关的地方上!

  运用javascript把工作做得最好,才是javascript高手!

  PS:这是本人对自身问题的思考和分析,之所以发到首页来,是希望能给有同样疑惑、同样迷茫的同学带来些思考。分享这篇博文花了4小时的写作时间,如果你有同感,如果你觉得我还算用心,请帮忙右下角推荐一下,这样能给更多的同学带来一点思考和帮助。如果你以为我是javascript高手,只是来学习经验的,却没有半点收获,失望而归,请拍砖。

posted @ 2011-11-27 00:46 慢热君Kevin 阅读(8333) 评论(72) 编辑

  Boot Sequence翻译成中文是引导顺序、启动顺序,是学习linux的一个重要的知识点,也是一个基础的知识点,做下笔记。

  Linux Boot Sequence:

  1、load bios(hardware information)

    加载BIOS(硬件信息),BIOS:Basic Input Output System(基本输入输出系统),是一组固化到计算机内主板上一个ROM芯片上的程序,它保存着计算机最重要的基本输入输出的程序、系统设置信息、开机后自检程序和系统自启动程序。详见百度百科

  2、read MBR's config to find out the OS

    读取MBR配置查找需要启动的操作系统,MBR: Master Boot Record(硬盘的主引导记录),它由三部分组成:主引导程序、硬盘分区表、硬盘有效标志。

  3、load the kernel of the OS

    加载操作系统的内核。注意这里有个一个选择操作系统的步骤。GRUB(the GRand Unified Bootloader),是多启动规范的实现,它允许用户可以在计算机内同时拥有多个操作系统,并在计算机启动时选择希望运行的操作系统。GRUB可用于选择操作系统分区上的不同内核,也可用于向这些内核传递启动参数。

  4、init process starts...

    启动第一个进程init

  5、execute /etc/rc.d/sysinit

    init进程启动后,会执行/etc/rc.d目录下的sysinit命令

  6、start other modules(etc/modules.conf)

    加载其他模块,只有这些模块加载之后,网络、光驱等才可以使用。

  7、execute the run level scripts

    run level: linux内核启动完之后,后续的启动是分层次的。可以分任意层次进行启动,每个层次之间无直接关系,并且各层之间启动的程序不一样。

    run level层次:

      0) - 系统停机状态  /etc/rc.d/rc0.d/

      1) - 单用户工作状态  /etc/rc.d/rc1.d/

      2) - 多用户状态(没有NFS)  /etc/rc.d/rc2.d/

      3) - 多用户状态(有NFS)  /etc/rc.d/rc3.d/

      4) - 系统未使用  /etc/rc.d/rc4.d/

      5) - 图形界面  /etc/rc.d/rc5.d/

      6) - 系统正常关闭并重新启动  /etc/rc.d/rc6.d/ 

  8、execute /etc/rc.d/rc.local

    运行 /etc/rc.d/rc.local脚本。rc.local脚本主要用于自启动。

  9、 execute /bin/login

    执行/bin/login,展示系统登录界面。

  10、shell started...

  

  我们可以把这个步骤简化分为以下几个步骤:

  1、BIOS Initialization

    BIOS初始化

  2、Boot Loader

    1st Stage - small, resides in MBR or boot sector

    2nd Stage - loaded from boot partition

  3、Kernel initialization

    内核初始化

  4、init starts and enter desired run level by executing:

    初始化启动,通过运行以下命令来执行run level

    /etc/rc.d/rc.sysinit

    /etc/rc.d/rc and /etc/rc.d/rc?.d/

    /etc/rc.d/rc.local

    X Display Manager if appropriate

 

  基于BIOS、MBR、GRUB、Kernel、Init、run level六个概念,也有人将这个启动步骤分为这六部。关于Linux的启动,读者只需仔细理解研究这六个概念就可以了。

  参考:

  尚学堂科技轻松愉快LINUX视频教程

  红帽RH133官方教程

  6 Stages of Linux Boot Process

      

posted @ 2011-11-22 22:04 慢热君Kevin 阅读(80) 评论(0) 编辑

  对于一个程序员来说,学习的重要性相信大家都能意识得到。如何才能有效地学习,高效地学习?探讨下这个问题,我认为很有必要。

  每个人学习的方法和习惯可能都不尽相同,很多人习惯了在学校的学习方式,特别是很多刚出校门的人。在他们潜意识中,学习只是应付考试的一种手段,考完就一切OK了,全部还给老师了也无所谓,反正考完之后下次不会再考这么课程了(大学尤其如此)。长期的应试教育会让很多人以考试的心态来对待学习,我也是受害者之一,翻翻我硬盘中散落的各种语言编写的"hello world",各种半成品,它们就像一张张60分、80分的试卷悄无声息地躺在某个昏暗的角落里。

  职业生涯的学习一个最大的特点是具有持续性,你需要在某个知识或技能上花费你大部分精力。这时候,应付考试的学习方法已经不再有效了,而知识积累显得尤为重要。如果没有积累,所有的学习的成果都是一张60分的试卷。当你下次使用所学知识的时候,你手头有的就只有那张60分的试卷,你的学习将重新从0开始,由于时间关系或其他原因,你这方面的学习可能在你达到可以考60分的水平时又戛然而止,当你后面又需要使用时,又从0开始学习...如此循环往复,一定时期内,你的水平将永远停留在0-60分中间。

  职业生涯学习的另一个特点是,你有机会去教。“The best method to learn is to teach”,你可以将你的所学通过各种形式的分享传授给他人。通过教的方式你不仅能够巩固你所学的知识,更能够推销自己、结交志同道合的朋友。

  那么,基于职业生涯学习的特点,应该养成哪些好习惯呢,本人愚见,提出几点:

  积累:

  1、使用note。比如evernote,one note(个人推荐神器evernote)。作为一名程序员,如果你不使用note的话,显然你已经out了。你可以使用note来在任意时间记录你的想法、学习笔记、分享、待办事项等等任意你想记录的。

  2、经营好你自己的资产。你的作品、代码、idea、你搜集到的资料都是你的资产。对其进行分门别类,同步到网络硬盘(注意信息安全)、多备份都是很好的选择。

  分享:

  1、将自己的知识总结成ppt、写出demo。要养成这种意识,当你形成ppt、demo的过程中,你将站在更高的层次去看待你学过的知识、加深你的理解。当然,如果有机会一定要去讲,不管是何种级别的分享,哪怕是自己给自己讲或是讲给自己身边的朋友。

  2、写技术博客。博客有很多种,对博客的定位,决定你写什么样的博文。如果你的博文每篇都作为一个研究课题来写,我相信你打造一个精品博客一定是早晚的事情。当然我们可能没有要求这么高,那么博客也可以当note来使用(记录你每天的所学所想),这样可能有好心的人会指出你博文中的错误,和你探讨相关的技术等等。

  最后想谈下自己对技术书籍、博客订阅和技术社区、QQ群一些看法。现在社会的信息非常大,你可以通过很多渠道获得你想要的信息。但是,问题是信息的质量良莠不齐、信息量巨大,如果每天都把时间花在自己熟悉的信息上、每天都参与各种无意义的讨论(如语言之间的优劣),那么反而学不到东西还会把自己弄得心烦意乱。

  技术书籍:技术书籍应该是最严肃的获取信息方式,你可以通过对优秀技术书籍的研读、思考(特别注意思考这个词),形成你知识的框架,这应该是一个稳固的结构。

  技术博客和社区:这里是指订阅业界的博客,参与相关博客社区的技术交流。订阅业界、牛人的博客是获得最新、最前沿的知识和技术的方式,应该每隔一定时间段(如每天、每周2次等)研读这些文章、做好笔记。

  QQ群(或其他即时通讯群组):即时通讯是最直接的技术交流工具。通过这种工具交流技术、扩大职业圈子是一个很好的选择。但是鉴于目前,很多技术群很少谈论技术、或技术含量较低等情况,建议加入后仔细甄别,不要因为大量垃圾信息浪费宝贵的时间。

  

posted @ 2011-11-22 18:01 慢热君Kevin 阅读(2763) 评论(18) 编辑

  一向不喜欢追求刚刚新鲜出炉的事物的我,终于在node js出来一年后开始迈出脚步。

  废话少说,先把环境给配置好。google "mac node",出来几条结果,提供的方法基本一样,遂开始实践之。附google后的安装步骤:

  1、安装xcode、git;

  2、使用git将node源码拉到本地 git://github.com/ry/node.git

  3、./configure

  4、make

  5、make install

  还好之前有装过xcode、git,要不然光下载安装个xcode,今天晚上的时间完全报销(托网络不给力的福)。有了这两个玩意,安装应该轻松搞定。然而却出来几个问题,首先./configure的时候,有几个东西没有: openssl -> not found, library -> not found, fdatasync(2) with c++ -> no。然后make的时候悲催的报错了:build failed: -> task failed(err #1):...。

  之后,我又重复了好几遍,都是没有成功,开始怀疑是否是openssl, library rt缺失导致的,准备装openssl神马的,顺便群里面问了句,有朋友建议使用node 0.6.1,然后跑到github上,download了最新版本的源码,重复google上的安装步骤,'build' finished successfully, 'install' finished successfully,搞定!原来是版本问题,当然具体是版本内部的什么问题,这里先不深究了,helloworld先出来再说。

  安装成功后,将官网上的helloworld程序copy一份保存为helloworld.js到node安装目录下,

  

var http = require('http');
http.createServer(function(req, res){
res.writeHead(200, {'Content-Type': 'text/plain'});
res.end('Hello World\n');
}).listen(8808, '127.0.0.1');
console.log('Server running at http://127.0.0.1:8808');

 

  运行node helloworld.js,就能在命令窗口中(控制台)下看到"Server running at http://127.0.0.1:8808"的信息,在浏览器中输入localhost:8808,页面不能连接,悲催了,怎么回事。跑到控制台下看,报了一个错:The 'sys' module is now called 'util'. It should have a similar interface.貌似是要实现某个接口,可是不对啊,这可是官方提供的helloworld啊,还能出错。肿么回事?莫非又是版本问题?node -v之,版本为node-v0.6.2 pre,乖乖,0.6.2的最新版本,而我跑的是0.6.1的helloworld,出错了。既然官网目前提供了0.6.1的文档,还是先看看0.6.1吧。

  好吧,又有重装了。这次吸取教训,从官网上把0.6.1版本驼下来,然后重复以上步骤,make install的时候又出错了,需要删除刚才安装的0.6.2 pre版本,因为它扎用了usr/local/include/node目录,其下的config.h不能重写。乖乖,没有sudo,没有权限,那就sudo拿到管理员权限,重新sudo make install,安装成功了。

  继续跑node helloworld.js,console正常,并能访问localhost:8808,OK,终于搞定。也算一波三折。

  留心一下,如果你的程序中有代码错误,控制台还是会先打印出console信息,然后再给你报出错误信息,比如使用0.6.2 pre版本报的那个错The 'sys' module is now called 'util'. It should have a similar interface,再比如你把res.writeHead携程rs.writeHead。

posted @ 2011-11-13 22:27 慢热君Kevin 阅读(211) 评论(0) 编辑

概述

使用

优点

缺陷

实际应用

总结

 

概述

  css expression(css表达式)又称Dynamic properties(动态属性)是早期微软DHTML的产物,以其可以在Css中定义表达式(公式)来达到建立元素间属性之间的联系等作用,从IE5开始得到支持,后因标准、性能、安全性等问题,微软从IE8 beta2标准模式开始,取消对css expression的支持。

 

使用

  微软提供了4个css expression方法:getExpression、recalc、removeExpression、setExpression。有兴趣可以参考msdn

  一般最常用的是直接在css中使用expression,例如:

1 .toTop{
2 top:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60)));
3 }

  这是一个返回顶部按钮css代码的截取,用css来将元素定位到屏幕底部的位置。

 

优点

  css exprssion技术达到了可以使用表达式或公式来定义css属性的目的,msdn上给出了它的几个优点:减少页面上的代码,使设计师无需学习javascript就能实现一些DHTML的效果。个人认为,减少页面上的代码实际上只是减少了相关javascript的代码,而css expression中的代码本身与js是及其类似,设计师无需学习js就能实现DHTML效果这个优点也很牵强,或曰鸡肋。

 

缺陷

  • .不符合web标准
    css表达式这种在表现(css)中插入行为(js)代码,有悖于web标准的结构、表现、行为相分离的理念。
  • .效率低下
    一个css表达式会反复执行,甚至执行成百上千次。这会大大消耗计算机的硬件资源,极端情况下会导致浏览器的崩溃。
  • .带来安全隐患
    css表达式暴露了一个脚本执行的上下文,可能带来脚本注入的隐患。

  基于以上原因,微软最终从IE8 beta2(标准模式下)开始放弃对css表达式的支持。

 

实际应用

  早期很多开发人员利用css expression实现了许多效果,比如将元素相对鼠标指针进行定位,根据一个定时器来移动元素等等。当然这些效果能够使用js来实现。

  虽然css表达式问题很多,但是我们依然能够在网上看到它们的影子,甚至在一些成熟的商业网站上。最常见的一个应用就是悬浮在页面上的某个模块(比如导航、返回顶部)。

  我们来看一个常见的返回顶部按钮的代码实现:

  html:

<!doctype html>
<html>
<head>...</head>
<body>
<div id="top">...</div>
...
<a href="#top" id="toTopBtn">返回的顶部</a>
</body>

</html>

  css:

#toTopBtn{
position
:fixed;
bottom
:10px;
right
:10px;
_position
:absolute;
_top
:expression(eval(document.documentElement.scrollTop + document.documentElement.clientHeight - 60));
...
}

  _position和_top是对IE6的hack,因为IE6不支持position:fixed。这里的css表达式的作用是模拟position:fixed,即在将返回顶部按钮固定在页面的底部,不管页面是否滚动、缩放。正是因为css exprssion会执行多次,所以这个按钮元素才会一直定位在页面的底部。当然,我们可以使用javascript来模拟ie6的position:fixed,但细心的同学可能会发现这样一个问题,IE6下的返回顶部按钮会在你滚动页面的时候有较为明显的抖动。而我们使用css expression,这要在css加入以下规则,抖动的现象就会消失:

html{
_background-image
:url(about/blank);
_background-attachment
:fixed;
}

  而使用js来模拟的,加上这句css规则也是没有效果的。这也应该是很多成熟商业网站现在还在使用css expression的原因。若有较好的实现方案,欢迎讨论。

  但是,根据YSlow提供的网页优化建议:Avoid CSS Expressions,也由于css expression的各种问题,个人不建议使用css表达式。可以和产品人员协商,容忍ie6下这点抖动的瑕疵,或者采用动画来美化这个抖动效果,或者使用另外的一种方式来实现position:fixed,比如:固定页面的高度,让页面内部的内容可滚动,然后将返回顶部按钮绝对定位到底部(采用这种实现方式要慎重,因为或对页面布局和结构造成较大的影响)。

 

总结

  CSS expression作为web时代临时解决方案的产物,在被其创建者无情的抛弃后,我们更应该摈弃这种较为丑陋的代码方式,采用更优的解放方案。


参考

  About Dynamic Properties

  Ending Expressions




posted @ 2011-11-13 14:39 慢热君Kevin 阅读(1282) 评论(3) 编辑
摘要: .需求诞生和方案评审.产品设计.技术实现.技术细节.号外.需求的诞生和方案评审杜撰一个蛋疼的需求:假设你(web开发者)有一个电影类的网站(内容包含介绍、评论、影院信息等),你如何用最小的成本将web网站的电影应用做成ipad应用?首选方案:如果如果你老爸或儿子是ios开发者,成本将最小(不考虑情感成本),或你爸是李刚、李双江(一分钱不花找人做),成本也将最小。但是如果你既不是富二代、官二代,也暂时不是富二代、官二代他爹,这种方案可以忽略。最蛋疼的解决方案:你可以用一个webview将这个网站的页面全部装起来,然后程序图标就算大功告成了。这似乎也是最好的解决方案了,就好比你在自己的ipad上加阅读全文
posted @ 2011-09-10 22:10 慢热君Kevin 阅读(1718) 评论(0) 编辑
摘要: 前段时间参与了一个手机app嵌入webview应用的项目,感触颇多。正如前一篇博文“html5+css3方式实现mobie app的一些瓶颈”所述,存在用web方式实现确实存在很多瓶颈。 最近研究了下竞争对手的一款mobie app产品,存在一些值得学习和改进的地方:其首页(列表页)将所有的商品信息都请求下来,所以耗时会比较长。但由于是native app,有程序启动画面和loading图片的存在,再加上手机用户对加载速度有心理预期,所以对用户体验影响不大。由于其对所有商品信息的缓存,用户由首页进入详情页后就可以将缓存的信息先展示给用户(而且缓存的信息刚好占满手机的一屏),其他内容随后加...阅读全文
posted @ 2011-06-02 20:52 慢热君Kevin 阅读(1278) 评论(2) 编辑