前阵子似乎是在水木看到的笑话,今天想给别人看的时候,网上却搜不到了。这样的经典,还是记录下来为好——这叫“备案”。据说是有人在火锅店看到的:
顾 客:服务员,你们这里的鸳鸯锅是多大的鸳鸯做的?
服务员:我们的鸳鸯锅主要是用的鸡汤……
顾 客:鸡汤啊,鸡汤也行。那给我来个鸳鸯锅,要不辣的。
如有误,请指正……
前阵子似乎是在水木看到的笑话,今天想给别人看的时候,网上却搜不到了。这样的经典,还是记录下来为好——这叫“备案”。据说是有人在火锅店看到的:
顾 客:服务员,你们这里的鸳鸯锅是多大的鸳鸯做的?
服务员:我们的鸳鸯锅主要是用的鸡汤……
顾 客:鸡汤啊,鸡汤也行。那给我来个鸳鸯锅,要不辣的。
如有误,请指正……
前阵子有人分享了一个延迟发布feed的技巧,在WordPress用户间广为流传。其原理就是利用WordPress的filter机制,发现当前的请求是Feed,即在查询条件中加一条,限制post的发布时间为五分钟之前(原文的代码escape太厉害了,直接复制有错误):
<?php
/**
* puplish the content in the feed later
* $where ist default-var in WordPress (wp-includes/query.php)
* This function an a SQL-syntax
*/
function publish_later_on_feed($where) {
global $wpdb;
if ( is_feed() ) {
// timestamp in WP-format
$now = gmdate('Y-m-d H:i:s');
// value for wait; + device
$wait = '5'; // integer
// http://dev.mysql.com/doc/refman/5.0/en/date-and-time-functions.html#function_timestampdiff
$device = 'MINUTE'; //MINUTE, HOUR, DAY, WEEK, MONTH, YEAR
// add SQL-sytax to default $where
$where .= " AND TIMESTAMPDIFF($device, $wpdb->posts.post_date_gmt, '$now') > $wait ";
}
return $where;
}
add_filter('posts_where', 'publish_later_on_feed');
?>
当时我看到之后也很兴奋,觉得非常之有用。因为我就经常在发布一篇文章之后马上发现有错误或者遗漏,赶紧修改,但是此时可能已经有些RSS reader过来抓取过了,我所做的修改不一定能被Feed订阅者收到(Atom Feed应该可以)。
不过当我加上这个功能,又写了一篇文章之后,发现了问题。在文章发布的时候,WordPress会向预定的一些服务器发送ping,通知它们这里有更新,赶紧来抓取。如果该服务器反应很迅速,糟了,它来抓取RSS的时候,发现并没有新的文章——被放鸽子了。它可不知道要等五分钟再来抓取,新文章只好经历漫长的等待才能被抓到。
所以要保证文章少出错,还得在发布之前多预览,多检查,而延迟发布RSS只能让你点击Publish按钮的时候更加勇猛。使用这个技巧一定要三思而后行。
为什么发布的时候发送ping消息很重要呢?如果不这样,那些RSS Reader只能盲目地周期性来查看,比如每天一次或者每隔3小时一次,Feed托管服务商也是这样。而在发布的同时通知它们,它们就会确切地知道你的blog有更新了,很快就会过来抓取,读者也就能在第一时间看到你的新文章了。
附带列一下我的Update Services列表:
http://rpc.pingomatic.com/
http://ping.feedburner.com/
http://www.zhuaxia.com/rpc/server.php
http://www.xianguo.com/xmlrpc/ping.php
http://blogsearch.google.com/ping/RPC2
http://blog.youdao.com/ping/RPC2
如果你使用feedsky的服务,当然也要把它的ping server(http://www.feedsky.com/api/RPC2)加上。
人在悲哀之中,才象一个人。
——孟德斯鸠
我们太像人了。
本来Feedburner是Feed服务的不二之选,然而由于众所周知的原因,我们不得不放弃它转向Feedsky. 最近似乎也听到声音,Google已经把它打造成一台广告机器,而不是原来的专业Feed服务商了。而Feedsky一直在风雨中飘摇,没见过有稳定的时候。
跟Feedburner一样,feedsky提供了域名绑定功能,让你无后顾之忧——即使你不愿用Feedsky的服务,也可以将该域名指向其它的地址,实现无缝迁移。然而这个功能还不如没有,白白欺骗我绑定了域名,却没有跟上稳定的服务,还不如使用它的默认地址。这几天,绑定的域名就时常不能访问,似乎是有一台服务器出了问题。客服论坛里好多人反映,但是这是假期。记得当初我们的网站虽小,也会在第一时间作出反应。
我考虑了一下是不是把blog的header/footer的rss链接换成feedsky的默认链接,后来决定不再对它抱有幻想,干脆放弃Feedsky,直接提供WordPress的原始RSS输出,地址是 http://qingbo.org/feed 我发誓只要这个blog还在,这个地址绝对是最新的feed.
本来指向Feedsky服务器的域名feed.qingbo.org已经做了url转发到 feed.qingbo.org,所以通过该地址订阅的朋友无需修改。不过建议使用Feedsky地址(http://feed.feedsky.com/flimsy)的朋友更改一下
可能对Feedsky的要求过高了,逆境中生存,在国内应该算已经做得不错了。不过对于blogger们来说,稳定性还是第一位。
好处:无需再为Feed服务的稳定性发愁,而且只要读者的阅读器来抓取,肯定是最新的Feed,不存在延时。
坏处:无法使用Feed服务商提供的高级统计服务,不过我觉得订阅数都是浮云,怎样提升文章质量才是重点,并且有许多提供统计的插件可以使用,稍微弥补一下。牺牲稳定性来换取统计服务,我觉得非常不值得。
至于Feed服务商为blog分担Feed请求的负载,我觉得在当今online reader统治天下的局面下,不需要考虑。一个Reader服务只需请求一次,即可服务成百上千的读者。实在不行,还可以使用插件将Feed输出静态化。
今天在aw的blog看到他写的“中国Web工程师比美国人更厉害的4个原因”,讲了使用中文的计算机用户、以及面向中文用户进行开发的软件工程师需要额外修炼的法术——于我心有戚戚焉。当初在Linux里配置中文显示、输入的痛苦仍然记忆犹新,配置完系统又去配置特殊的软件;大部分的IDE把Ctrl+Blank作为代码提示的快捷键;……最近的ubiquity,也是以Ctrl+Blank作为呼出它的热键,并且其窗口会盖住中文输入法的候选窗口。尽管前辈已经把路铺得够平,我们已经足够幸福,中文在计算机世界里永远无法像英文一样简单、易用。
晚上吃了饭,又看见WordPress爱好者论坛里有人问日志缩略名的中文如何修改,我不知不觉就像唐僧一样罗里罗嗦回复了一大堆。
文章太长,请点此处继续阅读
虽然WordPress早在2.5的版本中就内置了Gravatar支持,似乎也没有人在添加评论form的旁边加上它。我似乎是第一个?呵呵,如有先行者,恕我孤陋寡闻。
功能:在添加评论的表单旁边显示gravatar头像预览,登录用户直接取其email,而未登陆用户则首先尝试从cookie取得email,若cookie中部存在,则在其输入email之后,取得email值即时更新预览。
首先说明,本文不介绍排版,即不介绍CSS布局,不过你可以参考我的评论form布局。
第一步,在主题的comments.php中,找到评论框合适的位置,添加gravatar预览:
<div id="avatar-preview"><?php $id_or_email = $user_ID ? $user_ID : $comment_author_email; echo get_avatar($id_or_email, '32'); ?></div>
第二步,仍旧在comments.php中,给email输入的input绑定blur事件,在其失去焦点的时候更新gravatar头像预览:
onblur="updateAvatarPreview(this.value)"
第三步,下载Paul Johnston的JavaScript md5脚本,放在网站中合适的目录(我是放在当前主题的scripts子目录中)。
第四步,修改主题的header.php文件,在head标签内加入如下代码:
<?php if (is_singular() && !$user_ID) { ?>
<script type="text/javascript" src="<?php echo bloginfo('template_url'); ?>/scripts/md5-2.2alpha.js"></script>
<script type="text/javascript">
function updateAvatarPreview(email) {
if (! /^([a-zA-Z0-9_\.\-])+\@(([a-zA-Z0-9\-])+\.)+([a-zA-Z0-9]{2,4})+$/.test(email)) {
return;
}
var src = 'http://www.gravatar.com/avatar/' + hex_md5(email) + '?s=32';
document.getElementById('avatar-preview').innerHTML = '<img height="32" width="32" class="avatar avatar-32 photo" src="' + src + '" alt=""/>';
}
</script>
<?php } ?>
is_singular函数在当前页面为单篇文章、单个页面或者单个附件的时候返回true,这些一般都是有评论的页面,所以正好合适。而另一个条件 (!$user_ID) 则是因为有用户登录的时候,不需要填写Email,也就不需要客户端更新的代码了。根据email的md5 hash值生成图片链接的代码,在末尾加了个参数”s=32″,是指定头像的大小,这个可以参考gravatar的官方说明。
JavaScript代码中要根据“avatar-preview”这个id来找到头像的预览并且更新它,因此这两个地方要统一。另外md5的JavaScript文件位置也要和引用的url统一起来,这样才能成功调用。
开始的时候考虑了一下要不要做成插件形式,想了想,评论框的修改还是得手动修改才够灵活,于是作罢。谁要是自己做主题,也可以按照这个教程把这个功能添加上。如有不清楚的地方,请在下面留言。
现在介绍这个似乎有点晚了,许多人都在用这个服务,不过我有点小用……
Gravatar(globally recognized avatar)是一个很不错的想法,用户在该网站上传头像图片之后,就可以被任何网站使用。只要用户在其它网站提供了email地址,这些网站就可以知道用户头像图片的地址。当然了,email地址并不会暴露在页面上,它是用email的md5 hash来确定头像地址的。
由于它十分流行,2007年10月18日被automattic收购。现在,wordpress已经内置了gravatar的支持,一切都是很自然的事情——当初Gravatar的流行,也依赖了wordpress广大的用户基础。
对于一般网站的开发者来说,现在头像对于用户是必不可少的一个功能。然而头像的上传、剪切、存储并不是小菜一碟。如果网站决定使用gravatar,那就会省了这道工序。更重要的是,对于一个起步中的网站,可能愿意主动上传头像的用户不会超过10%,因为在硬盘上浏览图片,找到合适的头像不一定是一件易事,而用户还没有确定他是否会在这个网站活跃。
所以gravatar对于开发者和用户都有帮助。如果你在wordpress搭建的blog(本blog即是)里留言发现别人的头像很cool而你的是默认,很有可能是人家使用了gravatar,赶紧去gravatar上传一张头像吧。
其实没更新啥,WordPress 2.7的评论功能大大增强,主要是增加了comment threading功能,而这一功能以前大部分blogger都是用插件Brian’s Threaded Comments实现的。我今天就抽了一点时间,去掉了插件,换用WordPress本身的wp_list_comment函数来显示评论。
晚上吃饭的时候,电视上都是迎接新年的气氛。而我回顾2008年,却感觉有点失败,一事无成。以后要把更多的时间用在工作和学习上了,尽量不做无聊的事。作为兴趣爱好,我会多看看PHP以及WordPress的东西。最近如果有时间,就写几篇关于WordPress 2.7的评论功能的文章吧。
今天打开自己的blog,发现那两个flash游戏自动播放很烦,我一时写文章不勤快了,就没有把它们埋下去,每次打开首页都听那么一遍。
于是<!–more–>派上了用场。把两篇文章分别编辑了一下,给flash嵌入的代码前面加上了more,这下首页没有了。话说,多亏我今天把电脑的静音取消了,要不还不知道用户体验这么差呢……
文章特别长的时候,这个特殊标签也非常有用,它会让blog的首页高度不会出奇地大。尤其是文中有大量图片的时候,前阵子从黄山回来,那些流水帐里不少就用了more标签。
首页默认是10篇文章,缩小每篇文章的高度,有利于读者更快地发现更多有意思的东西。
另一方面,首页的数据量也大大减小,页面加载速度大大加快,也提升不少用户体验。