广陵散 `s 博客 » Google Wave http://ownlinux.info/blog Fri, 20 Nov 2009 00:17:01 +0000 http://wordpress.org/?v=2.9.1 en hourly 1 用jQuery实现Google Wave样式的Wordpress评论(一) http://ownlinux.info/blog/?p=794 http://ownlinux.info/blog/?p=794#comments Tue, 17 Nov 2009 14:14:06 +0000 mickeywaley http://ownlinux.info/blog/?p=794 转:http://doublechou.us/wordpress-google-wave-style-comment-with-jquery-part-1/

Google Wave已经内测好长时间了,@lookon大叔的提名接力似乎也排到了七八千咯。苏有幸在一个月前得到@Cattyhouse叔叔的邀请一枚,算是赶在第二梯队的尾巴上体验了一把Google Wave。页面和Gnome差不多,比较Q。

但是苏对它的评价并不是很高:一,帖子少;二,任何人都能改东西,总有那么一两个不自觉的; 三,无法退出一个Wave,一旦有那个不长眼的加个机器人,后果不堪设想;四,无法删除一个Wave,Trash里面全是Muted的空Wave。

其中第二三四都是Google Wave的设计理念导致的。老外和我们的想法很不同,他们一定觉得Wave作为一个协作系统和讨论平台是不应该出现”admin”这种东西的,而且作为一 个项目不能说退出就退出。他们认为Wave一旦发出,就至少有两个人,所以不应该让你删除的Wave影响其他人;一旦加入一个讨论,自己肯定不能退,无论 你是因为工作还是爱好,一旦加入就代表有责任有兴趣参与讨论,而没考虑你无辜的情况。而没有admin,也就不可能把你清出去;Wave的卖点就是大家可 以在一张纸上同时画画,所以你的东西不让改那什么都无从谈起了。总结一下就是“强买强卖”+“一锤子买卖”。

苏觉得至少可以这么改进: 1, 公共Wave不可删除,私人的可以;2, 任何空Wave都可以删除;3,可以离场或经其他所有人投票后可以离场(用于清理不自觉的和不长眼的);4,插入机器人要所有人投票通过,如果可以自己离 场此条作废; 修改应发送修改请求,或修改结果要经“编辑链”的“上游”通过(表达不太清楚,用jQuery的写法就是prev()而不是prevAll(); ); 5, 所有修改结果都像pastebin一样有存档,有据可查。这样Wave才能算作一个有秩序的协作系统和讨论平台,才会真正有企业对它感兴趣,其实企业最需 要的不是实时,再实时有视频会议说的清楚么?企业最需要的是秩序,现在的Wave最多算个会议的白板,不能主导会议的方式。

好吧,苏作为一个TMT分析员已经跑题了,不谈工作不谈工作。下面开始苏的“WordPress瞎搞教程“,老鸟可以扫过,但请别飘过,毕竟苏的brandwidth不是特供你飘来飘去滴,苏希望物尽其用,你不想说话可以潜水,但别跳出来说没用的。

我的出发点和@lookon叔叔不一样,他是在想怎么把Wave引入博客,我是想怎么把博客变成Wave。本着中国的“大山寨”精神,我没有,还不行自个儿造么。。。

先上一张Google Wave的单个Wave截图:

这张是苏和推特美女@sdelayang的私人ping哦,相信大家在直勾勾滴盯着美女照片看的同时脖子扭扭屁股扭扭滴也能发现Google Wave的New Wave主要(细节苏会在以后的文章中一点一点纠结出来)有如下特征:

1,嵌套; 2,未读消息前面显示一个小绿条; 3,作者头像右下角有一个小绿点;4,每条消息之间用点线分开;5,嵌套评论有阴影。还有2个截不出来的特征: 6,鼠标放在消息下方会有一个蓝色圆框出来让你继续嵌套或者是续接这个嵌套层,如下图; 7, 鼠标左键点击消息会出现一个绿色框选中该条消息,继续单击无法取消,只能点击别的消息或者离开该Wave,效果才会消失(也就是说你要么不点,一旦开始点 就始终会有一个绿色的框框在某条消息上。)。单击过的消息前面的小绿条消失。

也就是说,你的WordPress评论只要有如下特征,就基本可以伪装成小半个Google Wave了。

下面纠结实现方法:

其中1,嵌套是WordPress 2.7以后就自带的,本身已经非常强大,不去管它;

4, 每条消息之间用点线分开,这个最简单,css的问题。以下均以WordPress 2.8.4的default主题的comments.php里面的class为例,当然default是用的<?php wp_list_comments(); ?>这个函数,肉眼看不到任何class,但不要忘记我们还有Firebug这个强大的debug工具 :-) 只需要

[class~=vcard] {padding-top: 5px; border-top: 1px dotted gray; }

就可以了。||注释: [class~=vcard],css高级选择器,意思是有class=”1 2 3″这样的element都选中, 或者你也可以写div.vcard和.vcard, 也能选到,但是,俄,严谨嘛,苏用的css编辑器是KDE自带的Kwrite,会把高级选择器显示为苏最喜欢的粉色,宽恕苏的完美主义吧……

5,嵌套评论有阴影,这个也很简单只需要用PS或者Gimp做一个阴影加上就好了(苏用Gimp),也是CSS 问题。切图稍微有一点讲究,就是只能横着切不能竖着切,因为你不知道人家留言会留多少高度。所以切一小块阴影,repeat-y做 [class~=depth-2]的背景,把最下面的底切下来作为ul.children的背景。

延伸:苏的评论是嵌套了两层,因为苏不是个无聊的人呢,不会像Google Wave上面有些人一样20多岁了玩套圈圈,一层一层又一层,但是从技术上这是要说的,因为可能有人就喜欢设置个10层。那样就不止是对 [class~=depth-2]做背景了,准确的写法应该是

li[id|=comment]:not[class~=depth-1]

,也就是说这个背景要给到id是comment-<?php comment_ID(); ?>的、除了第一层的所有li上。另外那个底部的处理也不能像苏现在这样直接截一条下来当底部咯,因为每一层的嵌套宽度都是不同的,我们至少需要2 个element来实现下面的底。首先是

li: last-child

, 这个好理解吧,每一层的最后一个li,可以把那个左下角截下来给它当背景。然后对第一层的最后一个li去掉这个背景,

li.depth-1: last-child {background: none;}

。其他的阴影可以交给ul.children。当然有像苏一样完美主义的人非要在这一条里面在实现一个右下角的圆角阴影效果也不是不可以滴,那就是

li: last-child p: last-child

这个element咯,把右下角效果交给它吧。

具体的css代码苏就不写咯,剩下的就是重复工作咯,毕竟苏已经把选择哪个元素加背景写出来了,剩下的无非就是padding, margin的调整让它们在一条线上罢了。

好,到现在CSS能做的工作苏已经做好了。下面轮到标题中就已经提到、但现在还没有出现的jQuery上场咯。

是不是非用到jQuery不行呢,很抱歉,在这个情况下,是的。苏是CSS党,如果是一个Accordin效果苏完全可以抛弃jQuery,ie对:hover伪类支持的不好,苏可以把代码写到一个<a>里面嘛 :-) 这里非jQuery不行是因为我们需要针对click做效果,css不行。

2,未读消息前面显示一个小绿条。这句的关键在于判断什么是未读。苏对服务器端不熟悉,所以苏这里无法说你这次 click一下表示读过,关闭网页重开,我就会记住,哦,你这条读过了阿。Google有那么大的服务器,有能力,而且它的每一个用户都是肯定有帐号的, 苏即使有那么大服务器也只能针对ip地址做一个mysql表,哦,这个ip读过这条评论,但你换个地方上网,或者极端情况你坐那里没动,路由器换跟线,苏 这里就又要重新记住你一回,总不能强制访客注册吧。所以按用户“记住”未读消息是不太可能的,我做WordPress不是做Google Reader。 苏从客户端对未读的解释就只能是你打开网页,所有的评论你都没读过。这一方面是苏的技术不够,或者说是花费的精力和所得到的效果完全不成比例,投入/产出 比不对,苏是经济学人呢~另一方面就是比如cnbeta,可能吧那种大站,一点开页面所有评论你都没读过的可能是存在的,而且是经常的,呵呵,苏已经开始 好高骛远了呢。

好咯,未读说完了,你可以直接写在你的模板里,comment-body后面加个class=”unread”。但是别忘记了,我们用的可是默认模板阿,是看不到这些的,没关系,用jQuery:

$(document).ready(function () { $(".comment-body").addClass("unread"); });

然后再对unread class做CSS,加上一个小绿条的背景。或者直接:

 $(document).ready( function () { $(".comment-body").css({' background', 'url(XXXXX.png) top left repeat-y '}); });

按照逻辑的配对(实际上苏也正是这么做的),接下来应该说的是7, 鼠标左键点击消息会出现一个绿色框选中该条消息,继续单击无法取消,只能点击别的消息或者离开该Wave,效果才会消失。单击过的消息前面的小绿条消失。

这个无论如何用css都做不了。代码比较简单,直接放代码吧:

$(".comment-body").click(function() {
$(this).removeClass("unread"); //去掉被点击的消息的小绿条;
$("[class~=comment-body]").removeClass("selected"); //如果其他的消息上面有绿框则去掉它们,用来保证只有一条消息是选中的;
$(this).addClass("selected"); //给选中的消息加绿框。
});

下面处理那个3作者评论头像右下角的小绿点。苏是用jQuery追加数据的方式实现的,代码是这样的:

$("li[class~=bypostauthor]").children(".comment-body").children(".vcard").children("img").after("<span class=\"postauthor\"></span>");

首先要选中作者评论,WP2.8自带的嵌套已经给出了两个比较特殊的class,一个就是byuser, 代表你在我的站上注册过,另外一个就是bypostauthor,文章作者。各位走过路过滴同学心里应该有所共鸣了吧,通过定义byuser的样式可以提 升访客体验。继续解释代码:选到文章作者评论的li,然后选到它的重孙img,就是Gravatar,然后在它的后面追加一个span。定义span的 css即可。为什么不追加div呢,因为会把后面的作者名字和发表时间挤到下一行去。BTW,不要用绝对定位的方式定义这个span的css, 因为绝对定位会从当前文档流中排除,很容易就覆盖了紧跟在后面的评论作者名字。可以用margin的负定位。

当然,对jQuery没有信心的同学完全可以用参考线量出这个圆点应该出现的准确位置,然后作为<cite class=”fn”>的背景,然后对cite进行绝对定位+z-index让它覆盖在Gravatar的上面 :-) 不过就是太麻烦咯。

下面是最后一个效果:6,鼠标放在消息下方会有一个蓝色圆框出来让你继续嵌套或者是续接这个嵌套层。

其实这个简单来说针对的主要是wordpress嵌套评论的reply按钮。用那个圆角方框完全替代reply按钮,再把它隐藏起来,鼠标滑过的时候显示,之后隐藏。很简单的一个jQuery效果吧。

但是它的难点在于,真正的Google Wave是可以让你选择是开始新的嵌套还是继续当前嵌套层的,也就是说可以把你的回复贴到别人嵌套层上面,开始一个新的同级ul。这个需要ajax的支援,苏会写在本系列文章的第二篇里面。

为了高度仿真Google Wave,我们也要让它能选择开始新的嵌套或者继续当前嵌套。好吧,苏的技术有限,现在还没想到好方法。但是“在一个已经有嵌套的评论下面显示‘继续当前 嵌套’,在没有嵌套的评论下面显示‘开始新的嵌套’“,这总归是可行的,不然我写那么多玩什么呢对吧……

用jQuery来说就是,先判断当前评论是不是第一层(因为苏只有两层,第二层就已经不能在继续“开始新的嵌套“咯),然后再判断第一层的元素下面 有没有嵌套(这个逐渐缩小的过程能理解吧,第二层是绝对没有嵌套的,判断第一层就行了),如果有嵌套就给一个继续当前嵌套的class,如果没有就给一个 开始新的嵌套的class。这是default主题的情况。代码:

$(".comment-body").mouseover(function() {
if ($(this).parent("li").hasClass("depth-1")) {           //判断是不是第一层
if($(this).parent("li").hasClass("parent")) {            //判断有没有嵌套
$(this).children(".reply").addClass("continue");
$(".continue").show();
} else {
$(this).children(".reply").addClass("insert");
$(".insert").show();
};
} else {
$(this).children(".reply").addClass("last");           //如果是第二层
} endif;
}).mouseout(function() {
$(".insert").hide();
$(this).children(".reply").removeClass("insert");
$(".continue").hide();
$(this).children(".reply").removeClass("continue");
});

不知道大家搞懂了没,苏的JS不强,所以用的效果都很简单的,大家可以在此基础上加效果。

延伸: 同样是多层的情况,专门写给那些无聊的同学的。

由于存在的层数未知, 这时候道理就应该反过来说咯,先知道最后一层,一层一层往上推,因为只有最后一层是特殊的,就是它不能再开始新的嵌套。判断最后一层的方法是: 判断有没有下家,这时不能用parent的方法来判断,因为他可能是中间某层,只需要判断这一层有没有ul.children就可以咯。另外还要判断 prevAll和nextAll有没有ul.children,避免出现正好判断在岔路上这种悲剧。

而至于背景,这时候也不适合用addClass的方式了,因为每一层宽度不同,要很多很多Class。苏之前也不懂怎么做,但是今天做 comments.js的时候发现了一个方法,就是:写一个递归变量,每次都+若干个px,然后把这个变量赋给width,这样只需要做一个最宽的没有最 左边图像的背景,再right top,然后对<div class=”reply”>做背景补全那个左上角,通过width就能画出宽度不同的reply按钮咯。

关于递归变量可以看这句:

$('#commentnum').text(parseInt(jQuery('#commentnum').html()) + 1);

好啦,总算写完这篇“技术文”咯,其实就是个想法,大部分代码我没贴是吧,但关键代码我都贴了对吧。这个做法是开发大家的想象力,因为自学的菜菜阶 段的想象力其实是最丰富的,为了实现一个结果会去想好多好多种方法,但是专业的设计师就不会,因为他们脑子里早就有最好的啦,你可以从他们网站上cp过 来,效果有了,但你什么也没学到不是么。吼吼,不教育人了,其实这一方面是苏对于那些代码也是一知半懂,写能写出来但要纠结好久,干脆就贴个想法咯;另一 方面是做ajax评论时候得到的教训,就去网上下了一个php一个js,搞定了。。。可是我依然不知道什么是ajax。

<!– 这篇文章为小女原创,小女完全明白其意思,可以转载,但是不可以歪曲事实,要么不转要么全转; 可以在此基础上继续开发,但请另起炉灶或保留原文的基础上加注释。此类无聊雷同文并不好找,如果真的有雷同,本人可能不愿起诉你,但心情不好对你发飙你也 请胳膊打折袖里藏~–>

]]>
http://ownlinux.info/blog/?feed=rss2&p=794 0
Google Wave从入门到进阶 http://ownlinux.info/blog/?p=772 http://ownlinux.info/blog/?p=772#comments Mon, 02 Nov 2009 07:07:00 +0000 mickeywaley http://ownlinux.info/blog/?p=772 伴随Google Wave(本文简称:GW)内 测大门的敞开,有些读者可能已通过朋友们的提名,拥有了GW的帐号,并且切身体验过GW,但这个传说中的Wave,真的令大家都有很好很强大的感觉吗?对 于新手而言,它就像个充满英文的空架子,不知从何下手,这篇文章将详细的讲解如何合理有效的使用GW,还没拿到帐号的读者们也可以提前学习下GW的操作知 识。

4015688511_1d02d52eec

Google Wave到底是什么?

官方简介翻译:

Google Wave是一个实时交互的交流及协作在线工具,你可以用富文本格式、图片、视频、地图和更多的元素进行交流。

每个Wave就是一段与多个参与者进行的对话。参与者指的是那些加入每个Wave讨论和参与内容协作的人,参与者在加入的Wave中,可以在任何时 间、地点回复,他们还能编辑内容,并且添加更多的参与者进来。Wave还提供了回放功能,可以看到在加入的Wave中,什么时间做了什么改动。

另外大家还可以通过阿禅的文章《Google Wave试用体验与Google的野心》,系统了解下Google Wave的全貌,本文以实用操作为主,所以不做插图展示GW的外观。

Google Wave的入门操作

1.创建

点击界面上的New Wave按钮,创建一个新的Wave,在右上出现的联系人窗口,添加你想邀请进来的用户,或者从左下的联系人列表,拖拽头像到Wave顶端,进行添加用户。

2.回复

■ 选取Wave中一个对话框后,点击Wave工具栏上的Reply按钮。

■ 双击想要回复的文字,在出现的工具钮上选择Reply。

■ 将鼠标移动到对话框的下边线,会看到蓝色的横线,点击即可直接在下面回复。

■ Shift+Enter:是回复并完成输入的快捷键。

3.阅读

点击空格键,可以按照Wave添加修改的顺序,逐个阅读Wave里每个对话框中的内容,甚至还可以穿越到下一条有未读内容的Wave。

回放功能中也可以用空格,逐步阅读。

4.排版

界面上的窗口都是可以调整的,把鼠标放在边线可以拖动调整宽度、高度,点击还原、最小、最大化按钮可实现相应功能。

同时浏览4个Wave:排版的最大好处就是扩大你的使用面积,按住Ctrl(Mac上是Command ),再点击一个新的Wave,它就会独立于正在浏览的Wave,并列展开在屏幕上,将联系人等窗口最小化,最多支持同时显示4个Wave窗口。

5.存档和静音

Archive(存档):将Wave移出Inbox,直到有人在里面更新内容时,它会再回到Inbox。

Mute(静音):将Wave移出Inbox,直到有人在里面对你进行private reply(个人回复),它会再回到Inbox。

取消静音:把它拖拽回Inbox即可取消。

Google Wave的进阶使用

1.搜索

公共Wave:就是世界各地创建的公开Wave,每个人都可以看到并参与进来。在搜索框中键入 with:public 就可以看到这些实时动态滚动的Wave。

中文公开Wave:在搜索框中键入 with:public lang:zh 就可以看到中文的公共Wave,其中有些条目比较多的Wave要慎入,否则可能会卡住甚至造成出错……

用Tag缩小搜索范围: 比如需要搜索以kenengba为标签的内容,可以在搜索框中键入 with:public tag:可能吧,这样就可以看到公共Wave中包含可能吧标签的Wave了。

2.创建公共Wave

也就是上面提到的那种面向全球公开的Wave,也是一种让同语种的人找到彼此的一种方式,方法很简单,添加 public@a.gwave.com 到联系人列表。(注意:每个字母和符号都不要错)

虽然添加时,上面会说”The account doesn’t exist.” 但请无视这句提示,直接点击回车添加。然后再将这个机器人,添加到你想要公开的Wave中即可。添加完会出现一个黄条提示:”[not-yet-implemented-user] gave everyone access.“,就说明这个Wave已经公开。

3.关于公共Wave的补充

已知的一个BUG,就是上面添加那个机器人,会在重新登陆Wave后,从联系人列表中自动消失,目前只好在需要的时候重新添加它。

当你将一个Wave公开后,它就不能再变为私有的Wave,所以公开之前请三思。

对于已经公开的Wave,所有参与者都有编辑权限,也就是说谁都可以更改里面的内容,甚至删除,虽然”Playback(回放)”可以看到是谁做的改动,但如果被删还是很麻烦,这就需要大家的自觉了,希望大家能看看这个中国网友翻译的Wave公约(在Wave中搜索with:public  title:Google Waves公约(协作翻译)讨论区),共同维护一个好的使用环境。

4.添加朋友

因为Wave是个新鲜东西,所以刚进入Wave时,联系人列表上的朋友一般较少,都是拥有Wave帐号的G Talk联系人,为了扩大交流的范围,可以通过下面的方式添加朋友:

找已经有Wave帐号的朋友:点击联系人列表上的加号,将TA的帐号复制上去,点击Submit。

出现在Wave中的朋友:在你参与的Wave中,点击顶部朋友的头像,选择Add to Contacts。

Google Wave 快捷键列表

原版快捷键列表在Wave中搜索with:public title:Keyboard Shortcut Cheat Sheet tag:help)由这些热心的Wave网友整理而成──Kang kang (and ✿Melissa✿ Elliott, Alex Elsayed, …):

因为这篇文章是写给中国用户的,所以我将这个列表中部分快捷键翻译为中文,献给可能吧的读者们:

Wave 导航栏

上/下 箭头键 ── 用于在导航栏中切换信息

Tab/Shift-tab ── 与上/下 箭头功能相同(编辑模式除外)

Home/End ── 移动到第一条/最后一条信息

空格键 ── 转到下一条未读信息(不一定非要在同一个Wave中,可穿越)

左/右 箭头键 ── 切换于导航面板和Wave面板

Ctrl+空格键 ── 将所有信息标记为已读(必须切换到Wave面板中)

信息

回车键 ── 回复信息:回复的新信息会出现在所选信息的下面

Shift+回车键 ──  回复最后一个对话框,新的信息和所回复信息在同一层级上,并且在最下端

高亮选中文本+回车键 ── 嵌套回复:回复的新信息会嵌套在当前信息内部

Ctrl+E ── 编辑信息

Ctrl+回车键 ── (在编辑时) 在加字号上插入嵌套的回复

Google Wave的第三方插件应用

因为GW的平台是开放的,所以第三方的插件和服务很多,这里就不一一列举,只选择10个热门的插件机器人做以介绍,更多内容请参考:Google Wave扩展列表 (在Wave中搜索with:public title:Google \/\/ave Extensions List tag:gadgets)

1.将GW嵌入到博客中

就是说把一个Wave嵌入到博客中,方法也很简单,在Wave中添加机器人 embeddy@appspot.com ,然后在出现的设置面板中,把下面那大段代码复制到BLOG的HTML《body》和《/body》之间(请自己将《》换成<>),然后再把那单独的一行代码复制到文章里就可以了。

但请注意,给文章加入Wave会影响文章的开启速度,没有Wave帐号的人是看不到嵌入Wave的。

2.嵌入国内视频

请在GW中阅读这个Wave(在Wave中搜索with:public title:在Wave里嵌入国内视频的方法)的教程并安装插件。

3.翻译

添加 rosy@wavesandbox.com 到联系人列表,这是Google的翻译机器人,把它添加进需要翻译服务的Wave中,可以实时看到自动翻译的结果。(下面的插件,均与此使用方法相同。)

4.发推

添加机器人 tweety-wave@appspot.com

5.投票

添加机器人 polly-wave@appspot.com

6.看股票

添加机器人 stocky-wave@appspot.com

7.公开Wave机器人

它和官方的公开机器人使用方法相同,不过它不会在联系人列表中消失,添加机器人 blog-wave@appspot.com

8.统计

它可以统计Wave中的行数和字数等文本信息统计,添加机器人 countcolon@appspot.com

9.只读

它会保护Wave原始的内容,这很适合知识传播,无论Wave被如何编辑,它都可以被自动替换为添加机器人时的原始内容,添加机器人 readonliebot@appspot.com

10.删空白

它会删除Wave中没有内容的对话框,比如大家不小心点了回复,却没有写任何内容在里面,很实用的一个功能,添加机器人 sweepy-wave@appspot.com

Google Wave亟待解决的问题

1.卡

这是令众多用户望而却步的原因,目前所知的情况是,这种卡不完全是由硬件或者用户网速造成,而是Wave本身的问题,希望能在以后的更新中逐渐得到解决。

2.乱

因为是开放性的讨论,所以经常出现没有关联性的回复,虽然有嵌套式讨论,但很多用户不会用嵌套,就导致很多平行话题的展开,使得Wave整体阅读起来没有逻辑性

3.删

可能是Google认为删除是危险的,所以目前没有提供完全的删除功能,比如你不想再看某个Wave时,你只能把它拖到回收站去,而这个回收站是不能清空的…

4.权

没有权限设置是最大的问题,这也是造成公开Wave乱的主要原因之一,谁都拥有最高控制权,修改别人的话等等,于是国外和国内的朋友,开始建立Wave公约,希望大家自觉遵守网友们共同制定的Wave公约。

5.少

不可否认,GW的公开还是很局限,国内拥有帐号的人,或者说真正使用的人并不太多,但愿官方能早日开放二代Wave的提名权限,让我们邀请更多的人加入GW的世界。

关于Google Wave的帐号

人人都想拿到GW的帐号,这是不争的事实,但是官方这次测试仍然比较谨慎,每个参与Develop测试的沙盒帐号只给8个提名的名额,也就是我们所说的一代Wave。

而被上面一代Wave提名的用户,就是二代Wave,目前没有任何提名的名额,所以现在向二代Wave索要提名或邀请是没用的。

结语

这篇文章终于在我”吐血”之后写完了,花了很多时间测试和翻译,写得蛮苦的一篇文章,但我想是值得的。另外我们可能吧已建立读者交流用的公开Wave(在Wave中搜索with:public tag:kenengba),欢迎大家加入讨论。

Google Wave才刚刚启航,更多的波浪会接踵而来,但愿它能长江后浪拍前浪,把××拍倒在沙滩上。

原文地址:http://www.kenengba.com/post/1886.html

]]>
http://ownlinux.info/blog/?feed=rss2&p=772 20