« December 2006 | Main | February 2007 »

January 31, 2007

I am not bond

I am bond,James Bond.007第一次走进中国影院,是第六代的007。新邦德肯定是引人瞩目的,一个月前聊到的时候,soln说康纳利和布鲁斯南太深入人心了,新邦德很难有突破,其实就像影片中邦女郎说的一样,时间可以让人忘记过去。皮尔斯布鲁斯南塑造的007再怎么经典,他也走不进中国的电影院,更何况人克雷格也不赖。《皇家赌场》看着还不错,反正到南京看的几部电影里面算最好的了,就是感觉有点虎头蛇尾,开场那段追逐最精彩。

元旦放假三天泡在办公室写了个小工具,晚上想拿出来用时怎么也找不到,只找到一个半成品,还以为是上次从台式机导到笔记本时丢了,这可让我郁闷极了。看完电影回来之后又找了一下,发现有备份,失而复得,值得开心一下。

洪武路上极多小吃,晚上走回来每次都受不了诱惑,一路过来吃着吃着就到家了。

January 28, 2007

与青春有关的歌曲

《与青春有关的日子》中有两集查琴的,看到这两集时特别的兴奋,后来还特意返回去又看了那两段,那些翻唱的老歌实在是经典。歌曲的时代特征非常的鲜明,跟我的青春当然不会有关,但我想现在流行的哼哼哈兮之类的歌跟我的青春也是没啥关系。除了查琴时翻唱的那些老歌之外,剧情在广东时的背景音乐大多都是邓丽君、许冠杰等的老歌,我就喜欢那样的歌,所以对这部电视剧更加格外的喜欢。

目前网上查到了出处和歌名的就是下面这些了,等家里搭上宽带了之后非得下了这些歌曲不可,烧张碟到公司放,不知道会不会被鄙视。现在电视剧啥不都兴出个啥原声带的嘛,这部片子貌似还真没有,所以能不能找到剧中的版本真还不知道了。
老黑奴
苦咖啡
啊,苏珊娜
啊朋友再见
一个护士的故事
红河谷
深深的海洋
红梅花儿开
哎哟妈妈
莫斯科郊外的晚上
七十五天
苦水变美酒
白兰香
四季流浪
我们的生活充满阳光
草帽歌
大地早上好
南泥湾
游击队之歌
南京知青之歌
四渡赤水出奇兵
往事只能回味
听妈妈讲那过去的事情

mysql查询性能优化

mysql的优化可以从硬件设备的选择、操作系统、数据库结构设计、SQL查询、应用程序各个方面进行y优化,这里只从数据库的设计及查询语句方面进行优化。

1,创建索引
对于查询占主要的应用来说,索引显得尤为重要。很多时候性能问题很简单的就是因为我们忘了添加索引而造成的,或者说没有添加更为有效的索引导致。如果不加索引的话,那么查找任何哪怕只是一条特定的数据都会进行一次全表扫描,如果一张表的数据量很大而符合条件的结果又很少,那么不加索引会引起致命的性能下降。但是也不是什么情况都非得建索引不可,比如性别可能就只有两个值,建索引不仅没什么优势,还会影响到更新速度,这被称为过度索引。

2,复合索引
比如有一条语句是这样的:select * from users where area='beijing' and age=22;
如果我们是在area和age上分别创建单个索引的话,由于mysql查询每次只能使用一个索引,所以虽然这样已经相对不做索引时全表扫描提高了很多效率,但是如果在area、age两列上创建复合索引的话将带来更高的效率。如果我们创建了(area, age, salary)的复合索引,那么其实相当于创建了(area,age,salary)、(area,age)、(area)三个索引,这被称为最佳左前缀特性。因此我们在创建复合索引时应该将最常用作限制条件的列放在最左边,依次递减。

3,索引不会包含有NULL值的列
只要列中包含有NULL值都将不会被包含在索引中,复合索引中只要有一列含有NULL值,那么这一列对于此复合索引就是无效的。所以我们在数据库设计时不要让字段的默认值为NULL。

4,使用短索引
对串列进行索引,如果可能应该指定一个前缀长度。例如,如果有一个CHAR(255)的 列,如果在前10 个或20 个字符内,多数值是惟一的,那么就不要对整个列进行索引。短索引不仅可以提高查询速度而且可以节省磁盘空间和I/O操作。

5,排序的索引问题
mysql查询只使用一个索引,因此如果where子句中已经使用了索引的话,那么order by中的列是不会使用索引的。因此数据库默认排序可以符合要求的情况下不要使用排序操作;尽量不要包含多个列的排序,如果需要最好给这些列创建复合索引。

6,like语句操作
一般情况下不鼓励使用like操作,如果非使用不可,如何使用也是一个问题。like "%aaa%" 不会使用索引而like "aaa%"可以使用索引。

7,不要在列上进行运算
select * from users where YEAR(adddate)<2007;将在每个行上进行运算,这将导致索引失效而进行全表扫描,因此我们可以改成select * from users where adddate<‘2007-01-01’;

8,不使用NOT IN和<>操作
NOT IN和<>操作都不会使用索引将进行全表扫描。NOT IN可以NOT EXISTS代替,id<>3则可使用id>3 or id<3来代替。

January 27, 2007

爱咋咋地

RSS的出现改变了很多人上网的阅读习惯,包括我。尽管我有很长一段时间坚持认为一个一个Blog的去读附带看下评论来得有意思多了,但是当每天想看的Blog越来越多的时候,我也选择了阅读器,用过在线的也用过离线的,以前用Google Reader和Netvibes,现在用抓虾。一开始也蛮舒服,每天花半个小时上去浏览一下。feed慢慢积累越来越多,生怕漏过哪怕一条重大新闻和小道消息,多到打开抓虾后就算只是去点一下有更新的feed看一下文章标题都得半个小时。渐渐的还是偶尔去抓虾看一下,但是阅读则变得太奢侈了,因为看着一个一个频道后面扣号里的未读文章数,已经不知道从哪里开始点好了。不过发现我不读也没损失什么,网上炒翻了天咱不知道顶多被说落伍了,再不被挤兑一下说咱没文化,那又咋了,你们爱咋咋,关我屁事。大象说他不喜欢是因为那些不靠谱和吃喝拉撒没关系的东西,其实我觉得没什么,人家喜欢吃小炒肉还是喜欢玩概念那是人自由。我判断一件事就是对还是错,没什么需要靠谱的,你说人就喜欢研究永动机也没碍着咱啥的,只要他不强迫我和他一起研究就行了。

花时间整理了一下抓虾,狂杀了100多个feed,不读那些blog甚至不上网咱不也得好好活吗,谁也没就这么玩完呀。我明天不还得搬家去,想来这事最他妈不靠谱,一年时间里从北京六道口搬到管庄,再搬到南京丹凤街,之后搬去上海篮村路,再来南京住相府营,上星期才知道原来自己住这,打的回家都不知道怎么跟司机说,还好南京够小,我只要一迷路就发现自己到了新街口,明天那地貌似叫程阁老巷,都快成游击战争了。

与青春有关的日子

我们浪费掉了太多的青春,那是一段如此自以为是、又如此狼狈不堪的青春岁月,有欢笑,也有泪水;有朝气,也有颓废;有甜蜜,也有荒唐;有自信,也有迷茫。我们敏感,我们偏执,我们顽固到底地故作坚强;我们轻易的伤害别人,也轻易的被别人所伤,我们追逐于颓废的快乐,陶醉于寂寞的美丽;我们坚信自己与众不同,坚信世界会因我而改变;我们觉醒其实我们已经不再年轻,我们前途或许也不再是无限的,其实它又何曾是无限的?曾经在某一瞬间,我们都以为自己长大了。但是有一天,我们终于发现,长大的含义除了欲望,还有勇气、责任、坚强以及某种必须的牺牲。在生活面前我们还都是孩子,其实我们从未长大,还不懂爱和被爱。--《与青春有关的日子》

听说王朔复出了,当然按他自己的话说未曾离开过。他的小说我都看而且特喜欢看,这部《与青春有关的日子》和王朔也是大有关系,除了导演叶京(还好不是“京叶”)与王朔是发小之外,题材也是源于王朔的小说,《动物凶猛》《玩的就是心跳》《橡皮人》等不断在故事中出现。七十年代是一个特殊的年代,那个年代成长的年轻人注定与众不同,因为他们从小就一块偷幼儿园的向日葵,从楼上往过路的身上吐痰玩;他们向毛主席保证:我没骗你,真的;他们把你这港淞打倒在地,再踏上一万只脚,让你永世不得翻身;他们得到了空前的解放,不用去学一些将来注定要忘记的知识 ;他们认为再努力也没用,反正不可能超越上一代。。。他们的青春年华处于一个后来很多人包括我不了解的年代,因为年轻没有经历过不了解,因为想了解但是有人不允许你了解,还有以为了解了但是被愚弄了。总之,那个年代的事情对后来、现在、今后、再往后的中国都产生了重要的影响。很多人都说现在的人无耻,对,就是这样的,因为那个年代发生的事情就注定了后来中国的人会越来越无耻,不,我们已经不知道什么是无耻了。

January 21, 2007

一枝独秀

国际米兰3:1佛罗伦萨。
连胜场次增加到13场,领先第二名11分。
AD10和IB8双双进球,AD10在找回状态后更是联赛连续三场进球了。
马特拉齐是06年表现最好的球员,世界杯上的故事不说,联赛上也是勇猛无比,而且这种状态延续到了07年。
发现香港人说球轻松随意多了,比CCTV-5那帮傻冒好多了。
国米到底要连胜几场?Y恐怕只有上帝才知道了。

回家睡觉!

update:
楼下有一家烤羊肉串的,晚上回来经常在那吃上几串,烤得不咋样,但是他们每天煮一锅羊肉汤,我每次都会问一下,老板每次都说没煮好。我就建议小二说我们晚点回来,好几次我们在办公室待的特晚回来,发现每次又都卖光了。后来我们又恢复正常时间回来,每次经过那里我都看着那锅热气腾腾的羊肉汤流口水。今天回来的正是时候,那汤还有,叫老板给来了一碗,喝着没什么感觉,这回可好,以后回来再看到那冒着热气的汤连个期盼都没有了。

从REST看WEB全面Servcice

ROR两天前正式发布了 1.2版本,David H. Hansson在blog上详细的描述了1.2增加的新特性和改进。其中最吸引人的特性当然是对REST的全面支持,web service再一次站到了前排。鼓吹web service已经有好几年的时间了,然而SOAP等重型装备虽然在一些企业应用中占有一席之地,却始终无法得到web开发社区的认可。现在有人将已经占据统治地位六年之久的SOAP描述为死星不可避免的灭亡,再联想到Google抛弃了SOAP API改而使用AJAX提供搜索服务,以及AmazondeliciousFlickr对于REST的支持,很容易让人相信WEB社区激动的变革即将产生。
REST(Representational State Transfer)翻为中文是具象状态传输,其最核心的观念转变便是面向资源的web service而不是传统的面向行为。每个资源都有一个唯一的URI来定位,对于此资源的操作则通过HTTP协议的四个主要命令GET、POST、PUT、DELETE来控制。换句话说REST暴露的URI只是用来定位资源用的,而我们要操作的动作则用HTTP中的四个主要命令来表示。试想在以前,我们要增加、更新、浏览、删除一篇文章我们可能都会用POST的方式去请求,而事实上HTTP的四个命令天生就是用来代表这四个动作的,就象在数据库中我们使用CRUD一样。ROR在一开始引入active recode已经掀起了一股热潮,其他社区的framework纷纷模仿这一模式,这一次ROR又率先将人们在开发WEB时对于请求方式固化为POST和GET方式进行了颠覆。
人们对于web的service化已经讨论和期待了很久之后,netvibes之类的网站越来越被看好,google也将自己的很多应用开放了API,ROR的持续升温和大胆变革,以AJAX为代表的RIA开发方式,web服务整合的年代已经到来。将来web开发有人专门提供基础服务,以API的方式开放,有人专做整合,将各种底层服务整合成一个独特的应用,就像IBM广告炫耀的:我们的优势就是整合。

参考资料:
SIP/IMS网络中的Representational State Transfer (REST)和数据分布
http://dev2dev.bea.com.cn/bbsdoc/20060529259.html
面向资源与面向活动的 Web 服务
http://www-128.ibm.com/developerworks/cn/webservices/ws-restvsoap/
REST:Rails 1.2的意义,以及一个翻译接力的发起
http://blog.csdn.net/myan/archive/2006/11/25/1413937.aspx

January 20, 2007

几个好的Web 2.0实践

Web 2.0 原理和最佳实践》是一份长达100页的关于web2.0的报告,其中的所谓8个核心很早便有人翻译成中文了。

简单的说就是用户参与、数据挖掘、内容再组织、良好的用户体验、行业整合、不断完善、抓住长尾、敏捷的开发方式。应该说这些也一直是途牛在追求的,可能还有很多地方做得不尽人意,然而就像最近途牛内部流行的一句话一样:方向千万不要错。

老于第一天开始做途牛,分享一直都是途牛倡导的,我们提倡用户分享旅游心得、旅游图片,提倡用户参与景点介绍的完善,开放给用户添加相关链接,用户也可以为景点添加标签,所有这一切都表明了途牛自始至终希望让用户更好的参与分享和创造。

在今天数据挖掘已经成了互联网最为热门的研究领域,在信息过载的年代,需要挖掘出更深层次的关系让信息更加体现某种内在的联系。途牛一直力求在以景点、线路、图片等旅游介质的联系上挖掘用户间的关系和行为。

内容再组织其实是一种很重要的内容建设方式。途牛在图片、视频、方面都积极的与其他网站的内容做了整合,唯一的目的就是希望我们能够为用户提供更加多样化、立体感的信息。

良好的用户体验是web2.0的一条金科玉律了。途牛前期在网站的页面布局、色调、操作等都是希望给用户以方便为出发点,当然做得还远远不够,因此今后这方面我们是很需要继续加强的。

自称天生就是做互联网的料的老于半年之前阐述过了关于渠道的重要性,事实今天的互联网已经不是早期远离人们生活的互联网,今天的互联网更加的深入行业,就如点评、饭桶,都更加直接的参与了整个行业上下游的整合。途牛最近推出的度假也是基于此考虑,希望给爱好旅游的朋友和旅行社架起一座沟通的桥梁。

永远的BETA不知道是不是Google最先实施的,但是起码Google的表态让人重视了它的价值。途牛同样抱着这样的心态在完善,但是我们并没有简单的在Logo打上BETA而已,而是通过实际行动表态。

《蓝海战略》给平庸的经理人,《长尾理论》给惨淡的小企业,《世界是平的》给贫困的发展中国家,Web 2.0 给烧钱的网站以廉价的幻想。互联网上2006最热的理论被归纳为《"蓝长平二"之盲人摸象》,dbanotes说这句话够损,我也这么觉得。但连Google都说自己是长尾,我们能说自己是bulk吗?

高效的开发方式一直是人们所追求的。在经历了对J2EE一类重装备的盲目崇拜阶段之后,人们开始发现LAMP、ROR等轻型架构的威力,这些敏捷的开发方式为我们带来的不只是快速灵活,同样证明了是经得起考验的。

January 19, 2007

到底谁主流?

2006网络盛典大奖颁布了论坛10大流行语:
饿滴神啊、别针换别墅、那是相当的-----、我顶你个肺、灵魂附体/不是一个人、馒头、倒扁、素质,注意你的素质、断背(臂)、八荣八耻。

国家语言资源监测与研究中心等机构公布的2006年中国报纸、广播、电视十大流行语,荣获综合类10大流行语的是:
和谐社会、社会主义新农村、青藏铁路、自主创新、社会主义荣辱观、中非合作论坛、长征精神、消费税、非物质文化遗产、倒扁。

其实每一年的流行语都反应了当时一段时间的社会现象,对比一下可以发现,自称主流媒体的媒介在全力营造和谐社会的氛围,而代表草根阶级的网络正在创造真正属于他们自己的语言。再过几年,不管是官方创造的词汇还是发源于网络的流行语都会被人遗忘,但是如果你能够回想起这些曾经流行的词语,那么你会发现他们沿着两条平行线发展,你可以想想他们到底什么时候才会交集到一起。

January 18, 2007

别凭空揣测用户的需求

做互联网,大家都在说我们要以用户为中心,然而事实上大多时候只不过是一张空头支票而已。从我们口中经常会迸出这样的话:“其实用户是希望......”、“如果我是用户,那我希望......”、“用户一定会喜欢......”,当我们都在自以为是的为用户着想的时候,其实更多的时候我们不仅在欺骗用户也在欺骗着自己。象Google那样可以“自己的狗食自己吃”当然是一件很美妙的事情,对用户来说也是一件幸福的事情,这一点从Gmail、Picasa等应用上体现得非常清楚。当这些应用是实实在在的根据自己的需求驱动的,那么这时自己的的确确是可以用户的角色自居的,自然而然的很多功能、细节都是符合用户习惯的。所以千万不要轻易说你正在以用户为中心,除非你真真正正就是一名需求者,并且是具有代表性的需求者,这一点非常重要,因为从Google我们就可以看出,虽然Google的很多产品非常的酷,但在中国却难以和baidu、QQ等本地互联网公司抗衡,原因就是以精英自居的Google工程师们显然不能代表主流中国网民。

梦想和现实总是有差距,否则人也就没有追求的目标和动力了。如果我们哪天不是凭空在揣测用户的需求,那我相信我们距离成功已经更近一步了。

国际米兰队歌《蓝黑之心》CUORE NERAZZURRO

在国米的民间中文官方(新浪上那个号称真正的中文官方)论坛上发现的,一网友翻译的,还有mv和mp3可以下载,六间房上可以直接观看,还有一个歌颂国米几位传奇队长的视频

200612261915100.jpg

CUORE NERAZZURRO

Cantiamo insieme con felicità e tra di noi, profumo di vittoria c’è già e presto tornerà, la gloria che, il mondo ancora ci invidierà
Cantiamo l’inno, all’Inter vincente, Inter, la stella splendente, Inter, sogno d’amore, canta insieme a noi e il successo non potrà sfuggire.
Senti, nell’aria c’è profumo di vittoria, il cuore nerazzurro, sogna gloria e vuol cantare la sua fedeltà, alla sua storia.
Ora, di nerazzurro il cielo si colora, la stella, brilla e la vittoria, i tuoi campioni, sempre premierà e l’Inter vincerà
E la domenica sempre sarà, il giorno che, uniti intorno a te, si vedrà, con le bandiere noi, per innalzare un grido d’amicizia, con te.
E’ bello insieme, cantare felici, Inter, noi siamo amici, Inter, quest’inno d’amore, canta insieme a noi, e il successo non potrà sfuggire
Ora, di nerazzurro il cielo si colora, la stella, brilla e la vittoria, i tuoi campioni, sempre premierà e l’Inter vincerà
Senti, nell’aria c’è profumo di vittoria, il cuore nerazzurro, sogna gloria e vuol cantare la sua fedeltà, alla sua storia.
Ora, di nerazzurro il cielo si colora, la stella, brilla e la vittoria, i tuoi campioni, sempre premierà e l’Inter vincerà


蓝黑之心

我们一起幸福歌唱,
胜利的芳香在我们身边漫延,
荣耀很快会重新回来,
全世界仍将会对我们羡慕不已。

我们唱着队歌,
献给必胜的国际,
国际,闪耀之星,
国际,爱的梦想,
快和我们一起歌唱,
胜利将不会再逃走。

感觉到了吗,
空气中充满胜利的气息,
蓝黑之心,
梦想着荣誉,
想要讴歌他的信仰,
还有他的历史。

现在,
天空染成了蓝黑色,
十冠之星在闪耀发光,
胜利褒奖我们的蓝黑战士,
而国际将一直获胜。

星期天这一天,
将是我们和你在一起的日子,
你将看到,
旗帜在我们身边,
我们的友谊更加深厚,
我们永远和你一起。

大家在一起的感觉是那么美好,
我们一起幸福歌唱,
国际,我们是战友,
国际,这挚爱之歌,
和我们一起歌唱,
胜利将不会再逃脱。

现在,
天空染成了蓝黑色,
十冠之星在闪耀发光,
胜利褒奖我们的蓝黑战士,
而国际将一直获胜。

感觉到了吗,
空气中充满胜利的气息,
蓝黑之心,
梦想着荣誉,
想要讴歌他的信仰,
还有他的历史。

现在,
天空染成了蓝黑色,
十冠之星在闪耀,
胜利褒奖我们的蓝黑战士,
而国际将一直获胜。

Gmail还真幽默

在过去5年时间里我一直用hotmail,现在MSN、Gmail、Gtalk用的都是同一个gmail帐号,主要就是因为喜欢上Gmail,特别是Gmail在对付spam方面的表现。没想到Google今天幽默了一把,把我用gmail在Google Alert上订的关于途牛的信息给当成垃圾邮件了。

{073386C1-BE58-4D11-A912-83DA6DFBFFD1}.BMP

January 14, 2007

awk学习笔记

awk用于处理结构化的数据比如数据报表,一种文本处理功能强大的编程语言。

Linux下的/etc/passwd文件拿来当试手的例子非常合适。
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
这是我取我机器上这个文件的前5行,用来做测试

$ awk -F ":" '{ print }' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin

$ awk -F ":" '{ print $0 }' passwd 得到的结果和上面一摸一样

$ awk -F ":" '{print $1,$2}' passwd
root x
bin x
daemon x
adm x
lp x
-F ":"表示以:为分割符号,默认以空格分割。$0表示当前的整个行,而$1,$2...则相应代表分割后的列

逗号则让列与列之间插入空格
$ awk -F ":" '{print $1 $2}' passwd
rootx
binx
daemonx
admx
lpx
也可以使用插入字符来到达格式化的效果,$ awk -F ":" '{print $1 ” “ $2}' passwd和$ awk -F ":" '{print $1,$2}' passwd得到的结果是一样的

$ awk -F ":" '/root/{print "uid:" $3}' passwd
uid:0
这里使用了正则匹配,含有root的行输出第三列,这里就是uid

$ awk -F ":" '/^(root|bin)/{print $1}' passwd
root
bin
匹配以root或bin开头的行

$ awk -F ":" '$3==0 {print $0}' passwd
root:x:0:0:root:/root:/bin/bash
可以使用表达式,当uid等于0时输出这一行

还可以做数值运算
$ awk -F ":" '$3==0 {print $3+10}' passwd
10

$ awk -F ":" '{print ($3 > 1 ? "yes":"no")}' passwd
no
no
yes
yes
yes

$ awk -F ":" '/^root/,/^daemon/{print $0}' passwd
root:x:0:0:root:/root:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
匹配以root开头的行到以daemon开头的行,如果没有以daemon开头的行则将打印到文件末尾

$ awk -F ":" '$1~/bin/{i=$3+$4; print "i=" i}' passwd
i=2
既然awk是一种编程语言,我们就能够使用变量,上面就是匹配第一列以bin开头的行,取出第三和第四列相加赋值给i然后打印
我们还可以将在命令行中赋值的变量带到awk脚本中
$ awk -F ":" -f script i=1 j=2 passwd
这样在脚本script中可以使用i和j,它们分别被赋值1和2,这和在脚本中定义变量是一样的

$ awk 'BEGIN{FS=":"; OFS=" "; ORS="\n"} {print $1} END{print NR}' passwd
root
bin
daemon
adm
lp
5
BEGIN和END中的代码快分别在匹配文件之前和之后执行,FS,OFS,ORS,NR都是awk的内建变量
上例的意思是将分割符设为:,输出分割符为空格,换行符为行之间的分隔符,NR代表匹配的行数

$ awk -F ":" '$3==0 {print $0 > "root.txt" }' passwd
使用重定向将结果输出到root.txt中

$ awk -F ":" '{if($3==0){print "yes"} else {print "no"}}' passwd
yes
no
no
no
no
awk中的条件判断语句
if(expr){
statment;
}else{
statment;
}

$ awk -F ":" '$1~/root/{for (i=1; i < NF; i++) print i,$i}' passwd
1 root
2 x
3 0
4 0
5 root
6 /root
for循环语句
awk -F ":" '$1~/root/{i=1;while(i < NF){print i,$i;i++}}' passwd
使用while打印出与上面的for语句一样的结果

$ awk -F ":" '{gsub(/root/, "david"); print}' passwd
david:x:0:0:david:/david:/bin/bash
bin:x:1:1:bin:/bin:/sbin/nologin
daemon:x:2:2:daemon:/sbin:/sbin/nologin
adm:x:3:4:adm:/var/adm:/sbin/nologin
lp:x:4:7:lp:/var/spool/lpd:/sbin/nologin
使用awk的内建函数,将root替换为david


参考文档:
IBM的awk实例
http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-1/
http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-2/
http://www-128.ibm.com/developerworks/cn/linux/shell/awk/awk-3/

这就是我们的互联网

在聊到粉丝网时,海峰说还不够无聊八卦,并提起了狗仔网,稍微浏览了一下狗仔网,内容不仅够八卦无聊并且大打擦边球,alexa上反映流量有75%来自它的图片频道,而图片频道的内容无非是这样这样的。
另一边constructive,creative,smart 的人却要遭受这样的待遇。难怪影响力颇大的IT博客也惊呼中国互联网没有梦

January 13, 2007

sed学习笔记

sed是一种在线编辑器,它一次处理一行内容。

一般sed有两种调用方式:
sed [options] 'command' {filenames}
sed [options] -f scriptfile {filenames}

删除操作,命令d
$ sed '3d' test 删除test文件的第三行
$ sed '1,3d' test 删除test文件的第一行到的三行
$ sed '3,$d' test 删除的第三行后的所有行
$ sed '/^A/d' test 删除以A开头的行
$ sed '/david/d' test 删除包含有david的所有行

打印操作,命令p
$ sed -n '/david/p' test 只输出含有david的行
$ sed -n '/david/,/wade/p' test 匹配从包含有david的行到包含有wade的行之前所有行,如果匹配不到wade则匹配从含有david的行开始的所有行
$ sed -n -e '=' -e 'p' test 打印行号和每一行,-e使得=和p先后作用于一行

替换操作,命令s
$ sed 's/david/wade/g' test 将每一行的david替换为wade,g代表全局替换,否则将只替换每行第一个
$ sed '1,3s/david/wade/g' test 将第一行到第三行的david替换成wade
$ sed 's:/home/david:/home/wade:g' test 将/home/david替换为/home/wade,这里用:取代/为分割符
$ sed -n 's/^david/wade/p' test 将以david开头的行替换成wade开头并打印
$ sed -n 's/\(log\)in/\1out/p' test 将login以logout替换并打印
$ sed 's/.*/david: &/' test 在每行前面加上加上david:,&代表匹配到的本身

插入操作,命令i,a,c
$ sed '/david/i\hello world!' test 在含有david的行之前加入内容为'hello world!'的行
$ sed '/david/a\hello world!' test 在含有david的行之后加入内容为'hello world!'的行
$ sed '/david/c\hello world!' test 把含有david的行替换为内容为he'llo world!'的行

文件操作,命令r,w
$ sed '/david/r test1' test 将test1的内容读入显示在与david匹配的行后面
$ sed -n '/david/w test' test1 将test1中包含david的行写入test中

保持并替换,命令h,x
$ sed -e '/wade/h' -e '/david/x' test 用含有wade的行替换含有david的行替换

保持并获取,命令h,G
$ sed -e '/david/h' -e '/wade/G' test 把含有david的行保存并插入含有wade的行的后面

处理下一行,命令n
$ sed '/david/{ n; s/hello/wade/; }' test 匹配到david后移到下一行并将这一行的hello替换为wade

January 11, 2007

Apple iPhone, waiting for you!

Steve Jobs,偶像!
这两天只要跟IT沾点边的blog讨论的最多的就是iPhone。不管是MacBook、iPod Nano还是iTunes、Mac OS X、Safari,都够酷够性格的,因此爱上Apple系列的东西是一件很自然的事情。年终了本来想买个手机犒劳一下自己,网上查了一下,产品多得眼花缭乱,犹豫之间steve正式抛出了iPhone,所以决定等上半年。
虽然livid还是给Apple的产品在一致性上挑了刺,但在单个产品来看的话,Apple号称世界上设计水准最强的公司并不为过。

indexhero20070109.jpg

January 10, 2007

在Linux上运行IE7

做WEB开发当然希望尽可能兼容各种浏览器,但通过分析途牛的访问者可以发现,有大概95%以上的中国用户使用IE浏览器,因此如果说我们首先满足IE用户的话也算是“相信数据”的一种体现了吧。我用的是IEs4Linux,在Ubuntu6.06下IE6模式看起来效果不是很好,但是用来测试兼容性还是足够的,反正平时自己还是用firefox。今天发现一篇介绍在linux上运行IE7的文章,现在用IE7的并不多,途牛的后台数据显示只有大概不到2%的人使用。

January 07, 2007

国际米兰,蓝黑笼罩亚平宁!

除了以前用QQ号丢了需要去申诉之外从不上腾讯网站,今天有人推荐这个专题,看了之后特爽,截图留念。

inter4.png

inter4.png

inter4.png

inter4.png

January 06, 2007

网站备份

曾经有一个机会摆在我面前,我没有好好珍惜,如果上天再给我一次机会,我会说:我一定要备份,如果一定要给这个备份加一个保险,那就是多备一个。

丢失数据的经验很多人都有,可能是因为操作错误、硬盘损坏或者黑客光顾,总之,当你丢失了重要数据的那一刻,你或许会庆幸自己买了保险--备份。如果没有,那么你只能默哀了。找出多少理由来说明需要备份都是不为过的,如果你还是一个网站维护人员的话,那么备份就显得尤为重要。那么什么东西是需要备份的,用什么工具备份,备份在哪里,什么时候备份?这大概就是我们需要关注的关于备份的事项。
对于网站来说,硬件设备、数据、应用程序基本上是我们需要有后备的元素。首先是硬件,也就是硬件服务器,我们一般希望当一台服务器宕掉的时候,有另一台服务器可以顶上而不会影响网站的营运和服务,也就是所谓的主机备份。一般就是做集群,然后又分什么双机热备、双机互备、双机双工(哪来这么多概念呀?),方法有很多,唯一的目的就是希望即使有部分服务器不能提供服务了也不会影响整个网站的运行,直到坏掉的服务器重新投入工作。而服务器一般又会分为应用服务器和数据库服务器,所以相应的有应用服务器集群和数据库服务器集群,这方面一个藏袍在分析LiveJournal网站架构时有比较深入的阐述,其他的实现集群的方法也有很多。
数据备份简单理解就是在别的地方再放一份数据。在服务器上需要备份的数据可能是网站的一些资源文件、数据库、应用程序、email,数据库如果是mysql可以直接使用musqldump备份成文件,然后跟其他文件一起做备份。即使有版本管理系统并且进行了night build,我们也需要备份一份能正常运行的完善的系统,因为除了代码之外应用程序可能还包含了许多和生产环境相关的配置。从备份手段方面讲,最简单就是使用诸如tar这样的程序,打包压缩之后转存到其他的存储介质上,还可以使用ssh/scp进行跨服务器备份,将数据定期从一台机器搬到另一台机器。第三种方法是将数据备份到其他介质,比如使用磁带机进行备份。还有就是使用RAID进行镜像备份,RAID功能强大也比较复杂。当然,备份手段非常多,但是还有其他方面需要考虑,比如性能,备份很多时候是非常消耗系统资源的,因此我们尽量在系统负载较低的时候备份,并且应该确定整个备份过程不要持续的过长。

January 05, 2007

bayes,简单就是美

机器学习大体可以分为分类学习、聚类、关联学习、数值预测。分类学习通过对一个已知分类的学习集的学习获得可以将未知数据集进行分类的能力,聚类则使数据自然的落在几个小组里,关联学习是希望能获得每个特性之间的相关性,数值预测则预测出一个离散类。在上海的时候由于公司的需要做过一段时间的机器学习的工作,主要就是文本自动分类,尝试过naive bayes、knn、svm等方法。google黑板报上的数学之美系列文章,除了让人了解到各种关于搜索和数据挖掘的知识之外,更大的作用还在于让你发现其实很多东西即使是最简单的手段也可以做到不错的效果。google的工程师说在中学学习余弦定理时,很难想象它可以用来对新闻进行分类,事实上在大学上概率统计的课程时我都没想到说bayes会对我将来的工作有任何的帮助。机器学习的一个重要的应用领域就是文本分类,而bayes算法在这一领域的使用有很长的历史了。bayes算法是非常简单的,但是在实际的应用领域,bayes算法的效果并不比那些复杂的算法差,有时甚至更有优势。SpamAssassin是apache基金的一个反垃圾邮件软件项目,获得了2006 Linux New Media Awards上的Best Linux-based Anti-spam Solution award。SpamAssassin是用perl写的,算法便是基于bayes。SpamAssassin采用概率统计的方法来为邮件打分,通过分数的高低来猜测哪些有可能是垃圾邮件。SpamAssassin官方网站表示只有大概0.9%的垃圾邮件会被漏过和0.1%的有效邮件被当成垃圾邮件过滤掉。当然除了基于bayes算法之外,SpamAssassin还做了很多工作才能到达这个效果。另外,由于bayes基于属性独立的假设之上,而事实上这是很难的,因此如果在数据中加入一个新的属性,则很有可能破坏了原有的整个机器学习的过程。我自己在做英文文本自动分类时发现,在分词、停词处理、词根处理、同义词转换都相同的情况下,bayes得到的效果稍好于knn和svm,当然这并不是说bayes这个算法绝对的好于其他算法,因为除了算法之外还有很多其他方面以及应用领域的影响。而在效率上由于nayes不用进行参数选择,所以bayes的训练强度几乎就是和他的训练集的增长以及测试集的增场成线性关系。而采用knn和svm时,由于需要找到最有效的参数才能使结果优化所以在训练方面需要有很大的投入,比如使用交叉训练的方式来获取最优参数就是一见非常消耗时间和资源的事情。由此可见流传甚广的一句格言:简单就是美,在bayes身上有非常好的体现。当然,除了算法之外,机器学习还跟前期训练数据的准备和处理有很大关系,6e关于相关度计算的介绍,google黑板报上关于统计语言模型数据处理的系列文章都是很好的参考资料。

参考资料:
International Society for Bayesian Analysis
http://www.bayesian.org/
SpamAssassin
http://spamassassin.apache.org/

January 03, 2007

clustering

clustering(聚类)对文本挖掘、图像切割、数据检索等方面来说是一项非常重要的技术。聚类就是将一组实例进行自然分组。表示聚类的结果可以有多种方法,排他的(每个实例只能属于一个组)、重叠的(一个实例可以属于多个组)、概率表示的(表示为属于每个组的概率为多少)、分层次(多级分类)的等。在聚类研究中最常用的一种技术是K-means,首先指定要聚类的个数K,也就是我们要将一组实例归为几组,然后随机选出k个点作为聚类中心,接下来计算出实例所在的每个聚类的质心,这些质心成为各个聚类的新的中心值,不断的重复这个过程直到每个聚类所拥有的实例与上一次相同,此时聚类的中心便确定下来。使用k-means时必须事先知道聚类数目,并且初始的聚类中心的选择对于结果可能有很大的影响,因此有时需要采用多次不同的初始值进行运算然后取最优的结果。当然,如果是一种固定分类的形式,则采用机器学习的方法自动分类也是可以达到效果,但是这种方法则需要大量已知分类的学习集,这一方面比较成熟的算法是bayes、knn、svm等。

在互联网中,clusty将聚类这一技术引入了搜索引擎中,这将给用户带来体验上的很大改进。象google这样的搜索引擎可以提供大量的搜索结果,但是如何提供最相关的内容似乎已经碰到了瓶颈。事实上google对于同一网站可能在一次搜索中只显示一条结果,而将同域名的相似文章组织在一起,这也算是聚类的一种。但必须通过标题和内容的更有效的聚类分析才能进一步提高用户体验。从clusty的结果来看,聚类本身似乎并不会有太大的问题,最大的问题可能出现在速度上(据6e介绍,clusty使用的是平移算法),因为clusty是在每次搜索结果返回之前进行聚类分析,这样每次搜索的速度受到了极大的限制,并且clusty是一个META搜索引擎,这就更加影响了它的速度。

google则在机器新闻中展示了聚类的研究成果。就像前面说的一样,在实时的搜索中,速度方面可能会是一个问题,但是在机器新闻的生产过程中,因为新闻可以是定期生成的,因此这个问题就自然解决了。

参考资料
A Tutorial on Clustering Algorithms
http://www.elet.polimi.it/upload/matteucc/Clustering/tutorial_html/index.html
信息的聚类
http://www.wespoke.com/archives/000844.html

January 02, 2007

使用cronolog和webalizer分割和分析apache日志

web服务器的日志对于网站管理者来说有非常重要的作用,对于分析网站的访问情况、搜索引擎的抓取、图片盗链、非法抓取等有很大的帮助。目前apache是最为广泛应用的web服务器,apache的日志功能能通过访问日志可以比较详细的记录网站服务器的被请求情况,但是要更好的根据日志来维护和管理网站则需要其他的工具来分析日志,以生成便于查看的报表。
默认安装的apache在运行时会产生两个日志文件,access_log用于存放访问记录,error则存放出错记录。日志的生成格式可以定制的,需要在配置文件中定义
LogFormat "%h %l %u %t \"%r\" %>s %b" common
CustomLog logs/access_log common
上面的配置是最常用的一种记录格式,产生的日志格式如下:
127.0.0.1 - - [02/Jan/2007:19:41:07 +0800] "GET /themes/original/img/s_error.png HTTP/1.1" 200 272

这是一条典型的apache访问记录,这条记录里面包含有远程访问IP( 127.0.0.1 )、访问者身份(现在一般缺省,以-代替)、访问者标识(缺省以-代替)、请求时间(02/Jan/2007:19:41:07 +0800)、请求方式(GET)、请求的协议(HTTP/1.1)、请求的资源(/themes/original/img/s_error.png)、响应情况(200,代表成功)、传输的字节数(272)。

还有一种比较常用的格式
LogFormat "%h %l %u %t \"%r\" %>s %b \"%{Referer}i\" \"%{User-agent}i\"" combined
CustomLog log/access_log combined

127.0.0.1 - - [02/Jan/2007:19:41:07 +0800] "GET /themes/original/img/s_error.png HTTP/1.1" 200 272"http://www.example.org.cn" "Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.8.1.1) Gecko/20061208 Firefox/2.0.0.1"
Referer标示记录下来源,User-Agent则会记录客户端浏览器提供的一些识别信息,比如操作系统类别、浏览器类型和版本等,当然也可能是爬虫的信息。记录这些日志对于一个访问量比较大的网站来说是需要很多空间的,而且我们也没必要去保存三个月前的日志。apache提供了日志滚动和管道日志的功能来解决这个问题。
CustomLog "|/usr/local/apache/bin/rotatelogs /usr/local/apache/logs/access_log 86400" common
这条命令利用apache提供的rotatelogs每24小时滚动一次日志。当然,现在还有一个工具cronolog被广泛的应用
CustomLog "|/usr/local/sbin/cronolog /usr/local/apache/logs/access_log%m%d" combined
按天分割日志并且日志按照日期记录为access_log.0102的格式。然后可以写脚本定期使用gzip程序将日志压缩备份或者定期进行清理。


10 1 * * * /bin/rm -f /usr/local/apache/logs/`date --date "5 days ago" +access_log.\%m\%d`
加到crontab中,每天1点10分删除5天前的日志

apache帮我们记录一些重要的信息,现在就要对这些信息进行分析,这样日志才能对我们管理和维护网站有所帮助。webalizer是一个非常流行的日志分析工具。前面已经处理了apache的轮询,现在只要配置好webalizer就可以得到日志的分析结果。
0 1* * * /bin/cp -f /usr/local/apache/logs/`date -d yesterday +access_log.%m%d` usr/local/webalizer/logs/access.log
每天1点将日志拷贝一份供webzlizer分析使用

这还只是单机的日志分析,如果需要分析多台服务器的日志可以参考
http://www.chedong.com/tech/rotate_merge_log.html


参考文档:
apache日志文档
http://man.lupaworld.com/content/manage/Apache2.2_chinese_manual/logs.html
webalizer
http://www.mrunix.net/webalizer/
cronolog
http://cronolog.org/
Apache日志的cronolog轮循和webalizer合并统计
http://www.chedong.com/tech/rotate_merge_log.html

January 01, 2007

Hello world!Hello 2007!

Hello world!Hello 2007!
过去的一年都在忙于搬家了,去年这个时候还在北京,年中来到了南京,三个月后去了上海,最后又回了南京,相隔还是三个月。总是很容易就放弃又很轻易的选择了,但却总是没能坚持,整整一年都在反复中度过。最终选择回到南京是想或许应该试着努力去坚持做好一件事情,不管这件事情最终结果如何,也不管事情是否能如自己意,只是发现过去那样率性而为并不能找到自己想要的,也没能让自己清晰努力的方向和目标,所以我想如果我能花较长时间坚持着去把一件事做好,那么到那时或许我能更明白自己到底想做些什么,或者说更加清楚自己到底能做什么。
缺乏耐心,没有清晰定位,如果简单的概括我的2006年,那么我想这十个字就非常足够了。翻过2006这一页,2007还是空白,我希望能写得更精彩。