分类 劳动万岁 下的文章

PC客户端软件的皮肤配置方式有很多种,简单说来就是如何把图片在屏幕上贴起来,从需求上看,可能要应对多套皮肤、多种配色、异型皮肤等等。有的软件选择将所有小图片放在一张大图上,有的软件喜欢用各种小图放在一个目录下,还有的采用了混搭的方式,这里讲的是第一种。

先放出一张结构图来,方便理解(点击查看大图):
请输入图片描述

theme处于最顶层,同一个皮肤下可以有多个style,一个style下可以有多个layout和color_schemes(实际上限制每个style只有一个layout跟color_schemes更好理解)。

layout的子节点就很清楚了,通常软件会有很多个窗体,其中有一个是主窗体,其他是附加窗体;每一个窗体里会有不同的组件,比如一个播放器窗体里可能会有滚动条组件、列表组件、按钮组件;每个组件为了美观,可以被划分为若干个碎片,比如滚动条的控制柄或是滚动条的顶部花纹等等,当一个组件为按钮的时候,碎片就要表现按钮的多种状态,如鼠标按下、弹起、悬停、按钮不可用,

图片的定位采用了选择起始坐标+长宽的方式,也就是image_x,image_y设定某个按钮贴图的左上角坐标,通过计算长宽来确定整个贴图的区域。

简单写一个配置文件如下:

<?xml version="1.0" encoding="utf-8"?>
<theme name="default">
  <style name="red" transcolor="#ff00ff">
    <!-- layout-->
    <layout>
      <windows name="main_windows" image="backgroud.bmp" backgroudcolor="#fffff" width="200" height="200" image_x="200" image_y="200" tips="主窗体">
        <module name="scrollbar" image="scrollbar.bmp" image_x="15" image_y="20" width="200" height="200"  type="scrollbar" tips="滚动条">
          <fragment name="scrollbar_top" tips="滚动条顶部">
            <area state="1" name="normal" image_x="0" image_y="0" width="9" height="12" />
            <area state="2" name="hot" image_x="9" image_y="0" width="9" height="12" />
            <area state="3" name="pressed" image_x="18" image_y="0" width="9" height="12" />
            <area state="4" name="disable" image_x="27" image_y="0" width="9" height="12" />
          </fragment>
        </module>
      </windows>
    </layout>
    <color_schemes>
      <class name="media_list_view">
        <color name="focus_text_color" value="#FFFFFF" />
        <color name="focus_text_backgroud_color" value="#FFFFFF" />
        <color name="normal_text_color" value="#FFFFFF" />
        <color name="hilight_text_color" value="#FFFFFF" />
      </class>
      <class name="lrc_view"></class>
    </color_schemes>
  </style>
</theme>

这篇日志,是为了纪念几年前一段狂热试用开源程序的日子……

想做小白鼠,试用最新版本的程序,就需要每天访问各种程序的官方网站,看是否有更新,过去我是通过订阅程序官方的博客或邮件列表来达到及时关注的效果,这是一个费时费力的过程,而且并不是所有程序都有博客或是邮件列表。于是我就构思了一个小工具网站,用于自动检测各种程序更新。

核心的机制是通过监测程序的发布网页(尤其是程序下载页的更新)是否有变化,来判断程序是否有更新(当然这样并不精确,所以在网站用语选择上,使用“可能”这样的词)。

一、监测机制
1、RSS监测,这个没什么好说明的
2、Page2RSS,利用这个工具把网页转成RSS来检测
3、监测网页的MD5值是否有变化,需要把整个网页load到服务器,消耗比较大
4、对于开源程序,最好不过的方式是检测SVN的更新,还能获取到更新日志,效果佳
5、托管在google code、sf.net上的项目,单写规则监测,能获取更优质的信息,例如监测typecho的update list

二、展示机制

首页:
将被监测的程序分为两种,在显示时略有区别
1、有SVN,能获取到详细信息的
2、只能监测到可能更新的

采用按最后一次监测到更新的时间倒序排列,同日更新的按收录顺序排列,就像是一个冒泡算法,有更新的会排到前面。用于大致如下:

“XXX日检测到XXX程序可能更新”

程序展示页:
这里还说产生一个需求,就是想进一步了解某一个程序,这就需要有一个单独程序展示页,包括程序简介以及采集网络中对该程序的评价(通过采集blogsearch.google.com的搜索结果实现,缺点在于可能会有重复信息,优点是自动更新,质量由google去保证,最大限度减少人工)。

三、程序实现
这里我实际上构思了两种实现方式:
1、单独写一个程序。优点是简单,确定是不方便编辑,需要做个后台管理部分
2、改造博客程序实现。优点是管理方便,缺点是冗余

单独程序实现包括两个部分:
1、程序
包括
1.1 index.php
功能:判断是否需要更新,并导入一个html显示,下面用伪代码写一下思路:
lastUpdateTime+7200{ //导入监测更新的程序 import checkUpdate.php; } //不需要更新则导入一个事先生成的html,可以减少数据库查询 import display.html;

1.2 last_updateTime.txt
功能:记录上次更新时间的txt文件

1.3 check_update.php
功能:根据监测类型监测程序是否更新,并写入数据库,需要分组,避免超时,以下是伪代码表明思路:

1.4 update_comments.php
功能:获取以程序名为关键词的google blogsearch结果,并采集到评论表里,供程序展示页使用,需要分组,避免超时,以下是伪代码表明思路:

1.5 writePage.php
功能:取出数据库内容,生成html,供首页显示,以下是伪代码表明思路:

1.6 index_content.html
功能:首页内容,供index.php调用

1.7 display_soft.php
功能:显示程序展示页

2、数据库设计(简表)

2.1 soft表
字段:
softID 标识录入程序ID 数值
softTitle 程序名称 文本
softSummary 程序简介 文本
softURL 官方地址 文本
checkURL 监测地址 文本
checkType 监测类型 数值

2.2 comment表
字段:
commentID 标识评论ID 数值
commentURL 评论来源URL 文本
content 评论内容 文本
contentBlogTitle 评论来源博客名称 文本
contentBlogURL 评论来源博客URL 文本
softID 标识从属程序ID 数值

上面就是单独写程序的构思,还有一种改造博客程序的实现方式,原理差不多,就是需要写监测程序的功能和加入评论内容的功能。

多一句嘴,已经有网站很好满足了我最初构思这个工具网站的需求。http://chkversion.com/

_setVar函数跟_trackPageview函数一样,灵活运用可以极大丰富统计报告。简单来说,_setVar函数可以定义一个值,当被触发的时候,该值被记录。

1、统计有注册意愿的用户
注册,不出意外都需要访问一个注册页面,那么统计访问这个页面的用户也就知道了有多少用户动过注册的念头,当然可能看了一眼,没有完成注册。我们可以在注册页面这样部署代码:

2、统计注册成功的用户
注册的最后一步无非就是按下“确定”按钮,那么就在完成注册的“确定”按钮上加上onClick事件,比如
onClick="pageTracker._setVar('完成注册');

3、统计登陆用户
对于有会员系统的网站来说,可能需要知道有每天有多少用户登陆网站,用于考查网站提供的会员增值服务是否有吸引力,关系到网站是否可以通过对会员的精准营销来赢利。我们可以在给登录链接加上:
点击此处
同样的,也可以在登陆页的确定按钮上加。

以上三个是比较容易想到的应用,值得一提的是,_setVar函数被触发后,定义的值是会被写入cookie的。
4、观察用户兴趣
对于一个大的电子商务网站来说,对用户的购买兴趣一定是有兴趣的,_setVar函数可以通过网站上访问的页面或在表单上做出的响应对其进行分类,前面三个就是演示。
假设网站有个多个商品分类,我们分别给每个分类加上

所有访问该页面的访问者都将被分配到"IT书籍"组,也就是对IT书籍有兴趣的用户。
google给出了一个通过下拉菜单触发的例子: