November 11th, 2007 by 张磊
仅限Linux。估计Windows用户不会有这个痛苦,自然也不会有这样探索的过程 前些日子升级Ubuntu到7.10。之前在输入法上脚踩两只船,没想到升级之后fcitx不能用了,换来SCIM也不能完全接管以前fcitx手下的程序。比如FF、ZendStudio(以下称作ZS)都还不能输中文。 后来在网上找到一篇文章,照着做,真的就解决了FF输中文的问题。而在用ZS做Camel的时候,就没用中文,注释和程序是全部的英文。直到今天非敲中文不行了,只好从文本编辑器里打好粘贴过去。于是就琢磨着这输入中文的问题怎么才能解决呢,想到了当年治好FF的办法,照搬照抄: 先用一个文本编辑器把ZS的启动文件(就是打开ZS时直接运行的那个文件)打开——一大堆,肯定很头大。没错我也看不懂,不过你要做的就是把下面这段程序粘贴到里面——当然得小心点,别贴到啥循环或是分支内部的。如果你没把握,就贴在最后。 XMODIFIERS=@im=SCIM GTK_IM_MODULE=scim-bridge export XMODIFIERS GTK_IM_MODULE 然后保存,之后再运行,就会发现ZS中已经可以用SCIM输入中文了。将来升级了ZS,照做一次就好。如果是一直就在用SCIM的话,应该没这个问题。
August 30th, 2007 by 张磊
今天在做Camel的时候,对ZF中的Cache的一些初始化选项觉得有些疑惑,于是找来了官方的文档看了看。不看不知道,一看之下才发觉自己之前对ZendCache的使用简直太浅薄了。现在的ZendCache可以对页面某一部分做Cache,也可以对整个页面进行Cache,Cache的保存方式也多种多样,真的很强大。之前我自己对Cache的思考,和他们所做的工作比起来,可以说是微不足道了。 所以牛扑还需要更大的改动。今天我一度动摇,想用Python来重写牛扑,但很快就打消了这个念头。牛扑的架构需要进行更改,我打算大量地使用ZF框架中的组件。这个假期还有些遗憾就是,没有把足够的时间花在看Lucene上。智勇说牛扑啥都搜不出来,这是因为没用全文检索阿。记得那时Tiny还说要送我一个他们在这方面的产品,可那我也得会用阿。 不过,现在做Web开发会觉得顺手很多,因为网络上流行的框架有一大堆,总能找到适合你的一款。若不,说明你已经高超到该自己去写框架了。牛扑几乎所有的方面都需要改进,用户界面、全文检索、缓存算法、数据库结构……回头看自己之前的项目总会觉得千疮百孔。不过,一个一个来吧,我打算把这个拿来做我的毕业设计。 晚上还花了十来分钟,给机器人在互联网的某个角落,安了一个小小的开关。以后机器人掉线,就不需要爬上服务器去改了。只要对那个开关说一个暗语,机器人就会被重新打开。想着你说机器人不见了时可爱的表情,我忍不住就把这个秘密泄漏给了你。
June 7th, 2007 by 张磊
最近在研究PHP中的缓存,在牛扑上一个简单的图书信息页面(比如这个)都要进行至少9次数据库查询,而其中大部分东西都是在相当长一段时间不会变的,所以把这些内容缓存出来是很必要的。其实现在的牛扑一部分内容是有缓存的,当然效果很好,但缓存没有大规模使用,会限制整站的速度。于是我开始找一种通用的缓存机制,果然被我找到了,那就是ZF中的Zend_Cache。 其实缓存的概念在很多地方都有,CPU中有一级缓存二级缓存,缓存的存在大大提高了信息交换的速度(当然,和命中率有关),其实是一种空间换时间的办法。空间换时间的思路在编程中也有,特别是在做ACM时,对解法要求的效率很高,这些时候“空间换时间”的思想往往会对解题有很大帮助。 Zend_Cache是包含在ZendFramework中的,我查看了一下官方文档,发现介绍的比较简单。后来找到了Babel的程序,才看到了实例。V2EXCore.php中有这样一段: if ($o = $this->cs->get(‘babel_top_wealth’) && $cached) { echo $o; } else { ob_start(); /*output sth.*/ $o = ob_get_contents(); ob_end_clean(); $this->cs->save($o, ‘babel_top_wealth’); echo $o; } 其中$this->cs是一个初始化好的缓存类。在这里,思路是这样,如果缓存”babel_top_wealth”命中,就输出,如果没有命中,就通过ob_start()/ob_get_contents()获得输出的内容,然后保存到缓存。坦白说,这个比我以前自己写的缓存类好使多了。 现在唯一的问题是,缓存很多的话查找也是一个问题。牛扑上的50W本书假如有10W本进入缓存,估计需要的空间在1G左右。这个时候,到底是数据库的速度快呢,还是利用程序的逻辑从磁盘上读的速度快呢?