Thursday, March 04, 2010

Blogger FTP 迁移工具发布 0 条评论

今天下午 2 点左右,Blogger 专门发布 FTP 功能关闭及转移相关信息的 Blog “Blogger FTP Info”发布消息说 Blogger FTP 的迁移工具上线了Twitter 上的 Blogger 官方帐号也同步发布了这条消息。

目前这个迁移工具还在试用和观察阶段,因此仅在“Blogger in draft”有效。如果你的 Blogger 是基于 FTP 发布且开启了 Blogger in draft,那么现在登录你的 Dashboard,就会发现如下图的一块提示信息,告诉你 FTP 发布功能将会关闭,建议迁移到 BlogSpot 或者用 Custom Domain 功能代替。

Blogger FTP 移植工具提示框

消息以及以上提示框中都提到,FTP 发布功能停止的期限是 2010 年 5 月 1 日,比起先前通知的 2010 年 3 月 25 日,期限又宽限了一个多月。

这则消息还提供了一个视频,用来指导用户如何使用迁移工具对 FTP 发布的 Blog 进行迁移。主要包括以下步骤:
  • 用户选定一个 BlogSpot 二级域名或者 Custom Domain 的域名
  • 如果是 Custom Domain,则需要把自己选定的域名的 CNAME 记录指向 ghs.google.com
  • Blogger 根据用户选定的方案和域名创建新的站点
  • Blogger 向原 FTP 服务器重新发布所有的页面,给所有 HTML 页面添加两条标签:rel-canonicial,用来指示页面的新 URL;meta-refresh,当读者访问旧页面时自动跳转到新的 URL。如果文章数量很多的话,该操作会花费很长时间。工具提供了一个选项,可以让该操作完成时发送邮件通知你。
  • Blogger 向原 FTP 服务器发送一篇新文章,告知所有的读者该 Blog 发生了迁移,同时也通知所有的订阅读者更新订阅地址
  • Blogger 随机请求一些原 FTP 服务器上的页面,确保迁移跳转的内容添加成功
  • 迁移完成,读者用新的地址访问 Blog

总的来讲迁移过程还算简便,对原 Blog 的影响应该说也降到了最低。但其中涉及到重新发布所有页面的环节,对于文章数量很多的博主来说,这个过程及有可能会中断或者失败。至少最近几个月以来,我发布文章时,FTP 上传操作几乎没办法一次成功,更何况是重新发布整个 Blog。

我之前有篇文章提到 Blogger FTP 发布功能关闭的应对措施,因为 BlogSpot 和 Custom Domain 功能在国内都因被墙而无法使用,另外 Blogger 提供的 Layout 模版管理对于我来讲仍然不够灵活,没有对整个网站所有文件的完全控制权,因此我无法,也不会将目前 FTP 发布的 Blog 迁移到 BlogSpot 或者 Custom Domain。解决方案是利用 Blogger 提供的 Feed 接口将所有文章数据同步到本地数据库,然后自己写一些 PHP 脚本利用这些数据直接在服务器上生成静态 HTML 文件。这样,既可以继续使用 Blogger 网站来编辑文章,保存文章;读者访问时直接访问静态页面或使用本地数据库,页面打开速度仍然有保证;我也可以按照自己的方式随心所欲编辑模版,开发各种功能,可谓一举数得。目前这个工作已经开始了,加上 Blogger 又宽限些时间,因此一定可以赶在 FTP 发布功能失效前完成。

Labels: , ,

Monday, January 25, 2010

Blogger 将关闭 FTP 发布功能及应对措施 6 条评论

Blogger Buzz 上周末发布消息称 Blogger 将于 2010 年 3 月 26 日停止 FTP 发布功能,原因是目前所有的活跃 Blogger 用户中,仅有 0.5% 的用户使用 FTP 发布,而 Blogger 用于支持这一功能的资源则远超过这个比率。

我的 Blog 从 2005 年开始就一直使用 Blogger 的 FTP 功能发布,已经有四年多的时间,也因为这样所以一直可以相对正常的访问。说“相对”是因为 blogger.com 域名被封,时不时的也会引起页面的外部 CSS / JavaScript 资源无法访问,Feed 内容无法访问引起评论失败等问题。现在 Blogger 官方宣布将彻底停止 FTP 功能的支持,将会对我这两个 Blog 带来四年来最大的一次冲击。

不过可以肯定的是,我不会关闭这两个 Blog,也不回搬家到别家 BSP。其实最近一两年,随着文章数量的增加,利用 FTP 发布已经变得越来越困难,平均十次发布,至少要失败五次。而按现在 Blogger 的机制,无论是发布文章还是有网友发表评论,首页、文章页面以及相关的标签页面都会重建,如果修改模版,则所有的页面都需要重建,这样高的失败率,让人很难觉得这是一个好用的产品。

由于页面代码优化的需要以及应对 blogger.com 域名从国内无法访问的问题,我已经建立起一套机制实现从 Blogger Feed 下载文章的数据保存到本地数据库,用 PHP 扫描页面进行 XHTML 修改以及用 AJAX 获取相关文章 / 热门文章的功能,现在其实要保持 Blog 继续正常运行,只需要:
  • 在数据同步时将正文部分也下载
  • 利用下载的数据在本地用 PHP 重写 Blog 内容,或生成静态页面

这样不但免去了等待漫长的 FTP 发布以及高失败率的问题,也让我维护 Blog 变得更加灵活。

离 Blogger 停止 FTP 功能还有大约两个月的时间,我想已经足够我做这些改进了。

Labels: , ,

Wednesday, July 08, 2009

Gmail 结束 Beta 0 条评论

Gmail Out of Beta
Google 官方博客及 Twitter 上的 @google 昨晚都发布消息,称 GmailGoogle DocsGoogle Calendar 以及 Google Talk 结束 Beta。“Beta” 标记将从这些产品的 LOGO 中去除,但无论是否 “Beta”,Google 都将继续对这些 WEB 应用程序进行创新和改进。

记得自己在 Gmail 刚推出的时候,就收到邀请注册了,并一度做为自己的主要私人邮箱使用,已经有很多年了。(据 Solidot 文章,Gmail 于 2004 年 3 月 31 日推出,所以到现在已经有 5 年多了。)

一项以及多项相关产品有如此长的 BETA 期,这是很少见的。加上我所在公司的其它部门曾经做过 Android 平台 API 的单元测试工作,据说该平台自推出后的很长一段时间,该 API 中 bug 非常多且 API 文档混乱。另外据我多年使用 Blogger 作为博客平台的经验,其 bug 之多也是在公众运营的产品中遥遥领先的。

尽管 Google 的创新能力和“不作恶”是另世人和广大互联网用户称道的,但以上事实也让我非常怀疑 Google 内部的代码质量控制。现在此四项产品的最终结束 Beta,应该可以说对 Google 的形象起到了长远的积极作用,也希望 Google 能为我们提供更多更稳定更惊艳的互联网产品。

Labels: , ,

Wednesday, July 01, 2009

<Blogger> 模板标签生成奇怪 Javascript 2 条评论

昨天由于有新的评论,有一篇帖子的页面被重新生成,然后页面就出现了一些奇怪的问题。仔细查看源代码后,发现在生成页面的时候,模板里面所有的 </Blogger> 标签的画面,都被加上了一段奇怪的 JavaScript 代码:
<script type="text/javascript" src="http://www.blogger.com/static/v1/common/js/327583163-csitaillib.js"></script>
<script>if (typeof(window.attachCsiOnload) != 'undefined' && window.attachCsiOnload != null) { window.attachCsiOnload('ext_blogspot'); }</script>

重新发布了几次仍然是这样,因此推测可能是 Blogger 做了更新。在 Google 上搜索了一下,发现很多 Classic Template 的使用者都发现了相同的问题,并且报告在 Blogger 的 Google Groups 帮助讨论组,如这篇帖子,还有这里,以及这里。虽然有很多网友提出了各种临时的解决办法,但看起来都不尽如人意。

个人认为 Blogger 这个新的功能添加得不够专业。先且不论是什么功能,光是直接在</Blogger> 标签后加入 <Script> 就不可取,因为 Blogger 这一对标签里面包括和帖子相关的数据,页面上凡是需要帖子标题、ID、时间等相关信息的地方都会用到这一对标签,它可能出现在标题、正文甚至其它的 JavaScript 中(例如我就需要通过这对标签取得帖子的 ID 并作为参数传给 JavaScript 函数)。

目前暂时通过人工编辑 HTML 去掉了相关的 Script,如果近期 Blogger 不能解决这个问题的话,就只有另外写 PHP 程序来自动处理了。

Update July. 2, 2009:

这篇帖子中一位来自 The Blogger Team 的用户提到,这的确是他们发现的一个 bug,将很快被修复。让我们拭目以待吧……

Update July. 8, 2009:
这位来自 The Blogger Team 的用户提到,他们已经在 Blogger 的 Known Issues 网站上记录了这一问题以便跟踪。从该帖内容来看,他们只认为问题只出在不该在 <title></title> 之间输出 script 内容。难道他们不知道这一对 <Blogger></Blogger> 还可能用在用户自己定义的 JavaScript 中吗?

Labels: , , ,

Friday, June 19, 2009

GFW 开始识别 WEB 代理 3 条评论

之前提到用 HTTP 中转的办法解决了评论的问题,今天发现 Blog 上所有的评论又失效了…… 开始以为是因为页面直接引用了 www.blogger.com 域名的某些内容而导致撞墙,但仔细分析后发现,我的 HTTP 中转直接不能访问了,而且之后我的 HTTP 中转程序所在的域名也会在一小段时间内无法访问…… 但同时,用该中转能够访问原本没有被封的内容,比如 Flickr……

考虑到传入的目标 URL 参数是用 Base64 和 URL Encode 方式处理的,不存在任何加密,而且这和大多数的 WEB 代理相同,所以推测是现在 GFW 能够识别用 Base64 编码的内容,如果该内容刚好是被屏蔽的网址,则阻拦该 HTTP 请求,并且屏蔽该请求所在的域…… 从而让公众无法通过 WEB 代理访问屏蔽内容。

当然,解决的办法也简单,如果不能简单通过 Base64 decode 得到一个 URL,那么它也就无从判断是不是被屏蔽的网址了……

我起先想直接把原网址按位取反再 Base64 就行了,结果同事说我作为一个 IT 人士这么干太低级了…… 他们说用 RSA 吧,但是也犯不着这么兴师动众吧……

还是 Liuming 小弟比较聪明,提供了一个比按位取反高级,又比 RSA 简单的办法,那就是……

两次 Base64…… >.<"e;

Labels: , , ,

Wednesday, June 03, 2009

某墙疯了 0 条评论

那墙一定是疯了…… Blogger 被封这个倒也在预料之中,毕竟这是常有的事,封着封着咱就麻木了。可是昨天开始 twitter.com、live.com、bing.com 都不能访问了,就连好不容易解封的 flickr.com 也在其列,直接导致我的 Blog 上的照片全是红叉叉……

可怜那 bing.com,前天中央电视台新闻还在大张旗鼓的给它做宣传,昨天刚上线一天,我想这两天人们应该是蜂拥而至来看一下微软这新一代和 Google 叫板的搜索引擎,正是保证稳定性争取良好公众印象的时候,结果就被封了。等过几个月解封的时候,不知道还有多少人记得 bing.com,也不知道中央电视台会不会配合微软再做一次新闻?

还有 flickr,害我不得不写程序把所有页面里的照片网址找出来,用 HTTP 代理的地址替换掉,才能保证网页上不是满目疮痍。不过也认了,反正不封从电信访问也爆满,早该改成这样了……

另外,昨天 home.live.com 也不能访问,但今天又恢复了,不知道是微软公关的效果还是刚好这个部分临时故障。home.live.com 这个微软基于 Live 的社交网络社区可以通过 Feed 和插件把 FaceBook、WordPress、Twitter、Flickr 等知名服务以及自己 Blog 的发布消息全部整合到一起,还是有点意思的……

墙疯了,网封了……

Update 2009/06/08 15:30:

从成都网通访问来看,Flickr 和 Bing 都已经解封了。据 Twitter 上有人说 Twitter 也解封了,但是我自己试了一下还是不行。

另 Blogger 和 Blogspot 仍然无法访问。

Labels: , , ,

Tuesday, May 26, 2009

评论功能修复 2 条评论

刚刚发现 Blog 的评论功能不能用了,提交后一直显示等待。查了一下,发现是 GFW 的问题。

自 5 月 16 日,Blogger 及托管站 BlogSpot 再次被封,导致域名 blogger.com 以及 blogspot.com 全部无法访问。而我的评论系统,是靠通过 Blogger 的 Feed 地址,由 AJAX 和 Blogger 之间通讯实现读取;由 AJAX 直接向 Blogger 的评论表单处理 URL 发送 POST 请求实现提交。这两项功能都是基于 www.blogger.com 域名的。前者所用的 Feed 地址由于先前早已被封,并通过朋友在 DreamHost 的主机上放了一个 PHP 的中转程序,所以评论列表功能一直可以用,但是评论提交是直接 POST 的,www.blogger.com 被封,所以评论自然就失败了。

没办法,刚刚改进了一下我的 HTTP 中转程序,实现了 POST 的功能,现在评论功能已经修复了。只是整个数据流程要经历“本地网页 » blog.windia.net » DreamHost » www.blogger.com » DreamHost » blog.windia.net » 本地”这样漫长的路径,因此提交评论可能需要数十秒的时间,但聊胜于无吧。希望 GFW 早日放过 Blogger,这样功能就能完全恢复正常了。

另外,修改了一下模板,把 blogger.com 上引用的 CSS 以及 JS 文件的地址都改由 DreamHost 上的 HTTP 中转读取,这样在打开 Blog 页面时,浏览器不用再等待这些文件的 HTTP 请求超时,速度应该能快不少。

Labels: , , , , , , ,

Monday, April 20, 2009

Blogger 的评论 Feed 中去掉了 URI 4 条评论

最近发现每篇文章下方评论的作者都没有了 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 网站上并没见到相关的说明。

Labels: , , ,

Saturday, November 15, 2008

你博客的 ping 列表真的全在工作吗? 4 条评论

我们知道在博客发表文章时,可以利用 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 的中文文档依葫芦画瓢总会吧?自己想当然的随便弄一下就完事了?
由以上可以看出,大公司终究还是大公司。令人深思的是,这些不能正常工作的接口中,几乎全是国内的服务商,其中有些暴露出来的问题,更是令人汗颜。

Labels: , , , , , ,

Friday, October 24, 2008

挑战 XHTML 的 Strict 标准 2 条评论

我的 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 代码的参考信息。

Labels: , , , , , , , , , ,

Friday, October 17, 2008

Blogger 的相关文章和热门文章 2 条评论

看到很多别人的 Blog 在文章页面下方都有“相关文章”和“热门文章”的列表,无疑能够增加访问者继续阅读文章的兴趣。可是 Google 的 Blogger 没有这样的功能,于是自己想办法也添加了一个。

由于 Blogger 并没有提供相关的模板标签(Tags)来支持这样的功能,因此自己只好用 PHP 和 MySQL 建立了一个简单的数据维护和查询系统,然后用 AJAX 的方式在页面上显示出来。具体来讲有以下内容:
  • 利用 Google Blogger 的 Feed 接口将文章的 ID、标题、标签、URL、发布及修改时间等内容用程序导入到数据库。
  • Google Analytics 的页面浏览数统计(统计报告 » 内容 » 最常见内容)数据导出成文本文件,再通过程序导入到数据库。
  • 用 PHP 建立一个“相关文章”的查询接口。输入参数为文章的 ID,输出为指定数量的相关文章列表。具体算法上,先用 ID 查出基准文章的标签,然后在数据库中文章中比对标签匹配的数量,按照标签匹配数量从多到少找出相关的文章。
  • 对于热门文章,有两种计算方法。一种是按有史以来所有文章的浏览量来排序,但是用这种方法得到的结果,基本上都是 2005 年很老的文章,而很多有意义的新文章却很难出现。于是我采用了另一种算法,即按照每日平均浏览量来排序,这样比较新的浏览量比较大的文章也能出现了。

修改好模板以后,将整个 Blog 重新发布,现在这些功能已经调试好并上线了。顺便抱怨一下,对于用 FTP 发布的 Blogger 来讲,帖子多了以后,整站重新发布,真是一个漫长的过程啊。

在修改模板的同时,也顺便改了一下首页上提示阅读全文的方式,将原来的“点击这里阅读全文”的文字链接改成了图标,希望这样看起来更醒目一些,在我另一个非技术的 Blog 上可以看到效果。

另外,最初做的模板的 PSD 文件找不到了,也忘了当时在标题部分用的哪种字体。这给后面添加新的标题带来很多麻烦。于是趁这次修改模板,一并将标题的图片都修改了。找了很多字体,也研究了很久,挑了 10 种非衬线(Sans Serif)字体出来,最后选中的竟然是 Windows XP 自带的 Lucida Sans Unicode。

Labels: , , , , , ,

Sunday, September 28, 2008

让 Google Blog Search 收录文章 2 条评论

Google 除了网页搜索外,还有个专门搜索博客文章的引擎,叫做 Blogsearch。基于 Google Blogger 构建的博客里面,反向链接的数据就来源于此。每次打开 Blogger 文章页面,实际上都会通过 JavaScript 作一次 Blogsearch 搜索,并把返回结果作为反向链接显示。

你可能觉得既然 Google 网页搜索都收录了,那同是一家的 Blogsearch 一定也收录了。事实并非如此。

通过 Google 的 Webmaster 管理工具 向 Google 提交自己的 Sitemap,有利于让 Google 在第一时间收录网站更新的页面,但是,这仅限于网页搜索。

最近发现 Blogsearch 似乎没有收录我的文章,仔细查看发现居然已经有两个月之久了,而这些文章通常在发布后快则数小时慢则最多一天内就被网页搜索收录,很是诧异。Google 了一把,找到这篇文章分析原因,说是因为 Blogsearch 和 Feedsky 的自定义域名不兼容有关。

我确实是在 FeedBurner 被封后改在页面上使用 Feedsky 的服务,但对于 Google 的 Blogsearch,向来是由 FeedBurner 自动去 Ping 的,就算 FeedBurner 被封但这个机制应该是仍然在工作的。而且要出问题早该出了,也不至于是在最近这两个月发生吧。百思不得其解,打开 FeedBurner 仔细查看了一下设置,发现设置中“Publicize » PingShot » Google Blog Search Pinging Service”前面的复选框没有勾上!难怪 Blogsearch 不收录文章了,都没人通知它了啊…… 至于为什么 FeedBurner 上这个选项是关闭就不得而知了。如果你也使用 FeedBurner 的服务,也发现 Blogsearch 收录有问题,那么最好也去检查一下。

把这个选项打开后,为了以防万一,又到 Blogsearch 的网址提交页面重新提交了一下网站的 feed 地址。大约过了一小时后,最近两个月没有被收录的文章就立即能够被搜索到了。注意这是一次性的通知服务,如果没有自动 Ping 的机制,则每次网站更新后都要手动执行这个操作。

如果使用其它支持自动 Ping 的 BSP 的话,可以添加 Blogsearch 的 Ping 服务 API 地址:
http://blogsearch.google.com/ping/RPC2
如使用 WordPress 的话,在 Update Services 里面添加这个地址就可以了。更多详细内容可以参考 Blogsearch 的常见问题API 接口文档

Updated on 2008/10/29:

实践证明,使用 Google Blog Search 对 Google 文章的收录是有显著成效的。如下图,在文章发布后,立即 Ping 了 Google Blog Search,不多久就被收录;9 分钟后,Google 的网页搜索便也收录了这篇文章。

Google 网页搜索在 9 分钟内久收录了新文章

Labels: , , , ,

Thursday, August 28, 2008

Blogger Feed 地址被封? 0 条评论

之前用 Blogger Feed 的 JSON 回调功能实现了侧边栏的“最近评论列表”,后来在把页内评论表单改成 AJAX 方式的时候,也顺便把文章下方的评论改用 AJAX 异步获取了,这样在提交评论后可以立即显示出来,而不用等待 Blogger 通过 FTP 发布重建页面。

可是最近一段时间,发现这两处的评论列表都出现了问题,显示时好时坏,到后来就直接停止工作了(一直显示 Loading Comments...)。而且,在访问了我的 blog 地址的一段时间内,无法打开 www.blogger.com 域名下任何页面。但是如果使用代理,则以上问题都不存在。所以我想大概是 Blogger 的 Feed 地址被封了。

Google 了很久也没看到有类似的案例,因为作为 Blogger 的用户,BlogSpot 和自定义域名的 blog 上,feed 是可以正常访问的。但是对于本站这种 FTP 发布的来说,就只能依赖 http://www.blogger.com/feeds/... 这个地址了。估计是国内用 Blogger FTP 发布的 Blog 并不多,也很少有依赖 feed 地址来实现功能的,所以也就没太关注这个问题吧。通过 Google 找到另一个用 Blogger FTP 发布的例子,mixfog,细研究下发现博主完全摒弃了 Blogger 的评论系统,自己实现了一套评论,可以自动获取并显示评论者留下的 URL 的 favicon,还可以回复评论,真是有心啊……

为了解决这个问题,我寻思了好久都没有找到办法。因为打开评论的 feed 地址是在 JavaScript 调用的,因此要求所有的访问者都能访问这个地址才行。我试过写一个中转的 PHP 程序在服务器上来获取内容再直接返回,可在服务器上实验时直接返回了 404,看来在国内是没办法访问到的了。

今天突然想起来如果能够在国外的网站上做这样一个中转,就可以解决了,于是问了下朋友 liuming,把中转的 PHP 页面放到他的 DreamHost 主机上,于是问题就解决了…… 在此深表谢意!郁闷了好久的问题终于解决了。

顺便说句题外话,DreamHost 上 500G 空间、可开无数独立站、每月流量限制 5T 的虚拟空间,一年才 119 美元,看样子比我在国内租的合租服务器划算多了啊…… -_-bb

Labels: , ,

Wednesday, May 28, 2008

更换服务器 0 条评论

前段时间 blog 一直挂在朋友公司的服务器那里,不知道怎么可能中了病毒,会给网站内的网页和 JavaScript 脚本加尾巴以传播恶意软件,连 Google 也给这个域名下的搜索结果加上了“传播恶意软件”的警告信息。虽然一再通知朋友,但是似乎病毒很顽固,即使手工把“尾巴”去掉了,每次更新又会被加上。这段时间给大家造成了困扰,在这里表示诚挚的歉意。

在网上了解到现在有服务器合租这种服务器的租赁模式,5-30 人共享一台服务器,费用比自己租赁托管服务器要便宜很多,贷款和资源又比虚拟空间模式更能得到保障。有些比较好的合租服务商还有良好的服务器控制面板,可以自行控制域名绑定、FTP / 数据库帐号、网络邮局等,因此特地选了一个基于 Linux 的 64 位 PHP 服务器,并且已经开通了常用的 PHP 扩展库,6G 的空间,一共可以开 4 个独立的站点,非常的方便。关键是有专业的队伍维护,至少不会再有病毒干扰了。目前已经通过 Google 的 Webmaster 工具提交 Google 重新审核过,Google 已经去掉了“传播恶意软件”的警告,朋友们以后可以放心访问这个 blog。 ;-)

另外,目前自己只用得到 1-2 个独立站,还可以开 2 个,如果有朋友有需要用 PHP + MySQL 空间,可以联系我,大家充分利用资源!

Labels: ,

Saturday, January 06, 2007

Blogger 自定义域名 6 条评论

昨天 Blogger Buzz 放出消息,声称 Blogger 现在可以支持自定义域名。对于自己喜欢的 *.blogspot.com 域名已经被注册,或者难以使用 FTP 发布的国内 Blogger 用户来讲,这是个好消息。根据这篇帮助的提示,只需注册一个域名,简单的设置一个 CNAME 记录,就可以用 BlogSpot 托管空间而使用自己的域名。

我新建了一个域名来发布上次测试用的 Blog,地址是:http://blogtest.windia.net

Blogger 提供的新的模版编辑体系还是很实用的,关键是相对传统的模版,新模版加入了很多新的功能和特性,这些对于 FTP 发布使用传统模版的用户是无法使用的。

不过,值得担心的是,如果 Blogger 和其托管站点 *.blogspot.com 一旦再被封,自定义的域名是否也会同样失效?目前 Blogger 要求自定域名的 CNAME 记录指向 ghs.google.com,这个域名和 *.blogspot.com 的 IP 地址是不相同的,希望能够在 *.blogspot.com 万一再次遭殃的时候能够幸免于难。

Labels: ,

Friday, January 05, 2007

用 JSON 实现侧边栏的最新评论列表 4 条评论

上个月 21 号 Google 发出消息,声称 GData API 开始支持以 JSON (JavaScript Object Notation,中文介绍) 的形式提供数据,并且给出了对应的 API 文档,同时 Blogger Buzz 网站也告知广大用户,JSON 支持的 GData API 中同样也包括 Blogger。

在这之前,由于 JavaScript 先天的限制,我们不能通过 JavaScript 代码打开当前域以外的远程文件,这也就限制了我们通过传统的 AJAX 技术利用 GData API 的 Atom Feed 来实现 Blogger 页面上最新帖子、评论列表的即使更新,因为我们无法在某个 *.blogspot.com 域名下打开 www.blogger.com 下的 XML 文档。当然,新的 Blogger 支持在自己的域名下,也就是以 yourname.blogspot.com/feeds/ 的形式访问 Atom Feed 解决了这个问题,但是对于通过 FTP/sFTP 发布的非 blogspot 用户,还是无法绕过这个问题。

现在,Google GData API 除了可以在原来的地址后面加 alt=json 参数来以 JSON 的格式组织数据以外,还可以用 alt=json-in-script&callback=myFunction (其中 myFunction 是自己用来处理 JSON 数据的函数) 的方式使得 Feed 返回的 JS 代码内容直接是对 myFunction 函数的调用,这样就绕过了以上 JavaScript 不能远程调用本域以外资源的限制。

通过这个办法,我修改了自己 Blogger 侧边栏的最新评论列表。虽然原来有一个,不过只是根据 Blogger Help 上的这篇介绍开启的,原理还是利用 <Blogger> 标签的循环,只输出评论的部分,也就是说,原来的方法输出的只是当前页面最新评论列表,没有在首页列出的文章,其评论是不会出现的。而且,在默认情况下,评论的排序方式是先按帖子先后顺序,再按时间顺序。我自己另外写了一个 JavaScript 函数来对它们重新排序,并只保留最新的 10 条。

现在,通过 GData API 的 JSON 回调支持,我写了一个真正意义上的最新评论列表。看到这位网友提供了一个 blogspot 用户适用的办法,对于非 blogspot 发布,特别是 FTP/sFTP 发布的用户,可以用我的办法:

<div id="sidebar-recent-comments">
<p id="comment-loading">Loading Data...</p>
<dl id="comments-block">
<dt class="comment-data" name="comment-data">
<a href=""></a><span>, </span>
<span class="comment-poster">
<a href="" rel="nofollow"></a></span>
<span> said...</span></dt>
<dd class="comment-body" name="comment-body"><p></p></dd>
</dl></div>

<script type="text/javascript">

// Fetch the recent comments from Blogger Feed with JSON code and
// the callback func is "dispComments".
function getComments(blogId, counts) {

// Temporarily hide it
var dl = document.getElementById("comments-block");
dl.style.display = "none";

// Retrieve the JSON feed.
var script = document.createElement('script');
script.setAttribute('src', 'http://www2.blogger.com/feeds/' + blogId +
'/comments/default?alt=json-in-script&callback=' +
'dispComments&start-index=1&max-results=' + counts);
script.setAttribute('id', 'jsonScript-recent-comments');
script.setAttribute('type', 'text/javascript');
document.documentElement.firstChild.appendChild(script);
}

// Translate the date
function transDate(dateStr) {
dateStr = dateStr.substring(0, dateStr.indexOf("."));
dateStr = dateStr.replace("T", " ");
dateStr = dateStr.replace(/\-/g, "/");
return dateStr;
}

// Display the comment entries onto the web page.
function dispComments(json) {
var dl = document.getElementById("comments-block");

// get entry template
var dt = dl.getElementsByTagName("dt")[0];
var dd = dl.getElementsByTagName("dd")[0];

dl.removeChild(dt);
dl.removeChild(dd);

for (var i = 0; i < json.feed.entry.length; i++) {
var entry = json.feed.entry[i];
var curDt = dt.cloneNode(true);
var curDd = dd.cloneNode(true);

// Time
curDt.childNodes[0].href = entry.link[0].href;
curDt.childNodes[0].appendChild(
document.createTextNode(transDate(entry.published.$t)));

// Author
curDt.childNodes[2].childNodes[0].appendChild(
document.createTextNode(entry.author[0].name.$t));
if (entry.author[0].uri) {
curDt.childNodes[2].childNodes[0].href = entry.author[0].uri.$t;
}
else {
curDt.childNodes[2].childNodes[0].removeAttribute("href");
}
dl.appendChild(curDt);
dl.appendChild(curDd);

//Content
curDd.childNodes[0].appendChild(
document.createTextNode(entry.title.$t));
}

dl.style.display = "block";
var commentLoading = document.getElementById("comment-loading");
commentLoading.style.display = "none";
}

getComments('yourBlogId', entryCount);
</script>

注意最后一行调用的 getComments 函数的两个参数,yourBlogId 是你当前这个 Blog 的 blogId,每个 Blog 都是不同的。打开自己帖子的评论页面,从 URL 上就可以找到自己的 blogId。第二个参数 entryCount 是要显示的评论条数,例如 10。

另外,为了保持页面整洁,我只使用了评论的第一行,也就是 title 部分的内容。如果需要显示完整,将以上代码中蓝色的 title 改成 content 即可。

为了简洁起见,也可以把 getComments 和 dispComments 两个函数放到外部的 .js 文件中去定义,页面只用引入这个 .js 文件,然后调用 getComments 即可。

Labels: , , , ,

Thursday, December 21, 2006

Blogger 不再 Beta 4 条评论

昨天 Blogger Buzz 更新消息说 Blogger 推出了正式版本,不再是 beta 状态了。

看了下更新列表,没什么特别的新东西。都是最近长期 beta 以来一步步更新的内容。只是发现新版本 Blogger 的域名从 beta.blogger.com 变成了 www2.blogger.com,不过这个并不影响原来 blog 的网页。访问任何 beta.blogger.com 下的页面,会直接跳转到 www2.blogger.com。

趁着这次更新发布,又修改了一下我的模版。主要是把 Calendar 部分换成了可以在一个页面上来回翻月份,而不会在翻动的时候跳动到对应的存档页,这样可以提高 Calendar 导航的效率。

另外,把树状 Archive 目录提前了一些,并在存档页和帖子页会自动展开对应的月份,这同样也是为了加强导航的作用。

之前发现在页内的评论表单上提交评论后,HTML 页面不会被 Blogger 重建,现在欣喜的发现,这个问题 Blogger 似乎已经在最近的某次更新中修正过了。目前直接在页内提交评论,页面会马上开始重建了。只不过由于新 Blogger 每次要更新的页面比较多(包含所有的 Label 页面),因此和以往老的 Blogger 页面重建相比,速度还是要稍慢点,通常 5 分钟之内应该是可以完成的。

接下来打算在有时间的时候把页面左栏的最新评论改成用 JSON 实现,这样就成了真正意义上的“最新评论列表”,而不是目前的“出现在引导页上的帖子相关评论列表”。本来是想把页面上所有可以由 Bogger 的 Feed 实现的数据都用 JSON 来提供,但是每次请求返回的内容多的时候高达 60 多 K,可能会导致页面变慢,而访问上,不会感觉到太大的改变,因此决定先放一放再说。目前还是通过一个 JS 文件来静态存储所有帖子的时间和标题等信息。只不过这个文件仍然可以写服务端程序通过调用 Blogger 的 GData API 来自动更新。

Labels: , ,

Saturday, November 18, 2006

通过 GData API 提交评论 0 条评论

前两天有提到升级到 Blogger Beta 后发布评论的问题。今天从 Google Groups 上的 Google Data API 讨论组上看到一个新的发布评论的办法,就是用 GData API 通过单贴评论的 Feed 地址
http://beta.blogger.com/feeds/blogID/postID/comments/default

发布。

这个方法与向 http://beta.blogger.com/comment.do 直接 POST 数据的方法比起来,要科学得多。经过测试,这个方法确实可行,评论发布后,页面会被正常地重建。然而,仍然有问题:评论对应的发布者被设置成了 Blogger 的主人,也就是在向 feed POST 数据之前提供给 Google 的身份验证信息对应的用户。

据讨论组上 Blogger 的研发人员回复说,官方并不支持这种方法提交评论,尽管它确实是可行的。我想之所以会有上面的问题,大概是因为这个方法原本是用来发布帖子用的,在这种情况下,作者信息自然就应该从通过身份验证的 Blogger 账户中取得。

已经在这个有关 GData API 提交评论的讨论串中提出建议修正这个问题,不过不知道 Blogger 会不会理我。在这个问题被修正之前,这个方法实际仍然无法投入实用,毕竟不会有人会让所有评论的作者信息丢失掉。

Labels: , , , ,

Wednesday, November 15, 2006

Feeds of Blogger Beta 0 条评论

今天爬 Blogger Beta 的资料,发现 Blogger Beta 除了可以提供整站帖子、整站评论以及分帖子评论的 feed 以外,甚至可以按照单个的 label 来提供 feed,格式如下:
http://beta.blogger.com/feeds/blogID/posts/default/-/labelname

URL 中的 labelname 就是要订阅的 label,注意中间的“-”符号不能少!

另外,把其它的订阅地址的格式也一并写在这里:

订阅整站帖子全文:
http://beta.blogger.com/feeds/blogID/posts/full

订阅整站帖子默认,即按照 Blogger 的 Site Feed 设置选项:
http://beta.blogger.com/feeds/blogID/posts/default

订阅整站评论:
http://beta.blogger.com/feeds/blogID/comments/default

订阅单贴评论:
http://beta.blogger.com/feeds/blogID/postID/comments/default


Update on 2006/11/17:
对于 label 的 Feed,发现如果 labelname 中含有空格,则无法正确获取 Feed 内容,会出现 Blogger 的“We're sorry, but we were unable to complete your request.”报错页面,例如:
http://beta.blogger.com/feeds/blogID/posts/default/-/Knowledge Base

无论中间的空格是否被 urlencode 成 %20,都会出现这个情况。已经向 Blogger GData API 讨论组 提交了这个问题,不过至今仍未有任何回复。

Update on 2007/01/12:
这个问题在 Blogger GData API 的另一个讨论串中被再次提到,并被认定为一个 bug,可以通过这里来追踪。希望这个问题能够早日得到解决。

Labels: , , , ,

Monday, November 13, 2006

升级后如何才能方便的发布评论? 11 条评论

升级到 Blogger Beta后,由于大家无法访问 beta.blogger.com 域名,因此出现了无法发布评论的问题,在上次的帖子中有所讨论。

为了解决这个问题,我自己写了个简单的 Servlet,来接受来自页面上的评论发布,并将这个请求转到 Blogger Beta 上处理评论发布的地址 https://beta.blogger.com/comment.do,因为我可以修改服务器上的 host 文件使其可以访问 beta.blogger.com,这样可以起到一个类似代理的作用,代替需要发布评论的朋友们访问这个不能直接访问的域名。

理论上是没有问题的,实践上我也几乎取得了成功。出现的问题是:评论被正常发布后,和评论相关的帖子页面没有重建!

我们知道,用 FTP 的方式发布 Blogger,任何对帖子的更改,都会导致 Blogger 自动重建页面并自动发布到 FTP 相关的目录下,以使得 blog 网站上的页面能够反应出最近的信息,这些操作包括新增/修改/删除帖子,以及添加/删除评论。正常情况下,一旦有评论发布,这个重建的过程就会发生,这样评论能够在最多几分钟的时间内出现在页面上。

可是现在,评论的内容都出现在 Blogger Beta 自己的评论页面上了,但是却没有触发页面重建。不过,如果直接把页面上评论表单的内容提交到 https://beta.blogger.com/comment.do,则一切正确;但是当然这样做没有意义,因为这要求发布评论的朋友能够直接访问 beta.blogger.com 域名。

现在出现的现象会是,大家发布的评论不会立即显示在帖子页面上,但是实际上是已经被正确的保存了。我看到电子邮件的提示后,就会尽快重建页面使得这些评论能够被显示出来。相信这个问题只是暂时的,总归是应该得到解决的。

这个问题琢磨了一晚上也没有得到结果,Google 上也搜不出什么有用的东西来。已经把这个问题发布到了 Google 上的 Blogger Data API 讨论组求助,希望有人遇到过类似的问题从而给我一些提示。

Updated on 2006/11/17:
有一个更科学的方法来提交评论,那就是用 GData API 向单贴评论的 Feed 地址提交,不过仍然有些问题。详见“通过 GData API 提交评论”。

Updated on 2006/12/21:
Blogger 的某次更新似乎已经解决了评论提交后页面不会重建的问题。现在在页内的评论表单中提交评论,页面会被立即重建,只是由于需要重建的页面和以往的老 Blogger 比起来要多一些,因此会慢一点。一般 5 分钟之内评论就会出现在页面上了。

Labels: , , , , ,

Friday, November 10, 2006

升级到 Blogger Beta 后的问题 4 条评论

昨天收到 Blogger 的升级邀请,将我的 Blogger 帐号升级为了新推出的 Blogger Beta。由于升级的过程中,没有对原有模版中的内容进行更新,也没有自动重新重建页面,因此今天在重新修正了模版文件并将整个站点重建。在这个过程中还是发现了一些问题:
  • 模版中的中文内容变成了乱码
  • 在转换到 Blogger Beta 过后,发现原模版中所有的中文内容全部变成了乱码。看来正如 Blogger Beta 的 Known Issues 所说,Blogger Beta 目前仅支持英文

    幸亏模版有备份,阿门……

  • 模版标签 <$BlogOwnerAboutMe$> 失效
  • 发现原有模版中的 <$BlogOwnerAboutMe$> 在构建页面时被替换成了空字符串,也就是说现在在模版上使用这个标签显示不出任何内容。

    不过与此同时,<<$BlogMemberProfile$> 标签输出的内容中仍然正确包含了 About Me 的信息。我想这应该是个 bug,而且已经通过 Blogger 的反馈系统提交了。只是没有回应…… 没有办反,暂时只有用这个标签代替。其输出的内容与我自己写的几乎完全相同,我之所以原来没有用,是因为我不需要 About Me 这几个字,而是用图片替换掉了。现在只好在页面上用 JavaScript 来取掉这几个字。

  • 发布时不再提供 rss.xml 文件
  • 老版本的 Blogger 支持 Atom 0.3 和 RSS 2.0 两种格式的 Feed,在发布时分别对应 FTP 发布根目录下的 atom.xml 和 rss.xml,现在看来仅发布了 atom.xml 而没了 rss.xml。

    与此同时,Atom Feed 的版本升级为 1.0。我是通过 FeedBurner 来发布我的 Feed 地址的。不过,升级过后,通过 Maxthon 无论直接通过 atom.xml 还是 FeedBurner 的地址,都会发生“无法解析 Feed 的格式”错误。除此之外,Google Reader、FireFox 2.0 的订阅都没有问题。看样子这个只能怪 Maxthon 了。
    关于新版的 Site Feed 设置,比较奇怪的一点是 Blogger 除了提供对 Post 的订阅以外,还提供了对所有 Comments 以及单篇 Post 的 Comments 的订阅,然而发布到 FTP 上的所有文件中,和 Site Feed 相关的只有 atom.xml 这么一个文件,所以无从得知如何实现对 Comments 的订阅。或许是要使用 BlogSpot 的用户才有这个功能?

    Update on 2006/11/14:
    Blogger Help 上的一个条目说:RSS 格式的 Feed 只在 Blogger Pro 提供,如果非 Pro 用户想要使用 RSS 格式的 Feed,请使用 FeedBurner

    另外,现在知道了订阅整站 Comment 和分单帖子 Comment 的地址,它们分别是
    http://beta.blogger.com/feeds/blogID/comments/default

    http://beta.blogger.com/feeds/blogID/postID/comments/default

    Update on 2006/11/16:
    似乎 rss.xml 的发布又恢复了。现在发布新帖的时候,发布文件列表中有这个文件。Known Issues for New Bloggers 上面说明了该问题的情况。

  • 无法特别为标签页面定制模版内容
  • 老版本的 Blogger 模版标签中有几个条件标签可以分别对 IndexPage、ItemPage 和 ArchivePage 进行内容的定制,因为这几个页面的元素显然是不同的。现在多了个 Label 页面,不过却没有特别提供一个 LabelPage 的标签来方便模版条件输出。

    之所以提这个功能,是因为它最大的好处是可以在 Label Page 上显示当前这个页面的内容属于哪个 Label,这样不致于让读者产生困惑。现在的 Label Page 和 Index Page 除了帖子不同外,其它格式基本上完全一样。

  • 可能出现读者访问速度非常缓慢且无法发表评论
  • 当然这个不能怪 Blogger。不过最近大多数人都无法访问 beta.blogger.com 这个域名,对升级后的 Blogger 确实会产生很大的影响。

    首先模版中有多处需要引用 beta.blogger.com 站点上的资源,而且这些资源通常写在网页头中。读者必须要等待浏览器判断这些资源访问超时后才会继续显示后面正常的网页内容,看到的现象就是,网页除了窗口标题出现以外,内容全白,大约等半分钟后网页内容出现。即使 CSS 和模版图片全部用自己的,也无法避免需要引用 beta.blogger.com 上的 JavaScript 来实现 Backlinks 以及一些 Post Control 的功能。除非你完全不用这两个功能,则可以基本上避免引用 beta.blogger.com 站点而导致页面打开缓慢。

    另外,众所周知对 Blogger 的帖子发表评论需要连接到 Blogger 站点上发布。这个过程实际上是 Blogger 在收到新的内容后对相关页面的重建过程。Blogger Beta 的 Blog 站点,读者自然要到 beta.blogger.com 上去发表评论,这个站点打不开,所以不能评论。

    虽然我们可以通过在 C:\Windows\System32\Drivers\etc\host 文件中添加
    72.14.219.190 beta.blogger.com

    这样一行内容来实现访问该站点,但是这仅能方便自己而已,你无法要求自己 blog 所有的读者在发表评论之前都这么做。因此,请所有 Blogger 的用户在升级之前三思!

Labels: , , ,

Thursday, November 09, 2006

转到 Blogger Beta 0 条评论

前几天 Blogger Beta 终于支持了发布到 S/FTP,今天我的帐号终于收到了转到 Blogger Beta 的邀请,这一历史性的时刻终于来到了。这里是 Blogger Buzz 上的公示消息


兴冲冲的赶快按下了“Switch to the new version”,才发现后面的过程需要输入 Google Account 并且到 beta.blogger.com 验证。由于目前公司的网络访问不了 www.google.com,而 beta.blogger.com 目前也无法访问,因此第一次失败……

开了 Tor,用 FireFox 重新打开页面,并且修改了 host 文件以便能够访问 beta.blogger.com,这次所有验证都对了,最后显示了一个“Switching to the new Blogger”,大意是说我的 blogger 正在转移到新的 Blogger Beta,有些 blog 根据情况可能需要时间比较久,因此请耐心等待。等转移完成以后,将会往我的 Gmail 邮箱发邮件通知。

从上午开始申请转移,到午后一直是这个样子。我严重怀疑是不是由于第一次操作失败导致了什么问题,因为我觉得我那两个 blog 150 来篇帖子不至于需要这么久。不放心之下,Google 上查了一下,发现其他人也遇到过类似的问题,说大概是遇到了 IRoC (Initial Rush of Connection)。嗯,也难怪,Google 一开放个服务,开始几天总是要出现点负荷问题。

大概下午三点钟的时候,情况终于发生了变化。Blogger Beta 登录后,显示的内容变为:


看来是 Blogger 正在做转移操作,为了避免这个过程中发生问题,已经屏蔽了用户对帐号进行操作。不过这个过程仍然很久,一直到下午下班前都没有完成。

大约晚上八点,再上线时,发现 Blogger 转移终于完成。Gmail 也收到了 Blogger 的通知邮件。

登录到 Blogger Beta,发现罗列了三个blog,有两个是从先前老版本 Blogger 上转来的,另一个则是上次为了测试创建的。登录老版本的 Blogger,发现已经无法回头了:


不管怎么说,等了好几个月的升级终于完成了。即使是这个转移本身,也花了一天的时间,对人的耐心真是一个不小的考验啊。

Labels: ,

Friday, November 03, 2006

Blogger Beta 终于完工了 2 条评论

今天 BloggerBlogger Buzz 上公布:Blogger Beta: Feature Complete! 文中声称现在 Blogger Beta 可以支持通过 S/FTP 发布了,相比 Classic 的 FTP 发布,保留了 Label 的功能!这是之前我一直对 Blogger 感到不爽而且想自己增加的功能,后来 Blogger Beta 自己增加了 label 功能后,我自己的开发也就停止了,不过由于是通过动态网页技术实现的,当时只限使用 blogspot 的 Blogger 用户使用。现在终于也支持 FTP 发布的用户了,对于我来说,对 Google Blogger 服务的支持无疑又进了一步。

只不过,美中不足的是,通过 FTP 发布的 Blogger,不支持新的 Layout 模版编辑和拖拽功能。不过对于喜欢自己编写模版定制 Blogger 的人(比如我)来讲,这个是无关紧要的。页面上编辑 Layout 再智能再强大,也比不过我自己写 HTML 和 CSS 吧! :-P

这里是原先通过 blogspot 发布的一个测试用 Beta-Blogger,现在移到用 FTP 发布,基本上没有任何问题。观察其发布的文件,会发现它为每个 label 建立了一个 HTML 文件,只是不知道当某个 label 下帖子多了以后会怎么办。

顺带想提一下的是 *.blogspot.com 域名现在又无法访问了,看来上次的解封也是空欢喜一场。目前更让人郁闷的是在公司无法访问 www.google.com (公司 IT 部门解释说是 ISP 的问题,貌似是网通,在家里的时候用电信 ADSL 拨号可以正常访问),beta.blogger.com 域名也无法访问。由于上面提到的测试用的 Beta Blogger 页面中需要调用 beta.blogger.com 下的一些资源,因此在打开页面的时候会比较慢,因为要等请求超时。好在缺少这些资源并不影响访问者观看 Blogger Beta 的网页。

什么时候才能自由访问 Google 的各项服务呢?抑或什么时候才能自由的访问互联网的公众信息?

Labels:

Thursday, October 26, 2006

Blogger 网页显示空白的问题 0 条评论

之前一直有朋友声称我的 Blog 访问不了,打开来是空白。这个问题我自己也经常遇到,原因是网页编码被误判成 GB2312,而不是正确的 UTF-8,于是 IE 无法识别,所以显示成空白。这个问题据说在 Firefox 上并不存在,但是为什么会被误判我也一直不清楚。

现在原因应该清楚了,因为在文件头中,声明网页内容编码的那一行标记
<meta http-equiv="Content-Type" content="text/html; charset=UTF-8" />

被放到了 <title> ... </title> 之后,而刚好 title 中有中文,所以 IE 在没有获得指定的编码类型时,用了默认的 GB2312。

解决这个问题还是比较容易:编辑 Blogger 的模版,把“<$BlogMetaData$>”放到“<title><$BlogPageTitle$></title>”的前面,然后重建一下,就不会出现这个问题了。

Labels: , , , ,

Friday, August 18, 2006

模版更新 6 条评论

看了 Blogger Beta 新的 Archive 树状的列表方式,非常喜欢,于是花了点时间,把自己现在的模版也改成了这个样子。刚好做 Calender 的时候,已经有一份完整的时间、帖子标题和地址的对应数据,所以做这个树状的 Archive 列表,只是表现的问题而已。不过,尽管如此,还是花了我好几个小时的时间。

另外,打开了 Blogger 的 Backlink 功能。由于要改模版,Blogger 提供这个功能以后一直没有动,嫌麻烦。不过,把这个功能打开容易,要把样式调整的和整体一致,还是花了不少功夫。

弄好后,把自己比较得意的帖子都看了一下,除了 Throwing Tables Out the Window 那篇以外,别的帖子几乎没什么 backlinks,可能还是因为我写的东西都比较私人吧。

Labels: , , ,

Wednesday, August 16, 2006

Blogger 新动向 0 条评论

这两天,久经抱怨的 Google Blogger 服务终于有了新动静。从一年多以前开始,Blogger 就承诺对其提供的 Blog 服务进行改进,但除了新增了评论发布的校验码以及评论内容评审以外,未见有什么大的动作。前天,Blogger Buzz 发布了最新推出的 Blogger in beta,针对长期以来用户的抱怨提供了很多新功能,具体包括:
  • 可使用标签对文章进行分类
  • 对 Blog 的访问进行权限控制
  • 用鼠标拖拽即可完成对 Blog 模版的修改和设定,无须进行 HTML 编辑

然而,该项服务目前仅对一部分老用户开放,Blogger 声称会对所有逐步开放。如果你登录后 Dashboard 上有相关连接,那就说明你的帐号已经支持新功能;否则,就要再耐心地等上一段时间。

如果等不急,也可以立即注册一个新的 Beta 帐号,或者用 Google 的帐号,或者原来的 Blogger 帐号登录后创建一个新的 Blog 即可。Blogger 稍后会提供功能,让用户把原来的 Blog 和 Beta 帐号下的新 Blog 合并起来,方便管理。

Blogger 还提供了一个 Tour 来介绍新的功能,包括灵活定制模版、对访问进行权限控制、更多的 Feed 选项、更快捷的发布等。

我也创建了一个新的 Blog 来测试 Blogger Beta 的新功能。前前后后把它的控制面板翻了一遍,发现功能并没开发完全,有些地方还是不尽如人意:
  • 发布选项中,目前仅支持发布到 *.blogspot.com,尚未提供对 FTP 和 SFTP 发布的支持。
  • 创建帖子的时候,表单下面多了一个地方可以设置标签,用来对帖子进行分类。分类的内容会自动发布到帖子后面,而连接指向 http://*.blogspot.com/search?label=label,而并非静态的 HTML 支持。当然,对于分类和标签支持,如何访问指定标签相关的文章,这是最麻烦的一部分,但如果对某一个标签的访问是通过 CGI 程序动态支持的话,不知道对于通过 FTP 发布到指定 host 的用户,Blogger 将如何提供这一功能。
  • 对帖子进行回复仍然要访问 Blogger,表单完全脱离模版。自定义 HTML 提供回复表单,仍然无法使用 Word Verification 功能。
  • 还不支持对模板直接进行 HTML 编辑,也无法去掉页面顶上的 Navbar;仅能够把目前的模板降级为旧版本的模版进行编辑。

不过,我上周才决定要自己对 Blogger 进行 DIY,Blogger 这周就给出升级的消息,同时还包括标签和分类的功能,让我着实很郁闷。Blogger 马上就要自己支持的功能,我就完全没有必要自己 DIY 了阿。虽说是自己写点东西来玩,但也总要有用才有成就感啊。

在放出 Blogger 功能全面升级的消息后,昨天 Blogger Buzz 又放出了 Blogger API 更新的消息,这意味着:
  • Blogger/GData 文档中能够找到很多范例代码。
  • 提供 C# 和 Java 版本的客户端类库下载。
  • 对于账户校验,分别提供了针对桌面程序和 WEB 应用程序的详细文档。
  • GData 相关的代码将能够被很容易的重用于其它 GData 应用程序,如 Google 的 Calendar。

总的来说,这次 Blogger 算是给了支持者们一个值得期待的回应,虽然有很多地方还可以更好,不过也总比什么动静都没有好多了。

与此同时,Blogger 的默认托管站点域名 *.blogspot.com 最近可以在国内自由访问了。以上我建立的测试 Blog 就是用的这个域名。Google 上可以搜索到很多关于 Blogger 解封的信息,不过大家对 Blogger 是否真的解封众说纷纭,并没有确切的消息。这个域名被封锁长达三年之久,如今如果真的被解封了,当然是值得高兴,或许广大的 Google 和 Blogger 们暂时还无法相信这突如其来的幸福吧。

或许是 Google 为了在国内大力推广其 Blogger 服务,在着手升级 Blogger 功能的同时也大力加强公关工作让 *.blogspot.com 在国内真的解封;也有可能是 Blogger 升级让 *.blogspot.com 域名换了 IP 地址,从而暂时绕过了 GFW 的封锁,因为现在 *.blogspot.com 的域名和以前不同了。之前也发生过 Blogger 临时更换 IP 地址导致 Blogger 下站点在短时间内可以访问的事件。

虽然我自己没有用 *.blogspot.com,不会受封锁的影响,但是,解封也意味着可以看到更多 Blogger 上优秀的 blog。希望这次真的是解封了……

Labels: ,

Page 1 / 1 2 3 4 5 » ... Last »