糊言亂語(yǔ)

          志未半斤, 才無(wú)八兩. 有苦有樂(lè), 糊涂過(guò)活。
          posts - 25, comments - 7, trackbacks - 0, articles - 42
            BlogJava :: 首頁(yè) :: 新隨筆 :: 聯(lián)系 :: 聚合  :: 管理

          2007年9月5日

          image

          posted @ 2008-07-11 11:25 Stanley Sun 閱讀(337) | 評(píng)論 (0)編輯 收藏

          眾所周知在計(jì)算機(jī)中所有的數(shù)據(jù)都是以二進(jìn)制的方式存儲(chǔ)的。不管是int,String,float等等不同的數(shù)據(jù)類(lèi)型,最終都會(huì)保存為01的形式。那么為什么要使用這種方式儲(chǔ)存數(shù)據(jù)呢?

          因?yàn)橛?jì)算機(jī)是一種電子設(shè)備,由復(fù)雜的電子元器件組合而成,一個(gè)電子元器件有帶電和不帶電兩種狀態(tài),通常我們將帶電狀態(tài)表示為數(shù)值1,不帶電狀態(tài)表示為數(shù)值0,多個(gè)這樣的元器件的組合可以表示更多狀態(tài),也就是可以表示更多的數(shù)據(jù),如000表示0,001表示1,010表示2,011表示3,依此類(lèi)推,111表示 7,一個(gè)元器件可表示一位(bit)數(shù)據(jù),這種表示數(shù)據(jù)的方式就叫二進(jìn)制。
          在實(shí)際的電子設(shè)備中,我們將8個(gè)這樣的元器件形成一個(gè)單元,這樣的單元叫一個(gè)字節(jié)(byte),一個(gè)字節(jié)能表示多少個(gè)數(shù)呢?表示數(shù)值的范圍是0-255。
          一個(gè)字節(jié)由8個(gè)二進(jìn)位組成,其中最右邊的一位稱(chēng)為“最低有效位”或“最低位”,最左邊的一位稱(chēng)為“最高有效位”或“最高位”。每一個(gè)二進(jìn)位的值是0或1。

          二進(jìn)制計(jì)數(shù)的缺點(diǎn):書(shū)寫(xiě)太長(zhǎng),容易出錯(cuò),一般計(jì)算機(jī)的數(shù)據(jù)位數(shù)都是4的整數(shù)倍,所以,在計(jì)算機(jī)里通常采用16進(jìn)制計(jì)數(shù)法。用數(shù)字可以表示各種信息,計(jì)算機(jī)里只有數(shù)值,當(dāng)你在內(nèi)存中看到一個(gè)數(shù)值時(shí),這個(gè)數(shù)值可能代表各種意義,生活中的數(shù)值也可以代表其他意義,如1234可以代表密碼,存款額,電報(bào)信息,根據(jù)上下線(xiàn)索,我們就能夠知道這數(shù)值代表的意義

           

          但是在Java中到底是如何去保存數(shù)據(jù)的呢?下面我就以int數(shù)據(jù)類(lèi)型為例說(shuō)明Java的方式。

          大家都知道在Java中規(guī)定1 int = 4 byte, 1 byte = 8 bit。以此推理那么1個(gè)int在計(jì)算機(jī)中就是以4 * 8 = 32位(bit)的方式存儲(chǔ)的。而又由于java中的int是屬于有符號(hào)類(lèi)型(Java中不存在unsigned類(lèi)型),所以32位的高一位是符號(hào)位,由此可以推理出int的儲(chǔ)存大小區(qū)間

          Integer.MAX_VALUE = 2147483647(十進(jìn)制) = 1111111 11111111 11111111 11111111(二進(jìn)制)
          Integer.MIN_VALUE = -2147483648(十進(jìn)制) = 10000000 00000000 00000000 00000000(二進(jìn)制)

          現(xiàn)在我們知道了二進(jìn)制的概念了,但是其實(shí)二進(jìn)制我想我們想象的那么單純的表示的,他們是不同的表現(xiàn)方式如:原碼,反碼,補(bǔ)碼

        1. 原碼
          將最高位作為符號(hào)位(以0代表正,1代表負(fù)),其余各位代表數(shù)值本身的絕對(duì)值(以二進(jìn)制表示)。
                      為了簡(jiǎn)單起見(jiàn),我們用1個(gè)字節(jié)來(lái)表示一個(gè)整數(shù)。
                      +7的原碼為: 00000111
                       -7的原碼為: 10000111
        2. 反碼
                一個(gè)數(shù)如果為正,則它的反碼與原碼相同;一個(gè)數(shù)如果為負(fù),則符號(hào)位為1,其余各位是對(duì)原碼取反。
                      為了簡(jiǎn)單起見(jiàn),我們用1個(gè)字節(jié)來(lái)表示一個(gè)整數(shù)。
                      +7的反碼為: 00000111
                       -7的反碼為: 11111000
        3. 補(bǔ)碼
              利用溢出,我們可以將減法變成加法。
              對(duì)于十進(jìn)制數(shù),如果從9得到結(jié)果5,可以用減法:
                   9-4=5
                因?yàn)?+6=10,我們將6作為4的補(bǔ)數(shù),將上式的減法改寫(xiě)為加法:
                   9+6=15
                去掉高位1(也就是減去10),得到結(jié)果5。
                對(duì)于16進(jìn)制數(shù),如果從C得到結(jié)果5,可以用減法:
                   C-7=5
                因?yàn)?+9=16,我們將9作為7的補(bǔ)數(shù),將上式的減法改寫(xiě)為加法:
                   C+9=15
                去掉高位1(也就是減去16),得到結(jié)果5。
                在計(jì)算機(jī)中,如果我們用1個(gè)字節(jié)表示一個(gè)數(shù),一個(gè)字節(jié)有8位,超過(guò)8位就進(jìn)1,在內(nèi)存中情況為:
                     1 00000000
              進(jìn)位1被丟棄。
              一個(gè)數(shù)如果為正,則它的原碼、反碼、補(bǔ)碼相同;一個(gè)數(shù)如果為負(fù),則符號(hào)位為1,其余各位是對(duì)原碼取反,然后整個(gè)數(shù)加1。
                      為了簡(jiǎn)單起見(jiàn),我們用1個(gè)字節(jié)來(lái)表示一個(gè)整數(shù)。
                      +7的補(bǔ)碼為: 00000111
                      -7的補(bǔ)碼為:第一步:11111000 (符號(hào)位為,其余各位取反)
                                            第二步:11111001 (整個(gè)數(shù)加1)
                     +0的補(bǔ)碼:00000000;
                     -0的補(bǔ)碼:11111111;(第一步)
                                    100000000;(第二步)
          已知一個(gè)負(fù)數(shù)的補(bǔ)碼,將其轉(zhuǎn)換為十進(jìn)制數(shù),步驟:
                1、先對(duì)各位取反;
                2、將其轉(zhuǎn)換為十進(jìn)制數(shù);
                3、加上負(fù)號(hào),再減去1。
                例如:
                11111010,最高位為1,是負(fù)數(shù),先對(duì)各位取反得00000101,轉(zhuǎn)換為十進(jìn)制數(shù)得5,加上負(fù)號(hào)得-5,再減1得-6。
        4.  

          那么我們就知道了1與-1的二進(jìn)制形式分別為0000000 00000000 00000000 00000001和11111111 11111111 11111111 11111111(Java中的數(shù)據(jù)是以補(bǔ)碼的形式儲(chǔ)存的)了。那么現(xiàn)在我們知道了數(shù)據(jù)是如何儲(chǔ)存的了。那么計(jì)算機(jī)是如何利用這些數(shù)據(jù)進(jìn)行計(jì)算的呢?我們知道在計(jì)算機(jī)的CPU中只有一個(gè)加法器,所有的運(yùn)算都是需要它進(jìn)行的。所以在計(jì)算機(jī)里所有的加減乘除都是轉(zhuǎn)換成加法來(lái)進(jìn)行運(yùn)算的。那么它們是怎么轉(zhuǎn)換的呢?下面我們介紹一下二進(jìn)制的運(yùn)算操作

        5. 位運(yùn)算符
          為了方便對(duì)二進(jìn)制位進(jìn)行操作,Java給我們提供了四個(gè)二進(jìn)制位操作符:
          &          按位與
          |           按位或
          ^          按位異或
          ~          按位取反
        6. 按位
              一個(gè)房間里有兩個(gè)開(kāi)關(guān)控制房間的燈的明暗。當(dāng)兩個(gè)開(kāi)關(guān)同時(shí)處于打開(kāi)狀態(tài)時(shí),燈才能亮。
               開(kāi)關(guān)1                   開(kāi)關(guān)2                         燈的狀態(tài)
                 關(guān)                         關(guān)                              暗
                開(kāi)                          關(guān)                              暗
                關(guān)                          開(kāi)                              暗
                開(kāi)                          開(kāi)                              亮
          結(jié)論:按位與,只有壹(1)壹(1)為1。
        7. 按位
              一個(gè)房間里有兩個(gè)開(kāi)關(guān)控制房間的燈的明暗。當(dāng)任何一個(gè)開(kāi)關(guān)處于打開(kāi)狀態(tài)時(shí),燈就能亮。
              開(kāi)關(guān)1                     開(kāi)關(guān)2                     燈的狀態(tài)
                 關(guān)                         關(guān)                              暗
                開(kāi)                          關(guān)                              亮
                關(guān)                          開(kāi)                              亮
                開(kāi)                          開(kāi)                              亮
          結(jié)論:按位或,只有零(0)零(0)為0。
        8. 按位異或
              一個(gè)房間里有兩個(gè)開(kāi)關(guān)控制房間的燈的明暗。當(dāng)兩個(gè)開(kāi)關(guān)處于不同狀態(tài)時(shí),燈就能亮。
             開(kāi)關(guān)1                    開(kāi)關(guān)2                       燈的狀態(tài)
                關(guān)                          關(guān)                              暗
                開(kāi)                          關(guān)                              亮
                關(guān)                          開(kāi)                              亮
                開(kāi)                          開(kāi)                              暗
          結(jié)論:按位異或,只有零(0)壹(1)或壹(1)零(0)為1。
        9. 按位取反
          結(jié)論:對(duì)二進(jìn)制數(shù)按位取反,即0變成1,1變成0。
        10. Java中有三個(gè)移位運(yùn)算符
          左移:<<              (相當(dāng)于 乘以2)
          帶符號(hào)右移:>>     (相當(dāng)于 除以2)
          無(wú)符號(hào)右移:>>>
            數(shù)            x                   x<<2                 x>>2              x>>>2
          17      00010001    00 01000100      00000100 01     00000100 01
          -17     11101111     11 10111100      11111011 11     00111011 11
        11. posted @ 2008-06-14 15:25 Stanley Sun 閱讀(1073) | 評(píng)論 (0)編輯 收藏

          概念:

          1.數(shù)字摘要:解決在安全的通信環(huán)境下,保證信息的唯一的一種方式。通常使用MD5/SHA-1等算法完成摘要。一般比如大家在網(wǎng)上下載軟件光盤(pán)時(shí)都會(huì)看到一個(gè)MD5值就是起到這個(gè)數(shù)字摘要的作用。在網(wǎng)絡(luò)的環(huán)境中發(fā)送者把消息和數(shù)字摘要一同發(fā)送給接收者,接收者使用發(fā)送者相同的算法對(duì)消息加密,看是否與發(fā)送者發(fā)送過(guò)來(lái)的數(shù)字摘要相同,如果相同就證明消息沒(méi)有給篡改過(guò)。下面是一個(gè)最為簡(jiǎn)單的示例:

          import java.security.*;
          public class myDigest {
            public static void main(String[] args)  {
              myDigest my=new myDigest();
              my.testDigest();
            }
            public void testDigest()
            {
             try {
               String myinfo="我的測(cè)試信息";
              //java.security.MessageDigest alg=java.security.MessageDigest.getInstance("MD5");
                java.security.MessageDigest alga=java.security.MessageDigest.getInstance("SHA-1");
                alga.update(myinfo.getBytes());
                byte[] digesta=alga.digest();
                System.out.println("本信息摘要是:"+byte2hex(digesta));
                //通過(guò)某中方式傳給其他人你的信息(myinfo)和摘要(digesta) 對(duì)方可以判斷是否更改或傳輸正常
                java.security.MessageDigest algb=java.security.MessageDigest.getInstance("SHA-1");
                algb.update(myinfo.getBytes());
                if (algb.isEqual(digesta,algb.digest())) {
                   System.out.println("信息檢查正常");
                 }
                 else
                  {
                    System.out.println("摘要不相同");
                   }
             }
             catch (java.security.NoSuchAlgorithmException ex) {
               System.out.println("非法摘要算法");
             }
            }
            public String byte2hex(byte[] b) //二行制轉(zhuǎn)字符串
              {
               String hs="";
               String stmp="";
               for (int n=0;n<b.length;n++)
                {
                 stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
                 if (stmp.length()==1) hs=hs+"0"+stmp;
                 else hs=hs+stmp;
                 if (n<b.length-1)  hs=hs+":";
                }
               return hs.toUpperCase();
              }
          }
          

          2.電子簽名:對(duì)數(shù)據(jù)信息的發(fā)生者身份的認(rèn)定,它是一種抽象的概念而不是一種具體技術(shù)。實(shí)現(xiàn)電子簽名的技術(shù)手段目前有多種,比如基于公鑰密碼技術(shù)的數(shù)字簽名;或用一個(gè)獨(dú)一無(wú)二的以生物特征統(tǒng)計(jì)學(xué)為基礎(chǔ)的識(shí)別標(biāo)識(shí),例如手印、聲音印記或視網(wǎng)膜掃描的識(shí)別;手書(shū)簽名和圖章的電子圖象的模式識(shí)別;表明身份的密碼代號(hào)(對(duì)稱(chēng)算法);基于量子力學(xué)的計(jì)算機(jī)等等。


          3.數(shù)字簽名:所謂數(shù)字簽名就是利用通過(guò)某種密碼運(yùn)算生成的一系列符號(hào)及代碼組成電子密碼進(jìn)行"簽名",來(lái)代替書(shū)寫(xiě)簽名或印章,對(duì)于這種電子式的簽名在技術(shù)上還可進(jìn)行算法驗(yàn)證,其驗(yàn)證的準(zhǔn)確度是在物理世界中與手工簽名和圖章的驗(yàn)證是無(wú)法相比的。一般實(shí)現(xiàn)數(shù)字簽名的方法是通過(guò)生成的密鑰對(duì)的私鑰對(duì)用戶(hù)生成的數(shù)字消息進(jìn)行DSA(Digital Signature Algorithm (DSA)是Schnorr和ElGamal簽名算法的變種,被美國(guó)NIST作為DSS(DigitalSignature Standard))加密實(shí)現(xiàn)的。實(shí)現(xiàn)代碼如下:

             */
           import java.security.*;
           import java.security.spec.*;
          public class testdsa {
            public static void main(String[] args) throws java.security.NoSuchAlgorithmException,java.lang.Exception {
                  testdsa my=new testdsa();
                  my.run();
            }
            public void run()
            {
            //數(shù)字簽名生成密鑰
            //第一步生成密鑰對(duì),如果已經(jīng)生成過(guò),本過(guò)程就可以跳過(guò),對(duì)用戶(hù)來(lái)講myprikey.dat要保存在本地
            //而mypubkey.dat給發(fā)布給其它用戶(hù)
             if ((new java.io.File("myprikey.dat")).exists()==false) {
                 if (generatekey()==false) {
                     System.out.println("生成密鑰對(duì)敗");
                     return;
                    };
                  }
          //第二步,此用戶(hù)
          //從文件中讀入私鑰,對(duì)一個(gè)字符串進(jìn)行簽名后保存在一個(gè)文件(myinfo.dat)中
          //并且再把myinfo.dat發(fā)送出去
          //為了方便數(shù)字簽名也放進(jìn)了myifno.dat文件中,當(dāng)然也可分別發(fā)送
            try {
            java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("myprikey.dat"));
            PrivateKey myprikey=(PrivateKey)in.readObject();
            in.close();
           // java.security.spec.X509EncodedKeySpec pubX509=new java.security.spec.X509EncodedKeySpec(bX509);
           //java.security.spec.X509EncodedKeySpec pubkeyEncode=java.security.spec.X509EncodedKeySpec
            String myinfo="這是我的信息";    //要簽名的信息
            //用私鑰對(duì)信息生成數(shù)字簽名
            java.security.Signature signet=java.security.Signature.getInstance("DSA");
            signet.initSign(myprikey);
            signet.update(myinfo.getBytes());
            byte[] signed=signet.sign();  //對(duì)信息的數(shù)字簽名
            System.out.println("signed(簽名內(nèi)容)="+byte2hex(signed));
           //把信息和數(shù)字簽名保存在一個(gè)文件中
            java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myinfo.dat"));
            out.writeObject(myinfo);
            out.writeObject(signed);
            out.close();
            System.out.println("簽名并生成文件成功");
            }
            catch (java.lang.Exception e) {
              e.printStackTrace();
              System.out.println("簽名并生成文件失敗");
            };
            //第三步
            //其他人通過(guò)公共方式得到此戶(hù)的公鑰和文件
            //其他人用此戶(hù)的公鑰,對(duì)文件進(jìn)行檢查,如果成功說(shuō)明是此用戶(hù)發(fā)布的信息.
            //
            try {
             java.io.ObjectInputStream in=new java.io.ObjectInputStream(new java.io.FileInputStream("mypubkey.dat"));
             PublicKey pubkey=(PublicKey)in.readObject();
             in.close();
             System.out.println(pubkey.getFormat());
             in=new java.io.ObjectInputStream(new java.io.FileInputStream("myinfo.dat"));
             String info=(String)in.readObject();
             byte[] signed=(byte[])in.readObject();
             in.close();
            java.security.Signature signetcheck=java.security.Signature.getInstance("DSA");
            signetcheck.initVerify(pubkey);
            signetcheck.update(info.getBytes());
            if (signetcheck.verify(signed)) {
            System.out.println("info="+info);
             System.out.println("簽名正常");
            }
            else  System.out.println("非簽名正常");
            }
            catch (java.lang.Exception e) {e.printStackTrace();};
            }
            //生成一對(duì)文件myprikey.dat和mypubkey.dat---私鑰和公鑰,
            //公鑰要用戶(hù)發(fā)送(文件,網(wǎng)絡(luò)等方法)給其它用戶(hù),私鑰保存在本地
            public boolean generatekey()
            {
              try {
            java.security.KeyPairGenerator  keygen=java.security.KeyPairGenerator.getInstance("DSA");
           // SecureRandom secrand=new SecureRandom();
           // secrand.setSeed("tttt".getBytes()); //初始化隨機(jī)產(chǎn)生器
           // keygen.initialize(576,secrand);     //初始化密鑰生成器
            keygen.initialize(512);
            KeyPair keys=keygen.genKeyPair();
          //  KeyPair keys=keygen.generateKeyPair(); //生成密鑰組
            PublicKey pubkey=keys.getPublic();
            PrivateKey prikey=keys.getPrivate();
            java.io.ObjectOutputStream out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("myprikey.dat"));
            out.writeObject(prikey);
            out.close();
            System.out.println("寫(xiě)入對(duì)象 prikeys ok");
            out=new java.io.ObjectOutputStream(new java.io.FileOutputStream("mypubkey.dat"));
             out.writeObject(pubkey);
             out.close();
             System.out.println("寫(xiě)入對(duì)象 pubkeys ok");
             System.out.println("生成密鑰對(duì)成功");
             return true;
            }
            catch (java.lang.Exception e) {
             e.printStackTrace();
             System.out.println("生成密鑰對(duì)失敗");
             return false;
             };
            }
            public String byte2hex(byte[] b)
              {
               String hs="";
               String stmp="";
               for (int n=0;n<b.length;n++)
                {
                 stmp=(java.lang.Integer.toHexString(b[n] & 0XFF));
                 if (stmp.length()==1) hs=hs+"0"+stmp;
                 else hs=hs+stmp;
                 if (n<b.length-1)  hs=hs+":";
                }
               return hs.toUpperCase();
              }
          }    把他的公鑰的信息及簽名發(fā)給其它用戶(hù)
          


          4.PKI(公鑰基礎(chǔ)設(shè)施):

          posted @ 2007-12-05 22:09 Stanley Sun 閱讀(539) | 評(píng)論 (1)編輯 收藏

          安裝完成之后打開(kāi)window->show views-Task Repositories,界面如下圖:


          在空白處右鍵點(diǎn)擊add task repository添加知識(shí)庫(kù),如圖:

          選中Jira,下一步:


          server中填寫(xiě)Jira的地址(http://ycfd.3322.org:88/jira),label隨便填寫(xiě),User ID和Password就是你在Jira上注冊(cè)的帳號(hào)和密碼了,填寫(xiě)完畢之后點(diǎn)Validate Setting,驗(yàn)證成功之后點(diǎn)完成即可。

          在添加完repository后,會(huì)彈出添加query界面。如圖:

          選擇create query using form后點(diǎn)擊next,進(jìn)入query設(shè)置界面,如圖:


          在project中選中fms后點(diǎn)擊finish。這樣就完成了各項(xiàng)設(shè)置
          之后打開(kāi)tasklist視圖:window->show view->other->mylyn->task list

          點(diǎn)擊OK,后打開(kāi)task list視圖,如圖:


          在Task List中你可以看到你的項(xiàng)目中的問(wèn)題和任務(wù)等,雙擊Task會(huì)顯示該Task的詳細(xì)情況:

          在Task List中還能新建Task并提交到Jira,這里就不多說(shuō)了,大家自己嘗試一下。

          posted @ 2007-12-03 16:38 Stanley Sun 閱讀(1361) | 評(píng)論 (0)編輯 收藏

          mylyn是一款開(kāi)源的基于eclipse開(kāi)發(fā)平臺(tái)的任務(wù)管理組件,可以制定自己的本地任務(wù)及在遠(yuǎn)程服務(wù)器(其中包括Bugzilla、Trac 和 JIRA等)中的遠(yuǎn)程任務(wù)。對(duì)于我們現(xiàn)在的項(xiàng)目,使用mylyn就可以方便我們直接的瀏覽在JIRA中的任務(wù),而不必經(jīng)常的登錄JIRA平臺(tái)了。提高了大家的工作效率。

          由于mylyn與在我們現(xiàn)在在項(xiàng)目中使用的eclipse開(kāi)發(fā)平臺(tái)中springide插件有沖突問(wèn)題,所以首先大家需要把springide插件從eclipse中卸載。步驟如下:

          1.在eclipse安裝目錄下找到一個(gè)名為links的文件夾,在這個(gè)文件夾中刪除Springide.link文件。

          2.啟動(dòng)eclipse,不過(guò)與平常不同的是需要在eclipse啟動(dòng)命令中加入-clean參數(shù)。可以直接加入到eclipse快捷方式的目標(biāo)項(xiàng)中。

          此時(shí)eclipse會(huì)把springide插件卸載,之后我們就可以安裝mylyn插件了。在開(kāi)始安裝mylyn之前,大家需要下載附件中的如下三個(gè)文件:mylyn-2.1-e3.3.zip,mylyn-2.1-extras.zip,springide_updatesite_2.0.1_v200708152145.zip

          步驟如下:

          1.設(shè)置本地插件歸檔:進(jìn)入help->software updates->find and install菜單后,選擇search for new features to install后點(diǎn)擊next

          進(jìn)入install界面,如下圖:


          把下載的三個(gè)zip歸檔加入后,點(diǎn)擊finish.

          2.在彈出的updates窗口中選中剛才加入的三個(gè)歸檔,并把springide->integrations->spring ide ajdt integrations去掉后,如下圖:

          之后進(jìn)入授權(quán)界面,選擇i accept后next,如圖:

          3.在彈出的verification窗口中點(diǎn)擊install all開(kāi)始安裝,如圖:

          之后提示是否重啟eclipse,點(diǎn)擊是。

          posted @ 2007-12-03 16:38 Stanley Sun 閱讀(5519) | 評(píng)論 (0)編輯 收藏

          EJBCA是一個(gè)全功能的CA系統(tǒng)軟件,它基于J2EE技術(shù),并提供了一個(gè)強(qiáng)大的、高性能并基于組件的CA。EJBCA兼具靈活性和平臺(tái)獨(dú)立性,能夠獨(dú)立使用,也能和任何J2EE應(yīng)用程序集成。 

          所需軟件:

          1.jdk 1.5 下載地址:http://java.sun.com/

          2.jboss-4.2.0.GA 下載地址:http://www.jboss.com/

          3.jce_policy-1_5_0:下載地址:http://java.sun.com/

          4.apache-ant-1.7.0:http://ant.apache.org/

          5.oracle 10G:

          6.ojdbc14.jar:

          7.ejbca 3.4.5: 下載地址:http://ejbca.sourceforge.net

          安裝步驟:

          1.安裝jdk,jboss,ant,oracle,并把jce,jdbc解壓分別解壓到%JAVA_HOME%\jre\lib\security\與%JBOSS_HOME%\server\default\lib\。

          2.設(shè)置環(huán)境變量,我的配置為:

          ANT_HOME=C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0
          EJBCA_HOME=C:\tool\ejbca\ejbca_3_5_2\ejbca_3_5_2
          JBOSS_HOME=C:\tool\ejbca\jboss-4.2.0.GA\jboss-4.2.0.GA
          JAVA_HOME=C:\Program Files\Java\jdk1.6.0_03
          path=%SystemRoot%\system32;%SystemRoot%;%SystemRoot%\System32\Wbem;C:\tool\ejbca\apache-ant-1.7.0-bin\apache-ant-1.7.0\bin;C:\tool\ejbca\jboss-
          4.2.0.GA\jboss-4.2.0.GA\bin;C:\Program Files\Java\jdk1.6.0_03\bin
          classpath=C:\Program Files\Java\jdk1.6.0_03\lib\tools.jar

          3.在數(shù)據(jù)庫(kù)中創(chuàng)建表空間并添加用戶(hù)EJBCA,在ORACLE中的代碼為:

            創(chuàng)建表空間:

            CREATE TABLESPACE EJBCA DATAFILE 'EJBCA.dbf' SIZE 100m ;

            創(chuàng)建用戶(hù):

          CREATE user EJBCA   identified by "EJBCA"   default tablespace USERS   temporary tablespace TEMP   profile DEFAULT;
          -- Grant/Revoke role privileges
          grant aq_administrator_role to EJBCA with admin option;
          grant dba to EJBCA with admin option;
          -- Grant/Revoke system privileges
          grant unlimited tablespace to EJBCA with admin option;

          4.刪除所有的ejbca\adminweb中的jsp(%EJBCA_HOME%\src\adminweb*.jsp)中的

          <%@ page pageEncoding="ISO-8859-1"%>

            以解決中文亂碼問(wèn)題,下一步也是解決此類(lèi)問(wèn)題。 

          5.把%EJBCA_HOME%\conf\ejbca.properties.sample改名為ejbca.properties,并在ejbca.properties添加如下一行:

          web.contentencoding=GBK

          6.把%EJBCA_HOME%\conf\database.properties.sample改名為database.properties,并更改相應(yīng)的數(shù)據(jù)庫(kù)配置。如下是我的配置:

          datasource.jndi-name=EjbcaDS
          datasource.jndi-name-prefix=java:/
          database.name=oracle
          datasource.mapping=Oracle9i
          database.url=jdbc:oracle:thin:@127.0.0.1:1521:ORCL
          database.driver=oracle.jdbc.driver.OracleDriver
          database.username=ejbca
          database.password=ejbca

            注:datasource.mapping需要選擇與oracle實(shí)際版本最接近的版本。 

          7.在%EJBCA_HOME%\bin中,通過(guò)cmd運(yùn)行ant bootstrap。

          8.啟動(dòng)jboss,在%JBOSS_HOME%\bin,通過(guò)cmd運(yùn)行run。

          9.在%EJBCA_HOME%\bin中,通過(guò)cmd運(yùn)行ant install。

          10.關(guān)閉jboss,并在在%EJBCA_HOME%\bin中,通過(guò)cmd運(yùn)行ant deploy。

          11.再次啟動(dòng)jboss,在%JBOSS_HOME%\bin,通過(guò)cmd運(yùn)行run。

          13.導(dǎo)入在%EJBCA_HOME%\p12目錄中superadmin.p12,默認(rèn)密碼為ejbca。

          注:在第7步時(shí),如出現(xiàn)ANT失敗,可能是由于ejbca的版本問(wèn)題,推薦使用ejbca3.4.5。

          訪(fǎng)問(wèn)地址:http://localhost:8080/ejbca/

          posted @ 2007-12-03 16:33 Stanley Sun 閱讀(1610) | 評(píng)論 (0)編輯 收藏

          一般在有著1年半以上的程序員基本上都是知道這個(gè)厲害的東西的,它對(duì)字符串處理的能力可以說(shuō)是生猛無(wú)比。雖然大家都在使用(有時(shí)候在開(kāi)發(fā)的Code中,有時(shí)候是在我們自己心愛(ài)的Editor里),但是我相信大部分人對(duì)這里禽獸的了解程度只是停留在會(huì)用的層次上。下面我對(duì)它進(jìn)行一下詳細(xì)的說(shuō)明。

          正則表達(dá)式的“祖先”可以一直上溯至對(duì)人類(lèi)神經(jīng)系統(tǒng)如何工作的早期研究。Warren McCulloch 和 Walter Pitts 這兩位神經(jīng)生理學(xué)家研究出一種數(shù)學(xué)方式來(lái)描述這些神經(jīng)網(wǎng)絡(luò)。

          1956 年, 一位叫 Stephen Kleene 的美國(guó)數(shù)學(xué)家在 McCulloch 和 Pitts 早期工作的基礎(chǔ)上,發(fā)表了一篇標(biāo)題為“神經(jīng)網(wǎng)事件的表示法”的論文,引入了正則表達(dá)式的概念。正則表達(dá)式就是用來(lái)描述他稱(chēng)為“正則集的代數(shù)”的表達(dá)式,因此采用“正則表達(dá)式”這個(gè)術(shù)語(yǔ)。

          隨后,發(fā)現(xiàn)可以將這一工作應(yīng)用于使用Ken Thompson 的計(jì)算搜索算法的一些早期研究,Ken Thompson是Unix 的主要發(fā)明人。正則表達(dá)式的第一個(gè)實(shí)用應(yīng)用程序就是 Unix 中的qed 編輯器。

          如他們所說(shuō),剩下的就是眾所周知的歷史了。從那時(shí)起直至現(xiàn)在正則表達(dá)式都是基于文本的編輯器和搜索工具中的一個(gè)重要部分。

          使用正則表達(dá)式
          在典型的搜索和替換操作中,必須提供要查找的確切文字。這種技術(shù)對(duì)于靜態(tài)文本中的簡(jiǎn)單搜索和替換任務(wù)可能足夠了,但是由于它缺乏靈活性,因此在搜索動(dòng)態(tài)文本時(shí)就有困難了,甚至是不可能的。

          使用正則表達(dá)式,就可以:

          測(cè)試字符串的某個(gè)模式。例如,可以對(duì)一個(gè)輸入字符串進(jìn)行測(cè)試,看在該字符串是否存在一個(gè)電話(huà)號(hào)碼模式或一個(gè)信用卡號(hào)碼模式。這稱(chēng)為數(shù)據(jù)有效性驗(yàn)證。
          替換文本。可以在文檔中使用一個(gè)正則表達(dá)式來(lái)標(biāo)識(shí)特定文字,然后可以全部將其刪除,或者替換為別的文字。
          根據(jù)模式匹配從字符串中提取一個(gè)子字符串。可以用來(lái)在文本或輸入字段中查找特定文字。
          例如,如果需要搜索整個(gè) web 站點(diǎn)來(lái)刪除某些過(guò)時(shí)的材料并替換某些HTML 格式化標(biāo)記,則可以使用正則表達(dá)式對(duì)每個(gè)文件進(jìn)行測(cè)試,看在該文件中是否存在所要查找的材料或 HTML 格式化標(biāo)記。用這個(gè)方法,就可以將受影響的文件范圍縮小到包含要?jiǎng)h除或更改的材料的那些文件。然后可以使用正則表達(dá)式來(lái)刪除過(guò)時(shí)的材料,最后,可以再次使用正則表達(dá)式來(lái)查找并替換那些需要替換的標(biāo)記。

          許多種工具都支持正則表達(dá)式(文本編輯器、文字處理軟件、系統(tǒng)工具、數(shù)據(jù)庫(kù)引擎,等等),不過(guò),要想充分挖掘正則表達(dá)式的能力,還是應(yīng)當(dāng)將它作為編程語(yǔ)言的一部分。例如Java、JScript、Visual Basic、VBScript、JavaScript、ECMAScript、C、C++、C#、elisp、Perl、Python、Tcl、Ruby、PHP、sed和awk。事實(shí)上,在一些用上述語(yǔ)言編寫(xiě)的程序中,正則表達(dá)式扮演了極其重要的角色。
          正則表達(dá)式能夠得到眾多語(yǔ)言和工具的支持是有原因的:它們極其有用。從較低的層面上來(lái)說(shuō),正則表達(dá)式描述的是一串文本(a chunk of text)的特征。大家可以用它來(lái)驗(yàn)證用戶(hù)輸入的數(shù)據(jù),或者也可以用它來(lái)檢索大量的文本。從較高的層面上來(lái)說(shuō),正則表達(dá)式容許用戶(hù)掌控他們自己的數(shù)據(jù)——控制這些數(shù)據(jù),讓它們?yōu)樽约悍?wù)。掌握正則表達(dá)式,就是掌握自己的數(shù)據(jù)。

          可見(jiàn)它的重要性,難怪每款編輯器和編程語(yǔ)言不同程度的實(shí)現(xiàn)了它,使得普通用戶(hù)和開(kāi)發(fā)人員受益不淺。

          posted @ 2007-11-07 23:02 Stanley Sun 閱讀(429) | 評(píng)論 (1)編輯 收藏

           

          treeview 

          在開(kāi)發(fā)B/S程序時(shí),我們經(jīng)常會(huì)使用到一些頁(yè)面級(jí)的效果控件。比如:樹(shù)形目錄,ComboBox和一些其他的控件,由于這些控件的存在使得我們的程序異常的奪目。但是在開(kāi)發(fā)這些控件的時(shí)候或多或少的都會(huì)比較麻煩。而大部分的程序員是使用發(fā)布的一些開(kāi)源的JS控件來(lái)減輕工作量而且也使得自己的程序健壯。下面我介紹一個(gè)在開(kāi)源社區(qū)中赫赫有名的樹(shù)形控件:TreeView。

          首先介紹一下TreeView,TreeView原名是FolderTree,是一款比較早就出世的樹(shù)形JS控件,當(dāng)時(shí)是由個(gè)人開(kāi)發(fā)的,之后由公司購(gòu)買(mǎi)了。但是現(xiàn)在還可以免費(fèi)使用。

          TreeView 有兩個(gè)JS文件和一些資源文件組成。兩個(gè)JS文件分別是:主要實(shí)現(xiàn)功能的ftiens4.js和實(shí)現(xiàn)多瀏覽器支持的ua.js文件。只有我們?cè)陂_(kāi)發(fā)的頁(yè)面中加入如上兩個(gè)文件的話(huà)就可以開(kāi)發(fā)如上圖所顯示的樹(shù)形目錄了。代碼如下:

          <html>

          <head>

          <script type="text/javascript" src="../treeview/ftiens4.js" ></script>

          <script type="text/javascript" src="../treeview/ua.js" ></script>

          <script type="text/javascript">

          //TreeView 環(huán)境變量

          BUILDALL = 0 //創(chuàng)建所有的節(jié)點(diǎn)對(duì)象 0:延時(shí)創(chuàng)建 1:立即創(chuàng)建
          GLOBALTARGET = 'R' //節(jié)點(diǎn)觸發(fā)時(shí)的目標(biāo) 'B':打開(kāi)新窗口 'R':右邊的Frame 'S':當(dāng)前Frame 'T':當(dāng)前瀏覽器窗口
          HIGHLIGHT = 0 //高亮顯示當(dāng)前選中的節(jié)點(diǎn) 0:不高亮顯示 1:高亮顯示
          HIGHLIGHT_BG = 'blue' //高亮顯示的背景顏色
          HIGHLIGHT_COLOR = 'white' //高亮顯示的顏色
          ICONPATH = '' //指定節(jié)點(diǎn)的顯示圖標(biāo),使用URL方式,而且必須用"/"結(jié)尾 如:http://www.x.com/y/
          PRESERVESTATE = 0 //保存TreeView的狀態(tài)到Cookie中,當(dāng)再次顯示的時(shí)候會(huì)自動(dòng)的回置狀態(tài) 0:不保存 1:保存
          STARTALLOPEN = 0 //默認(rèn)打開(kāi)所有節(jié)點(diǎn) 0:只打開(kāi)根節(jié)點(diǎn) 1:打開(kāi)所以節(jié)點(diǎn)
          USEFRAMES = 1 //頁(yè)面是否使用了Frame,注意:如果未使用Frame一定要設(shè)置此參數(shù) 0:未使用 1:使用了
          USEICONS = 1 //是否使用圖標(biāo) 0:不顯示圖標(biāo) 1:顯示圖標(biāo)
          USETEXTLINKS = 0 //節(jié)點(diǎn)文字是否為鏈接 0:否 1:是
          WRAPTEXT = 0 //節(jié)點(diǎn)顯示超出一行時(shí)是否折行 0:不折行 1:折行

          foldersTree = gFld("test", "") //創(chuàng)建一個(gè)名為"test"的根節(jié)點(diǎn)
          foldersTree.treeID = "t1" //設(shè)置test節(jié)點(diǎn)的唯一編號(hào)為"t1"


          aux1 = insFld(foldersTree, gFld("Day of the week", "b.html")) //在根節(jié)點(diǎn)中加入一個(gè)名為"Day of the week"的子節(jié)點(diǎn),當(dāng)點(diǎn)擊的時(shí)候打開(kāi)b.html
          aux1.addChildren([["1","1.html"],["2","2.html"],["3","3.html"],["4","4.html"],["5","5.html"]])  //在aux1節(jié)點(diǎn)中連續(xù)加入1,2,3,4,5節(jié)點(diǎn),并相應(yīng)的打開(kāi)1.html,2.html,3.html,4.html,5.html.

          aux2 = insFld(foldersTree, gLnk("R","Day of the week2", "b.html")) //在根節(jié)點(diǎn)中加入名為"Day of the week2"的節(jié)點(diǎn),當(dāng)點(diǎn)擊的時(shí)候在右側(cè)的frame中打開(kāi)b.html
          aux3 = insDoc(foldersTree, gLnk("R","<input type=\"checkbox\">Day of the week3", "c.html")) //在根節(jié)點(diǎn)中加入名為"Day of the week3"并帶有復(fù)選框的節(jié)點(diǎn),當(dāng)點(diǎn)擊的時(shí)候在右側(cè)的frame中打開(kāi)c.html

          </script>

          </head>

          <body>

          <A style="font-size:7pt;text-decoration:none;color:silver" href=" target=_blank>Javascript Tree Menu</A>

          <script type="text/javascript">

                 initializeDocument();//構(gòu)造TreeView

          </script>

          </body>

          </html>

          TreeView中主要的方法:

          gFld(Title, Link);//創(chuàng)建節(jié)點(diǎn) 例:gFld("Test A", "javascript:parent.op()")

          Argument

          Title
          Specifies the text that appears in the folder name. This text can include simple HTML tags, such as enclosing formatting tags (i, b, div, and so on). It can even include an img tag if you want to place a small icon in the node name, such as a "new!" icon for example.

          Link
          Specifies an optional URL. The URL can be a simple file name like demoFramesetRightFrame.html or a string with protocol, domain, path, and file name like
          http://www.treeview.net/treemenu/demopics/beenthere_europe.gif.

           

          gLnk(Target, Title, Link);//創(chuàng)建一個(gè)帶有鏈接的節(jié)點(diǎn) 例:gLnk("B", "My File", http://www.mysite.com/MyFile.doc)

          Argument

          Target
          Configures the target location for the link. Specify one of the following values:
          "R": Open the document in the right frame (a frame named basefrm)
          "B": Open the document in a new window
          "T": Open the document in the current browser window, replacing the frameset if one exists
          "S": Open the document in the current frame, replacing the tree
          Note: This argument is case sensitive; make sure to use uppercase letters.

          Title
          Specifies the text that appears in the link. This text can include simple HTML tags, such as enclosing formatting tags (i, b, div, and so on). It can even include an img tag if you want to place a small icon in the node name, such as a "new!" icon for example.

          Link
          Specifies the URL of the document. This can be an absolute URL or a relative URL. Do not enter any other information in this string; adding a target parameter or an event handler will not work.

           

          insFld(Parent Folder, Child Folder); //在父節(jié)點(diǎn)中插入一個(gè)子節(jié)點(diǎn) 例:aux1 = insFld(foldersTree, gFld("Europe", "http..."))

          Argument

          Parent Folder
          Specifies the parent folder. That is, this argument specifies the folder node in which you want to place the other folder node.

          Child Folder
          Specifies the child folder. That is, this argument specifies the folder node that you want to place under the parent folder node.

           

          insDoc(Parent Folder, Document Node); //在節(jié)點(diǎn)中加入一個(gè)Dom對(duì)象 例:insDoc(aux2, gLnk("S", "Boston", "..."))

          Argument

          Parent Folder
          Specifies the parent folder. That is, this argument specifies the folder node in which you want to place the document node.

          Document Node
          Specifies the document node. That is, this argument specifies the document node that you want to place in the parent folder node

           

          更多的參考信息到 http://www.treeview.net/tv/instructions.asp

          posted @ 2007-11-07 17:59 Stanley Sun 閱讀(7509) | 評(píng)論 (2)編輯 收藏

              在一年以前一個(gè)客戶(hù)給我推薦一款文件管理軟件,名叫Total Commander,以下簡(jiǎn)稱(chēng)totalcmd,據(jù)說(shuō)在歐美國(guó)家相當(dāng)?shù)牧餍小.?dāng)時(shí)給這個(gè)客戶(hù)開(kāi)發(fā)程序是需要打開(kāi)很多個(gè)資源管理器,在這么多的管理器中相互的拷貝文件真是一件非常頭疼的事情。借助totalcmd可以非常好的完成文件的管理,拷貝、刪除,新建,乃至服務(wù)的管理等等。值得一提的就是totalcmd可以通過(guò)注入插件實(shí)現(xiàn)totalcmd本身不可以完成的功能,這也是它很大的一個(gè)亮點(diǎn)。

          在使用的一年多的totalcmd后,也有了一些自己的使用習(xí)慣和獨(dú)愛(ài)的插件,我將羅列如下:
          使用習(xí)慣:
          1.把F2快捷鍵指定到cm_RenameOnly命令上。
          2.把Ctrl+G快捷鍵指定到cm_FocusCmdLine命令上。
          3.在開(kāi)始菜單下建立一個(gè)功能,實(shí)現(xiàn)cm_SwitchHidSys功能,可以顯示隱藏/系統(tǒng)文件。
          4.指定totalcmd只能運(yùn)行一個(gè)實(shí)例。
          5.最小化到系統(tǒng)托盤(pán)里。
          6.編輯時(shí)默認(rèn)打開(kāi)的編輯器為ChoiceEditor。這個(gè)插件很難找。
          7.把快速查找定義為L(zhǎng)etters with search dialog
          8.當(dāng)改變驅(qū)動(dòng)盤(pán)符的時(shí)候直接定位的驅(qū)動(dòng)的根目錄下

          獨(dú)愛(ài)插件:
          1.Choice Editor:默認(rèn)編輯選擇器。
          2.File Redirector:臨時(shí)目錄,這個(gè)插件非常有用,強(qiáng)烈推薦。不過(guò)安裝的時(shí)候需要下載一個(gè)msvcr70.dll的文件放到你的c:\windows\system32目錄下。文件的下載地址:http://www.dll-files.com/dllindex/dll-files.shtml?msvcr70
          3.UnInstTC:集成在totalcmd中添加/刪除程序,支持搜索。
          4.Office:可以通過(guò)Ctrl+Q快速查看Office系列軟件格式。

          注:本人只是一個(gè)totalcmd的愛(ài)好者,而不是在此為他去大廣告。

          posted @ 2007-10-31 11:07 Stanley Sun 閱讀(671) | 評(píng)論 (0)編輯 收藏

           



                  AutoSuggest是通過(guò)AJAX技術(shù)實(shí)現(xiàn)的一種類(lèi)似于ComboBox之類(lèi)的輸入框,當(dāng)輸入一些提示字符后,AS會(huì)自動(dòng)的把輸入框中的Value通過(guò)AJAX發(fā)送到Server中,Server自定義的解析發(fā)送的數(shù)據(jù),然后把返回?cái)?shù)據(jù)通過(guò)XMLJSON方式返回到AS中。AS再根據(jù)Server返回的標(biāo)準(zhǔn)格式的數(shù)據(jù)構(gòu)建出提示候選框,當(dāng)用鼠標(biāo)或鍵盤(pán)選中候選項(xiàng)后填充到輸入框中。在寫(xiě)這篇手冊(cè)的時(shí)候,AutoSuggest的最新版本是autosuggest_v2.1.3。基本的運(yùn)行原理如上。

          AutoSuggest的主要的物理文件有:bsn.AutoSuggest_2.1.3.jsautosuggest_inquisitor.css。其他的還有一些圖片資源文件,一個(gè)測(cè)試html與一個(gè)test.php的服務(wù)器段頁(yè)面。結(jié)構(gòu)如下:
              

          │ .DS_Store

          │ ._.DS_Store

          │ ._bsn.AutoSuggest_2.
          1.3.html

          │ ._test.php

          │ bsn.AutoSuggest_2.
          1.3.html

          │ test.php



          ├─css

          │ │ .DS_Store

          │ │ ._.DS_Store

          │ │ autosuggest_inquisitor.css

          │ │

          │ └─img_inquisitor

          │      │ .DS_Store

          │      │ ._.DS_Store

          │      │ ._as_pointer.gif

          │      │ ._hl_corner_bl.gif

          │      │ ._hl_corner_br.gif

          │      │ ._hl_corner_tl.gif

          │      │ ._hl_corner_tr.gif

          │      │ ._ul_corner_bl.gif

          │      │ ._ul_corner_br.gif

          │      │ ._ul_corner_tl.gif

          │      │ ._ul_corner_tr.gif

          │      │ as_pointer.gif

          │      │ hl_corner_bl.gif

          │      │ hl_corner_br.gif

          │      │ hl_corner_tl.gif

          │      │ hl_corner_tr.gif

          │      │ ul_corner_bl.gif

          │      │ ul_corner_br.gif

          │      │ ul_corner_tl.gif

          │      │ ul_corner_tr.gif

          │      │

          │      └─_source

          │              .DS_Store

          │              ._.DS_Store

          │              ._as_pointer.png

          │              ._li_corner.png

          │              ._ul_corner.png

          │              as_pointer.png

          │              li_corner.png

          │              ul_corner.png



          └─js

                 .DS_Store

                 ._.DS_Store

                 ._bsn.AutoSuggest_2.
          1.3.js

                 bsn.AutoSuggest_2.
          1.3.js

                 bsn.AutoSuggest_2.
          1.3_comp.js


          AutoSuggest是一組JavaScript類(lèi)庫(kù),其中主要的對(duì)象就是bsn.AutoSggest對(duì)象,基本的功能都是在這個(gè)對(duì)象中完成的。首先我們構(gòu)建一個(gè)簡(jiǎn)單的示例:
              

          var options_xml = {

                                          script:
          function(input){return"suggestAction!userName.action?signer="+input; }//(1).帶有傳送數(shù)據(jù)的請(qǐng)求路徑,其中input是輸入框的value。

                                          varname:
          "input"//(2).儲(chǔ)存輸入框value的變量名

                                          delay:
          800//(3).發(fā)送請(qǐng)求的延時(shí)時(shí)間

                                          cache:
          false//(4).是否緩存

                                          noresults:
          "無(wú)符合的記錄!",//(5).當(dāng)沒(méi)有符合的查詢(xún)結(jié)果時(shí)的提示信息

                                          timeout:
          10000,//(6).候選框停留時(shí)間

                                          callback: 
          function(record){ document.getElementById("temp").value = record.value; } //(7).選擇候選項(xiàng)后的回調(diào)函數(shù)

          }
          ;

          var as_xml = new bsn.AutoSuggest('signer', options_xml); //(8).創(chuàng)建autosuggest對(duì)象,并綁定一個(gè)輸入框




          通過(guò)這樣簡(jiǎn)單的方式我們就可以完成在頁(yè)面中的autosuggest編碼了。其中的參數(shù)表可以看下表:

          Property

          Type

          Default

          Description

          script

          String / Function

          -

          REQUIRED!
          Either: A string containing the path to the script that returns the results in XML format. (eg, "myscript.php?")
          Or: A function that accepts on attribute, the autosuggest field input as a string, and returns the path to the result script.

          varname

          String

          "input"

          Name of variable passed to script holding current input.

          minchars

          Integer

          1

          Length of input required before AutoSuggest is triggered.

          className

          String

          "autosuggest"

          Value of the class name attribute added to the generated ul.

          delay

          Integer

          500

          Number of milliseconds before an AutoSuggest AJAX request is fired.

          timeout

          Integer

          2500

          Number of milliseconds before an AutoSuggest list closes itself.

          cache

          Boolean

          true

          Whether or not a results list should be cached during typing.

          offsety

          Integer

          -5

          Vertical pixel offset from the text field.

          shownoresults

          Boolean

          true

          Whether to display a message when no results are returned.

          noresults

          String

          No results!

          No results message.

          callback

          Function

          A function taking one argument: an object

          {id:"1", value:"Foobar", info:"Cheshire"}

          json

          Boolean

          false

          Whether or not a results are returned in JSON format. If not, script assumes results are in XML.

          maxentries

          Integer

          25

          The maximum number of entries being returned by the script. (Should correspond to the LIMIT clause in the SQL query.)

          之后我們只要在我的服務(wù)器中解析傳入的signer參數(shù)返回,如下格式的xml就可以了。當(dāng)然也可以用JSON方式,不過(guò)我在這里就不在演示了。
              

          <results>

                                          
          <rs id="1" info="">Foobar</rs>

                                          
          <rs id="2" info="">Foobarfly</rs>

                                          
          <rs id="3" info="">Foobarnacle</rs>

          </results>


          AutoSuggest是比較方便的一種實(shí)現(xiàn)類(lèi)Google Suggest的解決方式,提供的js文件也是比較精巧的,并提供的一個(gè)壓縮后的js腳本文件只有8.33 KB大小。如果要查看其代碼可以找到一個(gè)沒(méi)有壓縮的原始版本的源代碼,其中的代碼也是比較容易閱讀,更改起來(lái)也是比較簡(jiǎn)單的。我會(huì)在以后寫(xiě)一篇《AutoSuggest代碼解析》。

          更多信息可查閱 http://www.brandspankingnew.net/archive/2007/02/ajax_auto_suggest_v2.html

          posted @ 2007-10-19 18:17 Stanley Sun 閱讀(2536) | 評(píng)論 (2)編輯 收藏

          在一般的項(xiàng)目中,數(shù)據(jù)庫(kù)主鍵不會(huì)擁有業(yè)務(wù)邏輯。但是在一些數(shù)據(jù)庫(kù)設(shè)計(jì)不是很?chē)?yán)格的項(xiàng)目中還是會(huì)把擁護(hù)業(yè)務(wù)邏輯的字段作為主鍵使用,而且可能回事復(fù)合主鍵。 現(xiàn)在在一個(gè)項(xiàng)目我就遇到這情況。這個(gè)項(xiàng)目的數(shù)據(jù)訪(fǎng)問(wèn)框架使用的Hibernate框架,在對(duì)復(fù)合主鍵的映射是我遇到了一個(gè)Hibernate Bug。我使用的數(shù)據(jù)庫(kù)是Oracle 8i。Hibernate Mapping如下:

          <composite-id name="id" class="InfoViewDetaillistId">

                     <key-property

                        name="accountno"

                        column="ACCOUNTNO"

                        type="string"

                     />

                     <key-property

                        name="rlsdepid"

                        column="RLSDEPID"

                        type="string"

                     />

                     <key-property

                        name="sequenceno"

                        column="SEQUENCENO"

                        type="integer"

                     />

                     <key-property

                        name="ondate"

                        column="ONDATE"

                        type="date"

                     />

          </composite-id>

          在這個(gè)復(fù)合主鍵中包括了四個(gè)擁有業(yè)務(wù)邏輯的字段,分別是帳號(hào),中心號(hào),序號(hào),日期。問(wèn)題就在Hibernate對(duì)日期類(lèi)型的映射上,如使用上面的配置方法的話(huà)Hibernate在啟動(dòng)的時(shí)候就會(huì)報(bào)錯(cuò)。具體的解決方法是把
          <key-property

          name="ondate"

          column="ONDATE"

          type="date"

          />

          替換成

          <key-property name="ondate" type="date">

          <column name="ONDATE" not-null="true" sql-type="java.sql.Types.DATE"/>

          </key-property>

          Bug具體的原因我會(huì)在一會(huì)的文章中解釋。

          posted @ 2007-10-09 12:57 Stanley Sun 閱讀(311) | 評(píng)論 (0)編輯 收藏

          十月放假期間早晨本應(yīng)該在家里舒服的床上呼呼大睡,十月中旬一個(gè)項(xiàng)目就要上線(xiàn),無(wú)奈老板讓所有的員工加班,自己卻跑到埃及去度假。十一期間的交通果然是出奇的好,馬路上零星點(diǎn)點(diǎn)的幾個(gè)人頭,公交車(chē)上一大片一大片的空位子。本應(yīng)該用兩個(gè)多小時(shí)路程卻用了不到一個(gè)半小時(shí)就到了公司,到了公司連在這里住的的小伙還沒(méi)有起床。
          無(wú)聊的打開(kāi)筆記本,聽(tīng)聽(tīng)音樂(lè),上上網(wǎng),出奇的悠哉。呵呵,在哪里是在加班啊。跑到tss網(wǎng)站上看看(本人的英語(yǔ)不是很好,天天強(qiáng)迫自己看看英文網(wǎng)站來(lái)提高英文水平),無(wú)意中發(fā)現(xiàn)TSS里有一個(gè)地方是專(zhuān)門(mén)通過(guò)卡通的形式來(lái)演繹程序員生活中遇到的趣事。如果你身邊有什么有趣的事情的話(huà),還可以投稿給他們。

          posted @ 2007-10-04 09:27 Stanley Sun 閱讀(180) | 評(píng)論 (0)編輯 收藏

          記憶里Java5發(fā)布離現(xiàn)在已經(jīng)有了兩三年了,雖然有不少的貼心的新特性。但是一直無(wú)法撼動(dòng)J2SE 1.4在Java程序員心中的位置。在Java5發(fā)布的時(shí)候我也看過(guò)一些關(guān)于新特性的介紹,泛型、枚舉、注釋、foreach等。當(dāng)時(shí)個(gè)人感覺(jué)其實(shí)除了foreach還算有點(diǎn)吸引眼球,其他的特性只是一種過(guò)度功能。對(duì)于泛型只是在Java編譯器中做的手腳,而在JVM中是不支持的,有點(diǎn)想一個(gè)文字游戲。對(duì)于枚舉,由于本人對(duì)這樣的功能接觸不多,所以就不妄加評(píng)價(jià)了。注釋出現(xiàn)的目的主要是消除XML災(zāi)難,但是有無(wú)法達(dá)到XML不更改Class就可以改變配置。就是憑借的這些想法本人直到Java5發(fā)布后的兩三年一直就沒(méi)有碰過(guò)它,但是在最近的一個(gè)新項(xiàng)目中Java5新特性隨處可見(jiàn),我與其他的Programmer交流了一下發(fā)現(xiàn)現(xiàn)在這些新特性同樣出現(xiàn)在他們的項(xiàng)目中。

          何解?難道大家已經(jīng)不在乎使用的是一個(gè)空中樓閣式的特性,只要能夠圓滿(mǎn)的完成項(xiàng)目?可能Java5新特性有著我看不到的優(yōu)點(diǎn)。

          posted @ 2007-09-26 22:16 Stanley Sun 閱讀(193) | 評(píng)論 (0)編輯 收藏

          對(duì)于有本一族的現(xiàn)代人來(lái)說(shuō),本本為我們的工作提供了很大的方便,但是一般家中還是會(huì)用一臺(tái)臺(tái)式電腦為我們服務(wù)(更加傾向于服務(wù)器的作用)。那么如何方便的鏈接筆記本和家中的臺(tái)式機(jī)一起上網(wǎng)呢。有的使用路由器的方式,這種方式固然高效但是對(duì)于家中沒(méi)有路由的朋友來(lái)說(shuō)就比較郁悶了。這里我介紹一種通過(guò)普通網(wǎng)線(xiàn)來(lái)對(duì)連兩臺(tái)電腦上網(wǎng)的方法。


          設(shè)備:

          1.準(zhǔn)備一根于普通網(wǎng)線(xiàn)差不多的雙機(jī)互連線(xiàn),它不同的只是水晶頭接口的排序方法不同,其他的材料都是一樣的。

          2.需要有一臺(tái)雙網(wǎng)卡的臺(tái)式電腦,我家里的磐正的8RDA3+主板,集成的雙網(wǎng)卡。非常爽。

          方法:

          1. 把臺(tái)式電腦的IP更改為192.168.0.1,這樣當(dāng)筆記本接入的時(shí)候,會(huì)默認(rèn)的通過(guò)這個(gè)IP,去獲取筆記本的IP。

          2. 把臺(tái)式電腦的ADSL鏈接共享,連接的通道選擇雙機(jī)互連線(xiàn)接入的網(wǎng)卡。點(diǎn)擊ADSL連接-->高級(jí)-->Internet連接共享中設(shè)置。

          3. 可能需要重啟一下電腦。此時(shí)不用設(shè)置筆記本的IP地址,一般使用自動(dòng)獲取就行了。如果自己想設(shè)置可以把IP設(shè)置成192.168.0.*,網(wǎng)關(guān)為192.168.0.1,Dns服務(wù)器為192.168.0.1.

          注意:如果筆記本于臺(tái)式電腦的IP不是一個(gè)網(wǎng)段的話(huà),則無(wú)法共享上網(wǎng)。

          現(xiàn)在一切就設(shè)置好了,在臺(tái)式電腦上打開(kāi)ADSL連接后,筆記本就可以一起上網(wǎng)了,是不是非常方便。。。

          posted @ 2007-09-25 20:48 Stanley Sun 閱讀(1174) | 評(píng)論 (0)編輯 收藏

          1 背景假設(shè)

          廈門(mén)央瞬公司是一家電子元器件設(shè)備供應(yīng)商,其中有個(gè)ARM部門(mén),專(zhuān)門(mén)負(fù)責(zé)ARM芯片的方案設(shè)計(jì)、銷(xiāo)售,并在北京、上海各設(shè)立了一個(gè)辦事處。對(duì)于工作日志,原先采用郵件方式發(fā)給經(jīng)理,但是這種方式有個(gè)缺點(diǎn),那就是不具備連續(xù)性,要看以前的日志必須一封一封郵件去查看,很麻煩。于是就想到利用 Subversion,讓員工在自己電腦上編輯日志,然后利用svn傳送回來(lái),既方便員工自己編寫(xiě)日志,又方便對(duì)日志的歸檔處理,而且提交日志的時(shí)候只需要執(zhí)行一下 svn update 即可,比發(fā)送郵件還要簡(jiǎn)單的多。

          • svn服務(wù)器相關(guān)信息

            • 服務(wù)器地址: 192.168.0.1
            • 服務(wù)器OS: MS Windows 2000 Server Edition 中文版
            • 代碼庫(kù)本地目錄: D:\svn\arm
          • arm部門(mén)文檔的目錄結(jié)構(gòu)如下:

            arm                 部門(mén)名稱(chēng)
            ├─diary           工作日志目錄
            │  ├─headquarters    總部工作日志目錄
            │  ├─beijing         北京辦日志目錄
            │  └─shanghai        上海辦日志目錄
            ├─ref             公司公共文件參考目錄
            └─temp            臨時(shí)文件目錄
            
          • 人員情況

            • morson,公司總經(jīng)理,其實(shí)他不必親自看任何東西,就連部門(mén)經(jīng)理們的每周總結(jié)都不一定看。但是為了表示對(duì)他的尊敬,以及滿(mǎn)足一下他的權(quán)力欲,還是給他開(kāi)放了"閱讀所有文檔"的權(quán)限
            • michael,arm事業(yè)部的部門(mén)經(jīng)理,沒(méi)事的時(shí)候喜歡弄點(diǎn)兒新技術(shù),用svn來(lái)管理日志,就是他相處來(lái)的主意
            • scofield,北京辦人員,老員工,為人油滑難管
            • lincon,上海辦人員,老員工,大老實(shí)人一個(gè)
            • linda,總部協(xié)調(diào)員、秘書(shū),文筆不錯(cuò),長(zhǎng)得也不錯(cuò)
            • rory,單片機(jī)技術(shù)員,技術(shù)支持
          • 訪(fǎng)問(wèn)權(quán)限需求分析

            • 允許總經(jīng)理讀取所有文件
            • 除部門(mén)經(jīng)理外,所有其他人員,均只能看到本辦事處人員工作日志
            • 不允許匿名訪(fǎng)問(wèn)
            • ref目錄只允許經(jīng)理和秘書(shū)寫(xiě),對(duì)其他人只讀
            • temp目錄人人都可以寫(xiě)

          2 建立代碼庫(kù)

          在服務(wù)器 D:\svn 目錄下,建立 arm 代碼庫(kù),命令如下:

          D:\svn>svnadmin create arm
          

          在客戶(hù)機(jī) F:\temp 目錄下,建立好上述目錄結(jié)構(gòu)

          用命令 F:\temp>svnimportarmsvn://192.168.0.1/arm 導(dǎo)入結(jié)構(gòu)

          【注意點(diǎn):關(guān)于導(dǎo)入時(shí)候的細(xì)微差別】

          3 編輯代碼庫(kù)基礎(chǔ)配置文件

          編輯代碼庫(kù) arm\conf\svnserve.conf 文件,如下:

          [general]
          password-db = passwd.conf
          anon-access = none
          auth-access = write
          authz-db = authz.conf
          

          4 管理用戶(hù)帳號(hào)

          新建代碼庫(kù) arm\conf\passwd.conf 文件,如下:

          [users]
          morson = ShowMeTheMoney
          michael = mysecretpassword
          scofield = hellolittilekiller
          lincon = asyouknows111
          rory = 8809117
          linda = IlikeWorldCup2006
          

          5 建立目錄訪(fǎng)問(wèn)權(quán)限控制文件

          新建代碼庫(kù) arm\conf\authz.conf 文件,內(nèi)容如下:

          [groups]
          g_vip = morson
          g_manager = michael
          g_beijing = scofield
          g_shanghai = lincon
          g_headquarters = rory, linda
          g_docs = linda
          [arm:/]
          @g_manager = rw
          * = r
          [arm:/diary/headquarters]
          @g_manager = rw
          @g_headquarters = rw
          @g_vip = r
          * =
          [arm:/diary/beijing]
          @g_manager = rw
          @g_beijing = rw
          @g_vip = r
          * =
          [arm:/diary/shanghai]
          @g_manager = rw
          @g_shanghai = rw
          @g_vip = r
          * =
          [arm:/ref]
          @g_manager = rw
          @g_docs = rw
          * = r
          [arm:/temp]
          * = rw
          

          6 測(cè)試

          在服務(wù)器上,打開(kāi)一個(gè) DOS Prompt 窗口,輸入如下指令:

          svn co svn://127.0.0.1/arm --no-auth-cache --username rory --password 8809117
          

          我們應(yīng)該得到如下目錄結(jié)構(gòu):

          arm
          ├─diary
          │  └─headquarters
          ├─ref
          └─temp
          

          然后修改ref目錄下任意文件并提交,服務(wù)器將會(huì)報(bào)錯(cuò)"Access deni"

          深入

          本章將詳細(xì)介紹前一章所涉及的兩個(gè)配置文件, svnserve.conf 和 authz.conf,通過(guò)對(duì)配置逐行的描述,來(lái)闡明其中的一些細(xì)節(jié)含義。

          這里首先要注意一點(diǎn),任何配置文件的有效配置行,都不允許存在前置空格,否則程序會(huì)無(wú)法識(shí)別。也就是說(shuō),如果你直接從本文的純文本格式中拷貝了相關(guān)的配置行過(guò)去,需要手動(dòng)將前置的4個(gè)空格全部刪除。當(dāng)然了,如果你覺(jué)得一下子要?jiǎng)h除好多行的同樣數(shù)目的前置空格是一件苦差使,那么也許 UltraEdit 的"Column Mode"編輯模式,可以給你很大幫助呢。

          1 svnserve.conf

          arm\conf\svnserve.conf 文件,是 svnserve.exe 這個(gè)服務(wù)器進(jìn)程的配置文件,我們逐行解釋如下。

          首先,我們告訴 svnserve.exe,用戶(hù)名與密碼放在 passwd.conf 文件下。當(dāng)然,你可以改成任意的有效文件名,比如默認(rèn)的就是 passwd:

          password-db = passwd.conf
          

          接下來(lái)這兩行的意思,是說(shuō)只允許經(jīng)過(guò)驗(yàn)證的用戶(hù),方可訪(fǎng)問(wèn)代碼庫(kù)。那么哪些是"經(jīng)過(guò)驗(yàn)證的"用戶(hù)呢?噢,當(dāng)然,就是前面說(shuō)那些在 passwd.conf 文件里面持有用戶(hù)名密碼的家伙。這兩行的等號(hào)后面,目前只允許 read write none 三種值,你如果想實(shí)現(xiàn)一些特殊的值,比如說(shuō)"read-once"之類(lèi)的,建議你自己動(dòng)手改源代碼,反正它也是自由軟件:

          anon-access = none
          auth-access = write
          

          接下來(lái)就是最關(guān)鍵的一句呢,它告訴 svnserve.exe,項(xiàng)目目錄訪(fǎng)問(wèn)權(quán)限的相關(guān)配置是放在 authz.conf 文件里:

          authz-db = authz.conf
          

          當(dāng)然,svn 1.3.2 引入本功能的時(shí)候,系統(tǒng)默認(rèn)使用 authz 而不是 authz.conf 作為配置文件。不過(guò)由于鄙人是處女座的,有著強(qiáng)烈的完美主義情結(jié),看著 svnserve.conf 有后綴而 passwd 和 authz 沒(méi)有就是不爽,硬是要改了。

          2 authz.conf 之用戶(hù)分組

          arm\conf\authz.conf 文件的配置段,可以分為兩類(lèi),``[group]`` 是一類(lèi),里面放置著所有用戶(hù)分組信息。其余以 [arm:/] 開(kāi)頭的是另外一類(lèi),每一段就是對(duì)應(yīng)著項(xiàng)目的一個(gè)目錄,其目錄相關(guān)權(quán)限,就在此段內(nèi)設(shè)置。

          首先,我們將人員分組管理,以便以后由于人員變動(dòng)而需要重新設(shè)置權(quán)限時(shí)候,盡量少改動(dòng)?xùn)|西。我們一共設(shè)置了5個(gè)用戶(hù)分組,分組名稱(chēng)統(tǒng)一采用 g_ 前綴,以方便識(shí)別。當(dāng)然了,分組成員之間采用逗號(hào)隔開(kāi):

          [groups]
          # 任何想要查看所有文檔的非本部門(mén)人士
          g_vip = morson
          # 經(jīng)理
          g_manager = michael
          # 北京辦人員
          g_beijing = scofield
          # 上海辦人員
          g_shanghai = lincon
          # 總部一般員工
          g_headquarters = rory, linda
          # 小秘,撰寫(xiě)文檔
          g_docs = linda
          

          注意到?jīng)]有, linda 這個(gè)帳號(hào)同時(shí)存在"總部"和"文檔員"兩個(gè)分組里面,這可不是我老眼昏花寫(xiě)錯(cuò)了,是因?yàn)?svnserve.exe 允許我這樣設(shè)置。它意味著,這個(gè)家伙所擁有的權(quán)限,將會(huì)比他的同事 rory 要多一些,這樣的確很方便。具體多了哪些呢?請(qǐng)往下看!

          3 authz.conf 之項(xiàng)目根目錄

          接著,我們對(duì)項(xiàng)目根目錄做了限制,該目錄只允許arm事業(yè)部的經(jīng)理才能修改,其他人都只能眼巴巴的看著:

          [arm:/]
          @g_manager = rw
          * = r
          
          • [arm:/] 表示這個(gè)目錄結(jié)構(gòu)的相對(duì)根節(jié)點(diǎn),或者說(shuō)是 arm 項(xiàng)目的根目錄
          • 這里的 @ 表示接下來(lái)的是一個(gè)組名,不是用戶(hù)名。你當(dāng)然也可以將 @g_manager=rw 這一行替換成 michael=rw ,而表達(dá)的意義完全一樣。
          • * 表示"除了上面提到的那些人之外的其余所有人",也就是"除了部門(mén)經(jīng)理外的其他所有人",當(dāng)然也包括總經(jīng)理那個(gè)怪老頭
          • * = r 則表示"那些人只能讀,不能寫(xiě)"

          4 authz.conf 之項(xiàng)目子目錄

          然后,我們要給總部人員開(kāi)放日志目錄的讀寫(xiě)權(quán)限:

          [arm:/diary/headquarters]
          @g_manager = rw
          @g_headquarters = rw
          @g_vip = r
          * =
          
          • 我敢打賭,設(shè)計(jì)svn的家伙們,大部分都是在 unix/linux 平臺(tái)下工作,所以他們總喜歡使用 / 來(lái)標(biāo)識(shí)子目錄,而完全忽視在 MS Windows 下是用 \ 來(lái)做同樣的事情。所以這兒,為了表示 arm\diary\headquarters 這個(gè)目錄,我們必須使用 [arm:/diary/headquarters] 這樣的格式。
          • 這里最后一行的 *= 表示,除了經(jīng)理、總部人員、特別人士之外,任何人都被禁止訪(fǎng)問(wèn)本目錄。這一行是否可以省略呢?
          • 之所以這兒需要將 @g_vip=r 一句加上,就是因?yàn)榇嬖谏鲜鲞@個(gè)解釋。如果說(shuō)你沒(méi)有明確地給總經(jīng)理授予讀的權(quán)力,則他會(huì)和其他人一樣,被 * 給排除在外。
          • 如果眾位看官中間,有誰(shuí)玩過(guò)防火墻配置的話(huà),可能會(huì)感覺(jué)上述的配置很熟悉。不過(guò)這里有一點(diǎn)與防火墻配置不一樣,那就是各個(gè)配置行之間,沒(méi)有 先后順序 一說(shuō)。也就是說(shuō),如果我將本段配置的 *= 這一行挪到最前面,完全不影響整個(gè)配置的最終效果。
          • 請(qǐng)注意這兒,我們并沒(méi)有給 arm\diary 目錄設(shè)置權(quán)限,就直接跳到其子目錄下進(jìn)行設(shè)置了。我當(dāng)然是故意這樣的,因?yàn)槲蚁朐谶@兒引入"繼承"的概念。
          • 權(quán)限具備繼承性 任何子目錄,均可繼承其父目錄的所有權(quán)限,除非它自己被明確設(shè)置了其他的權(quán)限。也就是說(shuō),在 arm 目錄設(shè)置權(quán)限后, arm\diary 目錄沒(méi)有進(jìn)行設(shè)置,就意味著它的權(quán)限與 arm 目錄一樣,都是只有經(jīng)理才有權(quán)讀寫(xiě),其他人只能干瞪眼。
          • 【 * = 是否可以省略】【用例子引入覆蓋】【單用戶(hù)權(quán)限的繼承問(wèn)題】【父目錄權(quán)限集成與全面覆蓋問(wèn)題】

          現(xiàn)在來(lái)看看

          好了,我們現(xiàn)在掌握了"繼承"的威力,它讓我們節(jié)省了不少敲鍵盤(pán)的時(shí)間。可是現(xiàn)在又有一個(gè)問(wèn)題了,

          屬性具備覆蓋性質(zhì)子目錄若設(shè)置了屬性,則完全覆蓋父目錄。

          5 authz.conf 的其他注意點(diǎn)

          1. 父目錄的 r 權(quán)限,對(duì)子目錄 w 權(quán)限的影響

          把這個(gè)問(wèn)題專(zhuān)門(mén)提出來(lái),是因?yàn)樵?.3.1及其以前的版本里面,有個(gè)bug,即為了子目錄的寫(xiě)權(quán)限,項(xiàng)目首目錄必須具備讀權(quán)限。因此現(xiàn)在使用了1.3.2版本,就方便了那些想在一個(gè)代碼庫(kù)存放多個(gè)相互獨(dú)立的項(xiàng)目的管理員,來(lái)分配權(quán)限了。比如說(shuō)央舜公司建立一個(gè)大的代碼庫(kù)用于存放所有員工日志,叫做 diary,而arm事業(yè)部只是其中一個(gè)部門(mén),則可以這樣做:

          [diary:/]
          @g_chief_manager = rw
          [diary:/arm]
          @g_arm_manager = rw
          @g_arm = r
          

          這樣,對(duì)于所有arm事業(yè)部的人員來(lái)說(shuō),就可以將 svn://192.168.0.1/diary/arm 這個(gè)URL當(dāng)作根目錄來(lái)進(jìn)行日常操作,而完全不管它其實(shí)只是一個(gè)子目錄,并且當(dāng)有少數(shù)好奇心比較強(qiáng)的人想試著 checkout 一下 svn://192.168.0.1/diary 的時(shí)候,馬上就會(huì)得到一個(gè)警告"Access deni",哇,太酷了。

          1. 默認(rèn)權(quán)限

          如果說(shuō)我對(duì)某個(gè)目錄不設(shè)置任何權(quán)限,會(huì)怎樣?馬上動(dòng)手做個(gè)試驗(yàn),將:

          [diary:/]
          @g_chief_manager = rw
          

          改成:

          [diary:/]
          # @g_chief_manager = rw
          

          這樣就相當(dāng)于什么都沒(méi)有設(shè)置。在我的 svn 1.3.2 版本上,此時(shí)是禁止任何訪(fǎng)問(wèn)。也就是說(shuō),如果你想要讓某人訪(fǎng)問(wèn)某目錄,你一定要顯式指明這一點(diǎn)。這個(gè)策略,看起來(lái)與防火墻的策略是一致的。

          1. 只讀權(quán)限帶來(lái)的一個(gè)小副作用

          若設(shè)置了:

          [arm:/diary]
          * = r
          

          則svnserve認(rèn)為,任何人,都不允許改動(dòng)diary目錄,包括刪除和改名,和新增。

          也就是說(shuō),如果你在項(xiàng)目初期創(chuàng)建目錄時(shí)候,一不小心寫(xiě)錯(cuò)目錄名稱(chēng),比如因拼寫(xiě)錯(cuò)誤寫(xiě)成 dairy,以后除非你改動(dòng) authz.conf 里面的這行設(shè)置,否則無(wú)法利用 svn mv 命令將錯(cuò)誤的目錄更正。

          改進(jìn)

          1 對(duì)中文目錄的支持

          上午上班的時(shí)候,Morson 來(lái)到 Michael 的桌子前面,說(shuō)道:"你是否可以將我們的北京辦、上海辦目錄,改成用中文的,看著那些拼音我覺(jué)得很難受?" Michael 心想,還好這兩天剛了解了一些與 unicode 編碼相關(guān)的知識(shí),于是微笑地回答:"當(dāng)然可以,你明天下午就可以看到中文目錄名稱(chēng)了。"

          1. 使用 svn mv 指令,將原來(lái)的一些目錄改名并 commit 入代碼庫(kù),改名后的目錄結(jié)構(gòu)如下:

            arm
            ├─工作日志
            │  ├─總部人員
            │  ├─北京辦
            │  └─上海辦
            ├─公司公共文件參考目錄
            └─臨時(shí)文件存放處
            
          2. 修改代碼庫(kù)的 authz.conf 文件,將相應(yīng)目錄逐一改名

          3. 使用 UltraEdit 將 authz.conf 文件轉(zhuǎn)換成不帶 BOM 的 UTF-8 格式

            將配置文件轉(zhuǎn)換成 UTF-8 格式之后,Subversion 就能夠正確識(shí)別中文字符了。但是這里需要注意一點(diǎn),即必須保證 UTF-8 文件不包含 BOM 。BOM 是 Byte Order Mark 的縮寫(xiě),指 UNICODE 文件頭部用于指明高低字節(jié)排列順序的幾個(gè)字符,通常是 FFFE ,而將之用 UTF-8 編碼之后,就是 EFBBBF 。由于 UTF-8 文件本身不存在字節(jié)序問(wèn)題,所以對(duì) UTF-16 等編碼方式有重大意義的 BOM,對(duì)于 UTF-8 來(lái)說(shuō),只有一個(gè)作用--表明這個(gè)文件是 UTF-8 格式。由于 BOM 會(huì)給文本處理帶來(lái)很多難題,所以現(xiàn)在很多軟件都要求使用不帶 BOM 的 UTF-8 文件,特別是一些處理文本的軟件,如 PHP、 UNIX 腳本文件等,svn 也是如此。

          目前常用的一些文本編輯工具中,MS Windows 自帶的"記事本"里面,"另存為"菜單保存出來(lái)的 UTF-8 格式文件,會(huì)自動(dòng)帶上 BOM 。新版本 UltraEdit 提供了選項(xiàng),允許用戶(hù)選擇是否需要 BOM,而老版本的不會(huì)添加 BOM。請(qǐng)各位查看一下自己常用的編輯器的說(shuō)明文件,看看它是否支持這個(gè)功能。

          利用 UltraEdit ,我們可以將 BOM 去掉。方法是,首先利用"UTF-8 TO ASCII"菜單將文件轉(zhuǎn)換成本地編碼,通常是GB2312碼,然后再使用"ASCII TO UTF-8(UNICODE Editing)"來(lái)轉(zhuǎn)換到 UTF-8 即可。

          posted @ 2007-09-05 18:15 Stanley Sun 閱讀(145) | 評(píng)論 (0)編輯 收藏

          主站蜘蛛池模板: 扎兰屯市| 横峰县| 灵宝市| 昭平县| 砀山县| 西吉县| 土默特右旗| 鹰潭市| 汶上县| 同德县| 合山市| 霍邱县| 克东县| 汉沽区| 理塘县| 衡东县| 云霄县| 安庆市| 新营市| 柳江县| 山西省| 康马县| 黄浦区| 田阳县| 禄丰县| 汉阴县| 灌南县| 资兴市| 库车县| 宣化县| 荆门市| 柳江县| 炎陵县| 仪陇县| 沙河市| 北辰区| 工布江达县| 无为县| 博客| 彭阳县| 六枝特区|