2012年1月11日 By mikel 分类: 开发笔记, 数据库

[转载]SQLite的升级 – 熊猫82 – 博客园.

Android应用,不可避免的会与SQLite打交道。随着应用的不断升级,原有的数据库结构可能已经不再适应新的功能,这时候,就需要对SQLite数据库的结构进行升级了。

SQLite提供了ALTER TABLE命令,允许用户重命名或添加新的字段到已有表中,但是不能从表中删除字段。

并且只能在表的末尾添加字段,比如,为 Subscription添加两个字段:

1 ALTER TABLE Subscription ADD COLUMN Activation BLOB;
2 ALTER TABLE Subscription ADD COLUMN Key BLOB;

另外,如果遇到复杂的修改操作,比如在修改的同时,需要进行数据的转移,那么可以采取在一个事务中执行如下语句来实现修改表的需求。

1. 将表名改为临时表

ALTER TABLE Subscription RENAME TO __temp__Subscription;

2. 创建新表

CREATE TABLE Subscription (OrderId VARCHAR(32) PRIMARY KEY ,UserName VARCHAR(32) NOT NULL ,ProductId VARCHAR(16) NOT NULL);

3. 导入数据

INSERT INTO Subscription SELECT OrderId, “”, ProductId FROM __temp__Subscription;

或者

INSERT INTO Subscription() SELECT OrderId, “”, ProductId FROM __temp__Subscription;

* 注意 双引号”” 是用来补充原来不存在的数据的
4. 删除临时表

DROP TABLE __temp__Subscription;

通过以上四个步骤,就可以完成旧数据库结构向新数据库结构的迁移,并且其中还可以保证数据不会应为升级而流失。

当然,如果遇到减少字段的情况,也可以通过创建临时表的方式来实现。

收藏与分享
2012年1月11日 By mikel 分类: JavaScript, 开发笔记

[转载]技术宅—我的网上抢火车票攻略(终极秒杀版) – Phinecos(洞庭散人) – 博客园.

前几天在我在博客上发了一篇技术宅—我的网上抢火车票攻略,短短4天内点击量达到8000多,可见火车票是近期最为火热的话题了。这几天又帮很多朋友代购火车票,不断总结经验教训,最后得到了一个完整的全自动刷票方案。

准备工作:

1)一键自动刷票软件Go-Home

下载地址:http://code.google.com/p/go-home/ ,这个软件有多牛逼,看看下面的项目简介就知道了。。。

2) Firefox浏览器或者Chrome浏览器

3)   12306自动登陆脚本

https://gist.github.com/raw/1570973/f200dd587f6d68ab81edf74436b1fb7d91c79973/12306AutoLogin.user.js

4) 12306自动查询脚本,https://gist.github.com/raw/1554666/dec45c925002ec23ccef9f5be14770572d27625c/12306.user.js

关于这两个脚本如何使用,请参见《技术宅—我的网上抢火车票攻略》的后半部分,

5) 招商银行信用卡或一卡通

6) UCWeb手机浏览器

下面我们开始从头至尾进行一次快速 而完整的刷票之旅

第一步,使用一键刷票的Go-Home进 行全自动刷票,它会自动识别验证码,自动登陆,自动查询车票信息,自动选择最优车次及席别,自动订票,如果你时间充裕,建议改成非自动模式,采用人工输入 验证码相结合的方式进行刷票。这一步是至关重要的一步,同时也是最拼人品的一步,因为大家都知道,登陆和提交订单有多么困难。

第二步,如果你运气够好,在第一步中顺利地提交订单成功了,那么现在你要做的就是在45分钟内完成支付。这里我采用上面提到的12306自动登陆脚本,在FirefoxChrome中打开登陆页面,通过Ajax请求的方式可以避免刷新验证码图片的问题,从而可以用同一个验证码无限次尝试登陆,直至登陆成功。

第三步,如果你人品继续足够好,侥幸在firefoxChrome中登陆进系统了,那么恭喜你,赶紧进去最后一步支付吧。非IE用户无法使用网银,这个问题一直让人头痛,不过如果你有招商银行的信用卡或者一卡通,那么恭喜了,你可以无视这个问题了。当你选择使用招商银行进行支付时,非IE浏览器会打开手机支付的页面,输入你的卡号和手机号,它会将一个支付链接发到你的手机上,在手机上通过UCWeb浏览器打开这个链接,继续输入剩下的信息,就可以顺利完成支付了。

第四步,如果上帝继续眷顾你,让你顺利完成了支付,没有“支付超时“,没有“吞钱不吐票,那么这下真的要恭喜你了,你成功了!!!

Ok,就总结到这里了,这应该算是目前最强大的终极火车票秒杀版本了,感谢互联网上众多无私奉献的人们,你们提供的工具,脚本,让我们能有机会买到回家的车票,却分文不取,这种精神让人敬佩,而我这几篇文章就是向诸位致敬!!!

收藏与分享
2012年1月10日 By mikel 分类: 开发笔记, 数据库

[转载]sqlserver数据库大型应用解决方案总结 – @Dylan – 博客园.

随着互联网应用的广泛普及,海量数据的存储和访问成为了系统设计的瓶颈问题。对于一个大型的互联网应用,每天百万级甚至上亿的PV无疑对数据库造成了相当高的负载。对于系统的稳定性和扩展性造成了极大的问题。

一、负载均衡技术
负载均衡集群是由一组相互独立的计算机系统构成,通过常规网络或专用网络进行连接,由路由器衔接在一起,各节点相互协作、共同负载、均衡压力,对客户端来说,整个群集可以视为一台具有超高性能的独立服务器。

1、实现原理
实现数据库的负载均衡技术,首先要有一个可以控制连接数据库的控制端。在这里,它截断了数据库和程序的直接连接,由所有的程序 来访问这个中间层,然后再由中间层来访问数据库。这样,我们就可以具体控制访问某个数据库了,然后还可以根据数据库的当前负载采取有效的均衡策略,来调整 每次连接到哪个数据库。
2、实现多据库数据同步
对于负载均衡,最重要的就是所有服务器的数据都是实时同步的。这是一个集群所必需的,因 为,如果数不据实时、不同步,那么用户从一台服务器读出的数据,就有别于从另一台服务器读出的数据,这是不能允许的。所以必须实现数据库的数据同步。这 样,在查询的时候就可以有多个资源,实现均衡。比较常用的方法是Moebius for SQL Server集群,Moebius for SQL Server集群采用将核心程序驻留在每个机器的数据库中的办法,这个核心程序称为Moebius for SQL Server 中间件,主要作用是监测数据库内数据的变化并将变化的数据同步到其他数据库中。数据同步完成后客户端才会得到响应,同步过程是并发完成的,所以同步到多个 数据库和同步到一个数据库的时间基本相等;另外同步的过程是在事务的环境下完成的,保证了多份数据在任何时刻数据的一致性。正因为Moebius 中间件宿主在数据库中的创新,让中间件不但能知道数据的变化,而且知道引起数据变化的SQL语句,根据SQL语句的类型智能的采取不同的数据同步的策略以 保证数据同步成本的最小化。

数据条数很少,数据内容也不大,则直接同步数据
数据条数很少,但是里面包含大数据类型,比如文本,二进制数据等,则先对数据进行压缩然后再同步,从而减少网络带宽的占用和传输所用的时间。
数据条数很多,此时中间件会拿到造成数据变化的SQL语句, 然后对SQL语句进行解析,分析其执行计划和执行成本,并选择是同步数据还是同步SQL语句到其他的数据库中。此种情况应用在对表结构进行调整或者批量更改数据的时候非常有用。
3、优缺点
(1) 扩展性强:当系统要更高数据库处理速度时,只要简单地增加数据库服务器就 可以得到扩展。
(2) 可维护性:当某节点发生故障时,系统会自动检测故障并转移故障节点的应用,保证数据库的持续工作。
(3) 安全性:因为数据会同步的多台服务器上,可以实现数据集的冗余,通过多份数据来保证安全性。另外它成功地将数据库放到了内网之中,更好地保护了数据库的安全性。
(4) 易用性:对应用来说完全透明,集群暴露出来的就是一个IP

(1) 不能够按照Web服务器的处理能力分配负载。
(2) 负载均衡器(控制端)故障,会导致整个数据库系统瘫痪。

二、数据库的读写分离
1,实现原理:读写分离简单的说是把对数据库读和写的操作分开对应不同的数据库服 务器,这样能有效地减轻数据库压力,也能减轻io压力。主数据库提供写操作,从数据库提供读操作,其实在很多系统中,主要是读的操作。当主数据库进行写操 作时,数据要同步到从的数据库,这样才能有效保证数据库完整性。

(ebay的读写比率是260:1,ebay的读写分离)

(微软数据库分发)

2,实现方法:在MS Sql server中可以使用发布定义的方式实现数据库复制,实现读写分离,复制是将一组数据从一个数据源拷贝到多个数据源的技术,是将一份数据发布到多个存储 站点上的有效方式。使用复制技术,用户可以将一份数据发布到多台服务器上。复制技术可以确保分布在不同地点的数据自动同步更新,从而保证数据的一致性。 SQL SERVER复制技术类型有三种,分别是:快照复制、事务复制、合并复制。SQL SERVER 主要采用出版物、订阅的方式来处理复制。源数据所在的服务器是出版服务器,负责发表数据。出版服务器把要发表的数据的所有改变情况的拷贝复制到分发服务 器,分发服务器包含有一个分发数据库,可接收数据的所有改变,并保存这些改变,再把这些改变分发给订阅服务器。

3,优缺点
(1)数据的实时性差:数据不是实时同步到自读服务器上的,当数据写入主服务器后,要在下次同步后才能查询到。

(2)数据量大时同步效率差:单表数据量过大时插入和更新因索引,磁盘IO等问题,性能会变的很差。

(3)同时连接多个(至少两个)数据库:至少要连接到两个数据数据库,实际的读写操作是在程序代码中完成的,容易引起混乱

(4)读具有高性能高可靠性和可伸缩:只读服务器,因为没有写操作,会大大减轻磁盘IO等性能问题,大大提高效率;只读服务器可以采用负载均衡,主数据库发布到多个只读服务器上实现读操作的可伸缩性。

三、数据库/数据表  拆分(分布式)

通过某种特定的条件,将存放在同一个数据库中的数据分散存放到多个数据库上,实现分布存储,通过路由规则路由访问特定的数据库,这样一来每次访问面 对的就不是单台服务器了,而是N台服务器,这样就可以降低单台机器的负载压力。提示:SQLServer 2005版本之后,可以友好的支持“表分区”。

垂直(纵向)拆分:是指按功能模块拆分,比如分为订单库、商品库、用户库…这种方式多个数据库之间的表结构不同。

水平(横向)拆分:将同一个表的数据进行分块保存到不同的数据库中,这些数据库中的表结构完全相同。

(纵向拆分)

(横向拆分)

1,实现原理:使用垂直拆分,主要要看应用类型是否合适这种拆分方式,如系统可以分为,订单系统,商品管理系统,用户管理系统业务系统比较明的,垂 直拆分能很好的起到分散数据库压力的作用。业务模块不明晰,耦合(表关联)度比较高的系统不适合使用这种拆分方式。但是垂直拆分方式并不能彻底解决所有压 力问题,例如 有一个5000w的订单表,操作起来订单库的压力仍然很大,如我们需要在这个表中增加(insert)一条新的数据,insert完毕后,数据库会针对这 张表重新建立索引,5000w行数据建立索引的系统开销还是不容忽视的,反过来,假如我们将这个表分成100个table呢,从table_001一直到 table_100,5000w行数据平均下来,每个子表里边就只有50万行数据,这时候我们向一张只有50w行数据的table中insert数据后建 立索引的时间就会呈数量级的下降,极大了提高了DB的运行时效率,提高了DB的并发量,这种拆分就是横向拆分

2,实现方法:垂直拆分,拆分方式实现起来比较简单,根据表名访问不同的数据库就可以了。横向拆分的规则很多,这里总结前人的几点,

(1)顺序拆分:如可以按订单的日前按年份才分,2003年的放在db1中,2004年的db2,以此类推。当然也可以按主键标准拆分。

优点:可部分迁移

缺点:数据分布不均,可能2003年的订单有100W,2008年的有500W。

(2)hash取模分: 对user_id进行hash(或者如果user_id是数值型的话直接使用user_id的值也可),然后用一个特定的数字,比如应用中需要将一个数据 库切分成4个数据库的话,我们就用4这个数字对user_id的hash值进行取模运算,也就是user_id%4,这样的话每次运算就有四种可能:结果 为1的时候对应DB1;结果为2的时候对应DB2;结果为3的时候对应DB3;结果为0的时候对应DB4,这样一来就非常均匀的将数据分配到4个DB中。
优点:数据分布均匀
缺点:数据迁移的时候麻烦;不能按照机器性能分摊数据 。
(3)在认证库中保存数据库配置
就是建立一个DB,这个DB单独保存user_id到DB的映射关系,每次访问数据库的时候都要先查询一次这个数据库,以得到具体的DB信息,然后才能进行我们需要的查询操作。
优点:灵活性强,一对一关系
缺点:每次查询之前都要多一次查询,会造成一定的性能损失。

收藏与分享
2012年1月10日 By mikel 分类: Android, 开发笔记

[转载]Android SAX解析XML – 华德飞 – 博客园.

解析XML的方式有很多种,大家比较熟悉的可能就是DOM解析。

DOM(文件对象模型)解析:解析器读入整个文档,然后构建一个驻留内存的树结构,然后代码就可以根据DOM接口来操作这个树结构了。

优点:整个文档读入内存,方便操作:支持修改、删除和重现排列等多种功能。

缺点:将整个文档读入内存中,保留了过多的不需要的节点,浪费内存和空间。

使用场合:一旦读入文档,还需要多次对文档进行操作,并且在硬件资源充足的情况下(内存,CPU)。

为了解决DOM解析存在的问题,就出现了SAX解析。其特点为:

优点:不用实现调入整个文档,占用资源少。尤其在嵌入式环境中,如Android,极力推荐使用SAX解析。

缺点:不像DOM解析一样将文档长期驻留在内存中,数据不是持久的。如果事件过后没有保存数据,数据就会丢失。

使用场合:机器有性能限制。

SAX解析XML文档采用事件驱动模式。什么是事件驱动模式?它将XML文档转换成一系列的事件,由单独的事件处理器来决定如何处理。

基于事件驱动的处理模式主要是基于事件源和事件处理器(或者叫监听器)来工作的。一个可以产生事件的对象叫做事件源,而一个可以针对事件做出响应的对象就被叫做事件处理器。

在SAX接口中,事件源是org.xml.sax包中的XMLReader,他通过parse()方法开始解析XML文档,并根据文档内容产生事 件。而事件处理器则是org.xml.sax包中的ContentHandler、DTDHandler、ErrorHandler,以及 EntityResolver这四个接口。他们分别处理事件源在解析过程中产生不同类的事件(其中DTDHandler为解析文档DTD时所用)。详细介 绍如下表:

在上述四个接口中,最重要的就是ContentHandler这个接口,下面是对这个接口方法的说明:

//设置一个可以定位文档内容事件发生位置的定位器对象

public void setDocumentLocator(Locator locator)

//用于处理文档解析开始事件

public void startDocument()throws SAXException

//处理元素开始事件,从参数中可以获得元素所在名称空间的uri,元素名称,属性类表等信息

public void startElement(String namespacesURI , String localName , String qName , Attributes atts) throws SAXException

//处理元素结束事件,从参数中可以获得元素所在名称空间的uri,元素名称等信息

public void endElement(String namespacesURI , String localName , String qName) throws SAXException

//处理元素的字符内容,从参数中可以获得内容

public void characters(char[] ch , int start , int length)  throws SAXException

这里再介绍下XMLReader中的方法。

//注册处理XML文档解析事件ContentHandler
public void setContentHandler(ContentHandler handler)

//开始解析一个XML文档
public void parse(InputSorce input) throws SAXException

SAX实现实体解析的步骤:

Android中使用SAX是有迹可循的,完全可以按照下面的方法就可以轻松找到xml里的tag,然后得到想要的内容。具体实现步骤如下:

(一)第一步:新建一个工厂类SAXParserFactory,代码如下:

SAXParserFactory factory = SAXParserFactory.newInstance();

(二)第二步:让工厂类产生一个SAX的解析类SAXParser,代码如下:

SAXParser parser = factory.newSAXParser();

(三)第三步:从SAXPsrser中得到一个XMLReader实例,代码如下:

XMLReader reader = parser.getXMLReader();

(四)第四步:把自己写的handler注册到XMLReader中,一般最重要的就是ContentHandler,代码如下:

RSSHandler handler = new RSSHandler();
reader.setContentHandler(handler);

(五)第五步:将一个xml文档或者资源变成一个java可以处理的InputStream流后,解析正式开始,代码如下:

parser.parse(is);

上面几个步骤中,最重要、最关键的就是第四步,handler的实现。

下面通过一个RSS解析的例子说明handler的实现:

我们先是自己见一个rss的xml文档,实现本地解析,新建的rss文档如下:

<?xml version="1.0" encoding="UTF-8"?>
    <channel>
        <title>RSS 解析练习</title>
        <description>hehehaha</description>
        <link>http://www.cnblogs.com/felix-hua/</link>
        <language>zh-cn</language>

        <item>
            <title><![CDATA[头条]]></title>
            <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
            <category>0</category>
            <description>描述详细信息的</description>
            <pubDate>2012-01-09</pubDate>
        </item>

        <item>
            <title><![CDATA[新闻]]></title>
            <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
            <category>0</category>
            <description>描述详细信息的</description>
            <pubDate>2012-01-09</pubDate>
        </item>

        <item>
            <title><![CDATA[首页]]></title>
            <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
            <category>0</category>
            <description>描述详细信息的</description>
            <pubDate>2012-01-09</pubDate>
        </item>

        <item>
            <title><![CDATA[财经]]></title>
            <link>http://mc.cz001.com.cn/images/menu/23_active.png</link>
            <category>0</category>
            <description>描述详细信息的</description>
            <pubDate>2012-01-09</pubDate>
        </item>

建好后,我们命名为rssxml.xml,然后放到项目的根目录下:

然后我们可以建立两个实体类:

1、RSSFeed,与完整的xml文档相对应;

2、RSSItem,与item标签内的信息相对应。

这样在解析xml时,我们就可以把解析出来的信息放到实体类里,然后直接操作实体类就可以了。下面给出代码:

RSSFeed.java

package com.sax.org.entity;

import java.util.ArrayList;
import java.util.HashMap;
import java.util.List;
import java.util.Map;
import java.util.Vector;

public class RSSFeed {
    private String title;
    private int itemcount;
    private List<RSSItem> itemlist;

    public RSSFeed(){
        itemlist = new Vector<RSSItem>(0);
    }

    /**
     * 负责将一个RSSItem加入到RSSFeed类中
     * @param item
     * @return
     */
    public int addItem(RSSItem item){
        itemlist.add(item);
        itemcount++;
        return itemcount;
    }

    public RSSItem getItem(int location){
        return itemlist.get(location);
    }

    public List<RSSItem> getAllItems(){
        return itemlist;
    }

    /**
     * 负责从RSSFeed类中生成列表所需要的数据
     * @return
     */
    public List getAllItemForListView(){
        List<Map<String, Object>> data = new ArrayList<Map<String,Object>>();
        int size = itemlist.size();
        for(int i=0 ; i<size ; i++){
            HashMap<String , Object> item = new HashMap<String, Object>();
            item.put(RSSItem.TITLE, itemlist.get(i).getTitle());
            item.put(RSSItem.PUBDATE, itemlist.get(i).getPubdate());
            data.add(item);
        }
        return data;
    }

    public String getTitle() {
        return title;
    }

    public void setTitle(String title) {
        this.title = title;
    }

    public int getItemcount() {
        return itemcount;
    }

    public void setItemcount(int itemcount) {
        this.itemcount = itemcount;
    }

    public List<RSSItem> getItemlist() {
        return itemlist;
    }

    public void setItemlist(List<RSSItem> itemlist) {
        this.itemlist = itemlist;
    }

}

RSSItem.java

package com.sax.org.entity;

public class RSSItem {
    public static String TITLE = "title";
    public static String PUBDATE = "pubdate";
    public String title;
    public String description;
    public String link;
    public String category;
    public String pubdate;
    public RSSItem() {
    }
    public String getTitle() {
        return title;
    }
    public void setTitle(String title) {
        this.title = title;
    }
    public String getDescription() {
        return description;
    }
    public void setDescription(String description) {
        this.description = description;
    }
    public String getLink() {
        return link;
    }
    public void setLink(String link) {
        this.link = link;
    }
    public String getCategory() {
        return category;
    }
    public void setCategory(String category) {
        this.category = category;
    }
    public String getPubdate() {
        return pubdate;
    }
    public void setPubdate(String pubdate) {
        this.pubdate = pubdate;
    }

}

下面就是最最重要的地方了,建立自己的ContentHandler.看下面的代码:

RSSHandler.java

package com.sax.org.handler;

import org.xml.sax.Attributes;
import org.xml.sax.SAXException;
import org.xml.sax.helpers.DefaultHandler;

import com.sax.org.entity.RSSFeed;
import com.sax.org.entity.RSSItem;

public class RSSHandler extends DefaultHandler{
    RSSFeed RssFeed;
    RSSItem RssItem;
    final int RSS_TITLE = 1;
    final int RSS_LINK = 2;
    final int RSS_DESCRIPTION = 3;
    final int RSS_CATEGORY = 4;
    final int RSS_PUBDATE = 5;
    int currentstate = 0;

    public RSSHandler(){}

    public RSSFeed getFeed(){
        return RssFeed;
    }

    @Override
    public void startDocument() throws SAXException {
        // TODO Auto-generated method stub
        RssFeed = new RSSFeed();
        RssItem = new RSSItem();
    }

    @Override
    public void endDocument() throws SAXException {
        // TODO Auto-generated method stub

    }

    @Override
    public void startElement(String uri, String localName, String qName,
            Attributes attributes) throws SAXException {
        // TODO Auto-generated method stub
        if(localName.equals("channel")){
            currentstate = 0;
            return;
        }
        if(localName.equals("item")){
            RssItem = new RSSItem();
            return;
        }
        if(localName.equals("title")){
            currentstate = RSS_TITLE;
            return;
        }
        if(localName.equals("description")){
            currentstate = RSS_DESCRIPTION;
            return;
        }
        if(localName.equals("link")){
            currentstate = RSS_LINK;
            return;
        }
        if(localName.equals("category")){
            currentstate = RSS_CATEGORY;
            return;
        }
        if(localName.equals("pubDate")){
            currentstate = RSS_PUBDATE;
            return;
        }
        currentstate = 0;
    }

    @Override
    public void endElement(String uri, String localName, String qName)
            throws SAXException {
        // TODO Auto-generated method stub
        if(localName.equals("item")){
            RssFeed.addItem(RssItem);
            return;
        }
    }

    @Override
    public void characters(char[] ch, int start, int length)
            throws SAXException {
        // TODO Auto-generated method stub
        String theString = new String(ch, start, length);
        switch(currentstate){
        case RSS_TITLE:
            RssItem.setTitle(theString);
            currentstate = 0;
            break;
        case RSS_DESCRIPTION:
            RssItem.setDescription(theString);
            currentstate = 0;
            break;
        case RSS_LINK:
            RssItem.setLink(theString);
            currentstate = 0;
            break;
        case RSS_PUBDATE:
            RssItem.setPubdate(theString);
            currentstate = 0;
            break;
        case RSS_CATEGORY:
            RssItem.setCategory(theString);
            currentstate = 0;
            break;
        default:
            return;
        }
    }
}

就上面的代码分析,实现一个ContentHandler一般要一下几个步骤:

1、声明一个类,继承DefaultHandler。DefaultHandler是一个基类,这个类里面简单实现了一个ContentHandler。我们只需要重写里面的方法即可。

2、重写 startDocument() 和 endDocument(),一般解析将正式解析之前的一些初始化工资放到startDocument()里面,收尾的工作放到endDocument()里面。

3、重写startElement(),XML解析器遇到XML里面的tag时就会调用这个函数。经常在这个函数内是通过localName俩进行判断而操作一些数据。

4、重写characters()方法,这是一个回调方法。解析器执行完startElement()后,解析完节点的内容后就会执行这个方法,并 且参数ch[]就是节点的内容。这个例子里我们根据currentstate的不同,来判断当前那个tag的内容,并放到合适的实体类中。

5、重写endElement()方法,这个方法与startElement()相对应,解析完一个tag节点后,执行这个方法。再找个例子中,如果解析一个item结束,就将RSSIiem添加到RSSFeed中。

最后我们实现一个activity来展现解析的结果:

package com.sax.org;

import java.io.IOException;
import java.net.URL;

import javax.xml.parsers.ParserConfigurationException;
import javax.xml.parsers.SAXParser;
import javax.xml.parsers.SAXParserFactory;

import org.xml.sax.InputSource;
import org.xml.sax.SAXException;
import org.xml.sax.XMLReader;

import Android.app.Activity;
import android.os.Bundle;
import android.widget.ListView;
import android.widget.SimpleAdapter;
import android.widget.TextView;

import com.sax.org.entity.RSSFeed;
import com.sax.org.entity.RSSItem;
import com.sax.org.handler.RSSHandler;

public class SAXReaderActivity extends Activity {
    /** Called when the activity is first created. */

    public String rssUrl = "http://mc.cz001.com.cn/a/indexconfig/index.rss";
    public RSSFeed feed;

    @Override
    public void onCreate(Bundle savedInstanceState) {
        super.onCreate(savedInstanceState);
        setContentView(R.layout.main);
        feed = getFeed(rssUrl);
        showList();
    }

    public RSSFeed getFeed(String rssUrl) {
        try {
// 这里我们实现了本地解析,所以注掉了这个取网络数据的。
//            URL url = new URL(rssUrl);
            SAXParserFactory factory = SAXParserFactory.newInstance();
            SAXParser parser = factory.newSAXParser();
            XMLReader reader = parser.getXMLReader();
            RSSHandler handler = new RSSHandler();
            reader.setContentHandler(handler);
            InputSource is = new InputSource(this.getClassLoader().getResourceAsStream("rssxml.xml"));//取得本地xml文件
            reader.parse(is);
            return handler.getFeed();
        } catch (ParserConfigurationException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (SAXException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        } catch (IOException e) {
            // TODO Auto-generated catch block
            e.printStackTrace();
        }
        return null;
    }

    public void showList() {
        ListView rsslistview = (ListView) findViewById(R.id.rssList);
        TextView rsstitle = (TextView) findViewById(R.id.rsstitle);
        if (feed == null) {
            rsstitle.setText("访问失败...");
            return;
        }
        SimpleAdapter adapter = new SimpleAdapter(this,
                feed.getAllItemForListView(),
                android.R.layout.simple_list_item_2, new String[] {
                        RSSItem.TITLE, RSSItem.PUBDATE }, new int[] {
                        android.R.id.text1, android.R.id.text2 });
        rsslistview.setAdapter(adapter);
    }
}

展示下运行结果:

OK。

本文参考自《Google+Android入门与实践》,谢谢。

收藏与分享
2012年1月10日 By mikel 分类: JavaScript, 开发笔记

[转载]ucenter创始人密码忘了解决方法[转]_百度一下_百度空间.

打开uc下面/data/config.inc.php文件

里面有

define(‘UC_FOUNDERPW’, ’924a2bd32289075d8055e7e30261dfb1′);

define(‘UC_FOUNDERSALT’, ’116414′);

记下116414这个值,然后

用php输出下面的一个代码

$ucfounderpw= md5(md5($ucfounderpw).$ucsalt);

其中$ucsalt就是116414(这个根据您的需要而定)

$ucfounderpw是您要设置的密码。

得到的$ucfounderpw替换

define(‘UC_FOUNDERPW’, ’924a2bd32289075d8055e7e30261dfb1′);

这个里面的924a2bd32289075d8055e7e30261dfb1就可以了。

还有另外一种方法,将以下代码保存为PHP,传至UC根目录,运行即可

“<?php

define(ROOT_DIR,dirname(__FILE__).”/”);

if(!file_exists(‘./data/config.inc.php’) || !is_writeable(‘./data’)){

$isucdir= 0;

echo ‘UCenter创始人密码重置工具必须放在UCenter根目录下才能正常使用.’;

exit;

}else{

$isucdir = 1;

}

$info=”";

setucadministrator();

function setucadministrator(){

global $isucdir;

global $info;

if($_POST['setucsubmit']){

if($isucdir){

$configfile = ROOT_DIR.”./data/config.inc.php”;

$uc_password = $_POST["uc_password"];

$salt = substr(uniqid(rand()), 0, 6);

if(!$uc_password){

$info = “密码不能为空”;

}else{

$md5_uc_password = md5(md5($uc_password).$salt);

$config = file_get_contents($configfile);

$config = preg_replace(“/define\(‘UC_FOUNDERSALT’,\s*’.*?’\);/i”, “define(‘UC_FOUNDERSALT’, ‘$salt’);”, $config);

$config = preg_replace(“/define\(‘UC_FOUNDERPW’,\s*’.*?’\);/i”, “define(‘UC_FOUNDERPW’, ‘$md5_uc_password’);”, $config);

$fp = @fopen($configfile, ‘w’);

@fwrite($fp, $config);

@fclose($fp);

$info = “UCenter创始人密码更改成功为:$uc_password”;

}

}else{

$info = “本程序文件放置在UCenter跟目录,才能通过程序修改UCenter创始人管理员的密码<br />”;

}

}

templates(“setucadministrator”);

}

function errorpage($message,$title = ”,$isheader = 1,$isfooter = 1){

$message = “<h4>$title</h4><br><br><table><tr><th> 提示信息</th></tr><tr><td>$message</td>< /tr></table>”;

echo $message;

exit;

}

function templates($tpl){

switch ($tpl){

case “header”:

echo ‘<html>

<head>

<meta http-equiv=”Content-Type” content=”text/html; charset=gb2312″>

<title>UCenter 创始人密码更改工具</title>

<style type=”text/css”>

<!–

body {font-family: Arial, Helvetica, sans-serif, “宋体”;font-size: 12px;color:#000;line-height: 120%;padding:0;margin:0;background:#DDE0FF;overflow-x:hidden;word-break:break-all;white-space:normal;scrollbar-3d-light-color:#606BFF;scrollbar-highlight-color:#E3 EFF9;scrollbar-face-color:#CEE3F4;scrollbar-arrow-color:#509AD8;scrollbar-shadow-color:#F0F1FF;scrollbar-base-color:#CEE3F4;}

a:hover {color:#60F;}

ul {padding:2px 0 10px 0;margin:0;}

textarea,table,td,th,select{border:1px solid #868CFF;border-collapse:collapse;}

input{margin:10px 0 0px 30px;border-width:1px;border-style:solid;border-color:#FFF #64A7DD #64A7DD #FFF;padding:2px 8px;background:#E3EFF9;}

input.radio,input.checkbox,input.textinput,input.specialsubmit {margin:0;padding:0;border:0;padding:0;background:none;}

input.textinput,input.specialsubmit {border:1px solid #AFD2ED;background:#FFF;height:24px;}

input.textinput {padding:4px 0;}     input.specialsubmit {border-color:#FFF #64A7DD #64A7DD #FFF;background:#E3EFF9;padding:0 5px;}

option {background:#FFF;}

select {background:#F0F1FF;}

#header {height:60px;width:100%;padding:0;margin:0;}

h2 {font-size:24px;font-weight:bold;position:absolute;top:24px;left:20px;padding:10px;margin:0;}

h3 {font-size:14px;position:absolute;top:28px;right:20px;padding:10px;margin:0;}

#content {height:510px;background:#F0F1FF;overflow-x:hidden;z-index:1000;}

#nav {top:60px;left:0;height:510px;width:180px;border-right:1px solid #DDE0FF;position:absolute;z-index:2000;}

#nav ul {padding:0 10px;padding-top:30px;}

#nav li {list-style:none;}

#nav li a {font-size:14px;line-height:180%;font-weight:400;color:#000;}

#nav li a:hover {color:#60F;}

#textcontent {padding-left:200px;height:510px;width:100%;line-height:160%;overflow-y:auto;overflow-x:hidden;}

h4,h5,h6 {padding:4px;font-size:16px;font-weight:bold;margin-top:20px;margin-bottom:5px;color:#006;}

h5,h6 {font-size:14px;color:#000;}

h6 {color:#F00;padding-top:5px;margin-top:0;}

.specialdiv {width:70%;border:1px dashed #C8CCFF;padding:0 5px;margin-top:20px;background:#F9F9FF;}

#textcontent ul {margin-left:30px;}

textarea {width:78%;height:320px;text-align:left;border-color:#AFD2ED;}

select {border-color:#AFD2ED;}

table {width:74%;font-size:12px;margin-left:18px;margin-top:10px;}

table.specialtable,table.specialtable td {border:0;}

td,th {padding:5px;text-align:left;}

caption {font-weight:bold;padding:8px 0;color:#3544FF;text-align:left;}

th {background:#D9DCFF;font-weight:600;}

td.specialtd {text-align:left;}

.specialtext {background:#FCFBFF;margin-top:20px;padding:5px 40px;width:64.5%;margin-bottom:10px;color:#006;}

#footer p {padding:0 5px;text-align:center;}

–>

</style>

</head>

<body>

<div id=”content”>

<div id=”textcontent”>’;

break;

case “footer”:

echo ‘

</div></div>

<div id=”footer”><p>UCenter 创始人密码更改工具 &nbsp;

版权所有 &copy;2001-2007 <a href=”http://www.comsenz.com” style=”color: #888888; text-decoration: none”>

康盛创想(北京)科技有限公司 Comsenz Inc.</a></font></td></tr><tr style=”font-size: 0px; line-height: 0px; spacing: 0px; padding: 0px; background-color: #698CC3″>

</p></div>

</body>

</html>’;

exit;

break;

case “setucadministrator”:

templates(“header”);

if(!empty($_POST['setucsubmit'])){

echo “<h5>UCenter 创始人密码更改工具</h5><h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>”;

echo ‘<form action=”?action=setadmin” method=”post”><input type=”hidden” name=”action” value=”login” />’;

global $info;

errorpage($info,”,0,0);

echo ‘</form>’;

}else{

echo ‘<form action=”?action=setucadministrator” method=”post”>

<h5>UCenter 创始人密码更改工具</h5>

<h5> <font color=red>使用完毕后请及时删除本文件,以免给您造成不必要的损失</font></h5>

<table>

<tr><th width=”30%”>用户名</th><td width=”70%”><input class=”textinput” readonly=”readonly” disabled type=”text” name=”username” size=”25″ maxlength=”40″ value=”UCenter Administrator”></td></tr>

<tr><th width=”30%”>请输入密码</th><td width=”70%”><input class=”textinput” type=”text” name=”uc_password” size=”25″></td></tr>

</table>

<input type=”submit” name=”setucsubmit” value=”提 &nbsp; 交”>

</form>’;

}

templates(“footer”);

break;

}

}

?>”

收藏与分享
备案信息:冀ICP备10007948号