Firebug1.0beta

一直用firebug0.4,由于T41崩溃,重装系统后我把FF升级到了2.01,firebug还是0.4x,刚才偶尔访问了它的主页,发现已经升级到1.0beta,下载后发现改进很大,简直是一个可以当可视化的编辑器了,调试css非常爽了。1.0增加了很多实用的功能,比如net面板,可以查看当前页面各个元素的下载时间,每个图片、文件的请求的Http的Request和Response,哎,有了firebug,可以省去原来要装的一大堆extension。

此外,还有一个firebug lite,用于在IE,opera,safari上面模拟实现firebug的功能,正好今晚上要在safari上测试一下,挺及时的。

http://www.getfirebug.com/

UPDATE:
Firebug1.0已经正式发布

调整ICC for PHP的编译参数

S1上的PHP屡屡出现段违例,我怀疑是ICC的编译参数不当造成的,因为S6上的没有问题.作了下调整:

以前是

flags=”-O3 -cxxlib-icc -i-static -mp -unroll2 -axT”

现在使用以下参数:

flags=”-cxxlib-icc -i-static -unroll2 -xP -O3 -no-prec-div”

由于-fast在x86_64上相当于-xP -ipo -O3 -no-prec-div -static,但是-static导致PHP无法config(imap extension),也要禁用-ipo,所以只能将这几个可用的参数单独列出来。

编译时出现无法找到kerbose,我明明已经patch过了,应该可以找到阿,估计是缓存的问题:

rm ./configure
./buildconf –force

重新编译,ok了

支持ETag的PHP的SendFile

在动态生成缩略图的时候,需要用PHP把生成缩略图的文件输出,此外,很多时候把文件放在browser不能直接访问的地方,用php代理,最常见的做法是read文件,echo出去,但是这样会白白浪费带宽,此外,也无法使用squid的负载缓存。昨晚实现了一个判断ETag的方法,本来还想实现断点续传,太困就没有继续,原理也简单,只要判断一下IF-RANGE,然后fseek到指定位置,读出,echo出去就ok了,等有空了再完善,现在这个是用于缩略图的,不支持多点续传也无所谓了。
Read more

MagicWand的缩略图

以前用GD做缩略图,效率不高,而且图片处理的功能太弱,刚才安装了MagicWand,发现真是太强了,效率和功能等等可以比ps强。gd简直像个小娃娃,用新东方老罗的话就是:太方便了太方便了。为了熟悉环境,顺手写了一个做缩略图函数,摘录如下
Read more

修改discuz的IP检测方式,防止虚假ip的骚扰

最近几个论坛经常被注册机光顾,但是发现那些ip段实际上已经被用防火墙封了。
后来发现是discuz的ip检测方式:


if(getenv('HTTP_CLIENT_IP') && strcasecmp(getenv('HTTP_CLIENT_IP'), 'unknown')) {
	$onlineip = getenv('HTTP_CLIENT_IP');
} elseif(getenv('HTTP_X_FORWARDED_FOR') && strcasecmp(getenv('HTTP_X_FORWARDED_FOR'), 'unknown')) {
	$onlineip = getenv('HTTP_X_FORWARDED_FOR');
} elseif(getenv('REMOTE_ADDR') && strcasecmp(getenv('REMOTE_ADDR'), 'unknown')) {
	$onlineip = getenv('REMOTE_ADDR');
} elseif(isset($_SERVER['REMOTE_ADDR']) && $_SERVER['REMOTE_ADDR'] && strcasecmp($_SERVER['REMOTE_ADDR'], 'unknown')) {
	$onlineip = $_SERVER['REMOTE_ADDR'];
}

这种检测固然可以检测到代理或者nat后面的所谓“真实”的客户端ip,但这是对于那些正常用户,
对于流氓的注册机,除了REMOTE_ADDR,其他都是可以通过发送header来伪装,这样,就造成了在
discuz中记录的ip是虚假的!

其实,即便是使用代理服务器,如果有不良行为,直接封闭代理服务器的ip,你也无法封闭
真正的客户端ip,所以,我建议一定要记录REMOTE_ADDR,可以补充附加的ip。

UPDATE:
如果使用Squid方式来对后端程序负载的话,后端程序使用上述获取IP的方式是正确的。

优化IndexModifier失败

之前曾经写了一个FastIndexModifier,直接继承的Lucene的IndexModifier,使用RAMDirectory进行索引,然后flush的时候回写到
FS目录中,之前的索引一直很正常,但今天在对论坛的帖子进行索引中,发现磁盘写入总是失败,没有任何异常抛出,但是没有实际
的数据被写入磁盘,只有一个Segments。写了几个UnitTest,不论如何测试,总是不能成功。很奇怪以前为什么跑得很正常。

最后只能换回IndexModifier,通过调整MaxBufferDocs来增大IndexWriter的RAM的使用。
虽然如此,还是不满意Lucene的IndexModifier的实现,缺乏一些灵活性。明天自己重写一个类吧,其实按说很简单:

创建1个RAMDirectory的IndexWriter,addDocument时对其进行操作,打开一个IndexReader,deleteDocument时使用它对FSDirectory操作,
flush的时候,关闭IndexReader,此时新打开一个IndexWriter用于实际的fs,将RAMDirectory加入到indexs中,回写,关闭,ok。

挺简单的,当初太懒,想少写几行代码,就直接继承了IndexModifier,现在好,被搞晕了,呵呵。

updated:问题找到了,在回写的时候,顺序出现了小小的问题。必须先关闭ramWriter,否则RAMDirectory里面没有数据.代码如下:
Read more

中文分词技术小结[转自SegWord::BruceSolo]

中文分词技术属于自然语言处理技术范畴,对于一句话,人可以通过自己的知识来明白哪些是词,哪些不是词,但如何让计算机也能理解?其处理过程就是分词算法。

现有的分词算法可分为三大类:基于字符串匹配的分词方法、基于理解的分词方法和基于统计的分词方法。

1、基于字符串匹配的分词方法
这种方法又叫做机械分词方法,它是按照一定的策略将待分析的汉字串与一个“充分大的”机器词典中的词条进行配,若在词典中找到某个字符串,则匹配成功(识别出一个词)。按照扫描方向的不同,串匹配分词方法可以分为正向匹配和逆向匹配;按照不同长度优先匹配的情况,可以分为最大(最长)匹配和最小(最短)匹配;按照是否与词性标注过程相结合,又可以分为单纯分词方法和分词与标注相结合的一体化方法。常用的几种机械分词方法如下:
1)正向最大匹配法(由左到右的方向);
2)逆向最大匹配法(由右到左的方向);
3)最少切分(使每一句中切出的词数最小)。

还可以将上述各种方法相互组合,例如,可以将正向最大匹配方法和逆向最大匹配方法结合起来构成双向匹配法。由于汉语单字成词的特点,正向最小匹配和逆向最小匹配一般很少使用。一般说来,逆向匹配的切分精度略高于正向匹配,遇到的歧义现象也较少。统计结果表明,单纯使用正向最大匹配的错误率为1/169,单纯使用逆向最大匹配的错误率为1/245。但这种精度还远远不能满足实际的需要。实际使用的分词系统,都是把机械分词作为一种初分手段,还需通过利用各种其它的语言信息来进一步提高切分的准确率。

一种方法是改进扫描方式,称为特征扫描或标志切分,优先在待分析字符串中识别和切分出一些带有明显特征的词,以这些词作为断点,可将原字符串分为较小的串再来进机械分词,从而减少匹配的错误率。另一种方法是将分词和词类标注结合起来,利用丰富的词类信息对分词决策提供帮助,并且在标注过程中又反过来对分词结果进行检验、调整,从而极大地提高切分的准确率。

对于机械分词方法,可以建立一个一般的模型,在这方面有专业的学术论文,这里不做详细论述。
Read more

JQuery之美

Jquery是我所见过最简洁和优雅的ajax框架。相比prototype,我更喜欢jquery。
现在对dojo已经逐渐厌烦,虽然dojo的mailinglist仍然关注,不过后面的项目我不会再用了,当然dojo是非常非常优秀,
我也用它作了很多有趣的事情。但,当发现了jquery,一切都变了,哈哈。
JQuery可以让我不再到页面中增加更多onclick等的js代码,真正做到了逻辑和页面的分开。尤其是在采用xhtml/css的模版后,
页面中可以没有js代码的痕迹,页面制作和代码编写可以分开了。在SEO上也可以做的很好,让程序支持REST方式更加简单。
我做了个小测试,用户点击可以用ajax返回页面的局部,直接输入链接则返回整个html页面。ajax应用中bookmarks的问题也
可以解决的比较好。

ICC编译ImageMagic的小问题

本来也没什么,不过在编译source rpm中最后link libwmf的时候总说M64非法,无法编译为shared方式。rpm -qa一下,发现,libwmf
有2个x32和x64,但是devel是x32的。估计问题在这里,删除x32的libwmf rpm,ok。
自己写的一个sh,方便用icc build rpm包:


flags="-O3 -ipo -cxxlib-icc -i-static -mp -unroll2 -axT" \
CC=icc \
CXX=icpc \
CFLAGS="$flags" \
CXXFLAGS="$flags" \
CPPFLAGS="$flags" \
LD=xild \
AR=xiar \
LDFLAGS="-cxxlib-icc -i-static" \
CXXLDFLAGS="-cxxlib-icc -i-static" \
rpmbuild -ba "$*"

针对,intel duo-core 处理器的