??xml version="1.0" encoding="utf-8" standalone="yes"?>亚洲一区二区三区乱码在线欧洲,精品丝袜国产自在线拍亚洲,亚洲视频在线观看http://www.tkk7.com/yes1983/archive/2010/12/15/Eclipse.html牛虾牛虾Wed, 15 Dec 2010 04:15:00 GMThttp://www.tkk7.com/yes1983/archive/2010/12/15/Eclipse.htmlhttp://www.tkk7.com/yes1983/comments/340768.htmlhttp://www.tkk7.com/yes1983/archive/2010/12/15/Eclipse.html#Feedback8http://www.tkk7.com/yes1983/comments/commentRss/340768.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/340768.html 1.先找到相关的插g
      打开Plug-ins View扑ֈ插gorg.eclipse.jface.text,右键点击,选择import as Source Project,导入完成?在你的workspace可以看到这个project?br /> 2.修改代码
     ?font style="background-color: #cce8cf">src/org/eclipse/jface/text/contentassist/CompletionProposalPopup.java文g?扑ֈq样一行代?br />          char triggers = t.getTriggerCharacter();
         if(contains(triggers,key))
    在那行if判断里面,eclipse会判断key(是你按下的?是否在triggers?如果?那就触发下面的第一行提CZ屏的代码.所以我们要做的是把空格和=h除就可以?
        if(key!='='&&key!=0x20&&contains(triggers,key))

3.把修改好的org.eclipse.jface.text导出
    右键点击你的workspace里的org.eclipse.jface.text,选择export-->Deployable plugins and fragments, next,destination 选择archive file,然后finish.你就可以在zip文g里看到生成好的jar ,用它替换掉eclipse/plugins里面的同名jar?可以了

牛虾 2010-12-15 12:15 发表评论
]]>
Visio的WebE序模板http://www.tkk7.com/yes1983/archive/2010/07/28/327355.html牛虾牛虾Wed, 28 Jul 2010 10:27:00 GMThttp://www.tkk7.com/yes1983/archive/2010/07/28/327355.htmlhttp://www.tkk7.com/yes1983/comments/327355.htmlhttp://www.tkk7.com/yes1983/archive/2010/07/28/327355.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/327355.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/327355.html
/Files/yes1983/GUUUI_Web_Prototyping_Tool_3.zip

牛虾 2010-07-28 18:27 发表评论
]]>
Eclipse RCP中多U程Job使用[转帖]http://www.tkk7.com/yes1983/archive/2010/07/01/325014.html牛虾牛虾Thu, 01 Jul 2010 13:28:00 GMThttp://www.tkk7.com/yes1983/archive/2010/07/01/325014.htmlhttp://www.tkk7.com/yes1983/comments/325014.htmlhttp://www.tkk7.com/yes1983/archive/2010/07/01/325014.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/325014.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/325014.html  阅读全文

牛虾 2010-07-01 21:28 发表评论
]]>
Common table expression,Nested Table expression, Temporary table(转蝲)http://www.tkk7.com/yes1983/archive/2010/04/14/318271.html牛虾牛虾Wed, 14 Apr 2010 08:53:00 GMThttp://www.tkk7.com/yes1983/archive/2010/04/14/318271.htmlhttp://www.tkk7.com/yes1983/comments/318271.htmlhttp://www.tkk7.com/yes1983/archive/2010/04/14/318271.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/318271.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/318271.html转蝲?font style="background-color: #cce8cf">http://blog.csdn.net/shangboerds/archive/2010/01/27/5260783.aspx
CTE:
说vWITH 语句Q除了那些第一ơ听说WITH语句的hQ大部分人都觉得它是用来做递归查询的。其实那只是它的一个用途而已Q它的本名正如我们标题写的那P叫做Q公p表达式(Common Table ExpressionQ,从字面理解,大家觉得它是用来q嘛的呢Q其实,它是用来定义临时集合的。啊QVALUES语句不是用来定义临时集合的吗Q怎么WITH语句也用来定义旉合呢Q它们有什么区别呢Q?/font>

VALUES语句是用明确的值来定义临时集合的,如下Q?/font>

VALUES (1,2), (1,3),(2,1)  
 

WITH语句是用查询(也就是select语句)来定义旉合的Q从q个角度Ԍ有点像视图,不过不是视图Q大家千万别误解。如下:

CREATE TABLE USER (
 
NAME VARCHAR(20) NOT NULL,---姓名
 
SEX INTEGER,---性别Q?、男   2、女Q?br />  
BIRTHDAY DATE---生日
 
);  
 

WITH TEST(NAME_TEST, BDAY_TEST) AS  
(  
SELECT NAME,BIRTHDAY FROM USER--语句1  
)  
SELECT NAME_TEST FROM TEST WHERE BDAY_TEST='1949-10-1';--语句2  
 

下面我们来解释一下,首先语句1执行Q它会生一个有两列QNAME,BIRTHDAYQ的l果集;接着Q我们将q个l果集命名ؓtestQƈ且将列名重命名ؓNAME_TEST, BDAY_TESTQ最后我们执行语?Q从q个临时集合中找到生日是1949-10-1Q也是共和国的同龄人?/font>

怎么P如果你感觉不好理解,请仔l的分析一下上面的语句。下面我们D个VALUES语句和WITH语句l合使用的例子,如下Q?/font>

WITH TEST(NAME_TEST, BDAY_TEST) AS
 
(
 
VALUES ('张三','1997-7-1'),('李四','1949-10-1')
 
)
 
SELECT NAME_TEST FROM TEST WHERE BDAY_TEST='1949-10-1'  
 

从上面的介绍和WITH语句不ؓ大多Ch所熟悉可以猜测QWITH语句是ؓ复杂的查询ؓ设计的,的确是这LQ下面我们D个复杂的例子Q想提高技术的朋友可千万不能错q。考虑下面的情况:

CREATE TABLE USER  
(  
NAME VARCHAR(20) NOT NULL,--姓名  
DEGREE INTEGER NOT NULL,--学历(1、专U?2、本U?3、硕?4、博?  
STARTWORKDATE date NOT NULL,--入职旉  
SALARY1 FLOAT NOT NULL,--基本工资  
SALARY2 FLOAT NOT NULL--奖金  
);  
 

假设现在让你查询一下那?1、学历是士或博?nbsp; 2、学历相同,入职q䆾也相同,但是工资Q基本工?奖金Q却比相同条件员工的q_工资低的员工。(哈哈Q可能是要涨工资Q,不知道你听明白问题没有?该怎么查询呢?我们是这h的:

1、查询学历是士或博士的那些员工得到l果?Q如下:

SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)Q?nbsp; 
 

2、根据学历和入职q䆾分组Q求q_工资 得到l果?Q如下:

SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY   
FROM USER WHERE DEGREE IN (3,4)  
GROUP BY DEGREE,YEAR(STARTWORKDATE)  
 

3、以学历和入职年份ؓ条g 联合两个l果集,查找工资<q_工资 的员工,以下是完整的SQLQ?/font>

WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS   
(  
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)  
),  
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS  
(  
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY   
FROM USER WHERE DEGREE IN (3,4)  
GROUP BY DEGREE,YEAR(STARTWORKDATE)  
)  
SELECT NAME FROM TEMP1, TEMP2 WHERE   
TEMP1.DEGREE=TEMP2.DEGREE   
AND TEMP1.WORDDATE=TEMP2.WORDDATE   
AND SALARY<AVG_SALARY;  
 

查询l果完全正确Q但我们q有改善的空_在查询结果集2的时候,我们是从user表中取得数据的。其实此时结果集1已经查询出来了,我们完全可以从结果集1中通过分组得到l果?Q而不用从uer表中得到l果?Q比较上面和下面的语句你可以知道我说的是什么意思了Q?/font>

WITH TEMP1(NAME,DEGREE,WORDDATE,SALARY) AS   
(  
SELECT NAME,DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, SALARY1+SALARY2 AS SALARY FROM USER WHERE DEGREE IN (3,4)  
),  
TEMP2 (DEGREE,WORDDATE,AVG_SALARY) AS  
(  
SELECT DEGREE,WORDDATE, AVG(SALARY) AS AVG_SALARY   
FROM TEMP1  
GROUP BY DEGREE,WORDDATE  
)  
SELECT NAME FROM TEMP1, TEMP2 WHERE   
TEMP1.DEGREE=TEMP2.DEGREE   
AND TEMP1.WORDDATE=TEMP2.WORDDATE   
AND SALARY<AVG_SALARY;  
 

可能有些朋友会说Q我不用WITH语句也可以查出来Q的是q样Q如下:

SELECT U.NAME FROM USER AS U,
 
(
 
SELECT DEGREE,YEAR(STARTWORKDATE) AS WORDDATE, AVG(SALARY1+SALARY2) AS AVG_SALARY
 
FROM USER WHERE DEGREE IN (3,4)
 
GROUP BY DEGREE,YEAR(STARTWORKDATE)
 
) AS G
 
WHERE U.DEGREE=G.DEGREE
 
AND YEAR(U.STARTWORKDATE)=G.WORDDATE
 
AND (SALARY1+SALARY2)<G.AVG_SALARY;  
 

那用WITH 和不使用 WITHQ这两种写法有什么区别呢Q一般情况下q两U写法在性能上不会有太大差异Q但是,

1、当USER表的记录很多

2、硕士或博士QDEGREE IN (3,4)Q在USER表中的比例很?/font>

当满以上条件时Q这两种写法在性能的差异将会显现出来,Z么呢Q因Z使用WITH写法的语句访问了2ơUSER表,如果DEGREE 字段又没有烦引,性能差异会非常明显?/font>

    当你看到q时Q如果很好的理解了上面的内容Q我怿你会对WITH语句有了一定的体会。然而WITH语句能做的还不止q些Q下面给大家介绍一下,如何用WITH语句做递归查询。递归查询的一个典型的例子是对树状l构的表q行查询Q考虑如下的情况:

论坛首页  
--数据库开?nbsp; 
----DB2  
------DB2 文章1  
--------DB2 文章1 的评?  
--------DB2 文章1 的评?  
------DB2 文章2  
----Oracle  
--Java技?nbsp; 
 

以上是一个论坛的典型例子Q下面我们新Z个表来存储以上信息?/font>

CREATE TABLE BBS  
(  
PARENTID INTEGER NOT NULL,  
ID INTEGER NOT NULL,  
NAME VARCHAR(200) NOT NULL---板块、文章、评论等?nbsp; 
);  
insert into bbs (PARENTID,ID,NAME) values   
(0,0,'论坛首页'),  
(0,1,'数据库开?),  
(1,11,'DB2'),  
(11,111,'DB2 文章1'),  
(111,1111,'DB2 文章1 的评?'),  
(111,1112,'DB2 文章1 的评?'),  
(11,112,'DB2 文章2'),  
(1,12,'Oracle'),  
(0,2,'Java技?);  
 

现在万事兼备了,我们开始查询吧。假讄在让你查询一?#8216;DB2 文章1’的所有评论,有h_q还不简单,如下q样可以了?/font>

SELECT * FROM BBS WHERE PARENTID=(SELECT ID FROM BBS WHERE NAME='DB2');  
 

{案完全正确。那么,现在让你查询一下DB2的所有文章及评论Q怎么办?传统的方法就很难查询了,q时候递归查询派上用ZQ如下:

WITH TEMP(PARENTID,ID,NAME) AS  
(  
SELECT PARENTID,ID,NAME FROM BBS WHERE NAME='DB2'---语句1  
UNION ALL---语句2  
SELECT B.PARENTID,B.ID,B.NAME FROM BBS AS B, TEMP AS T WHERE B.PARENTID=T.ID---语句3  
)  
SELECT NAME FROM TEMP;---语句4  
 

q行后,我们发现Q结果完全正,那它到底是怎么q行的呢Q下面我们详l讲解一下?/font>

1、首先,语句1会执行Q它只执行一ơ,作ؓ循环的v炏V得到结果集QDB2

2、接着Q将循环执行语句3Q这里我们有必要详细介绍一下?/font>

首先语句3的意图是什么呢Q说白了Q它是查找语句1产生l果集(DB2Q的下一U,那么在目录树中DB2的下一U是什么呢Q是‘DB2 文章1’?#8216;DB2 文章2’Qƈ且把查询到的l果集作Z一ơ@环的LQ然后查询它们的下一U,直到没有下一Uؓ止?/font>

怎么Pq没明白Q哈哈,不要紧,我们一步一步来Q?/font>


首先Q语?产生l果集:DB2Q作为@环的LQ把它和BBS表关联来查找它的下一U,查询后的l果为:‘DB2 文章1’?#8216;DB2 文章2’

接着Q把上次的查询结果(也就?#8216;DB2 文章1’?#8216;DB2 文章2’Q和BBS表关联来查找它们的下一U,查询后的l果为:‘DB2 文章1 的评?’ ?‘DB2 文章1 的评?’?/p>

然后Q在把上ơ的查询l果Q也是‘DB2 文章1 的评?’ ?‘DB2 文章1 的评?’Q和BBS表关联来查找它们的下一U,此时Q没有结果返回,循环l束?/p>

3、第三,执行语?Q将所有的l果集放在一P最l得到templ果集?/p>

4、最后,我们通过语句4 从temp临时集合中得到我们期望的查询l果?/p>

怎么Pq回理解了吧Q如果还没有理解Q那么我也无能ؓ力了。需要特别提醒的?/p>

1、一定要注意语句3的关联条Ӟ否则很容易就写成d@环了?/p>

2、语?必须是UNION ALL

最后请大家猜想一下,把语?的where子句LQ将会生什么样的结果呢Q?/p>

NTE:

SELECT * FROM <TABLE-NAME>;  
 

看到上面的语句了吗?q是我们在熟悉不q的一条语句,我们中的大多人学习SQL正是从这条语句开始的。所以大多数为FROM语句后只能接一个表或视图(或者压根就没多惻IQ有q种x的h我非常能理解Q因为我曄也是q其中的一员。其实FROM后面可以接Q何集合(表)。说到这Q关于集合和表,我特别想多少几句。SQL的理论基是数学中的集合理论,所以SQLx的就是如何对集合q行操作Q基于以上原因,我特别喜Ƣ名?集合Q而不喜欢说表。不q,大家如果不习惯,也可以把集合和表当一个意思来理解Q因为我们不是搞理论研究工作的,没必要深I他们之间的l微差别。说了这么多Q我们还是赶快来看个例子吧?/font>

---
 
CREATE TABLE USER 
 

 
NAME VARCHAR(20) NOT NULL,---姓名 
 
BIRTHDAY DATE---生日 
 
);
 
 
 
 
 
---例子1
 
SELECT * FROM
 
(
 
SELECT * FROM USER
 
) AS TEMP1;
 
 
 
 
 
---例子2
 
SELECT NAME,BIRTHDAY FROM
 
(
 
SELECT NAME,BIRTHDAY FROM USER
 
) AS TEMP1;
 
 
 
 
 
---例子3
 
SELECT TEMP1.NAME,TEMP1.BIRTHDAY FROM
 
(
 
SELECT NAME,BIRTHDAY FROM USER
 
) AS TEMP1;
 
 
 
 
 
---例子4
 
SELECT N,B FROM
 
(
 
SELECT NAME,BIRTHDAY FROM USER
 
) AS TEMP1(N,B);
 
 
 
 
 
---例子5
 
SELECT AAA.A,AAA.B,XXX.X,XXX.Y FROM
 
(
 
SELECT NAME,BIRTHDAY FROM USER
 
) AS AAA(A,B),--集合1
 
(
 
SELECT NAME,BIRTHDAY FROM USER
 
) AS XXX(X,Y)--集合2
 
WHERE AAA.A=XXX.X AND AAA.B=XXX.Y--兌两个集合  
 

看到上面的例?了吗Q我们可以给临时集合命名Q还可以l重命名临时集合的列名,q可以关联两个旉合,MQ操作旉合和操作表没有区别?/font>

Temporary table

临时表(TEMPORARY TABLEQ通常应用在需要定义旉合的场合。但是,在大部分需要旉合的时候,我们Ҏ׃需要定义时表。当我们在一条SQL语句中只使用一ơ旉合时Q我们可以用嵌套表表达式来定义临时集合Q当我们在一条SQL语句中需要多ơ用同一临时集合Ӟ我们可以使用公共表表辑ּQ只有当我们在一个工作单元中的多条SQL语句中用同一临时集合Ӟ我们才需要定义时表?/font>

   可以通过以下三种方式定义临时表:

Ҏ1Q?nbsp; 
DECLARE GLOBAL TEMPORARY TABLE SESSION.EMP  
(  
    NAME VARCHAR(10),---姓名  
    DEPT SMALLINT,---部门  
    SALARY DEC(7,2)---工资  
)  
ON COMMIT DELETE ROWS;  
   
Ҏ2Q?nbsp; 
DECLARE GLOBAL TEMPORARY TABLE session.emp  
LIKE staff INCLUDING COLUMN DEFAULTS  
WITH REPLACE  
ON COMMIT PRESERVE ROWS;  
   
Ҏ3Q?nbsp; 
DECLARE GLOBAL TEMPORARY TABLE session.emp AS  
(  
    SELECT * FROM staff WHERE <condition>  
)  
DEFINITION ONLY  
WITH REPLACE;  
 

    定义了时表后,我们可以像用普通表一样用时表。时表只对定义它的用户有效Q不同用户可以在同一旉定义同名的时表Q他们之间互不媄响。时表的生命周期是SESSIONQ当SESSION关闭Ӟ临时表将自动删除Q这也是临时表的模式名只能ؓSESSION的原因。此外,我们q可以给临时表定义烦引。更多细节请参考DB2 信息中心?/font>




牛虾 2010-04-14 16:53 发表评论
]]>
在Eclipse中去掉多余的UIlg的几个方?/title><link>http://www.tkk7.com/yes1983/archive/2009/07/26/Eclipse_extension_Activities_remove.html</link><dc:creator>牛虾</dc:creator><author>牛虾</author><pubDate>Sun, 26 Jul 2009 07:59:00 GMT</pubDate><guid>http://www.tkk7.com/yes1983/archive/2009/07/26/Eclipse_extension_Activities_remove.html</guid><wfw:comment>http://www.tkk7.com/yes1983/comments/288445.html</wfw:comment><comments>http://www.tkk7.com/yes1983/archive/2009/07/26/Eclipse_extension_Activities_remove.html#Feedback</comments><slash:comments>0</slash:comments><wfw:commentRss>http://www.tkk7.com/yes1983/comments/commentRss/288445.html</wfw:commentRss><trackback:ping>http://www.tkk7.com/yes1983/services/trackbacks/288445.html</trackback:ping><description><![CDATA[<font style="background-color: #cce8cf">Eclipse的扩展机制是其一个重要特?但随着Eclipse功能做强,插g来多,你会发现GUI上的图标来多,Menu,toolbar,context menu都被占满?其实很多itemq不是我们需要的,但是contributeq些item的插件我们是需要的,那怎么L它们扩展的那些菜单项?<br /> 1.在Plugin.xml中定?br />    q是最单的办法,很多时候我们自己想写代码来L一些菜单项,但效果ƈ不好.所以能在Plugin.xml中定制的,我们?nbsp;量写在plugin.xml里面.下面举一个右键菜单的例子:<br />    扩展右键菜单需要扩展org.eclipse.ui.popupMenus扩展?我们一般都在它下面new一个action,但这个action扩展之后不管?nbsp; M界面都会出现,如果我们惛_某些条g下隐藏掉它该怎么?仔细观察下org.eclipse.ui.popupMenus扩展?其实我们q可以新建objectContribution扩展<br />    <extension<br />          point="org.eclipse.ui.popupMenus"><br />    <objectContribution<br />             id="my.example.objectContribution"<br />             nameFilter="*example*"<br />             objectClass="java.io.File"><br />          <action<br />                class="my.example.MyAction"<br />                id="my.example.MyAction"<br />                label="Exe"<br />                menubarPath="additional"><br />          </action><br />       </objectContribution><br />     </extension><br />     objectContribution里面也包含一个action,但这个action在popupmenu里出现是有条件的:我们l它定义了一个nameFilter, 只有当selection()的path中包含了"example"才会昄,否则q个action是不会出现在 popupmenu里的.q里的selection假设选中的是一个File,如果选中的是你自己写的类,那namefilter会在你的cȝtoStringҎ里面找keyword.<br /> 2.使用Eclipse的Activities扩展<br />   plugin.xmlq不能解x有问?当我们实在没有办法在plugin.xml中限制某些extension的出现的时?可以考虑使用Eclipse的Activities.Activities的官方定义大家可以google一下eclipse的help.我个人的理解是它可以和perspective一h制UI的显C?但是Perspective设计的太易于扩展?假如Plugin A在perspective上扩展了一个UI,那么Plugin B在每ơ进入这个perspective的时候就一定可以看得见?而且在Eclipse的扩展机制下,Plugin B是没有权利去删了Plugin A的contribution?Eclipse的ExtensionRegistry倒是提供了一个removeExtensionҎ,但运行的时候会报错).在这L情况?Activities的h值就体现出来?你只要给它一个Extension的id,它就可以帮你把这个Extension disable?例如:<br /> <extension<br />          point="org.eclipse.ui.activities"><br />       <activity<br />             id="my.example.activity"<br />             name="WizardActivity"><br />       </activity><br />       <activityPatternBinding<br />             activityId="my.example.activity"<br />             pattern="my\.example/mywizard"><br />       </activityPatternBinding><br />  </extension><br />  比较重要的是activityPatternBinding中的pattern属?它是由plugin id + "/" + local-idl成.比如在插件my.example中扩展了 org.eclipse.ui.newWizards,id是mywizard,那么上面q个activityPatternBinding׃disable掉my.example的mywizard扩展,你在 GUI中就看不见这个wizard?pattern是支持正则表辑ּ?所以如果有"."的话需要用转义字符\.注意,q里的disable的意思ƈ不是说我把mywizardq个扩展删掉?而是屏蔽了它,mywizard仍然?nbsp;ExtensionRegistry?<br /> 3.用代码来动态控制UI<br />  Ҏ2只是隐藏掉一些扩?但是有一些需求ƈ不是单的隐藏可以了,我最q碰到的一个需求就?有一个flag,只有当flag==1的时候扩展是可见?否则是不可见?需要disableq个扩展.q时必要加一些代码才能实C,q是以方?中的mywizardZ:<br />  IWorkbenchActivitySupport workbenchActivitySupport = PlatformUI.getWorkbench().getActivitySupport(); <br />   IActivityManager activityManager = workbenchActivitySupport.getActivityManager();<br />   Set enabledActivityIds = new HashSet(activityManager.getEnabledActivityIds()); <br />         if(flag==1)<br />   {<br />           if (enabledActivityIds.add("my.example.activity")) <br />               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);  <br />   }<br />   else{<br />            if(enabledActivityIds.remove("my.example.activity"))<br />               workbenchActivitySupport.setEnabledActivityIds(enabledActivityIds);<br />   }<br />  Activities可以是enable或者disable?当你在plugin.xml中定义好了一个Activity,~省它是disable?是说activityPatternBinding 匚w的扩展是会被disable?但你也可以把Activities设成enable?在plugin.xml或者用代码都可以设|?,它匹配的扩展是可以正怋用的.<br />  在上面的code sample?我们通过activityManager.getEnabledActivityIds()得到所有enable的Activities.如果flag==1,那my.example.activity 也应该被加入到enable Activities?q样mywizard可以显C在界面?反之,p在enable Activities中remove掉my.example.activity,它就变成<br />  disable,会把mywizard隐藏.</font> <img src ="http://www.tkk7.com/yes1983/aggbug/288445.html" width = "1" height = "1" /><br><br><div align=right><a style="text-decoration:none;" href="http://www.tkk7.com/yes1983/" target="_blank">牛虾</a> 2009-07-26 15:59 <a href="http://www.tkk7.com/yes1983/archive/2009/07/26/Eclipse_extension_Activities_remove.html#Feedback" target="_blank" style="text-decoration:none;">发表评论</a></div>]]></description></item><item><title>DB2学习W记http://www.tkk7.com/yes1983/archive/2009/06/17/282922.html牛虾牛虾Wed, 17 Jun 2009 14:02:00 GMThttp://www.tkk7.com/yes1983/archive/2009/06/17/282922.htmlhttp://www.tkk7.com/yes1983/comments/282922.htmlhttp://www.tkk7.com/yes1983/archive/2009/06/17/282922.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/282922.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/282922.html 1.q不是用index׃定快.有时候一个表只有很少的records,那么你直接scanq个?比你先读index,再访问表要快.
2.不过大多数情况下q是用index快一?要不然这个技术就没有意义?.DB2中index的应用需要两个前提条?
  阅读全文

牛虾 2009-06-17 22:02 发表评论
]]>
TreeViewer的setselectionҎ不能选中树的子节?http://www.tkk7.com/yes1983/archive/2009/05/11/270018.html牛虾牛虾Mon, 11 May 2009 03:27:00 GMThttp://www.tkk7.com/yes1983/archive/2009/05/11/270018.htmlhttp://www.tkk7.com/yes1983/comments/270018.htmlhttp://www.tkk7.com/yes1983/archive/2009/05/11/270018.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/270018.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/270018.html

牛虾 2009-05-11 11:27 发表评论
]]>
使用Java操作文本文g的方法详?转蝲)http://www.tkk7.com/yes1983/archive/2009/02/17/255126.html牛虾牛虾Tue, 17 Feb 2009 08:17:00 GMThttp://www.tkk7.com/yes1983/archive/2009/02/17/255126.htmlhttp://www.tkk7.com/yes1983/comments/255126.htmlhttp://www.tkk7.com/yes1983/archive/2009/02/17/255126.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/255126.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/255126.html最初java是不支持Ҏ本文件的处理的,Z弥补q个~憾而引入了Reader和Writer两个c,q两个类都是抽象c,Writer?write(char[] ch,int off,int
length)Qflush()和close()Ҏ为抽象方法,Reader中read(char[] ch,int off,int length)和close()Ҏ是抽象方法。子cd该分别实C们?br />   当我们读写文本文件的时候,采用Reader是非常方便的Q比如FileReaderQInputStreamReader和BufferedReader。其中最重要的类是InputStreamReaderQ?br /> 它是字节转换为字W的桥梁。你可以在构造器重指定编码的方式Q如果不指定的话采用底层操作系l的默认~码方式Q例如GBK{。当使用FileReaderd文g
的时候?br /> FileReader fr = new FileReader("ming.txt");
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
其中read()Ҏq回的是d得下个字W。当然你也可以用read(char[] ch,int off,int length)q和处理二进制文件的时候类|不多说了。如果?br /> InputStreamReader来读取文件的时?br /> while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
q和FileReaderq没有什么区别,事实上在FileReader中的Ҏ都是从InputStreamReader中承过来的。read()Ҏ是比较好Ҏ间的Q如果ؓ了提高效?br /> 我们可以使用BufferedReader对Readerq行包装Q这样可以提高读取得速度Q我们可以一行一行的d文本Q用readLine()Ҏ?br /> BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
当你明白了如何用Reader来读取文本文件的时候那么用Writer写文件同样非常简单。有一炚w要注意,当你写文件的时候,Z提高效率Q写入的数据会先
攑օ~冲区,然后写入文g。因此有时候你需要主动调用flush()Ҏ。与上面对应的写文g的方法ؓQ?br /> FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush();
OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush();
PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);
不要忘记用完后关闭流Q下面是个小例子Q帮助新手理解。其实有的时候java的IOpȝ是需要我们多记记的,不然哪天q疏了?/font>

import java.io.*;
public class TestFile2
{
public static void main(String[] args) throws IOException
{
FileReader fr = new FileReader("ming.txt");
char[] buffer = new char[1024];
int ch = 0;
while((ch = fr.read())!=-1 )
{
System.out.print((char)ch);
}
  InputStreamReader isr = new InputStreamReader(new FileInputStream("ming.txt"));
while((ch = isr.read())!=-1)
{
System.out.print((char)ch);
}
  BufferedReader br = new BufferedReader(new InputStreamReader(new FileInputStream("ming.txt")));
String data = null;
while((data = br.readLine())!=null)
{
System.out.println(data);
}
  FileWriter fw = new FileWriter("hello.txt");
String s = "hello world";
fw.write(s,0,s.length());
fw.flush();
  OutputStreamWriter osw = new OutputStreamWriter(new FileOutputStream("hello2.txt"));
osw.write(s,0,s.length());
osw.flush();
  PrintWriter pw = new PrintWriter(new OutputStreamWriter(new FileOutputStream("hello3.txt")),true);
pw.println(s);

  fr.close();
isr.close();
br.close();
fw.close();
osw.close();
pw.close();
}
}

java中多U方式读文g
一、多U方式读文g内容?br /> 1、按字节d文g内容
2、按字符d文g内容
3、按行读取文件内?br /> 4、随取文件内?/font>

import java.io.BufferedReader;
import java.io.File;
import java.io.FileInputStream;
import java.io.FileReader;
import java.io.IOException;
import java.io.InputStream;
import java.io.InputStreamReader;
import java.io.RandomAccessFile;
import java.io.Reader;
public class ReadFromFile {
/**
* 以字节ؓ单位d文gQ常用于Mq制文gQ如囄、声韟뀁媄像等文g?br /> * @param fileName 文g的名
*/
public static void readFileByBytes(String fileName){
File file = new File(fileName);
InputStream in = null;
try {
System.out.println("以字节ؓ单位d文g内容Q一ơ读一个字节:");
// 一ơ读一个字?br /> in = new FileInputStream(file);
int tempbyte;
while((tempbyte=in.read()) != -1){
System.out.write(tempbyte);
}
in.close();
} catch (IOException e) {
e.printStackTrace();
return;
}
try {
System.out.println("以字节ؓ单位d文g内容Q一ơ读多个字节Q?);
//一ơ读多个字节
byte[] tempbytes = new byte[100];
int byteread = 0;
in = new FileInputStream(fileName);
ReadFromFile.showAvailableBytes(in);
//d多个字节到字节数l中QbytereadZơ读入的字节?br /> while ((byteread = in.read(tempbytes)) != -1){
System.out.write(tempbytes, 0, byteread);
}
} catch (Exception e1) {
e1.printStackTrace();
} finally {
if (in != null){
try {
in.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以字Wؓ单位d文gQ常用于L本,数字{类型的文g
* @param fileName 文g?br /> */
public static void readFileByChars(String fileName){
File file = new File(fileName);
Reader reader = null;
try {
System.out.println("以字Wؓ单位d文g内容Q一ơ读一个字节:");
// 一ơ读一个字W?br /> reader = new InputStreamReader(new FileInputStream(file));
int tempchar;
while ((tempchar = reader.read()) != -1){
//对于windows下,rnq两个字W在一hQ表CZ个换行?br /> //但如果这两个字符分开昄Ӟ会换两次行?br /> //因此Q屏蔽掉rQ或者屏蔽n。否则,会多出很多I?br /> if (((char)tempchar) != 'r'){
System.out.print((char)tempchar);
}
}
reader.close();
} catch (Exception e) {
e.printStackTrace();
}
try {
System.out.println("以字Wؓ单位d文g内容Q一ơ读多个字节Q?);
//一ơ读多个字符
char[] tempchars = new char[30];
int charread = 0;
reader = new InputStreamReader(new FileInputStream(fileName));
//d多个字符到字W数l中QcharreadZơ读取字W数
while ((charread = reader.read(tempchars))!=-1){
//同样屏蔽掉r不显C?br /> if ((charread == tempchars.length)&&(tempchars[tempchars.length-1] != 'r')){
System.out.print(tempchars);
}else{
for (int i=0; i<charread; i++){
if(tempchars[i] == 'r'){
continue;
}else{
System.out.print(tempchars[i]);
}
}
}
}

} catch (Exception e1) {
e1.printStackTrace();
}finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 以行为单位读取文Ӟ常用于读面向行的格式化文?br /> * @param fileName 文g?br /> */
public static void readFileByLines(String fileName){
File file = new File(fileName);
BufferedReader reader = null;
try {
System.out.println("以行为单位读取文件内容,一ơ读一整行Q?);
reader = new BufferedReader(new FileReader(file));
String tempString = null;
int line = 1;
//一ơ读入一行,直到dnull为文件结?br /> while ((tempString = reader.readLine()) != null){
//昄行号
System.out.println("line " + line + ": " + tempString);
line++;
}
reader.close();
} catch (IOException e) {
e.printStackTrace();
} finally {
if (reader != null){
try {
reader.close();
} catch (IOException e1) {
}
}
}
}
/**
* 随机d文g内容
* @param fileName 文g?br /> */
public static void readFileByRandomAccess(String fileName){
RandomAccessFile randomFile = null;
try {
System.out.println("随机d一D|件内容:");
// 打开一个随问文件流Q按只读方式
randomFile = new RandomAccessFile(fileName, "r");
// 文g长度Q字节数
long fileLength = randomFile.length();
// L件的起始位置
int beginIndex = (fileLength > 4) ? 4 : 0;
//读文g的开始位|移到beginIndex位置?br /> randomFile.seek(beginIndex);
byte[] bytes = new byte[10];
int byteread = 0;
//一ơ读10个字节,如果文g内容不10个字节,则读剩下的字节?br /> //一ơ读取的字节数赋lbyteread
while ((byteread = randomFile.read(bytes)) != -1){
System.out.write(bytes, 0, byteread);
}
} catch (IOException e){
e.printStackTrace();
} finally {
if (randomFile != null){
try {
randomFile.close();
} catch (IOException e1) {
}
}
}
}
/**
* 昄输入中q剩的字节数
* @param in
*/
private static void showAvailableBytes(InputStream in){
try {
System.out.println("当前字节输入中的字节数?" + in.available());
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
ReadFromFile.readFileByBytes(fileName);
ReadFromFile.readFileByChars(fileName);
ReadFromFile.readFileByLines(fileName);
ReadFromFile.readFileByRandomAccess(fileName);
}
}

二、将内容q加到文件尾?/font>

import java.io.FileWriter;
import java.io.IOException;
import java.io.RandomAccessFile;

/**
* 内容追加到文gN
*/
public class AppendToFile {

/**
* AҎq加文gQ用RandomAccessFile
* @param fileName 文g?br /> * @param content q加的内?br /> */
public static void appendMethodA(String fileName,


String content){
try {
// 打开一个随问文件流Q按d方式
RandomAccessFile randomFile = new RandomAccessFile(fileName, "rw");
// 文g长度Q字节数
long fileLength = randomFile.length();
//写文g指针Ud文g?br /> randomFile.seek(fileLength);
randomFile.writeBytes(content);
randomFile.close();
} catch (IOException e){
e.printStackTrace();
}
}
/**
* BҎq加文gQ用FileWriter
* @param fileName
* @param content
*/
public static void appendMethodB(String fileName, String content){
try {
//打开一个写文g器,构造函C的第二个参数true表示以追加Ş式写文g
FileWriter writer = new FileWriter(fileName, true);
writer.write(content);
writer.close();
} catch (IOException e) {
e.printStackTrace();
}
}

public static void main(String[] args) {
String fileName = "C:/temp/newTemp.txt";
String content = "new append!";
//按方法Aq加文g
AppendToFile.appendMethodA(fileName, content);
AppendToFile.appendMethodA(fileName, "append end. n");
//昄文g内容
ReadFromFile.readFileByLines(fileName);
//按方法Bq加文g
AppendToFile.appendMethodB(fileName, content);
AppendToFile.appendMethodB(fileName, "append end. n");
//昄文g内容
ReadFromFile.readFileByLines(fileName);
}
}



牛虾 2009-02-17 16:17 发表评论
]]>
Eclipse的奇怪问题ȝ(不断更新)http://www.tkk7.com/yes1983/archive/2008/12/02/243982.html牛虾牛虾Tue, 02 Dec 2008 09:52:00 GMThttp://www.tkk7.com/yes1983/archive/2008/12/02/243982.htmlhttp://www.tkk7.com/yes1983/comments/243982.htmlhttp://www.tkk7.com/yes1983/archive/2008/12/02/243982.html#Feedback3http://www.tkk7.com/yes1983/comments/commentRss/243982.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/243982.html 2.Plugin A 依赖 Plugin B.B也把相应的package export出来?但是Aq是找不到B里面定义的类.修改A的MANIFEST.MF文g,在dependence tab里去掉Plugin B,再添加B.此时发现?,6个同LPlugin B出现在选择plugin的list?cancel 掉该对话?然后重启eclipse,在A的dependence里面重新加上B,问题解决.
3.当我们通过在plugin.xml中用extension的方式定义action的时?你会发现你定义的actionset和action在GUI出现的顺序不是你可以控制?是说同一个actionset下的多个action不是按你定义的先后顺序出现在E序的界面上?q样对actionq行排序?其实仔细观察一?你会发现action在GUI出现的顺序是和你定义action的顺序相反的,比如你先后定义了3个action A,B,C,那么你就会在GUI上看见action的顺序是C,B,A.如果你定义了多个actionset,你会发现q个规律不适用与actionset,actionset在界面上出现的顺序其实是和它的id的排序相反的.比如你定义了三个actionset,它们的id分别?seta,setb,setc,你会发现GUI上出现的序是setc,setb,seta
4.双击ȀzTreeViewer的celleditor
  JFace的Viewer都有单元格编辑功?但是celleditor默认的实现是单击Ȁzeditor,双击选中item.如果需要改成单击选中item,双击Ȁzeditor?Eclipse的官|上好像也有人问到这个问?不过目前好像是开了一个bug,期待eclipse的下个版本解册个问?但最q找C一个用SWT来解册个问题的Ҏ:
       Tree tree=treeViewer.getTree();
    final TreeEditor editor = new TreeEditor(tree);
  editor.horizontalAlignment = SWT.LEFT;
  editor.grabHorizontal = true;
  // Use a mouse listener, not a selection listener, because you're
  // interested
  // in the selected column as well as row
  tree.addMouseListener(new MouseAdapter() {
   public void mouseDoubleClick(MouseEvent event) {
    final TreeItem item = tree.getSelection()[0];
    // Create a text field to do the editing
    final Text text = new Text(tree, SWT.NONE);
    text.setText(item.getText());
    text.selectAll();
    text.setFocus();
    text.addFocusListener(new FocusAdapter() {
     public void focusLost(FocusEvent event) {
      text.dispose();
     }
    });
    // Set the text field into the editor
    editor.setEditor(text, item);
   }
  });


牛虾 2008-12-02 17:52 发表评论
]]>
Eclipse中如何消除快捷键定义冲突(keybinding conflict)http://www.tkk7.com/yes1983/archive/2008/10/14/234273.html牛虾牛虾Tue, 14 Oct 2008 09:42:00 GMThttp://www.tkk7.com/yes1983/archive/2008/10/14/234273.htmlhttp://www.tkk7.com/yes1983/comments/234273.htmlhttp://www.tkk7.com/yes1983/archive/2008/10/14/234273.html#Feedback0http://www.tkk7.com/yes1983/comments/commentRss/234273.htmlhttp://www.tkk7.com/yes1983/services/trackbacks/234273.html    ׃Eclipse的易扩展?理论上可以有无数个Actionq行在一个RCP E序?但是快捷键是有限?其是一些常用的,像Ctrl+C,Ctrl+S之类的普通用戯记得住的那么几?万一你自定义的Action的快捷键和Eclipse默认的发生了冲突怎么?比如Eclipse默认Ctrl+S是Save的快捷键,但是你又自定义了一个SaveAction,希望用户按下Ctrl+S之后执行的是自己的SaveAction的runҎ.
     一般给Actionl定快捷键的Ҏ是自定义binding和command,然后在action中指定definition id为command的id.如下:
<extension
           point="org.eclipse.ui.bindings">
        <key
              commandId="myplugin.actions.save"
              contextId="org.eclipse.ui.contexts.window"
              schemeId="org.eclipse.ui.defaultAcceleratorConfiguration"
              sequence="CTRL+S">
        </key>
     </extension>
     <extension
           point="org.eclipse.ui.commands">
        <command
              id="myplugin.actions.save"
              name="Save">
        </command>
     </extension>

q样的方法一般是不会有冲H的,但是像我们上面提到的情况,如果你自定义一个binding,它的key sequence是Ctrl+S,那就会有问题.׃org.eclipse.ui插g已经提供了一个Ctrl+S的快捷键,所以系l中会有两个Ctrl+S,q样Eclipse会在右下角pop up一个assist dialog,让你从两个Action中选择一?q样可能会造成一些用户用上的不习惯.
解决办法:
    1.直接改快捷键.
      q个最单了,比如把你自己的save定义成Alt+S.但是q个Ҏ也是最不好的方?因ؓ很多用户q不知道Alt+S在你的程序里面就是save.
    2.修改自定义action的definition id
      我们刚才说过,action的definition idl定着一个command,而command又对应着一个binding,Eclipse通过q样的方式实现action和快捷键的绑?我们再来看看Eclipse定义的command和key binding(摘自org.eclipse.ui的plugin.xml):
      <command
            name="%command.save.name"
            description="%command.save.description"
            categoryId="org.eclipse.ui.category.file"
            id="org.eclipse.ui.file.save" />
      <key
            commandId="org.eclipse.ui.file.save"
            sequence="M1+S"
            schemeId="org.eclipse.ui.defaultAcceleratorConfiguration" />
      <key

     Eclipse的Save Action把definition id指定为org.eclipse.ui.file.save,然后它就和上面的commandq行了绑?而这个command对应的key是"M1+S"(Ctrl + S),q样实C快捷键绑?如果我们也把自定义的Save Action的definition id指定为org.eclipse.ui.file.save,是不是就可以辑ֈ目的?{案是肯定的.
     Eclipse中的Action存在着一个类?优先U?的概?具体实现是通过action handler).?具体"的action,优先U越?Eclipse的Save Action明显是一个global的action,(同样的global actionq有copy, cut,undo,redo{等).而我们自定义的action一般是实现?font style="background-color: #cce8cf">IWorkbenchWindowActionDelegate
接口?是?它是contribute to workbench window?它是一个workbench action,它的优先U就高于Mglobal action.同理,如果你定义一个editor action或者view action,׃它比workbenchq?具体"(workbench可以包含多个editor或view,workbench action对这些editor或view都是有效?而editor action只对某个具体的editor有效),所以editor action的优先񔞮高于workbench action.q样,如果自定义的action和eclipse~省的action都绑定到同一个command,那么eclipse runtim最后会选择自定义的action来执?
    3.l极解决大法:自定义schema
     Eclipse 有一个default的快捷键schema文g:org.eclipse.ui.defaultAcceleratorConfiguration.它存储着Eclipse所有的快捷?如果你自定义一个自qschema文g,q把它设成当前用的schema文g,那么Eclipse׃调用自定义的schema文g.(新的schema文g可以在org.eclipse.ui.bindings扩展点中定义,h?在定义新schema的时候由一个parentID属?如果你定义了?新的schema会像cȝ承一hparent schema里面的key binding全承下?如果不定?则是一个全新的schema)
    假定我们已经有了一个新的schema文g,id是myplugin.schema.然后我们在org.eclipse.ui.bindings下定义一个key:
<key
              commandId="myplugin.actions.save"
              contextId="org.eclipse.ui.contexts.window"
              schemaId="myplugin.schema"
              sequence="CTRL+S">
        </key>
我们已经把schemaId换成了myplugin.schema,表示我们把CTRL+S加到了myplugin.schema?然后把新建的schema文g在product配置文gplugin_customization.ini中设|成当前的key schema文g:
org.eclipse.ui/KEY_CONFIGURATION_ID=myplugin.schema

q种Ҏ虽然ȝ了一?但却可以L又治?而且׃可以指定parent schema,我们完全可以把org.eclipse.ui.defaultAcceleratorConfiguration作ؓparent schema,l承它全部的快捷键配|?只定制几个会产生冲突的快捷键卛_


     



牛虾 2008-10-14 17:42 发表评论
]]>
վ֩ģ壺 þƵ| ƷŮߵӰ| ߹ۿ| רһ·߶| AV뾫Ʒɫҹ߹ۿ| ִֻˬƬ| av޽վ| AëƬA| һƵ| Ƶ| ɫվWWWĻ| 츾þþƷ| 99þ޾ƷëƬ| avۺavav| 뾫Ʒþþþ..| ҹҹˬ޾Ʒ| ˳߹ۿŹ| Ѹ弤Ƶ| AVַ߹ۿ| 1000žžʮδֹۿ| ޵Ƶѹۿ1000| һѸƵ| ҹaëƬƵ| С豻| ëƬAV뾫Ʒҹ| GVGVͬ| avר| ޱר| AVպAVɫ| avһۿ| heyzoרۺ| Ʒһ| Ůʮ·Ůbbw| ޹ľƷ| ɫ͵͵޵һۺ| ŮƵƵaѹۿ| ӰԺҹˬˬˬ| þþþƵ| ĻӰӳѹۿƵ | ԻƵ30ӳ| 97߹ۿƵ|