msgbartop
用铅笔写日记,记录那最原始的美丽
msgbarbottom

php 语言,也就那样了

话说我还以前从来还没有这样正视过php.虽说之前也学过一点php.不过也是冰山一角而已.对php的印象也只是这是用C语言实现的网页开发语言,开源、跨平台、有很多基于它的免费著名的项目。

前段时间php发布了5.3.3版本,我的论坛(基于discuz! 7.2)一下子不能用了,面对discuz!团队对于这等突发事件缓慢的反应。我便决定把论坛迁移到其他的论坛架构上去.

其间搜索了不少关于phpwind、discuz!、phpbb 等之间的比较,最后锁定了phpbb.也就是这时,看到了一些关于discuz! 论坛架构代码冗余、代码重用性低、效率不好之类的诟病.

按说像康盛创想这样的大公司,说的出“技术从来不是瓶颈,创新是我们一直的动力”这样的口号,做出的东西不应该有这样的硬伤阿,不过想想也对,如果不是没有按照低耦合的模式来,底层改起来的确够麻烦的(从php 5.3.3 开始类里面的同名函数不作为构造函数了).

这时候我就开始觉得php太懒散了.也真是它的易用性,导致开发者想怎么写就怎么写,比如那个变体函数(魔法函数),想想就害怕.

前端时间被公司派到另外一家公司,以外援的身份参加了一个门户网站项目的开发,是一个基于discuz! 下ucenter的项目.我主要负责视频模块.在那边呆了2天,话说我的模块早已完成。闲来无事便顺便看了看他们的项目,这也是我第一次看一个完整的php项目.

话说看的很吃力,注释少的可怜是一个原因,另外一个原因就是php模块的东拉西凑.比如里面有个好像是处理用户登录后的操作的类(姑且算他是类吧,其实我更感觉是一个请求转发器).原理是根据“ac"(应该是action的缩写……)载入不同的页面,执行不同的操作.

本来这个页面应该可以写的更简洁一点,可是里面充斥了大量的if_else 块.嵌套层数估计不下于10层.如果业务要求不得不得如此的话,还则罢了.

更恶心的是对于一些外来参数处理的函数通通写了进去.更有甚者,我貌似还在里面sql语句的声明.真的是……这个类就是传说中的上帝类(God Class)?因为它已经包办了一切.

很难想象,在实现功能的同时,这些开发者是否能考虑下未来的可维护性?可读性?

殊不知,一个正常的函数/方法体不应该超过百行.评价优质代码的标准不是看自己满意否?而是别人.

可是,是谁造成了这种状况?是php.是php 没有标准、没有规范的写法.给了他们方便.我不得不说,这样的代码真的如同老太婆的裹脚布一般,又臭又长.

而我在用记事本打开后,就如看天书一般.囧rz

当然我知道,php 大家庭里面有很多像wordpress、drupal、phpmyadmin 这样的国际知名项目.他们的代码结构如何我不清楚.不过wordpress的我倒有看过一些.怎么说呢,wp里面会专门有这样一个文件夹叫classes 来存放一些基类或者工具类这样的,不过我还是不能忍受在页面里面出现sql语句.当然可能只是个别.

wp总体来讲还是体系严谨的吧,毕竟是这么多人在维护.不然的话我真得不知道wp的作者matt是如何说出“代码如诗”这样的话来.呵呵,那不是自己给了自己一个耳光么?

总而言之,php 还是没有一个明显标准(据说有本书叫thinking in php,有空看看.据说有个框架叫 Zend Framework),我是这样想的,如果一个人在接触php之前有学过其他编程语言(非脚本语言),他可能会感觉不习惯、别扭.
而如果是一个完全的新手的话,则会很快的入门.说不定能在短时间内开发出一套实现了CRUD的简单博客系统.

呵呵,就是这么个大概情况.不过近些年LAMP大行其道确是实事.php 势头还是很猛的呵呵~

国内请不要有更多的replacer

有这样一些人,他们没有写过一行代码,没有独立或者参与开发过任何一款软件,没有干过一件与软件核心代码相关的事情.
但是他们却会理所当然的把某款软件当作是自己的作品,甚至还会时不时的以作者的身份发布不合时宜的言论,最后导致的是该款软件的潜在用户流失.当然,他们是不会在乎的,可能也没有想过.

这些人是谁呢?他们是活跃在各大论坛的"高产软件开发者"(目前姑且先称呼他们为软件开发者吧),他们无偿的为一些没有做中文本地化的国外软件提供官方或非官方的中文汉化包.并免费提供给用户使用.

其间做的比较出名是烈火与他的心海e站(www.hrtsea.com).

按说这些人不图回报的工作应该是值得我们敬佩的.因为这一切都是出于自由的共享精神.应该得到应有的尊重.
而是目前的现状让我不得不深思,和深深的忧虑.

像深度论坛、完美者论坛、汉化新世纪、包括我之前说的心海e站以及等等这类的网站,犹如雨后春笋般的涌现出来。一时间国内软件从业者骤增.一派欣欣向荣的景象.

可是看看他们在干什么呢?以前是做打包win系统的,现在是做汉化或者破解工作了.

以前打包windows用的是nlite之类的软件,在系统组件上做做文章就算是一个新系统了。请问里面那个东西是你自己的东西?
计算器是么?扫雷是么?什么都没有.

现在做汉化,下载人家的程序,然后用什么resource hacker、exescope 之类的软件改几个资源文件,就敢大言不惭的把自己放到作者的位置上去了.囧rz

至于技术含量呢?真的看不出来。你们所做的就是相当于记事本里面的Ctrl + H 了,替换功能而已.你们所做的就是人家程序员在程序中声明的一个个String 变量换成了我们熟知的汉字,简而言之,一个replacer 而已,做的都是体力活.

真的不知道有什么地方让你觉得高人一等的?我很好奇.像你这样的角色在项目中只能算是一个contributer(贡献者)而已.
恐怕连进版本控制的权限都没有(哦,我忘了,开源软件的版本库是对全世界任何人开放的).

还有那个做QQ狂人版的那哥们,充其量就是一个打包族。被腾讯勒令关站之后,在论坛发了贴说以后打算开个网络班,教编程.
说实话,我真的不知道他能教点什么……成为下一个脚本工具男么?

你说说,像这种人多了,中国的软件前景在什么地方?更让人痛心的是,居然有人把他们当神拜,更加导致了个人的膨胀.

中国什么时候才能多一些像ZK-Simply Ajax and Mobile 这样的国际知名的项目?
中国什么时候才能多一点人能参与到国际知名项目核心中去(像射手播放器作者被加入了MPC-HC项目)?

所以我真的不希望在国内看到更多的replacer.因为已经够多的了.我希望看到的是越来越多的核心开发者,而不是可有可无的外围工作者.

而且,我深深的觉得国内软件汉化者的素质不高.说出来的话真的是如同恐怖主义一般.而且功利主义更要不得.做个语言文件还要用什么aspack(一种面向win32的文件压缩器,与asp 语言无关)加个壳,真的是扯淡的很.殊不知,连你用的类库都是别人编译出来的.
面对用户的质疑,还口出狂言.具体不赘述了.唉……

注:本篇文章只是作者本人表达了对中国软件前景的担忧.本人并没有看低或藐视汉化工作者的意思.
本人也极力推崇且受益于如 babel 等国际翻译志愿者组织.

现如今内存的价格不敢恭维

随着肢解了自己的笔记本,邂逅了自己的内存条-1GB 667MHz.于是便打算小小的升级一下自己的内存,再加一根1GB的.

虽说我这1GB内存用的好好的,不过有些时候玩一些游戏呀(如 仙剑4、实况10)的确还是略感缓慢.预算在100-150之间了,因为我想内存的价格也就这样了吧,还能高到哪里去……

可是我错了.我首先是去了卓越亚马逊(我经常去的购物网站),查看了内存的清单.发现1GB的笔记本内存(当然我这里指的是DDR2的)大多在160-180之间,显然和我的预算不太符合,不过咬咬牙还能接受.
不过问题又来了,我自己的内存条频率是667MHz的,可是现在只有800MHz的。我查了一下网上有人用667 + 800 搭配过,表现还可以。800的内存是降到了667去工作的.

不过我还是不是很放心.于是去金士顿(比较相信品牌)的官网查了一下.看看我这款笔记本能搭配什么样的内存条。结果与我所想一模一样.如图:
金士顿升级建议

看来我的谨慎是有道理的,内存混搭这种事情看来是不能冒险的。

于是便以“KTH-ZD8000B/1G”为关键词搜索了一下,出来的结果让我大吃一惊.
首先中文网页寥寥无几,更多的是一些英文站点,我直接忽略。终于找到了一个京东商城的页面,有得卖。大喜过望阿
点进去一看,疯了,269元,还缺货~如图:
京东报价

莫说缺货,就是有货,我也不会去买了。这是打劫么??!!虽说533/667 频率内存已经过时,不过也不能这么宰人吧
接下来又看了一个来自淘宝网的,价格也高的离谱,更加无视.

有网友说,现今内存条价格攀升的速度和房价有的一拼,看来不假.而我的内存升级计划估计得搁浅了.

今天亲自动手拆了自己的本子

昨晚,ubuntu 例行更新。网易163镜像源,129kb/s 速度中……很满意.

恩,火狐3.6.7 已经可用了.

可是没想到阿没想到,MLGB的,更新到一半,画面居然定格掉了,感觉不对。摇了摇鼠标,没反应~,ctrl + alt + d 最小化,也没反应. ctrl + alt + F1-7 均无反应. 杯具了,居然假死掉了。。。

这时候发现cpu 风扇狂转不止,用手一摸,温度也高的惊人呐,烫!!看来罪魁祸首必定是CPU散热无疑了.无奈之下,只好长按电源键强制关机了.不过,这时候我也开始有了清理电脑的想法了.

话说,我这台笔记本是07年买的,用到现在已经快3年了.表现还算可以.不过现在终于还是出了毛病.到了不得不采取行动的时候了.

关了机后,就没有再开机。而是先拆卸下了硬盘和电池.电池还可以,硬盘烫的要命。于是先睡觉休息,明天一早再来修理此事.
我之所以决定动手拆,还有个原因是该本子的2年免费保修已经过了.求人已经成为不可能,只能求己.

第二天一早便开始忙活起来,话说我还从来没有拆过笔记本,台式机倒是经常拆(也就是因为此,我逐渐从一个硬件盲成为了略通门路的人)。不过,这也成了我的底气了.

过程不能说很顺利,同时也很艰辛。过程我也不想赘述.总之是不拆不知道,拆了吓一跳。平时看很干净的电脑,里面居然有那么多的灰尘。这让有洁癖的我显然更有理由去动手了.貌似还得感谢昨晚的假死,不然还得拖到多久呢

完了之后,再装回去。这次苦的我够呛。装了拆,拆了装.不是这个忘了就是那个忘了,我晕呐~~好歹最后还是完好无损的装好了(虽然到最后还剩下了两颗螺丝,囧rz)。测试跑了一下,运行正常,情绪稳定.

今天一天都花在这件事上了,感觉还是值得的,至少我更了解我的电脑了.送给那些想动手拆自己电脑的人一句话:"胆大心细即可".这就是我的经验之谈.

今天拆卸的过程中还拍下了不少图片,最后附上:
图1

图2

图3

图4

图5

图6

图7

_完_

基于Gaelyk框架快速开发谷歌云计算应用

其实这篇文章很久就打算写了,本来的想法是计划等到我的wp4gae项目有了博客雏形的时候,顺便写出来的。

可是事与愿违,我打算用groovy实现绘制验证码遇到了技术瓶颈,项目就一下子死在那了…详见邮件列表存档 囧rz

这一死就死了近两个月……好了,言归正传,话说用gaelyk 开发谷歌云计算(简称GAE)还是蛮棒的,而且它也是难得的几个面向GAE平台的groovy框架.

我就是在groovy官网看到它的链接的,主页是:http://gaelyk.appspot.com/,可以说gaelyk是一个又轻量级又强大易用的框架.

首先,确保本地eclipse(原谅我,我用的是eclipse) 安装了Google App Engine Plugin for Eclipse,Groovy-Eclipse 插件.
根据消息,后者最新版本为 Groovy-Eclipse 2.0.2,安装地址为:
http://dist.springsource.org/release/GRECLIPSE/e3.5/
http://dist.springsource.org/release/GRECLIPSE/e3.6/ (for Helios)

顺便说一句,eclipse 最新版本3.6 在widnows下有内存溢出现象,经常导致假死,这已经是公认bug了.

在groovy 和 gae 插件安装了后,现在可以创建基于gaelyk的项目。
有两种选择:
1,只下载 gaelyk-0.4.2.jar 文件,在项目中导入.缺点是必须对项目目录结构很清楚。
2,就是下载官方提供好的项目模板,解压后,可以直接导入到eclipse中。而且里面还自带了一些GAE的jar包.

本人选择的是后者方法,里面还有一些例子,可以参考学习.

一切完成后,目录结构如图:
gaelyk-directory-layout

前期工作好了后,就可以开始开发项目了.

习惯了一般的b/s开发,忽然转变到云计算平台,一般人都不会太舒服。不过gaelyk 是遵循经典的MVC模式的,它把视图和后台的逻辑处理很明显的分开了.

视图前台显示部分交给了视图模板 *.gtpl(相当于jsp),而把处理程序通通放在了Groovlet 里(类似servlet)。这样的话,思路就变的清晰了.

和jsp一样,gaelyk提供如 request、response、appliaction、session 等隐式对象,随用随拿.

当然,gaelyk 还提供了一些特殊的内置对象,比如 params(据说是学ruby on rails),就是一个封装了请求体里面参数的键值对集合, 或者像 headers,就是请求头里面的信息,以供用户调用.
厌烦了log4j ?不妨尝试下 gaelyk的 GroovyLogger,一样很棒。

除了这些个一开始就实例化好待用的对象,官方叫它“积极变量”,gaelyk 还提供了一些“消极变量”(即第一次请求时才实例化),
有点类似于 饿汉模式 和 懒汉模式阿.
如 out、html.

当然还有一些 gae 的对象,如 datastore,用于操作数据库.厌烦了gae 自带的jdo、jpa 方式。尝试一下gaelyk的条件式查询,很是方便。最重要的一点是其中不会产生一句sql语句,呵呵,sql不好的同学们有福了 :)

在gtpl 视图模板里面,默认支持el表达式,原生态支持 小脚本、代码块以及表达式.(因为groovy也是java 囧rz)
还有更有趣的,gaelyk 导入类时支持通过 as xxx 起别名,很方便.而跳转和重定向的时候也有简洁的办法,直接 forward "url"、redirecr "url" 即可,再也不用Request.xxx.dispatch.xxxx.findforward 了.

gaelyk 还有一个亮点就是,支持地址重写.只要稍稍编辑 web.xml (交由 RoutesFilter 处理),再指定规则文件.
就可以实现伪静态了.
如 get "/topic/@title" forward:"/showtopic.groovy?title=@title" 即可.而且还可以通过 validate 进行验证,过滤掉非法参数. 让被注入成为往事. 呵呵
并且,从gaelyk 0.4.1 开始,支持缓存 cache 了.如 cache: 3.hours 即缓存3小时.

还有更让人叫绝的,gaelyk 里面根本不需要实体类,呵呵
因为Entity对象是可以直接构造的,而且groovy 里面没有对象类型的区分(灰常像php、javascript),也就给了方便.
比如我创建一个用户,包含用户名、密码.

Entity entity = new Entity("user"); 注意导包 import com.google.appengine.api.datastore.Entity

然后只需要用户从表单提交对应的值过来。填充入user实体中.
还在用request.getxxxbyxxx???忘了上面提到的 params ?

gaelyk 提供你想不到的方法访问实体,
entity['name'] = params['name']
或者
entity.password = params['password']

亦可 entity << params 全部填充.

这时候,只需调用 entity的 save() 方法,就可以将数据持久化了.
删除只需同样调用 entity 的 detele() 方法即可,若需起事务,只需把语句放入datastore.withTransaction{}的闭包中即可.

怎么样?增删就是如此的简单.

至于查询,更是简单.指定要查询的实体,扔给几个条件、标准就出来了(有点类似hibernate的Criteria查询).
创建query.
def query = new Query("user")

给出条件(相当于sql where)
query.addFilter("name", Query.FilterOperator.EQUAL, "xxx")

指定排序(相当于sql order by)
query.addSort("name", Query.SortDirection.DESCENDING)

预编译
PreparedQuery preparedQuery = datastore.prepare(query)

设定单次结果集大小,和漂移位置.实现分页
def list = preparedQuery.asList(withLimit(10).offset(20)) //查询20到30列.

这样增删查均完成了.gaelyk 真的是很省事呀.

当然,gaelyk 提供远不止这些,还有像 email 功能、memcache 功能、 BlobStore 、queue 等功能.这些我都没有用过,将来可能会更多.

不过作为一个开发者来说,这样的框架只会让我们的工作越来越方便,效率越来越高.

关于gaelyk 的更多例子,见:http://gaelyk.appspot.com/tutorial
如果对我的wp4gae源码有兴趣,请看:http://code.google.com/p/wp4gae/source/browse/

wp4gae现运行于 http://xia-zhengxin.appspot.com/,欢迎围观.
注:相当alpha的版本.