正则表达式实战(PHP版)

访问:12热度:*****

正则表达式非常强大,但也很难学。花点功夫是值得的。用Netbeans IDE Early Access for PHP虽然因为原来用它做过JAVA的缘故很容易上手,但调试不易让me这个新手学习进度很慢,因为要不停的试错试错再试错,效率很低。昨天装了Zend Studio后感觉太爽了,调试很好用。那就开始吧,解开me一直的心结——正则表达式。
正则表达式是一种可以用于模式匹配和替换的强有力的工具,英文叫Regular Expression,在POSIX中扩充为Extended Regular Expression,简称ereg。ereg共有三种形式:

ereg。默认被php支持,是基础库的一部分,但是对一些新的正则表达式特性不支持,比如lazy模式等。不要被这个Extended迷惑了,要知道POSIX可是1986年制定的。
mb_ereg。是ereg的变体,支持多字节字符(比如中韩日字体编码)。另外一种对多字节的支持方式是preg,需要带上/u修正符(php的4.20版本后有效)。
preg。这个p指的是perl,也就是兼容perl语法的正则表达式。要支持preg需要编译PCRE库,或者直接在服务器端安装。

以上三种形式ereg是兼容性最强的,因为是从基础函数库层面支持的;但preg功能更丰富,速度也快;mb_ereg则对多字节字符支持的很好。比如“中国”的编码是“D6D0B9FA”,用ereg(’/./’,$str)返回D6,如果设定字符编码后用mb_eregx_encoding(”CP936″)就可以返回正确的结果“中”。如果php脚本用的utf-8编码,则可以通过/u修正符来匹配多字节字符。
弄清楚了来龙去脉,下面实战。
一、\b[A-Z0-9._%+-]+@[A-Z0-9.-]+\.[A-Z]{2,4}\b 用来匹配电子邮件地址,比如xxx@gmail.com;
二、preg_match(string $pattern , string $subject [, array &$matches [, int $flags [, int $offset ]]])返回整数,0则说明未匹配成功,1则说明匹配成功,并会把匹配结果存入$matches中,其中matches[0]存储全匹配结果,mataches[1]则存储子模板匹配结果,其中子模板指的是模板中用括号括起来的部分。示例如下:
preg_match(’@^(?:http://)?([^/]+)@i’,”http://www.php.net/index.html”, $matches);
print_r($matches);
输出:Array ( [0] => http://www.php.net [1] => www.php.net )
正则表达式详解:@^(?:http://)?([^/]+)@i:@是模板限定符,这个可以是其他的比如\/等,因为此模板中有//需要匹配,所以要用不同于/的@,当然其他也行;i是修正符,指的是忽略大小写;^,指必须位于行首;(?:http://),是子模板,其中的?代表此子子模板的匹配项不存入matches,仅仅匹配就行了,没有这个?,则Array[1]应该是http://;第二个?指的前面的模板出现0次或1次;([^/]+)又是一个子模板,匹配/,+则代表需要出现一次或多次。
再来一次:
preg_match(’@^(http://)?([^/]+)@i’,”http://www.php.net/index.html”, $matches);
print_r($matches);
输出:Array ( [0] => http://www.php.net [1] => http:// [2] => www.php.net )
我们再举个其他例子:32选7第2006095期 04091316242830+25 ,提取其中的中奖号码包括特别号。
preg_match(”@((0[1-9]|[1-9][0-9]){7})(?:[+])(0[1-9]|[1-9][0-9])@”,$str,$matches);
print_r($matches);
输出:Array ( [0] => 04091316242830+25 [1] => [...]

PHP、MYSQL编程笔记

访问:11热度:*****

开发StatPressCN过程中恶补PHP和MYSQL知识,水平不行,只好边干边学,呵呵。对一些基础不高深的东东简单梳理下,免得忘了下次重来。
一、MYSQL

用MYSQL语句直接修改数据。update `db_name` set `urlrequested` = replace(`urlrequested`,’\”,”) where `urlrequested` like “%\’”,把以’结尾的链接请求末尾的’去掉。replace可以保证key的连续性,如果先删除后添加就没有这个好处了。
插入记录。INSERT INTO users(name, age) VALUES(’姚明’, 25), (’比尔.盖茨’, 50), (’火星人’, 600);如果values中为空,则添加默认值为基础的记录。
更新记录。需要配合where条件判断。UPDATE users SET age = 30 WHERE id = 12;以上语句都很危险,如果where没有设置的话会更新所有的数据记录,所以在进行类似操作的时候一定要先备份,再审慎。
删除数据有两个命令delete和TRUNCATE。DELETE FROM users WHERE name = ‘Mike’ ORDER BY id DESC LIMIT 6;如果有自动增加的字段,用没有where的delete和truncate都会让这个字段从0开始,如果不想这样,可以用带where 1的语句,不过那样的执行效率很多,因为需要遍历整个数据库的所有记录;删除数据时如果使用形如like ‘$tmpstr%’的语句,一定要判断下$tmpstr是否为空,否则很危险,可能删除掉所有数据,后果严重的很。

二、PHP

分开字符串。$p = explode(”=”,$url);
打印出数组中的所有元素。print_r($p);
计算数组中的元素个数。count($p);
数组运算,类似于java中集合的概念,很方便。生成一个空数组:$bloglist = Array();向数组中增加一个或几个元素(从末尾):array_push($bloglist,$matches[1]);添加到数组头部之前则是array_unshift($bloglist,$matches[1]) ;从数组尾部删除一个元素用array_pop(),从头部删除一个元素则用array_shift();让数组中元素唯一(即无重复元素,类似于结合set的概念):$bloglist = array_unique($bloglist);迭代输出每个元素可以在foreach中使用as:foreach($bloglist as $blog);判断某元素是否在数组中:in_array($lookingFor, $bloglist),返回布尔值真假;数组中每个元素都有个默认的key,可以这样输出看看:while (list($key,$value) = [...]

web开发环境的搭建(for php)

访问:29热度:*****

为了方便程序开发,必须要搭建一个开发环境。需要一个http服务器、支持mysql和php,这样才能在本机上运行wordpress。在网上找到了xampp,用了一段时间,感觉不错。稍微记一下,聊以备忘。
下载:apache friends - xampp
安装:下载安装版本一路next就行了,或者下载zip版本自己解压后运行xampp_setup.bat。
使用:
用管理面板启动Apache和mysql即可。需要注意的是请修改xampp安装目录下的apache\conf\httpd.conf,把#LoadModule rewrite_module modules/mod_rewrite.so语句中的#去掉,否则不支持wordpress中的permalink。
至于mysql的优化,建议找专门的文章学学,me简单调整了下my.cnf中的参数,效果很一般,运行起来还是慢的要死,看来这是个专业活。

StatPressCN——BLOG访问统计工具(完美支持简繁中文)

访问:860热度:*****

声明:此插件源于Daniele Lippi的StatPress,me在它的基础之上进行升级开发。me以前的研究开发文章见升级StatPress的功能(完美支持中文)和StatPress深度使用。
插件名称:StatPressCN
最新版本:1.5.6.9(于2008年11月17日)
作者:heart5
【告示】:StatPressCN已经入驻WordPress的官方插件基地,稳定版本请以那里为准。建议大家下载使用官方插件基地的StatPressCN版本,那样就可以通过插件自动更新工具自动更新了,当然,本帖作为开发基地,做技术探讨和交流(qq:724987115或gmail:baiyefeng@gmail.com)所用,仍会维护更新。
插件下载
请前往WordPress官方插件网站:WordPress Plugins -> StatPressCN
插件安装
关于安装:下载插件压缩包,把解压后得到的wp-statpresscn目录上传至blog站点的wp-content/plugins目录下,然后在管理界面中激活StatPressCN插件即可。
关于升级:每次更新版本后请进入StatPressCN界面运行一次“统计系统更新”,以升级统计数据库或对统计数据做一定的清理(比如新搜索引擎识别、关键词识别的升级或其他数据文件的升级)。
关于订阅数统计:建议安装Feed Count插件(如果您通过feedburner烧录了rss的话),这样在widget中显示的订阅数就相对是全的,因为wp-statpresscn会读取Feed Count撷取的数据并和对您的blog原生rss的订阅数进行加总,当然如果您没有在feedburner上烧录的话也可以正常使用。
插件使用
查阅访问统计情况:最直观简单的使用就是进入blog管理界面会看到访问统计的链接,点击进入就可以看到访问信息了,功能提供如下:纵览、详情、探测以及其他辅助设置等;
扩展使用:
1、如果您使用了支持widgets的WordPress模板,则可以直接调用StatPress的widgets,一个叫StatPress,一个是StatPress TopPosts。StatPress是主程序,需要稍微做些编辑,相关参数通过形如%totoalvisitors%的形式调用。
2、那个TopPosts是显示热帖的,可以在模板中直接调用这个小工具。
3、在选项中可以直接设定文章热度显示,不用修改主题代码(很方便哦);另外,为了方便朋友们定制使用统计参数,me提供了几个单独输出的函数,可以在模板代码中使用:

(1)/* Hot,当前页面的热度 */
function iri_StatPress_HotDepth()

注意事项:如果您在single中调用,直接使用 iri_StatPress_HotDepth() 就行了;如果您在index或archive中调用,请使用 iri_StatPress_HotDepth($post->ID) 以传入参数,否则显示的将是当前页面的浏览数而不是具体文章的浏览数。
(2)/* 获取相关文章*
function heart5_related_post($post->ID)

升级和纠错计划

修正通过google.com搜索但自动跳转至google.cn后无法有效识别中文搜索关键词的问题;【搞定】
来自search.live.com的关键词貌似都很无关;【搞定】
过滤形如/wp-cron.php的访问;【搞定】
妥善处置来自baidu cache和google cache的页面参考;【Google Cache部分搞定,Baidu Cache因为机制问题,暂无法处理】
修正对blog源rss的访问统计,正确识别来自同一地址的抓取,目前的数据明显不合理,偏高;【搞定】
增加对繁体中文关键词的判断和识别,方便台湾的朋友使用;【搞定】
调整Overview默认显示天数为20;【搞定】
解决形如akst_action=share-this页面的问题(因为me装了share-this插件导致的)【搞定】;
升级文章热度功能,图形化显示【搞定】;
丰富蜘蛛和爬虫数据文件;【持续更新ing】
增加相关文章功能【搞定】;
把文章热度、最热文章、相关文章和随机文章自动化(不用在手动更改主题模板代码)【搞定了热度功能的自动化】;
优化statpress数据库结构,增加对访问文章的ID登记,彻底解决固定链接切换导致统计不准的问题(为爱折腾的朋友们提供)【搞定】;
增加用户定制功能,比如增加屏蔽IP和搜索引擎数据;
解决添加banip规则后依然记录该ip访问的问题【搞定】;
在侧栏小工具中显示当前访问者信息【搞定】。

升级记录:
—————————————
1.5.6.9 2008年11月17日
主程序:

支持在侧栏小工具中显示当前访问者信息,并且自动化设置,可以在选项中使能。

—————————————
1.5.4.0 2008年11月16日
主程序:

完成相关文章功能的支持,访问量越大准确度越高!

—————————————
1.5.3.0 2008年11月16日
主程序:

接受wx朋友的建议,对侧栏widget稍微做了下美化,可惜me的css水平确实太菜,慢慢来吧;
在侧栏中增加对“技术支持来自天高云淡”字样,朋友们不会觉得很突兀吧,呵呵;
完善对采用默认永固链接的统计输出。

banip数据:增加对66.90.73.188的识别,还是freebsd系统,作为spider,为啥都不表明身份呢?!
—————————————
1.5.2.0 2008年11月15日
主程序:

增加了对page(页面)的访问统计支持;
重新规划Option(选项)页面,使之更直观;
解决了统计系统更新时丢失对feed和trackback记录的错误。

—————————————
1.5.1.8 2008年11月13日
主程序:

修正了无法识别禁访IP的bug。

—————————————
1.5.1.0 2008年11月13日
主程序:

识别对页面的feed和trackback的识别并统计访问次数。

搜索引擎数据:增加对114搜索的支持。
—————————————
1.5.0.0 2008年11月12日
主程序:

全面应用正则表达式工具,精确识别访问页面的postid,避免误判;提升页面显示效率;增加对分类和首页翻页的支持,比如那些page/2之类的链接请求。

banip数据:增加88.191.94.206、60.213.186.250、88.191.79.43、88.191.94.206、88.191.97.89。
—————————————
1.3.5.0 2008年10月27日
主程序:

费了好大功夫才揪出微软的Windows Live的作弊行为,彻底清除来自微软的无效搜索数据。

banip数据:增加对微软垃圾搜索IP的识别:65.55.109.和65.55.110.
—————————————
1.3.4.0 2008年10月26日
主程序:

在选项中添加显示文章热度功能,不用再手动更改主题文件了,哈哈。

—————————————
1.3.3.7 2008年10月26日
主程序:

增加对搜索引擎wordpress.org.cn和guogou.com的支持。

SearchEngine数据:
支持wordpress.org.cn和guogou.com。
—————————————
1.3.3.6 2008年10月25日
主程序:

解决了php5.0中有strripos函数而低版本无此函数无法运行StatPressCN的问题,兼容php4.×版本。
修正了链接请求尾部出现‘的问题(会破坏mysql查询语句)。

—————————————
1.3.3.0 2008年10月24日
主程序:

修正了统计界面中半个汉字的错误显示;
修改了“详情”中显示的项目数量。

SearchEngine数据:
增加了对Google Wap和Google Translate的识别,调整了规则顺序,提高程序运作效率。
—————————————
1.3.1.0 2008年10月15日
主程序:

升级了热帖功能,可以在index和archive中调用。这个功能很直观很方便,是属于访客界面友好类型的。
升级了对Google搜索引擎的识别,可以辨别client=pub-××××的搜索来访了。

Spider数据:
增加了2个新规则,修正了空格问题(会影响对spider的判别)
Browser数据:
增加了对OffByOne等浏览器的识别。
—————————————
1.3.0.0 2008年10月13日
主程序:

终于下定决心更改了统计数据库数据结构,对访问页面的id进行登记,这下可以完美解决用户更改permalink设定带来的统计不准问题;爱折腾的同学们,随便换permalink吧,记得在StatPressCN管理界面中对统计系统升级就行了;
尽量使用wordpress内置函数,少用数据查询,提高程序运行效率。

—————————————
1.2.3.0 2008年10月12日
主程序:

匆忙间居然把对操作系统和浏览等要素的识别代码给删除了,修正之;
解决了对形如/category/life/page/3的识别。这个是分类中文章分多页产生的链接形式。
摒弃原统计中对在线rss阅读器的识别。只要是spider,全杀之。部分解决了上次Hugo Chen朋友提出了统计数据偏高问题。核心就是对spider的处理机制问题。
在readme.txt文件中增加了用法说明。

Spider数据:
增加了1个新规则
—————————————
1.1.2.5 2008年10月11日
主程序:

大幅度调整代码,增加对默认固定链接结构的设定支持和兼容,也就是说不管您的固定链接如何设定,StatPressCN都可以很好的工作了;
增加了对标签、归档、日历等的有效识别;
更新说明文件,因为使用了部分函数,需要WordPress最低2.3版本及以上的支持;
经Hugo Chen朋友提醒,增加zh_TW本地化语言文件;
更新了说明文档中的示例图片。

Spider数据:
增加了12个新规则
—————————————
1.1.1.0 2008年10月7日
主程序:

修正热帖功能,图形化显示(红五角星);
丰富说明文件;
完善简体中文和繁体中文的本地化语言文件。

—————————————
1.0.4.0 2008年10月4日
主程序:

增加了对简体中文和繁体中文的本地化语言支持。

—————————————
1.0.3.1
主程序:

为入驻wordpress官方插件基地对程序和文档进行了规范;
修正程序注释。

SearchEngines数据:
增加了对yahoo alibaba搜索的支持。

—————————————

1.0.3.0
主程序:

修正了来自www.google.cn的图片搜索;精确识别来自Google搜索联盟(client=aff-sub-lianmeng)的关键字;
修正搜索引擎名称机制,根据关键字字符码来判断搜索引擎的细类(如Google hk、Google cn和Google tw等);
对upgrade代码进行了优化。

SearchEngines数据:
增加了对Maxthon搜索的识别。

—————————————

1.0.2.5
主程序:

完善对繁体中文的支持;
彻底解决对连接请求的处置。

SearchEngines数据:
增加了繁体中文使用地区Google [...]

升级StatPress的功能(完美支持中文)

访问:90热度:*****

【将Statpress的升级纳入了正式的开发进程,最新进展请移步StatPressCn插件开发——WordPress插件。此文仅作历史资料参考。】
自从不经意间中对StatPress做了些小修改后,me跌跌撞撞的进入了php空间。感觉还不错,确实简单易学,也很强大。很想在学习的过程中做点什么,最后还是选择了那这个statpress开刀,以它为基础进行扩展升级。
完美支持中文的搜索关键词统计
在后台浏览统计信息发现搜索关键词有不少是乱码,能正确识别的中文字符没几个。把鼠标放上去点到来源地址去看又是好的,看来是statpress对中文不太友好导致的。到作者主页反应了这个问题,好久没有回音,看来还是自己解决算了。检查源码,发现在处理referrer时仅仅使用了urldecode函数对url进行解码,这对utf-8编码的是非常有效的,但对于中国用户常用的gb2312就不行了。
解决办法时把几个中文的搜索引擎(如baidu和google.cn等)单独判断,识别出来后用iconv转换一道。OK,测试成功。
后来发现还是有中文乱码。再查看链接,发现有不少搜索引擎在url中直接定义了语言编码如gb2312或utf-8。这也好办,增加一层判断就行了。如果指明了编码,直接根据其定义分别处理,然后才是针对me定义的中文搜索引擎进行专项处理。于是天下太平,到目前为止所有的中文搜索关键词都正常显示了。
增加对本站直接订阅feed的统计功能
在订阅数量统计中,me借用两个插件实现了网站订阅的总量统计。把玩statpress的时候me发现其实它对feed的订阅情况也有统计,既然这样,干嘛多装一个插件呢。说干就干,用sql语句把feed的总数读出并做一个专门的函数输出订阅信息方便外部直接调用。这个函数调用了Feed Count对feedburner订阅的统计信息,不过如果没有安装FC也无所谓,大不了不统计罢了,statpres还可以正常运行。增加了对时间区间的限制,只取近三个月的活跃订阅。
修正了热帖(TopPost)功能
原函数仅针对permalink是默认情况下有效,对于其他格式的permalink没法产生作用。me修改后支持了形如/month/day/postname.html格式的支持。
增加了文章热度的支持
用当前页面访问量和总访问量进行除操作后得出当前文章的热度或流行度。
注:使用dreamweaver做wordpress主题感觉还是很不错的。
——————————————————————————————————
下载: wp-statpress(modified by heart5)
使用:解压后上传至wp-content下的plugins子目录下即可。
注意:请勿使用插件自动更新,否则升级功能全部自动消除。
——————————————————————————————————

关于WordPress的插件开发

访问:38热度:*****

继续优化statpress过程中觉得有必要进一步了解wordpress的函数和相关开发知识,因为对很多语句有点读不懂啊。幸亏找到了一个好的针对wordpress源码的阐释网站(Xref可以译为交叉参考吗?),对所有函数都有交代,很不错,但是在自己本机实验的时候发现那个类似get_bloginfo之类的基础函数都无法起效。Google来Google去就找到了不少插件开发的相关文章。模拟wordpress默认提供的HellyDolly源码,自己试着写了几句代码进行测试,终于成功。几个关键点如下:

测试时通过http://localhost/wp-content/plugins/bai.php这样的方法是无法对wordpress支持函数测试的,因为直接调用完全没有进入wordpress的作用域和系统,当然无法识别get_bloginfo之类的函数了;
进入其作用域的方法要么是写一堆inclue,要么就是用wordpress方便第三方开发提供的接口:插件和模板;
插件开发中必须把action注册到特定的功能域才行。具体方法是写了一个function后使用add_action,后者的参数列表见Action List。还有一个方法是add_filter。
$wpdb是一个global函数,可以在整个wordpress域中执行SQL语句进行查询。$wpdb->query(’query’);返回整数或false,说明此查询对多少条记录产生了作用。$name = $wpdb->get_var(”SELECT cat_name FROM $wpdb->categories WHERE cat_ID=4″);则返回一个变量,例句中反馈id为4的分类名称。

PHP、MYSQL和WordPress编程散记

访问:61热度:*****

为了解决StatPress存在的中文乱码问题并清除无效spider信息,me下功夫K了不少php、mysql以及WordPress的编程信息。怕下次再重新学习一道,记录一下知识点,聊以备忘。一、PHP

连接字符串使用.,比如$nome.”|”.urldecode($tab[1])。
调用变量用$,函数则直接调用。
字符串处理的一些常用函数。strpos寻找字符串中某字符最先出现处,strrpos寻找字符串中某字符最后出现处,这两个函数都反馈整数值,如果没有找到则返回false;strrchar则返回字符最后出现处至结尾的子字符串,strstr则返回搜索字符串最后出现处至末尾的子字符串;substr取部分字符串,string substr(string string, int start, int [length]);start和length如果是负数则从末尾算起;ereg用正则表达式对字符串进行比较或返回拆分后的数组,eregi同ereg,只是大小写无关,ereg_replace和eregi_replace按照一定的规则进行替换;str_replace替换特定的子字符串,str_replace(”%body%”, “black”, “<body text=%body%>”);。
处理url的函数有urlencode和urldecode,前者把”为什么”转为%CE%AA%CA%B2%C3%B4,后者再把它转回来。编码是为了适应浏览器对url的处理规则, 对字符串多解码一次也没什么影响,还是原样。还有个函数是parse_url,返回数组,可以通过component调用处理结果,支持的component有scheme、host、port、user、pass、query、fragment。
iconv可以把字符串在不同的字符集间进行转换,比如iconv(”gb2312″,”utf-8″,$str)。
gb2312的字符encode后占两位,也就是有两个%,而utf-8则是三位,每个字有三个%,示例:为什么如何使utf-8则encode后为%E4%B8%BA%E4%BB%80%E4%B9%88,共9位,如果是gb2312则为%CE%AA%CA%B2%C3%B4,只有6位。
if中的条件判断语句不能用=而是==,否则就直接赋值了,比如$nome == “Baidu”。
explode函数把由特定间隔符分割的字符串拆解成数组,比如$str = “wd=home”,$array = explode(”=”,$str)后得到array,其中array[0]=wd,array[1]=home。
count则统计数组中元素的个数,count($array)的话就是2。
调试函数在,怎么忽然就该页为空了(在浏览器中啥都不显示),试了几次都不行。想想刚才都做了什么,也就是更改了页面的charset,从gb2312到utf-8,另外就是增加了两行代码。把代码删除,问题依旧;把charset改回去,还是不行。于是就怀疑是不是服务器不稳定,坏了。重新启动,问题居然依旧。这时候才想到去查服务器的log。一看不打紧,全是500,呵呵,标准的服务器内部错误,并且提示PHP Parse error: syntax error, unexpected T_STRING 在某个文件中云云。Google了下,还是没啥概念。在搜索结果中转来转去,忽然有点感觉了,还是代码出了问题,php无法解析导致的。再次检查,晕,还真是,后面加的两行代码导致的。调用函数居然没有用括号括住参数,具体如此println iconv(”gb2312″,”utf-8″,$stem);呵呵晕死。加上应该的括号后变成了这样println(iconv(”gb2312″,”utf-8″,$stem));搞定!
date是用来输出时间日期为特定形式的函数,具体的时间日期值通过mktime获得。date_default_timezone_set(’Asia/Shanghai’);居然只支持Shanghai、Chongqing等,但没有北京。$startday = mktime(0,0,0,2,30,2008);居然也有效,不过生成的日期是2008年3月1日,自动处理了。(strtotime(”now”)-$startday)/86400;获得从某特定日期到现在的所过天数。

二、MYSQL(一)不知道PHP的函数是否可以直接用在SQL语句中,只好把要处理的记录全查出来后根据id一条条进行处理,示例代码如下: $qry = $wpdb->get_results(”SELECT id, urlrequested FROM $table_name WHERE (urlrequested is not null) and (urlrequested != ”)”); print “…”.count($qry).” select-ed; “; foreach ($qry as $rk) { $tmpstr = [...]

StatPress深度使用

访问:186热度:*****

【将Statpress的升级纳入了正式的开发进程,最新进展请移步StatPressCn插件开发——WordPress插件。此文仅作历史资料参考。】
WordPress博客系统的强项在于扩展应用多多,当然是通过插件实现的。想给“天高云淡”添加一个访问统计方面的插件,发现最流行的是WordPress.com Stats,可惜它好像只对一级域名有效,只好放弃。仔细查阅了WordPress的插件列表,统计类好像分为另类:引用第三方统计服务的,比如把把Google Analytics和Feedburner统计结果拿过来在管理后台显示的Google Analytics and Feedburner Reports plugin for WordPress;还有直接在服务器上统计数据并分析的,比如刚提到的WordPress.com Stats和本文重点研究的StatPress。
安装了StatPress后觉得还不错,功能简单实用,统计结果显示也很直观。这几天每天上去看看统计结果,总算对访问情况有了基本的了解(原来一直用Google Analytics,说实话,很复杂;并且不是给blog系统定制的,不直观),但有两个小问题一直让me觉得美中不足:

在Last Referrers页面中有不少百度的链接,而Google的是直接出现在Last Search Terms页面中,看来是StatPress不能正确识别我们中文用户常用的搜索引擎——百度;
安装默认是Do not collect spiders visits,但用了两天me觉得那个那个spider对统计分析没啥意义,就在Options中把它取消了。这下好,它是老老实实的不统计spider信息了,但Overview中那个柱形比例图就很难看了:刚安装那两天因为统计了spider,柱子高高的,后来取消后的日期柱子就很矮(唉,主要还是怪浏览量有限,spider的访问居然超过了用户),中间各分类(Visitors、PageViews、Spiders、Feeds)的情况根本看不清楚。

问题虽然不大,但天天面对也挺烦的,更何况me对细节有那么在意,还是想想办法搞定它吧。
把StatPress的插件压缩包打开,里面有两个目录:def和locale。在def下共有四个数据文件,分别是banips.dat、browser.dat、os.dat、searchengines.dat。用EmEditor打开这些dat文件,发现都是基本的文本,中间定义了各种规则。其中searchengines.dat的文本片断如下:
Alice|search.alice.it|qs|
Google|www.google.|q|
Google Groups|groups.google.|q|
Google Images|images.google.|q|
Yahoo|search.yahoo.com|p|
Virgilio|search.virgilio.it|qs|
Arianna|arianna.libero.it|query|
Altavista|.altavista.com|q|
规则很简单,每行定义一个规则,分为三个部分:搜索引擎名称、域名、搜索词标识。me把所有的访问记录通过Export功能导出为csv格式,用Excel打开,通过Excel的分列功能做成数据表,筛选出referrers,发现有百度、yahoo和Google的blogsearch不能被识别。在searchengines.dat添加如下规则:
Google Blog|blogsearch.google.|q|
Yahoo|search.yahoo.com|p|
Yahoo cn|www.yahoo.cn|p|
Baidu|www.baidu.com|bs|
Baidu|www.baidu.com|word|
Baidu|www.baidu.com|wd|
上传至服务器。进入StatPress界面点StatPressUpgrade按钮,OK。再返回统计页面,呵呵,很好,StatPress已经能正确识别百度等中文用户常用的搜索引擎了,第一个问题算是基本解决。但可惜搜索的关键词中的中文好像不能被正确识别,都显示为问号(?),留待下步探究。
第二个问题的解决思路其实很简单,就是把已经统计的spider信息删除就行了,但因为原来从来没有在服务器上操作过php和mysql,虽然心里有底,还是要充分准备的,搞不好把博客系统破坏了就麻烦大了。
打开statpress.php文件,有九百多行代码。大约浏览了下,它创建了一个statpress数据表来记录访问信息,然后就是各种功能板块的实现代码。仔细查阅后,me决定在iriStatPressExport函数中加入代码删除包含有spider的数据记录。代码如下:
print "Detele the Spider, start:";
$qry = $wpdb-&gt;query("DELETE FROM $table_name WHERE spider != ”");
if($qry == 0){
print "Detele the Spider, DONE.";
}
else if($qry === FALSE){
print "Error occurred when [...]

Feedburner再次乱码

访问:56热度:*****

上午醉乡子朋友留言说聚合输出(RSS)乱码了,me看了下,果不其然,又出问题了,所以的中文字符全部显示为问号(?)。这种问题出现也不是一次两次了,只是近半年来一直比较稳定,原来也偶尔这样,后来都是自动好的。me登录到feedburner后又发现管理界面也从中文自动切换为英文了,难不成它们又在做调整?!
仔细检查了下发现blog的原生输出是好的,但是通过feedburner烧录的全部乱码,再到Google Reader中查看订阅发现原来的文章是好的,近几天的显示为乱码,可能是因为Google Reader缓存了原来的正常输出吧。检查GR发现情况如下:

4月7日后的文章开始出现乱码情况;
del.icio.us自动发送的链接订阅摘要中中文显示正常;
乱码文章始自Twitter Tools自动发的4月7日的twitter摘要;
文章乱码后在GR中好像也无法自动换行了。

晚上到网上Google了下,发现很多相关文章。按照MyBeky的文章说法,me去FEED Validator验证网站的聚合输出,发现原生RSS有错误提示,具体如下:
This feed does not validate.

line 214, column 669: ‘utf8′ codec can’t decode bytes in position 5366-5368: invalid data (maybe a high-bit character?)

… 自克隆的法律,但他们 …

In addition, interoperability with the widest range of feed readers could be improved by implementing the following recommendation.
line 77, column 101: description contains bad characters (5 occurrences)
… 能正常显示?

第一个错误说是在(转载)世界各国的干细胞研究文章中存在utf8无法解码的字符,第二说是存在不合格字符,me查看了下都是Twitter [...]

智能测试器开发笔记

访问:20热度:*****

前往“智能测试器”主题页面
在j2medev看到2004年春天的文章才发现自己的停滞期有多长,还是记下来的好,可以总结提高、备忘和提醒!
2007年11月28日

完善界面功能,在功能区分别显示1、2、3等数字,如果是触摸屏点击生效,如果不是的话按下相应的键也行。处理的时候又复习了switch case的用法。因此是每次重画背景,所以程序可以实现屏幕自适应(全屏和窗口模式)。
测试短消息的时候发现短信的存储规律,单个短信可以存储70个汉字(140个ascii码),两个短信挂接则只能存储136个,三个短信挂接则只能为212个,归纳出公式为n×70-n×2-2。真机测试中短信发送功能似乎不是很正常,有时候收不到短信。原因未知。
为了好玩,增加了播放音乐的功能。J2ME的媒体播放框架很方便,很轻松就实现了。

2007年11月21日 n多升级和心得,呵呵,结果比较满意

升级MyCanvas使其可以接收字符串输入,彻底替换掉所有的高级UI。过程中碰到了一个问题,因为有些测试信息(比如Display方面的)需要在MIDLet中获取,所以me就在MyCanvas中构建了一个SmarTest_Happy的实例,但运行时笔直出错,调试发现提示权限不够。分析发现在J2ME程序中不允许存取调用MIDlet实例,仔细想想也有道理,但me的问题需要解决啊。后来通过在MyCanvas中增设相关测试信息域的方式解决了问题,在MIDlet的start过程中对其进行设定就行了。调试时发现“平台信息”等运作良好,但JSR、震动和屏幕闪烁等无效,不知道是为什么。后来只好为MyCanvas增加了“测试”Command(显性调用相关方法)才解决问题,美中不足的是Command增加到了三个,默认启动了菜单。
把屏幕划为功能区和信息区,其中信息区可以直接使用已经调试成功的MyCanvas主功能(把顶、左、右、下坐标定义好就行了),但功能区需要每次先在fullimage中画好。把左侧(20px宽)划分为8个方块,分别进行6项测试、About信息显示以及全屏切换,底部(40px宽)显示当前时间等信息。
对字体设定进行了实验,实现功能区和信息区字体不同的设计目标。只是每次makeBackgroud时都需要重新构建Font对象,Handle有很多,但愿JVM的垃圾回收效率很高啊。
调试时发现需要滚动时启动的线程没有相应的进行终止,解决之,免得无头“苍蝇”满天飞。
成功实现无线短消息(WMA)发送短信的功能,现在“智能测试器”可以自动给me发测试信息了。为了避免阻塞,启用了单独的线程处理短消息发送问题,在me的Motorola A780上测试成功。
真机调试时发现其他类型手机配置下生成的jar在me的A780下无法运行,后来发现是配置设定问题(比如是MIDP1.0还是2.0啊还是2.1之类的),后来为了方便,把Netbeans“聪明”的帮me自动添加的其他配置全删除了,只保留了一个DefualtColorPhone,这样应该各种手机都可以正常运行了。在两款真机上进行了测试:Motorola A1200,运行正常,其他测试项目结果正常,但在JSR的测试方面信息反常(比如号称A1200不支持WMA等JSR);Nokia 7610,无法安装。
彻底解决了英文单词折行的问题:如果行尾有两个及以下的字母则此单词完全折到下行去,如果还有三个及以上字母则添加连接符“-”。
试用了CVS的标记和分支功能,需要继续探讨。

2007年11月18日

终于实现了自动滚屏,在真机上测试成功。原因在于从Canvas中的paint方法中引出Graphics对象后对其进行处理无法实时更新,解决的办法是创建一个可修改的Image对象,把需要的内容画上去,然后调用repaint方法,在paint方法中每次把该Image画到屏幕上就OK了。不知道MIDP2.0中的GameCanvas是不是也是这样的实现方法。
实现了英文单词折行时自动添加短横线“-”的功能。方法是扫描行尾两个是否都是字母,如果是则添加连接符。

2007年11月17日

增加了对字符串中回车符的识别处理。’\n’只是一个特殊的字符,char类型;貌似Font对stringWidth的处理是自动忽略掉了控制字符。
调试时发现处理文本时调用了两次,一次是Canvas显示的时候,一次是Paint的时候。解决办法是去掉显示时的调用,在Paint中进行判断,显示空间不够的话再调用Thread用来滚行。
对代码进行注释,方便升级程序时还原设计思路。看来还是要养成即时注释的习惯。

2007年11月9日

通过Thread实现文字滚动,但在A780的模拟器(MOTO官方提供的)中测试成功,可是拿到真机上就不会自动滚屏了,另外在WTK2.2.1中测试(也是模拟器)也不能滚屏,和真机上效果一样。原因正在分析中!
增加了对显示区域是否能容纳当前需显示文字的判断,避免不需要滚屏的时候滚屏,那不是纯粹的浪费嘛。
结合Netbeans IDE中自动生成的代码重新写了个MIDlet,感觉很好,对其实现流程和MIDlet的逻辑加深了了解。
把那个自己画的Canvas模块化了,可以接受长字符串作为参数然后显示,这下可以丢掉MIDP的高级UI了(丑的要命),更为程序的界面美化提供了可能。
测试一直用的是中文,后来才发现对英文单词总是在行末被折断,汗,好丑。实现英文分词是必须的,否则……下步搞定。
调试非常重要,开发期间不要吝惜使用System.out.println等语句。
对代码进行版本管理了,其实Netbeans IDE中使用CVS还是很方便的。

2007年11月7日
在Canvas上显示长字符串的思考和分析

目标:让字符串优美的现实在Canvas上。
要求:会根据边界(上下左右)自动折行并不丢字;如果显示区域容纳不下,会自动向下平滑滚动。
思路:先根据边界要求和Font高度遍历字符串,拆分成字符串数组;如果高度合适,直接显示,否则显示首页后自动向下滚动,滚动到尾页时停止(此时文字应该满屏)。
关键点:如果使用setclip不知道会不会影响背景图像;刷屏时可能产生抖动或其他情况,视觉感受不好,滚动时应该1pix、1pix的向下走;也可以考虑把字符串排版好后生成图像,把整个图像慢慢向上拉。

2007年11月06日

终于自己画了Canvas实现了全屏,不过在显示既有图片的时候出现了问题,花了n久功夫都无法正常显示,但画线条和几何图形又正常,迫不得已上网求救。后来静下心来逐条梳理:Form和Alert中的图片都能正常显示,说明系统和机器都没有问题;加入调试语句发现原来是找不到图片的路径,和Netbeans自动生成的代码比较才发现原来是把图片的路径搞错了,应该是/res/apple_new.jpg。教训:遇事勿急,冷静对待,系统分析,然后动手而不是动嘴;另外就是没有想清楚之前最好不要动手,即使解决了也是瞎碰的,没意义,何况那样的话解决掉的可能性本来就很低。
写了个在Canvas上写长字符串的函数,可以自动折行,呵呵,心里很是得意。不过美中不足的是掺杂了标点符号的行和其文本行尾端总是对不齐,坑坑洼洼的;另外就是暂时没有超过一面的更长字符串进行处理。
覆盖了Canvas中触摸和按键事件的处理函数,使全屏状态能恢复成窗口状态以回到程序的主操作界面中去。

前往“智能测试器”主题页面