Firebug 1.3与Ajax response

如果一个Web开发者从来不使用firebug甚至从未听说过,我真替他感到可悲。

昨天,Firebug 1.3正式发布release notes在Google code上可以看到,现在查找更新即可自动升级了。Firebug是Firefox的扩展,但是它本身也提供了良好的接口,已经有不少扩展了。1.3版本包含了一些对于扩展开发者非常有帮助的特性,然而对于我们普通的Web开发者用户,最期待的更新当属JavaScript debugger了。在一个inner function里单步的时候,你可以通过scope chain来查看function定义同级的变量值。

在调试Ajax应用的时候,用Firebug来查看Ajax请求的response即服务器端返回的响应是最方便的,省了使用HTTP抓包工具。然而从某个时间开始,Firebug的这一功能不再好用了,由于Firefox的一个内部实现问题,插件无法对响应进行分析。从这个讨论来看,应该是2.0版本,不过我记忆中似乎没这么早……症状就是,在console的Ajax请求列表中查看一个的时候,response里并不是服务器返回的数据,而是Firebug的一个提示,具体请看这个网页的第一张图片。要想看到response,Firebug必须重新发送这个请求,这在许多情况下是不现实的。

看到Firebug 1.3发布,我就在console栏里测试了一下Ajax的请求,惊喜地发现response已经可以查看了。

事实上能否查看response数据在于Firefox而不在于Firebug,所以Firebug新版本发布与之关系不是很大。在前面提到的图片中可以看到,Firebug给出了一个链接,指向一个proposal:

new nsHttpChannel interface to allow examination of HTTP data before it is passed to the channel’s creator

等这个proposal被实现,查看Ajax response的功能自然就恢复了。从该bug记录下面的评论来看,应该是在3.0.4版本就实现了。再看3.0.4修正的bug列表,果然430155就在里面。

好久没有调试Ajax应用了,这个功能的恢复还是挺好的。

Blog全新改版——白板

白板,开会、讨论用的白板。要是麻将里的白板,那下一个主题就是红中了。

主题中用到图片的地方,就尽量模仿成白板上写字的效果。似乎专业的美工做的时候,都是先把整个页面画出来,然后再切割,实现。我很不专业,先是日思夜想,把整个页面画在脑子里,然后就开始实现。

首先画出页面的边框(白板的框架),CSS里就写出header, content, sidebar和footer了。然后就盯着首页,把日志的样式调出来,sidebar的样式,接着把原来主题里的评论样式复制过来改改颜色,中间需要什么图片就随时画(不排除“窃”)。

最后就是最重要的header了。领导亲笔题词,给我开了个好头,让我的心里充满希望:

星月轮转 (by qingbo)

中间用bittbox做的免费白板字体弄了个类似tag cloud的文字组合,右边是一列订阅按钮。tag cloud里本来没有”RSS”的,后来加上订阅按钮以后,灵机一动,加了个”RSS”,又连了个箭头。一个全新的主题,就这样诞生了。

当然,不可避免地要加上“增强WordPress中的Gravatar应用”一文中介绍的小trick :) 接下来,慢慢地加一些实用的插件,改善用户体验。

在做主题的过程中,免不了又跟IE死磕一番。中间也巩固了不少知识,正所谓——越磨砺,越光芒。这些知识都是伟大的IE创造的。有那么两三刻,我都想在主题里针对IE用户放出一个banner:“我谨代表全世界受苦受难的劳苦大众,请求你弃暗投明,放弃史前怪物,使用非IE浏览器。”后来一想,我还得为了这个banner在IE里正常显示而折腾,算了,有空再说吧。

欢迎测试、指正。

鸳鸯锅的笑话

前阵子似乎是在水木看到的笑话,今天想给别人看的时候,网上却搜不到了。这样的经典,还是记录下来为好——这叫“备案”。据说是有人在火锅店看到的:

顾 客:服务员,你们这里的鸳鸯锅是多大的鸳鸯做的?
服务员:我们的鸳鸯锅主要是用的鸡汤……
顾 客:鸡汤啊,鸡汤也行。那给我来个鸳鸯锅,要不辣的。

如有误,请指正……

延迟发布Feed须谨慎

前阵子有人分享了一个延迟发布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)加上。

BANGEC852A4639967E2F93AD50BBXIANGUO
BANG004B23D38B0F7BB089F9BDD4XIANGUO
BANGE0FB3CE98688F38AFA7A9C4DXIANGUO

放弃Feed服务商,享受原汁原味的RSS

人在悲哀之中,才象一个人。
——孟德斯鸠

我们太像人了。

本来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输出静态化。

BANGB3A348BDD78150D425D1BF9CXIANGUO

post slug与SEO,中文blogger的困惑

今天在aw的blog看到他写的“中国Web工程师比美国人更厉害的4个原因”,讲了使用中文的计算机用户、以及面向中文用户进行开发的软件工程师需要额外修炼的法术——于我心有戚戚焉。当初在Linux里配置中文显示、输入的痛苦仍然记忆犹新,配置完系统又去配置特殊的软件;大部分的IDE把Ctrl+Blank作为代码提示的快捷键;……最近的ubiquity,也是以Ctrl+Blank作为呼出它的热键,并且其窗口会盖住中文输入法的候选窗口。尽管前辈已经把路铺得够平,我们已经足够幸福,中文在计算机世界里永远无法像英文一样简单、易用。

晚上吃了饭,又看见WordPress爱好者论坛里有人问日志缩略名的中文如何修改,我不知不觉就像唐僧一样罗里罗嗦回复了一大堆。
文章太长,请点此处继续阅读

增强WordPress中的Gravatar应用

如果你是点击了评论框旁边的“What?”帮助链接而来,推荐先看前一篇文章“Gravatar简介”。本文主要介绍如何用Gravatar来完善WordPress的评论框,实现这一功能,如果感兴趣并且已经了解Gravatar,请继续。

虽然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 JohnstonJavaScript 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简介

现在介绍这个似乎有点晚了,许多人都在用这个服务,不过我有点小用……

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上传一张头像吧。