Monday, April 27, 2009

收缩 Outlook 的 OST / PST 数据文件

今天发现 Outlook 里一年多的邮件都没有存档了,数据文件 outlook.ost 已经涨到了 500 多兆,于是执行了一下存档操作。存档的 .pst 数据文件一下子多出了 300 多兆,但奇怪的是原来的 outlook.ost 文件却没有减少。

搜索了一下,找到了有关的信息。OST / PST 文件是 Outlook 的数据文件,随着收到新的邮件和保存旧的邮件,这些文件会越来越大,当永久删除邮件和其它内容时,空间就会被空出来,直到收到新的邮件,这些空间就又被分配使用。处于安全的考虑,这些空余的空间不会立即被释放。当空余的空间占到文件总量 20% 以上以后,Outlook 会自动在系统空闲的时候执行收缩操作。所以在我执行存档操作以后,原来的 outlook.ost 文件没有立即缩小。

如果要手动执行收缩操作,可以如下图提示操作:右键单击要收缩的数据文件对应文件夹的根目录,选择“Properties” » 点击“Advanced...”按钮 » 选择“Advanced”标签 » 点击“Offline Folder File Settings...”按钮 » 点击“Compact Now”

收缩 Outlook OST 文件

Wednesday, April 22, 2009

[转]小姜杂谈:浅论英文字体

瘾科技上看到这篇文章,虽然寥寥几句,但是把字体的基本结构讲得非常清楚,因此特地摘录下来。另外由于原文可能是港台繁体中文的,用词和大陆简体中文不太一样,因此做了一些转换。

英文字体?反正就是在 Arial 和 Times New Roman 之间选一个嘛,偶尔想俏皮一点的话,就拿 Comic Sans MS 出来就好了,哪有什么值得写一篇文章的?小姜完全不是这方面的专家,但收集各种字体也算是小姜一个小小的爱好,所以多年来也学到了不少东西。虽然大家用到英文的机会不大,但其实英文字体里好玩的东西还不少呢!让小姜带大家一起来看看吧……每个字体都有五条线……

字体的五条线 / Fine lines of a font

这五条线,决定个一个字体的性格。Mean line 和 Base line 之间的距离叫做“x-height”,这个高度是一个字体中的英文字母 x 的高度,也是没有向上、向下伸展的部份的小写字的主体高度。Base line 向下有一条 Decender line,是 g, j 之类有向下伸展的笔画的字母延伸的极限。反之,向上延伸的部份,包括 f, b 的字母向上延伸的笔画和 i, j 的点的极限,则称为 Ascender line。最后还有一条 Cap line 是大写字母向上延伸的极限,在许多字体中(像上面的 Times New Roman 就是)Cap line 的高度会略低于 ascender line,但也有一样高的。Mean line 和 Ascender line 之间的距离叫“Ascender”,Base line 和 Decender line 之间的距离叫“Decender”,Base line 和 Cap line 之间的距离叫“Cap height”,而 Ascender line 和 Decender line 之间的距离则叫做这个字体的“Point size”,也就是我们在选字号的时候说的几 pt。

为什么说这五条线决定字体的性格呢?通常 x-height 占 point size 比例愈高的字体,放在内文里的时候看得比较清楚,但放在标题就很难看。反之,x-height 占 point size 比例小的字,就比较适合当标题。以下面这个例子,小姜找了两种类似的字体,但左边是设计来当标题用的(Garamond),而右边则是做内文用的(Times New Roman)。注意到 x-height 的分别了吗?

Garamond V.S. Times New Roman

应用在真实世界,会变成这样:

Garamond V.S. Times New Roman

有注意到下面的一组字看起来比较大吗?实际上小姜是用一样的 pt 数下去设的(大字是 96pt,小字是 12pt),为什么会这种差别?因为先前说过了,pt 数管的是字体从 Ascender line 到 Decender line 之间的距离,所以当 x-height 比较短(即 ascender 和 descender 比较长)的时候,通常字体设计师会减少每个字母的宽度,以避免字母变形。直接的结果就是虽然 pt 数一样,但 x-height 短的字会看起来比较小。下面是个比较极端的例子:

Park Avenue V.S. Tahoma

左边的字体是 Park Avenue,右边则是常见的 Tahoma。在设定上两者的 pt 数是一样的,但右边的 Engadget 看起来显然大多了!

其实字体和排版当中能讲的题材还有不少,如果有机会的话,再来和大家分享啰!

另外,在文章后面的评论中,有网友推荐了一个用中文写的关于字体排版印刷的 Blog:Type is Beautiful / 字体排印,内容专业、丰富而又深入浅出,不管是编辑、平面设计师等专业人士用来参考或者非专业人士用来拓宽知识面,都非常值得推荐。

Monday, April 20, 2009

Blogger 的评论 Feed 中去掉了 URI

最近发现每篇文章下方评论的作者都没有了 URL 链接,即使是我自己确认添加了链接的回复评论也是如此。

因为评论的现实是利用 Blogger 基于 JSON 格式的 Feed,于是仔细研究了一下 Blogger 给的 Feed 的内容,发现 author 字段里面的 uri 属性被去掉了。

评论链接有效的时候,Feed 中关于作者的 JSON 代码是这样的:
"author":[{"name":{"$t":"Gregory"},"uri":{"$t":"http://blog.windia.net"}}]
而现在改成了:
"author":[{"name":{"$t":"Gregory"},"email":{"$t":"noreply@blogger.com"}}]
其中无论是谁评论,email 字段的地址一律都是 noreply@blogger.com。另外也看了 XML 格式的 Atom 输出,uri 属性也同样被替换成了 email

Google 会做如此变更,目的还不得而知。如果是和反垃圾评论信息有关的话,链接的内容仍然可以放在评论正文中。

另外,blogger.com 网站上的评论页面仍然可以正常显示作者的链接,因此这个信息应该还是存在于 Blogger 的数据库中的,只是没有在 Feed 中输出。

Update at 18:41 on 2009/04/20:

下午发现这个 Blog 的评论作者链接显示正常了,而我的另一个 Blog 今日无大事还是没有链接,打开 Feed 的内容下来分析,发现 author 字段的内容已经又更新了,新的内容为:
"author":[{"name":{"$t":"Gregory"},"uri":{"$t":"http://blog.windia.net"},"email":{"$t":"noreply@blogger.com"}}]
目前是 uriemail 都有了。接下来怀疑另外一个 Blog 显示不正确是缓存问题,没道理用同样的 Feed 接口,不同的 Blog 站点内容格式不同。通过添加一个无意义的附加参数改变 Feed 的 URL,则两个 Blog 都能正确显示评论作者的链接了。之前缓存问题,是由于国内目前 Feed 的地址被墙,我通过另外一台在国外的服务器帮助取得内容再 forward 过来,缓存在那边,所以刷新无效。

看来这应该是一个 bug,只是被 Blogger 很快的修复了…… 在 Known Issue 网站上并没见到相关的说明。

Friday, April 17, 2009

SAMSUNG 手机安装 MIDlet 出现“内容不匹配”

昨天通过 OTA 方式从 Apache 服务器上在一部 SAMSUNG SGH-L760 上安装 MIDlet,下载完 JAD 确认安装,开始下载 JAR 之前,手机报错说“内容不匹配 (Content mismatch)”。同样的 JAD 和 JAR 在另外一个主机上就能成功下载安装,而且这一组 JAD 和 JAR 在同服务器上另外一个 HTTP 服务应用上也能成功安装,一时觉得纳闷。

开始怀疑是端口问题,因为出现安装错误的 Apache 服务器是运行在 82 端口上的。但是同样是从这个 Apache 服务,另外一部 SonyEricsson K610i 就能正常下载安装,而且如果是端口问题,没道理 JAD 能下载而 JAR 不能。

然后开始怀疑是 JAR 文件的 Content-Type 问题,因为在确认安装的界面上,有显示应用类型是 application/vnd.sun.j2me.java-archive。打开 Apache 的配置文件 /etc/httpd/conf/httpd.conf,发现没有定义 .jad.jar 文件的语句,于是添加如下两行:
AddType text/vnd.sun.j2me.app-descriptor .jad
AddType application/vnd.sun.j2me.java-archive .jar
然后重启 Apache 服务,问题解决。MIDlet 成功在 SAMSUNG SGH-L760 上安装了。

Friday, February 06, 2009

Erlang 程序设计

过完年后接了新的工作范畴,要接触到 Erlang 语言。虽然我可能不会直接参与 Erlang 的开发,但是作为我负责的内容,必然是要了解的。

Erlang 程序设计

想到前段时间在大笨熊的 Blog 上看到过一篇关于 Erlang 书籍的文章,去找了出来,可巧是他认识的人翻译的。到卓越上搜了一下,竟然只有这么一本书,既然没得选,那就它吧……

等我买回来看了再分享跟多的心得……

Friday, December 05, 2008

Google Friend Connect 开放注册

前天 Google 官方 Blog 报道,发布了其 SNS 项目 Google Friend Connect大笨熊的 blog 也提到这条消息。今天收到了 woainiuniu 的邀请,在这里谢过了。现在似乎已经开发注册了。

Google Friend Connect 可以让网站管理员在他们的网站增加一些社会性的功能,允许访客注册并加入到网站,显示自己的头像图标,查看其他已经加入的访客以及他们在 Friend Connect 上的活动。全部工作只需要简单复制粘贴几段代码即可,不需要复杂的编程技术。网站应用了 Friend Connect 以后,可以给网站添加各种 Widgets 实现评论、留言、投票等功能,这种类似的小工具也在不断的增加中。

本站已经注册并添加了 Friend Connect 功能,左边栏较下方的“Friends”便是,欢迎各位朋友加入本站。如果您自己也有一个 blog 或者网站的话,也可以加上这个简单易用的 Friend 功能。

在左边栏较下方的“Friends”区域点击 'Join This Site' 按钮即可通过 Google Friend Connect 加入本站
在左边栏较下方的“Friends”区域点击 'Join This Site' 按钮即可通过 Friend Connect 加入本站

Blogger 用户如何安装 Friend Connect?

如果你用的刚好是 Google 的 Blogger 而且是 Blogspot 或者 Custom Domain 用户,那要如何安装 Friend Connect 呢?这看起来是不可能的。因为安装过程要求用户上传两个 html 文件到网站根目录下,而我们显然不可能直接上传文件到 blogspot 服务器。

但事实比我们想象的简单,会有这个疑问是因为 Friend Connect 那个安装界面解释的不够清楚。事实上,当你在注册并安装 Friend Connect 时,如果提供的网站地址是一个 BlogSpot 网站,或者其 Custom Domain 的网站,那么这两个文件就会被自动上传。也就是说你可以直接跳过这一步,什么都不用做,在 finalize 的时候直接就通过验证了。

什么?你问这么隐秘的事情我是怎么发现的?呵呵,好吧,其实我是 Google 到了这篇文章:How to install Google Friend Connect on Blogger

Saturday, November 15, 2008

你博客的 ping 列表真的全在工作吗?

我们知道在博客发表文章时,可以利用 XML-RPC 技术将更新通知到各种 Blog 的服务商、搜索引擎等,好让它们主动来抓取,从而提高博客文章被收录的速度和范围。

Google 的 Blogger 不像 WordPress,后者提供了一个方便的 Update Service,只要将 Blog 服务商公布的 XML-RPC 接口地址填进去就可以方便的在发布的时候 ping 这些地址。Blogger 只是在 Settings » Basic 有一个“Add your blog to our listings?”的选项,解释说选择了“Yes”,Google Blog Search 以及 Weblogs.com 就会来收录,除此之外并没有一个可以设置 ping 接口地址列表的地方。

我强烈怀疑 Blogger 这个选项的作用,因为曾经有很长一段时间 Google Blog Search 都没有收录我的文章,后来为了确保收录效果,每次发布文章后我都手工 ping,于是通常 5 分钟内文章就会被收录,而 10 分钟左右,Google 的网页搜索也会收录这篇文章(观察到的最快纪录为 8 分钟)。但是每次都要手工去 ping 确实很麻烦,于是今天就琢磨着自己用 PHP 写一个简单的 XML-RPC 客户端来做这个工作,顺便还可以把其它主流的 ping 服务地址加进去,批量执行。

结果是不试不要紧,一试吓一跳。我参考 Weblogs.comGoogle Blog Search 提供的标准 ping 操作 API 文档写了一个 XML-RPC 的客户端,测试了一下主流的 ping 服务地址列表,发现其中有很大一部分都不能正常工作。
http://blogsearch.google.com/ping/RPC2
http://rpc.pingomatic.com/
http://api.my.yahoo.com/RPC2
http://api.moreover.com/RPC2
http://rpc.newsgator.com/
http://rpc.weblogs.com/RPC2
http://www.feedsky.com/api/RPC2
http://ping.feedburner.com/
http://rpc.technorati.com/rpc/ping
http://ping.blog.qikoo.com/rpc2.php
http://blog.iask.com/RPC2
http://www.xianguo.com/xmlrpc/ping.php
http://www.zhuaxia.com/rpc/server.php
以下就来一一看一下 ping 这些地址得到的具体结果。
以上这些地址中,能够完全按照标准 API 正常工作的有:
http://blogsearch.google.com/ping/RPC2
http://api.my.yahoo.com/RPC2
http://api.moreover.com/RPC2
http://rpc.weblogs.com/RPC2
http://rpc.technorati.com/rpc/ping
以下是其它有问题的 ping 接口的具体情况。
http://rpc.pingomatic.com/
这是一个十分有名,被博客界所有人争相 ping 之的地址,但是,真的有人见过它返回正确的结果吗?我试了很多次,无论是请求 weblogUpdates.extendedPing 方法,还是weblogUpdates.ping 方法,无论是提供两个参数还是三个、四个参数,它返回的 HTTP 头永远只会是“501 Not Implemented”,正文部分没有任何内容。我另外还试了 http://rpc.pingomatic.com/RPC2http://pingomatic.com/ 两个地址,得到的结果一样。
http://rpc.newsgator.com/
这个地址存在大家的列表中,我感到非常诧异,因为这个域名都已经不存在了,我换了很多个 DNS 服务器都不能解析出它的 IP 地址。后来发现了 NewsGator 的另一个 ping 接口:
http://services.newsgator.com/ngws/xmlrpcping.aspx
经过测试,这个是可以正常工作的。
http://ping.feedburner.com/
起先 FeedBurner 的接口很长时间都不返回,纳闷了很久;细查之下,发现 ping.feedburner.com 这个域名做成了 feeds.feedburner.com 的 CNAME 纪录,而众所周知后者已经被墙,所以实际上这个 ping 接口是没有办法直接通知到的,除非发起 ping 动作的客户端在国外运行。
http://www.feedsky.com/api/RPC2
Feedsky 趁着 FeedBurner 被封在国内很是火了一把,可是做事情的态度和质量还是和人家有差距。首先是没有实现 weblogUpdates.extendedPing 方法,而在请求 weblogUpdates.ping 方法时,返回的结果也很不稳定。有时是正常的结果,有时会以错误码 304 将整个 Feed 的内容放在 message 字段中返回,有时又干脆什么都不返回。
http://ping.blog.qikoo.com/rpc2.php
这个似乎是奇虎官方给出的地址,而几乎网上搜到的所有 ping 列表中都有它。奇怪的是,这个地址根本打不开,HTTP 状态码为 404。我曾经猜测是不是大家在传抄过程中不小心弄错了大小写,于是也试了 RPC2.php, RPC.php, rpc.php,结果都是 404。
http://blog.iask.com/RPC2
新浪这个表面看起来很不错,相应速度很快,返回的 XML 格式也很标准。可是无论怎么提交,返回结果都是 flerror: 1; message: sorry,failing。以至于让我怀疑,这个接口背后的后台程序真的有在运作吗?
http://www.xianguo.com/xmlrpc/ping.php
发出请求大约 5 秒钟后,返回如下内容:
Fatal error: Call to undefined function xmlrpc_server_create() in /opt/lamp/code/common/rssreader-common-2008-11-12-14-31-18/topgene/feed/xmlrpc/server.php on line 15
怎么?PHP 的扩展库都还没配置好就当公共运营的服务器了?而且还直接把错误信息输出到页面上,服务器路径信息一览无余。鲜果啊鲜果,让我说你什么好哇!
http://www.zhuaxia.com/rpc/server.php
抓虾比鲜果好点,至少还返回了,只不过不知道返回的是啥。返回结果如下:
<?xml version="1.0" encoding="utf-8"?>
<methodResponse>
<params>
 <param>
  <value>
   <boolean>0</boolean>
  </value>
 </param>
</params>
</methodResponse>
如果说你看不懂 Weblogs.com 的英文文档倒也情有可原,但是照着 Google 的中文文档依葫芦画瓢总会吧?自己想当然的随便弄一下就完事了?
由以上可以看出,大公司终究还是大公司。令人深思的是,这些不能正常工作的接口中,几乎全是国内的服务商,其中有些暴露出来的问题,更是令人汗颜。

Friday, November 07, 2008

Google 手机地图 2.2.1.5 发布

最近几天在国内的 IT 媒体纷纷报道 Google 手机地图发布了最新版本。原本还在纳闷九月底的新闻怎么现在大家才反应过来,后来看到 Google 黑板报消息,Google 手机地图 2.2.1.5 发布了。和之前发布的 2.2.0 版本相比,除了已经有的“我的位置”、“行车路线”和“公交换乘”功能意外,显著的改动就是增加了“实时路况”功能,可惜目前只支持北京和上海两个城市,希望支持的城市能够逐渐多起来。

在自己的手机上试装了一下 Symbian S60 v3 版本,中文版安装时显示的系统版本号为 2.02(1),之前版本为 2.02(0);安装完毕后“关于”界面显示版本号为 2.2.1.5。测试地点和上次一样,而这次利用 GPRS 基站信号定位的地点比上次更接近于实际位置,相差大约为 20 米,可能是因为所处位置并不在道路上。上次定位于实际相差至少 100 米,不知道这次版本升级对“我的位置”定位是否也做了改进。

由于“实时路况”功能尚不支持成都,开启后显示“正在加载路况信息……”不久显示“无此处的路况信息可用”。待以后支持成都市地图后再行测试。

另外顺便也安装了一下英文版,版本号为 2.02(0),仍然和上次一样,安装后 About 页面显示版本号 2.2.0.13,但功能上也多出了“Traffic Info”选项,开启后出现的情况和中文版一致。

Tuesday, October 28, 2008

向微软 Live Search 提交 Sitemap

作为 Webmaster,您一定知道 sitemap;您应该也知道使用 Google 的网站管理员工具来提交 sitemap 让 Google 收录您的网页;您或许还知道 Yahoo! 具有同样的站长工具(及其英文版)。

最近发现微软还在 beta 测试中的 Live Search 也推出了这样方便站长的工具 Webmaster Center


和 Google 及 Yahoo! 的类似,以上 Webmaster Center 工具会让您提供网站的入口地址和 sitemap 地址,然后 Live Search 会提示您下载一个 LiveSearchSiteAuth.xml (文件名真是个微软特色十足啊)文件,其中含有和网站对应的校验码。上传至您网站的根目录,使其能够用
http://www.mysite.com/LiveSearchSiteAuth.xml
这样的形式访问到即可。过一段时间 Webmaster Center 就会自动处理您提交的 sitemap 了。

对于已经录入过的网站,可以在 Site List 页面上的站点列表中点击网站地址的链接进入每个网站查看具体信息,包括摘要、属性、抓取问题、反向链接、链出链接、关键字和网站地图等信息。当网站地图发生改变时,可以通过 Ping 地址
http://webmaster.live.com/webmaster/ping.aspx?siteMap=[your sitemap web address]
来主动通知 MSNBot。

相信有了这个工具后,我们的网站就更容易被 MSN 和 Live Search 收录了。如果您的网站有 sitemap 而还没有提交给 MSN,不妨试一下这个办法。

Friday, October 24, 2008

挑战 XHTML 的 Strict 标准

我的 Blog 网页在 Doctype 声明上一直使用的是 XHTML 的 Strict 标准,当初在模板制作完成时是校验过的,可是随着后来无数次的修改、内容添加,现在已经不能通过 W3C 的语法校验了,加上 Google Blogger 在发布页面的时候似乎也并没有考虑目标模板的 Doctype 标准,也部分导致校验的失败。

经过一个下午的努力,终于基本上解决了所有 XHTML 的语法问题,总结如下。
<a> 标签没有 target 属性
在 Strict DTD 里面,超链接 <a> 标签 没有 target 属性,因此不能利用 target="_blank" 这样的代码来达到新开页面打开链接的目的。为了实现同样的功能,通常的办法是用 rel="external" 来替代 target="_blank",然后用如下 JavaScript 代码来处理链接:
function externalLinks() {
var linkArray = document.getElementsByTagName('a');
for (var i = 0; i < linkArray.length; i++) {
var link = linkArray[i];
if (link.getAttribute('rel') == 'external') {
link.target = '_blank';
}
}
}
然后将该 externalLinks() 函数添加到页面的 onLoad 事件中。如:
<body onload="externalLinks();">
<img> 标签必须添加 alt 属性
对于 <img> 标签来讲,alt 属性是必须的。给图片添加 alt,一方面当图片因为各种原因无法显示的时候,能给访问者以提示;另一方面也便于搜索引擎判断图片的内容,以及更准确的建立索引。
<img> 标签没有 border 属性
<img> 标签是没有 border 这个属性的。我们通常会加上 border="0",主要是因为把图片放在链接标签 <a> 里时,浏览器会加上一个链接默认颜色的边框,而这通常是多余的。在 Strict 标准中,不能用 border 属性来去掉边框,而只能使用 CSS 控制。同样 align 属性也是不存在的,要实现 absmiddle 这样的目的,也只能用 CSS 代替。
<blockquote> 标签内必须使用 block 级别的标签
<blockquote> 标签用来在页面上表示引用的内容,例如,最常见的,引用代码。我通常习惯将代码的内容放在 <code> 标签中,而这个标签是 inline 级的,不符合 Strict DTD 的要求。<strong>、<b> 等同样会导致问题。符合要求的 block 级标签包括:<address>, <blockquote>, <del>, <div>, <dl>, <fieldset>, <form>, <h>, <h2>, <h4>, <h5>, <h6>, <hr>, <ins>, <noscript>, <ol>, <p>, <pre>, <script>, <table>, <ul>。
不能使用 <embed> 标签
这个问题最容易出现在引用外部媒体文件时,例如 MP3 音乐、视频等。很多资料推荐同时使用 <object> 和 <embed> 来增强媒体引用元素的浏览器兼容性,但是很不幸的,Strict DTD 并未定义 <embed>。其实我们完全可以不使用 <embed> 一样能够兼容浏览器。例如 Youtube 给的代码一般是这样的:
<object width="425" height="344">
<param name="movie"
value="http://www.youtube.com/v/uhsjNTEJD3c"></param>
<param name="allowFullScreen" value="true"></param>
<embed src="http://www.youtube.com/v/uhsjNTEJD3c"
type="application/x-shockwave-flash"
allowfullscreen="true"
width="425" height="344"></embed>
</object>
这样无法通过校验。我们可以改成:
<object type="application/x-shockwave-flash"
width="425" height="344">
<param name="movie"
value="http://www.youtube.com/v/uhsjNTEJD3c"/>
<param name="allowFullScreen" value="true"/>
</object>
实体用法问题
在 XML 中,实体的写法是 &entity;,以一个 & 符号开头,一个分号结束。因此,Strict 标准的 XHTML 里面不允许出现任何单独的 & 符号,即使是在 URL 中用来分隔查询参数。需要用到这个符号的时候,要用 &amp; 来表示。通常一个实体用法的错误会同时导致 5 个校验时的错误,当解决以后,这 5 个错误会同时消失。由于 Blogger 在发布页面时 URL 直接使用了 & 符号,因此会直接导致 Strict 标准的 XHTML 校验失败。
重复的 id 值
对于 XHTML 标签来讲,id 属性的值必须唯一,如果一个文档中出项重复的 id 就会导致问题。出现这种问题,通常是把 id 属性放在了 Blogger 模板会循环输出的部分。
另外,Blogger 提供的模板中,backlinks 那一部分会导致 4 个不同类别的问题。凭心而论,Blogger 模板在 backlinks 这一块的代码实在写的很烂,用了三个不同的 js 文件,用 JavaScript 输出 CSS,不但使得不同模板之间难以更改这一部分显示的样式,也导致了很多 XHTML 的语法校验问题。例如 Blogger 自己的 Buzz,打开任一个文章的独立页面的源代码,Doctype 声明赫然是 XHTML 1.0 Strict,然而 backlink 那一块的代码不用校验也能看出漏洞百出。

Blogger 目前版本的网站出自著名设计师 Douglas Bowman 之手,其本人对 XHTML 以及 CSS 有着非常深刻的研究。在设计之初,Blogger 还没有 Backlinks 的功能,显然这个蹩脚的 Backlinks 是后来由其他人加上去的。不知道 Bowman 先生在看到这一幕后会做何感想。

Google 黑板报用的是同样的 backlink 代码,不过比 Buzz 知趣的是它的模板干脆去掉了 Doctype 声明。只不过作为 Google 旗下的网站,页面连 Doctype 声明都没有,也是一件汗颜的事情。

言归正传,以下列出 backlink 这部分代码导致的问题以及解决方法。
<div> 和 <dl> 之间的嵌套问题
在 Blogger 给出的默认模板代码中,是用 <dl> 来实现反向链接列表的;可问题在于,他们将 <BlogItemBacklinks> 放在了 <dl> 之内,而在生成页面时,会将 <BlogItemBacklinks> 这一对模板标签替换成一对 <div> 标签,从而导致 <div> 被嵌套在 <dl> 内。在 Strict DTD 里,<dl> 标签内只允许出现 <dt> 和 <dd> 两个子标签。解决办法是把 <BlogItemBacklinks> 放到 <dl> 外面,当然这样虽然让 XHTML 语法通过校验,但实际的运行结果,会导致每个反向链接条目会占用一个 <dl> 块,而不是预期的放在循环的若干个 <dt> 和 <dd> 中。通过 CSS 可以解决条目之间间距的问题。如果要完美解决这个问题的话,就只有自己重写 Blogger 提供的 JavaScript 函数来改变这一行为了。
<script> 标签的 defer 属性
在 Blogger 用模板生成页面时,除了将 <BlogItemBacklinks> 替换成一对 <div> 以外,还会在开标签的 <div> 之前加上一个 <script;> 用来引入相关的 JavaScript,同时给出了一个 defer="true" 属性,然而,根据 Strict DTD,defer 属性只能有一个值,只能是 defer="defer"。
<noscript> 内只能用 block 级别标签
在生成以上 <script> 标签的同时,Blogger 给出了一个 <noscript>,用来当浏览器不支持脚本的时候显示一个 Blog Search 的链接。可是 <noscript> 标签内只能用 block 级别的标签,直接用 <a> 这样的 inline 标签是不行的。
模板占位符问题
在模板中这段关于 backlink 的代码中,Blogger 用了一些模板标签作为占位符。通常模板标签会在生成具体网页时替换掉,但这里的占位符不会,它们要在实际生成 backlink 条目时被 JavaScript 程序换掉。但是在做 XHTML 语法校验时,这些占位符以 HTML 标签的形式存在于代码中,而又显然不属于 XHTML 定义的范围,从而导致校验失败。解决办法是将它们的尖括号转移,写成诸如 &lt;$BlogBacklinkTitle$&gt; 的形式,这样既能够被 JavaScript 成功识别,保证功能正常,又能通过 Strict 语法校验。要特别注意,其中 <$BlogBacklinkDeleteIcon$> 不要转义,这个模板标签是在页面生成时被替换的,而不是 JavaScript 的数据占位符。
最后,Google 黑板报最近也发布了一篇关于互联网标准性的文章,这篇文章也提供了很多关于改进网站 HTML 代码的参考信息。