如鵬網(wǎng) 大學(xué)生計(jì)算機(jī)學(xué)習(xí)社區(qū)

          CowNew開源團(tuán)隊(duì)

          http://www.cownew.com 郵件請(qǐng)聯(lián)系 about521 at 163.com

            BlogJava :: 首頁 :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理 ::
            363 隨筆 :: 2 文章 :: 808 評(píng)論 :: 0 Trackbacks

          #


          ANTLR樹分析器
                          本章翻譯人 CowNew開源團(tuán)隊(duì) 周曉

          曾經(jīng)的SORCERER

          在ANTLR 2.xx版本中,只要增加一些樹操作符,就可以幫助你建立一種中間形式的樹結(jié)構(gòu)(抽象語法樹) 來重寫語法規(guī)則和語義動(dòng)作。ANTLR同樣允許你去指定AST樹的文法結(jié)構(gòu),因此,可以通過操作或簡單遍歷樹結(jié)點(diǎn)的方式來進(jìn)行文法翻譯。

          以前,樹分析器用一個(gè)單獨(dú)的工具SORCERER來生成,但是ANTLR已經(jīng)取代了它的功能。ANTLR現(xiàn)在可以為字符流,記號(hào)流,以及樹節(jié)點(diǎn)來建立識(shí)別器。

          什么是樹分析器?

          分析是決定一個(gè)記號(hào)串是否能由一個(gè)文法產(chǎn)生的過程。ANTLR在這方面比大多數(shù)工具考慮的都要深,它把一個(gè)二維樹結(jié)構(gòu)看作是一串節(jié)點(diǎn)。這樣,在ANTLR中,對(duì)記號(hào)流分析和樹分析的代碼生成過程來說,真正僅有的區(qū)別就變成了對(duì)超前掃描,規(guī)則方法定義頭部的檢測(cè),以及對(duì)二維樹結(jié)構(gòu)代碼生成模板的指定上。

          可以分析什么類型的樹?

          ANTLR樹分析器可以遍歷實(shí)現(xiàn)了AST接口的任何樹。AST接口是一種基于類似兒子-兄弟結(jié)點(diǎn)的樹通用結(jié)構(gòu),有如下重要的制導(dǎo)方法:

          • getFirstChild: 返回第一個(gè)子結(jié)點(diǎn)的引用.
          • getNextSibling: 返回下一個(gè)兄弟結(jié)點(diǎn)的引用.

          每一個(gè)AST結(jié)點(diǎn)有一個(gè)子女列表,一些文本和一個(gè)"記號(hào)類型"。每個(gè)樹的結(jié)點(diǎn)都是一棵樹,因此我們說樹是自相似的。AST接口的完整定義如下:

          
          /** 最小AST結(jié)點(diǎn)接口用于ANTLR的AST成生
          *	和樹遍歷
          */
          public interface AST {
          /** 添加一個(gè)子結(jié)點(diǎn)到最右邊 */
          public void addChild(AST c);
          public boolean equals(AST t);
          public boolean equalsList(AST t);
          public boolean equalsListPartial(AST t);
          public boolean equalsTree(AST t);
          public boolean equalsTreePartial(AST t);
          public ASTEnumeration findAll(AST tree);
          public ASTEnumeration findAllPartial(AST subtree);
          /** 得到第一個(gè)子結(jié)點(diǎn); 如果沒有子結(jié)點(diǎn)則返回null */
          public AST getFirstChild();
          /** 得到本結(jié)點(diǎn)的下一個(gè)兄弟結(jié)點(diǎn) */
          public AST getNextSibling();
          /** 得到本結(jié)點(diǎn)的記號(hào)文本 */
          public String getText();
          /** 得到本結(jié)點(diǎn)的記號(hào)類型 */
          public int getType();
          /** 得到本結(jié)點(diǎn)的子結(jié)點(diǎn)總數(shù); 如果是葉子結(jié)點(diǎn), 返回0 */
          public int getNumberOfChildren();
          public void initialize(int t, String txt);
          public void initialize(AST t);
          public void initialize(Token t);
          /** 設(shè)置第一個(gè)子結(jié)點(diǎn). */
          public void setFirstChild(AST c);
          /** 設(shè)置下一個(gè)兄弟結(jié)點(diǎn). */
          public void setNextSibling(AST n);
          /** 設(shè)置本結(jié)點(diǎn)的記號(hào)文本 */
          public void setText(String text);
          /** 設(shè)置本結(jié)點(diǎn)的記號(hào)類型 */
          public void setType(int ttype);
          public String toString();
          public String toStringList();
          public String toStringTree();
          }
          

          樹的語法規(guī)則

          正如PCCTS1.33的SORCERER工具和ANTLR記號(hào)語法中所看到的,樹語法是一個(gè)嵌入語義動(dòng)作,語義斷言和句法斷言的EBNF規(guī)則的集合。

          
          規(guī)則:	可選產(chǎn)生式1
          |	可選產(chǎn)生式2
          ...
          |	可選產(chǎn)生式n
          ;
          

          每一個(gè)可選的產(chǎn)生式都是由一個(gè)元素列表所組成的,列表中的元素是加入了樹模式的ANTLR正規(guī)語法中的一個(gè),有如下的形式:

          
          #( 根結(jié)點(diǎn) 子結(jié)點(diǎn)1 子結(jié)點(diǎn)2 ... 子結(jié)點(diǎn)n )
          
          

          例如:下列的樹模式匹配一個(gè)以PLUS為根結(jié)點(diǎn),并有兩個(gè)INT子結(jié)點(diǎn)簡單樹結(jié)構(gòu):

          
          #( PLUS INT INT )
          

          樹模式的根必須是一個(gè)記號(hào)引用,但是子結(jié)點(diǎn)元素不限于此,它甚至可以是子規(guī)則。例如,一種常見結(jié)構(gòu)是if-then-else樹結(jié)構(gòu),其中的else子句聲明子樹是可選的:

          
          #( IF expr stat (stat)? )
              

          值得一提的是,當(dāng)指定樹模式和樹語法后,通常,會(huì)進(jìn)行滿足條件的匹配而不是精確的匹配。一旦樹滿足給定的模式,不管剩下多少?zèng)]有分析,都會(huì)報(bào)告一次匹配。例如,#( A B ),對(duì)于像#( A #(B C) D)這樣有相同結(jié)構(gòu)的樹,不管有多長,都會(huì)報(bào)告一次匹配。

          句法斷言

          ANTLR樹分析器在工作時(shí)僅使用一個(gè)單獨(dú)的超前掃描符號(hào),這在通常情況下不是一個(gè)問題,因?yàn)檫@種中間形式被明確設(shè)計(jì)成利于遍歷的結(jié)構(gòu)。然而,偶爾也需要區(qū)別出相似的樹結(jié)構(gòu)。句法斷言就是被用來克服有限確定的超前掃描所帶來的限制。例如:在區(qū)分一元和二元減號(hào)時(shí),可以為每一種類型的減號(hào)都創(chuàng)建操作結(jié)點(diǎn),這樣的做法可以工作的很好。但對(duì)于一個(gè)相同的根結(jié)點(diǎn),使用句法斷言可以區(qū)分以下結(jié)構(gòu):

          
          expr:   ( #(MINUS expr expr) )=> #( MINUS expr expr )
          |   #( MINUS expr )
          ...
          ;
          

          賦值的次序很重要,因?yàn)榈诙€(gè)可選產(chǎn)生式是第一個(gè)可選產(chǎn)生式的“子集”.

          語義斷言

          語義斷言在可選產(chǎn)生式的開始,僅僅同可選的斷言表達(dá)式合成一體,就像合成一個(gè)正規(guī)文法。語義斷言在產(chǎn)生式的中間,當(dāng)它斷言失敗時(shí),也會(huì)像正規(guī)文法一樣拋出異常。

          一個(gè)樹遍歷器的例子

          考慮一下如何去建立一個(gè)計(jì)算器。一個(gè)方法是建立一個(gè)分析器,這個(gè)分析器識(shí)別輸入并計(jì)算表達(dá)式的值。按照這種方法,我們將會(huì)建立一個(gè)分析器來為輸入的表達(dá)式創(chuàng)建一棵樹,把表達(dá)式以這種中間形式表示,然后樹分析器遍歷這個(gè)樹,并計(jì)算出結(jié)果。

          我們的識(shí)別器, CalcParser, 通過如下的代碼來定義:

          
          class CalcParser extends Parser;
          options {
          buildAST = true;   // // 默認(rèn)使用 CommonAST
          }
          expr:   mexpr (PLUS^ mexpr)* SEMI!
          ;
          mexpr
          :   atom (STAR^ atom)*
          ;
          atom:   INT
          ;
          

          PLUSSTAR記號(hào)是操作符,因此把它們作為子樹的根結(jié)點(diǎn),在它們后面注釋上字符'^'。SEMI記號(hào)后綴有字符'!',這指出了它不應(yīng)該被加入到樹中。

          這個(gè)計(jì)算器的詞法分析定義如下:

          
          class CalcLexer extends Lexer;
          WS	:	(' '
          |	'\t'
          |	'\n'
          |	'\r')
          { _ttype = Token.SKIP; }
          ;
          LPAREN:	'('
          ;
          RPAREN:	')'
          ;
          STAR:	'*'
          ;
          PLUS:	'+'
          ;
          SEMI:	';'
          ;
          INT	:	('0'..'9')+
          ;
              

          識(shí)別器生成的樹是一棵簡單的表達(dá)式樹。例如,輸入"3*4+5"所產(chǎn)生的樹的形式為#( + ( * 3 4 ) 5 )。為了給這種形式的樹建立樹遍歷器,你必須要為ANTLR遞歸的描述樹的結(jié)構(gòu):

          
          class CalcTreeWalker extends TreeParser;
          expr	:	#(PLUS expr expr)
          |	#(STAR expr expr)
          |	INT
          ;
          

          一旦指定結(jié)構(gòu),就可以自由的嵌入語義動(dòng)作去計(jì)算出結(jié)果。一個(gè)簡單的實(shí)現(xiàn)辦法就是使expr規(guī)則返回一個(gè)整型的值,然后使每一條可選產(chǎn)生式計(jì)算每個(gè)子樹的值。下面的樹文法和動(dòng)作達(dá)到了我們期望的效果:

          
          class CalcTreeWalker extends TreeParser;
          expr returns [int r]
          {
          int a,b;
          r=0;
          }
          :	#(PLUS a=expr b=expr) {r = a+b;}
          |	#(STAR a=expr b=expr) {r = a*b;}
          |	i:INT		      {r = Integer.parseInt(i.getText());}
          ;
              

          注意到當(dāng)計(jì)算表達(dá)式值得時(shí)候,沒有必要指定優(yōu)先級(jí),因?yàn)樗呀?jīng)隱含在樹的結(jié)構(gòu)中了。這也解釋了為什么在以中間樹形式表示的時(shí)候,要比它的輸入要多很多。輸入的符號(hào)確實(shí)作為結(jié)點(diǎn)儲(chǔ)存在樹結(jié)構(gòu)中,而且這種結(jié)構(gòu)隱含了結(jié)點(diǎn)之間的關(guān)系。

          要想執(zhí)行分析器和樹遍歷器,還需要以下的代碼:

          
          import java.io.*;
          import antlr.CommonAST;
          import antlr.collections.AST;
          class Calc {
          public static void main(String[] args) {
          try {
          CalcLexer lexer =
          new CalcLexer(new DataInputStream(System.in));
          CalcParser parser = new CalcParser(lexer);
          // 分析輸入的表達(dá)式
          parser.expr();
          CommonAST t = (CommonAST)parser.getAST();
          // 以LISP符號(hào)的形式輸出樹
          System.out.println(t.toStringList());
          CalcTreeWalker walker = new CalcTreeWalker();
          // 遍歷由分析器建立的樹
          int r = walker.expr(t);
          System.out.println("value is "+r);
          } catch(Exception e) {
          System.err.println("exception: "+e);
          }
          }
          }
              

          翻譯

          樹分析器對(duì)檢查樹或者從一棵樹產(chǎn)生輸出來說是很有用的,但必須要為它們添加處理樹轉(zhuǎn)換的代碼。就像正則分析器一樣,ANTLR樹分析器支持buildAST選項(xiàng),這類似于SORCERER的翻譯模式。程序員不去修改代碼,樹分析器自動(dòng)把輸入樹拷貝到作為結(jié)果的樹。每一個(gè)規(guī)則都隱含(自動(dòng)定義的)一個(gè)結(jié)果樹。通過getAST 方法,我們可以從樹分析器中獲得此樹的開始符號(hào)。如果要一些可選產(chǎn)生式和文法元素不被自動(dòng)添加到輸入的樹上,它們后面要注釋上"!"。子樹可以被部分的或者全部重寫。

          嵌入到規(guī)則中的語義動(dòng)作可以根據(jù)測(cè)試和樹結(jié)構(gòu)來對(duì)結(jié)果樹進(jìn)行設(shè)置。參考文法動(dòng)作翻譯章節(jié).

          一個(gè)樹翻譯的例子

          再來看一下上面提到的簡單計(jì)算器的例子,我們可以執(zhí)行樹翻譯來代替計(jì)算表達(dá)式的值。下面樹文法的動(dòng)作優(yōu)化了加法的恒等運(yùn)算(加0)。

          
          class CalcTreeWalker extends TreeParser;
          options{
          buildAST = true;	// "翻譯"模式
          }
          expr:!  #(PLUS left:expr right:expr)
          // '!'關(guān)閉自動(dòng)翻譯
          {
          // x+0 = x
          if ( #right.getType()==INT &&
          Integer.parseInt(#right.getText())==0 )
          {
          #expr = #left;
          }
          // 0+x = x
          else if ( #left.getType()==INT &&
          Integer.parseInt(#left.getText())==0 )
          {
          #expr = #right;
          }
          // x+y
          else {
          #expr = #(PLUS, left, right);
          }
          }
          |   #(STAR expr expr)  // 使用自動(dòng)翻譯
          |   i:INT
          ;
              

          執(zhí)行分析器和樹翻譯器的代碼如下:

          
          import java.io.*;
          import antlr.CommonAST;
          import antlr.collections.AST;
          class Calc {
          public static void main(String[] args) {
          try {
          CalcLexer lexer =
          new CalcLexer(new DataInputStream(System.in));
          CalcParser parser = new CalcParser(lexer);
          // 分析輸入的表達(dá)式
          parser.expr();
          CommonAST t = (CommonAST)parser.getAST();
          // 以LISP符號(hào)的形式輸出樹
          System.out.println(t.toLispString());
          CalcTreeWalker walker = new CalcTreeWalker();
          // 遍歷由分析器建立的樹
          walker.expr(t);
          // 遍歷,并得到結(jié)果
          t = (CommonAST)walker.getAST();
          System.out.println(t.toLispString());
          } catch(Exception e) {
          System.err.println("exception: "+e);
          }
          }
          }
          }
          

          檢查/調(diào)試AST

          當(dāng)開發(fā)樹分析器的時(shí)候,經(jīng)常會(huì)得到分析錯(cuò)誤。不幸的是,你的樹通常異乎尋常的大,使得很難去確定AST結(jié)構(gòu)錯(cuò)誤到底在哪里。針對(duì)這種情況(當(dāng)創(chuàng)建Java樹分析器的時(shí)候,我發(fā)現(xiàn)它非常有用),,我創(chuàng)建了一個(gè)ASTFrame類(一個(gè)JFrame),這樣,你就可以用Swing樹視圖來查看你的AST。它沒有拷貝這棵樹,而是用了一個(gè)TreeModel。以應(yīng)用程序方式運(yùn)行antlr.debug.misc.ASTFrame去或者看看Java代碼Main.java。就像不確定如何去調(diào)試一樣,我不確定它們?cè)谙嗤陌?總之,將會(huì)在以后的ANTLR版本中給出。這里有一個(gè)簡單的使用例子:

          public static void main(String args[]) {
          // 創(chuàng)建樹結(jié)點(diǎn)
          ASTFactory factory = new ASTFactory();
          CommonAST r = (CommonAST)factory.create(0, "ROOT");
          r.addChild((CommonAST)factory.create(0, "C1"));
          r.addChild((CommonAST)factory.create(0, "C2"));
          r.addChild((CommonAST)factory.create(0, "C3"));
          ASTFrame frame = new ASTFrame("AST JTree Example", r);
          frame.setVisible(true);
          }
          Version: $Id: //depot/code/org.antlr/release/antlr-2.7.6/doc/sor.html#1 $
          posted @ 2007-10-29 22:26 CowNew開源團(tuán)隊(duì) 閱讀(4556) | 評(píng)論 (5)編輯 收藏

          寫存儲(chǔ)過程的時(shí)候,發(fā)現(xiàn)一有意思的現(xiàn)象:語句大概有1k多行,在編譯的時(shí)候提示:
          [IBM][CLI Driver][DB2/HP64] SQL0101N  語句太長或者太復(fù)雜。  SQLSTATE=54001
          然后就是粗略的優(yōu)化SQL語句了,什么能不要的全不要,能折行的就折行,但是,效果還是一樣。
          最后,就只能用這招了:更改SQL堆的大小!
          把默認(rèn)的堆值放大一倍后,執(zhí)行順利通過!
          -- Start of generated script for NO CONNECTION
          --  Dec-20-2006 at 13:20:35
          #ATTACH NDE4C3D4;
          UPDATE DATABASE CONFIGURATION
            FOR FWMY USING
              stmtheap 50000
            IMMEDIATE;
          DETACH;
          #SYNC 10;
           
          -- End of generated script for NO CONNECTION

          from:http://blog.sina.com.cn/s/blog_55fc875c010007zj.html
          posted @ 2007-10-28 16:56 CowNew開源團(tuán)隊(duì) 閱讀(462) | 評(píng)論 (0)編輯 收藏

                  本書系統(tǒng)地介紹了SWT、Draw2D、GEF、JET等與Eclipse插件開發(fā)相關(guān)的基礎(chǔ)知識(shí),并且以實(shí)際的開發(fā)案例來演示這些知識(shí)的實(shí)戰(zhàn)性應(yīng)用,通過對(duì)這些實(shí)際開發(fā)案例的學(xué)習(xí),讀者可以非常輕松地掌握Eclipse插件開發(fā)的技能,從而開發(fā)出滿足個(gè)性化需求的插件。.
                  本書以一個(gè)簡單而實(shí)用的枚舉生成器作為入門案例,通過該案例讀者能學(xué)習(xí)到擴(kuò)展點(diǎn)、SWT、JET等Eclipse插件開發(fā)的基本技能;接著對(duì)Eclipse插件開發(fā)中的基礎(chǔ)知識(shí)進(jìn)行了介紹,并且對(duì)屬性視圖的使用做了重點(diǎn)介紹;最后以兩個(gè)具有一定復(fù)雜程度的插件(Hibernate建模工具和界面設(shè)計(jì)器)為案例介紹了SWT、Draw2D、GEF、JET等技術(shù)的綜合運(yùn)用。..
          本書不僅適合于Eclipse插件開發(fā)初學(xué)者學(xué)習(xí),對(duì)于有一定相關(guān)開發(fā)經(jīng)驗(yàn)的開發(fā)人員也具有很高的參考價(jià)值。

          Chinapub購買地址:http://www.china-pub.com/computers/common/info.asp?id=36806

          本書隨書光盤下載地址:http://www.namipan.com/d/b8879fd74ea3e2b2fd092bb3c7550352f5c6f49765b57b00
          posted @ 2007-10-24 22:44 CowNew開源團(tuán)隊(duì) 閱讀(480) | 評(píng)論 (3)編輯 收藏

          今天寫了一個(gè)Maxthon的“進(jìn)入編輯模式”插件,可以用來破解防復(fù)制的網(wǎng)頁。插件機(jī)制真是爽呀,看來我的《網(wǎng)頁復(fù)制大師》要徹底退休了,呵呵。
          點(diǎn)此下載:http://www.aygfsteel.com/Files/huanzhugege/editit.zip

          maxhon已經(jīng)收錄本插件:http://addons.maxthon.com/post/2007/10/23/進(jìn)入編輯模式
          posted @ 2007-10-24 00:12 CowNew開源團(tuán)隊(duì) 閱讀(460) | 評(píng)論 (0)編輯 收藏

          CowNewSQL多數(shù)據(jù)庫翻譯器在線演示已經(jīng)開發(fā)完成,歡迎體驗(yàn)
          http://211.99.196.18:6666/cownewdemo

          由于訪問人數(shù)眾多,如果暫時(shí)無法訪問,請(qǐng)稍后再試。
          目前已經(jīng)支持SQLServer、DB2、MySQL、Oracle四種數(shù)據(jù)庫管理系統(tǒng)。
          CowNewSQL源碼和二進(jìn)制包可以從CowNew網(wǎng)站(http://www.cownew.com )下載。
          **********************************************
                 由于種種原因,各個(gè)數(shù)據(jù)庫系統(tǒng)的SQL語句語法以及支持的函數(shù)都不盡相同,這造成了如下兩個(gè)問題:(1)使得系統(tǒng)在多個(gè)不同數(shù)據(jù)庫之間移植變得非常困難,特別是需要維護(hù)多個(gè)數(shù)據(jù)庫版本的時(shí)候;(2)開發(fā)人員必須對(duì)各種數(shù)據(jù)庫的語法差異非常了解,這加大了開發(fā)難度。

                 雖然Hibernate通過HQL等技術(shù)部分的解決了跨數(shù)據(jù)庫移植的問題,但是在對(duì)性能要求比較高的場合還是需要直接使用SQL語句訪問數(shù)據(jù)庫的,在這種情況下如何編寫能被不同數(shù)據(jù)庫支持的SQL語句就成了。目前解決這種差異的最常用的技術(shù)就是SQL語句翻譯,使用SQL翻譯器可以將SQL語句翻譯為在不同的數(shù)據(jù)庫中支持的特定平臺(tái)的SQL語句。CowNewSQL就是這樣一款產(chǎn)品。

                 CowNewSQL簡化了跨數(shù)據(jù)庫產(chǎn)品的開發(fā),比如取當(dāng)前日期在MSSQL中是“SELECT GETDATE()”,在MYSQL中是“SELECT NOW()”,在Oracle中是“SELECT SYSDATE FROM DUAL”,使用CowNewSQL以后您只要使用“SELECT NOW()”,那么CowNewSQL就會(huì)為您自動(dòng)將其翻譯為對(duì)應(yīng)數(shù)據(jù)庫平臺(tái)支持的SQL語句,而且CowNewSQL的兼容性也非常好,比如“SELECT NOW()”寫成“SELECT GETDATE()”同樣可以被正確的翻譯;取數(shù)據(jù)庫前10條記錄,在MSSQL中是“Select top 10 from T_1”、在MYSQL中是“SELECT  LIMIT 0, 10 ”、在Oracle中是“SELECT  FROM DUAL WHERE ROWNUM <= 10”,使用CowNewSQL以后您只要使用“Select top 10 from T_1”,那么CowNewSQL就會(huì)為您自動(dòng)將其翻譯為對(duì)應(yīng)數(shù)據(jù)庫平臺(tái)支持的SQL語句。

                 CowNewSQL還通過變通的方式對(duì)目標(biāo)數(shù)據(jù)庫不直接支持的語法進(jìn)行了支持。比如MYSQL是不支持“select * from t1 where fid in(select fid from t2 limit 0,5)”這樣在子查詢中的Limit語句的,CowNewSQL通過將子查詢進(jìn)行二次結(jié)果集包裝的方式巧妙的對(duì)其進(jìn)行了支持,“delete from T_SaleInvoice where FId in(select top 5 FParentId from T_SaleInvoiceDetails)”通過CowNewSQL的翻譯以后就成了“DELETE FROM T_SaleInvoice WHERE FId IN (select * from(SELECT FParentId FROM T_SaleInvoiceDetails LIMIT 0, 5 ) t_temp_sub)”這樣被MYSQL支持的語法了;MYSQL中沒有提供計(jì)算兩個(gè)日期之間月份差異的函數(shù),CowNewSQL通過組合其他日期函數(shù)的方式模擬了這個(gè)函數(shù),這樣使用者只要使用MONTHS_BETWEEN函數(shù)即可了,無需關(guān)心內(nèi)部的差異。

                 CowNewSQL支持如下幾種類型的SQL語句:CreateTable/DropTable/CreateIndex/DropIndex/Select/Insert/Delete/Update;支持子查詢、JoinUnion等高級(jí)的SQL特性;支持日期(包括取當(dāng)前日期、從日期中提取任意部分、計(jì)算日期差異、日期前后推算等)、數(shù)學(xué)(包括取絕對(duì)值、取PI值、四舍五入、對(duì)數(shù)計(jì)算、隨機(jī)數(shù)等)、字符串(包括取子字符串、取字符串長度、字符串截?cái)唷⒋笮戅D(zhuǎn)換等)、基本數(shù)據(jù)處理(包括數(shù)字字符串互轉(zhuǎn)、日期轉(zhuǎn)字符串、非空判斷等)等函數(shù)。

          posted @ 2007-10-21 23:39 CowNew開源團(tuán)隊(duì) 閱讀(1394) | 評(píng)論 (10)編輯 收藏

          自從2005年底discuz 4.0宣布開源以來,國內(nèi)很多程序都陸續(xù)宣布開源,個(gè)個(gè)都把開源當(dāng)作一把大旗來鼓吹自己,但它們真的是開源了嗎?

          dedecms是國內(nèi)用戶最多的CMS,自己搞了個(gè)協(xié)議。
          discuz最初叫CDB,基于XMB 1.5 Silver開發(fā)的,CDB代碼中也寫了遵循BSD許可協(xié)議,但CDB后來名字變?yōu)閐iscuz,discuz1.X已經(jīng)去除了BSD授權(quán)說明……
          cmsware也很可笑,減少了加密文件的數(shù)量,就宣稱自己在“走向開源”。
          上個(gè)月PHPCMS宣布開源了,下載了個(gè)看看,里面竟然連個(gè)license說明文件都沒?難道沒有任何約束和限制?

          希望這些國內(nèi)的優(yōu)秀程序更規(guī)范一些,開源不僅僅是讓別人看到源代碼,也不僅僅是供別人免費(fèi)使用,這不是開源的精神,開源的真正目的是讓更多的人參與進(jìn)來,讓軟件更完美。

          from :http://news.csdn.net/n/20071019/109739.html
          posted @ 2007-10-20 10:27 CowNew開源團(tuán)隊(duì) 閱讀(418) | 評(píng)論 (0)編輯 收藏

              今天用通訊前置配置工具連接BICE修改其中的參數(shù),重啟BICE以后BICE報(bào)錯(cuò)“SAXException:文件過早結(jié)束”,用通訊前置配置工具再次連接也連不上了,而行科技處的人用他們的通訊前置配置工具修改則沒事。檢查配置工具的版本也一樣。
              最后琢磨出來的原因:BICE服務(wù)器(包括配置服務(wù)器)是運(yùn)行的JDK1.4,我機(jī)器上的JDK是1.6.所以用通訊前置配置工具修改以后保存的XML格式文件就是JDK1.6能識(shí)別的了(呵呵,貌似和XML的語言無關(guān)的理念有沖突呀),這樣到JDK1.4中就識(shí)別錯(cuò)誤了。經(jīng)過驗(yàn)證也是確實(shí)是這個(gè)原因。
              我用的是最懶的人的解決方法:把JRE1.4拷貝到通訊前置配置工具的目錄下(命名為jre1.4),然后修改通訊前置配置工具的啟動(dòng)腳本run.bat為:
          start ./jre1.4/bin/javaw.exe -cp
          ./lib/commons-httpclient-2.0-beta1.jar;./lib/commons-logging.jar;./lib/jgraph.jar;./lib/PropertyPanel.jar;./lib/Utility.jar;./lib/xalan.jar;./lib/tools.jar;./lib/workflow.jar;./lib/org.mortbay.jetty.jar
          cn.com.icbc.bice.ui.ConfigMainPanel

              一切OK!




          posted @ 2007-10-19 19:01 CowNew開源團(tuán)隊(duì) 閱讀(551) | 評(píng)論 (0)編輯 收藏

           

          VirtualBoxforLinuxHost-Only設(shè)定

          類似VMwareHost-only的作法,需要建立虛擬網(wǎng)卡和GuestOS來通訊。

          工具 tunctl 可從 uml-utilities套件中取得。

          建立虛擬網(wǎng)卡:

          # tunctl -t vmnet1(網(wǎng)卡名稱可自定) -u atsiv(使用者名稱)

          此時(shí)用ifconfig -a 查看會(huì)多出一個(gè)虛擬網(wǎng)卡界面。

          # chmod 666 /dev/net/tun

          為虛擬網(wǎng)卡設(shè)定 IP (私有private ip)

          # ifconfig vmnet1 192.168.0.1 netmask 255.255.255.0

          VirtualBox的設(shè)定:

          Attached to 選擇 Host Interface

          Interface Name 鍵入 vmnet1(就是上面所設(shè)的名稱)

          然后在GuestOS中設(shè)定同網(wǎng)段的IP,例如 192.168.0.2

          HostOSGuestOSPing看看是否可連通。

          若要讓GuestOS也可架站或連上網(wǎng)絡(luò),則可在HostOS中用iptables設(shè)定DNAT, SNAT即可。

          刪除 虛擬網(wǎng)卡

          # tunctl -d vmnet1

          目前用CentOS 4.4 母機(jī)養(yǎng)了一只Win2K小機(jī)。

          轉(zhuǎn)貼自:http://www.xuniji.com/forum/view.asp?id=7661&p=1&page=1

          楊中科注:如果按照上面方法設(shè)置還ping不通的話,請(qǐng)查看是否是防火墻的問題,可以將GuestOSHostOS的防火墻的ping規(guī)則放開。由于我是用VirtualBox做沒有網(wǎng)絡(luò)環(huán)境時(shí)候的數(shù)據(jù)庫服務(wù)器用的,不會(huì)有網(wǎng)絡(luò)攻擊的問題,所以我干脆直接將兩個(gè)系統(tǒng)的防火墻都關(guān)掉了。對(duì)于HostOS來說只要關(guān)閉針對(duì)于虛擬網(wǎng)卡的防火墻就可以了。

          posted @ 2007-10-17 22:16 CowNew開源團(tuán)隊(duì) 閱讀(788) | 評(píng)論 (0)編輯 收藏

          設(shè)定lib包下所有的jar到classpath
          1、windows下的方法:
          首先創(chuàng)建文件setenv.bat,內(nèi)容如下:
          set CLASSPATH=.\bin\
          for %%f in (".\lib\*.jar") do call cpappend.bat %%f

          然后創(chuàng)建主腳本:
          if "%OS%" == "Windows_NT" setlocal
          call setenv.bat
          java cn.com.agree.isbp.schedule.Startup
          if "%OS%" == "Windows_NT" endlocal
          2、Linux下的方法:
          首先創(chuàng)建文件setenv.sh,內(nèi)容如下:
          #!/bin/sh
          CP=./bin/
          for i in ./lib/*.jar
          do
              CP="$i:$CP"
          done
          export CP
          然后創(chuàng)建主腳本:
          #!/bin/sh
          source setenv.sh
          java -cp "$CP" cn.com.agree.isbp.schedule.Startup &

          posted @ 2007-10-12 15:57 CowNew開源團(tuán)隊(duì) 閱讀(900) | 評(píng)論 (0)編輯 收藏

          今天需要為產(chǎn)品增加Linux下的啟動(dòng)腳本,編寫完成運(yùn)行以后發(fā)現(xiàn)不能正常執(zhí)行,而是提示:
          'etenv.sh:line 4:syntax error near unexpected token do
          檢查腳本沒有發(fā)現(xiàn)任何語法問題。經(jīng)過自己研究發(fā)現(xiàn)是不同的系統(tǒng)下?lián)Q行符造成的。我是在Windows下的Eclipse中編寫的腳本,然后通過虛擬機(jī)的共享目錄方式傳遞到虛擬機(jī)中的Linux中的,這樣換行符就是Windows格式的了,使用Dos2Unix等工具或者直接使用UE的DOS轉(zhuǎn)Unix功能轉(zhuǎn)換以后就正常了。
          posted @ 2007-10-12 15:43 CowNew開源團(tuán)隊(duì) 閱讀(2001) | 評(píng)論 (0)編輯 收藏

          僅列出標(biāo)題
          共30頁: First 上一頁 7 8 9 10 11 12 13 14 15 下一頁 Last 
          主站蜘蛛池模板: 乐东| 姚安县| 雅安市| 枣强县| 馆陶县| 泸溪县| 新乡市| 安康市| 临城县| 汝城县| 临洮县| 衡水市| 沅江市| 三门峡市| 博湖县| 莱阳市| 临颍县| 阿勒泰市| 苏尼特左旗| 略阳县| 博湖县| 皮山县| 鄂尔多斯市| 陇西县| 泽州县| 萨嘎县| 龙陵县| 义马市| 宁都县| 临泽县| 新邵县| 准格尔旗| 藁城市| 内乡县| 广元市| 双辽市| 宁化县| 安义县| 桂林市| 永寿县| 右玉县|