Category: 未分类

  • 放弃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
  • WordPress post slug与SEO,中文blogger的困惑

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

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

    post slug是什么?在wordpress后台的永久链接设置(/wp-admin/options-
    permalink.php)里,用户可以自定义链接格式。绝大多数自定义的用户喜欢在url中包含由文章标题生成的一串字符,这就是post slug.
    一旦永久链接中使用了post slug,编写文章的时候标题下面就会显示post
    slug并允许你编辑,否则不显示,但wordpress仍然会自动生成并保存到数据库中。

    首先,URL中是不允许出现中文的,这个我以前写过一篇“中文URL编码”的文章,里面有详细介绍。简单地说,中文必须以UTF-
    8编码,然后再进行percent encoding,即每个字节转换成百分号后跟两位十六进制数字。英文标题不会引起任何问题,如图所示:

    post-slug

    但是如果标题里有中文(当然其它不是基于英文字母表的语言也一样),问题就麻烦了。为了符合标准,WordPress必须将它们做percent
    encoding,然后你看到的post slug就是一连串的百分号。

    为什么在地址栏看到的是正常的中文?

    我机器上的浏览器当中,除了IE 6,其它的包括Firefox 3,Opera,Chrome,Safari都会自动将url中的中文解码,所以我们会看到正常的中
    文。不仅如此,鼠标悬浮在链接上时,状态栏显示该链接的目标也会对中文进行自动解码。而IE
    6和Firefox以前的版本则没有这么做,浏览器地址栏就会看到一串百分号,IE 7以后的版本我没有测试,不知道它们是怎么处理的。Firefox
    3还有一个特点,它虽然显示了中文,可是复制的时候,剪贴板里仍然是未经解码的原始URL,这样可以防止某些浏览器错误地处理该链接地址。

    为什么post-slug不自动修改?

    post slug是在永久链接(permalink)中使用的。顾名思义,这个链接轻易是不会改动的。否则,搜索引擎所保存的记录就会失效,而指向该页面的链接也会
    失效,造成很多麻烦。

    实际上,post slug在特定情况下会自动更新的,那就是在文章发布之前。因为这时候,搜索引擎不会来抓取该网页,别的页面也不会有意指向这个“尚不存在的”页面
    。但是当文章发布之后再编辑文章标题的时候,post slug就不会自动更新了,这时,即使你主动编辑也要三思而后行。

    我如何更新这些“乱码”?

    好,你确定要修改post slug并承受永久链接失效的损失了。

    对于英文标题的post
    slug,改起来相当方便,因为英文不需要进行额外的编码工作。而中文的标题可就麻烦了,这些满眼的百分号对普通用户来说简直就像刺猬一样,不知道从哪儿下手。

    其实这是一项极为简单的工作,至少你不会经常这么做,所以犯不着做一个WordPress插件来帮助你完成。在Firefox中,打开Tools->JavaScri
    pt Console(Ctrl+Shift+J),代码框输入encodeURIComponent(‘中文标题’)并回车,“中文标题”这四个字的正确编码就显示
    在下面了。当然,如果中间有标点,还是做一些处理例如转换成减号比较好看。

    不喜欢中文post slug?

    毕竟,我们看到了它的本质——一串夹杂着百分号的无法阅读的文字,尽管多数浏览器已经将其解码还原。许多朋友还是喜欢用可读性更好的英文字母来做slug.
    可能有些勤奋而认真的blogger每写一篇文章都会自己写一个英文的post slug,但是更多的人习惯将这一工作交给计算机。cos_slug_transl
    ator
    就是一个自动翻译成英文然后生成slug的插件,还有一些转换成拼音的,大家有兴趣的话自己去搜。

    使用英文或拼音做post slug利于SEO?

    大部分人都这么认为,而我的意见是未必如此(我不懂SEO,如有误请专家指教)。这里仅针对中文内容和标题的blog post. 链接中有文章描述的主题关键字会增
    加该网页在搜索结果中的权重,这是正常的。然而用中文写成的内容和标题,链接却是拼音或者英文,这个,Google和Baidu会考虑吗?

    假设我写一篇文章,标题叫农历。

    如果我用英文做post slug,那么可能是lunar-calendar或者chinese-lunar-calendar.
    搜索引擎在收录该网页的时候,会考虑到链接中有lunar calendar而升高它在“农历”关键字搜索结果中的名次吗?我想不会。而搜索”lunar
    calendar”过来的人,90%的几率是看不懂文章在说什么。

    如果我用拼音做post slug,那么是nongli. 我认为搜索引擎同样不会因此而觉得该网页与“农历”关系更紧密。由于同词多音的存在,这个分析对于搜索引擎
    来说非常鸡肋。对于关键字”nongli”,搜索引擎会提示,是不是要找“农历”。

    如果用中文做post slug呢?我们可以在Google中搜索“农历”试试看。第一页上就有wikipedia的繁体农历词条。Google在这条搜索
    结果的下面给出的链接是“zh.wikipedia.org/wiki/農曆”。实际上该词条的真是链接地址是“http://zh.wikipedia.org/w
    iki/%E8%BE%B2%E6%9B%86”,后面是繁体“農曆”的编码。wikipedia没有使用拼音、英文做”slug”,而是直接使用了中文。而
    Google显然懂得对它进行解码,因为它给出了解码后的链接,并且将该词加粗,表明这是一个匹配,不仅仅是页面标题。

    搜索引擎懂得做简繁转换,懂得对percent encoding解码来寻找信息(这一点不知道百度做到了没有),但是目前似乎不会先翻译再搜索。

    所以我觉得SEO不是用拼音、英文做slug的理由。

    我个人在中文blog里倒是懒得用post slug,文章就用编号来查找,也就省了为中文的slug烦恼了。

    如有疑问或不同意见,请在此留言。

    plugin.html

  • 增强WordPress中的Gravatar应用

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

    虽然WordPress早在2.5的版本中就内置了Gravatar支持,似乎也没有人在添加评论form的旁边加上它。我似乎是第一个?呵呵,如有先行者,恕我孤陋寡闻。

    功能:在添加评论的表单旁边显示gravatar头像预览,登录用户直接取其email,而未登陆用户则首先尝试从cookie取得email,若cookie中部存在,则在其输入email之后,取得email值即时更新预览。

    首先说明,本文不介绍排版,即不介绍CSS布局,不过你可以参考我的评论form布局。

    第一步,在主题的comments.php中,找到评论框合适的位置,添加gravatar预览:

    [code lang=’php’]

    echo get_avatar($id_or_email, ’32’); ?>

    [/code]

    第二步,仍旧在comments.php中,给email输入的input绑定blur事件,在其失去焦点的时候更新gravatar头像预览:

    onblur="updateAvatarPreview(this.value)"

    第三步,下载Paul JohnstonJavaScript md5脚本,放在网站中合适的目录(我是放在当前主题的scripts子目录中)。

    第四步,修改主题的header.php文件,在head标签内加入如下代码:

    [code lang=’php’]


    [/code]

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

  • 迎接2009,Blog主题更新

    其实没更新啥,WordPress 2.7的评论功能大大增强,主要是增加了comment threading功能,而这一功能以前大部分blogger都是用插件Brian’s Threaded Comments实现的。我今天就抽了一点时间,去掉了插件,换用WordPress本身的wp_list_comment函数来显示评论。

    晚上吃饭的时候,电视上都是迎接新年的气氛。而我回顾2008年,却感觉有点失败,一事无成。以后要把更多的时间用在工作和学习上了,尽量不做无聊的事。作为兴趣爱好,我会多看看PHP以及WordPress的东西。最近如果有时间,就写几篇关于WordPress 2.7的评论功能的文章吧。

  • 啥时候<!–more–>有用?

    今天打开自己的blog,发现那两个flash游戏自动播放很烦,我一时写文章不勤快了,就没有把它们埋下去,每次打开首页都听那么一遍。

    于是<!–more–>派上了用场。把两篇文章分别编辑了一下,给flash嵌入的代码前面加上了more,这下首页没有了。话说,多亏我今天把电脑的静音取消了,要不还不知道用户体验这么差呢……

    文章特别长的时候,这个特殊标签也非常有用,它会让blog的首页高度不会出奇地大。尤其是文中有大量图片的时候,前阵子从黄山回来,那些流水帐里不少就用了more标签。

    首页默认是10篇文章,缩小每篇文章的高度,有利于读者更快地发现更多有意思的东西。

    另一方面,首页的数据量也大大减小,页面加载速度大大加快,也提升不少用户体验。

  • 慎用StringEscapeUtils.escapeHtml方法

    几个月前写了篇文章推荐使用Apache commons-lang的StringUtils来增强Java字符串处理功能,我也一直在项目中大量使用StringUtils和StringEscapeUtils这两个实用类。

    最近在数据库里发现某个表的内容全都成了HTML entity表示,中文也全被转换成了”&#25105;”这样的格式,而在页面上显示一切正常。最终发现造成这个后果的原因是在将字符串保存到数据库之前,用StringEscapeUtils.escapeHtml对其进行了处理。

    字符串过滤是在许多Web应用开发中需要考虑的问题。比如用户输入一个左尖括号(<),在输出HTML代码对其进行显示的话,应该用”&lt;”来表示(而我为了正常显示这句话中出现的两次尖括号,必须做多余的工作,你可以看一下源代码)。是在用户将表单提交后就做转换呢,还是在从数据库取出内容向用户展示时再转换?这个问题需要仔细考虑。在入库前转换,看似一劳永逸,然而如果用户需要编辑这个内容,你需要原路退回,做个逆向的转换,这看起来比较麻烦。所以大部分的转换都是在从数据库中取出数据之后做的,struts的bean:write标签的filter属性就是控制这个开关的(默认为true)。

    而某些内容是不会被编辑的,比如一般的电子邮件,这类就可以在用户提交表单之时转换,一劳永逸。于是我使用了StringEscapeUtils.escapeHtml来做这个工作。

    如果是英文内容,没有任何问题,然而它将一个中文字符转换成了8个字符。在UTF-8的编码中,每个汉字占用三个字节,每个英文字符占用一个字节。这样的转换造成了大量的空间浪费。

    简单的办法是自己写一个escapeHtml方法,替换左右尖括号就可以了。虽然还有一些HTML entity未被转换,可能造成输出的网页不符合web标准,但是大部分浏览器都可以正常显示也就够了。

  • Firefox必备扩展 – Copy URL +

    在网上看到有趣的新闻,经常有在IM上分享给朋友的冲动。不过这个操作一般都要复制两次,一次标题,一次链接,这样才专业。

    不用想就知道肯定有人做了这样的扩展,Copy URL +就是一个,我不知道有没有其它的,至少这个已经足够好用了。

    遗憾的是作者似乎已经不再维护了,官方版本只支持Firefox 1.5. 没关系,下面的Review提供了支持3.x的版本:http://www.utm.edu/staff/bmoseley/copyurlplus-v1.3.4.xpi

    安装后在网页的右键菜单上有一个Copy URL+的菜单组,下面默认有三个子菜单项(没有选中文本时仅显示第一个):

    Copy URL + Title -> 复制链接和标题,中间用回车隔开
    Copy URL + Selection -> 复制链接和选中文本,中间用回车隔开,并且选中文本加引号
    Copy URL + Title + Selection -> 上面二者之结合

    该扩展的功能比想象的还要强大,可以在Firefox的profile文件夹里的user.js中定义新的菜单项(Windows在C:\Documents and Settings\[username]\Application Data\Mozilla\Firefox\Profiles\[randstr])。自定义的方法在扩展的README文件中有介绍(解压或安装后可以看见),也可以在扩展的官方主页看到。

    对于像我这样不喜欢使用可视化编辑器写东西(更利于控制HTML代码质量)的blogger,用这个插件来生成链接代码要方便多了。我定义了两个菜单项如下:

    user_pref(’copyurlplus.menus.1.label’, ‘Copy URL + Title (HTML)’);
    user_pref(’copyurlplus.menus.1.copy’, ‘<a href=”%URL%”>%TITLE%</a>’);
    user_pref(’copyurlplus.menus.2.label’, ‘Copy URL + Selection (HTML)’);
    user_pref(’copyurlplus.menus.2.copy’, ‘<a href=”%URL%”>%SEL%</a>’);

    第一个把标题作为链接文本,第二个把选中文本作为链接文本,生成对应的HTML代码。

  • 打企鹅变速齿轮版

    新鲜出炉,该快的快,该慢的慢,节约时间,为构建和谐社会做贡献:


    版权归yetisports.org所有。。

    另,我打出了5556的成绩,不过是用正规版本打出的,估计自己也难以超越了:

    5556

  • 打企鹅 – 神奇的非洲 修改版

    这两天打企鹅打上瘾了,我玩的是神奇的非洲这个版本,应该是最耐玩的一个吧。注意第一棒要从长颈鹿的肚子下面过去,这样有机会越过两棵树,一下打1200米左右,某同学甚至打出了1500米,真是……我的最好成绩是5棒4000多米。

    让人不爽的是这个游戏没有一个reset键,有时候明明失误了,很希望重新来过,只能靠点浏览器的刷新按钮来完成。于是再听一遍烦人的音乐,再点好多次OK.

    痛定思痛,不是很熟悉flash的我还是把这个难题给攻克了。本来想加个reset的button的,后来图简单,就把5棒结束后乌鸦衔着的那个记分牌给搬过来了,哈哈,效果很明显:


    就加了那么五六行action script. 因为机器上没有一个字体,原来的字体被替换了,不过没多大影响。