Archive for April, 2008

twitter on 2008-04-23

Wednesday, April 23rd, 2008

  • 晚了,收工睡觉。 #
  • wordpress插件开发构思一:自动为帖子添加形如scribe那样对technorati搜索链接的支持,自然只能针对那些有tag 的咯。 #
  • wordpress插件开发构思二:以statpress为原型,对访问统计插件进行优化升级:丰富统计分析和展示功能。 #

Powered by Twitter Tools.

twitter on 2008-04-21

Monday, April 21st, 2008
  • 收心做事! #

Powered by Twitter Tools.

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中所有插件中的函数可以互相调用,并且还可以用在模板中。强,不过,避免函数名称冲突就显得非常非常重要了。

twitter on 2008-04-19

Saturday, April 19th, 2008
  • 国与国之间的斗争从来就没有停息过,为了什么?就一个词:生存。 #
  • 这个TwitterFox如果能给每句话就加上时间标签就更好了。 #
  • 修改StatPress插件的数据文件,增加对Google BlogSearch、Baidu、Yahoo.cn搜索引擎的支持。 #
  • WordPress已经到了2.5.1版本吗?怎么已经有for 2.5.1的插件出现了。 #
  • PHP确实很好玩,现学现用,把StatPress修修补补的终于比较满意了。另外,这php的教学网点不错,很不错。http://tinyurl.com/kgnhm #

Powered by Twitter Tools.

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误杀了这部分记录,想恢复是不可能的了,只好作为经验教训了:下次对数据库操作时一定要彻底弄清楚数据库的结构

twitter on 2008-04-18

Friday, April 18th, 2008
  • 白酒因为消费群体日益萎缩进而可能出现规模稳定并相对萎缩的局面,此推论成立吗?静态考虑此问题好像成立,其实不然。一方面白酒不仅仅是酒精饮料,更是正式、商务的代表,甚至是成熟 #
  • @ocde 一个灵魂高尚或者有责任感、使命感的公司才有可能长远,因为他站的更高、看的更远,并且愿意也有能力做好。 #

Powered by Twitter Tools.

加油站“后备厢”计划

Friday, April 18th, 2008

公关促销活动的开展,包括和谁沟通、沟通什么、什么时候沟通、在什么地方沟通、用什么方式沟通、沟通规模、如何保证沟通活动的执行以及有什么外延等方面内容,其中要点在于策划和执行。在市场上看到很多不成功的案例,有些属于策划创意很好但执行走样的,有些创意本身就不知所云,也有些创意一般但执行效果不错的,至于策划好执行好的理想情况则属凤毛麟角,很少很少。对于这样不多的优秀案例,我们当然得仔细学习研究评价一番了,这有助于锻炼思维、积累经验并少犯低级错误。

2007年8月在重庆一家加油站发现可口可乐正在做一个活动,叫加油站“后备厢”计划(请见附图)。该活动无论是时机、地点、主题还是实际执行效果都是相当不错的:

  1. 时机选的准。炎炎夏日,更何况是火炉重庆,谁都需要饮水解渴,当然也包括有车一族。
  2. 宣传口号有吸引力。口号是“可口可乐,整箱购买,比超市更便宜”。首先是需要,天热解渴嘛;其次是方便,就在手边,更何况加油等待的那一两分钟能干些什么事儿呢;第三就是便宜,有了前面两条的铺垫,这点显得尤其令人心动,同样是要买,何必要麻烦自己专门跑超市去买更贵的呢,更何况还有赠品(抱枕等)。
  3. 主题明确。名称就叫“后备厢”计划,生恐您忘了该放哪里,蕴意就更奥妙了:后备厢那么大地方,装箱可乐哪里会放不下了呢,并且也该放。
  4. 沟通对象很明确。细分群体,瞄准的就是有整箱购买能力和需要的有车一族。
  5. 现场氛围清晰、明确且不烦扰。产品堆码、主题宣传板、价格立牌、悬挂招贴、赠品示样(车用抱枕),错落有致,浑然一体。
  6. 配套完善。供货点就是旁边的超市,该超市的店招也是可口可乐制作的。
  7. 无看护运行。无需可口可乐公司现场有人组织监督,因为利益分配合理,这些杂事(比如堆码货物的搬进搬出等)都由供货商——超市搞定了。可口可乐公司需要的仅仅是偶尔过来看看氛围布置的适合标准就行了。

活动做到这个份儿上,也堪称经典。另外,通过以上分析可以清晰的看出,策划时是充分考虑了执行中的细节和可能障碍并予以解决了的。

重庆,加油站,2007年8月15日。


附注:Google了下“后备厢”,发现了一篇相关文章“成品油淡季不淡的背后”,摘录部分内容,见下:

引入“后备厢”计划,引导消费

走进重庆销售公司城区加油站,加油岛上整齐摆放着多种饮料,上面标注着“厂家配货、价格比超市便宜”的字样。一些司机在加完油后,顺便购买一些饮料放进后备厢,成为加油站非油经营的一大亮点。

加油站经理告诉记者,这就是我们引入的“后备厢计划”。

以最方便的途径、最快捷的方式、最便宜的价格购买到称心如意的商品,是每一位消费者的愿望。全球饮料巨头可口可乐公司抓住消费者的这一心理,推出了“后备厢计划”——把饮料放在最接近顾客汽车后备厢的位置,让客户“顺手”买到想要的饮料。

在促销活动中,重庆销售把非油品销售纳入其中,便利店业务和加油业务相互促进,共同发展。经过广泛调研,重庆销售针对夏季客户群体的消费特性, 将饮料作为重点促销商品,引进了可口可乐公司的“后备厢计划”。可口可乐公司以批发价给150座具备条件的加油站配货,加油站以低于超市的价格卖给加油顾 客,不仅增加了便利店收入,还吸引了更多的客户到加油站加油。

加油站便利店负责人告诉记者,每天仅可口可乐的销售额就高达2000多元,占便利店营业额的60%以上。

重庆销售公司还联系了康师傅、统一、百事可乐等供应商,优化进货渠道,降低零售价格,受到用户的青睐。仅“五一”黄金周期间,重庆销售销售非油商品14.1万元,较春节期间增长了4倍。

目前,重庆销售正积极在加油站引进自动取款机、城市“一卡通”交易终端等设备,开拓缴纳水、电、气、手机费和销售体彩、福彩等业务。

“这是双赢的合作。随着轿车家庭化步伐的加快,研究驾车人心理、引导有车族消费,是加油站下一步要研究的课题。加油站要借鉴国内外加油站发展非 油业务的成功经验,成为引领汽车时代消费行为的风向标。”对于今年1000万元的非油业务销售目标,重庆销售公司总经理卢乃洪信心十足。

twitter on 2008-04-17

Thursday, April 17th, 2008
  • 印象中杯葛(boycott)是个老词了,怎么也是音译过来的。 #
  • 专心致志办好一件事,然后再做其他的。这样效率最高。 #

Powered by Twitter Tools.

twitter on 2008-04-16

Wednesday, April 16th, 2008
  • http://answers.polldaddy.com/ 哈,这个投票网站不错。谢谢ocde! #
  • 那个棒棒的投票网站应该感谢gongliang才对,呵呵,所有好事都归ocde了,惯性使然啊。对gongliang表示歉意! #
  • 吃着碗里的,还真必须得把这锅。市场的变化不但体现在规模的快速成长方面,还有其中形式的多元化。老是盯着自己的一亩三分地,怎么说目光都不算长远,心胸都不算宽广。 #
  • 在中国这个社会中经商最缺乏的就是“真”。诚然斯然。 #
  • 共享贴必评,当然是通过twitter了。规矩一。 #
  • 如果麦当劳是被像微软Windows那样被标准化了的化,那中式餐馆就是像Linux那样的开源模式。 http://tinyurl.com/5bjr2w #
  • WP-POLLs好复杂,并且不兼容WP2.5。刚找了个memedex-polls,还要到网站去创建帐号,并且感觉该网站很外化,只好再等等了。 #
  • 订阅了 http://www.answers.com/ 的WINE word of the day,感觉对自己是很大的挑战,一方面是e文水平不够,另外是对酒的知识也非常有限。想找个入门级别的酒类相关网站! #
  • 成功管理的一些关键词:热忱、引导、谋略、行动、绩效、竞争、责任、权力、批评、监督、鼓励。晕,太全了! #
  • 多品牌和重金投入研发似乎应该互为膀臂,在企业发展到一定程度积累了足够的财富资源时,此法稳妥长远,尤其是目前所处行业尚未充分发展。 http://tinyurl.com/4fq6ol #
  • Poll: "今天您的心情如何?" http://poll.fm/bapk/ #
  • 貌似PollDaddy的服务不是很稳定。刚注册一个免费帐号后想提交一个Poll,服务器居然宕了,提示服务不可用。 #
  • 又见李敖说话,呵呵。me最佩服的就是老李说话总是拿得出证据,货真价实的证据。 http://tinyurl.com/66z87j #

Powered by Twitter Tools.

行走掠影(七)

Wednesday, April 16th, 2008

漯河,火车站,2007年1月5日。新火车站修的确实豪华气派,从内部装饰看确实很上档次,现代化多了,可能又给当地政府的面子上贴了金。想想也应当,这可是标准的脸面啊,来来往往谁不是先看见火车站,呵呵。但是,如果您恰好想去方便一下的话可能就会感觉有那么一点不爽了,气派豪华现代的主楼居然没有厕所,想去,那好,拖着行李出来吧,下到一楼,行李可要提着了,因为没有箱包滑道,出了大厅,继续提着,还有一二十级台阶,到了广场左右张望,原来在左侧一百多米处才有厕所,那就过去吧,仍然是上台阶,同样没有箱包滑道,呵呵。真不知道那些设计师和主建单位是哪些贵人,感情他们出差都是有人迎来送往并帮忙提行李的吧。一群猪猡!看来这所谓的建设没有监督还真不行,他们真还不考虑使用对象的真实情况呐。这些混蛋政府! 建漂亮火车站的还不止漯河一个地方,这不,武昌火车站新站据说已经快好了,me下次瞧瞧去。


关闭
E-mail It