Archive for the '软件开发' Category

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

Monday, April 28th, 2008

自从不经意间中对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的插件开发

Thursday, April 24th, 2008

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

  1. 测试时通过http://localhost/wp-content/plugins/bai.php这样的方法是无法对wordpress支持函数测试的,因为直接调用完全没有进入wordpress的作用域和系统,当然无法识别get_bloginfo之类的函数了;
  2. 进入其作用域的方法要么是写一堆inclue,要么就是用wordpress方便第三方开发提供的接口:插件和模板;
  3. 插件开发中必须把action注册到特定的功能域才行。具体方法是写了一个function后使用add_action,后者的参数列表见Action List。还有一个方法是add_filter。
  4. $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编程散记

Monday, April 21st, 2008

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

一、PHP

  1. 连接字符串使用.,比如$nome."|".urldecode($tab[1])。
  2. 调用变量用$,函数则直接调用。
  3. 字符串处理的一些常用函数。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%>");
  4. 处理url的函数有urlencode和urldecode,前者把"为什么"转为%CE%AA%CA%B2%C3%B4,后者再把它转回来。编码是为了适应浏览器对url的处理规则, 对字符串多解码一次也没什么影响,还是原样。还有个函数是parse_url,返回数组,可以通过component调用处理结果,支持的component有scheme、host、port、user、pass、query、fragment。
  5. iconv可以把字符串在不同的字符集间进行转换,比如iconv("gb2312","utf-8",$str)。
  6. 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位。
  7. if中的条件判断语句不能用=而是==,否则就直接赋值了,比如$nome == "Baidu"。
  8. explode函数把由特定间隔符分割的字符串拆解成数组,比如$str = "wd=home",$array = explode("=",$str)后得到array,其中array[0]=wd,array[1]=home。
  9. count则统计数组中元素的个数,count($array)的话就是2。
  10. 调试函数在,怎么忽然就该页为空了(在浏览器中啥都不显示),试了几次都不行。想想刚才都做了什么,也就是更改了页面的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));搞定!
  11. 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 = urldecode($rk->urlrequested);
$q="UPDATE $table_name SET urlrequested = '$tmpstr' WHERE id=".$rk->id;
$wpdb->query($q);
}
print "".__('done','statpress')."
>";
me非常担心这样的语句如果不能按照本意进行,会毁掉所有记录的那一栏数据:
update $table_name set urlrequested = urldecode(urlrequested);
(二)在本地安装的php、mysql和wordpress组合中导入网站导出的数据(为后缀名为sql的文本文件),命令语句:

mysql -uroot dataname < dataname_wp_20080427_287.sql

(三)创建数据库并授权以及添加用户。

用root登陆后 create database db_name;

grant all on db_name.* to db_user@host identified by 'password';

(四)update语句影响的set数目。为了使statpress在update时能精确显示信息,me增加了setcount参数进行统计,点击statpressUpdate时结果如下:

Updating OSes: 2006 sets are set to blank. 2006 sets are updated. done
Updating Browsers: 2009 sets are set to blank. 2009 sets are updated. done
Updating Spiders: 0 sets are set to blank. 0 sets are updated. done
Updating Feeds: 0 sets is set to blank. All is done.
Updating Search engines: 458 sets is set to blank!
2284 are select-ed, 458 are updated!

可以看出,在每个项目中被置空的数据记录居然数量不一样(OS中是2006个,Browser中则是2009个)。按道理像这样的语句 UPDATE $table_name SET spider = ''; 应该是更新数据库中的所有记录数才对啊。Google了半天,总算搞清楚了原因。那就是MYSQL在更新数据时如果该数据和将被更新的数据一致的话则不会发生作用,这样的话上面语句仅仅更新了那些不是''的记录。仔细想想,这种处理确实有理,可以提高sql语句运行效率,在数据库很大的时候当然会显得非常有必要。

(五)清除某些插件的残留物。插件启用后有些时候感觉不好用,总是要放弃的,但有些不友好的会留下一些东西,像创建的数据库啊以及在options中的记录等。用下面语句清除:feed_statistics、wp-poll、tantan的ga。

$str = '';
foreach($wpdb->get_col("show tables like '%wp_feed_%'") as $db_name){
$str .= $db_name."|";
$wpdb->query("drop table $db_name");
}
$str .= $wpdb->query("delete from wp_options where option_name like '%poll_%'")."|";
$str .= $wpdb->query("delete from wp_options where option_name like '%feed_statistics_%'")."|";
$str .= $wpdb->query("delete from wp_options where option_name like '%tantan_ga%'")."|";

三、WordPress
(一)、查看StatPress统计的记录,居然有这样访问的:
/2006/05/23/javascript:void($('akst_form').style.display='none');
是不是有人想黑me啊。

又发现了怪怪的urlrequest,这次是¤§??? and 1=1,me把它敲入地址栏后就转换成了 http://52good.skylast.com/%A1%E8%A1%EC???%20and%201=1,页面结果是Error 404,Not Found。

(二)、rss类的url跟随wordpress的permalink设置情况变化:如果是默认的?p=123则get_bloginfo('rss2_url')得到形如http://host/?feed=rss2;如果permalink设置为/%year%/%month%/,则get_bloginfo('rss2_url')得到形如http://host/feed/rss2。statpress对这种情况没有做特殊处理。此种关联也提醒我们不要随便改变wordpress的permalink,因为会影响很多事情。

(三)、在wordpress中所有插件中的函数可以互相调用,并且还可以用在模板中。强,不过,避免函数名称冲突就显得非常非常重要了。

StatPress深度使用

Saturday, April 19th, 2008

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觉得美中不足:

  1. 在Last Referrers页面中有不少百度的链接,而Google的是直接出现在Last Search Terms页面中,看来是StatPress不能正确识别我们中文用户常用的搜索引擎——百度;
  2. 安装默认是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->query("DELETE FROM $table_name WHERE spider != ''");
	if($qry == 0){
		print "Detele the Spider, DONE.";
	}
	else if($qry === FALSE){
		print "Error occurred when deleting the record with spider content.";
	}else{
		print "".$qry." records with spider content is deleted.";
	}
 

上传至服务器,执行了一次导出数据(Export),打开生成的csv文件,末尾处显示Detele the Spider, start;752 records with spider content is deleted.呵呵,总共删除了752条记录,成功。再次登陆统计界面,柱子已经很均匀了,也很直观。这第二个问题也基本搞定

美中不足的是me发现feeds数据好像少了些。打开第一次到处的csv数据,发现居然还有部分记录是在spider和rss中都有数据,统计了下共有五十条记录,晕,看来me误杀了这部分记录,想恢复是不可能的了,只好作为经验教训了:下次对数据库操作时一定要彻底弄清楚数据库的结构

Feedburner再次乱码

Saturday, April 12th, 2008

上午醉乡子朋友留言说聚合输出(RSS)乱码了,me看了下,果不其然,又出问题了,所以的中文字符全部显示为问号(?)。这种问题出现也不是一次两次了,只是近半年来一直比较稳定,原来也偶尔这样,后来都是自动好的。me登录到feedburner后又发现管理界面也从中文自动切换为英文了,难不成它们又在做调整?!

仔细检查了下发现blog的原生输出是好的,但是通过feedburner烧录的全部乱码,再到Google Reader中查看订阅发现原来的文章是好的,近几天的显示为乱码,可能是因为Google Reader缓存了原来的正常输出吧。检查GR发现情况如下:

  1. 4月7日后的文章开始出现乱码情况;
  2. del.icio.us自动发送的链接订阅摘要中中文显示正常;
  3. 乱码文章始自Twitter Tools自动发的4月7日的twitter摘要;
  4. 文章乱码后在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 Tools自动发送的摘要文章。

先处理第一个。帮助上说这种错误是因为RSS中存在高位字符(high-bit character)比如双引号、省略号等造成的,通常原因是拷贝文字时包含了这些字符。嘿,别说,这篇文章是me转载的,确实是直接拷贝文字过来的。me按照提示找到那篇干细胞的文章把出错的地方重新敲了一遍,再次检查,还是提示出错,试了几次后me干脆把那一段文字给删了,嘿嘿,居然还是提示出错,不过说错误已经转移到下一篇文章了。看来这个验证器并不精确。后面这篇文章也是转载的,同样是拷贝粘贴。唉,检查了半天看不出所以然,放放再说。

第二问题出在每日twitter上。提示是最后那个?有问题,me手工把它换成中文的问号(?)后再次检查,呵呵,OK了。看来是Twitter Tools生成的时候自动把超过140个字符的twitter切断并用?附在后面,偏偏这个又是非法字符。这个问题好解决,在TT的作者搞定之前me只好每次手工去替换了。此问题在前几天已经出现过,应该是twitter在处理过大文本时对中文的支持布什很好造成的。

问题暂时先这样解决,feedburner可能需要重新烧录下了。另外可能还要等其服务器稳定说不定能自动解决这些语言不兼容的问题,feedburner好歹也是Google阵营的同学了,怎么还是这么马虎和不成熟呢。

智能测试器开发笔记

Tuesday, November 6th, 2007

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

在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中触摸和按键事件的处理函数,使全屏状态能恢复成窗口状态以回到程序的主操作界面中去。

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

Motorola A780手机SD卡上无法安装j2me程序的问题解决

Thursday, August 9th, 2007

手机掉了(见酒醉),失落的感觉很浓烈。兄弟知晓信息后马上用行动安慰并解决问题,把Motorola A780给me暂用,低潮的情绪才稍微有点起色。谢谢了,哥们儿。A780和A1200,还有E680用的操作系统几乎一样,这样节省了me的学习成本,功能当然也是差不多的强大,这样me已经习惯的手机阅读和上网习惯才能够继续保持。

手机自带的Opera浏览器上网时很不方便,主要是me不习惯用左侧键翻页而习惯了用导航杆,还是安装Opera Mini吧,再说了后者还有破网功能,可谓是开辟了一条胡志明小道,呵呵。直接手机上网到了Opera Mini的网站,经过复繁的选择后终于可以下载。安装后,兴冲冲的到主屏去找。唷,居然找不到熟悉的那个红色图标!难道是眼睛花了?经过认真细致的多次查看后确认那个红色的图标确实不存在。但是为什么手机又提示安装成功了呢?

me找了个jar格式的书籍,安装。嘿,居然和刚才的情况一样,虽然系统提示安装成功,但却无影无踪。因为前两天工作太忙,这个事儿就暂时放下了,但这个问题一直在脑海里挥之不去。今晚实在无法忍受这种手里拿着智能手机却无法随时上网看书的生活,决定抽点时间解决它。

用USB方式和电脑连接,电脑上多出了两个盘符,分别对应手机存储空间和SD卡。打开Windows Commander的隐藏文件浏览选项,进入 .system 目录下查看。手机存储空间中有已经安装的各种jar程序和QT程序以及pkg程序,并且索引完整有效;SD卡中虽然也有相同的目录结构Java、QTDownLoad,但查阅Java目录,里面没有任何已安装程序的痕迹,索引文件仅仅是LinLoader的相关内容。这也就意味着兄弟原来也没有在SD卡上安装成功过任何软件。

Google了下“A780 安装程序”,找到了关于A780安装loader和MPKG软件的方法,仔细参阅文件好像也没有什么错误。me断开手机和电脑的USB方式连接(连接线和A1200是通用的,另,线冲也是通用的),尝试安装了一个jar程序到手机存储空间中,成功。再次连接,发现手机存储空间中的 .system\java 目录已经有了相应的变化。初步判断是SD卡没有做好安装程序的准备或者说相关的关键文件被破坏了。

把SD卡中的 .system 目录备份后在卡上删除,然后断开电脑连接。安装一个jar程序到SD卡上,嘿,成功。再次连接电脑查看,发现 .system 已经被重建。仔细对照了下发现 .system\java 目录下多出了一个PlugCardDB,这个应该是SD卡上安装程序的索引;到 JAMInfo子目录下查看,和手机存储空间的文件非常类似,仅仅是多了 _card1 后缀而已。至此,问题已经解决。

简单总结下:
1、此问题发生是因为哥们儿不懂手机内部结构,参考网络上文章安装LinLoader程序,破坏了A780的关键索引文件导致。因此,对于刷机、摩机等高级操作,菜鸟需谨慎
2、解决办法说穿了很简单,就是把SD卡初始化即可
3、Motorola的这一系列机子相互参考性很强,可以有效降低学习难度。
4、Motorola出的这系列Linux机器如果功力足够,玩起来是很爽的。

小明信息白花花–Motorola A1200个人信息助理

Thursday, April 5th, 2007
进入拇指时代,手指灵巧的击键转换成一句句话飞往您的亲朋好友、同事领导,短信不但帮您传递出n多问候指令,还记录了您生命历程的某个侧面。随着智能手机的普及使用,仅能收存几十条短信的时代已经一去不复返,您可以几乎无限的收藏收发的短信,这为追踪、回忆、备份生活点滴提供了可能。

小明信息白花花”(最新版本0.5,更新时间:2007年4月11日下午),Motorola A1200的专用信息助理,借助小明强大的储存能力,几乎可以提取、管理、备份您所有收发过的短信。

功能

  • 提取、管理、备份在motorola A1200手机上收发过的短信
  • 可输出收发过短信联系人和号码清单


特性

  • 支持多数据库文件处理,即可以将不同时间备份的数据库文件一次性处理
  • 提供了简单的统计汇总信息显示,如发送人清单、接收人清单、短信总数目、收到短信的数目、发出短信的数目以及短信存放的文件夹数目等


版本升级

0.5版本 时间2007年4月11日

  • 采用数据库方式存放短信和联系人数据,为后续的查询、过滤等操作做准备

0.4版本 时间2007年4月7日下午

  • 分离数据和程序文件,自动处理程序目录下data子目录下的所有数据库文件

0.3版本 时间2007年4月6日下午

  • 输出联系人清单,包含手机号码(仅收发过短信的联系人才有)
  • 增加收发短信数目、存放文件夹数目等统计信息

0.2版本 时间2007年4月5日夜

  • 修正发出短信接收人号码无法提取的问题
  • 输出短信内容中的时间改为易读模式
  • 输出短信默认自动按照时间倒排序

0.1版本 时间2007年4月5日

  • 处理当前目录下data子目录中所有后缀名为db的数据库文件,一次性提取出所有短信
  • 能识别重复短信并做妥善处理
  • 命令行运行模式
  • 短信输出至当前目录下的文件中

使用方法

  • 软件环境要求
    • Windows XP等NT类操作系统。其他Windows操作系统未测试,请朋友们帮忙测试并反馈支持的系统平台,谢谢
    • JRE1.5.0。系统中需要安装JAVA,版本要求1.5.0以上,不需要那个开发版的J2SE,只要能够运行jar压缩程序包就行了。测试方法:随便开个DOS窗口,键入java -version,如果能正常显示当前的java版本信息就ok了。
  • 数据文件准备
    • 请仔细学习“A1200的MPKG安装软件,pkg系列软件”一文,安装备份恢复pkg软件
    • 在手机上执行安装好的备份软件。备份后可以把手机上的短信删除或清空,不要怕怕,数据已经备份到TF卡上了。
    • 把备份到TF卡上的数据库文件传到电脑上某个目录
  • 使用方法
    1. 把下载的“小明信息白花花”压缩文件包解压到某个目录
    2. 把拟提取短信的数据库文件(后缀名是db)拷贝到该目录中的data目录下(如果没有请自己建一个)。注意:不同时间备份的数据库文件名称默认是main.db,拷贝过来的时候请逐个改名,名称随意叫,只要保留后缀名是.db就行了。
    3. 开启命令行窗口,进入该目录后键入mingpim,回车运行该批处理文件。

运行输出示例
D:\myprogram\mingpim>mingpim
正在处理数据库文件:main20061007.db
正在处理数据库文件:main20061009.db
正在处理数据库文件:main20061011.db
正在处理数据库文件:main20070405.db
正在处理数据库文件:main20070325.db
正在处理数据库文件:main20070315.db
发送人共有 308 个,分别是 [***,……
接收人共有202个,分别是[***,……
共有 4123 条短信,分别存放在 6 个目录中;其中发出短信 1400 条,收到短信 2723 条
共有短信 4123 条,已经输出至文件:全部短信.txt
共有联系人 289 条,已经输出至文件:联系人.txt

下载地址

欢迎使用并提意见,谢谢。

智能测试器——测试您的爱姬性能

Sunday, March 18th, 2007

手机功能越来越强大,已经不再是打打电话、发发短信那么简单了,您还可以用它来上网、玩游戏甚至收发邮件、查看工作文档。苹果公司新推出的IPhone更是把它向前推进了一大步,通讯和无缝结合的互联网应用。现在坊间传言Google也要加入战团,推出所谓的G-Phone,是真的吗?会更强吗?

那个玩意儿还是有点遥远的,还是让我们先看看自己的手机功能到底有多强大,有多智能,支持哪些应用呢?me做了个J2ME程序,名字叫"智能测试器"(最新版本0.0.67,更新时间2007年11月28日),您不妨下载试试。

功能

  1. 系统平台测试。如CLDC1.1和MIDP2.0等。
  2. 显示能力测试。包括支持的色彩数、灰度级别,背景色等。
  3. 屏幕测试。触摸屏支持(点击和拖曳)、缓冲支持、是否支持JPG图片的显示等等。
  4. 背景灯光闪烁测试。
  5. 振动功能测试。
  6. JSR支持测试。比如可存取手机内部文件的File Connection、Mobile Media等。

特性

  1. 支持多项性能测试,包括显示能力、对声音的支持、动画能力、文件存取和触摸屏等。
  2. 在每个项目的测试中如果所获信息太多超出了显示范围则自动滚屏。
  3. 自由在全屏和窗口之间切换。
  4. 通过短消息发送测试消息给作者以供分析之用(自愿)。

版本升级

下步计划

  • 增加对闪烁灯的测试支持
  • 保存测试结果供重复查阅和保存
  • 实现参数配置功能,比如显示区域、边距、背景图设定等可动态调整并自动保存,方便程序下次启动时调用

0.0.67版本 时间2007年11月28日

  • 更新背景图片三张
  • 添加彩蛋(音乐的哟)
  • 优化测试信息,使其更简洁

0.0.55版本 时间2007年11月21日

  • 增加About界面,介绍测试器本身及其使用方法
  • 把屏幕划分为功能区和测试区,并使用不同的字体和颜色
  • 同时支持按键(1、2至8)和屏幕点击显示测试信息
  • 增加了无线短信发送测试结果的功能
  • 测试器界面全部用Canvas实现,更美观
  • 完美支持英文单词的换行。行尾如果只有两个及以下字母则该单词自动折往下行;超过两个才自动添加连接符“-”
  • 修正了负责滚动的Thread无回收的问题

0.0.23版本 时间2007年11月18日

  • 实现测试信息智能自动滚屏
  • 增加对英文文本的支持,实现单词折行自动添加连接符“-”
  • 自动随机选择背景图片(目前一共有三幅),并且可以通过左方向键手动更换背景图片,即时生效

0.0.21版本 时间2007年11月17日

  • 增加对文本换行的支持
  • 优化性能,必要时才启动线程

0.0.14版本(代码重写后的新版本号) 时间2007年11月9日

  • 代码全部重写,提高程序性能和运行效率;
  • 界面全部用Canvas实现,美化显示界面;
  • 对是否需要滚屏进行判断并做相应处理;
  • 核正测试项目名称;优化项目分类

0.0.25版本 时间2007年11月06日

  • 增加对触摸屏的测试

0.02版本 时间2007年3月28日

  • 增加对蓝牙和无线消息的JSR测试

0.0.1版本 时间2007年3月18日

  • 支持基础的五项测试:屏幕、平台、背景灯光、振动、JSR(文件存取、PIM、移动多媒体、3D动画)
  • 采用进度条方式显示测试完成程度

使用方法

  1. 下载智能测试器,0.0.67版本,zip压缩
  2. 把解压得到的smartest.jar通过数据线连接或者蓝牙的方式上传到您的智能手机上。
  3. 安装该jar程序并运行。
  4. 用手机上网下载智能测试器,0.0.67版本,jar直接安装使用。

另附上“开发笔记”(动态更新),欢迎同好讨论交流。

摩托罗拉A1200手机的电话薄管理问题--具体案例分析

Sunday, February 18th, 2007

春节前快放假了(腊月二十八),一朋友拿一摩托罗拉A1200过来,症状如下:

  • 短信无法删除,无法接收新短信。删除后的短信过一会儿又出现在收件箱里了;收到新短信系统提示无空间(memory full)。
  • 无法添加联系人。

该手机使用者业务繁忙,联系人众多,无摆弄手机的兴趣和爱好,最常用的手机功能仅仅是打电话和收发短信。以上问题已出现了约十来天,不胜其扰,联通公司乘虚而入,送了他一部世纪风双模手机。他希望尽快启用新手机,因为年关了事情确实多且重要,秘书则希望能为其备份一份联系人清单以备后患。

梳理了下,问题核心在联系人清单(也就是电话薄)的转移备份。me进入电话薄看了下,各个联系人的电话都可以查阅,存放位置在SIM卡和手机中都有,卡上89个,手机中116个,部分还是重复的。SIM是经过了扩容的,容量为250,刚好可以容纳下所有的联系人,呵呵,很好,这下好办了。先搞定电话薄转移问题。进入电话薄,利用菜单中的SIM卡和手机内存相互复制功能,把手机中的联系人全部复制到SIM中。然后把SIM装入那个新的双模手机,开机,OK,联系人全都有了,搞定。此步看起来没有什么科技含量,呵呵,但却至关重要,因为用户可以马上启用新手机,和所有联系人打电话或者收发短信,正常开展业务了。

再来搞定电话薄备份问题。摩托罗拉A1200随机附送的光盘中有个软件叫Motorola Phone Tools,功能包括收发短信、管理日程、电话薄处理等,其中就包含电话薄同步。好,开步走。安装MPT;在手机的设置中把USB连接模式调整为MODEM;用数据线(MINI USB,就是那个一头大一头小的USB线,随机送的)把手机和电脑链接好;启动MPT,进行同步操作,联系人、任务等会自动同步到默认的管理程序中(一般是Outlook,注意非Outlook Express);把联系人导出为通用的格式如csv、vCard等,把文件进行备份就可以了。

上面是使用层面的解决方案,下面我们再看看A1200存在的一些问题:

  1. 关于摩托罗拉系列以Linux为操作系统手机的内存满问题。从E680开始,此毛病就一直存在,包括E398、E680i、A768以及这个A1200。这个问题给用户造成了非常大的影响并且无法理解,更无法解决,当然会损害摩托罗拉甚至linux平台的名誉。此问题在其它品牌和平台的手机上其实也存在,但人家都把问题进行了隐藏或者处理,最起码也可以体面的进行提醒,为什么MOTO就不能做到这一点呢!从技术上看,核心问题在于对存贮联系人、短信、任务等关键数据的数据库文件进行了限额,即不能大于3.5M。
  2. 关于对联系人的删除操作。解决问题过程中me想把SIM卡中的联系人全部删除,操作如下:进入电话薄,选择SIM卡分类,删除,选择全部,显示选中的仅仅是SIM卡上的联系人,确认。毕竟是删除操作,要小心。删了几个后me就停了下来,在此查看电话薄的时候A1200居然是把手机上的一块删除了,晕!此问题绝对是个BUG。对联系人进行的过滤看来仅仅是浏览电话薄的时候起作用,删除是默认一锅端了。当然删除SIM卡上的联系人还是可以操作的,只不过只能一个个来罢了。汗一个,寒一个。伟大的MOTO!
  3. 关于通话录音的误操作。me拿到这个机器的时候查看了下内存使用情况,发现录音目录占了好大空间。询问后确认用户甚至还不知道能通话中录音。也就是说这些文件几乎都是误操作录下的,就是这些垃圾文件把整个内容空间占满后导致了手机操作系统出问题。
  4. 关于USB连接模式。可能是怕用户不经意中弄坏操作系统,即使用USB模式连接电脑都不能对手机内存中的文件进行管理,比如那些录音文件、铃声啊什么的都不能。如果没有装Micro SD卡,您就不要想和手机交换文件了。

在解决问题过程中,me把自己的Micro SD卡装到有问题的A1200上,原来已经安装好的MPKG程序和J2ME都可以正常运行。因为不小心误操作删除了几个联系人,me把那个main.db关键数据库文件进行了备份,希望有一天能把那几个联系人给恢复出来。


关闭
E-mail It