加缓存会增加程序的复杂度(缓存更新策略)。

而一般数据库的优化,不会增加程序的复杂度。即使是增加一些冗余字段,复杂度也不高。

所以首先把数据库优化到没法再榨取性能了,之后才加缓存比较合理。

 

posted @ 2012-01-20 00:17 rethink 阅读(19) 评论(0) 编辑

1 开发阶段每天短会议:

每天早上9点15分举行个简短的会议。
会议内容

组长需要准备的内容: 

A 当天要开发的需求,注意点,难点等
B 项目的最新消息

参与者每天的会议需要交流这些信息:

A 我昨天做了什么

B 我今天要做什么

C 有什么问题妨碍我取得进展

 

 

 

posted @ 2012-01-20 00:11 rethink 阅读(15) 评论(0) 编辑
tools->export tables 是导出表结构还有数据
tools->export user objects是导出表结构
可以用tools->export tables
用中间的sql inserts页面,选中create tables选项,where clause 里写入 where rownum<1。
如果表包含有CLOB类型字段的话,sql是无法导出的。这时候可以改用PL/SQL的pde格式进行导出。
posted @ 2011-12-07 14:36 rethink 阅读(17) 评论(0) 编辑

版权声明:转载时请以超链接形式标明文章原始出处和作者信息及本声明
http://kimva.blogbus.com/logs/8219967.html

oracle字符集理解:
一.引言

    ORACLE数据库字符集,即Oracle全球化支持(Globalization Support),或即国家语言支持(NLS)其作用是用本国语言和格式来存储、处理和检索数据。利用全球化支持,ORACLE为用户提供自己熟悉的数据库母语环境,诸如日期格式、数字格式和存储序列等。Oracle可以支持多种语言及字符集,其中oracle8i支持48种语言、76个国家地域、229种字符集,而oracle9i则支持57种语言、88个国家地域、235种字符集。由于oracle字符集种类多,且在存储、检索、迁移oracle数据时多个环节与字符集的设置密切相关,因此在实际的应用中,数据库开发和管理人员经常会遇到有关oracle字符集方面的问题。本文通过以下几个方面阐述,对oracle字符集做简要分析

二.字符集基本知识

2.1字符集
    实质就是按照一定的字符编码方案,对一组特定的符号,分别赋予不同数值编码的集合。Oracle数据库最早支持的编码方案是US7ASCII。
    Oracle的字符集命名遵循以下命名规则:
    <Language><bit size><encoding>
    即:  <语言><比特位数><编码>
    比如: ZHS16GBK表示采用GBK编码格式、16位(两个字节)简体中文字符集

2.2字符编码方案
2.2.1 单字节编码
    (1)单字节7位字符集,可以定义128个字符,最常用的字符集为US7ASCII
    (2)单字节8位字符集,可以定义256个字符,适合于欧洲大部分国家
    例如:WE8ISO8859P1(西欧、8位、ISO标准8859P1编码)
2.2.2 多字节编码
    (1)变长多字节编码
    某些字符用一个字节表示,其它字符用两个或多个字符表示,变长多字节编码常用于对亚洲语言的支持,   例如日语、汉语、印地语等
    例如:AL32UTF8(其中AL代表ALL,指适用于所有语言)、zhs16cgb231280
    (2)定长多字节编码
    每一个字符都使用固定长度字节的编码方案,目前oracle唯一支持的定长多字节编码是AF16UTF16,也是仅用于国家字符集
2.2.3 unicode编码
    Unicode是一个涵盖了目前全世界使用的所有已知字符的单一编码方案,也就是说Unicode为每一个字符提供唯一的编码。UTF-16是unicode的16位编码方式,是一种定长多字节编码,用2个字节表示一个unicode字符,AF16UTF16是UTF-16编码字符集。
    UTF-8是unicode的8位编码方式,是一种变长多字节编码,这种编码可以用1、2、3个字节表示一个unicode字符,AL32UTF8,UTF8、UTFE是UTF-8编码字符集

2.3 字符集超级
    当一种字符集(字符集A)的编码数值包含所有另一种字符集(字符集B)的编码数值,并且两种字符集相同编码数值代表相同的字符时,则字符集A是字符集B的超级,或称字符集B是字符集A的子集。
    Oracle8i和oracle9i官方文档资料中备有子集-超级对照表(subset-superset pairs),例如:WE8ISO8859P1是WE8MSWIN1252的子集。由于US7ASCII是最早的Oracle数据库编码格式,因此有许多字符集是US7ASCII的超集,例如WE8ISO8859P1、ZHS16CGB231280、ZHS16GBK都是US7ASCII的超集。

2.4 数据库字符集(oracle服务器端字符集)
    数据库字符集在创建数据库时指定,在创建后通常不能更改。在创建数据库时,可以指定字符集(CHARACTER SET)和国家字符集(NATIONAL CHARACTER SET)。
2.4.1字符集
    (1)用来存储CHAR, VARCHAR2, CLOB, LONG等类型数据
    (2)用来标示诸如表名、列名以及PL/SQL变量等
    (3)用来存储SQL和PL/SQL程序单元等
2.4.2国家字符集:
    (1)用以存储NCHAR, NVARCHAR2, NCLOB等类型数据
    (2)国家字符集实质上是为oracle选择的附加字符集,主要作用是为了增强oracle的字符处理能力,因为NCHAR数据类型可以提供对亚洲使用定长多字节编码的支持,而数据库字符集则不能。国家字符集在oracle9i中进行了重新定义,只能在unicode编码中的AF16UTF16和UTF8中选择,默认值是AF16UTF16
2.4.3查询字符集参数
    可以查询以下数据字典或视图查看字符集设置情况
    nls_database_parameters、props$、v$nls_parameters
    查询结果中NLS_CHARACTERSET表示字符集,NLS_NCHAR_CHARACTERSET表示国家字符集
2.4.4修改数据库字符集
    按照上文所说,数据库字符集在创建后原则上不能更改。如果需要修改字符集,通常需要导出数据库数据,重建数据库,再导入数据库数据的方式来转换,或通过ALTER DATABASE CHARACTER SET语句修改字符集,但创建数据库后修改字符集是有限制的,只有新的字符集是当前字符集的超集时才能修改数据库字符集,例如UTF8是US7ASCII的超集,修改数据库字符集可使用ALTER DATABASE CHARACTER SET UTF8。正确的修改方法如下:
  $sqlplus /nolog
  SQL>conn / as sysdba;
  若此时数据库服务器已启动,则先执行SHUTDOWN IMMEDIATE命令关闭数据库服务器,然后执行以下命令:
  SQL>STARTUP MOUNT;
  SQL>ALTER SYSTEM ENABLE RESTRICTED SESSION;
  SQL>ALTER SYSTEM SET JOB_QUEUE_PROCESSES=0;
  SQL>ALTER SYSTEM SET AQ_TM_PROCESSES=0;
  SQL>ALTER DATABASE OPEN;
  SQL>ALTER DATABASE CHARACTER SET ZHS16GBK;
  SQL>ALTER DATABASE national CHARACTER SET ZHS16GBK;
  SQL>SHUTDOWN IMMEDIATE;
  SQL>STARTUP

2.5 客户端字符集(NLS_LANG参数)
2.5.1客户端字符集含义
    客户端字符集定义了客户端字符数据的编码方式,任何发自或发往客户端的字符数据均使用客户端定义的字符集编码,客户端可以看作是能与数据库直接连接的各种应用,例如sqlplus,exp/imp等。客户端字符集是通过设置NLS_LANG参数来设定的。
2.5.2 NLS_LANG参数格式
    NLS_LANG=<language>_<territory>.<client character set> 
    Language:显示oracle消息,校验,日期命名
    Territory:指定默认日期、数字、货币等格式
    Client character set:指定客户端将使用的字符集
    例如:NLS_LANG=AMERICAN_AMERICA.US7ASCII  
    AMERICAN是语言,AMERICA是地区,US7ASCII是客户端字符集
2.5.3客户端字符集设置方法
     1)UNIX环境
         $NLS_LANG=“simplified chinese”_china.zhs16gbk
         $export NLS_LANG
         编辑oracle用户的profile文件
    2)Windows环境
         编辑注册表
         Regedit.exe---HKEY_LOCAL_MACHINE---SOFTWARE---ORACLE—HOME0
2.5.4 NLS参数查询
    Oracle提供若干NLS参数定制数据库和用户机以适应本地格式,例如有NLS_LANGUAGE,NLS_DATE_FORMAT,NLS_CALENDER等,可以通过查询以下数据字典或v$视图查看。
    NLS_DATABASE_PARAMETERS--显示数据库当前NLS参数取值,包括数据库字符集取值
    NLS_SESSION_PARAMETERS--显示由NLS_LANG 设置的参数,或经过alter session 改变后的参数值(不包括由NLS_LANG 设置的客户端字符集)
    NLS_INSTANCE_PARAMETE--显示由参数文件init<SID>.ora 定义的参数V$NLS_PARAMETERS--显示数据库当前NLS参数取值
2.5.5修改NLS参数
    使用下列方法可以修改NLS参数
    (1)修改实例启动时使用的初始化参数文件
    (2)修改环境变量NLS_LANG
    (3)使用ALTER SESSION语句,在oracle会话中修改
    (4)使用某些SQL函数
    NLS作用优先级别:Sql function>alter session>环境变量或注册表>参数文件>数据库默认参数

三.导入/导出与字符集转换

3.1 EXP/IMP
    Export 和 Import 是一对读写Oracle数据的工具。Export 将 Oracle 数据库中的数据输出到操作系统文件中, Import 把这些文件中的数据读到Oracle 数据库中,由于使用exp/imp进行数据迁移时,数据从源数据库到目标数据库的过程中有四个环节涉及到字符集,如果这四个环节的字符集不一致,将会发生字符集转换。

EXP                       

IMP                       

    四个字符集是
   (1)源数据库字符集 
   (2)Export过程中用户会话字符集(通过NLS_LANG设定)
   (3)Import过程中用户会话字符集(通过NLS_LANG设定)
   (4)目标数据库字符集

3.2导出的转换过程
    在Export过程中,如果源数据库字符集与Export用户会话字符集不一致,会发生字符集转换,并在导出文件的头部几个字节中存储Export用户会话字符集的ID号。在这个转换过程中可能发生数据的丢失。
例:如果源数据库使用ZHS16GBK,而Export用户会话字符集使用US7ASCII,由于ZHS16GBK是16位字符集,而US7ASCII是7位字符集,这个转换过程中,中文字符在US7ASCII中不能够找到对等的字符,所以所有中文字符都会丢失而变成“?? ”形式,这样转换后生成的Dmp文件已经发生了数据丢失。
因此如果想正确导出源数据库数据,则Export过程中用户会话字符集应等于源数据库字符集或是源数据库字符集的超集
3.2.1 修改dmp文件字符集
  上文说过,dmp文件的第2第3字节记录了字符集信息,因此直接修改dmp文件的第2第3字节的内容就可以‘骗’过oracle的检查。这样做理论上也仅是从子集到超集可以修改,但很多情况下在没有子集和超集关系的情况下也可以修改,我们常用的一些字符集,如US7ASCII,WE8ISO8859P1,ZHS16CGB231280,ZHS16GBK基本都可以改。因为改的只是dmp文件,所以影响不大。
  具体的修改方法比较多,最简单的就是直接用UltraEdit修改dmp文件的第2和第3个字节。比如想将dmp文件的字符集改为ZHS16GBK,可以用以下SQL查出该种字符集对应的16进制代码:
  SQL> select to_char(nls_charset_id('ZHS16GBK'), 'xxxx') from dual;
  0354
  然后将dmp文件的2、3字节修改为0354即可。
  如果dmp文件很大,用ue无法打开,就需要用程序的方法了。网上有人用java存储过程写了转换的程序(用java存储过程的好处是通用性教好,缺点是比较麻烦)。我在windows下测试通过。但要求oracle数据库一定要安装JVM选项。有兴趣的朋友可以研究一下程序代码

3.3导入的转换过程
    (1)确定导出数据库字符集环境
    通过读取导出文件头,可以获得导出文件的字符集设置
    (2)确定导入session的字符集,即导入Session使用的NLS_LANG环境变量
    (3)IMP读取导出文件
    读取导出文件字符集ID,和导入进程的NLS_LANG进行比较
    (4)如果导出文件字符集和导入Session字符集相同,那么在这一步骤内就不需要转换,如果不同,就需要把数据转换为导入Session使用的字符集。可以看出,导入数据到数据库过程中发生两次字符集转换
    第一次:导入文件字符集与导入Session使用的字符集之间的转换,如果这个转换过程不能正确完成,Import向目标数据库的导入过程也就不能完成。
    第二次:导入Session字符集与数据库字符集之间的转换。
    然而,oracle8i的这种转换只能在单字节字符集之间进行,oracle8i导入Session不支持多字节字符集之间的转换,因此为了避免第一次转换,导入Session使用的NLS_LANG与导出文件字符集相同,第二次转换(通过SQL*Net)支持任何两种字符集。以上情况在Oracle9i中略有不同

四.乱码问题

    oracle在数据存储、迁移过程中经常发生字符乱码问题,归根到底是由于字符集使用不当引起。下面以使用客户端sqlplus向数据库插入数据和导入/导出(EXP/IMP)过程为例,说明乱码产生的原因。

4.1使用客户端sqlplus向数据库存储数据
    这个过程存在3个字符集设置
    (1)客户端应用字符集
    (2)客户端NLS_LANG参数设置
    (3)服务器端数据库字符集(Character Set)设置
    客户端应用sqlplus中能够显示什么样的字符取决于客户端操作系统语言环境(客户端应用字符集),但在应用中录入这些字符后,这些字符能否在数据库中正常存储,还与另外两个字符集设置紧密相关,其中客户端NLS_LANG参数主要用于字符数据传输过程中的转换判断。常见的乱码大致有两种情形:
    (1)汉字变成问号“?”;
当从字符集A 转换成字符集B时,如果转换字符之间不存在对应关系,NLS_LANG使用替代字符“?”替代无法映射的字符
    (2)汉字变成未知字符(虽然有些是汉字,但与原字符含义不同)
转换存在对应关系,但字符集A 中的字符编码与字符集B 中的字符编码代表不同含义

4.2发生乱码原因 
    乱码产生是由于几个字符集之间转换不匹配造成,分以下几种情况:
    (注:字符集之间如果不存在子集、超集对应关系时的情况不予考虑,因为这种情况下字符集之间转换必产生乱码)   
    1)服务器端数据库字符集与客户端应用字符集相同,与客户端NLS_LANG参数设置不同
    如果客户端NLS_LANG字符集是其它两种字符集的子集,转换过程将出现乱码。
    解决方法:将三种字符集设置成同一字符集,或NLS_LANG字符集是其它两种字符集的超集
    2)服务器端数据库字符集与客户端NLS_LANG参数设置相同,与客户端应用字符集不同
    如果客户端应用字符集是其它两种字符集的超集时,转换过程将出现乱码,但对于单字节编码存储中文问题,可参看本文第5章节的分析
    3)客户端应用字符集、客户端NLS_LANG参数设置、服务器端数据库字符集互不相同
    此种情况较为复杂,但三种字符集之间只要有不能转换的字符,则必产生乱码

4.3导入/导出过程出现乱码原因
    这个过程存在4个字符集设置,在3.1章节中已分析
   (1)源数据库字符集
   (2)EXP过程中NLS_LANG参数 
   (3)IMP过程中NLS_LANG参数
   (4)目标数据库字符集
    出现乱码原因
    1)当源数据库字符集不等于EXP过程中NLS_LANG参数,且源数据库字符集是EXP过程中NLS_LANG的子集,才能保证导出文件正确,其他情况则导出文件字符乱码
    2)EXP过程中NLS_LANG字符集不等于IMP过程中NLS_LANG字符集,且EXP过程中NLS_LANG字符集是IMP过程中NLS_LANG字符集的子级, 才能保证第一次转换正常,否则第一次转换中出现乱码。
    3)如果第一次转换正常,IMP过程中NLS_LANG字符集是目标数据库字符集的子集或相同,才能保证第二次转换正常,否则则第二次转换中出现乱码

五.单字节编码存储中文问题

    由于历史的原因,早期的oracle没有中文字符集(如oracle6、oracle7、oracle7.1),但有的用户从那时起就使用数据库了,并用US7ASCII字符集存储了中文,或是有的用户在创建数据库时,不考虑清楚,随意选择一个默认的字符集,如WE8ISO8859P1或US7ASCII,而这两个字符集都没有汉字编码,虽然有些时候选用这种字符集好象也能正常使用,但用这种字符集存储汉字信息从原则上说就是错误的,它会给数据库的使用与维护带来一系列的麻烦。
    正常情况下,要将汉字存入数据库,数据库字符集必须支持中文,而将数据库字符集设置为US7ASCII等单字节字符集是不合适的。US7ASCII字符集只定义了128个符号,并不支持汉字。另外,如果在SQL*PLUS中能够输入中文,操作系统缺省应该是支持中文的,但如果在NLS_LANG中的字符集设置为US7ASCII,显然也是不正确的,它没有反映客户端的实际情况。但在实际应用中汉字显示却是正确的,这主要是因为Oracle检查数据库与客户端的字符集设置是同样的,那么数据在客户与数据库之间的存取过程中将不发生任何转换,但是这实际上导致了数据库标识的字符集与实际存入的内容是不相符的。而在SELECT的过程中,Oracle同样检查发现数据库与客户端的字符集设置是相同的,所以它也将存入的内容原封不动地传送到客户端,而客户端操作系统识别出这是汉字编码所以能够正确显示。
    在这个例子中,数据库与客户端都没有设置成中文字符集,但却能正常显示中文,从应用的角度看好象没问题。然而这里面却存在着极大的隐患,比如在应用length或substr等字符串函数时,就可能得到意外的结果。
    对于早期使用US7ASCII字符集数据库的数据迁移到oracle8i/9i中(使用zhs16gbk),由于原始数据已经按照US7ASCII格式存储,对于这种情况,可以通过使用Oracle8i的导出工具,设置导出字符集为US7ASCII,导出后使用UltraEdit等工具打开dmp文件,修改第二、三字符,修改 0001 为0354,这样就可以将US7ASCII字符集的数据正确导入到ZHS16GBK的数据库中。

六.结束语

    为了避免在数据库迁移过程中由于字符集不同导致的数据损失,oracle提供了字符集扫描工具(character set scanner),通过这个工具我们可以测试在数据迁移过程中由于字符集转换可能带来的问题,然后根据测试结果,确定数据迁移过程中最佳字符集解决方案。

posted @ 2011-12-07 10:38 rethink 阅读(21) 评论(0) 编辑

第7章 编写高效的JavaScript

  1 管理作用域

标识符在作用域链中的位置越深,查找和访问它所需要的时间就越长;

局部变量是JavaScript中读写最快的标识符。 全局变量对象始终是作用域链中的最后一个对象,所以对全局标识符的解析总是最耗时的。

原则:尽可能的使用局部变量。任何非局部变量在函数中使用超过一次时,都应该将其存储为局部变量。

如:在函数中如果多次调用全局变量document,则应该在函数中定义:var doc = document; 

基于V8 JavaScript引擎的Google Chrome和基于Nitro JavaScript引擎的Safari 4+的存取速度超快,标识符深度的影响微乎其微了。 

 

2  高效的数据存取

 读取局部变量的速度快于数组元素和对象属性。

 如:循环的时候,for (var i=0; i < data.count; i++) 应该改成 var count = data.count; for (var i=0; i < count; i++); 

 

 随着数据结构深度的增加,数据存储速度也跟着变大。

 如:存取data.count 比 data.item.count 快。 

 

 在数据存取时,将函数中使用超过一次的对象属性或数组元素存储成局部变量是个好方法。

 

 对于大多数浏览器来说,存取对象属性使用点符号(data.count)还是方括号(data["count"])几乎没有差别,但是Safari是例外,在Safari中使用方括号明显比点符号慢。 


 数组元素和对象属性的读取速度因浏览器而异。有的读取数组快,有的反之。 

 

 对DOM的操作特别要注意:

 var divs = document.getElementsByTagName("div");

   for (var i=0; i< divs.length; i++) //该方式要避免,因为每次都要查询DOM

 应该再增加一个步骤:len = divs.length 。 

 操作DOM对象的开销总是比非DOM对象要大,HTMLCollection对象则是DOM中性能最糟糕的。如果要对HTMLCollection对象的成员反复存取,最高效的方法是先将它们复制到一个数组中。

 

 

 

posted @ 2011-06-03 11:10 rethink 阅读(73) 评论(0) 编辑

【移动web网站的标记语言】

A       WML即无线标记语言(主要面向旧式的移动设备)

         主要版本WML1.1 WML 1.31.3引入了对彩色图像的支持。相应的脚本是WML script

         过时的语言了,iphone明确表示不再支持WML

         目前的情况(201010月),以美国市场为例,5%的手机仅支持WML,剩下的95%支持XHTML-MP, XHTMLHTML

B       CHTML(日本特有的,docomo发起的)

         在日本市场,使用慢慢也在减少了,通过CHTML开发的各种I-mode服务已经被XHTML迅速的取代。

C       XHTML-MPXHTML移动配置文件,(主要面向非智能手机和除iphone以外的绝大多数智能手机)

         XHTML-MP目前最广泛的移动web标记语言

         XHTML-MP 1.0设定了移动标记语言的基本标记。

         XHTML-MP 1.1 添加了<SCRIPT>标记并支持移动JavaScript

         XHTML-MP1.2 添加了更多表单标记和文本输入模式。

D      XHTML (主要面向高级移动设备和智能手机)

E       传统HTML (主要面向高级移动设备和智能手机)

         虽然现在的智能手机很多已经支持html,但是不推荐使用,因为html的语法非常的松散(据Opera统计,事实上只有4.13%的网页符合WEB标记和脚本编写标准)。为了对应这些松散的语法,桌面浏览器做了大量的工作。但是移动浏览器出于性能考虑,对这方面的优化很少。所以对于要面向智能手机提供丰富体验的站点,建议使用XHTML

AndroidiPhone等新的智能手机都支持XHTMLHTMLJavaScriptAJAX。部分HTML5CSS3

F       HTML5

在高端手机上,HTML5有取代XHTML的趋势。


技术点:

A       MIME类型

不同的语言,MIME类型不一样。MIME类型是页面能否被正确解析的前提。

由于传统的服务器(如apache)是面向桌面web的,所以需要向Web服务器配置中添加新的MIME类型(apache中使用AddType指令向mime.types等配置文件中添加新的MIME类型)。

         如果页面是动态生成的,也可以用动态语言发送header信息。

B       头信息要正确。

XHTML-MP 1.0为例:

<?xml version="1.0" encoding="UTF-8"?>

<!—上面是XML声明。XHTML-MPXML -->

<!—DOCTYPE声明该文档是XHTML-MP 1.0 -->

<!DOCTYPE html PUBLIC "-//WAPFORUM//DTD XHTML Mobile 1.0//EN" "http://www.wapforum.org/DTD/xhtml-mobile10.dtd">

<html xmlns="http://www.w3.org/1999/xhtml">

 

【移动JavaScript

与桌面JavaScript的差异:

1       全局方法eval是可选的

2       with关键字是可选的。

3       动态函数构造是可选的。

         比如下列方法可能在某些支持JavaScript的手机上并不支持:

         Window.onload = new function() {alert(‘Hello World’);};

 

4         必须使用分号终止编程语句:脚本行必须以分号结束。

5       DOM和事件支持会因移动浏览器不同而有差异。

         比如:在最新支持重力感应手机终端上,屏幕翻转时触发的函数也可能不一致,有的使用onresize函数,有的使用onorientation函数。

6       减少了支持的字符集。

7       必须声明相应的DTD,如xhtml1.11.2

8       某些机型的专有方法:比如有些机型对GPS的支持,和对多点触摸的支持。

 

开发原则:

A       在不支持JavaScript的终端,也要提供可用的web体验。

B       真机测试。

C       AJAX使用计时器的时候要谨慎,定时执行的话可能会带来电池耗电过大,还有上网流量问题。

 

【移动CSS

1           删除了密集型CSS功能,如属性继承和3D元素对齐方式。

2           有两种标准:无线CSSCSS移动配置文件。两者差别较大。

确实手机支持哪种css

         A       查看手机浏览器制造商文档。(有些浏览器不提供)

         B       查询设备数据库。

 

技术点:

1           所有数字属性都必须包含单位。

2           font-family使用常规值,而对font-size使用相对值。实际上,开发人员无法控制移动设备上的安装的字体。所以较为简单的常规font-family值以及相对的font-size值,来实现灵活的页面样式。

3           唯一可靠的border-style值是solid。高级浏览器可能会支持其他边框样式,但只有solid样式的边框线可以在小尺寸屏幕上很好的呈现。

 

【页面调试环境】

以下三种的可靠性依次递增:

1           浏览器模拟。如Firefox插件

2           移动浏览器模拟器

3           真机。(必须的)

 

文档验证器:

在移动Web中,样式表和标记语法的有效性是必不可少的,页面必须符合标准语法,以确保在广泛的移动Web浏览器中的兼容性。

 

W3C标记验证服务:http://validator.w3.org

W3C          CSS验证服务:http://jigsaw.w3.org/css-validator/

W3C MobileOk检查器:http://validator.w3.org/mobile/

mobiReady: http://ready.mobi/

Validome: http://www.validome.org/

 

测试时需要意识到如下问题:

通过wi-fi和通过运营商无限网络(GPRSGSMUMTSLTECDMA)访问web站点是有差别的,前者没有通过移动运营商专用网络。

移动运营商专用网络可能会过滤、缓存甚至修改web页面的内容,同时还会提供一些有价值的服务,如唯一的用户标志和统一计费等等。

 

【设备识别和内容自适应】

移动Web开发核心原理:设备识别和内容自适应。

1       设备识别:

         主要依靠User-Agent来识别移动移动浏览器,制造商和型号。

         但只有User-Agent的信息是不足够的,必须使用设备数据库获取设备信息。

         设备信息数据库:

         A       WURFL(开放的数据库,并提供API-----欧美

         B       DeviceAtlas(商业设备数据库和API------欧美

         C       MOBYRENT-----日本

 

2       内容自适应:

结合1的设备识别,针对不同移动终端输出不同的页面内容。

        

         开发一个内容自适应移动web网站的流程:      

         A   确定该移动web站点所面向的移动设备。

         B       以设备数据库中的可用特征为指导,基于共享的功能将目标设备分成不同的组。

         C       确定移动web站点中可以共享的功能。

         D      针对不同设备组,设计不同的对应方案:设定如何针对每个组精确的更改web站点内容和页面呈现。

                   以显示图片为例,在不同大小的手机屏幕上,显示的是不同大小的图片。因此每个图片有多个版本,对于用户上传的图片,也需要生成不同版本的缩略图。


比较典型的设备组参考:(一个设备可以属于多个组)

第一组:支持JavaScriptAJAX的浏览器。

第二组:屏幕宽带为320像素或更大的浏览器。

第三组:屏幕宽度介于240像素与319像素之间的设备。

第四组:屏幕小于240像素的设备

第五组:仅支持WML浏览器的设备

 

此外,根据项目的面向终端范围和项目需求,设备组可以再细化或者精简,比如:使用WebKit引擎的浏览器(iphoneAndroid上的浏览器)等,WebKit浏览器支持专用的很有用CSS扩展。

 

理想的情况:

采用渐进增强的开发方式,先定义内容,然后通过CSS增强内容样式,最后通过JavaScript增强用户体验。

即:内容和样式彻底分离(如使用DIV+CSS设计页面),在不同的手机终端,使用不同的CSS(及不同的图片)。在支持重力感应的手机终端中,横向和纵向使用不同的CSS。在不支持JavaScript的情况下,页面可以正常使用,在支持JavaScript的情况下,客户体验更丰富。

 

一般经验:

1           首先开发基本的版本。

2           仅创建两个移动版本,其中一个用于基本的手机,另一个用于智能手机。然后根据客户所使用的手机优化功能更丰富的版本。

 

【页面/功能设计】

1           仅提供用户所需的功能,简化所有内容

2           最大限度减少交互。

3           将移动web站点限制为三级导航。移动用户访问站点的时间很短暂,要在尽可能短的时间内找到想要查看的内容。也要容易返回到上一级。

4           保存用户设置,减少用户交互。使用cookie保存用户设置。(比如图片大小选项,是否3G版本等);

5           纵向模式和横向模式要都能正常显示。正确可以使用样式(100%宽度等)来解决此问题。

6           优化所有内容。(图片:使用PNG可以实现质量和大小的折中。JS,CSS文件优化)

7           尽量避免使用以下功能:弹出窗口、鼠标悬停菜单、自动重定向、外部链接、水平滚动以及框架。

8           AJAX:可降解。

 

【智能手机浏览器】

1           智能手机浏览器通用的web技术

A       Viewport Meta标记。

<meta name=”viewpost” content=”width=240,height=320,user-scalable=yes,

initial-scale=2.5,maximum-scale=5.0,minimum-scale=1.0” />

widthheight指令分别指定视区的逻辑宽度和逻辑高度。

user-scalable指令指定用户是否可以缩放视区,即缩放Web页面的视图。

Initial-scale指令用于设置用于Web页面的初始缩放比例,值为1.0时将显示未经缩放的web文档。

Maximum-scaleminimum-scale指令设置用户对web页面缩放比例的限制,值的范围是0.2510.0.

 

B       JavaScript中检测方向变更(横向或纵向)

使用浏览器的window对象的onresizeonorientationchange事件进行处理。

Iphone两种都支持,但通常用onorientationchange

Android和其他源自webkit的浏览器仅支持onresize

BlackBerry设备针对docoment对象支持onresize。(但blackberry只有少数机子支持方向变更)。

 

参考:

Iphonewindow.orientation属性的值:

-90:横向,屏幕以顺时针方向旋转。

0:纵向。默认的属性值

90:横向,逆时针方向旋转

180:纵向;上下翻转。目前暂时不支持。

 

2           移动浏览器中的WebKit

有一些专用的CSS扩展,基于webit的浏览器一般都可以使用这些扩展。

         基于webkit的浏览器:

A       用于iphonesafari mobile

http://developer.apple.com/technologies/safari/

B       用于Android移动设备的浏览器(也是基于webkit

C       用于Palm PrewebOS浏览器;

D      nokai S603版和第5版及以后。

 

3           其他浏览器:

以下浏览器实现的内核不一样,能实现的功能有所差异。

BlackBerry浏览器;

windows Mobile中的IE mobile浏览器;

Opera Mini(实际上是一个代码转换解决方案);

Opera Mobile浏览器;

 

【页面优化】

1           最小化外部资源

2           删除空白、注释和不必要的标记(工具:YUI CompressorJSMin

3           对图像进行调整和转换

4           对于非智能手机,有些可以采用MIME多字节编码传输页面,类似于电子邮件封装。整个文档的所有资源分装到一个但服务器响应中。

5           Web服务器优化:

A       gzipdeflate压缩(压缩文本内容htmlcssjsxmljson等;图像、音频、视频等多媒体不需要压缩,因为这些文件格式中本身就存在压缩机制了)

B       HTTP响应头中的缓存指令

 

【部署移动web站点】

如果使用相同的域的话,如何将访问自动路由到移动web站点或桌面站点:

1           程序判断(直接判断user-agent,完善的方案是结合设备数据库)

2           使用移动切换产品The Switherhttp://www.passani.it/switcher/)或Apache Mobile Filter扩展

3           自己配置服务器路由规则。

 

【移动web站点SEO

1           必须允许爬网程序(蜘蛛)访问移动web站点。

A       设备数据库一般都有识别主要搜索引擎的方法。

B       如果是自己定义的路由规则,或通过程序进行路由,则务必要考虑到爬网程序的访问。很多自定义的路由规则和程序路由往往将爬网程序排除在外。

 

2           robots.txt中定义站点地图XML文件,且包含<mobile:mobile/>标签。

3           桌面web seo方法。

 

【移动web中的代码转换器】

代码转换器来源:

1           移动运营商

2           搜索引擎

3           部分移动浏览器提供的服务(如UC浏览器)。

 

解决方法:防御性编程。

1           将标记声明为移动友好。使用标准的文档声明(文档头信息,MIME类型等)

2           使用自引用链接关系,声明已经对移动设备进行了优化,如在test.mobi/1.php中增加

<link rel=”alternate” media=”handheld” href=”http://test.mobi/1.php” />

3           增加友好的移动优化META信息。如:

<meta name=”HandheldFriendly” value=”true”>

<meta name=”MobileOptimized” value=”320”>

4           使用响应头:

Cache-Control: no-transform (禁止转化)

Vary: User-Agent (代理或者转化服务器要重用缓存文档,必须根据User-Agent来进行,即缓存只针对提供相同User-Agent的设备进行响应)

5           使用较小的文档。如果有可能控制页面文档在15kb以下。

6           通过程序识别代码转换器:

A       使用设备数据库API提供的方法来识别。

B       自定义程序识别。含”X-Device””Via””X-Mobile-Gateway”的请求头等。

一般上面两种同时使用。因为设备数据库提供的方法很可能无法正确识别。

在识别了来自代码转换器的请求之后,可以采取相应的对策(如上面的方法4,发送特定的响应头信息)

 

posted @ 2011-04-22 10:53 rethink 阅读(384) 评论(0) 编辑

1 一次性读取整个csv文件为大数组,再进行处理,逻辑上虽然直观,但内存占用很大,效率低。应该读取一行,处理一行。

2 如果有多级循环,内层循环数组的时候,如果确定某个值已经不再使用了,可以直接unset掉该值,这样可以减少内层循环的次数,提高效率。


posted @ 2011-04-08 14:09 rethink 阅读(75) 评论(0) 编辑
摘要: pptx,docx,xlsx 格式的文件,在某些ie浏览器(如IE7)中下载这些文件时会出现问题:下载pptx和xlsx文件时,会变成zip文件;docx则无法下载。解决办法:在apache的mime.types文件中添加 application/vnd.ms-powerpoint pptx application/vnd.openxmlformats xlsx 可以使pptx,xlsx可以正常下载。docx的下载目前没有找到好的简单办法。(可以考虑通过程序输出)。建议: 提供下载的资料文件格式最好是ppt,doc,xls等,不要使用pptx,docx,xlsx 。阅读全文
posted @ 2011-02-23 14:44 rethink 阅读(148) 评论(0) 编辑
摘要: 1  命令PHPUnit 3.4.15 by Sebastian Bergmann.Usage: phpunit [switches] UnitTest [UnitTest.php] phpunit [switches] <directory>--log-junit <file> Log test execution in JUnit XML format to file.--log-tap <file> Log test execution in TAP format to file.--log-json <file> Log test execution in JSON format.--阅读全文
posted @ 2010-12-28 10:09 rethink 阅读(154) 评论(0) 编辑
摘要: LDAP是个Protocol,目前常用的实现有如下三种方案:1 NDS(Novell Directory Services)2 Microsoft Active Directory3 OpenLDAP要实现LDAP,第一步是设计DIT(即Directory Information Tree)。以下连接代码在Microsoft Active Directory(即AD)下验证通过。最简单的bind方...阅读全文
posted @ 2010-11-04 10:23 rethink 阅读(196) 评论(0) 编辑