2008年10月22日

个人独立域名博客:金色坐标开通,此处博客停止更新(其实早就停了,呵呵)。

欢迎大家光顾金色坐标,讨论共同感兴趣的网络应用和搜索引擎技术,虽然目前内容有限,但可以共同成长和进步,谢谢。

2006年11月18日

最近一段时间,基本上没有更新这里,当然不能躲过懒惰的指责,因为时间是海绵里的水嘛,呵呵。但是主要却因为最近确实是忙。因为是两年半的学制,明年3月份毕业,所以现在毕设,论文都到了最后阶段,找工作更是弄的人精疲力尽,虚火上升。一大堆的招聘会去是不去,一大堆的公司哪个是好,一大堆的职位哪个适合,选择的过程真是步步维艰,再加上毕业生的人山人海,真是越发让人觉得无所适从。同学们也都变得行色匆匆,满腹心事的模样。不过这也许就是个蜕变的过程吧,经过这一步的磨难,大家就都能腾飞了吧。

至于自己工作的计划,首先因为习惯了北方的生活,毕业之后不是很想去南方,前几天深圳机场有个很好的机会也放弃了。至于具体职位,倒是希望趁着年轻找一个有学习进步空间,有发展机会的地方,多付出努力和汗水,不祈求安逸和当前。专业嘛,计算机软件,网络应用等都可以,在学校学习就是这样,虽然要求是业有所精,其实还是没有精到很高程度,计算机编程、网络相关方面涉及到自己研究方向的地方都有学习,所以第一份工作其实也起着人生职业发展方向的作用,很可能决定一生所为啊,在学校其实没有完全定型。

好了,扯的远了,希望自己能找到满意的工作。也祝愿和我一样在找工作的朋友都找到自己满意的工作,前途似锦。

2006年09月26日

昨天晚上煮泡面吃,发现只剩下一袋了,感觉可能不太够,想到楼下就有一个卖挂面的杂货店,就决定去买点挂面。到了店里,有个大娘正在买米,先来后到我就看着大娘先买米。看着看着我就有点晕菜,因为见到了没想到过也不可能想到过的生活画面。

 

大娘要买的是袋装米,50斤一袋。大娘说来一袋,店主说好,就进去里间屋里拎了一袋米出来,说现从里面拿的,更好。大娘说:“拆开!”。店主说拆开干嘛,拆开了不好拿了就。大娘说这你不用管,我骑三轮车来的,店主就把袋子拆开了。大娘把手使劲伸进米里,伸到下面一抬手,把底层的米抓了一把带到了米的表面,说:“你们的米怎么上下不一样哪?”。店主说,怎么可能嘛,刚拿出来的,怎么可能上下不一样哪?大娘说:“那你自己过来看看!”我也就在旁边,看的很清楚,虽然我不大懂米的好坏,但是表层的米和底层的米大小和颜色的确是不一样的。店主并没有过来看,说:“行行行,你觉得不好那就给你换一袋!”,然后就去里间又拎了一袋米出来。

大娘依然是拆开,检查了以后没再说米上下不一样,问店主:“一袋多少斤?”。我感觉我来之前大娘肯定是已经问过一袋米的价钱了。店主说,50斤,80块。大娘指着电子称说,你给我约约。店主没说话。大娘说,我看看有没有50斤。店主长出了口气,说:“17一斤,50斤是85,所以袋装的80块分量都不是太足。”。大娘说,那差多少?店主说,差两斤。大娘说,那你给我称称看看,我看看,差点儿也没事。店主没说话,也没动。大娘看店主没动,说:“是差两斤吗?”店主依然没说话。大娘又催促了一次,店主终于说,那你出85吧,我给你添够50斤。大娘还是问:“是差两斤吗?”,看到店主仍然不予回答,大娘只好说,行啊,那你给我添够50斤吧。

 

接下来的事情就简单了,添米交钱装车走人。事情是完了,但是就是这么一件在有的人看来不值一提的小事,我承认它却让我胡思乱想了半天,并且感觉怪怪,因为它跟我自己买米时的情形相比完全像是两码事嘛。并且想到以刚才那位大娘的老街坊,既然能来这个店里买米,说不定这个店还是周围最好的店呢。另外以穷酸知识分子的习惯,我还联想到了不少的乱七八糟,甚至想到了汉初太尉周勃入狱命悬之时被狱吏所救之后感叹狱吏之能的恍然。哦,对了,还想到了曾经的新东方教师罗永浩,老罗同志。

 

备注:

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se

 

2006年09月01日

最近一直在看百家讲坛这个节目,看来是已经喜欢上了。看了三国看红楼,看了红楼看金庸,虽然对其中讲解的部分观点不是很赞同,但是其引经据典,寻找证据的研究问题方法很对我的胃口。今天在网上闲逛,看到这篇文章《悟空和观音的爱情》,虽然有点扯皮,但是自我感觉其文章风格很是类似讲坛啊,所以贴过来,给有兴趣的朋友解解闷儿。

 

初看《西游记》,那年我正好十岁。那时候的我,对父母是即依赖又害怕,就像孙悟空对观音即依赖又害怕一样,就认为观音是孙悟空他妈,当然并不是非得她生的不可,观音制造的也成——想那观音神通广大,找块石头,吹口仙气,那石头就变成孙悟空了。这些小孩子的想法,拿出来以博一笑。后来长大了,又觉得孙悟空如此英雄,又怎么会没有美女来爱他,即使是好色的妖精女王之类的,只都只会找上唐僧那个脓包,这也不可理解。《大话西游》硬扯了一个叫紫霞的陌生人进来,因不忠于原著,未免让人丈二和尚摸不着头脑。翻遍原书,才发现观音对孙悟空很有情谊,虽不甚明显,但以她菩萨正果的身份,对孙悟空如此偏爱,却怎么也说不过去了。反观孙悟空,从无法无天到循规蹈矩,虽有诸多因素,但观音的“领路人”的作用,可谓大矣,以“英雄难过美人关推之”,倒也合情合理。

《西游记》中,完全是把观音当作美女来描写的。什么“乌云巧迭盘龙髻,绣带轻飘彩凤翔”,“眉似小月,眼似双星”,“玉面天生喜,朱唇一点红”。(第八回《我佛造经传极乐,观音奉旨上长安》)另按民间习俗,观音负有“送子”之责,有点类似于西方的“爱神”,清初大美人陈圆圆就有“四面观音”的称谓。而西天诸佛中,道性高,佛性强的人不少,为何却偏要观音这个美女来引渡真经,作者吴承恩看来有那么一点意淫成份,只不过格于礼教,下笔就打了折扣,然笔之所书,情之所寄,难免就留下点蛛丝马迹,让我揣测不已。

话说观音与孙悟空初会,是在孙悟空大闹蟠桃会之后,正得意忘形与天庭对抗之时。观音初不以为意,遗座下木吒出战,败回,在众神面前很失面子。女人嘛,若是对男人有了同情之心,怜悯之意,绝不可能产生什么爱情,须是佩服方可。观音有此一败,正是爱的起点。观音所保举的二郎神,却是一位风流种子,同样也是一位个性青年。这二郎神是玉帝妹子思凡下嫁人间一杨姓男子爱情结晶,斧劈桃山救母的那位仁兄,(原著所述,与〈宝莲灯〉有出入)对皇帝老儿也是不买帐的。观音说他:“听调不听宣”,意思就是:“看在好歹是亲戚的份上,我可以帮玉帝老儿的忙,可要我在他手下当差,门都没有。”想到天宫诸神,连玉帝老儿自已,均一筹莫展,不记得有这么一个神通广大的亲戚,偏要由方外人士观音提出,岂非咄咄怪事?由此观之,观音对悟空由败生情,进而想到天宫的一段风流逸事,再进而想到风流逸事的结果二郎神,倒也符合一般人的思路。

却说这孙悟空与二郎神苦斗,不分胜负。这事关系天庭安危,直接当事人玉帝,王母等都还沉得住去,反倒是观音却稳不住了。无他,心系悟空尔。于是,坐立不安之下,就借了个由头,要一睹美猴王的风采了。

果不其然,那观音道:“贫僧所举二郎神如何?果有神通,已把大圣围困,只是尚未擒拿……”。列位看官,此话明夸二郎,实赞悟空。为何?当时事:众天丁布罗网围住四角,李天王与那吒,擎照妖镜立在空中,直接做战人员有二郎,梅山六兄弟和一只狗,如此以众凌寡,也只是打个平手,就算二郎有神通,又能比孙悟空如何?观音口中也称悟空也由“猴精”变为“大圣”,而二郎号称“小圣”,岂不是就把二郎比下去了?这时又有人要问:“既然观音如此看得起悟空,为何却要抛扬柳净瓶去打悟空呢。盖观音与悟空初会,只是略有心意,尚未明朗。那观音突然间心生情愫,违反佛规佛纪,脑中恍惚,往往自欺以求心安,还要硬着心肠做出点事情出来让大家看看,此所谓野蛮女友的心态。观音想抛杨柳净瓶之时,未尝不在心里念叨“这死猴子该死”之类的狠话。只是那太上老君,不甚识趣,硬要抢功,让观音姐姐空费了一番心思。

这考验男女爱情,其事莫过于生死。待孙悟空被擒,生死系于一线,后又逃出丹炉,及至如来至,压孙悟空于五形山下,其间连观音的影子也见不到。观音到底是何心理,虽不能直接得之,但从以后观音对孙悟空的态度来了个一百八十度的大转弯,就可知其自责心理过重。等有机会救出孙悟空的时候,那是肯定不能放过的。于是主动请缨担任取经团领导一职,好开后门门孙悟空得正果也。好在这趟差事无甚油水,倒没有人跟她抢。如来所谓:“山大的福缘,海深的善庆”,只能骗骗那些即将毕业的大学生去边疆锻炼,哪能入这些佛门老油条的法眼。

观音收沙悟净,猪八戒,小白龙,都是巧遇,唯独对孙悟空,却是特地留的编制空额。五百年后,两人再相会,这一段写得精彩万分。首先木吒问及,山下压的是谁,观音说是“齐天大圣”,并没有把他当妖精看,比对沙,猪,白三人客气多了。观音随后赋诗一首,可见观音对悟空的关爱。诗曰:

堪叹妖猴不奉公

当年狂妄逞英雄

欺心搅乱蟠桃会

大胆行私兜率宫

十万军中无敌手

九重天上有威风

自遭我佛如来困

何日舒展再显功

待观音见了孙悟空,劈头一句就是:“姓孙的,你记得我么?”大妙!看似很不礼貌,其幽冤之情,溢于言表。大凡男女相思,常由此及彼,以已推人,问:“你认得我么?”,言下之意无外乎是“我可记得你,姓孙的”。这五百年来念念不忘一个人,其心昭然若揭。大圣高叫道:“我怎么不认得你,你好的是那南海普陀落伽山救苦救难大慈大悲南无观世音菩萨。承看顾,承看顾。我在此度日如年,更无一个相知的来看我一眼,你从哪里来也?”这几句话真是字字泣血。孙悟空虽与从天宫诸神有点交情,但自犯事以来,人人惟恐扯上同谋造反的嫌疑,纷纷与妖猴划清界限。虽说人情冷暖,世态炎凉原本也不足道哉,但要落实到自已身上,也就不那么好过了。“相知”一词,更是经典。相知的都不来看他,而来看他的,那又绝对是在相知以上。观音马上就不打自招道:“我奉法旨,上东土寻取经人去,从此经过,特留残步看你。”好一个“特留残步”,要说此时菩萨不偏心,那可就睁眼说瞎话了。

随后两人商量取经事宜,孙悟空满口答应,菩萨居然连“喜”了两次,可算是破了大例。出家人讲究四大皆空,“喜,怒,哀,乐”,喜是排在第一位的。观音收沙,猪,龙三人,不曾见她一个喜,可收了孙悟空,这定力可就把持不住了,到底是何原因,还是一目了然吗?

至于取名一节,巧合得未免过分,都以“悟”字排名,显然是将就孙悟空(也许是作者吴承恩想将就)。观音头一句就是“姓孙的”,还有岂不知道这猴头是叫孙悟空的?是不是看木吒在旁,恐有流言,于是履行一下录用手续,以掩木吒之口耳?只不过前言已漏,后语补救,木吒又不是傻子,当然看得出来。等后来两人有机会,悟空和观音两人朝夕相处四天之久之后,孙悟空就再也不去找观音了,是不是也怕瓜田李下,人言可畏呢?

从此以后,悟空和观音,就借了取经的由头,频频约会,偷偷的谈起恋爱来了。

首先,观音给悟空带了一顶金箍。

这倒也不难理解。男女之爱,一方行为不简,另一方严加管束,让其重归正途,此爱之深,绝非小丫头片子般卿卿我我可比——这也甚是符合封建道德传统,如《烈女传》中的乐羊子妻,《红楼梦》中的薜宝钗是也。那观音神通广大,地位尊荣,决不是“嫁鸡随鸡,嫁狗随狗,嫁了个大扫帚也得找在肩膀上走”的一等丫头花袭人可比。

 

随后,又送了两件礼物,一件是一领锦布直辍,一件是三根救命毫毛。

这里就要说一说观音的个性了。观音生性吝啬,贪得无厌,如来传给她的三个金箍,本来是拿给唐僧驯服徒弟用的,观音就雁中拔毛,给唐僧找了两上脓包待弟,另外两个就自已笑纳了,为自已招了两个不花钱的奴隶。她送礼的目的,不外乎是向孙悟空表示:“你看我对你这么好,你以后要听我的话才行。”——此谈恋爱的不二法门也。再说了,孙悟空不想去取经,去扯住观音,这男女授受不亲,大违常规,如何扯得?可观音却一点也不生气,依旧是循循善诱,苦口婆心,这关系岂非寻常?

以后的事情就是顺水推舟,渐入佳境了。

这孙悟空为何讨观音喜欢,有本事是一桩,有个性是一桩。盖有本事,有个性是一脉要承的。要是孙悟空对观音唯唯称是,如小厮仆役一般,那可就没趣得很。男女相爱,平等为先,孙悟空虽然时常向观音磕头,但是精神上可跟她是平等的,再说大男人给心爱的女人下跪也是很平常的事。那观音也懂平等的重要性,从来就不像唐僧一般,对孙悟空呼来喝去的。这猴子还有一样好处,那就是幽默。各位看官,不要小看了这幽默,十个女人,有九个是喜欢男人幽默的,而这幽默无他,唯嘴熟尔,这可是孙悟空的拿手好戏。在第一次单独约会,去收黑熊怪讨袈裟的时候,孙悟空施展嘴巴功夫,把观音逗得笑了又笑,一路欢歌笑语,其乐融融,哪里像是赶着去厮杀的。

等五人会齐,观世音又请了黎山老母,文殊普贤,导演了一出诱之以利,惑之以色的好戏,明摆着是试四人取经的真心,而实际上只试孙悟空一人。这是为何,等在下一一道来。那唐僧是如来的亲传,取经团的法定代表人,要是拉他下水,岂不是弄巧成拙?盖观音知道唐僧的道性,知道他不肯,才放心做戏的。八戒,沙僧,武艺低微,有他不多,无他不少,况八戒没有经受住考验,还不是一样没有把他开除公职,就像组织部考察干部一样。有个屁用。要说试,只能试孙悟空一人,不是试他有无禅心,而是试他有无花心。男人虽说油嘴滑舌讨女人喜欢,可是也容易留下轻浮好色的印象,观音自然要防他一手。在旧社会,男人三妻四妾是很普遍的现象,所谓的专一男人是说不起什么话的。清朝人张船山在苏州搞了一个小情人,还让她与她的夫人相会在可中亭中,会谈良久,他夫人却被蒙在鼓里。这个姓张的,很得意他的手段,就赋诗曰:“天孙冷被牵牛笑,一解银河露小星。”意思是说,织女还在银河那头苦等,牛郎却有了小情人了。后来“小星”就是成了小妾的代名词,这还牵涉到有关国旗的一段典故。我国国旗是五星红旗,方案上说什么“大星代表什么,小星代表什么”之类的话,就有人提出意见(好像是柳亚子),说“小星”指的是小妾,这怎么行了?于是就改成了“大五星,小五星”以示庄重。不过实情是,欲不做小妾,诚不可得也。

孙悟空自然经受住了考验,而且还颇符合封建道德。那黎山老母娇声问道:“是什么人,擅入我寡妇之门。”这寡妇的门,是不能乱进的。《说岳全传》里说岳飞七岁时出门打柴,义词正言的吩咐寡居的母亲紧闭大门,引来一片叫好声,由此可见观音一伙的封建道德水准。孙悟空马上知错就改,喏喏连声,守礼谨严如处子也,当然甚合观音心意。所以在万寿山五庄观孙悟空推倒人参果树,惹下大祸,到处求方,最后才找到观音,观音就有些恼他,说:“你怎么不早来见我,却在岛上寻找?”嫌孙悟空没把她当自已人,反倒去求外人,岂不是以疏间亲了。

这份情谊,孙悟空当然看在眼里,记在心里。那孙悟空生性高傲,如何容得下唐僧这个脓包在一旁指手划脚,三番五次想不干了,还不是看在观音的面子才勉为其难的。这是有事实依据的。孙悟空三打白骨精被逐出取经团,猪八戒去请他回来,先动师徒之情,被孙悟空一口回绝,但猪八戒一提起观音,孙悟空就马上回心转意了。(吴承恩写的三分,但从行文来看,只怕是十分都不止。)至于途中孙悟空下海洗澡一节,更是显出个十足。有谁见过两个大男人相会,专门去洗澡的。倒是男女相会之前,都要好好的拾缀一番,此去不是为观音,还是为谁?

这男女之情,若是有外来干扰,只会更加坚固,由唐僧引起的这么一场贬徒风波,使观音和悟空的联系小小的中断了一下,于是乎,就弥显珍贵。在孙悟空去请观音收伏红孩儿之际,两人打情骂俏,占用了作者大量的笔墨,全然不管唐僧正在受苦,看来观音是想让唐僧多吃点苦头的。其中有几句话值得注意:

“即他的三昧火,神通广大,怎么去请龙王,不来请我?”

——同医人参果树的话语如出一辙。如果说人参果树只有观音才能医的话,这还说得过去,但三昧火有什么了不起的,太上老君炼丹用的是三昧火,孙悟空在天宫也受过三昧火刑,能放三昧火的多着呢,能放即能来,又何必非请你观音不可。还不是怪悟空不去请他,以疏间亲了。

“悟能不曾来呀。”

——什么时候菩萨也学小姑娘般的“呀”起来了?

“那泼怪敢变我的模样!”(菩萨大怒道)

——还记得收黑熊怪观音之语否?“菩萨妖精,总是一念。若论本来,皆属无有。”这可是你观音自已说的。就准你菩萨变妖精,就不准我妖精变菩萨,这是哪门子佛法?想必是看心上人被烧了,该有此一怒。善哉善哉,出家人四在皆空,观音为何老是在孙悟空面前犯戒呢?

“你这猴头,只会说嘴,瓶儿你也拿不动,瓶儿你也拿不动,怎么去降妖伏怪。”

——先大圣,再悟空,而后猴头,越发的不庄重了。还记得两界山做诗否,怎么变成“只会说嘴”了。

“不瞒菩萨说,平时拿得动,今日拿不动了……”(悟空语)

——吴承恩看来把孙悟空替观音拿过净瓶的事给忘了,现在又补起。这瓶儿可是宝贝啊,可见观音对孙悟空的信任。

“悟空,我这瓶里的甘露琼浆,比那龙王的私雨不同,能灭妖怪的三昧火。待要你拿去了,你又拿不动;待要善财龙女与你去,你却又不是好心,专一只会骗人。你见我这龙女貌美,净瓶又是个宝贝,你假若骗了去,却那有功夫才寻你。(观音语)

——孙悟空干的坏事,一是闹,二是偷,那来的骗和色?恐怕只有观音才认为,孙悟空会骗。骗啥,骗女人的芳心也。龙女貌美,又

关悟空屁事,难道她也怕龙女爱上孙悟空,两人私奔?菩萨吃醋了?龙女是如何得知孙悟空的,又不见她跟随观音出来公干过,看来在普陀山,孙悟空是聊天的话题之一啊,多半还是观音自已提的。又大显根本没有必要的神通,把孙悟空呼来喝去,不费半点功夫,莫非在警告某人,不要跟我抢凯子?

****不敢在菩萨面前施展。若驾筋斗云,掀露身体,对菩萨不敬。

——悟空你怕露体,人家菩萨可不怕啊,不信,观音就脱给你看。

紧接着,在收通天河灵感大王的时候,观音就迫不及待的脱了一回,原文如下:

噫!这个美猴王,性急能鹊薄。诸天留不住,要往里边驿。

拽步入深森,睁眼偷觑着。远观救苦尊,盘坐衬残箸。

懒散怕梳妆,容颜多绰约。散挽一窝丝,赤了一双脚。

不挂素蓝袍,贴身小袄缚。漫腰束锦裙,赤了一双脚。

批肩绣带无,精光两赤臂。玉手执钢刀,正把竹皮削。

到了真假美猴王一回,就更了不得了。唐僧又故技重施,贬孙悟空出门,孙悟空就直接了当去找观音了。观音也怪,全然不顾唐僧已经到了最危险的时候,将孙悟空留在身边达四天四夜之久。这四天到底两人的关系有何进展,吴承恩没有写,但在此后整整四十回的书中,观音只在取经大功告成时露脸一次,与在此之前颇颇露脸相比,简直就是不合常理,因为她是取经团的分管领导。到底是怎么回事,有两个可能,一是观音有意,悟空无情,不过这种可能性不大;二是两人过于亲密,而普陀山上人多嘴杂,黑熊怪,善财童子与孙悟空本是仇人,善财龙女又貌美多情,木吒是世家子弟,看不起孙悟空这等平民英雄,这都是不利的局面。于是两人约定,待大功告成,再继前情。最后一回,取经五人皆加入佛门帮派,排定座位,孙悟空与观音挨在一起,是不是吴承恩在打哑谜呢?况孙悟空新近,地位反倒在观音之上,是不是吴承恩又在维护男尊女卑的传统呢?呜呼,吴之心思,可谓慎矣,而统观整个《西游》与吴承恩生平,此书是为民间知识分子鸣不平,然一心所托的,仍是封建道统,人格分裂,行文之际,难免在抗争与道统之间徘徊,故文多纰漏,结构松散,明清小说,大都如此,犹以夏敬渠〈野叟曝言〉为最。唯〈三国〉〈红楼〉(前八十回)〈金瓶〉得以例外。所不同的是,三国是一腔浩然道统,金瓶为一腔市民孤愤,红楼为一腔女儿疾情也.

欢迎访问本人独立域名博客金色坐标http://www.kingxy.com

 

2006年08月04日

现在实现基本中文分词功能的代码和软件模块很多,性能也还可以,但是怎样将其应用到NUTCH中的方法介绍相对较少,下面我就实现NUTCH中文分词的NUTCH代码修改方法与步骤,抛砖引玉的介绍一下。

 

代码修改的切入点是通过对NUTCH处理中文的切分器Tokenizer的修改或者替换(这里介绍的是替换),使中文分词由单字切分变为词语切分。对于相关的NUTCH基本知识,我就不赘述了。因为NUTCH的检索功能基于Lucene,所以你用来替换的切分器必须满足LuceneTokenizer特征,最主要的是保证输入与输出相符,分词后输出的必须是Token流。幸运的是,现存的分词程序或软件模块基本上都满足此需要,即使有所偏差,一般通过对其输入输出的修改就可以满足需要。我前面提供给大家的那个分词程序就可以经过简单修改应用于NUTCH中。

 

设我们实现中文分词功能模块的主类名为MYTokenizerpackageorg.apache.nutch.analysis.myt. MYTokenizer,将模块假如项目后,NUTCH代码修改如下:

 

(需要修改或新增的行后有注释,否则其它行只是为了定位,不修改)

一、修改org\apache\nutch\analysis下的NutchAnalysis.jj文件(此文件由JACC生成)

文件第33行附近:

 import org.apache.nutch.searcher.Query.Clause;

 

 import org.apache.lucene.analysis.StopFilter;

+import org.apache. nutch.analysis. myt. MYTokenizer; //新增此行,加入你的切分器

 

 import java.io.*;

 import java.util.*;

 

文件第8 1行附近:

 PARSER_END(NutchAnalysis)

 

 TOKEN_MGR_DECLS : {

/** use MYTokenizer to process cjk character */  //新增此行注释

 private MYTokenizer myTokenizer = null;   //新增此行

/** a global cjk token */    //新增此行注释

private org.apache.lucene.analysis.Token cjkToken = null;        //新增此行,输出流

 

/** start offset of cjk sequence */     //新增此行注释

private int cjkStartOffset = 0;    //新增此行

 

   /** Constructs a token manager for the provided Reader. */

   public NutchAnalysisTokenManager(Reader reader) {

 

文件第106行附近:

}

 

   // chinese, japanese and korean characters

| <SIGRAM: <CJK> >    //删除此行

| <SIGRAM: (<CJK>)+ >   //新增此行(#行)

 

//以下所有行均为新增,紧接上行代码(#行)书写

 {

 /**

 * use an instance of myTokenizer, myTokenizer, hold the maximum

 * matched cjk chars, and cjkToken for the current token;

 * reset matchedToken.image use cjkToken.termText();

 * reset matchedToken.beginColumn use cjkToken.startOffset();

 * reset matchedToken.endColumn use cjkToken.endOffset();

 * backup the last char when the next cjkToken is valid.

 */

 if(myTokenizer == null) {

 myTokenizer = new MYTokenizer (new StringReader(image.toString()));

 cjkStartOffset = matchedToken.beginColumn;

 try {

 cjkToken = myTokenizer.next();

 } catch(IOException ioe) {

 cjkToken = null;

 }

 }

 

 if(cjkToken != null && !cjkToken.termText().equals("")) {

//sometime the myTokenizer returns an empty string, is it a bug?

matchedToken.image = cjkToken.termText();

matchedToken.beginColumn = cjkStartOffset + cjkToken.startOffset();

matchedToken.endColumn = cjkStartOffset + cjkToken.endOffset();

try {

cjkToken = myTokenizer.next();

} catch(IOException ioe) {

cjkToken = null;

}

if(cjkToken != null && !cjkToken.termText().equals("")) {

input_stream.backup(1);

}

}

 

if(cjkToken == null || cjkToken.termText().equals("")) {

myTokenizer = null;

cjkStartOffset = 0;

 }

}

 

二、修改org\apache\nutch\searcher下的Summarizer.java文件(此处修改为提高搜索性能)

文件第189行附近:

将原代码段

if (highlight.contains(t.termText())) {

excerpt.addToken(t.termText());

            excerpt.add(new Fragment(text.substring(offset, t.startOffset())));

            excerpt.add(new Highlight(text.substring(t.startOffset(),t.endOffset())));

            offset = t.endOffset();

            endToken = Math.min(j+SUM_CONTEXT, tokens.length);

          }

修改为:

if (highlight.contains(t.termText())) {

if(offset * 2 == (t.startOffset() + t.endOffset() )) { // cjk bi-gram

                  excerpt.addToken(t.termText().substring(offset – t.startOffset()));

                  excerpt.add(new Fragment(text.substring(t.startOffset() + 1,offset)));

                  excerpt.add(new Highlight(text.substring(t.startOffset() + 1 ,t.endOffset())));

              }
              else {
                   excerpt.addToken(t.termText());

                   excerpt.add(new Fragment(text.substring(offset, t.startOffset())));

                   excerpt.add(new Highlight(text.substring(t.startOffset() ,t.endOffset())));

              }

              offset = t.endOffset();

              endToken = Math.min(j+SUM_CONTEXT, tokens.length);

}    

 

为了提高运行效率,你的分词模块在运行中最好可以将词表读入内存。至于代码修改的原理,说来话长,容后再叙。

 

备注

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se

欢迎访问本人独立域名博客金色坐标http://www.kingxy.com

 

2006年07月24日

前一段时间一直在忙着参加SEWM06会议准备(http://www.sewm2006.edu.cn/)BLOG都有点荒废了,真是过意不去。不过参加会议的收获还是蛮多的,这个会议偏向学术的性质,主要讨论的是信息检索技术和相关模型的研究与探索,对搜索市场的发展关注不多,但是也有涉及。会议的亮点是北大李晓明教授的报告,他给出了一个信息检索技术与社会应用研究相结合的新思路,并且展示了一些已经做出的成果。当然包括GOOLE工程师在内的其它人的报告也相当精彩,特别是对于那些关注于搜索技术实现与性能的朋友就更有意义。报告的PPT文档现在已经开放下载(http://www.sewm2006.edu.cn/data.htm),欢迎感兴趣的朋友参考。

 

另外还要一件让人兴奋的事。因为多日没有关注我的BLOG,今天(2006-7-24)特意用GOOGLEBAIDU搜索了一下52SE,想不到在中文网页中都是排在第一位的,别的什么都是次要的,事情本身真是让人开心。为了这个以后也得继续努力,对这里好好经营啊。

 

备注

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se

2006年07月06日

利用Java进行略显底层应用开发的时候,其IO和多线程部分是两个比较大的难点。这篇文章对IO系统的概括条理很是清晰,有助于让你跳出Java像洋葱一样层层包括的IO迷宫。

1. stream代表的是任何有能力产出数据的数据源,或是任何有能力接收数据的接收源。在JavaIO中,所有的stream(包括InputOut stream)都包括两种类型:

1.1 以字节为导向的stream
以字节为导向的stream,表示以字节为单位从stream中读取或往stream中写入信息。以字节为导向的stream包括下面几种类型:
1. input
 stream
1) ByteArrayInputStream
:把内存中的一个缓冲区作为InputStream使用
2) StringBufferInputStream
:把一个String对象作为InputStream
3) FileInputStream
:把一个文件作为InputStream,实现对文件的读取操作

4) PipedInputStream
:实现了pipe的概念,主要在线程中使用
5) SequenceInputStream
:把多个InputStream合并为一个InputStream

2. Out stream
1) ByteArrayOutputStream
:把信息存入内存中的一个缓冲区中
2) FileOutputStream
:把信息存入文件中
3) PipedOutputStream
:实现了pipe的概念,主要在线程中使用
4) SequenceOutputStream
:把多个OutStream合并为一个OutStream

1.2 Unicode字符为导向的stream
Unicode字符为导向的stream,表示以Unicode字符为单位从stream中读取或往stream中写入信息。以Unicode字符为导向的stream包括下面几种类型:
1. Input
 Stream
1) CharArrayReader
:与ByteArrayInputStream对应
2) StringReader
:与StringBufferInputStream对应
3) FileReader
:与FileInputStream对应
4) PipedReader
:与PipedInputStream对应

2. Out Stream
1) CharArrayWrite
:与ByteArrayOutputStream对应
2) StringWrite
:无与之对应的以字节为导向的stream
3) FileWrite
:与FileOutputStream对应

4) PipedWrite
:与PipedOutputStream对应
以字符为导向的stream基本上对有与之相对应的以字节为导向的stream。两个对应类实现的功能相同,字是在操作时的导向不同。如CharArrayReader:和ByteArrayInputStream的作用都是把内存中的一个缓冲区作为InputStream使用,所不同的是前者每次从内存中读取一个字节的信息,而后者每次从内存中读取一个字符。

1.3 两种不现导向的stream之间的转换
InputStreamReader
OutputStreamReader:把一个以字节为导向的stream转换成一个以字符为导向的stream

2. stream添加属性
2.1
“为stream添加属性”的作用
运用上面介绍的Java中操作IOAPI,我们就可完成我们想完成的任何操作了。但通过FilterInputStreamFilterOutStream的子类,我们可以为stream添加属性。下面以一个例子来说明这种功能的作用。
如果我们要往一个文件中写入数据,我们可以这样操作:
FileOutStream fs = new FileOutStream(“test.txt”);
然后就可以通过产生的fs对象调用write()函数来往test.txt文件中写入数据了。但是,如果我们想实现“先把要写入文件的数据先缓存到内存中,再把缓存中的数据写入文件中”的功能时,上面的API就没有一个能满足我们的需求了。但是通过FilterInputStreamFilterOutStream的子类,为FileOutStream添加我们所需要的功能。

2.2 FilterInputStream的各种类型
2.2.1
用于封装以字节为导向的InputStream
1) DataInputStream
:从stream中读取基本类型(intchar等)数据。
2) BufferedInputStream
:使用缓冲区
3) LineNumberInputStream
:会记录input stream内的行数,然后可以调用getLineNumber()setLineNumber(int)
4) PushbackInputStream
:很少用到,一般用于编译器开发

2.2.2 用于封装以字符为导向的InputStream
1)
没有与DataInputStream对应的类。除非在要使用readLine()时改用BufferedReader,否则使用DataInputStream
2) BufferedReader
:与BufferedInputStream对应

3) LineNumberReader
:与LineNumberInputStream对应
4) PushBackReader
:与PushbackInputStream对应

2.3 FilterOutStream的各种类型
2.2.3
用于封装以字节为导向的OutputStream
1) DataIOutStream
:往stream中输出基本类型(intchar等)数据。
2) BufferedOutStream
:使用缓冲区
3) PrintStream
:产生格式化输出

2.2.4 用于封装以字符为导向的OutputStream
1) BufferedWrite
:与对应
2) PrintWrite
:与对应

3. RandomAccessFile
1)
可通过RandomAccessFile对象完成对文件的读写操作
2)
在产生一个对象时,可指明要打开的文件的性质:r,只读;w,只写;rw可读写
3)
可以直接跳到文件中指定的位置

4. I/O应用的一个例子

程序代码

import java.io.*;
public class TestIO{
public static void main(String[] args)
throws IOException{
//1.
以行为单位从一个文件读取数据

BufferedReader in =
new BufferedReader(
new FileReader("F:\\nepalon\\TestIO.java"));
String s, s2 = new String();
while((s = in.readLine()) != null)
s2 += s + "\n";
in.close();

//1b. 接收键盘的输入
BufferedReader stdin =
new BufferedReader(
new InputStreamReader(System.in));
System.out.println("Enter a line:");
System.out.println(stdin.readLine());

//2. 从一个String对象中读取数据
StringReader in2 = new StringReader(s2);
int c;
while((c = in2.read()) != -1)
System.out.println((char)c);
in2.close();

//3. 从内存取出格式化输入
try{
DataInputStream in3 =
new DataInputStream(
new ByteArrayInputStream(s2.getBytes()));
while(true)
System.out.println((char)in3.readByte());
}
catch(EOFException e){
System.out.println("End of stream");
}

//4. 输出到文件
try{
BufferedReader in4 =
new BufferedReader(
new StringReader(s2));
PrintWriter out1 =
new PrintWriter(
new BufferedWriter(
new FileWriter("F:\\nepalon\\ TestIO.out")));
int lineCount = 1;
while((s = in4.readLine()) != null)
out1.println(lineCount++ + "
" + s);
out1.close();
in4.close();
}
catch(EOFException ex){
System.out.println("End of stream");
}

//5. 数据的存储和恢复
try{
DataOutputStream out2 =
new DataOutputStream(
new BufferedOutputStream(
new FileOutputStream("F:\\nepalon\\ Data.txt")));
out2.writeDouble(3.1415926);
out2.writeChars("\nThas was pi:writeChars\n");
out2.writeBytes("Thas was pi:writeByte\n");
out2.close();
DataInputStream in5 =
new DataInputStream(
new BufferedInputStream(
new FileInputStream("F:\\nepalon\\ Data.txt")));
BufferedReader in5br =
new BufferedReader(
new InputStreamReader(in5));
System.out.println(in5.readDouble());
System.out.println(in5br.readLine());
System.out.println(in5br.readLine());
}
catch(EOFException e){
System.out.println("End of stream");
}

//6. 通过RandomAccessFile操作文件
RandomAccessFile rf =
new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
for(int i=0; i<10; i++)
rf.writeDouble(i*1.414);
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + "
" + rf.readDouble());
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "rw");
rf.seek(5*8);
rf.writeDouble(47.0001);
rf.close();

rf = new RandomAccessFile("F:\\nepalon\\ rtest.dat", "r");
for(int i=0; i<10; i++)
System.out.println("Value " + i + "
" + rf.readDouble());
rf.close();
}
}

关于代码的解释(以区为单位):
1
区中,当读取文件时,先把文件内容读到缓存中,当调用in.readLine()时,再从缓存中以字符的方式读取数据(以下简称“缓存字节读取方式”)。
1b
区中,由于想以缓存字节读取方式从标准IO(键盘)中读取数据,所以要先把标准IOSystem.in)转换成字符导向的stream,再进行BufferedReader封装。
2
区中,要以字符的形式从一个String对象中读取数据,所以要产生一个StringReader类型的stream
4
区中,对String对象s2读取数据时,先把对象中的数据存入缓存中,再从缓冲中进行读取;对TestIO.out文件进行操作时,先把格式化后的信息输出到缓存中,再把缓存中的信息输出到文件中。
5
区中,对Data.txt文件进行输出时,是先把基本类型的数据输出屋缓存中,再把缓存中的数据输出到文件中;对文件进行读取操作时,先把文件中的数据读取到缓存中,再从缓存中以基本类型的形式进行读取。注意in5.readDouble()这一行。因为写入第一个writeDouble(),所以为了正确显示。也要以基本类型的形式进行读取。
6
区是通过RandomAccessFile类对文件进行操作。

欢迎访问本人独立域名博客金色坐标http://www.kingxy.com

 

 

备注:本文章主要内容转自网站http://www.junesky.org/blog

2006年06月19日

实践1:对象做参数的危险

函数参数传递过程中,如果传给函数的参数是一个对象,那么传递给函数的其实是这个对象的ReferenceReference copy,但是二个Reference其实指向的是同一个内存中存在的对象。如果在函数中对此参数对象的值进行了修改,那么在这个函数体外再调用这个对象的时候,这个对象的值是被修改过了的。

但是传给函数的参数如果是一个基础类型变量,例如intfloat等,那么传给函数的是这个变量的一个copy,两者不是一个变量,在函数中对这个参数进行的任何修改,在函数体外再调用这个变量时,这个变量的值还是原来的,像根本没有被函数当参数使用过一样。

如果你不想让被当作参数传递的对象被修改的话,你可以先将对象clone一下,传过去对象的clone体,或者声明此对象为immutable

 

实践2:对象声明为Final的危险

如果利用final声明一个基础类型的变量,那么这个变量的值将不允许被修改,也就是成为一个常量,对其修改会编译错误。

但是对一个对象声明为final,例如private static final class1 ex = new class1(2),那么这个对象里的值还是运行被修改的,并不会编译错误。因为这样声明之后,不可改变的是对象的Reference,也就是说如果你让ex指向另外的对象的时候才会报错,而对象则是可以修改的。

如果希望对象不被修改,需要声明为immutable

 

实践9= =equals的区别

需要认清= = equals的区别,主要问题还是在于基础类型primitive变量和对象Reference之间的纠葛。基础类型变量使用= =比较的就是变量的值,并且整形和浮点型也会自动转换,但是对于对象使用= =比较的则是两个Reference指向的是否为同一个对象。

如果想要比较两个对象的值是否相等,那么就需要使用equals函数,并且系统默认的equals函数不好用,基本上需要自定义。因为不自定义的话使用的就是最顶层的OBJECT类的equals函数,比较的其实还是Reference

 

实践10:使用equals的风险

在实现equals的时候需要很小心,涉及到一些问题。例如在你的equals里如果使用了别的对象,包括基础类型包装对象的equals,那么你要确保使用的对象的equals确实可用。例如Stringequals就好用,而StringBufferequals就不存在或者说不好用。

个人感觉比较好的方法就是自己定义一个别的函数比方说compareto什么的来替代equals,而不要放过可能会不好用的equals

 

备注:

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se

 

2006年06月15日

昨天接到朋友电话,说他有个略显麻烦的问题。新上马的管理系统项目中很多地方需要计算分配给员工任务的预期完成时间,麻烦在于不确定的地方太多。首先任务到达的时间不确定,可能是任何一天的任何时候,另外分配给员工完成此工作的预期操作时间不确定,预期操作时间中还不能包括工作外时间和周末休息时间,更重要的是,每个员工的开始工作时间和下班时间也是不一样的。因为老板要求朋友解决这个问题的时间又很紧,他有点头晕,问我可不可以帮帮忙。正好本人对数据结构很感兴趣,昨天晚上趁着球赛的间歇写了个计算模型。

 

模型如下:

任务预期完成时间计算模型

AuthorJason   Date2006-6-15

 

要求:将任务初始到达时间推迟指定的小时数得到任务预期完成时间,其中工作外时间和周末不可算作推迟小时数,并且每人工作的开始与结束时间不同。

 

模型输入(Input):任务到达时间(NewWorkTime),任务推迟小时数(DelayHour),此员工开始工作时间,即上班时间(OnDuty),此员工结束工作时间,即下班时间(OffDuty)。其中NewWorkTime里面包括日期和时分秒,OnDutyOffDuty只有时分秒。

 

模型输出(Output):任务预期完成时间(ComWorkTime

 

模型设计实现,主要分为3步:

第一步:

功能:

计算得出工作开始时间(StartWorkTime)。因为工作到达时,此员工可能尚未开始上班,也可能已经下班,那么工作开始时间应该从任务到达之后,员工处于工作状态的那一刻开始算起。

实现:

判断NewWorkTime中时分秒如果小于OnDuty,那么StartWorkTime等于NewWorkTime中日期当天的OnDuty;如果NewWorkTime中时分秒如果大于OffDuty,那么StartWorkTime等于NewWorkTime中日期下一天的OnDuty

如果二者都不成立,表示NewWorkTime属于员工工作时间,StartWorkTime等于NewWorkTime

 

第二步:

功能:

    计算得出ComWorkTime1,此时间是推迟DelayHour之后只考虑了非工作时间,没有考虑周末休息情况的伪结果。

实现:

参数时间1 StartWorkTime DelayHour

IF(参数时间1 > StartWorkTime中日期 OffDuty

参数时间2 参数时间1 休息时间(即24小时减去工作时间)

IF(参数时间2 > StartWorkTime中日期的下一天 OffDuty

参数时间3 参数时间2 休息时间(即24小时减去工作时间)

IF(参数时间3 > StartWorkTime中日期的下一天的下一天 OffDuty

参数时间4 参数时间3 休息时间(即24小时减去工作时间)

直至得到参数时间N处于工作时间内,那么ComWorkTime1 参数时间N

 

第三步:

功能:

    计算得出ComWorkTime,此时间是将ComWorkTime1中的周末时间排除掉,在排除的过程中可以同时使得最终结果ComWorkTime不可能刚好处于周末。

实现:

判断ComWorkTime1中日期与StartWorkTime中日期之间(包括ComWorkTime1中日期与StartWorkTime中日期)是否存在周六或者周日,如果存在,存在几个那么需要将ComWorkTime1加上几个24小时,假设存在       X个周六或者周日,那么即需要将ComWorkTime1 X乘以24,得到一个新的ComWorkTime1-new1

如果不存在,那么得到最终结果:ComWorkTime ComWorkTime1;输出结果,模型中止。Return Output

 

判断ComWorkTime1-new1中日期与StartWorkTime中日期之间存在的周六与周日个数(包括ComWorkTime1-new1中日期与StartWorkTime中日期),假设存在       Y个周六或者周日,进行判断:

IFY X)那么:

得到最终结果:ComWorkTime ComWorkTime1-new1;输出结果,模型中止。Return Output

IFY > X)那么将ComWorkTime1-new1加上(YX)乘以24个小时,得到一个新的ComWorkTime1-new2

 

继续判断ComWorkTime1-new2中日期与StartWorkTime中日期之间存在的周六与周日个数(包括ComWorkTime1-new2中日期与StartWorkTime中日期),假设存在       Z个周六或者周日,进行判断:

IFZ Y)那么:

得到最终结果:ComWorkTime ComWorkTime1-new2;输出结果,模型中止。Return Output

IFZ > Y)那么将ComWorkTime1-new2加上(ZY)乘以24个小时,得到一个新的ComWorkTime1-new3

 

继续判断;

 

依此进行下去,明显可以确定这不是无限循环,可以得到最终结果。一般情况下,DelayHour不可能太大,重复到第二次即可得到结果,即由ComWorkTime1-new2就可以得出结果。

<>

 

需要加以说明的是,此模型主要考虑了朋友问题的一些实际特点,一是预期操作时间即推迟指定的小时数一般较小,所以有些地方特别是第二步就没有必要经过更复杂的比较来用乘法简化多次的加法操作,有点得不偿失;另外一点就是朋友可能是要写存储过程的,对时间类型的操作不是太方便,很多地方不方便写的太绚来减少复杂度什么的。但是如果没有这些考虑,在做其它的应用的时候,这个模型很多地方还是需要改动的。

 

由于时间关系,我也没有实现程序来对模型进行什么正规地检验,如果存在什么问题或者还有什么更好的解决方法,希望朋友们不吝赐教。

 

备注:

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se

 

2006年06月14日

难道这就是传说中的认祖归宗?

 

先把事情的起因说说清楚,要不然难免让人认为我是无聊至极。今天在网上搜寻一些人物传记资料写报告,因为众所周知的原因,Google突然又上不去了,于是只好打开了百度,输入搜索词的时候一不小心,紫光拼音的记忆功能把自己的姓氏“樊”输了进去又回车了,搜出来的结果即樊姓的介绍,感觉有点意思,于是大致看了看。

 

其中有一句话引起了我的注意:“明初,樊姓作为洪洞大槐树迁民姓氏之一,被分迁于河北、天津、北京、河南、山东、江西等地。”其实主要是“大槐树”三个字引起了我的注意。为什么呢,因为小时候没出来上学以前,有段时间经常跟爷爷呆在一块,可能是因为实在是没啥聊的了,爷爷曾经跟我说过我们祖上的事。爷爷说祖上一直传下来说老家来自一棵什么什么的大槐树,但到底是什么意思爷爷说也不知道。并且年代久远,也没有人愿意去为这件事花费心思了。当时年少好奇,还曾经问过爸爸,爸爸说的确是有这么回事,并且还听我老爷(爸爸的爷爷)也这么说过呢,但是没有人有心思去考究它。对于弄清这个谜我曾经很是痴迷了一段,后来时间长了,我也就不了了之了。

 

那么这里的大槐树迁民,和爷爷说的大槐树是不是有所关联呢?我马上又搜寻了一些资料,其中的一篇资料http://www.tydao.com/sxsen/linfen/huaishu.htm较大程度地证实了我的想法,两个大槐树很可能是一回事哦。资料里写道:

 

元朝末年,元政府连年对外用兵,对内实行民族压迫,加之黄淮流域水灾不断,饥荒频仍,终于激起连绵十余年的红巾军起义。元政府予以残暴的镇压,争域夺地的殊死之战时有发生,两淮、山东、河北、河南百姓十亡七八。元末战乱的创伤未及医治,明初“靖难之役”又接踵而至。冀、鲁、豫、皖诸地深受其害,几成无人之地。在元末战乱时,蒙古地主武装察罕贴木儿父子统治的“表里山河”——山西,却是另外一种景象,相对显得安定,风调雨顺,连年丰收,较之于相邻诸省,山西经济繁荣,人丁兴旺。再者,外省也有大量难民流入山西,致使山西成了人口稠密的地区。明朝灭亡元朝后为了巩固新政权和发展经济,从洪武初年至永乐十五年,五十余年间组织了八次大规模的移民活动。

 

晋南是山西人口稠密之处,而洪洞又是当时晋南最大,人口最多的县。据记载,明朝时在洪洞城北二华里的贾村西侧有一座广济寺,寺院宏大,殿宇巍峨,僧众很多,香客不绝。寺旁有一棵“树身数围,荫遮数亩’”的汉槐,车马大道从树荫下通过。汾河滩上的老鹞在树上构窝筑巢,星罗棋布,甚为壮观。明朝政府在广济寺设局驻员集中办理移民,大槐树下就成了移民集聚之地。

 

晚秋时节,槐叶凋落,老鸦窝显得十分醒目。移民们临行之时,凝眸高大的古槐,栖息在树杈间的老鹞不断地发出声声哀鸣,令别离故土的移民潸然泪下,频频回首,不忍离去,最后只能看见大槐树上的老鹤窝。为此,大槐树和老鹤窝就成为移民惜别家乡的标志。“问我祖先何处来,山西洪洞大槐树。祖先故里叫什么,大槐树下老鸹窝。”这首民谣数百年来在我国许多地区广为流传。

 

也就说,我们祖上很可能就是在这次大迁移中从山西迁移出来的。并且据我爷爷说,我们的祖上传下来说的确是来自西北那一带。看来,曾经令小时候的我痴迷于解开的“大槐树”说法之谜,很可能我已经是找到了答案啦。那么换句话说,难道这就是传说中的认祖归宗?呵呵,哈哈

 

还有一些小插曲呢,资料里写道:“传说当年移民时,官兵用刀在每人小趾甲上切一刀为记。至今凡大槐树移民后裔的小趾甲都是复形(两瓣)。谁是古槐迁来人,脱履小趾验甲形。你若有兴趣,不妨自我查看。”呵呵,还真是,据我所知的我家人,小趾甲还真都是两瓣的,包括我自己。当然还有一些有趣的说法我就不一一说了。

 

总之吧,看了以后感觉很是奇妙,可能也是因为这是我小时候的一个心事吧,现在突然被勾起来,感觉有点兴奋。不管以上所谓的认祖归宗是否客观准确,没有必要深究,只增笑尔,呵呵。

 

备注:

本文章为原创,如要转载请务必注明本文章出处http://blog.donews.com/52se