出家如初,成佛有余

htmlparser encoding 问题

Posted in Uncategorized by chuanliang on 2008/06/19

    使用htmlparser爬取一些页面时候(例如http://bbs.pcpop.com/O71228/1286458.html),会抛出org.htmlparser.util.EncodingChangeException异常:

例如执行如下代码(junit代码):

public void testLinkTag() {

try {

           NodeFilter filter = new NodeClassFilter(LinkTag.class);

           Parser parser = new Parser();

           parser.setURL(“http://bbs.pcpop.com/O71228/1286458.html”);

           parser.setEncoding(parser.getEncoding());

logger.fatal(“Encoding is “+parser.getEncoding());

           NodeList list = parser.extractAllNodesThatMatch(filter);

for (int i = 0; i < list.size(); i++) {

              LinkTag node = (LinkTag) list.elementAt(i);

logger.fatal(“testLinkTag() Link is :” + node.extractLink());

           }

       } catch (Exception e) {

           e.printStackTrace();

       }

    }

会抛出如下异常

org.htmlparser.util.EncodingChangeException: character mismatch (new: 涓 [0x6d93] != old:  [0x4e2d中]) for encoding change from UTF-8 to GB2312 at character offset 158

    at org.htmlparser.lexer.InputStreamSource.setEncoding(InputStreamSource.java:280)

    at org.htmlparser.lexer.Page.setEncoding(Page.java:865)

    at org.htmlparser.tags.MetaTag.doSemanticAction(MetaTag.java:150)

    at org.htmlparser.scanners.TagScanner.scan(TagScanner.java:69)

    at org.htmlparser.scanners.CompositeTagScanner.scan(CompositeTagScanner.java:160)

    at org.htmlparser.util.IteratorImpl.nextNode(IteratorImpl.java:92)

    at org.htmlparser.Parser.visitAllNodesWith(Parser.java:726)

    at ParserTestCase1.testImageVisitor(ParserTestCase1.java:71)

    at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)

    at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)

    at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)

    at java.lang.reflect.Method.invoke(Method.java:585)

    at junit.framework.TestCase.runTest(TestCase.java:154)

    at junit.framework.TestCase.runBare(TestCase.java:127)

    at junit.framework.TestResult$1.protect(TestResult.java:106)

    at junit.framework.TestResult.runProtected(TestResult.java:124)

    at junit.framework.TestResult.run(TestResult.java:109)

    at junit.framework.TestCase.run(TestCase.java:118)

    at junit.framework.TestSuite.runTest(TestSuite.java:208)

    at junit.framework.TestSuite.run(TestSuite.java:203)

    at org.eclipse.jdt.internal.junit.runner.junit3.JUnit3TestReference.run(JUnit3TestReference.java:130)

    at org.eclipse.jdt.internal.junit.runner.TestExecution.run(TestExecution.java:38)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:460)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:673)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:386)

    at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)

分析此类型的页面可以知道,主要原因还是org.htmlparser.tags.MetaTag对页面缺省Encoding的处理存在问题

对于页面http://bbs.pcpop.com/O71228/1286458.html,其页面缺省的编码为gb2312

        <META http-equiv="Content-Type" content="text/html; charset=gb2312">

但在服务器的Respone中是utf-8编码,因此浏览器是按照utf-8来编码。

HTTP/1.x 200 OK

Date: Thu, 19 Jun 2008 03:16:53 GMT

Server: Microsoft-IIS/6.0

X-Powered-By: ASP.NET

X-AspNet-Version: 2.0.50727

Cache-Control: private

Content-Type: text/html; charset=utf-8

Content-Length: 130386

但在htmlparser中,即使调用parser.setEncoding(parser.getEncoding())后,在MetaTag处理时候,没有沿用Parser设定的encoding

修改如下:

    public void doSemanticAction ()

        throws

            ParserException

    {

        String httpEquiv;

        String charset;

       httpEquiv = getHttpEquiv ();

        if (“Content-Type”.equalsIgnoreCase (httpEquiv)){

             //charset = getPage ().getCharset (getAttribute (“CONTENT”));

             //getPage ().setEncoding (charset);

             if (Page.DEFAULT_CHARSET == getPage ().getEncoding ()){

                 charset = getPage ().getCharset (getAttribute (“CONTENT”));

                 getPage ().setEncoding (charset);

             }

        }

    }

Technorati 标签: ,
Advertisements
Tagged with: ,

用压缩工具来提高web应用程序效率

Posted in Uncategorized by chuanliang on 2008/06/18

    在网站性能优化时候,Yahoo Performance Team的rules for high performance web sites是较好的调优指南(或者yahoo的大牛Steve Souders在其《High Performance Web Sites》书中提出提高网页效率的14条准则),Firefox的插件Firebug及Yahoo提供的Firebug 插件Yslow(http://developer.yahoo.com/yslow/)也是进行性能调优较好的工具。

    按照调优指南,一个重要的原则就是对js、css等文件采用Gzip、deflate等压缩工具进行压缩,以降低网络传输带宽。

1、网页压缩原理

    网页压缩是一项由WEB服务器(应用服务器)和浏览器之间共同遵守的协议,也即WEB服务器(应用服务器)和浏览器都必须支持该技术,现在流行的浏览器(IE、FireFox、Opera )都是支持的;Lighttpd、Apache 、Ngix、 IIS、Tomcat等应用服务器或web服务器都支持。双方的协商过程如下:

  1. 浏览器请求某URL,并在请求的头 (head) 中设置属性 accept-encoding 值为 gzip, deflate,表明浏览器支持 gzip 和 deflate 这两种压缩方式(事实上 deflate 也是使用 gzip 压缩协议);
  2. WEB 服务器接收到请求后判断浏览器是否支持压缩,如果支持就传送压缩后的响应内容,否则传送不经过压缩的内容;
  3. 浏览器获取响应内容后,判断内容是否被压缩,如果是则解压缩,然后显示响应页面的内容。

    具体的交互过程可以利用Livehttpheader来查看http的交互过程。

2、网页压缩的方法

对JS、CSS文件压缩分为两大方面:

  • 对js、CSS采用yuicompressor、JsPacker这样的工具对js等文件进行压缩。主要是删除诸如空行、回车换行、注释等无用的字符,减少文件本身的大小,这也是诸如jquery、prototype等javascript库发布时候所采用的方法。
  • 采用应用服务器(web服务器)及浏览器对gzip、deflate等压缩方法的支持来对请求进行实时的压缩

    在实际应用时候,应当结合两种方法来使用。在大型应用中,会采用lighttpd、apache这样的web服务器来做前端,可以在lighttpd或apache中配置gzip、deflate支持。这里只是简单说明一下采用Jboss对gzip的支持来提高web应用程序的效率

3、修改jboss配置,让其支持gzip压缩

    这里使用jboss 4.2.2,servlet容器采用的是tomcat,因此让jboss支持gzip的配置方法,实际上就是修改tomcat的配置

    修改jboss-4.2.2.GA/server/default/deploy/jboss-web.deployer/server.xml,增加如下内容

    <Connector port=”80″ address=”0.0.0.0″

         maxThreads=”1500″ maxHttpHeaderSize=”8192″

         emptySessionPath=”true” protocol=”HTTP/1.1″

         enableLookups=”false” redirectPort=”8443″ acceptCount=”100″

         connectionTimeout=”20000″ disableUploadTimeout=”true”

         compression=”on”      

         compressableMimeType=”text/html,text/xml,text/plain,text/css,text/javascript,application/xhtml+xml,

         application/x-javascript,application/javascript,text/xhtml”

        />

    在Tomcat与gzip相关的几个参数如下,具体可以参考

http://www.jboss.org/file-access/default/members/jbossweb/freezone/docs/2.1.0/config/printer/http.html

或:

http://tomcat.apache.org/tomcat-5.5-doc/config/http.html

  • compressableMimeType

    The value is a comma separated list of MIME types for which HTTP compression may be used. The default value is text/html,text/xml,text/plain.

  • compression

    The Connector may use HTTP/1.1 GZIP compression in an attempt to save server bandwidth. The acceptable values for the parameter is “off” (disable compression), “on” (allow compression, which causes text data to be compressed), “force” (forces compression in all cases), or a numerical integer value (which is equivalent to “on”, but specifies the minimum amount of data before the output is compressed). If the content-length is not known and compression is set to “on” or more aggressive, the output will also be compressed. If not specified, this attribute is set to “off”.

  • noCompressionUserAgents

  The value is a comma separated list of regular expressions matching user-agents of HTTP clients for which compression should not be used, because these clients, although they do advertise support for the feature, have a broken implementation. The default value is an empty String (regexp matching disabled).

采用gzip压缩后,一个典型例子为struts2中所采用的dojo.js,原来大小为258K,压缩后只有72K,压缩的效果还是很显著的

4、调试

    在web开发时候firefox提供了比IE等浏览器更好的web开发工具

    Firebug:http://www.getfirebug.com/

    Yslow:http://developer.yahoo.com/yslow

    Livehttpheader:http://livehttpheaders.mozdev.org/

    Web Developer: http://chrispederick.com/work/web-developer/

4.1、采用Yslow查看对网站的建议

yslow

3.2、采用Firebug参看页面交互情况

firebug

另外今天是Firefox3正式发布的日子,下载支持一下,感谢Firefox提供了如此好的工具。

Microsoft并购Yahoo思考-光荣与梦想

Posted in Uncategorized by chuanliang on 2008/06/14

    持续了近半年的Microsoft并购Yahoo的事件的第二轮会合竟然有了Yahoo与Microsoft中止所有谈判并与Google合作这样的结局,原本以为Yahoo与Google的合作测试只是Yahoo与MS谈判的筹码策略而已,用不会付诸于实际商业合作协议中。其间的纷繁复杂的谈判过程足以拍摄一部好莱坞的商业大片。

    “同与微软达成交易相比,与谷歌合作可以更快地带来回报”-杨致远,看来国外CEO真不容易,尽管作为创始人,还是要看股东们的脸色,还必须保证短期内最大的投资回报率。杨致远拒绝MS有千百个理由,只不过实在看不懂其投奔Google而去最为核心的理由,姑且以小人之心度君子之腹:

  • 面子问题及反微软斗士论:就是讨厌微软的霸道,从始至终都给人家一点台阶下,碍于烈女般的面子与贞操问题,俺要保存自己的贞节牌坊,宁为玉碎不为瓦全,就不与你合作。
  • 忍辱负重及快钱论:在无能的董事会及公司高层拿不出更好复兴计划前,投奔Google倒是能够带来Yahoo股东们所需要的快钱,减缓股东压力为保证Yahoo独立性而忍辱负重,同时也是保证Yahoo独立性,保证Yahoo不被微软并购。
  • 谈判策略论:刺激微软,吊起胃口,让微软进一步提高报价的策略
  • Google阴谋论:既然我得不到你(反垄断限制),那我就用金钱来勾引你放弃理想,逐渐堕落,从而毁掉你,让别人也得不到你;

    具体的原因现在尚不明朗,毕竟Yahoo与Google合作的范围尚不是很明确,也不是我所关心,但假定Yahoo与Google在搜索引擎广告上全面合作(但愿不是),从企业愿景角度而言,觉得Yahoo投奔Google实际上在毁灭Yahoo自己。

    爱人者,人恒爱之;敬人者,人恒敬之;

    欲人爱己先自爱,欲人尊己先自尊;

    相信Yahoo很多员工曾经的目标和梦想都是能够在与Google及其他竞争对手的产品竞争中开发出比竞争对手更好的产品,同时也以此为荣,这也是一个企业和员工能够赢得尊重的核心所在。Yahoo如果真的在搜索引擎广告上与Google完全合作,作为曾经的竞争对手,那这样的合作,无异于告诉Yahoo员工:你们投入自己心血所开发的搜索引擎、巴拿马广告等是失败的,我们已经在与Google的竞争缴械投降了。如果一个企业为了保存自己,委曲求全,放弃了自己曾经追求的梦想,那这样的企业还指望留住什么样的员工,还能赢得别人什么样尊重呢?

   希望自己在创业过程中持续保持对事业的激情,这样的人生才有价值。

 

无线互联网技术平台战略思考提纲

Posted in Uncategorized by chuanliang on 2008/06/07

    梳理一下无线互联网门户技术平台战略的规划思路,先罗列一下思考的要点:

1、技术平台战略定位:开放式平台架构

    封闭内部系统 .VS. 开放式技术平台(Facebook)

    自主运营平台. VS. 协作生态系统 (WIKI、UGC)

    单一功能平台. VS. 产品整合营销平台(Facebook、QQ)

    功能性平台 . VS. 在线生活方式(Facebook、赛我、QQ)

 

2、技术平台价值最大化

    在搭建技术平台的同时,需要充分发挥技术平台的优势,使其价值最大化,包括:

    开发资源、开发成果的最大化:最大化复用平台架构、开发资源

    平台功能价值最大化:运营平台、营销平台、支付平台、社区平台

    价值链价值最大化:以开放式平台来整合整个无线互联网增值业务价值链,让价值链合作伙伴完全依赖平台

    用户价值最大化:为用户提供一体化的在线生活平台,成为最佳的整合营销平台

 

3、电信重组后的3G时代的三大运营商战略

    电信重组对于无线互联网公司、增值业务公司都属于利好。作为落后者的中国电信及中国联通要在数据业务、语音业务等3G业务上迅速赶上,需要更加关注与价值链上合作伙伴分享价值、实现共赢。

    在电信重组后的3G时代,能否理解、把握、踩准运营商的战略节拍对于我们这样的公司至关重要;同时必须有自己的核心的忠实用户群才能够游走于三大运营商之间,做到持续的运营。因此需要深刻理解运营商的需求及客户的需求。

    近期电信和联通核心的任务应该是发展用户,因此对于我们这样的公司而言,我们对他们的价值在于:

    业务通路价值:3G时代,增值业务肯定是各运营商的战略重点,这些业务的落地需要依赖价值链上具备通路价值的公司来协同完成。

    发展用户价值:对于电信及联通,固网竞争态势已经基本明朗,怎样快速扩大自己的忠实手机用户群是其战略重点,因此对于运营商而言,这些无线互联网公司及增值业务公司的价值是谁能够帮助其发展用户,尤其是帮助其策反竞争对手的高价值用户。通过基于口碑营销模式或关系链的策反是比较有效的手段。

    长期而言,必须积累我们自己核心的用户群,让用户粘在我们的社区平台上。

  

4、近期技术平台核心技术

    Syncml同步引擎:包括基于Syncml协议的客户端及服务器端同步引擎,另外wbxml这样的数据压缩技术还是很重要的

    VOIP:通信需求始终是手机用户最大的业务需求,3G时代IP、VOIP化更是趋势

    客户端:初期重点为Symbian、Windows Mobile、MTK、J2ME;Android、Linux、BlackBerry、IPhone

    多客户端协议整合:电信、联通、移动的客户端的整合,同时包括诸如QQ、MSN等传统IM客户端的整合。

 

Funambol Syncml J2ME版本客户端编译指南

Posted in Uncategorized by chuanliang on 2008/06/05

简单描述一下安装测试funambol j2me客户端过程,过程只是用于测试j2me客户端功能,并没有考虑完整的项目应用,供参考备查。

1. 安装ant

从http://apache.mirror.phpchina.com/ant/binaries/apache-ant-1.7.0-bin.zip下载ant

解压到c:ant下

2. 安装antenna

从http://downloads.sourceforge.net/antenna/antenna-bin-1.0.2.jar下载antenna

拷贝到c:antlib

3. 安装wtk

从http://cds-esd.sun.com/ESD36/JSCDL/sun_java_wireless_toolkit/2.5.2/sun_java_wireless_toolkit-2_5_2-windows.exe?AuthParam=1212392225_9f66723e80a5d5619add0637b1c54f9b&TicketId=B%2Fw5kByCTl9JSBVLP1dSlQHm&GroupName=CDS&FilePath=/ESD36/JSCDL/sun_java_wireless_toolkit/2.5.2/sun_java_wireless_toolkit-2_5_2-windows.exe

下载wkt并安装到c:WTK2.5.2

4. 下载JMUnit

从http://jaist.dl.sourceforge.net/sourceforge/jmunit/JMUnit_1.0.1.zip下载JMUnit

解压后拷贝到C:WTK2.5.2bin及C:WTK2.5.2lib下

5. 在Eclipse中安装EclipseME

6. 从objectweb的cvs库获取funambol的j2me包

可以从http://download.forge.objectweb.org/sync4j/funambol-j2me-api-6.5.10.zip下载现成的funambol的j2me包

为了开发方便,从cvs库检出代码,自己编译

cvs库的信息:

认证方式:pserver

主机地址:cvs.forge.objectweb.org

用户名:anonymous

CVSROOT:anonymous@cvs.forge.objectweb.org:/cvsroot/sync4j

检出/funambol/client-api/j2me下的文件

7. 编译common包

7.1. 新建funambol-j2me-common项目

在eclipse中新建一个叫funambol-j2me-common的J2ME Midlet Suite项目,导入/funambol/client-api/j2me/common下的文件

由于没有安装BlackBerry的SDK,因此删除如下文件:

src/com/funambol/storage/BlackberryRecordStore.java

src/com/funambol/storage/BlackberryRecordEnumeration.java

src/com/funambol/util/BlackberryHelper.java

7.2. 修改build.properties

#

# Funambol J2ME API build properties file

#

j2me.name=funambol-j2me-common

j2me.release.major=7

j2me.release.minor=0

j2me.build.number=0

# Set this to your WTK installation, or copy the JAR to the local /lib

wtk.home=C:/WTK2.5.2

wtk.debug=false

# Set this to your JMunit installation, or copy the JAR to the local /lib

lib.junit=C:/WTK2.5.2/lib/JMUnit4CLDC10.jar

# Set this to your JZlib jar file, or copy the JAR to the local /lib

#lib.jzlib=lib/jzlib-1-0-7a.jar

lib.gzip=lib/tinyline-gzip.jar

7.3. 用ant运行build.xml

注意确保把antenna添加到ant的Classpath中,不采用eclipse自身的Ant Home

Run As ->Open External Tools Dialog->Ant Build->funambol-j2me-common->Classpath->Ant Home

7.4. 用EclipseME的工具创建package,以方便funambol-j2me-syncml项目编译使用

Right Button->J2ME->Create Package

生成的打包文件funambol-j2me-common.jar及funambol-j2me-common.jad存放在deployed目录下

8. 编译syncml包

8.1. 新建funambol-j2me-syncml项目

在eclipse中新建一个叫funambol-j2me-syncml的J2ME Midlet Suite项目,导入/funambol/client-api/j2me/syncml下的文件,再在funambol-j2me-syncml创建lib目录

8.2. 拷贝funambol-j2me-common文件

把funambol-j2me-common deploy目录下funambol-j2me-common.jar的文件拷贝到unambol-j2me-syncml的lib目录下

把funambol-j2me-common编译目录(假定为bin)下的文件拷贝到funambol-j2me-syncml的编译目录(假定为bin)下

8.3. 修改build.properties

#

# Funambol J2ME API build properties file

#

j2me.name=funambol-j2me-syncml

j2me.release.major=7

j2me.release.minor=0

j2me.build.number=0

# Set this to your WTK installation, or copy the JAR to the local /lib

wtk.home=C:/wtk2.5.2

wtk.debug=false

# Set this to your JMunit installation, or copy the JAR to the local /lib

lib.junit=C:/WTK2.5.2/lib/JMUnit4CLDC10.jar

# Uncomment this to refer to the output lib of your ‘common’ module, or copy

# the JAR to the local /lib

lib.funambol.common=${basedir}/lib/funambol-j2me-common.jar

8.4. 修改build.xml

将 <target name=”preprocess” depends=”init”>

<mkdir dir=”${dir.preproc.src}”/>

<wtkpreprocess srcdir=”${dir.src}”

destdir=”${dir.preproc.src}”

symbols=”${device.isBlackberry_plugin}”

verbose=”false” indent=”false”>

</wtkpreprocess>

</target>

修改为

<target name=”preprocess” depends=”init”>

<mkdir dir=”${dir.preproc.src}”/>

<wtkpreprocess srcdir=”${dir.src}”

destdir=”${dir.preproc.src}”

verbose=”false” indent=”false”>

</wtkpreprocess>

</target>

实际上就是删除symbols=”${device.isBlackberry_plugin}”

8.5. 在test目录下编写测试用的Midelet SyncMidlet.java

package com.funambol.syncml.client;

import java.util.Random;

import javax.microedition.lcdui.Display;

import javax.microedition.lcdui.TextBox;

import javax.microedition.midlet.MIDlet;

import javax.microedition.midlet.MIDletStateChangeException;

import com.funambol.syncml.protocol.SyncML;

import com.funambol.syncml.spds.SourceConfig;

import com.funambol.syncml.spds.SyncConfig;

import com.funambol.syncml.spds.SyncManager;

import com.funambol.syncml.spds.SyncSource;

import com.funambol.util.Log;

public class SyncMidlet extends MIDlet {

private static final String STORE_NAME = “TESTCONFIG”;

private static final String SOURCE_NAME = “source.briefcase”;

private static final String URL = “http://localhost:8080/funambol/ds&#8221;;

private static final String userName=”liangchuan”;

private static final String password=”liangchuan”;

private Display display;

private TextBox t;

private SourceConfig sc;

private SyncConfig conf;

private SyncManager sm;

private TestSyncSource testsrc;

private TestSyncListener sl ;

public SyncMidlet() {

display = Display.getDisplay(this);

t = new TextBox(“Syncml Test MIDlet”, “Syncml Test MIDP!”, 256, 0);

}

protected void destroyApp(boolean arg0) throws MIDletStateChangeException {

}

protected void pauseApp() {

display.setCurrent(t);

}

protected void startApp() throws MIDletStateChangeException {

sc = new SourceConfig();

conf = new SyncConfig();

conf.syncUrl = URL;

conf.userName =userName;

conf.password =password;

conf.deviceConfig.devID = generateDeviceId();

sc.setType(“text/plain”);

sc.setEncoding(SyncSource.ENCODING_NONE);

sm = new SyncManager(conf);

testsrc = new TestSyncSource(sc);

sl = new TestSyncListener();

testsrc.setListener(sl);

sm.sync(testsrc, SyncML.ALERT_CODE_SLOW);

display.setCurrent(t);

}

public String generateDeviceId() {

Random r = new Random();

StringBuffer s = new StringBuffer(“fsc-j2me-api-test-“);

s.append(Long.toString(System.currentTimeMillis(),16));

s.append(Integer.toHexString(r.nextInt()));

String deviceId = s.toString();

return deviceId;

}

}

8.6. 用ant运行build.xml的build[default]、compile、compiletest target

注意确保把antenna添加到ant的Classpath中,不采用eclipse自身的Ant Home

Run As ->Open External Tools Dialog->Ant Build->funambol-j2me-syncml->Classpath->Ant Home

8.7. 拷贝funambol-j2me-common classes文件用于打包

把funambol-j2me-common output/classses下的文件拷贝到funambol-j2me-syncml的编译目录(假定为bin)下

8.8. 拷贝funambol-j2me-syncml项目的文件用于打包

把funambol-j2me-syncml用ant编译目录out/classes下的文件拷贝到funambol-j2me-syncml的编译目录(假定为bin)下

8.9. 用EclipseME的工具创建package

Right Button->J2ME->Create Package

生成的打包文件funambol-j2me-syncml.jar及funambol-j2me-syncml.jad存放在deployed目录下

8.10. 修改funambol-j2me-syncml.jad

双击funambol-j2me-syncml.jad,在Midlets标签中增加MIDlet-
1描述如下内容:

Name :SyncMidlet

Icon:无

Class:com.funambol.syncml.client.SyncMidlet

或者直接修改funambol-j2me-syncml.jad,增加

MIDlet-1: SyncMidlet,,com.funambol.syncml.client.SyncMidlet

8.11. 通过WTK测试的Run MIDP Application运行SyncMidlet

8.12. 使用EclipseME打包注意事项:

在用eclipseme打包时候,好像很不稳定,有时候不能把所有的文件打进包中,解决办法:

用手工把funambol-j2me-syncml/bin下的类文件(包括funambol-j2me-common的类)通过jar或winrar打入eclipseme生成的jar包中,同时手工编辑生成funambol-j2me-syncml.jad,修改MIDlet-Jar-Size,其中MIDlet-Jar-Size大小看funambol-j2me-syncml.jar文件属性得到

MIDlet-Jar-Size: 115491

MIDlet-Jar-URL: funambol-j2me-syncml.jar

MIDlet-Name: funambol-j2me-syncml Midlet Suite

MIDlet-Vendor: Midlet Suite Vendor

MIDlet-Version: 1.0.8

MicroEdition-Configuration: CLDC-1.1

MicroEdition-Profile: MIDP-2.0

MIDlet-Name: synctest Midlet Suite

MIDlet-1: SyncMidlet,,com.funambol.syncml.client.SyncMidlet