2008年10月28日星期二

27个在学校学到不到的能力

原文作者:zen habits
原文链接:27 Skills Your Child Needs to Know That She's Not Getting In Sch
翻译:Shirley.xulin

总的来说,我们都知道学校不能教给我们的孩子一些基本的读书,写作,算术和科学技能,这些技能是我们在即将出现的新一代高科技劳动力(至少,这是一个普遍的看法,我们不需要在这里争论)中具有竞争力的保证。

但是生活中我们需要远比那些基础学科更多的知识,你的孩子根本没有学会生活中需要的那些至关重要的知识,除非有一位独特的老师,他愿意去打破这种模式。

回顾你的切身经验,当你高中毕业时,你了解生活中的所需知识么?更不用说如何取得成功了。幸运的话,你也许知道如何阅读,并且有一些基本的历史和数学技能,甚至你还可能拥有良好的学习习惯,这将使你在大学中受益。
但是,你真的准备好进入现实生活了么?也许未必,除非你的父母已经为你准备好一切。事实上,我们大部分人的早期成年生活都是一团糟,因为我们不了解所需的技能,而我们正在承受相应的后果。
你也许会说,这是生活的一部分――从经验教训中学习。但仍可能在你的孩子独立生活之前,让他准备得充分一些。如果我们无法让学校教授那些技能,就让我们自己来负责吧。
以下是一张基本课程表,孩子在迈入成年生活之前都应该掌握它。也许你认为还有其他技能需要加入其中,但至少这是一个起步要求。
如 何教导这些事情:这些课程无法通过讲课和课本来掌握,只能通过实例、言传身教来教导,并且要允许小孩独自去尝试(刚刚开始可以在监督下进行)。一旦你进行 言传身教,并且监督他们尝试几次后,就应该给予你的孩子信任,让他自己去完成,从自身的错误中学习;另外要不时和你的孩子讨论他的学习成果。
财务
储蓄:量入为出是一句简朴的格言,然而只有极少数的青年人理解并知道如何遵循它。从小就让孩子将他的一部分零花钱存入银行,教导他如何设定储蓄目标,如何达成该目标,然后便可购买他想要的物品。

预算:许多成年人害怕做预算,并为此饱受折磨,这是因为我们缺乏做预算所需的知识和技能。教导孩子简单的预算技能,以及相关的知识,让他们成年后不在面临预算的烦恼。你可以等到孩子十几岁再教他们这些知识,这是一个很好的机会来展示为什么他们需要了解数学基础知识。


支付:让孩子们支付账单,并确保他们按时支付,不论是在线支付还是实地完成。让他们学习如何写支票,包括纸张支票和在线支票;确保不会延误账单――可以通过马上支付或者自动支付来完成。


投资:什么是投资,为什么必须进行投资?你是如何进行投资的,有哪些不同的投资手段?你是如何研究投资项目?复利如何发挥时间威力。这些都是和你孩子交谈的极佳话题。


节省:这是从小就应该教会他们的事情。如何去货比三家,比较不同的价格和质量,对物品重复利用、减少浪费,在家煮食而不过多在外就餐,控制购物冲动。当我们外出疯狂购物,即便是圣诞节前,也会为孩子树立了一个坏榜样。


债务:许多成年人都面临债务问题。要教导孩子借贷的责任,如何避免不必要的债务,如何避免过多举债,如何可靠地使用信用卡。


退休:努力工作到退休年龄,还是"迷你退休"(即工作一段时间,享受一段时间),哪种更好?这是见仁见智的问题,但是你的孩子应该知晓有这些选择,它们的利弊所在,以及如何具体实施。告诉你的孩子年轻时候就开始投资的重要性,复利所带来的巨大差别,以及如何让投资自动化。


慈善:告诉孩子从事慈善的重要性,以及如何养成做慈善的习惯。这不仅仅是一个财务问题,也是一种社会活动。你应示范如何将时间与精力投入到慈善活动中。


思考

批判性思维: 这是学校没有教导的最重要的技能之一。目前,我们被驯化成机器人,听从老师而不做提问,听从教导而不动脑筋,成为不敢有异议的老实员工。如果你是一位雇 主,也许你会喜欢这样的员工;如果你是一名政客,你也许希望你的市民就是如此。但是你希望自己的孩子成为这样的人么――不问是非,幼稚无知的市民/雇员/学生?如果不是的话,马上开始培养他们提出"为什么"的习惯,学习如何找寻答案,如何去质疑权威――没有放之四海而皆准的永恒答案。对话是学习这种技能的良好途径。

阅读:当然,学校有教导我们进行阅读,但学校的教育方式往往让人厌倦阅读。带着你的孩子游览书中那天马行空的想象世界,指导他们通过互联网找到相应的信息,以及如何评价阅读材料的可信度、逻辑性和真实性。


成功

积极:上面提到批判性思维是一项重要的技能,而对生活有着积极的态度也是相当重要的。当然,事情可能会变得很糟,但是塞翁失马焉知非福,所以应该停止抱怨,寻求解决方案,最重要的是,要坚信自我,摆脱负面思维。

动力:要知道达到目标的关键不是纪律,而是动力。如何采用不同的方式激励自己,并体验完成目标的喜悦心情。一开始,先设定一些较小的,容易达到的目标,从而逐渐锻炼这种技巧。


拖拉:这是成年人的常见毛病(甚至小孩也如此)。我同意在某些时候,人们应当悠游度日,享受慵懒的时光。但是,当我们必须做某些事情的时候,怎么保证我们能够按时完成呢?教导孩子要吸取拖拉的教训,找出他们拖拉的习惯,并且研究如何克服它。


激情:成功的一个重要途径,就是找到使你激情洋溢的事物,并全情投入。你的孩子还无法在年幼时找到这个答案,但是你应该指导他们发现自己的激情所在并且对其不懈追求,让他们了解这样做的重要性。


社交

合作:从小,我们就被灌输竞争主义,这也是成人世界的写照。结果呢,卑鄙陷害、互相拆台、忿恨抱怨充满了我们的生活。相反,请教导你的孩子,人们是可以达到共赢的,帮助他人成功,将使你自己更加成功。告诉孩子结交朋友胜于制造敌人,在竞争之前先学会团队合作。

同情:这是被学校完全忽略的主题。事实上,孩子在学校学到的往往不是同情并帮助他人,而是增加别人的难处。应该教导孩子设身处地地了解别人,并去帮助别人摆脱痛楚。


爱心:爱心和同情是双胞胎,同情着重于减轻别人的痛楚,而爱心则是希望他人幸福。这两者都是至关重要的。


倾听:我们的孩子在学校学习到如何倾听了么?或者如何与人交谈么?也许这就是为什么许多成年人都不具备倾听这个重要能力的原因。要孩子学会如何真正地倾听他人,从而能够理解和感觉他人。


交谈:交谈与倾听是紧密关联的,而学校并没有教导孩子交谈的艺术。事实上,学校告诉孩子在大部分情况下交谈是不对的,然而我们往往需要的是互相交谈,而不是教导。这是非常重要的社交技巧,从小就应该在家里实践。请学会与你的孩子交谈,而不是只要他听话。


实务

汽车:告诉孩子为什么我们需要汽车(并不是为了耍酷),如何买到合适的汽车,如何保养汽车。了解发动机的工作原理,哪些地方会发生损坏,又该如何修理。这是男孩女孩都应该学习的技能(这是显而易见的,但我还是要强调)。
家务:如何保养和维修房屋的各种物件,包括管道、电器、冷暖设备、油漆、盖屋顶、剪草等等。掌握进行基础维护的工作和方法,并且知道什么时候该叫专家来帮忙。


清洁:太多的成年人没有学会如何送洗衣物,如何清洁房间,如何使房子井井有条,如何进行每周、每月的大扫除。不要只是让孩子做这做那,而要他们真的学会这些事情。


组织:让孩子学会如何摆放文件,如何让事物各就各位,如何建立待办事宜,如何建立工作流程,以及如何集中精力在重要工作上。


快乐

着眼现在:基于某些原因,我们小时候从未学到这个重要的技能。事实上,我们越年轻,就越能享受现在。当我们慢慢长大,开始担心将来,回顾过去,而"现在"则离我们而去。"活在现在"的技巧对我们是大有帮助的。
享受生活:孩子们都在享受生活,但只有一部分意识到这个技能的重要性,并且应该如何进行。即使对于成年人,享受生活的技能依然大有益处,为你的孩子做好榜样,他们自然会模仿你的。

寻找目标:拥有一个目标对于生活而是是极为重要的,无论是崇高的宗教目标,或者是为了让家庭幸福,又或者是你的职业目标。让孩子认识到目标的重要性,并且如何为自己找到目标。


发展亲密关系:教导这个技能的最佳方式,就是和你的孩子建立亲密关系,并且以你和配偶(或其他适当的人)为范例。教会他们发展这种关系的技能,讨论它的重要性,并且学习如何克服冲突。生活中总会出现不和,但是通过交流、理解和妥协,我们就能言归于好。
^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

2008年10月27日星期一

值得一读

新闻对联

将新闻事件写成对联,以短信方式传播分享,并非首次,但本周所收两则"新闻对联"紧扣时事,态度内敛,鲜明,确切,殊为别致:一则来自电视人陈TV陈老师,为同题新闻对联中最优者。联云:

上联:上半年一人杀六警
下联:下半年六警杀一人
横批:非常6+1

另一则由作家宋石男老师原创。联云:

上联:两个主持挂职
下联:一对区长外逃
横批:幸运都是二


你们怎么还不黑我啊

语出本周网络流行笑话,版本繁多,下为其中之一:

用户:喂,是微软客服吗?
微软:是。请问您有什么需要?
用户:不是说好要黑屏的吗?我都等一天了,你们怎么还不黑我啊?
微软:#%$^&@
用户:你们到底黑不黑了?
微软:……
用户:说话啊!到底是黑还是不黑啊?
微软:黑!盗版的才黑!你是盗版吗?
用户:是啊。100%盗版,绝对盗版!

这个虚拟笑话将微软"黑屏行动"娱乐化八卦化。它跟你我日常生活的麦当劳化不同的是,那些为你我提供八卦化思维乐趣的网友们分文不取,甘当娱乐志愿者。


眼下连银行家和经理都在读《资本论》

语出德国一家大型出版社负责人。金融危机不断蔓延让德国人重新认识到资本主义经济制度的弊端,马克思的名著《资本论》因此再次成为书店畅销书。当地最新民调数据表明,原东德地区52%的居民认为自由市场经济并不合适,43%的人希望实行社会主义制度。



^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

一些平时没有想通的问题

01、鱼会口渴吗?
  原来鱼是会口渴的,只不过它们饮水的方法和人类有所不同。德国不来梅阿尔弗雷德维格纳研究所指出,由于鱼有分咸淡两种,而两种鱼饮水的方法都有不同,咸水鱼用吞水的方法得到水分,淡水鱼则经由食物和鱼鳃得到水分。

02、为什么洗衣机有个透明圆窗,干衣机却没有呢?
   1920 年代,欧洲人制造了最初的滚筒式洗衣机,但当时一般市民还未完全信赖新的科技,不放心将袜子和内裤等放进洗衣机。米勒家电是第一家出售商业洗衣机的公司, 发言人指出 1920 年代上市的第一批洗衣机之所以有个圆窗,是因为到洗衣店洗衣服的朋友都希望可以看见洗衣机中的动静,那时根本无人想过洗衣机可以出现于家庭中,当时一般家 庭只以木桶和木棍洗衫,踏入50年代,当洗衣机普及化后,这种透明圆窗设计便被淘汰,干衣机没有透明圆窗最主要原因,就是现代人早已知道这些机器是不会损 坏里头的物品,不用边干边看,这么浪费时间!

03 、手语是否世界通行?
  中国人讲国语, 英国人讲英文,中国人的手语和英国人的手语有没分别?聋哑中国人用中国手语可不可以和英国聋哑人士沟通呢?德国汉堡大学手语系教授表示,聋哑人士在地球多 久,手语便存在多久,手语是一代接一代地发展出来的,与所有的自然语言一样,手语也根据其地理位置的分布而有不同变化,就像世界上也没有一种完全通行的有 声语言一样。例如在德国「红色」的手语表达是多次触碰下嘴唇,和国际间惯用的表达不同。

04、为什么多士跌落地时,总是涂奶油的哪面先着地?
   美国密西西比州哥伦布女子大学的专家做了实验,发现从桌子边缘掉落的多士,有百分之七十八是涂奶油的那一面先着地,原因是基于简单的物理定律。当士从桌 缘翻落的一刹那,一部分重心已经掉落桌外,于是这片多士处于旋转的状态中,因此不是垂直落地,而是翻转落下。奶油面先着地的关键在于通常多士翻转的速度不 够快,无法完成一个完整的空中翻滚,不像跳水运动员可以向外翻腾九周半,要多士完成整个翻滚动作,不弄肮脏地毯,方法好简单,只要大家在三米高的餐桌食多 士便可以。

05、地球上六十亿人一齐大叫,声音会不会传到月球呢?
  地球人口约有六十亿五 千五百万人,假如全世界人聚集在澳洲平原一齐向着月亮大叫,嫦娥会不会听到呢?如果所有人一齐叫的话,巨大的声响会令大地摇动,全部人的耳膜都可能会破 掉,亦有人会被嘈死。但无论大家怎么叫,都不会传到月球,即使用超高性能的米高峰都一样,原因是地球和月球中间是没有大气,而声音必须在气体或液体等物质 中传输,在真空的状态则是无法传输的,叫声所能达到的地方只限于大气层的内质,高度充其量只能传到七百公尺而已!

06、遇到交通意外,跳车逃生时,应该向前跳还是向后跳比较安全呢?
   遇到这么紧急的情况,生死攸关,千万不能做错决定,假如你决定朝车子行驶的方向跳出去的话,你必死无疑,因为离开车子的身体会遵守"惯性法则"随着车子 的速度向前,身体会加速,然后狠狠的摔在地上,如果向后方跳的话,速度会相对抵消,着地时会减少一些撞击力道。此外,向前跳的话,着地的时候,身体会向后 仰,后脑撞到的危机性较大,死亡率亦较高。

07、两个人一上一下抬东西上楼梯,哪一个人会较轻松?
   大家一定以为是在上方的人较辛苦,前面出尽力提着东西,后面的只是支撑着,当然轻松得多。但根据万有引力,行李的重量不是全压在后者吗?究竟答案是什么 呢?以力学而言,行李在两个人正中间的话,即使是在像楼梯这种倾斜的地方仍然是刚好平均分摊,并不会有哪一方比较轻松和比较累的,重与轻只是心理作用而 已!

08、为什么丧服是黑色的呢?
  中国人死人用白色,但欧美以至日本丧服都是黑色,为什 么死人要穿黑色衣服呢?古人认为参加丧礼时,丧礼上会出现死者的灵魂,穿着鲜色衣服的话,容易被死者灵魂见到,然后惨被加害。穿黑色衣服的话,就不容易被 死者的灵魂发现。身穿黑色丧服原来并不是为了哀悼死者,只是恐惧死者,不过大家敢不敢穿的大红大绿去殡仪馆呢?

09、医生看病时为什么要看病人的舌头?
   利用舌头的状态来诊断的方法称为"舌诊",源出于中医。健康的舌头是淡红色,拥有适度的润泽,舌头整体能够轻柔被压动,发烧的时候,舌头的湿气就会流失 而龟裂,病情恶化的话,颜色还会变白,肠胃不好的时候,水分的代谢功能也会减弱,白色舌苔会增加而覆盖整个舌头,西医看舌头主要用作参考,而中医则作确定 病情之用。

10、冷水和热水,那一种水在灭火时比较有用呢?
  着火了,用冷水还是热水救火好呢?不用多说,火当然很热,用冷水浇的话可以降低火的温度,但假使要尽早灭火的话,最好使用热水。冷水和热水比较,热水较能在短时间产生水蒸气,把火源覆盖,火源得不到氧气,便不会继续燃烧,但在实际火灾现场,又怎会有热水呢?

11、麻将中的"东南西北"为什么和实际方位相反呢?
  打麻将四只脚,按东南西北顺序逆时针方向坐,和实际的方位完全相反,究竟是什么原因呢?原来东南西北其实只是代表一、二、三、四和方位是无关的,加上中国人大部分是使用右手拿牌,所以将"东南西北"变成逆时针方向,纯粹为了方便而已,根本没有什么值得考究的地方!

12、在百货公司搭扶手电梯快还是乘电梯快?
   相信这个问题大家都曾想过,以速度本身来说,电梯是比较快的,但需要加上等待的时间,所以根据日本作家堀井宪一郎的调查发现,不同楼层是有不同的结果, 若从一楼到六楼的话,电扶手梯是比较快的,因为无需等候,七楼到九楼的话,碰上电梯到达及时或电梯没有人,胜负是五十五十。十楼以上的话,电梯较快,比率 高达百分之七十五。

13、为什么喝酒时,小便的时候会比较长呢?
  当喝醉酒的时候,小便的 时间变长,不少人以为酒精有利尿作用,但这观点是错的,由于酒精作用使我们对膀胱的感觉能力变得迟钝,一般而言,膀胱到达200cc时,就会想去厕所,但 当喝醉酒时,膀胱达到最大极限,还感觉不到尿意,大人的膀胱容量约为400-500cc,所以,当喝醉酒想去厕所时,尿量一定是平日的两倍,所以上厕所的 时间也因而变长。

14、为什么肯德基家乡鸡爷爷永远都穿白色衣服?
  肯德基爷爷人像是由肯 德基的始创者桑德斯上校的模样制造出来的,为什么一年四季桑德斯都不换衣服呢?难道他没有钱买衣服?桑德斯上校是个非常有地位的人,有一天电视台要求他上 节目做嘉宾,那时刚好是冬天,由于桑德斯上校没有烫好冬天西装,唯有穿夏天的白色西装,观众以为桑德斯平时天寒地冻都穿着这么薄的衣服,觉得非常有型,因 而大受欢迎,从此以后,白色西装便成为桑德斯上校的商标!

15、去舞会经常见到名人撞衫,究竟世界上有多少人拥有相同的衣服呢?
   遇见和自己穿相同衣服的人,感到非常的尴尬,对方穿得比自己好看,就更加不高兴,高级时装,因为数生产量不多,即使是同样的设计、颜色的衣服,一般大约 生产一百五十件左右,同年龄层同性别同收入的人口全球约为一千万,穿着同样衣服的人,比例大约是六万分之一,当然穿大规模生产的Tee,那撞衫的机会自然 会大得多。

16、为什么心脏不会生癌?
  胃、肝、大肠、睾丸都会生癌,但为什么没听过有心 脏癌呢?原因在于心脏以外的细胞都具有增殖机能,即使受了伤,只要过一段时间就能痊愈,这是因为细胞增殖使伤口愈合,然而心脏的细胞并不会增殖。癌细胞会 持续增殖,接着破坏周围的组织,就是因为心脏细胞不会增殖的关系,所以癌细胞是无法侵袭心脏。

17、鼻水其实积存在哪里呢?
   只要一感冒、鼻敏感,鼻水就不停流出,大量的鼻水积存在身体的哪个部分呢?鼻水其实并不是积存在身体里,一般而言鼻腺跟细胞会经常提供补充水给鼻孔表面 的黏膜,但只要一感冒,免疫血球蛋白跟化学物质就会跟水分混杂,将进入鼻孔的异物跟细菌都洗出来,鼻腺跟细胞也会一直分泌水分,因此就算我们不断的擤鼻 子,鼻水都会一直流出来。

18、烫伤后的水泡究竟是什么?
  烫伤之后,必然会出现水泡,破 掉之后更会流出液体来,为什么无缘无故皮肤会出现液体呢?烫伤是因为高热而使皮肤和细胞呈现发炎状态,细胞被破坏、体液渗透进皮肤,皮肤外侧由表皮所覆 盖,表皮之下为真皮,当体液停留在表皮和真皮中间时,便会起水泡。水泡里的水,正确来说是细胞被破坏后所流出的体液,包括血浆、淋巴、组织,加上蛋白质、 脂肪、无机盐、氨基酸等等合成的液体。

19、卡拉OK 第一首歌曲是哪一首呢?
  卡拉OK 是日本语「空的管弦乐」的缩写,本身是个音乐界的用语。以前日本有不少地方流浪演唱歌手,在没有伴奏的地方演唱时,会播音乐带伴唱代替伴奏,那就是所谓的 卡拉OK,将卡拉OK商业化的人叫井上大佑,1971 年他将自己演奏的卡拉OK录音带和播放用的机器,租借给神户的小酒馆,第一首卡拉OK乐曲是永井Frank的"羽田出发七点五十分",不少喜欢唱歌的朋友 都到了神户的小酒馆大展身手,于是卡拉OK文化便因此而蔓延全球。

20、猴子有没有同性恋?
   不要以为只有人类才有同性恋,其实猴子的世界里也有同性恋,不少猴子会有亲昵的行为,互相摩擦性器官,直至产生高潮为止,不过人类的同性恋是有感情存 在,但猴子的同性恋就完全没有感情因素,因为猴子的脑容量只是人类五分之一,无法思考同性之间复杂的感情,同性恋也只是为了寻求快感,单纯享受爱抚和性行 为而已!

2008年10月22日星期三

用最简洁生动的方法讲解了次贷危机和A股股民

在网上看到一个帖子,作者不详。用最简洁生动的方法讲解了次贷危机和A股股民:

有一天,一位其貌不扬的男士,带着一位十分艳丽的OL,来到Causeway Bay一家LV店。他为OL选了一价值6万5元的LV handbag。
  
付款时,男士掏出支票本,十分潇洒地签了一张支票。店员有些为难,因为这对夫妇是第一次来店购物。
  
男士看穿了店员的心思,十分冷静地对店员说: "我感觉到,您担心这是一张是空头支票,对吗?今天是周六,银行关门。我建议您把支票和handbag都留下。等到星期一支票兑现之后,再请你们把 handbag 送到这位小姐的府上。您看这样行不行?"
  
店员放了下心来,欣然地接受了这个建议,并且大方的承诺,递送handbag的费用由该店承担,他本人将会亲自把这件事情给办妥。
  
星期一,店员拿着支票去银行入账,支票果真是张空头支票!愤怒的店员打电话给那位顾客,客户对他说: "这没有什么要紧啊!你和我都没有损失。上星期六的晚上我已经同那个女孩上床了!哦,多谢您的合作。"

这个故事揭示了次贷危机的本质。人们在对未来收益充满良好预期的时候,对于可能加大风险缺乏防范意识。美女认为周一六万多LV就到家了,自然也就放 松了警惕,认为ONS的投资是值得的,对于投入产出的预期是建立在一个具有巨大不确定风险的情况下的。而对未来收益预期的包装则是这些投资机构最擅长的事 情。中国的股民大多跟这个美女一样,所以亏钱基本上是活该,没有这些人,股市赚谁的钱呢。而媒体和分析家们,往往在其中扮演了LV店员的配合角色。

OL:Office Lady:白领丽人
Causeway Bay:香港铜锣湾
ONS=419=One night standing:一夜情

中央武院



用平面表示立体






用加法实现减法

http://groups.google.com/group/pongba/browse_thread/thread/a5abc11899e04006?pli=1

一个计算机系统包含以下原子操作:
1. 赋值
2. +1
3. 循环(确定次数的循环)
4. 只处理正整数和 0
5. 运算不会溢出
请在该系统上实现减法

















Dingding <hank.d...@gmail.com>的一个思路,供大家讨论。

首先实现自减一操作:
tmp = 0
result = 0
loop(n) {
    result = tmp
    tmp++

}

循环执行后result == n - 1

然后利用该操作作为原语实现任意数的减法操作(假定a>b):
result = a
loop(b) {
    dec(result)

}

循环执行后 result == a - b






















^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

linux系统查看命令

系统

# uname -a               # 查看内核/操作系统/CPU信息
# head -n 1 /etc/issue # 查看操作系统版本
# cat /proc/cpuinfo # 查看CPU信息
# hostname # 查看计算机名
# lspci -tv # 列出所有PCI设备
# lsusb -tv # 列出所有USB设备
# lsmod # 列出加载的内核模块
# env # 查看环境变量

资源

# free -m                # 查看内存使用量和交换区使用量
# df -h # 查看各分区使用情况
# du -sh <目录名> # 查看指定目录的大小
# grep MemTotal /proc/meminfo # 查看内存总量
# grep MemFree /proc/meminfo # 查看空闲内存量
# uptime # 查看系统运行时间、用户数、负载
# cat /proc/loadavg # 查看系统负载

磁盘和分区

# mount | column -t      # 查看挂接的分区状态
# fdisk -l # 查看所有分区
# swapon -s # 查看所有交换分区
# hdparm -i /dev/hda # 查看磁盘参数(仅适用于IDE设备)
# dmesg | grep IDE # 查看启动时IDE设备检测状况

网络

# ifconfig               # 查看所有网络接口的属性
# iptables -L # 查看防火墙设置
# route -n # 查看路由表
# netstat -lntp # 查看所有监听端口
# netstat -antp # 查看所有已经建立的连接
# netstat -s # 查看网络统计信息

进程

# ps -ef                 # 查看所有进程
# top # 实时显示进程状态

用户

# w                      # 查看活动用户
# id <用户名> # 查看指定用户信息
# last # 查看用户登录日志
# cut -d: -f1 /etc/passwd # 查看系统所有用户
# cut -d: -f1 /etc/group # 查看系统所有组
# crontab -l # 查看当前用户的计划任务

服务

# chkconfig --list       # 列出所有系统服务
# chkconfig --list | grep on # 列出所有启动的系统服务

程序

# rpm -qa                # 查看所有安装的软件包

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

8种互联网动物

8种用于互联网的动物!

外国人都喜欢这样干!!插有意思。

Bango -移动分析公司,鳐鱼分很多种类,有的有毒,有的放电,它们都属于鲨鱼科,非常危险。 I've got no idea where this mobile analytics company got their name from, but Bango Fish is sometimes used as another name for rays, so I've decided to include the name here. Rays come in several varieties, some of them poisonous, some electric; they're related to sharks, and as we all probably remember, they can be quite dangerous. I'm not sure which exact species can be addressed

by the name "Bango," so I'd be grateful if someone could shed some light on this.


Mozilla的手机浏览器!还是狐狸!是一只更小的狐狸!

Fennec - unlike the Firefox, the Fennec Fox is actually a fox. The folks at Mozilla probably named their mobile browser after the Fennec because the animal is quite small for a fox, weighing up to 1.5 kg with a body length of up to 40 cm. What it lacks in general size, it makes up in ear size, which can grow up to 15 cm in length. It lives in the Sahara Desert of North Africa, feeds on rodents, insects, birds, eggs, and probably doesn't care much about mobile browsing.

Firefox ,这个就不用多说,大家都认识,这其实是生活于中国四川地区的一种小帽熊,浣熊科。- contrary to the popular belief, Firefox is not just a very cool fox or a fox on fire; it's a distinct animal species that actually looks quite similar to the one on the popular Web browser's logo. Its name is Red Panda, it's a herbivorous mammal that feeds on bamboo, and lives only in the Himalayas in Bhutan, southern China, India, Laos, Nepal, and Burma. If you ever see one, please don't try to spin it into the Firefox logo position for photographing; it won't like it and will probably bite you.

Myna, Aviary 公司设计的音频编辑软件Aviary's audio editor is - like all Aviary's products - named after a bird. The mynas are birds of the starling family (Sturnidae), a group of birds which occur naturally only in southern and eastern Asia. They prefer the open country, eat insects and fruit, and some of them are quite good at imitating sounds.

Songbird -基于 Firefox 的媒体播放器,Songbird 也以鸟命名,属于孔雀类,它的发声器官可以发出各种音调。名字和产品很和谐 the Firefox-based media player, Songbird is also named after an animal. Although neither Songbird's old nor new logo look much like it. Songbird or oscine is "a bird belonging to the suborder Passeri, in which the vocal organ is developed in such a way as to produce various sound notes, commonly known as bird song." There are many species of songbirds; interestingly enough, crows - which produce rather unpleasant sounds, at least to the human ear - are one of them.

Tern - Aviary 即将推出的地形图生成工具软件。Tern 是海鸥的一种in Web terms, is Aviary's upcoming online terrain generator tool. Just like Myna, it's not currently available even as an alpha product, but given Aviary's track record, they're both bound to be very interesting products. Tern, the bird is a seabird in the family Sternidae, a relative of gulls and skimmers. Most hunt fish by diving, but they're not particularly fond of swimming.

Thunderbird -mozilla的邮件接收程序,挺好用的。unlike other animals in this list, is either extinct or never existed, depending on which type of thunderbird you're referring to. Phorusrhacidae, also known as terror birds, were giant flightless birds that lived in South America during the Cenozoic, and they weren't nice at all, especially if they considered you as prey (which they often did with mammals of all sizes).

If we're talking cryptozoology, Thunderbird is a large bird-like creature rumored by some to still wander the Americas. Mozilla's Thunderbird - once a very important part of their product range - today seems to be on the verge of extinction, too. It's still being actively developed, and it's a great e-mail client; the problem is that no one really cares much about desktop e-mail clients anymore.

Yahoo -雅虎!Yahoo 的命名来自史蒂文生的名著《格列佛游记》中一种人面兽身的动物,Yahoo 还有另外一个意思,它是灰冠弯嘴鹛(Grey-crowned Babbler)的另一个俗称,生活在澳大利亚,印度尼西亚,以及巴布新几内亚。 besides being the popular Web portal and "the company that should have taken Microsoft's offer before everything went to hell," the word yahoo usually denominates a loud, unintelligent brute. However, there's another meaning to the word: it's the popular name for the Grey-crowned Babbler, a bird that inhabits Australia, Indonesia, and Papua New Guinea. Besides its rather specific call which probably gave her the name Yahoo, it doesn't seem to be particularly interesting.

Know of another Web service or product named after an animal? Please, name it in the comments, we'd like to hear about it!

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

2008年10月21日星期二

nutch0.9, 性能大为提升。


^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google


  很多用lucene和nutch的用户都有一个很大的烦恼,就是它的性能和稳定性在工程上确实不是很让人感觉满意。

  不过nutch0.9出来可以让大家多了一点信心,也为自己的项目多了一份保险。据FooFactory的测试,nutch9比nutch8在速度上提升了两倍,存储空间也降了一半。

 The following graph shows how the size of equal crawls has changed over time.



Time spend in crawling is plotted below.

 

 

  看了这份测试报告,我马上就下来了。准备好好爽一把!


在BtoB学习的一个来月




  从口碑到BtoB学习了一个来月了,在这个月里,感觉时间过得好快。来学习,也是来做项目的,因为口碑用的搜索是BtoB的技术,我们争取一定要把它自己掌握以后学以至用。
  带着两个需求过来,一开始就以需求为中心行动起来。
  先把字典分词搞定,再把按推荐菜次数排序搞定,最后宪哥又多了一个排店铺到临时所先择的中心点距离来排序。三个需求下来。对isearch的认识也加深了不少,也很感觉BtoB这边的孙海涛的支持和帮助。
  三个需求搞定,我也就很快要回口碑了。两个地方是很不一样的地方,起码有些代沟,口碑大家都很年青,这里就不一样多了。气氛比较严肃一些。呵呵,不过人是很热情,很好的。一个来月,我也一直忙着做项目也没有和他们认识几个。
 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

Spirit+lucene+nutch


  垂直搜索是针对某一个行业的专业搜索引擎,是搜索引擎的细分和延伸, 是对网页库中的某类专门的信息进行一次整合,定向分字段抽取出需要的数据进行处理后再以某种形式返回给用户。垂直搜索引擎和普通的网页搜索引擎的最大区别 是对网页信息进行了结构化信息抽取,也就是将网页的非结构化数据抽取成特定的结构化信息数据,好比网页搜索是以网页为最小单位,基于视觉的网页块分析是以 网页块为最小单位,而垂直搜索是以结构化数据为最小单位。然后将这些数据存储到数据库,进行进一步的加工处理,如:去重、分类等,最后分词、索引再以搜索 的方式满足用户的需求
    垂直搜索引擎技术同信息采集技术有一些共同点,不同的是,信息采集主要是将采集的信息导入本地库,而垂直搜索引擎主要是以网页的形式展现给用户,通用搜索 引擎主要是利用一个spider程序到网络上爬行,一般是某个特定的周期派出一次将网页更新,垂直搜索引擎同样应有一个spider程序,但该程序只在一 些特定的网络上爬行,并不会对每一个链接都感兴趣,相对来说,垂直搜索引擎的收录范围大大缩小了,但并不意味着内容的缩小,通用搜索引擎对一些动态脚本是 不敏感的,例如***asp?id=***,另外还有一些javascript之类的网页一般不被收录,而恰恰是这类动态网页包含了丰富的内容,垂直搜索引擎是必须收录这些动态脚本的,这就 需要在技术上做一些特殊处理,另外由于目前网页中的链接形式非常多,不但有动态脚本也有flash做的链接,这些链接方式通过传统的spider程序是很 难解析出来的,在垂直搜索引擎中也应该解决.

    垂直搜索的核心技术实际上就是智能spider的技术,也就是说如何将定向或者非定向的网页抓取下来进行分析后得到格式化数据的技术。垂直搜索引擎的好坏决定因素很多,但是spider的技术几乎决定了它的大部分得分。行业化很强的垂直搜索,对信息的收集,过滤等步骤的技术要求非常高。这里可以用到的技术很多,可以推荐一些,比如英国的General Architecture for Text Engineering ,另一个是Spirit is an object oriented recursive descent parser framework implemented using template meta-programming [1] techniques.  


垂直搜索一般情况下爬虫分3种模式:


1.broad search的基础上对信息进行分类挑选组织。
2.定向爬虫获取信息,初级的用配上手工或者自动的模版,更高级可以用到相关的信息抽取技术,将信息进行格式化分析入库。
3.目标网站提供特殊的数据源的接口,利用这些数据进行再加工。
 


^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

nutch插件加载机制




当某个插件需要被加载时, Nutch 会加载所有插件的相关接口到缓存,此后每个插件需要实例的时候,根据相关接口和相关接口实现实例在缓存内的记录,使用反射实现一个实例并返回,下面以 QueryFilter 的所有插件被加载例子进行说明。

 

具体代码参看org.apache.nutch.seacher.QueryFilters<init>

1 )当第一次需要得到 QueryFilter 的一个子类的实例时,使用下面这句话试图获得所有的实例:

 

this.queryFilters =

(QueryFilter[]) conf.getObject(QueryFilter.class .getName());

 

2)如果为空,则试图从插件仓库中得到该插件的扩展点:

 

ExtensionPoint point = PluginRepository.get(conf)

            .getExtensionPoint(QueryFilter.X_POINT_ID);

 

PluginRepository.get(conf) 这句话中,返回插件仓库,如果仓库为空,会初始化所有插件:

 

初始化所有插件PluginRepository.<init>

     试图从缓存内获得插件仓库。

PluginRepository result = (PluginRepository)CACHE.get(conf);

     如果未获得,则初始化所有插件

result = new PluginRepository(conf);

l         初始化以活动插件和扩展点的集合

fActivatedPlugins = new HashMap();

      fExtensionPoints = new HashMap();

      this.conf = conf;

l         获得插件存放位置

      String[] pluginFolders = conf.getStrings("plugin.folders");

l         实例化PluginManifestParser

   PluginManifestParser manifestParser =  new PluginManifestParser(conf, this);

   PluginManifestParser 是一个封装了PluginRepository的工具类,在构造时,分析每个插件的文件夹,把每个plugin.xml文件的内容进行分析,记录了所有的插件接口和插件接口内所包含的所有实现类的关系。

l         放入缓存

   CACHE.put(conf, result);

 

Plugin.xml 描述内容见附录一

 

3)获得所有QueryFilter的子类描述。

Extension[] extensions = point.getExtensions();

 

4)循环获得每个插件的两个参数,fieldNamerawFieldNames,生成每个filter插件实例。

for (int i = 0; i < extensions.length; i++) {

          Extension extension = extensions[i];

          ArrayList fieldNames = parseFieldNames(extension, "fields");

          ArrayList rawFieldNames = parseFieldNames(extension, "raw-fields");

          if (fieldNames.size() == 0 && rawFieldNames.size() == 0) {

            if (LOG.isWarnEnabled()) {

              LOG.warn("QueryFilter: " + extension.getId()

                     + " names no fields.");

            }

            continue;

          }

          filters[i] = (QueryFilter) extension.getExtensionInstance();

          FIELD_NAMES.addAll(fieldNames);

          FIELD_NAMES.addAll(rawFieldNames);

          conf.setObject("FIELD_NAMES", FIELD_NAMES);

          RAW_FIELD_NAMES.addAll(rawFieldNames);

          conf.setObject("RAW_FIELD_NAMES", RAW_FIELD_NAMES);

        }

 
至此,所有实现QueryFilter的子类实例均被加载。如果需要开发自己的插件,同样可以参考这个过程,plugin.xml的具体内容的描述负在下面:

 

<?xml version="1.0" encoding="UTF-8"?>

 

<!― 插件的根元素,根元素的属性表明了一个插件的基本身份-->

<plugin id=" 唯一身份(被插件仓库作为身份标示)" name="名称" version="版本号"

provider=" 作者"class="类名(可选)">

 

<!-- 以下两个内容中引用的类库,都是作为本类使用反射时生成实例所需要的类库-->

<runtime>

    <library name=" 运行时的类库">

         <!― 如果存在此元素,则保存到fExportedLibs(输出类库集合),否则存放到

fNotExportedLibs (非输出类库集合)-->

         <export name="*"/>

    </library>

</runtime>

 

<requires>

    <!― 需要注意,此处所需要的类库,包括该类库所需的类库,都不得在此引用本插件-->

    <import plugin=" 所需类库"/>

</requires>

 

<extension id=" 本类的包名(从代码中看没有被使用)"

              name=" 类名(从代码中看没有被使用)"

              point=" 扩展点类名(即接口名)">

      <implementation id=" 实现扩展的唯一标识(与类名相同,被parse-plugins.xml

作为身份表示使用)"

           class=" 实现扩展的类的类名"/>

      <parameter name=" 参数名"  value="参数值"/>

</extension>

 

<!― 仅在nutch-extensionpoints\plugin.xml中存在,一次性加载纪录下所有的扩展点的名称-->

< extension-point id=" 扩展点唯一标识"name="扩展点名"/>

 

</plugin>


下次会写一个完整的plugin以供参考。

摘自http://www.blogjava.net/redmu/archive/2006/12/02/85092.html

 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

linux sed 批量替换多个文件中的字符串


一、linux sed 批量替换多个文件中的字符串

sed -i "s/oldstring/newstring/g" `grep oldstring -rl yourdir`

例如:替换/home下所有文件中的www.bcak.com.cnbcak.com.cn

sed -i "s/www.bcak.com.cn/bcak.com.cn/g" `grep www.bcak.com.cn -rl /home`



二、下面这条命令:
perl -pi -e 's|ABCD|Linux|g' `find ./ -type f`
将调用perl执行一条替换命令,把find命令找到的所有文件内容中的ABCD替换为Linux

find ./ -type f
此命令是显示当前目录下所有的文件

上面的"s|ABCD|Linux| g"是perl要执行的脚本,即把所有ABCD替换为Linux
如果不写最后的那个g,"s|ABCD|Linux| "将只替换每一行开头的ABCD 


^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google


windows下的hadoop的分布部署





1.windows下的hadoop的分布部署主要有两种方式
1.1.采用cygwin模拟linux下命令的方式,部署安装hadoop系统.
  1.2.修改系统的代码文件DF.java使其可以在windows下运行.
  主要原因在于,在hadoop的代码中对数据节点的磁盘使用情况的获取采用了
  linux下的df -k 命令进行获取
而在windows没有此命令支持,因此在数据节点启动DataNode时会产生启动进程异常错误.
  解决的方法在
hadoop的网站上已说明
具体参看.
 
http://issues.apache.org/jira/browse/HADOOP-33? page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel
基本上是找到相应的替换命令获取磁盘空间,在window xp以及2003下采用
fsutil命令获取磁盘情况即可.
2. 需要注意的是:
在上面的网址中提供的方法还有一个问题需要解决
:获取磁盘命令获取到的信息.对于操作系统的不同语言版本获取的磁盘信息前缀信息也不一样,所以对于不同的操作系统不同的语言版本可以根据需要做修改.
  


^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google


个人常用的VIM命令列表

移动光标

上:k nk:向上移动n行 9999k或gg可以移到第一行 G移到最后一行
下:j nj:向下移动n行
左:h nh:向左移动n列
右:l nl:向右移动n列

w:光标以单词向前移动 nw:光标向前移动n个单词 光标到单词的第一个字母上
b:与w相反
e: 光标以单词向前移动 ne:光标向前移动n个单词 光标到单词的最后一个字母上
ge:与e相反

$:移动光标到行尾 n$:移动到第n行的行尾
0(Num):移动光标到行首
^:移动光标到行首第一个非空字符上去

f<a>:移动光标到当前行的字符a上,nf<a>移动光标到当前行的第n个a字符上
F:相反

%:移动到与制匹配的括号上去(),{},[],<>等。

nG:移动到第n行上 G:到最后一行

CTRL+G 得到当前光标在文件中的位置

向前翻页:CTRL+F
向下移动半屏:CTRL+G
向后翻页:CTRL+B

存盘:
:q! :不存盘退出
:e! :放弃修改文件内容,重新载入该文件编辑
:wq :存盘退出

dw:删除一个单词,需将光标移到单词的第一个字母上,按dw,如果光标在单词任意位置,用daw
dnw:删除n个单词
dne:也可,只是删除到单词尾
dnl:向右删除n个字母
dnh:向左删除n个字母
dnj:向下删除n行
dnk:向上删除n行
d$:删除当前光标到改行的行尾的字母
dd:删除一行
cnw[word]:将n个word改变为word
cc:改变整行
C$:改变到行尾

J: 删除换行符,将光标移到改行,按shift+j删除行尾的换行符,下一行接上来了.
u: 撤销前一次的操作
shif+u(U):撤销对该行的所有操作。

:set showmode :设置显示工作模式

o:在当前行的下面另起一行
O(shift+o):在当前行的上面另起一行

nk或nj:光标向上或向下移n行,n为数字
an!【ESC】:在行后面加n个感叹号(!)
nx:执行n次x(删除)操作

ZZ:保存当前文档并退出VIM

:help :查看帮助文档,在这之中,按CTRL+] 进入超连接,按CTRL+O 返回。
:help subject :看某一主题的帮助,ZZ 退出帮助

:set number / set nonumber :显示/不显示行号
:set ruler /set noruler:显示/不显示标尺

/pattern 正方向搜索一个字符模式
?pattern 反方向搜索一个字符模式
然后按n 继续向下找

把光标放到某个单词上面,然后按*号键,表示查找这个单词
查找整个单词:/\<word\>

:set hlsearch 高亮显示查找到的单词
:set nohlsearch 关闭改功能

m[a-z]:在文中做标记,标记号可为a-z的26个字母,用`a可以移动到标记a处

自动补全:

        ctrl+p 

r:替换当前字符
nr字符:替换当前n个字符

查找替换:
way1:
/【word】 :查找某个word
cw【newword】:替换为新word
n: 继续查找
.: 执行替换

way2:
:s/string1/string2/g:在一行中将string1替换为string2,g表示执行 用c表示需要确认
:num1,num2 s/string1/string2/g:在行num1至num2中间将string1替换为string2
:1,$ s/string1/string2/g:在全文中将string1替换为string2


v:进入visual 模式
【ESC】退出
V:shift+v 进入行的visual 模式
CTRL+V:进如块操作模式用o和O改变选择的边的大小。

粘贴:p,这是粘贴用x或d删除的文本
复制:
ynw:复制n个单词
yy:复制一行
ynl:复制n个字符
y$:复制当前光标至行尾处
nyy:拷贝n行
完了用p粘贴

:split:分割一个窗口
:split file.c :为另一个文件file.c分隔窗口
:nsplit file.c: 为另一个文件file.c分隔窗口,并指定其行数
CTRL+W在窗口中切换
:close:关闭当前窗口

在所有行插入相同的内容如include<,操作方法如下:
将光标移到开始插入的位置,按CTRL+V进入VISUAL模式,选择好模块后
按I(shift+i),后插入要插入的文本,按[ESC]完成。

:read file.c 将文件file.c的内容插入到当前光标所在的下面
:0read file.c 将文件file.c的内容插入到当前文件的开始处(第0行)
:nread file.c 将文件file.c的内容插入到当前文件的第n行后面
:read !cmd :将外部命令cmd的输出插如到当前光标所在的下面

:n1,n2 write temp.c 将本文件中的n1,到n2行写入temp.c这个文件中去

CTRL+L刷新屏幕
shift + < 左移一行
shift + > 右移一行

u: undo
CTRL+R: re-do
J: 合并一行
CTRL+p 自动完成功能
CTRL+g 查看当前文件全路径

q[a-z] 开始记录但前开始的操作为宏,名称可为【a-z】,然后用q终止录制宏。
用reg显示当前定义的所有的宏,用@[a-z]来在当前光标处执行宏[a-z].

 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

为log4j增加自定义级别




  并非在项目应用中原先的几个级别不够用了,通常的info,warn,debug ,error,fatal已经可以满足一般的应用,而且log4j也是不推荐用户自定义级别的。
  由于在我们的搜索引擎里要为每天的巨大搜索量的日记进行分门别类的记录,面原先的几个级别在程序都已经按一般的需求使用了,所以就必要自己再定义出新的级别以满足我们的需求。
  为log4j增加自定义级别其实是一件比较简单的事件。
  org.apache.log4j包下的Level.java和Logger.java这两个类改一下,或你继承它们再写一个新类,写法的话你就照着其它的几个级别的写法就可以了。
  几分钟搞定,然后再编译打包就可以了。

  使用就和其它的级别一样了,只是新加的级别数的问题要你自己好好想想。
 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google


Hadoop -- Map-Reduce具体实现详解




HadoopMapReduce

--Map-Reduce具体实现详解

Keyword:
    FileSplit:
文件的子集--文件分割体

简介:

  这篇文档描述在hadoopmapreduce操作是怎样具体完成的。如果你对GoogleMapReduce各式模式不熟悉,请先参阅MapReduce--http://labs.google.com/papers/mapreduce.html

Map

  由于Map是并行地对输入的文件集进行操作,所以它的第一步(FileSplit) 就是把文件集分割成一些子集.如果一个单个的文件大到它已影响到查找效率时,它会被分割成一些小的分割体。要指出的是分割这个一步是不知道输入文件的内部 逻辑结构的,比如,以行为逻辑分割的文本文件会被以任意的字节界限分割,所以这个具体分割要自己去指定也可以用hadoop已经定义的几个简单分割。然后 每个文件分割体都会对应地有一个新的map任务。

  当单个map任务开始时,它会对每个配置过的reduce任务开启一个新的输出书写器(writer).紧接着它(writer)会用从指定的特定InputFormat里得到的RecordReader去读它的文件分割体。InputFormat类分析输入文件并产生key-value键值对.同时InputFormat必需要处理在以文件分割时边界处的记录。比如TextInputFormat会读取分割边界的文件分割体有最后一行,如果当读取的分割体不是第一个时,TextInputFormat会忽略第一行的内容。


  InputFormat类并不需要产生一些对有意义的键值对。比如TextInputFormat类的默认输出是以输入文本的行内容为value,以行偏移量为key--大多数应用只用到而很少用到偏移量。

  传给用户配置的mapper的键值对都是从RecordReader读入的,用户提供的Mapper类就可以对键值对进行任意的操作再调用OutputCollector.collect 方法来重新收集自己定义后的键值对。产生的输出必需用一个Key类和一个value类,这是因为Map的输出结果要被以SequenceFile的形式写入磁盘,这种形式包括每个文件的类型信息和所有的记录都是同类形的(如果你想输出不同的数据结构你可以继承个子类出来)Map的输入和输出键值对不需要在类型上有联系.

  Mapper的输出被收集后,它们会被Partitioner类以指定的方式区分地写出到输出文件里。默认是以HashPartitioner类用key类的哈希函数产生的hashcode来区分(因此就要有一个很好的哈希函数,才可以使在各个reduce任务时负载匀衡)。详细可以查看MapTask类。N个输入可以产生Mmap任务去跑,每个map任务会产生配置的reduce任务数个输出文件。每个输出文件都会面向一个特定的reduce任务同时所有从map任务产生的键值对都会被送到reduce里。所以在一个特定的reduce任务中对于一个给定的key所有的键值对都会被处理。



Combine

  map操作输出它的键值对时他们已经在内存中存在了。为了性能和效率的考虑,有时候提供一个拥有reduce功能的合成器是有好处的。如果有 合成器,那么map的键值对就不会被马上写入到输出里,他们会被收集在list里,一个key值一个list,当写入一定数量的键值对时,这部分缓冲会被 送进合成器,每个key都的所有value都会被送进合成器的reduce方法里并且就像原先map输出的键值对一样。



  比如,hadoop案例中的word count程序,它的map操作输出是(word,1)键值对,在输入中的词的计数可以用合成器来加速这个操作。一个合成操作会在内存中收集处理lists,一个词一个list。当一定数量的键值对输出到内存中时,就调用合成操作的reduce方法,每次都以一个唯一的词为keyvalueslist的迭代器。然后合成器输出(word, count-in-this-part-of-the-input)键值对。从Reduce操作的观点来说合成器也拥有Map输出中相同的信息,但是这样会比原先远远减少硬盘的读写。

Reduce

  当一个reduce任务开始时,它的输入是分散在各个节点上的map的输出文件里。如果在分布式的模式下,他们需要先在拷贝步骤里拷贝到本地文件系统上。详细可以查看ReduceTaskRunner

  一旦所有的数据都在本地有效时,它会在添加步骤里加到一个文件里。然后这个文件会被合并分类这样相同的key的键值对就可以排在一起(分类步骤)。这样可以使真正的reduce操作变得简单,这个文件会被顺序地读入,值(values)会从输入文件里用一个迭代器传给reduce方法-直到下一个key。详细可以查看ReduceTask类。

  最后,输出由每个reduce任务的输出文件组成。面他们的格式可以由JobConf.setOutputFormat类指定,如果用到JobConf.setOutputFormat类,那么输出的key类和value类都要同时指定。

last edited 2007-08-10 09:26:55 by Arun C Murthy

翻译:吴志敏

原文:http://wiki.apache.org/lucene-hadoop/HadoopMapReduce

 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google

Nutch Crawler工作流程



Nutch Crawler工作流程及文件格式详细分析

Crawler和Searcher两部分被尽是分开,其主要目的是为了使两个部分可以布地配置在硬件平台上,例如Crawler和Searcher分别被放置在两个主机上,这样可以极大的提高灵活性和性能。
一、总体介绍:

    1、先注入种子urls到crawldb
    2、循环:
  • generate 从crawldb中生成一个url的子集用于抓取
  • fetch 抓取上一小的url生成一个个segment
  • parse 分析已抓取segment的内容
  • update 把已抓取的数据更新到原先的crawldb
    3、从已抓取的segments中分析出link地图
    4、索引segment文本及inlink锚文本
二、相关的数据结构:
    Crawl DB
● CrawlDb 是一个包含如下结构数据的文件:
            <URL, CrawlDatum>
● CrawlDatum:
        <status, date, interval, failures, linkCount, ...>
● Status:
          {db_unfetched, db_fetched, db_gone,linked,
            fetch_success, fetch_fail, fetch_gone}

  爬虫Crawler:
    Crawler的工作流程包括了整个nutch的所有步骤--injector,generator,fetcher,parseSegment, updateCrawleDB,Invert links, Index ,DeleteDuplicates, IndexMerger
    Crawler涉及的数据文件和格式和含义,和以上的各个步骤相关的文件分别被存放在物理设备上的以下几个文件夹里,crawldb,segments,indexes,linkdb,index五个文件夹里。
    那么各个步骤和流程是怎么,各个文件夹里又是放着什么呢?
    观察Crawler类可以知道它的流程
./nutch crawl urls -dir ~/crawl -depth 4 -threads 10 -topN 2000

    1、Injector injector = new Injector(conf);
            Usage: Injector <crawldb> <url_dir>
        首先是建立起始url集,每个url都经过URLNormalizersfilterscoreFilter三 个过程并标记状态。首先经过normalizer plugin,把url进行标准化,比如basic nomalizer的作用有把大写的url标准化为小写,把空格去除等等。然后再经过的plugin 是filter,可以根据你写的正则表达式把想要的url留下来。经过两个步骤后,然后就是把这个url进行状态标记,每个url都对应着一个 CrawlDatum,这个类对应着每个url在所有生命周期内的一切状态。细节上还有这个url处理的时间和初始时的分值。
  同时,在这个步骤里,会在文件系统里生成 如下文件 crawlDB\current\part-00000
  这个文件夹里还有.data.crc , .index.crc, data, index四个文件

● MapReduce1: 把输入的文件转换成DB格式
    In: 包含urls的文本文件
    Map(line) → <url, CrawlDatum>; status=db_unfetched
    Reduce() is identity;
    Output: 临时的输出文件夹
● MapReduce2: 合并到现有的DB
    Input: 第一步的输出和已存在的DB文件
    Map() is identity.
    Reduce: 合并CrawlDatum成一个实体(entry)
    Out: 一个新的DB
  

    2、Generator generator = new Generator(conf);//Generates a subset of a crawl db to fetch

        Usage: Generator <crawldb> <segments_dir> [-force] [-topN N] [-numFetchers numFetchers] [-adddays numDays] [-noFilter]
       在这个步骤里,Generator一共做了四件事情,
    1、给前面injector完成的输出结果里按分值选出前topN个url,作为一个fetch的子集。
    2、根据第一步的结果检查是否已经选取出一些url,CrawlDatum的实体集。
    3、再次转化,此次要以url的host来分组,并以url的hash来排序。
    4、根据以上的步骤的结果来更新crawldb(injector产生)。

● MapReduce1: 根据要求选取一些要抓取的url
    In: Crawl DB 文件
    Map() → if date≥now, invert to <CrawlDatum, url>
        Partition 以随机的hash值来分组
    Reduce:
        compare() 以 CrawlDatum.linkCount的降序排列
    output only top-N most-linked entries
● MapReduce2: 为下一步抓取准备
    Map() is invert; Partition() by host, Reduce() is identity.
    Out: 包含<url,CrawlDatum> 要并行抓取的文件



  3、Fetcher fetcher = new Fetcher(conf);//The fetcher. Most of the work is done by plugins
       Usage: Fetcher <segment> [-threads n] [-noParsing]
       这个步骤里,Fetcher所做的事情主要就是抓取了,同时也完成一些其它的工作。首先,这是一个多线程的步骤,默认以10个线程去抓取。根据抓取回来后 的结果状态来进行不同的标记,存储,再处理等等行为。输入是上一步骤Generator产生的segment文件夹,这个步骤里,考虑到先前已经按照ip 或host来patition了,所以在此就不再把input文件进行分割了。程序继承了SequenceFileInputFormat重写了 inputFormat来达到这点。这个类的各种形为都是插件来具体完成的,它只是一个骨架一样为各种插件提供一个平台。它先根据url来取出具体的 protocol,得到protocolOutput,进而得到状态status及内容content。然后,根据抓取的状态status来继续再处理。 再处理时,首先会将这次抓取的内容content、状态status及它的状态标记进行存储。这个存储的过程中,还会记下抓取的时间,再把segment 存过metadata,同时在分析parsing前经过scoreFilter,再用parseUtil(一系列的parse插件)进行分析,分析后再经 过一次score插件的处理。经过这一系列处理后,最后进行输出(url,fetcherOutput)。
    之前讲到根据抓取回来的各种状态,进行再处理,这些状态一共包括12种,比如当抓取成功时,会像上刚讲的那样先存储结果,再判断是否是链接跳转,跳转的次数等等处理。

● MapReduce:抓取
    In: <url,CrawlDatum>, 以host分区, 以hash值排序
    Map(url,CrawlDatum) → <url, FetcherOutput>
        多线程的, 同步的map实现
    调用已有的协议protocol插件
    FetcherOutput: <CrawlDatum, Content>
    Reduce is identity
    Out: 两个文件: <url,CrawlDatum>, <url,Content>


       4、 ParseSegment parseSegment = new ParseSegment(conf);//Parse content in a segment
          Usage: ParseSegment segment
  对于这个步骤的逻辑比较简单,只是对抓取后上一步骤存储在segment里的content进行分析parse。同样,这个步骤的具体工作也是由插件来完成的。

MapReduce: 分析内容
    In: <url, Content> 抓取来的内容
    Map(url, Content) → <url, Parse>
        调用分析插件parser plugins
    Reduce is identity.
    Parse: <ParseText, ParseData>
    Out: 分割成三个文件: <url,ParseText>, <url,ParseData> 和<url,CrawlDatum> 为了outlinks.


       5、CrawlDb crawlDbTool = new CrawlDb(conf);//takes the output of the fetcher and updates the crawldb accordingly.
       Usage: CrawlDb <crawldb> (-dir <segments> | <seg1> <seg2> ...) [-force] [-normalize] [-filter] [-noAdditions]
    这个类主要是根据fetcher的输出去更新crawldb。 map和reduce分别做了两方面的事情,在map里是对url的nomalizer,和filte,在reduce里是对新抓取进来的页面(CrawlDatum)和原先已经存在的进行合并。

MapReduce:合并抓取的和分析后的输出到crawldb里
    In: <url,CrawlDatum>现有的db加上抓取后的和分析后的输出
    Map() is identity
    Reduce() 合并所有实体(entry)成一个,以抓取后的状态覆盖原先的db状态信息,统计出分析后的链接数
    Out: 新的crawl db

       6.LinkDb linkDbTool = new LinkDb(conf);//Maintains an inverted link map, listing incoming links for each url.
       Usage: LinkDb <linkdb> (-dir <segmentsDir> | <seg1> <seg2> ...) [-force] [-noNormalize] [-noFilter]
    这个类的作用是管理新转化进来的链接映射,并列出每个url的外部链接(incoming links)。先是对每一个url取出它的outLinks,作map操作把这个url作为每个outLinks的incoming link,在reduce里把根据每个key来把一个url的所有incoming link都加到inlinks里。这样就把每个url的外部链接统计出来了。然后一步是对这些新加进来的链接进行合并。

● MapReduce: 统计每个链接的外部链接
    In: <url,ParseData>, 包含所有链接的分析后的结果
    Map(srcUrl, ParseData> → <destUrl, Inlinks>
        为每个链出链接收集一个入链。
    Inlinks: <srcUrl, anchorText>*
    Reduce()加上外部入链数量
    Out: <url, Inlinks>, 一个相关完整的链接地图


       7.Indexer indexer = new Indexer(conf);//Create indexes for segments
       Usage: <index> <crawldb> <linkdb> <segment> ...
   这个类的任务是另一方面的工作了,它是基于hadoop和lucene的分布式索引。它就是为前面爬虫抓取回来的数据进行索引好让用户可以搜索到这些数 据。这里的输入就比较多了,有segments下的fetch_dir,parseData和parseText,还有crawldb下的 current_dir和linkdb下的current_dir。在这个类里,map也不做,在reduce时处理。当然要把这些数据体组合成一个 lucene的document让它索引了。在reduce里组装好后收集时是<url,doc>,最后在输出的OutputFormat类 里进行真正的索引。

● MapReduce: 生成lucene的索引文件
    In: 外个文件, values 以 <Class, Object>包装
        <url, ParseData> from parse, 有title, metadata, 等等信息.
        <url, ParseText> from parse, 文本 text
        <url, Inlinks> from invert, 锚文本anchors
        <url, CrawlDatum> from fetch,用于抓取
    Map() is identity
    Reduce() 生成Lucene Document
        调用index插件
    Out: 建立Lucene 索引; 最后存储到文件系统上


       8. DeleteDuplicates dedup = new DeleteDuplicates(conf);//这个类的作用就是它的名字了。
       Usage: DeleteDuplicates <indexes> ...
   这个类的作用就是这它的名字所写的意思--去重。前面索引后(当然不是一次时的情况)会有重复,所以要去重。为什么呢,在一次索引时是不重复的,可是多 次抓取后就会有重复了。就是这个原因才要去重。当然去重的规则有两种一个是以时间为标准,一种是以内容的md5值为标准。
       9.IndexMerger merger = new IndexMerger(conf);
       IndexMerger [-workingdir <workingdir>] outputIndex indexesDir...
  这个类就比较简单了,把所有的小索引合并成一个索引。在这一步没有用到map-reduce。

  在这九大步骤中generator,fetcher,parseSegment,crawlDbTool会根据抓取的层数循环运行,当抓取的层数大于1时会运行linkInvert,index,dedup,和merge。

 


 根据nutch,crawl原码的理解,如果有什么不正确的地方欢迎与我一直交流。转栽请注明出处。
吴志敏--2007-10-14

 

^ - ^ 开心生活,开心工作

雅虎口碑(杭州)--吴志敏 http://babatu.blogspot.com

Google