Archive

Archive for February, 2007

WordPress 插件编写简例

February 26th, 2007 Fwolf 6 comments

虽然市面上有很多 WordPress 的插件,但未必能够满足我们那些稍微“变态”一些的需求,所以,参照wp官方的插件编写指南,写下这个简单的说明和小例子,希望对大家有所帮助。

插件编写需要php的基础知识,并且本说明的内容大多只适用于wp1.5以后版本。

插件程序建议放置在wp-content/plugins/目录,如果有多个程序文件的话,可以在这个目录下建立子目录,程序所需的资源文件建议也放在这个目录下,便于更新和管理。

wp插件主要分为两种:

  • Action 对wp的行为事件进行修改,比如修改数据库,发送邮件或者修改显示结构等。
  • Filter 对wp的输入输出内容进行修改。

在本例中,我们将建立一个简单的Filter插件,替换wp本来的文章摘要生成功能,把以前手工修改代码实现的内容,用插件来替代。

wp推荐在插件程序中加入这样的文件头,便于wp辨认插件的信息,就像下面这样:

<?php
/*
	Plugin Name: 插件名称
	Plugin URI: http://插件网址
	Description: 插件说明
	Version: 插件版本
	Author: 插件作者
	Author URI: http://作者网址
*/

插件的代码风格主要是基于过程方式的,所以要尽力避免函数重名,可以在函数名之前加上自己的名称前缀,也可以把自己的类包含在一个类当中,不过小型插件还不至于复杂到要使用类的程度吧?

函数的编写就是php代码了,注意Filter一定要返回数据,即使没有修改也要返回,不然后续的其他函数就没法干活了。更多的信息可以看官方的插件api

编写完成之后,函数是不会自动执行的,wp为插件函数的执行提供了一种hook机制,就是在原始的wp程序中,预置了一些hook或者叫挂载点,通过把插件函数挂在这些hook上,就可以被执行,目前wp提供的挂载点一览见Hooks列表。

针对我编写的函数,是要挂在生成文章摘要的地方,查找了一下Hooks列表,发现和摘要(excerpt)相关的有:

default_excerpt 
excerpt_edit_pre
excerpt_save_pre 
get_the_excerpt
the_excerpt

从名称可以看出,default_excerpt是文章的默认摘要,excerpt_edit_pre和excerpt_save_pre是编辑文章是对摘要进行的预处理,get_the_excerpt是取摘要,the_excerpt是返回摘要。我编写的是生成摘要的功能,应该挂在get_the_excerpt或者是the_excerpt上,考虑the_excerpt可能更“底层”一些,挂在这里。

挂载的语法也是一个php函数调用,格式如下:

add_filter('hook_name', 'your_filter', [priority], [accepted_args]);

priority为优先级,默认为10,数字小的会先执行;accepted_args为参数个数,默认值为1,如果插件函数需要多个参数的话需要自行设定。这两个参数在使用默认值的时候都可省略。

基本上有这些就够了,我的插件程序完整代码如下:

<?php
/*
	Plugin Name: Excerpt Trimmer
	Plugin URI: http://www.fwolf.com/
	Description: 替换wp本身的“摘要”生成功能,用于在列表或者查询页面显示文章部分内容。
	Version: 1.0
	Author: Fwolf
	Author URI: http://www.fwolf.com/
*/
 
function fw_excerpt($text)
{
	$excerpt_length = 4;
	$words = explode("\n", $text, $excerpt_length + 1);
	if (count($words) > $excerpt_length) {
		array_pop($words);
		array_push($words, '<p />......<a href="' . get_permalink($post->ID) . '">[阅读全文]</a>');
		$text = implode("\n", $words);
	}
	return $text;
} // end of func fw_excerpt
 
add_filter('the_excerpt', 'fw_excerpt');
?>

可以看出插件程序也就是由上面介绍的3部分组成:文件头,函数体,挂载声明。

其实就简单插件来讲,最关键的是找对相应的hook,这就要靠经验和摸索了,wp官方文档好像也没有对每个hook作出详细的解释。

现在,把我这个插件程序保存为wp-contents/plugin/excerpt.php,登录wp,进入plugin设置,就能够看到“Excerpt Trimmer”插件了,启用之就大功告成了。我还存了一份在这里,方便下载。

Related posts

Categories: Blog, PHP Tags: , , , , ,

blogger无法正常发布文件到blogspot的问题

February 24th, 2007 Fwolf 6 comments

大概2003、2004年我就注册了blogger帐号,具体时间记不请了,不过我的gmail帐号就是从这里来的,后来有人宣传blogger可以自动发布到sitesled,而blogger还支持邮件发布,反正我的blog内容也会用邮件订阅到自己的邮箱,所以我就在sitesled开了个分店,一直正常使用。

后来,blogger又搞了个beta,我也去趟了趟混水,不过这次没有用ftp发布,而是直接发布到blogger的blogspot上了,这就形成了第二个分店

由于自己的blog一直是在独立域名和空间上挂着,所以这些分店偶尔会少个一两篇文章我也不怎么在意,可是当blogger的beta结束之后,blogger改用了google account帐号登录,我的两个分店也都整合到了一个blogger帐户下,不仅邮件发布地址冲突了(已经更正,没事了),我还发现sitesled的分店就能够正常发布文章,而blogspot分店在beta结束之前没事,beta结束之后就无法正常发布文章了。

逐项进行检查,邮件发布地址没问题而且不冲突、不重复,转发邮件也没有退信,都正常发出去了,问题出在哪儿呢?碰巧gfans上也有人反映blogger发布的问题,于是乎我把两个分店的设置逐一对比,终于找到了问题所在。

在能够正常发布的sitesled分店设置页面,“格式设定”中的时区和语言都是中文,而无法正常发布的blogspot分店,“格式设定”中的时区和语言都是英语,所以把他们更改为中文和香港时间东8区,再次发送邮件,果然能够正常在blogspot发布了。

简单猜测一下原因,是不是blogger在生成发布页面的时候,针对用户所设置的语言来生成页面文件,虽然目标文件是utf8格式的,但是文字内容需要经过从邮件中解码、un-base64等计算,再转换为utf8,如果用户语言设置错误的话,在这些转换的过程中会出错,所以文章根本就没有存到blogger当中,更别提后续的发布操作了。

我还联想到,同样是gfans中有人问,google的spreadsheet&docs生成的pdf文件,中文怎么无法显示或者乱码呢?这个的原因应该就简单了,因为在我们伟大祖国的it领域,没有一款免费的中文矢量字库,google显然不会用盗版,安装windows系列服务器也不现实,所以,生成的pdf中自然就没有中文的身影了,这一点和linux下有些应用程序生成的pdf文档中的中文是一样的情况和道理。

Update @ 2007-02-24 好像还有其他的问题,当文章转发到多个邮箱的时候,blogspot分店的邮箱在最后一个,不工作,而单独转发到blogspot分店的邮箱的时候,就工作了。另外把发布邮箱地址”Fwolf@Blogger” <fwolfcn.secretcode@blogger.com>里面的”Fwolf@Blogger”更改为”Fwolf @ Blogger”(@前后添加了两个空格),是不是这个原因呢?结果要到下次再发布文章的时候揭晓了。

Related posts

Categories: Blog Tags:

web访问:匿名,穿越,加速,缓存,一个都不能少

February 23rd, 2007 Fwolf 7 comments

导火索是我的foxyproxy不好用了,本来不怎么使用tor的,wikipedia我也不怎么上,可是最近不仅sitesled上不去了,连反spam的Akismet也上不去,导致spam无法识别,越积越多,只能直接删除了事。edgy中的firefox升级为2.0.0.1,我又把firefox的profile文件夹位置挪动了一下,从那以后foxyproxy就没有好用过,不是提示莫名其妙的错误,就是丢失配置,连右下角的图标和状态文字都经常消失。foxyproxy的作用也就是在我访问不同网站的时候,判断是否启用tor,原来说过privoxy也能实现,今天我就小小的研究了一下,并且把相关的匿名web访问、穿越网络屏障、访问缓存及加速串起来,形成一套完整的工具。

我们使用到的工具是privoxytorsquid这三个。

Privoxy是代理转发器,他负责控制那些访问使用代理,使用那个代理。 Tor是socket代理服务器,通过他可以确保目标网站能够访问并且使用者的真实ip不会被记录。 Squid是一个缓存服务器,可以实现访问加速的目的,同时还可以过滤掉广告、js等内容。

Privoxy:

privoxy的主配置文档为/etc/privoxy/config,修改完不用重启privoxy就能生效,在这个文件中添加内容如下:

forward / . #forward-socks4a .ip109.com localhost:9050 . #forward-socks4a www.ip109.com localhost:9050 . #forward-socks4a www.ip1?9.com localhost:9050 . forward-socks4a .ip1?9.c*:80 localhost:9050 .

privoxy的匹配规则是从大到小的,也就是范围最大的放在前面,范围小规则的放在后面,匹配的时候会从前到后,使用最后有效的规则。所以第一条forward是默认让所有访问都走代理,后面的forward-socks4a则是定义访问指定网站需要使用代理,并且是转发到socket代理服务器tor那里。forward-socks4a规则中需要经常变更的就是target_pattern了,就像我写的那4行,其实都是可用的,“?”可以用来通配单个字符,“*”可以用来通配任意字符,“.”放在pattern两端表示之前或之后还有内容,pattern两端是正常字母就说明前面或者后面没有内容了。注意“http://”不能加,否则匹配不上,但是可以用“hostname:80”或者“hostname:443”等方式替代。如果无法访问非443端口的https网站,可以在default.action文件中把

-limit-connect \

更改为

+limit-connect{80,443,8443} \

就可以了,这是因为provoxy默认限制了对非443端口的https访问,详细的解释在这里

另外privoxy的default.action文件默认设置屏蔽了很多广告什么的,包括google adsense都显示不出来,建议用空文件替代之,并逐步用自己的规则来完善,所以如果只保留上面对https网站的访问规则,default.action就是:

{+limit-connect{80,443,8443}} /

Tor: 正常安装,默认配置就可以,监听9050端口。安装完成之后,把浏览器的proxy设置为127.0.0.1:8118,应该就可以访问了。

Squid:

配置文档为/etc/squid/squid.conf,添加如下配置内容:

# 监听端口地址 http_port 127.0.0.1:3128 # 缓存保存位置,1000为缓存总大小(M),16为一级目录个数,256为二级目录个数 cache_dir ufs /var/spool/squid 1000 16 256 # 只允许从本机访问 http_access allow localhost http_access deny all # 配置privoxy为squid的上级(squid的出口连接) cache_peer localhost parent 8118 7 no-query default visible_hostname localhost # 全部使用privoxy代理出去,不允许直接连接外网 never_direct allow all # 显示声明8443端口能够访问,不然这个非标准https端口就又没法用了 acl SSL_ports port 8443 acl Safe_ports port 8443

添加了squid之后,浏览器的代理服务器就不要设置privoxy了,而是要指向Squid:127.0.0.1:3128,这样,我们的web访问会先到squid,如果缓存中没有,再通过privoxy访问外网,并且根据规则使用tor进行匿名加密访问。

现在我们的web访问可以说是无所不能了,并且这三个软件占用系统资源都不多,tor稍微多些,占8.4M内存,privoxy占450+k内存,squid占3.2M内存多,所以对系统的速度影响不大。只是squid服务启停稍微慢一些,不过增加缓存服务器对web访问加速的效果还是很明显的。

一般浏览器的代理设置中,对本机的访问一般都会设置为例外即不使用代理,firefox也是这样,所以对调试本机程序没有什么影响。特殊情况确实需要完全“刷新”页面的,按住“Shift“键再点F5刷新即可,再特殊一点的情况,就把代理更改为privoxy 8118,跳过squid,或者暂时禁用代理就可以了。

另外值得说的是,privoxy和squid都有比较完备的访问控制功能(基于ip或者主机),用来在局域网内架设服务,提供到外网的访问代理服务,是再方便不过的了。什么,sygate、wingate?很久都没有听说过这些名词了,呵呵。

延伸阅读:

update @ 2007-03-18

可以安装squidclient来查询系统运行状态: *取得squid运行状态信息: squidclient -p 3128 mgr:info *取得squid内存使用情况: squidclient -p 3128 mgr:mem *取得squid已经缓存的列表: squidclient -p 3128 mgr:objects (use it carefully, it may crash) *取得squid的磁盘使用情况: squidclient -p 3128 mgr:diskd *强制更新某个url: squidclient -p 3128 -m PURGE http://www.yejr.com/static.php *更多的请查看:squidclient -h 或者 squidclient -p 3128 mgr:

Related posts

Categories: Internet, Tools Tags:

wget也能使用tor代理

February 22nd, 2007 Fwolf No comments

这个不难,就简单说说,其实就是创建一个$HOME/.wgetrc,在里面写上:

http_proxy = http://127.0.0.1:8118/ use_proxy = on

这个$HOME/.wgetrc只是针对用户的设置,全局设置文件为/etc/wgetrc,上面两个设置选项在里面都有注释,不想用代理的时候,把第二个参数设置为off就可以了。

如果你安装tor只是为了在firefox下用, 并且使用了foxyproxy扩展的话,它可以甩掉privoxy,但是wget不行,8118端口就是默认的privoxy服务端口,tor只是socket代理,需要privoxy把http协议进行转换,所以一句话,不仅需要安装tor,还需要安装privoxy,安装方法参见我以前写的介绍

plod推荐Rail of War本地版本来是无法下载的,使用代理就可以了:

使用前: $ wget -c http://www.box.net/public/static/sqodscl31s.zip –15:40:19– http://www.box.net/public/static/sqodscl31s.zip => `sqodscl31s.zip’ Resolving www.box.net… 4.71.164.138 Connecting to www.box.net|4.71.164.138|:80… connected. HTTP request sent, awaiting response… 504 Gateway Time-out 15:41:56 ERROR 504: Gateway Time-out. 使用后: $ wget -c http://www.box.net/public/static/sqodscl31s.zip –16:10:18– http://www.box.net/public/static/sqodscl31s.zip => `sqodscl31s.zip’ Connecting to 127.0.0.1:8118… connected. Proxy request sent, awaiting response… 200 OK Length: 23,418,031 (22M) [application/zip] 0% [ ] 31,987 1019.58B/s ETA 8:33:44

只是速度。。。实在不敢恭维,不过好歹我们不仅能夠使用tor访问“不可达”的网站,还能夠下载“不可达”的文件了。

gentoo wiki上不推荐透过tor使用wget,但是文章我没有细看,反正能用了。另外如果使用了续传-c参数,某些代理服务器会在两次传输数据之间添加“transfer interrupted”这些文字,man wget上说以后考虑增加一个rollback参数,不知道实现了没有。

update @ 2007-03-13 如果系统中安装了squid,好像会自动设置一个环境变量:

declare -x http_proxy=”http://127.0.0.1:3128/” declare -x no_proxy=”localhost,127.0.0.0/8,*.local”

在这种情况下,有时候还需要.wgetrc来指定不使用代理,呵呵。

Related posts

Categories: Internet, Tools Tags:

vncserver找不到字体问题的解决

February 21st, 2007 Fwolf No comments

这个好像也是升级到edgy后出的问题,以前都是好好的,现在启动vncserver后连接不上:

VNC viewer version 3.3.7 – built Jul 4 2006 10:04:48 Copyright (C) 2002-2003 RealVNC Ltd. Copyright (C) 1994-2000 AT&T Laboratories Cambridge. See http://www.realvnc.com for information on VNC. vncviewer: ConnectToTcpAddr: connect: Connection refused Unable to connect to VNC server

到服务器上一看,端口根本就没有监听,查看vncserver log发现有如下错误:

Wed Feb 21 00:25:46 2007 vncext: VNC extension running! vncext: Listening for VNC connections on port 5901 vncext: created VNC server for screen 0 error opening security policy file /etc/X11/xserver/SecurityPolicy Could not init font path element /usr/share/X11/fonts/TTF/, removing from list! Could not init font path element /usr/share/X11/fonts/OTF, removing from list! Could not init font path element /usr/share/X11/fonts/CID/, removing from list! Fatal server error: could not open default font ‘fixed’ xsetroot: unable to open display ‘fwolf:1′ xterm Xt error: Can’t open display: fwolf:1 vncconfig: unable to open display “fwolf:1″ twm: unable to open display “fwolf:1″

查询这里这里才知道,是由于vncserver找不到字体所以就退出了。

解决的办法嘛,这里推荐的使用命令“vncserver -fp /usr/share/fonts/X11/misc”启动有些太繁琐了;这里对/usr/bin/vncserver脚本的修改似乎又麻烦了一些,并且经过我的实验还不成功;而这里推荐的ln目录的方法更不可取了,/usr/share/X11/fonts/misc目录下还有别的文件呢。所以,反正我也要修改vncserver监听端口,所以干脆再在/usr/bin/vncserver上动个小手脚得了:

在/usr/bin/vncserver大约157行的地方:

# Add font path and color database stuff here, e.g.: # # $cmd .= ” -fp /usr/lib/X11/fonts/misc/,/usr/lib/X11/fonts/75dpi/”; # $cmd .= ” -co /usr/lib/X11/rgb”;

我们可以安装这里的例子,定制自己所需要的cmd参数,写在这里,和vncserver -fp …命令的性质是一样的,比如我们加上一行:

$cmd .= ” -fp /usr/share/fonts/X11/misc/”;

注意是“.=”而不是“=”,还有最后的分号“;”不要忘记了,现在再启动vncserver就ok啦。

ubuntu edgy下的vncserver

连接上vncviewer后发现,这次vnc升级之后还是有改进的,我没有修改过xstartup,所以一直使用的是默认的X界面,以前只能打开一个窗口,想多任务的话还不行(图形界面),现在好了,虽然窗口丑陋了一些,但是可以缩为一个图标,还能夠调整大小(虽然不太灵光)、位置,比以前还是有进步的。看右边我的截图,左边那个图标就是毒蛙azureus,颜色没转过来,不太像吧,呵呵。

Related posts

Categories: Linux, Problem, Tools Tags: