Saturday, November 18, 2006

通过 GData API 提交评论

前两天有提到升级到 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 会不会理我。在这个问题被修正之前,这个方法实际仍然无法投入实用,毕竟不会有人会让所有评论的作者信息丢失掉。

Wednesday, November 15, 2006

Feeds of Blogger Beta

今天爬 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,可以通过这里来追踪。希望这个问题能够早日得到解决。

Monday, November 13, 2006

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

升级到 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 分钟之内评论就会出现在页面上了。

Saturday, November 11, 2006

Firefox 的 JavaScript 问题两则

今天发现页面上新加上的左列 Tag 在 Firefox 上显示不正确,在细察之下,发现 Firefox 在 JavaScript / CSS 上和 IE 不同之处:

问题 1. 类似 obj.style.height = imgObj.height 的语句无效。

即将一个 image 对象的高度值赋给另一个对象,用来修改其样式高度,这样做无效。

分析

要理解这个问题,首先要纠正思想上的一个误区。以上这个操作,其实并非是通常编程概念上的将一个 int 值赋给另一个 int 变量。这个语句的操作,实际上是把 imageObj.height 当作一个字符串,作为 obj 这个对象 CSS 中 height 的属性。

之前的一篇帖子说过,Firefox 对 CSS 的理解非常严格,任何表示大小的值,数字后面必须跟上单位,除非是 0。也就是说,height: 20 对于 Firefox 来讲不具有任何意义,必须写成 height: 20px 才会被接受。所以,在 JavaScript 中,为了让对 CSS 的 height 值的设置有效,所赋给的字符串也同样必须是数量加上单位。

解决

以上语句,应该写成:
obj.style.height = imgObj.height + 'px';


问题 2. Firefox 不支持 obj.innerText 属性。

如果把 obj.innerText alert() 出来,显示的值是 undefined

分析

Firefox 支持 innerHTML 属性却不支持 innerText,这一点实在是蹊跷。很多人建议用 innerHTML 来代替需要用 innerText 的场合,但是这显然并不总是适用。我们有时候只是要取得一个 Tag 中的文字信息而不需要 HTML 的标记。

解决

良好的替代办法是用 obj.textContent,这个属性的作用和 innerText 是相同的,名称不同而已。不过为了兼容性,我们还是需要在程序中区分一下当前环境支持哪种。以下方法可以帮助我们区分:
if (document.all) {
obj.innerText = "myText";
}
else {
obj.textContent = "myText";
}

以前我们讲过,Firefox 不支持 document.all 这个 Collection,我们需要用 getElementById() 方法来替代,所以通过判断是否有 document.all,就能区分当前环境。

Friday, November 10, 2006

升级到 Blogger Beta 后的问题

昨天收到 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 的用户在升级之前三思!

Thursday, November 09, 2006

转到 Blogger Beta

前几天 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,发现已经无法回头了:


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

Wednesday, November 08, 2006

让 TortoiseSVN 记住密码

用 TortoiseSVN 维护工程,每天都要输入无数次密码,有时候一次操作就要输入数次密码,实在是烦人。多方搜寻让 TortoiseSVN 记住密码的办法,但是对我目前的情况都无效,我想大概是因为用了 svn+ssh 协议的原因。

不过虽然不能让 TortoiseSVN 记住密码,但是却能够让它自动输入密码,一样可以避免频繁输入密码的麻烦,方法如下:

1. 在 Explorer 右键菜单中:TortoiseSVN -> Settings.
2. 在弹出对话框的左侧面板中选择 Network,在右边界面下方的 SSH Client 中填写:
[TortoiseSVN Install Path]\bin\TortoisePlink.exe -pw [Your Password]

例如,你的 TortoiseSVN 安装在默认目录 C:\Program Files\TortoiseSVN 下,密码为 abc123,那么以上的内容就应该为:
C:\Program Files\TortoiseSVN\bin\TortoisePlink.exe -pw abc123

3. 点击 OK.

然后,以后在进行 SVN 操作的时候,就不再弹出要求输入密码的窗口了。

Friday, November 03, 2006

Blogger Beta 终于完工了

今天 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 的各项服务呢?抑或什么时候才能自由的访问互联网的公众信息?