Monthly Archives: 五月 2013

Hello World 业界杂谈

nodejs-express初体验

上次文章提到,正在用nodejs做一个小项目,现在总算是做完了

学习/搞着玩是一回事,虽然两年前就开始接触nodejs,做实际要用到项目里是另一回事,经过两周的折腾,我这里不想夸,也不想踩,只想说一下我真实的感受,给准备用nodejs的朋友一点参考

整体来讲,nodejs+express的开发模式,感觉还可以,既不像前端大牛们说的一样好,也不像另一些人说的那样一无是处,下面针对几个关键点分别说一下

1. express

早就听人说过,express是个“优秀”的web框架,我这次的使用体验,却让我没有这种感觉。大概是用惯了cakephp那种规约编程/傻瓜化的web框架的缘故,我觉得一个框架最应该做的,就是让使用者不要过多感觉到框架的存在,以最简单的方式获取请求参数/调取model/lib/以及向view层传递显示,可以让人将所有的精力都投入到业务逻辑中~~要不我还用你框架干嘛?

对express,最别扭的一点,就是它的routes配置~~居然每一个请求的url都要去做配置,让我一下想到了java/spring mvc的那个xml~~懒婆娘的裹脚布也不过如此

另一个sb的地方,是它的logger~~本来不想重写日志类的,特别是access日志,服务器能自动记录最好,找了好久,才找到如何设置express 日志的格式,可是设置好以后,发现日志时间记录的不对,格式也不好看,一查原码才发现,logger里用的是date.toUTCString~~UTC啊,尼玛我看日志的时候,还得想着和实际时间差8小时。。。

最关键的一点是,express官方的api极其“简约”,很多东西不得不去翻框架原码才能发现一些“隐藏”的功能

最后,作为一个web框架,居然没有filter,虽然app.use可以部分实现filter的功能,但用起来还是感觉很不爽

2. npm

npm真TMD乱,很多好名字都被占了,占着茅坑不拉屎

比如thrift,装上以后发现根本不能用,版本太老,仔细一看,居然2年没维护了

再比如email,居然没看见在哪儿设置邮件服务器~~太TM扯淡了

3. 模板引擎

express默认的jade就不提了,稍微复杂点的页面,就会搞得一团糟

我用的是ejs,不好不坏,只能说“可用”。我比较喜欢view层代码,后端程序和前端html/js可以一目了然,所以我使用<%作为格式符,然后用jsp编辑器打开ejs文件~~哈哈,一目了然

ejs比较不好用的一点是对于变量的判断过于严格:如果试图输出没往view层传递的变量,页面居然会直接抛500错误~~太较真了吧,你当空串处理不久行了吗?

4. nodejs

不好意思,上面说了3点,大部分都是在踩,现在该说点好的了

js&node,本身还是一款很不错的组合,虽然异步编程需要一些时间来适应,但却给高并发和快速影响带了了天生支持;另外,js语法简单自由,也可以带来很高的开发效率

对于所谓的“前后端共用代码”,我倒是觉得不太有必要~~毕竟,前后端执行环境差异巨大,写这种“公用代码”的维护成本,还不如直接copy一份给前端用

最后,给自己留一个问题:下次你还会选nodejs吗?

以前写过一个简单的前端mvc框架,jLeaf,基本思路是模仿cake和spring来做的,node出来后,曾经想顺势再写一个后端框架,名字就叫jRoot,可惜因为工作忙,也因为人懒,没能实际做出来,看到express这么难用,真想现在就把jRoot做出来,可惜现在更忙了~~~希望后面能有时间把它搞出来,也希望node能有其它更好用的web框架出来

 

日志

新东西

接手一个小项目,本来,想用go语言来做的,于是前半周便开始临阵磨枪的疯狂学习go语言
go真的是个好玩的东西,语法简单,又支持许多高级特性,package管理超方便,集动态语言的灵活、快速开发,与静态语言的高效于一身
语言编码格式神马的常见问题都好解决,eclipse就搞定了
然而,windows安装go环境却颇费了一番周折,开始是8g,后来是go run,最后也没找到合适的调试web程序的方式,只能在linux的测试服务器上做部署调试
虽然是小项目,但仍然要包含各种元素,需要一个一个搞定才能正式做项目
web框架,go有beego和webgo,都是很好用的MVC框架
mysql神马的也都不是问题
最后卡在了thrift上
thrift本身是支持go的,可以生成go的client,但是却找不到完整的例子,thrift文档里的example里没有go,按生成的client里的小例子做,根本走不通。gifhub里的两个go-thrift插件也都没走通。最关键的是,不管是百度还是google,相关的资料几乎都没有。折腾了一天,到周三下午的时候,眼看项目时间周期就要受此影响,最后不得不暂时放弃

放弃了,转向另一个早就想跃跃欲试的东西:nodejs
第一次用nodejs/express做项目也并不顺畅,选什么模板/怎么连mysql/thrift,以及怎么做权限过滤,还好,都解决了,但是最后险些卡在了图片验证码上
搜到的的资料,nodejs的验证码大部分都是基于node-canvas做的。canvas是nodejs的一个图形库,大概类似php所用的GD库。canvas和操作系统结合比较紧密,windows安装再次遇到了问题。要装npm-gyp来编译c++,进而需要安装Visual C++,还要装Python,可是最后“npm install canvas”的时候,还是TM不停的失败
还好,改了一下思路,找到了另外一个可以生成验证码的nodejs小插件:node-ccap,实现了需要的效果

已经很久没真正尝试过后端的新东西了~~~近三年以来,不再用java,也不用很久之前就开始研究的nodejs,而一直使用php,甚至几乎只使用cakephp~~~~鄙视
直到近期,发现cakephp一个很SB,却很关键,会造成整个系统无法工作的bug,才突然意识到,应该学点后端的新东西了

开始的时候没选nodejs,是因为个人其实并不看好nodejs在后端的作为。听过很多nodejs的经验介绍和分享,但几乎无一例外的,使用nodejs做项目的公司,开始时都是前端开发资源过剩,于是让前端团队去承担后端工作。
对于传统的后端开发,nodejs的缺点明显:单进程,与异步
多核时代的今天,nodejs的默认启动模式居然还不支持多核,让人很纳闷
大部分人都不习惯nodejs的异步模式,这也是其使用的一个巨大障碍
另外,基于js的后端程序,其效率可能只能与php相比,与java、go等静态编译型语言相比,先天不足

日志

千里之外

    今天,因为一件小事打电话找二姐,却听到了很不愿意听的消息:老家房子终于要被拆了!
    从两年多以前开始,因为地底下采煤的关系,老家附近几个村就就被镇政府要求拆迁,让村民们搬到几公里外的安置房里去。不过,扯淡的是,安置房那时才刚刚打了地基,ZF的人想让村民们先自己租房子住,再加上补偿款、安置房面积等种种问题,结果可想而知,村民们坚决抵制,总算顶住了两年。可惜,胳膊拗不过大腿,我们的ZF在对付老百姓时总是那么睿智,虽然安置房的竣工日期还遥遥无期,在ZF的威逼利诱和分化瓦解下,村民们还是被迫搬迁
    今天和二姐打电话时,二姐正在帮老爸搬家装车,明天,我家的房子就要被拆了。。。
    刚听到这个消息,因为知道是迟早的事情,所以心里并没有怎么样特别感觉,可是放下电话不久,想起老家的房子,和在那里过的二十几年的日子,我哭了

    我是一个很恋旧的人,自己用过一段时间的东西,只要还有地方放,就绝不会扔掉或者卖掉
    记得还是很小的时候(那应该是我记忆中最早的一块东西), 大概三岁时吧 ~~
    那时,家里的正房还是土坯房子,三间正房旁边还有一间小土房,是做厨房用的。有一天,爸妈找来村里盖房子的人,说要在原来厨房的位置盖两间砖房做配房,当然,要先拆掉那间小土房。我听说以后,估计去找爸妈说不要拆掉那间房子,结果可想而知,这种事情谁会理会三岁孩子的意见。然后,当天晚上,我便坐在小土房门口哭、怄气,直到很晚睡着了才被抱回屋里

    现在要被拆的房子的主体,是在我上小学三年级的时候建起来的,算起来,应该是1991年
    还记得当时建这房子时的很多细节:
    拆旧房子,拆掉前后墙后剩下的山墙,是一群人用绳子拉倒的,每面墙倒下时,都会“轰”的一声巨响~~~
    挖地基的时候,在东面墙的下面,曾挖出一个圆形的土质很松的坑,爸爸回忆说那里曾经是一口井
    房子是秋天盖的,天已经比较凉的,盖房的时候,爸妈睡在过堂屋里,拿一张褓(一种用高粱杆做的席子)挡在门口挡风
    房子刚盖完,粉刷墙壁前的那个晚上,老爸熬夜把所有的电线不好,这样,等粉刷的时候,就可以把电线盖在刷墙的石灰下面了,墙的表面只有开关,不会再有电线
    房子盖好后,一群人合力将一块楼板斜着搭在房顶和地面之间,后来,老爸在这条楼板上用砖头垒出了一级一级的台阶,又将水管焊上去作为栏杆
    。。。。

    房子是平顶的,没事的时候,我经常爬到房顶上玩
    夏天的时候,很多邻居都会来我家房顶乘凉,大家把席子铺在刚刚被太阳晒得暖暖的地面上,舒服极了~~~吃饱喝足,拿把蒲扇赶着蚊子,抬头看着星星,听着大叔大婶们聊着天~~~~
    秋天的时候,房顶上会放些稻草,留着来年绑稻苗用。有一年春节,我在门口放鞭,将一个点着的鞭扔到了房顶的稻草里,没过多久,便听到头顶噼里啪啦的声音,抬头一看~~妈呀,稻草被引燃了。而稻草的旁边,有为很多家供电的电线~~于是,附近的邻居都被调动起来,帮忙灭火,还好稻草不多,没有引起什么大得事故~~~我是村里出了名的“乖孩子”,这可能是我做过的唯一的“坏事”
    我家靠着村里的大马路,每天早晨天一亮就会有各种叫卖声,最早的是换馒头的,巨有特色的吆喝,“换馒头不~~”;然后卖豆腐的、换锅贴的、补鞋的、收头发辫子的、卖香油的、卖各种蔬菜的;夏天的时候还有换西瓜的、换苹果的、换桃子的~~~虽然很吵,却也很方便~~从来不用担心错过卖各种东西的
    经常听到窗子外面传来邻居们的高谈阔论,开始可能是两个人,然后是三个、四个,越聚越多,然后突然某大婶说一声“哎呦,天不早了,我得回家烧汤去”“慌慌嘛,还早那”“我也得走了,二妞子快放学了”…..然后各自散去
    我家的院子里曾经种过一棵葡萄树,葡萄藤爬满大半个院子,整个暑假,我每天都会去“巡视”N次,找遍每一条藤的每一串,不放过每一颗哪怕只是微微变红的葡萄~~O(∩_∩)O哈哈~
    院子中间有个不大的花坛,开始的时候种着月季花,每到夏天都能开出绚丽的红花;过了几年,貌似是某种病,月季死掉了,便又种上了无花果树。从此,除了葡萄,又有了无花果~~嘿嘿
    靠配房门的小花坛里,刚开始种了一棵石榴树,可是,可能是品种不好,也可能是葡萄藤挡了它的光线,这颗石榴树一直没长好,每年结不了几颗石榴,还又小又酸。后来,换成了一棵苹果树~~没长起来~~再后来,记得曾经种过一棵香椿树,也不太成功~~所以最后那个小花坛干脆不种东西了
    院子里种的最成功的一棵树是院东边中的一棵柿子树,妈妈种的,说是等我们有了孩子,可以让孩子们吃柿子。可惜柿子树还没结出柿子,妈妈就去世了。后来,柿子树长的几乎覆盖了东侧大半个院子,每年秋天都能结出上千个大柿子
    从初中开始,和村里的几个同年级的哥们关系越来越好,每天上学,大家总会到我家集合,然后一起去学校,周末,大家也会过来一起玩,下下象棋,玩玩游戏机,或者到附近的打谷场踢踢球。而我们家,就是大家的根据地,无论去玩什么,大家总会到我家来集合

    从高中开始,便开始离开了家,高一高二每周回家一天;到了高三是每月一次;到了大学四每年两次,到了现在~~一年也不见得一次~~~
    10年春节,回老家结婚,是毕业会在家里待的最久的一次,也不过十天而已

    虽然回家的时间越来越短,可是家毕竟是家,每当有什么好事情,总是想回家和爸爸妈妈大姐二姐分享;每当有了什么好玩的东西,总是想带回家去玩;每当在外面受了委屈,仍然下意识的希望能回家,回到自己的小屋里呆上一会

    然而,现在不同了,我的小屋、我的小院、我的小村~~都即将被连根拔起,被从这个地球上抹去。。。。。。而我,不仅无能为力,甚至没能再回去看上一眼

    ————谨以此文,先给即将消失的老家