软件是对质量的不懈追求

#

状态模式与策略模式的重要区别

是否需要在State类或Strategy类中访问Context.
状态模式通常需要调用Context中的方法,以改变Context的状态。
Strategy通常不需要。

posted @ 2010-02-23 17:50 BlakeSu 阅读(311) | 评论 (0)编辑 收藏

linux正则表达式


记号 含义 举例 匹配
. 任何字符 a.. a后两个字符
^ 行首 ^wood 位于行首的wood
$ 行尾 x$
^INSERT$
^$
位于行尾的x
只包含字符串INSERT的行
不包含任何字符的行
* 前导的正则表达式重复0或若干次 x*
xx*
.*
w.*s
0或若干次连续的x
1或多个连续的x
0或若干个字符
以w开始,s结尾的任何字符串
[字符表] 字符表中的任一 [tT]
[a-z]
[a-zA-Z]
小写或大写的t
小写字母
字母(大写或小写)
[^字符表] 任一不在字符表中的字符 [^0-9]
[^a-zA-Z]
任何数字
非字母
\{min,max\} 前导的正则表达式重复至少min次,最多max次 X\{1,5\}
[0-9]\{3,9\}
[0-9]\{3\}
[0-9]\{3,\}
最少1个,最多5个x
3到9个数字
正好3个数字
至少3个数字
\(…\) 将小括号中匹配的字符串存储到下一个寄存器中(1-9) ^\(.\)
^\(.\)\1
行中第1个字符存到1号寄存器
行首两个字符,且它们相同

如下命令含有正则表达式: cut paste sed tr grep sort uniq

posted @ 2010-02-11 15:01 BlakeSu 阅读(272) | 评论 (0)编辑 收藏

开源框架(spring struts2 tomcat)源码下载地址

spring

svn checkout https://src.springframework.org/svn/spring-framework/trunk spring-framework

  ant resolve

struts2

svn checkout http://svn.apache.org/repos/asf/struts/struts2/trunk struts2
svn checkout http://svn.apache.org/repos/asf/struts/xwork/trunk/ xwork

 mvn install
 mvn eclipse:eclipse

tomcat6

svn checkout http://svn.apache.org/repos/asf/tomcat/tc6.0.x/trunk tc6.0.x
 1.下载ant 1.6.x
 2. 命令行下执行 ant download,下载依赖jar.

posted @ 2010-02-07 10:41 BlakeSu 阅读(459) | 评论 (0)编辑 收藏

spring 计时器类 StopWatch

 StopWatch

posted @ 2010-02-05 16:08 BlakeSu 阅读(535) | 评论 (0)编辑 收藏

[李琨]REST的主要优势到底是什么?

在JavaEye论坛上回答网友joyjiang的疑问:“REST的优势到底是什么?开发效率?文档的管理?url的直观?还是其它的什么优势呢?”

REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。

对于基于网络的应用来说,你怎么样看待服务器,就会产生什么样的架构风格,随之产生与该架构风格相关的交互模式。

RPC架构风格将服务器看作是由一些过程组成,客户端调用这些过程来执行特定的任务。SOAP就是RPC风格的一种架构。过程是动词性的(做某件事),因此RPC建模是以动词为中心的。

分布式对象架构风格认 为服务器是由一些对象和对象上的方法组成,客户端通过调用这些对象上的方法来执行特定的任务。并且客户端调用这些对象上的方法应该就像是调用本地对象上的 方法一样,这样开发就可以完全按照统一的面向对象方法来做。但是很可惜,这样的抽象并不是很有效,因为分布式对象与本地对象存在着巨大的本质差别,想要掩 盖这些差别很多时候甚至是有害无益的。

REST架构风格并 没有试图掩盖这些差别,而是将服务器抽象为一组离散资源的集合。资源是一个抽象的概念,而不是代表某个具体的东西。注意:要真正理解REST,就一定要增 强自己的抽象思维能力,充分理解到资源是抽象的。如果完全不具有抽象思维的能力,一定要将资源与数据库中的一张表或服务器端的一个文件(HTML、 Servlet、JSP、etc.)一一挂起钩来,就无法真正理解REST了。资源是名词性的,因此REST建模是以名词为中心的。

上述 是目前基于网络的应用的主要的三种抽象方式。这三种不同的抽象方式会严重影响客户端与服务器的交互模式,而不同交互模式的交互效率差别相当大。分布式对象 的交互模式很多时候效率很低,因为掩盖了分布式对象与本地对象的差别,很多时候都会导致细粒度的API(需要一再强调才能让一些不明就里的架构初哥按照正 确的方式来做设计)。实践已经证明,与RPC和分布式对象相比,REST是一种对于服务器更加有效的抽象方式,将会带来粒度更大和更有效率的交互模式。这 样的效果与Fielding设计REST的初衷是吻合的,REST就是专门为交互的性能和可伸缩性进行过优化的一种架构风格。而SOAP在设计的时候优先 考虑的从来不是性能和可伸缩性,而是互操作性。除非出现奇迹,否则你种什么,就应该长出来什么。你种的是瓜,长出来的就是瓜;你种的是豆,长出来的就是 豆。

Fielding写到:“REST提供了一组架构约束,当作为一个整体来应用时,强调组件交互的可伸缩性、接口的通用性、组件的独立部署、以及用来减少交互延迟、增强安全性、封装遗留系统的中间组件。

有 人认为REST不是面向对象的,其实REST虽然没有分布式对象那么面向对象,在我看来至少比RPC更加面向对象。按照《企业应用架构模式》,以动词为中 心建模是什么?是不是就是事务脚本?以名词为中心建模是什么?是不是就是领域模型?这就扯远了,网络通信是否一定需要实现为面向对象的形式,我认为是不需 要的。

“REST的主要优势在我看来其实在于它是一种对于服务器的更加有效的抽象方式。”
这句话等于是,我先把一个骨架放在这里,还没有用血肉来充实它,也就是还没有举出具体的实例来。具体的实例以后我们还需要来详细讨论。REST是非常简练的,同时又是一种非常强大的抽象方式,在我看来就是从根本上简化Web开发的一味良药。

posted @ 2010-02-05 10:57 BlakeSu 阅读(231) | 评论 (0)编辑 收藏

取用户所有表的所有索引

select index_name from dba_indexes where table_name
in (select table_name from user_tables)

posted @ 2010-01-29 10:08 BlakeSu 阅读(130) | 评论 (0)编辑 收藏

oracle优化新知识

1.位图索引用于数据仓库,不能用于普通系统
2.使用组合索引. 当大量字段同同时作为过滤条件时,使用组合索引会大大提高性能。
建立组合索引时,注意小基数字段在前,大基数字段在后。
3.同一字段出现在不同表要保持类型一致(确有需要,可使用函数索引)
4.使用count(*)
5.使用返回单个结果的查询改写外连接能取得较好的性能

posted @ 2010-01-22 13:22 BlakeSu 阅读(189) | 评论 (0)编辑 收藏

Oracle中表连接的运行原理

Oracle优化器会自动选择以下三种方式的一种运行表连接,但在数据环境上配合强化选择合适的方式或强制使用某种方式是SQL优化的需要:
 
   NESTED LOOP

对于被连接的数据子集较小的情况,nested loop连接是个较好的选择。nested loop就是扫描一个表,每读到一条记录,就根据索引去另一个表里面查找,没有索引一般就不会是 nested loops。

一般在nested loop中, 驱动表满足条件结果集不大,被驱动表的连接字段要有索引,这样就走nested loop。如果驱动表返回记录太多,就不适合nested loops了。如果连接字段没有索引,则适合走hash join,因为不需要索引。

可用ordered提示来改变优化器默认的驱动表,可用USE_NL(table_name1 table_name2)提示来强制使用nested loop。

HASH JOIN

hash join是优化器做大数据集连接时的常用方式。优化器扫描小表(或数据源),利用连接键(也就是根据连接字段计算hash 值)在内存中建立hash表,然后扫描大表,每读到一条记录就来探测hash表一次,找出与hash表匹配的行。

当 小表可以全部放入内存中,其成本接近全表扫描两个表的成本之和。如果表很大不能完全放入内存,这时优化器会将它分割成若干不同的分区,不能放入内存的部分 就把该分区写入磁盘的临时段,此时要有较大的临时段从而尽量提高I/O 的性能。临时段中的分区都需要换进内存做hash join。这时候成本接近于全表扫描小表+分区数*全表扫描大表的代价和。

至于两个表都进行分区,其好处是可以使用parallel query,就是多个进程同时对不同的分区进行join,然后再合并。但是复杂。

使用hash join时,HASH_AREA_SIZE初始化参数必须足够的大,如果是9i,Oracle建议使用SQL工作区自动管理,设置WORKAREA_SIZE_POLICY 为AUTO,然后调整PGA_AGGREGATE_TARGET即可

以下条件下hash join可能有优势:

两个巨大的表之间的连接。

在一个巨大的表和一个小表之间的连接。

可用ordered提示来改变优化默认的驱动表,可用USE_HASH(table_name1 table_name2)提示来强制使用hash join。

SORT MERGE JOIN

sort merge join的操作通常分三步:对连接的每个表做table access full;对table access full的结果进行排序;进行merge join对排序结果进行合并。sort merge join性能开销几乎都在前两步。一般是在没有索引的情况下,9i开始已经很少出现了,因为其排序成本高,大多为hash join替代了

通常情况下hash join的效果都比sort merge join要好,然而如果行源已经被排过序,在执行sort merge join时不需要再排序了,这时sort merge join的性能会优于hash join。

在全表扫描比索引范围扫描再通过rowid进行表访问更可取的情况下,sort merge join会比nested loops性能更佳。

可用USE_MERGE(table_name1 table_name2)提示强制使用sort merge join。

posted @ 2010-01-15 12:05 BlakeSu 阅读(372) | 评论 (0)编辑 收藏

java 运行windows命令 并获取输出

import java.io.BufferedReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;

public class ProcessTest {

    
public static void main(String[] args) {
        
         ProcessBuilder pb 
= new  ProcessBuilder ( "tasklist");  
         try {
            Process process 
= pb.start();
            InputStream fis 
= process.getInputStream();
            BufferedReader br 
= new BufferedReader(new InputStreamReader(fis));

            String line 
= null;
            StringBuffer cmdout 
= new StringBuffer();
            
while ((line = br.readLine()) != null) {
                cmdout.append(line).append(
"\n");
            }
            System.out.println(cmdout.toString().trim());
        } 
catch (IOException e) {
            e.printStackTrace();
        }
    }
}

输出如下:

图像名                       PID 会话名           会话#       内存使用
========================= ====== ================ ======== ============
System Idle Process            0 Console                 0         28 K
System                         4 Console                 0        324 K
smss.exe                    1076 Console                 0        812 K
csrss.exe                   1152 Console                 0      3,296 K
winlogon.exe                1176 Console                 0     31,580 K
services.exe                1220 Console                 0      4,684 K
lsass.exe                   1232 Console                 0      1,672 K
svchost.exe                 1408 Console                 0      6,236 K
svchost.exe                 1496 Console                 0      5,036 K
svchost.exe                 1656 Console                 0     38,656 K
spoolsv.exe                 1872 Console                 0      8,000 K
explorer.exe                 332 Console                 0     18,888 K
avp.exe                      376 Console                 0     24,960 K
db2dasrrm.exe                460 Console                 0     34,652 K
TSVNCache.exe                672 Console                 0     12,476 K
igfxtray.exe                1380 Console                 0      7,344 K
hkcmd.exe                   1236 Console                 0      4,056 K
igfxpers.exe                1428 Console                 0      3,468 K
db2mgmtsvc.exe              1444 Console                 0     10,072 K
RTHDCPL.exe                 1460 Console                 0     32,480 K
igfxsrvc.exe                1572 Console                 0      3,772 K
avp.exe                     1680 Console                 0      6,008 K
db2systray.exe              1700 Console                 0     32,512 K
ctfmon.exe                  1780 Console                 0      4,892 K
picpick.exe                 1984 Console                 0      3,600 K
QQ.exe                      2024 Console                 0     34,648 K
dsNcService.exe              264 Console                 0      3,880 K
365日历.EXE                 1952 Console                 0     43,788 K
CLCL.exe                    1028 Console                 0      8,252 K
klnagent.exe                1052 Console                 0      3,196 K
thunderbird.exe              352 Console                 0     38,692 K
rtxc.exe                     472 Console                 0     29,968 K
db2rcmd.exe                 1836 Console                 0     11,832 K
TXPlatform.exe              2488 Console                 0      3,808 K
firefox.exe                 2724 Console                 0    195,912 K
cmd.exe                     2716 Console                 0         52 K
sh.exe                      3936 Console                 0        152 K
conime.exe                  2752 Console                 0      3,424 K
eclipse.exe                 3060 Console                 0      2,592 K
JAVAW.EXE                   2984 Console                 0    446,692 K
EXCEL.EXE                   3232 Console                 0      1,936 K
wmiprvse.exe                4084 Console                 0      6,368 K
JAVAW.EXE                    320 Console                 0      6,860 K
tasklist.exe                2936 Console                 0      4,812 K

当运行其他命令 ,如dir等时,用如下写法:

 
ProcessBuilder pb = new  ProcessBuilder ( "cmd""/c""dir");


posted @ 2010-01-13 13:49 BlakeSu 阅读(586) | 评论 (0)编辑 收藏

Ubuntu9.10正确有效关闭IPV6的方法

Ubuntu下上网解析DNS慢有很大程度上是和IPV6有关,而目前国内大部分地方都还没有IPV6网络,所以一般用户应该需要关闭IPV6

网上流传着很多IPV6的关闭方法,但是经过测试大部分都是针对老版本的,而且效果不好。

这里提供一种方法作为参考

/proc/sys/net/ipv6/conf/lo/disable_ipv6

这个档案,用cat指令可以看到 0 这个数字,将他设定为1就可以了。
因为已经将ipv6编入kernel,因此在proc里面就可以看得到相关的设定。

设定的方式有很多种,有的是用echo 1 >> [路径]/档桉名称
的方式,这种方式是每次开机以后就得要打一次。
所以延伸出第二个方法,在rcS.d里面设定一个连结,去执行这个指令的script。
第3个方法,就是设定sysctl.conf档桉,也是最正统的做法。
位置在
/etc/sysctl.conf
这个档桉可以设定很多,包括要当成NAT时的封包转发等等。
要设定
/proc/sys/net/ipv6/conf/lo/disable_ipv6
这个档桉,就是在sysctl.conf里面加上

net.ipv6.conf.lo.disable_ipv6 = 1

posted @ 2010-01-09 14:53 BlakeSu 阅读(559) | 评论 (0)编辑 收藏

仅列出标题
共12页: 上一页 1 2 3 4 5 6 7 8 9 下一页 Last