江南行

不是一般的行。
请了10天婚假,凑合着前面的一个周末和后面的清明节,携媳妇一行去江南小住了十几日,甚爽。如今坐在China北京大北窑的办公室里,看着外面灰蒙蒙的天,仿佛是在做梦。
江南就是江南,怪不得乾隆喜欢去,N多的文人墨客喜欢去。
我们先到杭州然后绍兴,西塘,苏州,最后从上海回北京。以休假为主,旅游为辅,累了就回宾馆睡觉,要不就去茶馆喝茶。这些地方吃住行各有特色。

杭州:杭州吃的最好,外婆家和皇饭儿是比较有名的,好吃的特色菜非常多,价钱也可以接受。闲着没事可以在苏堤白堤走走,或者租个自行车绕着西湖转转,要不在西湖边坐坐,也可以去茶馆喝茶。我们在西湖边上的一个小亭子里面休息的时候,有一个当地的老人要给大家讲讲西湖相关的历史,有人点了小瀛洲,老人便从头讲起,思路清晰,数字清楚,我正赞叹当地民风淳朴历史知识丰富的时候,老人讲完了,说了句:“能不能给我点买矿泉水的小钱?”,嗖的医一声,亭子里瞬间连个鬼都不剩。当然了,我对当地人的赞叹也一下子化为乌有。紧挨着西湖边的茶馆也不贵,还有自助餐吃,好多本地人在里面喝茶打牌可以呆一下午。有一些茶馆就在西湖边,可以坐在外面喝喝茶看看风景,惬意的紧。杭州的出租车是我见过最好的,都是帕萨特,宝来,中华尊驰等,但是几乎都有被撞过的痕迹,可能开的时间比较长,也可能是出租车司机的风格都比较彪悍。公交车也很方便,一般都是投币两元,去各个景点的都有,可以体验一下。说到公交想起一件小事,我们从虎跑回西湖边的时候,兜里没有零钱,正在抓耳挠腮的时候,看见司机正招手让我们上去,原来他看到我背着个单反,跟我咨询一下买单反的事情,当然,我们免费坐了趟公交,呵呵,民风还是淳朴啊。我们在杭州住的酒店是在外东山弄的叫做布丁连锁的酒店,新开不久,很干净,服务也还不错,旁边就是岳庙,离西湖也很近。杭州的景点除了西湖,还有虎跑和岳庙。虎跑景色还不错,里面石雕的老虎笑的很开心,嘴都咧到了耳朵旁边。岳庙嘛,就是岳庙,进去看看关老爷,顺便欣赏一下各种风格的书法作品,无其他。杭州有许多文人留下的书法作品,匾额,楹联,石碑等等,大部分都是精品,赏心悦目,也有一些不好看,不知道是写的不好还是我不会欣赏。其实这些书法作品有很多都是古时候的文人来游玩的时候写下的类似我们今天的”到此一游“的意思,古人也挺无聊的,呵呵。

绍兴:绍兴风景名胜小吃不多,比较有名的就是臭豆腐茴香豆和乌篷船。臭豆腐首先过不了闻这关,我是不吃的。茴香豆的名气大不是因为它的味道好,所以我也没兴趣。乌篷船还有点意思,一个人坐在船尾,用两只脚配合着摇一只浆作为前进的动力,胳膊下还夹一只浆做为掌握方向的舵,实在是个技术活。必去的景点恐怕是鲁迅故居,虽然门票比较贵(80块/人),但是,凡是上过小学的恐怕没有不知道鲁迅的,既然到了绍兴,没理由不进去看看。看来,课本,是比任何广告效果都要好的广告,看完了还要背下来。故居分几个部分,旧居,纪念馆,三味书屋等等,都是一座座的老宅院,里面卖东西,帮人用名字作诗的巨多,相当让人扫兴。鲁迅故居门口一条街上就有很多臭豆腐,在一个路口有一个买臭豆腐的老大爷,我们看到都是当地人去买来吃,生意很不错,两天都去捧场,不过我还是没下定决心去尝尝那个闻起来就很臭的东东。绍兴的景点还有一个兰亭,我们都知道书法中最著名的王羲之的兰亭序吧,兰亭风景区门票40/人,无非就是亭台风景,我们坐3块的公交车过去门口看了看,又坐车回来了,没进去。绍兴有一条老街,房子都建在河的两岸,叫做仓桥直街。我们住的旅店就在那条老街上,旅店的名字叫做鉴湖恋。从一扇木门进去,走过长长的一个通道,拐个弯,掀开布帘有一个窄窄的老旧的木楼梯,吱吱扭扭的上去,只有三间房,我们住在最里面的一间,推开窗就是河,就有乌篷船过来过去。房间很简陋,就是两张床,俩床中间的空墙上钉了一个简单的柜子。墙角里立着个空调柜机,再没其他东西了。但是被子很干净,叠的也很整齐。一层是个茶馆,一张张的桌子一把把的椅子随便的摆在那儿,并没有客人。开店的有三个年轻人,2男1女。其中一个男的平时上班,其余时间他们基本都在玩网游,悠闲的很,玩的过瘾的时候就把门关起来不做生意了,或者跟来的客人说:“我也是来住店的”。我们住在那儿的时候并没有其他的客人,晚上他们都去街对面睡觉了,整个店里就剩我们俩,他们说,把门关上就好,早上要是出去,带上外面的门就行,其余自便,就当是自己的家。这样的随意,我喜欢,于是,多住了一晚,并且,第二天晚上,其中一个男的学过厨师的还做饭叫我们一起吃,那是我们在绍兴吃的最好吃的一顿饭。旅店的一层在临河的一面有一个小平台,上面放了张桌子和
两把条凳,没事的时候我们就坐在上面喝茶上网吃东西和聊天。有很多游客坐着乌篷船从旁边经过,看到我们so惬意都羡慕的半死。

西塘:西塘就是阿汤哥拍摄”碟中谍3”的地方,著名的古镇。古来的建筑堆列在河的两岸,怎么看都是水墨画,怎么拍都是风景片。我们去的时候阴天,整个西塘烟雨蒙蒙,虽然稍微有些冷,但是更添了几分诗画的意境。去西塘的时候可以提前定好住的地方,旅店几乎都是原来的老房子,都有雕花大床。可以叫店主人去车站接你进古镇,这样就不用交门票钱。主人在接你进去的时候都会和你交待,在古镇里面逛的时候千万不要不小心走到外面去,不然有人让你买门票谁也帮不了你。但是因为古镇有很多个入口,卖票的只是在早8点到晚4点之间会守在各个交通要道,这段时间之外,就可以到外面去转转。不过外面就是一个县城,也没什么好看。我们住的是一个叫做“迩易堂”的旅店,就是原来的一个大户人家,迩易堂是他们家厅的名字,厅很高很大,老家具古香古色,前后院楼上楼下共15间客房,院子后面还有一个小院,房间里都是雕花大床。房子是店里的女主人祖上留下的,所以不用交租金,因此价格也相对比较合理,一般是平时比周末便宜,周末比长假便宜。我们也由衷的感叹了一下,有个有钱的祖上该多好:)店主人除了接我们进去之外还跟我们推荐了镇里比较好吃又便宜的几个餐馆,分别叫做梦里水乡,钱塘人家和老品芳。于是我们没去过别的餐馆。在西塘住了3个晚上,在梦里水乡吃了一顿,去钱塘人家的时候赶上没位子,所以没吃成,剩下的几乎都是在老品芳。老品芳太便宜了,味道也还不错,我们把菜单上老板推荐的带五角星的菜都吃了个遍,最贵的菜只要20块,平均一顿30多块搞定。西塘不大,就那么沿河的三四条街,除了逛街,我们大部分时间都呆在一家叫做“清风草堂”的茶吧里。因为茶吧里养了只金毛。茶吧的女主人是个北京女孩,叫做葱白,店里的摆设几乎都是她自己做的,那只金毛叫做来福,是她的朋友寄养在她这里的,后来朋友去了国外,来福就一直跟在她身边了。来福是一只忧郁的狗,大部分原因是在它3岁半的生命里换了4个主人,心里受了创伤,也或许没有归属感。来福喜欢挨在客人身边享受别人的按摩,要不就趴在那儿睡觉,或者在茶吧的门口看着外面,很少见他开心的笑。从门口经过的人看到来福都很感兴趣,有的过来摸摸他,或者和他合个影,还有很多人认识他,来福俨然已经是西塘第一名犬了。和葱白聊的很来,她很随和,也很有原则。她老公是上海人,她自己不愿意在公司里上班,于是一个人跑到这里开了这个茶吧,这份洒脱和勇气让我们羡慕嫉妒恨。她请我们喝茶,在西塘的最后一个晚上我们还一起吃了烧烤,还喝了点当地的米酒。回北京之后,我把在她店里拍的照片和在西塘拍的一些照片冲洗出来准备寄给她,她说要在店里弄一个照片墙。

苏州:苏州最有名的就是园林,园林最好的就是拙政园了吧。拙政园的大名如雷贯耳多年,看了之后我却不是很喜欢,总觉得小气。我还是喜欢气势磅礴场面宏大的景观,让我震撼。园林都是精致的小景色,亭台楼榭,处处都是文人的酸气,没什么好看,或许是我不懂欣赏吧。虎丘还值得一看,景色怡人,我们去的时候又赶上花会,摆了很多郁金香等漂亮的鲜花,十分养眼。虎丘有著名的颜真卿他老人家写下的大字”虎丘剑池“,不过据说”虎丘“两个字已经不是最初的遗迹了。可惜。还有著名的中国斜塔–虎丘塔。我们在虎丘塔旁边蹭导游的时候,碰到两拨导游的讲解居然大相径庭,一个说该塔在2040年会轰然倒塌,另一个却说已经修好了,立个几百年没问题。靠,到底什么情况。苏州有条观前街,类似北京的王府井。我们的酒店就在观前街的旁边,叫做莫泰168的,定酒店的时候就看到别人说隔音不好,但是只有你真正入住知道才知道什么叫做隔音不好,分明就没有隔音嘛。。。。。。服务员没事就推个车在走廊里咣咣的走来走去,哪怕是半夜,娘的,能稍微有点服务精神吗,恐怖啊。苏州的小吃都是混沌,汤包,生煎之类的,味道比较南方,不太喜欢。

上海:上海就是上海,我们从南京路到外滩来回走了几趟,南京路上都是广告牌,外滩也就那样,比传说和想象里差很远,没什么好玩的。

玩的时候就开心的玩,工作的时候要努力的工作,这就是生活。

自惭形秽一个

上次更新还是在。。。。。说来惭愧。

寒,第一个原因是实在太懒,另外就是生活几乎平淡无奇,实在没甚好写的,让本来就为数不多的偶的reader们彻底伤透了心,呵呵。

这篇放在这里一是除草,二是作为以后要努力更新的一个证据。

就这。

祝Q哥生日快乐!

祝身体健康,生活快乐。

变形金刚花絮

喜爱这部电影的朋友要仔细看看,推荐。


变形金刚

昨天去电影院看了《变形金刚》,确实不错,值得去电影院为美国人的票房神话做点贡献。
引用一段别人在豆瓣上的评论:

这年头,科幻片跟毛片一般的多。 我却肯定,中国所谓的超人迷,星战迷,魔戒迷,全是虚的。只有变形金刚迷是真正存在,而且有千万之巨。 70末80初的这一批人,当年小p孩的时候,是把脑仁子拿出来,用变形金刚当板刷彻彻底底的洗了一通的。
   所以,其实,我们都是汽车人。
   所以,我可以举出这本电影的一百个问题,但是,我就是和共产党员一样宁死不屈,一个字都不说!
  
   我们有过很多的卡通兄弟,比如绿色的龟,机器的猫。但只有擎天柱,才具有大哥般的感染力和号召力。
   因此,当擎天柱大哥从天而降,变身成那红色的牛卡;当他露出红色的胸甲和蓝色的头盔,手臂上的金属烟囱炫光夺目;我就彻底投降,直接沉浸在伟大的巨大的他妈的童年幻想下,不能自拔。
  
   要知道,即使是一百年以后,我老到没牙,和棉被一样的被孩子们卷到阳台去翻晒。但是,当红色牛卡冲进我家菜地,我还是一定会翻身而起,拿起我的木头手枪,目光炯炯而坚定的问道:“大哥!今天去哪里拯救地球!”

汽车人开始变形和擎天柱从天而降,真的很让人激动。

SQL Relay

你是不是也在寻找LAMP结构下的PHP连接池?如果没找到更好的,建议你试试SQL Relay.
之前我曾将写过一篇关于SQL Relay的blog,介绍了一下怎么把SQL Realy用在PEAR DB中。事实证明,这样使用并不能有效的缓解MySQL中产生大量连接的问题,因为PHP从SQL Relay得到的还是一个真实的数据库连接,也就是说PHP连接一次,SQL Relay就要提供一个,至于这个连接什么时候还给SQL Relay,还是PHP说了算,SQL Relay没有管理权,所以运行了一段时间之后SQL Relay就会一下子增加N个连接,然后崩溃。。。。。。希望你没碰到这种状况。
最近实验了一下用另外一种方式使用SQL Relay,首先建立一个SQL Relay服务器,直接连接数据库,然后PHP端只建立到SQL Relay服务器的TCP连接,并不参与对数据库连接的使用和管理,基本的原理就是PHP连接到SQL Relay服务器,传递要运行的SQL语句,SQL Relay负责把语句通过一个空闲的连接送到MySQL服务器去执行得到结果后立即断开,然后返回给PHP,这样大量的PHP请求传递给SQL Relay,后者负责去维护一个MySQL连接池,完全拥有对数据库连接的管理权。经过实验,效果比较理想。
安装和配置运行这里就不赘述了,有问题可以mail我,说一下怎么实现PHP到SQL Relay的连接。
安装成功之后,在php.ini里设置sqlrelay.so的extension信息,然后可以按照下面的方法写一个class,你可以按照getRow方法的样子去实现其他的查询方法。

class SQLR_DB
{
private $conn;
private $cur;
private function __contruct(){}//构造函数
private function _conn($server,$port,$user,$password,$retrytime,$tries)//建立连接的私有方法(server:SQL Relay的服务器
,port:端口,user:用户名,password:密码,retrytime:隔多长时间重新连接,tries:重新连接的次数)
{
$this -> conn = sqlrcon_alloc($server,$port,"",$user,$password,$retrytime,$tries);
$this -> cur = sqlrcur_alloc($this->conn);
}

private function retrieve($sql) //传递SQL语句到SQL Relay服务器,获得返回结果的方法
{
if( !$sql) return false;
$this -> _conn("server" , "port" , "user" , "password" , "retrytime", "tries"); if(!sqlrcur_sendQuery($this->cur,$sql))
{
echo sqlrcur_errorMessage($this->cur);
sqlrcur_free($this->cur); sqlrcon_free($this->conn);
return null; }
//sqlrcon_endSession($con); for($i=0; $i < sqlrcur_rowCount($this->cur); $i++)
{ $res[] = sqlrcur_getRowAssoc($this->cur,$i);
} sqlrcur_free($this->cur);
sqlrcon_free($this->conn); return $res; }


然后在数据层通过这个class来取得数据。例如:

function getOneRecord($sql)
{
if(!$sql) return false;
$sdb = new SQLR_DB();
return $sdb -> getRow($sql);
}
public function getRow($sql)//取一行的共有方法
{
if(!$sql) return false;
$res = $this -> retrieve($sql);
if("null" == $res) return null;
return $res[0];
}
}

现在的问题是,用这种方法来对付所有的读操作是可以的(用来管理所有的对Slave服务器的读操作),但是用来管理写操作的时候却遇到了问题,在向数据库中写入一条记录,并返回插入ID的时候,以前可以使用mysql_insert_id方法,可是用SQL Relay来管理数据库连接之后,每次查询都有可能使用不同的连接,因此执行完一条insert语句,再去执行mysql_insert_id的时候,使用的很可能已经不是之前的连接了,因此也就不能返回正确的结果。不知道有哪位大侠知道解决方法的,请不吝赐教,在下感激不尽:)

Solr

Solr是基于Lucene Java搜索库的企业级全文搜索引擎,目前是apache的一个项目。它的特点包括支持XML/HTTP和JSON API,支持高亮显示,支持缓存机制以及支持分布式等等。
下载和安装自己去看文档好了。我们主要研究一下它的配置和使用以及如何实现对中文分词的支持。
假设你现在已经安装好了一个带有Jetty的Solr服务器,那么它的目录结构应该是这样的:

$mySolr
|– etc
| |– LICENSE.javax.servlet.txt
| |– LICENSE.javax.xml.html
| |– LICENSE.jsse.txt
| |– admin.xml
| |– jetty-jmx.xml
| |– jetty.xml
| `– webdefault.xml
|– ext
| |– ant.jar
| |– commons-el.jar
| |– commons-logging.jar
| |– jasper-compiler.jar
| |– jasper-runtime.jar
| |– mx4j-remote.jar
| |– mx4j-tools.jar
| `– mx4j.jar
|– lib
| |– javax.servlet.jar
| |– jsp
| |– org.mortbay.jetty.jar
| `– org.mortbay.jmx.jar
|– solr
| |– README.txt
| `– conf
| |– admin-extra.html
| |– protwords.txt
| |– schema.xml
| |– scripts.conf
| |– solrconfig.xml
| |– stopwords.txt
| |– synonyms.txt
| `– xslt
| `– example.xsl
|– start.jar
`– webapps
`– mySolr
|– META-INF
| |– LICENSE.txt
| |– MANIFEST.MF
| `– NOTICE.txt
|– WEB-INF
| |– lib
| | |– apache-solr-1.2-dev-incubating.jar
| | |– commons-fileupload-1.1.1.jar
| | |– commons-io-1.2.jar
| | |– lucene-core-nightly.jar
| | |– lucene-highlighter-nightly.jar
| | |– lucene-snowball-nightly.jar
| | `– xpp3-1.1.3.4.O.jar
| `– web.xml
`– index.html

Solr是用xml文件进行配置的,其中最主要的配置文件在solr/conf/下面。

首先是schema.xml,它是用来设置你要加入索引的数据的数据类型的,首先你要定义一个FieldType,包括name,class,positionIncrementGap等等一些参数,name就是这个FieldType的名称,class指向org.apache.solr.analysis包里面对应的class名称,用来定义这个类型的行为。在FieldType定义的时候最重要的就是定义这个类型的数据在建立索引和进行查询的时候要使用的分析器analyzer,包括分词和过滤。你会看到在例子中text这个FieldType在定义的时候,在index的analyzer中使用solr.WhitespaceTokenizerFactory这个分词包,就是空格分词,然后使用solr.StopFilterFactory,solr.WordDelimiterFilterFactory,solr.LowerCaseFilterFactory,solr.EnglishPorterFilterFactory,solr.RemoveDuplicatesTokenFilterFactory这几个过滤器。在向索引库中添加text类型的索引的时候,Solr会首先用空格进行分词,然后把分词结果依次使用指定的过滤器进行过滤,最后剩下的结果才会加入到索引库中以备查询。定义完FieldType以后就是定义具体的字段(类似数据库中的字段),就是filed,filed定义包括name,type(就是之前定义过的各种FieldType),indexed(是否被索引),stored(是否被储存),multiValued(是否有多个值)等等。除此之外,你还可以定义动态字段,所谓动态字段就是不用指定具体的名称,只要定义字段名称的规则,例如定义一个dynamicField,name为*_i,定义它的type为text,那么在使用这个字段的时候,任何以_i结尾的字段都被认为是符合这个定义的,例如name_i,gender_i,school_i等。

还有solrconfig.xml,这个文件用来定义Solr的一些基本特性,最重要的一个就是可以通过更改其中的dataDir属性来指定索引文件的存放位置。

这些都定义好之后,你可以重新启动你的服务器,然后向其中添加数据。

添加数据是通过向服务器的update服务POSTxml格式的数据来实现的,xml结构是这样的add中间有很多个doc,每个doc中有很多个field。添加到索引库中的每条记录都必须指定唯一的数字id来唯一标识这条索引。建立好xml文件(例如a.xml)之后,在exampledocs目录下执行:java -jar post.jar a.xml来添加索引数据。根据实验,每个xml文件最好不要超过30M,不然会添加失败。

添加成功之后就可以通过web服务来进行查询了,查询方法是把“字段名称:要查询的值”这样的字符串传递给服务器,服务器返回xml格式的结果。例如要在一个名为user_name的字段上查询值为”test”的数据,那么传递给服务器的就是”user_name:test”.多个查询之间用”&&”连接。

返回的结果包括查询所用时间,找到的符合条件的记录数,以及根据指定的start和limit确定的部分记录(这个可以用来实现分页)。可以根据自己的需要对结果xml进行解析。查询速度还不错(当然这个和运行环境和网络环境等有关)。在同一个查询进行第二次的时候,Solr会从缓存中取得数据,只要几毫秒。

下面说说索引的删除和更新,更新很容易,只要把新的数据按照对应的唯一id重新添加一次就可以了,删除有几种情况,一是删除指定id的一条记录,那么就建立一个简单的xml片段:《delete》id:21《/delete》,如果删除某一类字段,例如删除所有user_name是john的记录,那么可以建立这样的xml片段:《delete》《query》user_name:john《/query》《/delete》。因此,如果要删除所有的索引的话,你可以把其中的user_name:john替换成*.*。然后把这个xml用添加索引同样的办法POST到服务器就可以了。当然如果想删除所有的索引,你也可以先停止服务,然后删除index目录,然后再重新启动服务:)

好了,现在可以自由的管理索引,也可以方便的进行查询了,接下来说说怎么实现对中文分词的支持。

根据前面说的,分词是在添加索引和进行查询的时候实现的,就是在定义FieldType的时候进行对应分词方法的定义。Solr默认是不支持中文分词的,但是lucene中提供了用来实现中文分词的包,按照Solr的方法包装成ChineseFilterFactory.java和ChineseTokenizerFactory.java两个类,然后在定义FieldType的时候指定使用这两个类来进行分词和过滤就可以了(这里只是思路,具体方法自己琢磨,嘿嘿)。

好了,现在可以用它来代替以前的weblucene了。hoho。

中国足球

如果打平就能出线,那必然是被淘汰。
解说必然是乌鸦嘴。

我想去西藏

什么都不用想。多好。
可是有时间的时候我却没有钱。
神阿,剥夺我的一切吧,只要让我去西藏。

ubuntu下播放mp3

用ubuntu下自带的Rhythmbox播放器播放mp3文件的时候报错,说找不到GStreamer解码器,你要这么做:

sudo apt-get install gstreamer0.10-pitfdll gstreamer0.10-ffmpeg gstreamer0.10-plugins-bad gstreamer0.10-plugins-bad-multiverse gstreamer0.10-plugins-ugly gstreamer0.10-plugins-ugly-multiverse gxine libxine-main1 libxine-extracodecs ogle ogle-gui

那么就可以了。

如果还不行,去找爱因斯坦吧。我就知道这么多。