这是Javascript中的三个对URL进行编码的方法,区别如下: escape() 采用ISO Latin字符集对指定的字符串进行编码。所有的空格符、标点符号、特殊字符以及其他非ASCII字符都将被转化成%xx格式的字符编码(xx等于该字符在字符集表里面的编码的16进制数字)。比如,空格符对应的编码是%20。unescape方法与此相反。不会被此方法编码的字符: @ * / + encodeURL 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。不会被此方法编码的字符:! @ # $& * ( ) = : / ; ? + '. 比如Wiktionary:Word of the day/October 21 会被编码成:Wiktionary:Word%20of%20the%20day/October%2021.这也是网络上基于Web的service接口(不一定是SOAP Web Service接口)所要求的调用接口,比如: http://en.wiktionary.org/w/api.php?action=query&prop=revisions&titles=Wiktionary:Word%20of%20the%20day/October%2021&rvprop=content&format=xml encodeURLComponent 把URI字符串采用UTF-8编码格式转化成escape格式的字符串。与encodeURI()相比,这个方法将对更多的字符进行编码,比如 / 等字符。所以如果字符串里面包含了URI的几个部分的话,不能用这个方法来进行编码,否则 / 字符被编码之后URL将显示错误。不会被此方法编码的字符:! * ( )
转自:http://hi.baidu.com/xu_yunan/blog/item/7ce5d93bb279d22c96ddd843.html 各种正则表达式实例 用户名 ^[a-z0-9_-]{3,15}$ ^ # 行开始 [a-z0-9_-] # 匹配列表中的字符,a-z,0–9,下划线,连字符 {3,15} # 长度至少3个字符,最大长度为15 $ # 行结束 密码 ((?=.*\d)(?=.*[a-z])(?=.*[A-Z])(?=.*[@#$%]).{6,20}) ( # 组开始 (?=.*\d) # 必须包含一个数字 0-9 (?=.*[a-z]) # 必须包含一个小写字符 (?=.*[A-Z]) # 必须包含一个大写字符 (?=.*[@#$%]) # 必须包含一个列表中的特殊字符"@#$%" . # 检查所有字符串与前面的条件的匹配 {6,20} # 长度至少为6个字符,最大长度为20 ) # 组结束 16进制颜色 ^#([A-Fa-f0-9]{6}|[A-Fa-f0-9]{3})$ ^ # 行开始 # # 必须包含一个"#"符号 ( # 组#1开始 [A-Fa-f0-9]{6} # 列表中的任意字符串,长度为6 | # 或者 [A-Fa-f0-9]{3} # 列表中的任意字符串,长度为3 ) # 组#1结束 $ # 行结束 Email ^[_A-Za-z0-9-]+(\\.[_A-Za-z0-9-]+)*@[A-Za-z0-9]+(\\.[A-Za-z0-9]+)*(\\.[A-Za-z]{2,})$ ^ # 行开始 [_A-Za-z0-9-]+ # 必须以中括号中的字符为起始字符[],必须包含一个或多个(+) ( # 组#1开始 \\.[_A-Za-z0-9-]+ # 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+) )* # 组#1结束, 这个组是可选的(*) @ # 必须包含一个"@"符号 [A-Za-z0-9]+ # 接下来是中括号内的字符[],必须包含一个或者多个(+) ( # 组 #2开始 – 一级TLD检查 \\.[A-Za-z0-9]+ # 接下来是一个点"."和中括号内的字符[],必须包含一个或者多个(+) )* # 组#2结束,这个组是可选的(*) ( # 组#3开始 – 二级TLD检查 \\.[A-Za-z]{2,} # 接下来是一个点"."和中括号内的字符[], 最小长度为2 ) # 组#3结束 $ # 行结束 图像文件 ([^\s]+(\.(?i)(jpg|png|gif|bmp))$) ( # 组#1开始 [^\s]+ # 必须包含一个或更多的任意字符(除了空格) ( # 组#2开始 \. # 接下来是一个点"." (?i) # 忽略后边字符的大小写检查 ( # 组#3开始 jpg # 包含字符"jpg" | # ..或者 png # 包含字符"png" | # .. 或者 gif # 包含字符"gif" | # .. 或者 bmp # 包含字符"bmp" ) # 组#3结束 ) # 组#2结束 $ # 字符串的结束 ) # 组#1结束 补充一个:[\\s\\S]*?([^\\/]*?\\.jpg) IP地址 ^([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])\\.([01]?\\d\\d?|2[0-4]\\d|25[0-5])$ ^ # 行开始 ( # 组#1开始 [01]?\\d\\d? # 可以是1到2个数字. 如果出现3个数字, 必须以0或者1开始 # 例如 ([0-9], [0-9][0-9],[0-1][0-9][0-9]) | # ...或者 2[0-4]\\d # 以2开始, 紧跟着是0-4,并且以任意数字结尾(2[0-4][0-9]) | # ...或者 25[0-5] # 以2开始, 紧跟着是5,并且以0-5结尾 (25[0-5]) ) # 组#1结束 \. # 接下来是点"." .... # 重复3次 (3x) $ # 行结束 12-小时制时间 (1[012]|[1-9]):[0-5][0-9](\\s)?(?i)(am|pm) ( # 组#1开始 1[012] # 以10, 11, 12开始 | # 或者 [1-9] # 以1,2,...9开始 ) # 组#1结束 : # 接下来是一个冒号 (:) [0-5][0-9] # 接下来是0..5和0..9,意思是00到59 (\\s)? # 接下来是一个空格(可选) (?i) # 下面的检查不区分大小写 (am|pm) # 接下来是AM或者PM 24小时制时间正则表达式模式 ([01]?[0-9]|2[0-3]):[0-5][0-9] ( # 组#1开始 [01]?[0-9] # 以0-9,1-9,00-09,10-19开始 | # 或者 2[0-3] # 以20-23开始 ) # 组#1结束 : # 接下来是一个冒号(:) [0-5][0-9] # 接下来是0..5和0..9,意思是00到59 日期格式 (dd/mm/yyyy) 正则表达式模式 (0?[1-9]|[12][0-9]|3[01])/(0?[1-9]|1[012])/((19|20)\\d\\d) ( # 组#1开始 0?[1-9] # 01-09或者1-9 | # ..或者 [12][0-9] # 10-19或者20-29 | # ..或者 3[01] # 30, 31 ) # 组#1结束 / # 接下来是一个"/" ( # 组#2开始 0?[1-9] # 01-09或者1-9 | # ..或者 1[012] # 10,11,12 ) # 组#2结束 / # 接下来是一个"/" ( # 组#3开始 (19|20)\\d\\d # 19[0-9][0-9]或者20[0-9][0-9] ) # 组#3结束 HTML标签 <("[^"]*"|'[^']*'|[^'">])*> < # 以"<"标签开始 ( # 组#1开始 "[^"]*" # 只允许两个双引号成对出现-"string" | # ..或者 '[^']*' # 只允许两个单引号成对出现- 'string' | # ..或者 [^'">] # 不能出现单独的双引号、单引号和">" ) # 组#1结束 * # 0次或多次 > # 以结束标签">"结束 HTML中的A标签正则表达式模式 (?i)<a([^>]+)>(.+?) ( # 组#1开始 ?i # 所有的检查区分大小写 ) # 组#1结束 <a # 以"<a"开始 ( # 组#2开始 [^>]+ # 除了(">")之外的任意字符,至少一个字符 ) # 组#2结束 > # 接下来是">" (.+?) # 匹配所有 </a> # 以"</a>结束 提取HTML链接正则表达式模式 \s*(?i)href\s*=\s*(\"([^"]*\")|'[^']*'|([^'">\s]+)); \s* # 可以以空格开始 (?i) # 所有的检查是区分大小写的 href # 接下来是一个"href"字 \s*=\s* # 等号两边都允许空格, ( # 组#1开始 "([^"]*") # 只允许2个双引号成对出现 - "string" | # ..或者 '[^']*' # 只允许2个单引号成对出现 - 'string' | # ..或者 ([^'">]+) # 或者不允许出现单独的单引号、双引号和">" ) # 组#1结束
JVM参数调整无非是调整堆中各种内存的大小,选择最优的GC算法(行为)。一般有两个指标来考量: Pause时间 Throughput GC类型有: Serial GC The serial collector uses a single thread to perform all garbage collection work, which makes it relatively efficient since there is no communication overhead between threads. It is best-suited to single processor machines, since it cannot take advantage of multiprocessor hardware, although it can be useful on multiprocessors for applications with small data sets (up to approximately 100MB). The serial collector is selected by default on certain hardware and operating system configurations, or can be explicitly enabled with the option -XX:+UseSerialGC The Throughput Collector -XX:+UseParallelGC主要是针对young generation的,Tenured Generation还是Serial Collector The parallel collector (also known as the throughput collector) performs minor collections in parallel, which can significantly reduce garbage collection overhead. It is intended for applications with medium- to large-sized data sets that are run on multiprocessor or multi-threaded hardware. The parallel collector is selected by default on certain hardware and operating system configurations, or can be explicitly enabled with the option -XX:+UseParallelGC. New: parallel compaction is a feature introduced in J2SE 5.0 update 6 and enhanced in Java SE 6 that allows the parallel collector to perform major collections in parallel. Without parallel compaction, major collections are performed using a single thread, which can significantly limit scalability. Parallel compaction is enabled by adding the option -XX:+UseParallelOldGC to the command line The Concurrent Low Pause Collector -Xincgc or -XX:+UseConcMarkSweepGC 主要是正对Tenure Generation的 The concurrent collector performs most of its work concurrently (i.e., while the application is still running) to keep garbage collection pauses short. It is designed for applications with medium- to large-sized data sets for which response time is more important than overall throughput, since the techniques used to minimize pauses can reduce application performance. The concurrent collector is enabled with the option -XX:+UseConcMarkSweepGC. The Incremental Low Pause Collector -XX:+UseTrainGC 下面介绍一下各种参数的意义 -Xms -Xmx Heap 内存设置 堆内存不是一下子就分配-Xmx大小的,随着GC的进行,从-Xms慢慢递增的 基本来说Heap内存分配太大的话,GC的次数会减少,但是做一次GC的Pause时间会很大。反之亦然。 + -Xincgc Incremental GC,也即GC的Train算法, 增量GC一次只收集部分Heap对象,而不是针对整个堆。如果GC Pause 时间太长的话可以考虑用这个选项调试一下 -Xss 栈大小设置,从Java6开始,32-bit JVM默认是320k,64-bit JVM默认是1024k。(题外话,64-bit JVM并不会所有类型double一下,只是可分配的Heap内存和线程数会更多) 注意栈大小设置太小的话,递归多的话会出现栈溢出;栈太大的话,如果Application中线程比较多(每个线程有自己的栈),可分配的栈变少,就会出现 running out of memeory问题。 Server 和 Client端GC策略不同,考虑到可用的Heap Size,CPU数量等。
按代的垃圾收集机制, 主要分为三种: 复制算法,空间被分为等大的两块,从根开始访问每一个关联的活跃对象,将空间 A 的活跃对象全部复制到空间 B,然后一次性回收整个空间 A,优点:只访问活跃对象,将所有活动对象复制走之后就清空整个空间,不用去访问死对象,所以遍历空间的成本较小,缺点:需要巨大的复制成本和较多的内存; 标记清除算法,从根开始访问所有活跃对象,标记为活跃对象。然后再遍历一次整个内存区域,把所有没有标记活跃的对象进行回收处理,优点:不需要额外的空间,缺点:较长的 GC 暂停时间,较大的扫描时间开销,产生较多的空间碎片; 标记清除整理算法,综合上两种算法的优点,先标记活跃对象,然后将其合并成较大的内存块。 代的划分: 年轻代:新创建的对象分配在此,研究表明,大部分程序所产生的对象都在此消亡,几乎所有的收集器为年轻代使用复制算法,年轻代又被划分为 1个伊甸园区(Eden)和 2个存活区(Survivor)用来实施复制算法; 也称Minor Collection,基于大多数对象Die Young的原则 年老代(Tenured):从年轻代存活下来的对象被复制到年老代,主要实施标记清除或标记清除整理算法;也称Major Collection, Full GC. 该过程会比较慢因为会遍历所有的Live 对象。 持久代(Permanent):装载的类数据和方法存储于此,无可消亡对象。 基于JVM层的性能调优思路大概是: 对程序进行profiling, 主要考虑方法调用过程,花费的时间等 dump出heap或者实时监控分析 对象大小,引用关系 启动Java程序时打开 -verbose:gc, 分析GC执行情况,执行前后Heap中对象在图上显示有什么pattern(如果有图形显示的工具的话) 根据分析结果检查线程,死锁,内存泄漏的蛛丝马迹。最后可以考虑对JVM启动参数进行调整,这个会改变GC的算法及内存(heap)分配情况 单处理器时基本是基于Generation的Copy算法或者Mark-Sweep-Compact算法;多处理器时考虑并行GC因此可以指定更多的GC策略,一个处理器做GC,另一个继续运行Applicaiton。这样不用象单处理器一样GC时Applicaiton Pause住。
关系数据库 基于严格的关系数据库理论,但面对现有电子商务,SNS网站业务的挑战,Scalability和Performance不能很好地解决 Key-Value数据库 No SQL数据库如google的Big Table. 解决了关系数据库的不足,但基于Key取值,并不能如同SQL一般进行查询。因为数据都是非结构化,离散的。 面向文档的数据库 如:MongoDB,支持查询 图形数据库 据说已有厂家产品支持节点和边的图形数据库
通过下面的调用链 PUMA接口 Portal,portlets PUMA (Portal User Management Architecture) WMM (Websphere Member Manager) 最终WMM.xml中会配置LDAP连接的信息,从而关联portal server和LDAP server
加入WS-Security Policy? 在Web Service 前加入网关安全过滤? 在soap header 中加入user id/caller id, org id/name 的信息。当然别人也可以仿造
SOP(Same Orgin Policy)限制 这个主要通过 JSONP(padding)解决,当然server proxy, iframe也是可选的方案 file upload IFrame是一种方案,其他可选的有Applet, Flash 插件方案。 Backward/Forward/收藏夹 不是很清楚解决方案,记得曾看到过有通过同一个页面加锚点的方案,不是很理解。