2006年06月 的存档

访问wikipedia维基百科的方法

目前访问wikipedia维基百科的方法有很多种,现在逐一介绍一下:

  1. 通过普通的国外代理。这是一种通用方法,不限于wikipedia。因为wikipedia不是使用关键词屏蔽的,所以可用的普通国外HTTP或SOCKS代理就可以了,比如我现在用的这个韩国代理:125.245.19.253:8080,正好在亚洲访问维基百科时是访问维基设在韩国的服务器,在123cha差一下就知道了,查zh.wikipedia.org可以看到,地址是韩国首尔。给浏览器设置代理服务器的方法是:
    • IE:工具->Internet选项->连接->局域网设置->代理服务器,填上IP地址和端口就可以。
    • Firefox:工具->选项->连接->连接设置->手动配置代理,在HTTP代理一项填上IP地址和端口就可以。
  2. 也是一种通用方法,在网址的域名部分后面加上"nyud.net:8090"就可以了。比如访问中文维基可以用http://zh.wikipedia.org.nyud.net:8090/
  3. 维基网站提供的安全链接:
    比如要访问中文维基的主页:http://zh.wikipedia.org/wiki/Main_Page,只要访问https://secure.wikimedia.org/wikipedia/zh/wiki/Main_Page就可以了。而英文就直接访问https://secure.wikimedia.org/wikipedia/en/wiki/Main_Page就可以了。
  4. Gollum浏览器,直接选择界面语言和要浏览的wiki的语言就可以浏览了,只是图片会打不开,速度还可以。

访问blogspot.com上的网站也可以用第一个和第二个方法。不过blogger.com就不行了,必须用TOR。

Update:Cisca.cn教我的访问blogspot.com的方法:在pkblogs网站,输入你要访问的blogspot.com网站的前缀就可以访问了。你也可以直接输入"http://www.pkblogs.com/blogname"来访问,比如我以前的Blog:http://www.pkblogs.com/yskin

这个网站上面有一句:"Is your blog blocked by the Pakistani Government?"Pakistani巴基斯坦。看来不止中国封锁了blogspot.com啊,思科应邀研究出来了这个专门的路由器,也把他卖到其他地方来赚钱呢,呵呵。

Audio Player——在文章中使用Flash播放MP3文件

今天看到胡里胡涂发布了AudioPlayer汉化版AudioPlayer汉化版。这个插件很不错,简洁,不花哨。

胡里胡涂说这个插件有一点问题,有些MP3文件的tag信息显示不正常,即使反编译了Flash文件也没法解决。我看了一下那个MP3文件,tag里用的BIG5编码。我给转成GBK编码,上传测试,无效;把tag格式由ID3v1换成ID3v2,无效;使用UTF-16编码的ID3v2,无效;转成APEv2格式的tag,程序不支持,汗了。最后把一个地方修改了一下,可以正常显示了。
mp3infp

无语,不选那个复选框就好了,只是这个Flash里默认的字体太小,大概只有10px吧,中文显示看不清,起码要12px才可以。不管了,反正以后有显示不正常的,就把tag转成UTF-16的ID3v2格式,并取消选择Unsync就是了。用mp3infpmp3infp修改起tag来非常方便,不是吗?

试试看效果如何:

Update:今天仔细研究了一下这个插件。这确实是个好插件,当然也有些小瑕疵。

Audio Player主页下载插件后,解压得到audio-player.php文件和audio-player目录,将这两者上传至WordPress的plugins目录,到插件页面激活。这时插件已经可以使用了,在文章里写入[ audio:http://yskin.net/wp-content/uploads/audio/曾宝仪-专注.mp3],发布出来就可以看到效果了。

下面说一下Audio Player选项页里各个选项。好像汉化者翻译的不怎么样,估计他最终也没有弄明白"enclosures"是什么意思,如果把写版权声明和责任说明的时间多花点在汉化上也许会更好些,嘿嘿。 /023

  • 第一项是MP3文件默认存放的路径,插件推荐是/audio,而我设置成/wp-content/uploads/audio。这个很好理解,如果你写了这样的代码:[ audio:曾宝仪-专注.mp3],只有文件名而没有完整的路径,那么插件会到这个默认目录中去查找这个文件。
  • 第二项是插件的使用方式。三个选项分别是使用[audio]标签、当发布podcasting时添加一个enclosures自定义域、替换文章内所有链接到MP3文件的链接。一般使用第一种即可。
  • 第三项是在站内所有的播放器播放时在前后分别插入一段音频。这个也只对podcasting有用吧。
  • 第四项是在feed中的显示选项。你可以选择在feed中音频的显示方式。你可以选择显示MP3文件的下载链接,或者什么都不显示,或者一段提示,请浏览者到文章页面来听这段音频。我觉得在feed中直接显示播放器也应该是可以的,可是这个插件就是这么设计的。
  • 第五项是调整播放器显示界面各部分的颜色。下面有一幅图片详细说明每个选项具体对应的位置,你在调整各个部位的颜色的同时可以立刻在下面看到显示效果,真是非常的方便。这些设置都是作为播放器的默认值,你也可以直接在调用播放器的代码里设置各部分颜色,它们将只用于此次调用,并覆盖掉默认设置。

[audio]标签的使用方法有多种,你可以直接使用[ audio:http://yskin.net/wp-content/uploads/audio/曾宝仪-专注.mp3]这样的完整链接形式,也可以使用[ audio:曾宝仪-专注.mp3]这样的简短形式,插件会在默认目录下查找文件。你还可以放置多个MP3文件,只需要用逗号把他们分隔起来,比如[ audio:a.mp3,b.mp3]。不过,这个插件没有前一首,后一首的按钮,也没有播放列表,所以播放多首歌曲时不是很方便。没办法,它是个轻量级的播放器嘛。你还可以在调用播放器的时候加上参数,在选项页允许设置的各部位颜色这里也同样可以设置,具体可以参照软件主页中的Runtime options部分。还有两个额外的参数:autostart和loop,看名字就知道,前一个是自动播放,后一个是循环播放。这两项默认值都是no,使用时只要把他们设成yes就可以了:[ audio:a.mp3|autostart=yes|loop=yes]。需要提醒一句的是,音频文件的自动播放有时会令人反感。

另外,在文章以外其实也可以使用播放器,只要把代码写入一篇文章,发布后得到生成的HTML代码,再复制到模版里就可以了。播放的MP3文件的URL也可以在这段HTML代码里找到,如果听到别人的Blog中播放的音乐不错的话也可以用这个方法来找到MP3文件的URL然后下载。URL在"soundFile"字样后面,不过被HTML实体化了,可以用UEStudio解一下码。

Update2:今天胡里胡涂又说要研究研究,我也就跟着再研究一下。Flash这个东西我不熟,是胡里胡涂帮忙把swf反编译成fla的。也许是反编译器不太好,胡里胡涂说反编译后再编译成swf就不能工作了,我也就只能大概看看fla文件。Flash里有个ActionScript,也就是个类似于Javascript的脚本语言。没有Flash软件,直接用UEStudio打开fla文件看里面的脚本,凭着以前C语言的基础,勉强能看懂一点。(这说明了C语言是多么的重要,学会了C,再学一点C++里类的知识,那么JavaScript、PHP什么的全都可以迎刃而解。C语言真是祖宗级的语言啊。)感觉上ActionScript就是借用了JavaScript的语言规范,很多地方都很象,比如定义类的函数,和C++区别很大。大概看了一下,读取ID3 tag直接用了这样的语句:

emff.id3Tags[_l1.index].data[0] = _l1.id3.artist;
emff.id3Tags[_l1.index].data[1] = _l1.id3.songname;

去网上查了一下,Macromedia网站的文档里说这是Flash提供的功能。Flash读取MP3文件时已经解析出ID3标签,并存在这些变量里。查了下这个"emff",指的是Easy musicplayer for FlashEasy musicplayer for Flash,Audio Player 1.0的更新记录里也提到了它是基于这个emff播放器的。

也就是说,读取ID3 tag是由Flash进行的,那么Audio Player对各种ID3标签的兼容性也就等于Flash对于各种ID3标签的兼容性。我对Flash不太了解,大概分析一下吧:fla文件里是ActionScript源代码,编译后形成swf文件,然后浏览器读取后交给Flash Player播放出来。我想兼容性应该取决于Flash Player,因为我觉得ActionScript是解释执行的。不过swf文件里也许会标记出自带的代码所使用ActionScript版本,这也会影响兼容性吧。上面提到的Macromedia网站的文档里说,Flash Player 6添加了对ID3v1的支持,Flash Player 7添加了对ID3v2的支持,包括2.3和2.4。《ActionScript 3.0 的 Sound类》一文中提到:“MP3声音文件可包含ID3标签,ID3标签提供文件的元数据。如果一个你使用Sound.load()方法加载的MP3文件包含了ID3标签,你可以查询这些属性。只有使用UTF-8编码的ID3标签能够被支持。Flash Player 9以及后续版本支持ID3 2.0标签,特别是2.3和2.4。”后面一句自然不可能,怎么会从Flash Player 9才开始支持呢。“只支持UTF-8编码的ID3标签”也是不正确的,ID3v1里没有确定编码方式,而ID3v2里只有2.4可以写入UTF-8,之前的版本只能用UTF-16。

那么,很明显,Flash读取ID3标签时,只支持ISO 8859-1UTF-16编码格式(对于ID3v2.4标签多支持个UTF-8)。这也体现在mp3infp软件里,ID3v2里只能选择这两种编码,ID3v1里则没得选择。ID3在最初设计时,就只考虑了英语和一些欧洲国家的语言,于是用了ISO 8859-1编码方式。一般的软件比如foobar2000和Winamp迫于现在tag的混乱状态,解码tag时都是按照本地编码方式解码的,比如GBK。这也是没办法,ID3v1设计时就没有考虑到兼容性,弄的亚洲国家只好拿本地编码往里写,比如GB2312、GBK、BIG5。ID3v1标签部分又不象HTML文档那样允许在HTTP头或者HTML文档开头声明编码方式,于是造成了很大的混乱,每个地方的播放器都优先使用本地的编码方式解码,写入tag时也是以本地编码写入,这样出来的MP3文件拿到别的语言的播放器上就不能正常显示tag。Flash比较遵守ID3标准,在ID3v2的说明文档的ID3v2 frame overview一节里也提到,tag的编码要么是ISO 8859-1编码方式,要么是16-bit unicode 2.0,也就是UTF-16,而且必须加BOM,以便区别于ISO 8859-1。所以,Flash读取ID3标签时,如果是ID3v1,就直接使用ISO 8859-1方式解码,于是所有第一个字位为0的字节被认为是ASCII码,为1的被认为是西欧字符,不会象Winamp和foobar2000那样用本地编码比如GBK解码。如果是ID3v2,并且编码方式是ISO 8859-1的,和前面的ID3v1一样。乱码就是这么出来地。如果是UTF-16或者ID3v2.4的UTF-8,则可以正常解码,不会产生乱码。

关于"Unsync",在mp3infp作者的网站上的这篇文章有一段介绍,不过是日文的。在这个页面也有一段介绍,把Unsync翻译成“非同期化”,不过也是日文的。用Google翻译翻成英文,再扛上糍粑看了半天,看的晕晕乎乎的。最后在ID3官方网站看到了ID3 tag version 2.3.0:5.The 'unsynchronisation scheme'。Unsync具体的行为里面讲的很清楚,不过这一段开头就讲到:"The only purpose of the 'unsynchronisation scheme' is to make the ID3v2 tag as compatible as possible with existing software. There is no use in 'unsynchronising' tags if the file is only to be processed by new software. Unsynchronisation may only be made with MPEG 2 layer I, II and III and MPEG 2.5 files."也就是说只是为了满足一些老软件的特殊需求,如果你用的播放器都是比较新的软件则无须使用这个功能,而且这个功能也只能用于MPEG 2和MPEG 2.5的文件。

呃,稍微解释一下,所谓MP3文件,指的是MPEG 1 layer Ⅲ, MPEG 2 layer Ⅲ, MPEG 2.5 layer Ⅲ这三种文件,而一般我们接触到的扩展名为MP3的文件,90%是MPEG 1 layer Ⅲ格式,其余的则是另两种MP3格式,还有一些是MP2格式的。所以这个功能大多数MP3文件上都不能用,遇到的MP3文件都把这个功能关闭就可以了。

所以,上传到Blog上用Audio Player插件播放的MP3,如果是英文的则无所谓,只要注意一下ID3读取的顺序,如果同时有ID3v1和ID3v2两个tag,则ID3v2优先读取。如果是中文的,则需要把正确的信息写入ID3v2 tag里,并把编码方式选为UTF-16或者ID3v2.4的UTF-8,并取消选择Unsync。至于在本机收藏的MP3文件嘛,我从两三年前接触了foobar2000以来,就一直让收藏的MP3文件只留一个APEv2 tag,这样就非常方便,尤其是更新tag的时候。另外还要提到一点,ID3v1和APEv2标签都是保存在文件尾部的,ID3v2标签则是直到v2.3都是保存在文件头的,V2.4则可以选择保存在文件头或文件尾。ID3v2这样的保存方式造成一个问题,就是更新tag的时候,软件必须修改文件头,所以整个文件都要被读出来,修改后重新写回硬盘,造成更新tag速度很慢。而ID3v1和APEv2标签,由于在文件尾,所以更新时只要修改文件存放的最后几个扇区就可以了。再加上ID3v1标签能存放的信息很少,比如吴宗宪的“是不是这样的夜晚你才会这样的想起我”这首歌,由于ID3v1的歌名部分只能存放30个字节,而这首歌的歌名有17个字,用GBK编码存入需要34个字节,ID3v1存不下。而且APEv2标签很简练,存放的数据不是非常多的情况下,占用的空间比ID3v2少。综合起来,APEV2标签是最好的选择。

不过现在的情况下,当tag为中文时,由于Flash不支持APEv2标签,所以ID3v2是唯一的选择。而且在网络上,由于ID3v2标签在文件头,所以浏览者会很快看到歌曲名和歌手名出现在播放器界面上,不会象ID3v1标签那样,一定要整首歌曲缓冲完毕才能看到歌曲名。所以用在播放器的MP3文件我们还是尽量用ID3v2的标签吧。

另外提一下,很多人有MP3硬件播放器,也就是随身带着的那个可以听歌的小东西。那玩意也分好坏,有些比较古老的经常要求标签必须是ID3v1,因为它的解码芯片只能识别ID3v1,支持不了比较新的比如ID3v2.4格式,更别说UTF-16编码和APEv2标签了。歌词也大多只能支持lyric歌词文件,不支持tag内嵌的歌词。所以用那玩意的时候,尽量用些早期的格式比如ID3v1,免得它不认得。

好了,我所了解的都说完了,要想解决这个问题,要么刚收购了Macromedia的Adobe更新Flash Player,增加解码方式的判断,提高兼容性,虽然这样就离标准更远了,不过现在大家都是这样,大势所趋,没办法啊。要么自己注意点,尽量用ID3v2的UTF-16和UTF-8格式。字体大小的问题嘛,还是让作者解决吧。

Update3:最近好像有很多人问到Audio Player为啥不支持WMA。首先,WMA格式是小一些,在低码率的情况下,WMA格式音质无疑比MP3要好,所以WMA很适合低码率环境。以前研究foobar2000时,有一点很多人不明白,就是码率一样的情况下,文件大小基本一样。因为码率的定义就是每秒音频占用的字位数,比如128 Kbps码率的音频文件(无论是MP3还是WMA或者APE),指的是每一秒钟的声音要占用128K个bit,也就是16K字节的空间。所以,码率一样的情况下,无论哪种音频文件大小都差不多,差别只在于tag等数据,顶多差几K。

而Audio Player不支持WMA,在插件主页写的很清楚:"This plugin only plays MP3 files. This is a limitation of the Adobe Flash Player."这是受Flash播放器所限,没办法的。或许这说明Adobe和Microsoft关系不好?呵呵。所以,如果想在Blog里播放WMA文件,还是用CoolPlayerCoolPlayer吧。

WordPress <= 2.0.2 'cache' shell injection exploit

昨天在Google里查找关于Wordpress cache功能的资料时,偶然发现了绿盟一篇文章,介绍Wordpress的一个漏洞。

汗,以前只听说一些论坛程序比如动网有漏洞,原来Wordpress也有漏洞。这篇文章说,在Wordpress 2.0.2及更早的版本中,由于cache功能将用户信息保存到wp-content/cache/userlogins/和wp-content/cache/users/目录中,攻击者可以利用这个漏洞通过换行字符注入并执行任意PHP代码。在Wordpress 2.0.3版已经修复了这个漏洞。

文章里给出了程序,可以在PHP命令行模式下执行。有空的话上网找找看有谁还没升级Wordpress程序,嘿嘿嘿。不过这个程序好复杂,我不懂多少PHP,看不懂。而且我也没有PHP命令行用,想把他改成可以在服务器上执行的,心有余而力不足啊。

Update:仔细看了一下文章的英文出处,大概是说:Wordpress没有充分检查被cache的用户名的数据格式,解决的办法是升级到Wordpress 2.0.3,而之所以被解决是因为:"As of Wordpress 2.0.2 the user data cache is disabled by default."Wordpress 2.0.2以后的版本中,默认禁用用户数据的cache。这说明Wordpress开发组还没有解决这个问题,只是简单的在Wordpress 2.0.3里禁用了cache功能,不知道Wordpress 2.1里解决了这个问题没有。现在要在Wordpress中使用cache功能必须在wp-config.php文件中强制打开,可以参考我的这篇文章

我觉得如果很需要优化速度就使用wp-cache插件吧,尽量还是不要打开这个功能,要是被人攻击了就不好了。不过,好像他是需要用户数据的哈,我们这种不开放用户注册的应该没什么问题吧。希望Wordpress开发组早日解决这个问题,再重新把cache功能设置为默认打开。

Update:在secunia.com还能搜索到很多Wordpress漏洞的资料,有空应该经常去看看。搜索Wordpress漏洞的地址在这里。比如这个漏洞,可以通过访问http://[host]/index.php?paged=-1来看到Wordpress的数据库出错信息。

Wordpress 2.0.3中cache功能不工作

今天才注意到Wordpress的cache功能不工作,wp-content\cache目录中只有wp_object_cache.lock和index.php两个文件,记得以前有好几个目录的。

研究了一下代码,在wp-includes\cache.php文件中发现这么一句:

if ( ! defined('ENABLE_CACHE') ) return;

觉得有点奇怪,wp-config.php文件里没有define这个东西啊。翻出Wordpress 2.0.2压缩包,在相同的位置却没有发现这一条语句,汗。

在wp-config.php里加了一条define('ENABLE_CACHE',true);后,wp-content\cache目录中又有文件了,cache功能恢复了。

google了一下,好像没有人提到过这个事情。不过有一个发现,就是很多浏览量很大的Blog都用了wp-cache这个插件。在google里翻了3页,找到一篇不错的介绍wp-cache插件的文章。看完的感觉是,这个插件的弊端就是整个页面完全的静态化了,包括页尾的查询次数和执行时间都静态化了。而且我的Blog一天才一百多访问量,还用不着这么重量级的插件,还是安心用Wordpress自带的cache功能吧。

Update:好像有点问题,Wordpress开发组不会无缘无故犯这样的错误的,这条语句分明是要让Wordpress在默认状态下关掉cache,如果要打开必须手工在wp-config.php文件里设置enable。查到好像是因为Wordpress的一个注入漏洞,可以参考一下我的这篇文章

Spam Karma 2——反垃圾评论插件

看了aHfUi留言,安装了Spam Karma 2。

这个反垃圾评论插件好复杂,研究了2个多小时,终于有点眉目,过来写一下感受。

Spam Karma 2Spam Karma 2,反垃圾评论插件,通过一些方法计算一条评论的karma值来判定他是否是一条垃圾评论。

继续阅读《Spam Karma 2——反垃圾评论插件》

开始使用Flickr

久闻flickr的大名,一直想用但是记不得自己的Yahoo帐号的密码了。没办法,谁让Yahoo没什么好的服务呢,一直不用,这密码也就忘了。 /028

今天到flickr网站上进行了注册,先按照提示注册了个Yahoo帐号,然后激活flickr帐号。注册好后得到的图片地址是随机分配的,我的是http://www.flickr.com/photos/81971176@N00/,这个时候要到Your account页面点击Set up your URL给自己设置一个别名(alias),我设置成yskin,于是我的图片主页地址就变成http://www.flickr.com/photos/yskin/。(这个别名设置了以后就不能更改了,选的时候一定要小心啊。)

看了下flickr的帮助,又在网上搜索了一下相关的说明文章,得到如下一些信息:

flickr支持jpeg,静态gif,png格式,每张图片的大小不能超过5M。上传图片后flickr会生成一些缩略图,点击All Sizes即可看到,页面下方有图片的地址和自动生成的HTML代码,可以很方便的复制到Blog中。

flickr免费帐户每个月可以上传20M的图片,这20M是带宽限制(bandwidth limit),而不是图片的大小总和,所以删除一些图片也不会再退回占用掉的带宽。这个限制也不会累加,使用量会在用户所在时区的每个月第一天的零点整自动清零。哇哈哈哈,正好今天27号,这3天赶紧把20M用完,等下个月1号又有20M用啦 :)

免费帐户只能设置3个分类,少了点。而且超过200张图片后,之前的图片就看不见了。不过图片并没有被删除,如果发布到Blog上仍然会看到。在网上搜到一个解决办法:使用这个在线工具:http://webdev.yuan.cc/lfvr/就可以方便的查看图片了,只要在左侧的User Information处输入要查看的用户名,即可在右侧方便地查看所有的图片,不受200张限制。

还有一些功能,比如通过email来上传图片,自动发布到Blog等等功能,都可以在页面上方的菜单里找到。作为一项国外的相册服务,flickr的网站速度也不是很慢,而且对于png格式图片和图片中的exif信息支持的很不错,比起国内的一些网站要好的多。

有两篇文章可以参考一下:《flickr使用超详细图解》《Flickr之中文进阶手册》

Update:找到一篇《Flickr工具大集合》,这个是翻译成中文的,英文原版是《The Great Flickr Tools Collection》。文章介绍了很多有用的工具,值得一看。

K2 中文包

今天花了一天的时间做了这个K2中文包,全部192项字符串都已翻译完毕。翻译对应的K2版本是目前最新版的K2 Beta Two Revision 371。

5月份就想翻译K2了,尤其是Wordpress中文包做完的时候就想一鼓作气把K2翻译完,结果一直懒,一直拖到现在。今天终于狠下心来,从中午12点忙活到晚上7点,把192项字符串翻译出来。

因为已经制作过Wordpress中文包,所以翻译K2时轻车熟路。因为是翻译模板,所以比较小心,每一项字符串都仔细的找出它在源代码中的位置,查看一下附近的代码后再找出它会出现在什么页面,最后打开具体的页面,检查这个字符串所要表达的实际意思,再回来填上合适的汉语翻译。这次做的翻译用的是意译,没有一字一句的翻,毕竟最后是要在页面上显示出来给大家看的,不比后台的翻译。有些文字省略了,比如日期前面的Published,因为一个日期在哪儿,谁都可以知道那是文章的发布日期,加个“发布于”简直是浪费空间,本来K2的字就大。还有象文章日期格式和评论日期格式,K2里都单独列出来作为一个可翻译的字符串,我翻译成类似“2006年06月24日 星期六 7:14 pm”这样子。当然这种东西,个人有个人的爱好,所以我在翻译的时候都加了注释,大家可以自行去修改这些字符串,来达到自定义日期显示格式的目的。

在K2选项中的风格信息处加了一点javascript代码,点击一个链接就可以恢复默认的风格信息。这是为了方便那些直接用K2 svn覆盖了K2 r167的人,因为K2的安装代码没有执行,所以风格信息是空的。当然,不小心改错了风格信息的人也可以用这个功能来恢复。(写这段真不容易,要考虑PHP和Javascript字符串的格式问题,最后写出来的跟乱码一样。版权所有,禁止抄袭T_T)

最近K2新加入了上传标题图片的功能,在模板菜单里也增加了"K2 Upload Options"选项页,这个页面的字符串我已经翻译了,不过不知道为什么,代码没有按照格式来写,导致安装后这个页面的翻译无法生效。现在也没有别的办法,只有等K2的作者更新咯。

下载页面

增加显示文章字数功能

今天想实现显示文章字数的功能。不太懂PHP,在PHP手册里翻了翻,找了一些函数来实现这个功能。

代码如下:

echo mb_strlen(preg_replace('/s/','',html_entity_decode(strip_tags($post->post_content))),'UTF-8');

下面解释一下代码中每个函数的含义:

  • strip_tags:去除字符串中的HTML标签和PHP标签。
  • html_entity_decode:将html实体转回字符,就是说把&lt;转为<。
  • preg_replace('/\s/',",$s):使用正则表达式把字符串中的所有空格、空行去掉。“\s匹配任何空白字符,包括空格、制表符、换页符等等,等价于[\f\n\r\t\v]”[via]
  • mb_strlen:指定字符串使用UTF-8编码,计算字符串长度。这样每个中文字符会被计数为1而不是2。

我把代码加到theloop.php文件中,放在Comments之后,Edit Link之前。测试了一下,把文章的全部文字copy到UEStudio中,然后点搜索->文字统计,字符(不包含空格)一项和页面上显示的字符数刚好一致。就这样先放着吧,淡淡的一个数字,初来的人估计都不知道这是什么。

还有一些问题:

  1. 用了4个函数,可能会对速度有影响,安装前留意一下页面执行时间,跟安装后比较一下吧,影响太大就不要用了。
  2. 统计的字符串直接取用文章的原始字符串,没有经过过滤器的处理,所以当使用了一些插件或者表情的时候会统计错误。当然也可以用apply_filters('the_content', $post->post_content)函数处理一下,不过速度恐怕就要影响很多了。想不出来解决办法,或者用Javascript统计字数会好一些?
  3. 这段代码统计了所有非空白字符,并没有区分英文字符、数字、中文字符、标点。如果要单独统计中文字符的话,只要用正则表达式把中文字符单独取出来就是了。如果Blog使用的是UTF-8编码,那么找出unicode中汉字的编码范围就可以了。我截了幅图,使用Windows自带的字符映射表来查找字符的编码范围。
    字符映射表

什么,你要插件?就这么一行代码还插个头啊,做成插件还要上传,激活,最后还是要修改模板,直接把这么一句代码加模板里还省点事。

被发垃圾评论的盯上了

被发垃圾评论的给盯上了,这几天每天都能收到N多垃圾评论。

一些评论是中文的,什么六合彩,淘宝网,色情,特点就是内容是一堆的链接,而且大多是指向某个google page上的网站,正好WordPress默认设定为2条链接以上的自动进入待审查列表,所以这些评论不会在页面上出现,我只要到管理后台的待审查评论页面点全部删除即可。

还有一些是英文的,内容都是一些寒喧,评论者URL则指向同一个Blog的不同文章地址。这些垃圾评论的内容没有太多链接,所以会出现在页面中,有时一天时间,一篇文章就多处19条评论来。

综上所述,国内的spamer还是差了点,既然能写出往WordPress架设的Blog里自动发送垃圾评论的程序,却又不知道Wordpress有2条链接以上自动进待审查列表的默认设置。如果某些评论已经自动通过了,可能会有些人懒得去找去删,一堆垃圾评论在待审查列表里躺着,难道会有人去给他们通过吗?国外的这些也不行,虽然程序会每次自动填写不同的URL,但是大多数模板里评论者URL这块都会加"nofollow"属性的呀。

WordPress提供了对付这些垃圾评论的方法。只要进入管理后台->选项->评论->评论黑名单,填上想屏蔽的关键词就可以了。黑名单的控制很严格,只要评论里带有黑名单中的字符串,这条评论就会被直接无视,所以要小心处理,以免误封。中文的垃圾评论都会堆积某个关键词,比如“六合彩”什么的,直接把这些关键词填进去;英文的垃圾评论的特点则是URL都指向某个Blog的某篇文章,只要把域名填进去即可。这样处理的话,基本不会有误封的危险了。

我还特地去查了下WordPress中进行黑名单处理的函数代码,发现程序把黑名单字符串以"\n"为分隔符拆分成字符串数组,并对其中的每一个字符串进行处理,所以我们填的时候要一个关键词一行。另外,程序会用关键词去匹配评论者的名称、email、地址、IP、评论内容、客户端标识。要是垃圾评论都来自一个IP,那么可以用IP做关键词。某个恨Firefox入骨的人,有本事就禁止所有使用Firefox浏览器的人发表评论啊,嘿嘿。

Update:Blog难免会受到垃圾评论的骚扰,实在是让人不胜其烦。刚用WordPress时,自然想到的是WordPress自带的Akismet插件Akismet插件,不过这东西是要连接到它的服务器进行验证的。以前Akismet出过验证WordPress API被GFW的问题,好在现在一般都能连上。不过缺点是显而易见的,每发表一个评论都要连到位于国外的服务器上验证,一超时评论就没啦。不过好像很多人在用这个插件,反正评论丢失了也留不下什么痕迹,他们也不知道,嘿嘿。

后来接触Spam Karma 2,这是个重量级插件,会对评论进行多项检查。并且,SK2的功能均由子插件实现,你可以随意的扩充他,比如可以写一个过滤所有不包含中文的评论的子插件,甚至还有人写出使用Akismet来过滤评论的子插件:Spam Karma 2 Akismet Plugin

不过由于SK2太重量级了,又是也会在服务器比较繁忙的时候在漫长的检查过程中超时。于是我停用了SK2,完全依靠WordPress自身的评论过滤功能对抗spam,也就是在后台->选项->评论->评论黑名单里填入要屏蔽的关键词。其实,只要两个屏蔽词:"...<strong>","[/url]",就可以过滤掉90%的垃圾评论了。不过,凡是符合评论黑名单的评论,将会自动标注为spam,你在WordPress后台是完全看不到的。而我更希望spam能标出来,让我再检查一遍,检查确实是spam的就直接删掉,免得占用我的数据库空间。今天研究了一下,想着通过修改WordPress源代码来实现,偶然在评论选项页看到,原来还有一个评论审查项啊。把黑名单里的关键词移动到评论审查里,这样所有被过滤的评论就会被设置成缓冲,等待我的审查了。

另外,评论选项页最后的“把来自开放或不安全代理服务器的评论列入黑名单”最好不要选上,因为这个功能也是要连到服务器验证的。

K2 svn

至少30天以前就准备把古老的K2 Beta Two Revision 167模板换成新的K2 Beta Two svn模板,至少10天以前就开始修改K2 svn模板了。今天终于改了个大概,放了上去。其实总共也不到10处,由此可见我有多懒...

换上新模板后,感觉最明显的是新加的Rolling Archives,可以直接拖拽那个条进行翻页,另外就是Livesearch也换了样子,可以直接在左侧即时显示搜索到的结果。

新模板里primary由class变成ID(不过secondary还是class),所以自己的css里.primary都要变成#primary(好像那个sample.css没有修改)。还有,右边的About等不再被翻译成“关于”了,这是因为K2现在使用了自己的本地化文件,不再受Wordpress的本地化文件的影响了。

今天先弄到这里,还有很多事情要做,修改我自己的CSS以适应新模板,调整menu,修正模板在IE下的显示,明天再做吧。

Update:今天升级了一下K2 svn,因为在K2主页看到K2增加了新功能——一个新的选项页,可以上传"Your Own Header Picture",还可以修改文字的大小和背景色。具体的升级方式是通过K2 svn页面下载最新版的K2,或在K2 nightly builds directory下载每次更新后自动生成的压缩包。因为我改动过程序的header.php,theloop.php,sidebar.php,footer.php这几个文件,所以在后一个地址里看了一下CHANGELOG,从我之前用的版本到现在的最新版之间没有改动过这几个文件。Yeah,直接把其他文件覆盖上去,更新成功。

PS:K2网站上还提到将增加的新功能:K2 Navigation System,看图片上的样子实在是很不错啊,不知道什么时候能实现。

调整了一下sidebar,每一项的显示顺序,各项在哪些页面显示,哪些不显示,这些都要调一下。sidebar.php最后会导入sidebar-custom.php文件,所以要添加在sidebar下方的代码可以加到这个文件里,不过我觉得没有什么用处,因为显示顺序也要调整啊,加到那个文件里就只能放在最后了。

把Categories调整成树状结构:在sidebar.php找到调用list_cats函数的地方,给它添加一个参数:在右括号之前添加两个字符",1"。(PS:作为曾经学过一点java的人,我自己用了",true",嘿嘿)这个时候Categories已经是树状结构了,只是没有缩进,看不出来,再在CSS里加上ul.children {margin-left:12px;},这下明显了吧 :)想更漂亮还可以到懒懒喵日记看一下,她的Categories做的很漂亮。具体的CSS可以参考她的CSS文件里所有带".cate"的行。

调整CSS时发现,Firefox的DOM查看器真是好用。点开DOM查看器直接点工具栏第一个按钮,再在页面点一下你要查看的部分,DOM查看器就会自动展开到那个节点。在右边的“对象-DOM Node”左边点击下拉菜单,选择CSS Style Rules,就可以知道哪几段CSS对这个节点起了作用,你可以直接双击修改每一项的值,在页面里可以直接看到效果。选择Computed Style还可以看到当前节点每一项属性的最终值,下翻到最后可以看到一些-moz开头的,这些都是Mozilla和Firefox浏览器所特有的CSS。

修改的差不多了,下面该做K2的翻译了。我简单的看了一下,文章中发布时间的格式都可以在翻译文件里通过翻译的方式进行修改,这样就不用去改模板了。明天再说,饭饭去咯...