Category Archives: 分享

[zz]新职业:全栈工程师/全能工程师(Full Stack Developer)

期望一个凡人掌握开发过程中各个方面的知识,合理吗?也许不合理,但是Facebook正是要寻找这样的人。在一个OSCON会议上,一名Facebook的工程师告诉我的,他们只聘请“全能(Full stack)”的程序员。那么,全能是什么意思呢? 对于我,一个全能的程序员应该熟悉每一个层面的技术知识,如果不是全部掌握,也要对所有的软件技术有真正的兴趣。 熟悉整个技术体系的程序员,可以使得周围的人的生活更加容易。这就是为什么我反对在工作场合的技术鸿沟。当然,大公司里的政治和沟通的问题往往会影响他们的发展。我想Facebook招聘策略的目的就在于,如果聪明的人身心俱到,一个好的产品可以在更短的时间内发布。 技术知识体系的分层: 1.    服务器,网络和主机环境 这包括理解什么会宕机,为什么会,没有任何资源是理所当然的。 合理使用文件系统,云存储,网络资源,理解数据冗余和可用性。 在硬件受限的情况下,如何扩展应用。 那么关于多线程和竞争呢?你猜怎么着,你在你的开发机器上看不到,但是在现实中却经常发生。 全能程序员可以与DevOps协同工作。系统应该提供有效的错误信息和日志能力。DevOps会在你之前看到这些信息,使它们有意义。 2.    数据建模 如果数据模型存在缺陷,那么业务逻辑和更高的层次将要用奇怪、丑陋的代码来弥补那些模型没有覆盖到的边界场景。 全能程序员知道如何构建合理规范化的关系模型,包括外键、索引、视图、查找表等。 全能程序员熟悉非关系数据存储的概念,理解其比关系型数据存储的优点。 3.    业务逻辑 明白应用程序提供的核心商业价值。 需要扎实的面向对象知识。 需要理解框架。 4.    API层面/Action层面/MVC 理解外部如何与业务逻辑和数据模型进行交互。 框架在这里会用得很多。 全能的程序员有能力写出清晰,一致,简单易用的接口。一些API的复杂得使我感到厌烦。 5.    用户界面 全能程序员a)知道如何创建可读的布局,或者b)明白自己需要帮助艺术和图形设计师。无论哪一种,实现好的视觉设计是关键。 掌握HTML5/CSS3。 Javascript在将来会是非常重要的一门语言,很多令人兴奋的作品都是用Javascript完成的。(node, backbone, knockout……) 6.    用户体验 全能程序员明白,用户只是想让产品可以正常工作。 一个好的系统不会使得用户患上腕管综合征和眼痛病。一个全能程序员会将一个需要8次点击3个步骤的工序,修改为1次点击。 全能程序员会添加有用的错误信息。如果有什么出错了,要向用户道歉。有时程序员漫不经心写的错误信息会让用户觉得很傻。 7.    理解用户和业务的需求 现在我们模糊的进行的架构设计,但这会远离了真正的需求。 全能程序员会预先看看当用户在使用软件的时候,会发生什么。同时,他们也会关注业务部分。 其他问题: 能够编写质量单元测试。顺便说说,Javascript现在也可以进行单元测试了。 理解持续自动化集成,包括构建应用,测试,编写文档和部署扩展。 安全意识也非常重要,因为每一个层面都会有其易受攻击的地方。 总结: 将代码紧紧的绑到一个特定的环境(库,操作系统,硬件等等),是非常糟糕的实践来的。全能程序员理解所有的知识体系,不意味着他们可以走捷径。然而,他们确实会这样做,如果只是建立一个原型的话。 技术型创业公司需要全能程序员的多才多艺。但是,一个成熟的公司,需要更多的是专注的技术。 我不确定在你使用多种语言,使用多个平台,甚至为多个行业工作之前,你是否可以自称为全能程序员。全能程序员要在“高级程序员”之上,因为他们与通晓多语言的程序员在同一线上,但是对各个模块的关系更有全局的意识。注意我刚刚的列表,只有3-5项包含了编写代码。     Is it… Read More »

[zz]AngularJS 最佳实践

AngularJS 是一个 Web 应用框架,它实现了前端的 MVC 架构,能让开发人员很方便地实现业务逻辑。 举个栗子,要做到下面的效果,以前可能需要写一连串的 JavaScript 代码绑定 N 多事件。而使用 AngularJS 框架,一句 JavaScript 都不用写就能实现了,神奇吧? <script type=”text/javascript” src=”//ajax.googleapis.com/ajax/libs/angularjs/1.0.7/angular.min.js”></script> <div data-ng-app> 单价: <input type=”number” min=0 ng-model=”price” ng-init=”price = 299″> <br> 数量: <input type=”number” min=0 ng-model=”quantity” ng-init=”quantity = 1″> <br> 总价: {{ quantity * price }} </div> 这得益于 AngularJS 中的双向数据绑定特性(Two Way Data-Binding),将 Model 和 View 自动关联了起来,在更复杂的业务场景下,还有代码分离的好处,将 DOM… Read More »

Node.js应用案例

Node.js发展简史 2009年2月,Ryan Dahl在博客上宣布准备基于V8创建一个轻量级的Web服务器并提供一套库。 2009年5月,Ryan Dahl在GitHub上发布了最初版本的部分Node.js包,随后几个月里,有人开始使用Node.js开发应用。 2009年11月和2010年4月,两届JSConf大会都安排了Node.js的讲座。 2010年年底,Node.js获得云计算服务商Joyent资助,创始人Ryan Dahl加入Joyent全职负责Node.js的发展。 2011年7月,Node.js在微软的支持下发布Windows版本。 Node.js应用案例 虽然Node.js诞生刚刚两年多,但是其发展势头逐渐赶超Ruby/Rails,我们在这里列举了部分企业应用Node.js的案例,听听来自客户的声音。 在社交网站LinkedIn最新发布的移动应用中,NodeJS是该移动应用的后台基础。LinkedIn移动开发主管Kiran Prasad对媒体表示,其整个移动软件平台都由NodeJS构建而成: LinkedIn内部使用了大量的技术,但是在移动服务器这一块,我们完全基于Node。 (使用它的原因)第一,是因为其灵活性。第二,如果你了解Node,就会发现它最擅长的事情是与其他服务通信。移动应用必须与我们的平台API和数据库交互。我们没有做太多数据分析。相比之前采用的Ruby on Rails技术,开发团队发现Node在性能方面提高很多。他们在每台物理机上跑了15个虚拟服务器(15个实例),其中4个实例即可处理双倍流量。容量评估基于负载测试的结果。 企业社会化服务网站Yammer则利用Node创建了针对其自身平台的跨域代理服务器,第三方的开发人员可以通过该服务器实现从自身域托管的Javascript代码与Yammer平台API的AJAX通信。Yammer平台技术主管Jim Patterson对Node的优点和缺点提出了自己的看法: (优点)因为Node是基于事件驱动和无阻塞的,所以非常适合处理并发请求,因此构建在Node上的代理服务器相比其他技术实现(如Ruby)的服务器表现要好得多。此外,与Node代理服务器交互的客户端代码是由javascript语言编写的,因此客户端和服务器端都用同一种语言编写,这是非常美妙的事情。 (缺点)Node是一个相对新的开源项目,所以不太稳定,它总是一直在变,而且缺少足够多的第三方库支持。看起来,就像是Ruby/Rails当年的样子。 知名项目托管网站GitHub也尝试了Node应用。该Node应用称为NodeLoad,是一个存档下载服务器(每当你下载某个存储分支的tarball或者zip文件时就会用到它)。GitHub之前的存档下载服务器采用Ruby编写。在旧系统中,下载存档的请求会创建一个Resque任务。该任务实际上在存档服务器上运行一个git archive命令,从某个文件服务器中取出数据。然后,初始的请求分配给你一个小型Ruby Sinatra应用等待该任务。它其实只是在检查memcache flag是否存在,然后再重定向到最终的下载地址上。旧系统运行大约3个Sinatra实例和3个Resque worker。GitHub的开发人员觉得这是Node应用的好机会。Node基于事件驱动,相比Ruby的阻塞模型,Node能够更好地处理git存档。在编写新下载服务器过程中,开发人员觉得Node非常适合该功能,此外,他们还里利用了Node库socket.io来监控下载状态。 不仅在国外,Node的优点也同样吸引了国内开发人员的注意,淘宝就实际应用了Node技术: MyFOX 是一个数据处理中间件,负责从一个MySQL集群中提取数据、计算并输出统计结果。用户提交一段SQL语句,MyFOX根据该SQL命令的语义,生成各个数据库分片所需要执行的查询语句,并发送至各个分片,再将结果进行汇总和计算。 MyFOX的特点是CPU密集,无文件IO,并只处理只读数据。起初MyFOX使用PHP编写,但遇到许多问题。例如PHP是单线程的,MySQL又需要阻塞查询,因此很难并发请求数据,后来的解决方案是使用nginx和dirzzle,并基于HTTP协议实现接口,并通过curl_multi_get命 令进行请求。不过MyFOX项目组最终还是决定使用Node.js来实现MyFOX。 选择Node.js有许多方面的原因,比如考虑了兴趣及社区发展,同时也希望可以提高并发能力,榨干CPU。例如,频繁地打开和关闭连接会让大量端口处于等待状态,当并发数量上去之后,时常会因为端口不够用(处于TIME_WAIT状态)而导致连接失败。之前往往是通过修改系统设置来减少等待时间以绕开这个错误,然而使用连接池便可以很好地解决这个问题。此外,以前MyFOX会在某些缓存失效的情况下出现十分密集的访问压力,使用 Node.js便可以共享查询状态,让某些请求“等待片刻”,以便系统重新填充缓存内容

Chrome28中已经替换为Blink引擎

Google 宣布将在未来的 Google Chrome/Chromium 中使用基于 WebKit 的 fork Web 渲染引擎:Blink。同时 Opera 表示也将跟进 Google Chrome/Chromium 的步伐。  Google Chrome/Chromium 从创始至今一直使用 WebKit(WebCore) 作为 HTML/CSS 渲染引擎。WebKit 早先由 Apple 由 KHTML 项目 fork 出来,用于 Safari 浏览器的 Web 引擎。由于宽松的协议、轻量级的设计和便捷的应用程序内嵌 API,WebKit 逐渐变得流行起来,除了 Google Chrome/Chromium 和 Safari,它在移动终端( Symbian S60,Android,iOS)到 Toolkit 集成(GTK+, Qt4) 都有不错的收获。  尽管上面一众经常被统称为 WebKit,实际上各自都使用了自己的 WebKit 分支或者编译时选项,使得最终的渲染结果也是存在一定的差异的。不过大体上 WebKit 社区内部还是比较和谐的,各个成员之间也为维持兼容性作出了努力,直到 2010 年随着 OS X Lion 一起面世的… Read More »

教育部2013年发布的法国认可的学校名单

这个是教育部2013年2月发布的教育部认证的所有法国学校名单,也就是说这些学校都可以通过学位认证的。有官方的中文翻译,希望对大家选择学校,以防被骗有帮助。 一、基本情况 传统上,法国的大学和学院教育分三个阶段,每个阶段结束,成绩合格,都能得到国家授予的文凭。 第一阶段为大学第一、第二年。合格的学生获得的文凭(DEUG或DEUST) 相当于在国内获得两年制大学专科毕业证书。第二阶段为大学第三、第四年。第三年学习结束后,学生获LICENCE文凭(中文译为学士),第四年学习结束后,获MAITRISE文凭。第三阶段分两种情况:第一种情况,是获得侧重于职业生涯的高等专业学习文凭(DESS),学制一年。第二种情况,是学习结束后可获学习文凭(DEA),完成博士论文后,即可获得博士文凭(DOCTORAT)。 法国高等教育机构除各大学(均为公立)之外,还存在许多高等工程或商业学院,被称为“大学校”(GRANDES ECOLES)。进入此类院校攻读工程师文凭或高等商校文凭课程,除必须已取得中学毕业证书(BAC)外,还须通过严格的考试和预科学习。 在法国,旨在建立欧洲高等教育一体化的“波罗尼亚进程”被称作LMD(取法文单词学士、硕士和博士的第一个字母)改革。在这一框架下,大学学制被简化为学士3年、硕士2年、博士3年,而得到学士、硕士和博士学位所需的总年限则变成3年、5年和8年。这一改革已经在大学全面展开。但传统文凭并未被全部废止。 二、名单 一、公立大学 (共87所,含部分高等专业学校以及具有大学地位的三所综合理工学院) 序号 法文校名 中文校名 1 Université de Aix-Marseille 1 Provence 艾克斯-马赛第一大学 2 Université de Aix-Marseille 2 Méditerranée 艾克斯-马赛第二大学 3 Université de Aix-Marseille 3 Paul Cézanne 艾克斯-马赛第三大学 4 Université d’Amiens Picardie-Jules Verne 亚眠大学 5 Université d’Angers 昂热大学 6… Read More »

ruby on rails 验证

一些例子: validates :terms, :acceptance => true validates :password, :confirmation => true validates :username, :exclusion => { :in => %w(admin superuser) } validates :email, :format => { :with => /\A([^@\s]+)@((?:[-a-z0-9]+\.)+[a-z]{2,})\Z/, :on => :create } validates :age, :inclusion => { :in => 0..9 } validates :first_name, :length => { :maximum => 30 } validates :age, :numericality =>… Read More »

Git常用操作命令收集

git提交本地分支到远程分支 git 常用命令(含删除文件) Git常用操作命令收集: 1) 远程仓库相关命令 检出仓库:$ git clone git://github.com/jquery/jquery.git 查看远程仓库:$ git remote -v 添加远程仓库:$ git remote add [name] [url] 删除远程仓库:$ git remote rm [name] 修改远程仓库:$ git remote set-url —push[name][newUrl] 拉取远程仓库:$ git pull [remoteName] [localBranchName] 推送远程仓库:$ git push [remoteName] [localBranchName] 2)分支(branch)操作相关命令 查看本地分支:$ git branch 查看远程分支:$ git branch -r 创建本地分支:$ git branch [name] —-注意新分支创建后不会自动切换为当前分支 切换分支:$… Read More »

Sublime Text2 实用快捷键大全

刚刚接触到Sublime Text2,更高深的技巧还有待发现,所以先说说它的一些快捷键。 快捷键能凭几个按键组合就实现复杂的功能,大量使用快捷键显得非常专业,实在是装逼利器。 下面有快捷键的表,下面我只解说一些我觉得非常有用的快捷键。 我先说说Sublime text2的一个奇特之处,就是它的快捷键支持多键联合。比如Ctrl+KK,意思是按住Ctrl,再按两下K键!怎么样,没见过吧。这种方式可以大大降低快捷键的重复几率。 顺便说下Ctrl+KK的功能是删除光标处至行尾的内容。 Ctrl+/和Ctrl+Shift+/ 添加注释。前者是注释一行,后者是注释你选择的内容。   Sublime的这个注释功能很强大,你光标在任何位置,比如一行的中间,此时按下Ctrl+/,他会准确的注释掉整行,而不用把光标定位到行首; 而且,注释会自动选用不同格式,比如html页面里有JS,CSS和HTML,在他们各自的区域内按下快捷键,都会自动使用相对应的注释格式,不会混乱。 相比来说,Notepad++的添加注释功能就显得很鸡肋了。无法自动适应格式,而且多行注释bug严重直接无法使用。   Ctrl+Shift+D 复制选中行,并插入到选中行之前。这个跟Notepad++的Ctrl+D差不多,很有用。   注:你可以一次选择很多行进行复制操作。     Ctrl+Enter 与Ctrl+Shift+Enter 这两个快捷键很奇葩。Ctrl+Enter是插入行后,Ctrl+Shift+Enter是插入行前。意思是在当前行的后面或前面插入一个空行。   他们为什么有用呢?比如你改了一行代码中间的某个部分,此时你的光标在行中,你需要换行,一般你怎么做?恐怕只有先点一下行尾把光标移动过去,再按下Enter键换行吧? 但在Sublime Text2中,你直接按下Ctrl+Enter,就换到下一行了。不会打乱你当前行的结构。要是你想在当前行的上一行写什么,就按Ctrl+Shift+Enter吧。   Ctrl+Shift+Up与Ctrl+Shift+Down 分别表示把当前行与上一行或下一行互换,有时候很需要这功能。   Alt+. 闭合当前html标签。比如半边的p标签,div标签什么的。   Ctrl+J 合并选中的多行。如果你想把你的网页搞成只有一行,让别人一看就晕的,这个功能很适合你。   暂时就这些吧。附带一个Sublime Text2的小技巧:按住Ctrl点击文档,点击几个地方就会出现几个光标,可以同时打字。这个的作用就是,比如你有几张图片路径相同,然后你想把他们都 换成新路径,那你可以按住Ctrl分别点击他们的路径,然后就可以同步删除或修改字符了!   Sublime Text2最纠结的缺点就是打开GBK编码的带中文文件铁定乱码,其余则要强过Notepad++——Oh,愿Notepad++原谅我的始乱终弃啊。 Ctrl+L 选择整行(按住-继续选择下行) Ctrl+KK 从光标处删除至行尾 Ctrl+Shift+K 删除整行 Ctrl+Shift+D 复制光标所在整行,插入在该行之前 Ctrl+J 合并行(已选择需要合并的多行时) Ctrl+KU 改为大写… Read More »

MyISAM和Innodb比较[zz]

MyISAM 是MySQL中默认的存储引擎,一般来说不是有太多人关心这个东西。决定使用什么样的存储引擎是一个很tricky的事情,但是还是值我们去研究一下,这里的文章只考虑 MyISAM 和InnoDB这两个,因为这两个是最常见的。 下面先让我们回答一些问题: ◆你的数据库有外键吗? ◆你需要事务支持吗? ◆你需要全文索引吗? ◆你经常使用什么样的查询模式? ◆你的数据有多大? myisam只有索引缓存 innodb不分索引文件数据文件 innodb buffer myisam只能管理索引,在索引数据大于分配的资源时,会由操作系统来cache;数据文件依赖于操作系统的cache。innodb不管是索引还是数据,都是自己来管理 思 考上面这些问题可以让你找到合适的方向,但那并不是绝对的。如果你需要事务处理或是外键,那么InnoDB 可能是比较好的方式。如果你需要全文索引,那么通常来说 MyISAM是好的选择,因为这是系统内建的,然而,我们其实并不会经常地去测试两百万行记录。所以,就算是慢一点,我们可以通过使用Sphinx从 InnoDB中获得全文索引。 数据的大小,是一个影响你选择什么样存储引擎的重要因素,大尺寸的数据集趋向于选择InnoDB 方式,因为其支持事务处理和故障恢复。数据库的在小决定了故障恢复的时间长短,InnoDB可以利用事务日志进行数据恢复,这会比较快。而MyISAM可 能会需要几个小时甚至几天来干这些事,InnoDB只需要几分钟。 您操作数据库表的习惯可能也会是一个对性能影响很大的因素。 比如: COUNT() 在 MyISAM 表中会非常快,而在InnoDB 表下可能会很痛苦。而主键查询则在InnoDB下会相当相当的快,但需要小心的是如果我们的主键太长了也会导致性能问题。大批的inserts 语句在 MyISAM下会快一些,但是updates 在InnoDB 下会更快一些——尤其在并发量大的时候。 所以,到底你检使用哪 一个呢?根据经验来看,如果是一些小型的应用或项目,那么MyISAM 也许会更适合。当然,在大型的环境下使用 MyISAM 也会有很大成功的时候,但却不总是这样的。如果你正在计划使用一个超大数据量的项目,而且需要事务处理或外键支持,那么你真的应该直接使用 InnoDB方式。但需要记住InnoDB 的表需要更多的内存和存储,转换100GB 的MyISAM 表到InnoDB 表可能会让你有非常坏的体验。 =========================================================== … Read More »

Mysql数据库和表名大小写问题,如何设置

在 MySQL 中,数据库和表对应于那些目录下的目录和文件。因而,操作系统的敏感性决定数据库和表命名的大小写敏感。这就意味着数据库和表名在 Windows 中是大小写不敏感的,而在大多数类型的 Unix 系统中是大小写敏感的。一个特例是 Mac OS X,当缺省的 HFS+ 文件系统使用时。然而 Mac OS X 还支持 UFS 卷,那些在 Mac OS X 是大小写敏感的就如他们在任一 Unix 上一样。查看章节 1.8.3 MySQL 对 ANSI SQL92 的扩展。 注意:尽管在 Windows 中数据库与表名是忽略大小写的,你不应该在同一个查询中使用不同的大小写来引用一个给定的数据库和表。下面的查询将不能工作,因为它以 my_table 和 MY_TABLE 引用一个表: mysql> SELECT * FROM my_table WHERE MY_TABLE.col=1; 列名与列的别名在所有的情况下均是忽略大小写的。 表的别名是区分大小写的。下面的查询将不能工作,因为它用 a 和 A 引用别名: mysql> SELECT col_name FROM tbl_name… Read More »