cerulean

          2007年3月6日

          從上班開(kāi)始沒(méi)多久,就開(kāi)始用Evernote,是portable 2.2版本。
          好記性不如爛筆頭。真的是做到了隨手記,尤其是搜索功能簡(jiǎn)單易用,用來(lái)挖很久以前記下的tips,界面也很簡(jiǎn)潔,明了、夠用。
          備份也方便,反正換了電腦,文件夾直接拷貝,數(shù)據(jù)沒(méi)丟。

          就這樣,一用多少年過(guò)去了。
          如今,“印象筆記”在iphone應(yīng)用推薦榜的筆記類(lèi)里一直居高位,圖標(biāo)也早就不是我v2.2的老土模樣,如果不是英文名字就叫evernote,我完全對(duì)不上號(hào)。
          人家其實(shí)從v3開(kāi)始就不是老土的本地應(yīng)用了,都講究“云”了。

          雖然手頭的v2.2完全滿足我隨手記一記的需求,但是,本著與時(shí)俱進(jìn)和稍微保證一下數(shù)據(jù)的安全性,我還是下了個(gè)最近的v4.x的版本,結(jié)果發(fā)現(xiàn)還是要從v3開(kāi)始才能導(dǎo)入v2的數(shù)據(jù)。嗯,看來(lái)是落后太久了。
          有一點(diǎn)夸獎(jiǎng)一下:免費(fèi)賬戶的每月上傳容量是有限的,但是對(duì)于我這種文本筆記,夠傳3w條的。

          ——嗯,其實(shí),本來(lái)只是個(gè)小軟件的更新而已,竟然跑到blogjava寫(xiě)上一篇,可能是因?yàn)榘殡S感吧,再有點(diǎn)兒時(shí)過(guò)境遷的唏噓。
          posted @ 2012-11-22 11:35 cerulean 閱讀(451) | 評(píng)論 (1)編輯 收藏
          春節(jié)過(guò)后這幾天干的活兒就沒(méi)一件痛痛快快的?
          第一天是發(fā)現(xiàn)編譯環(huán)境有異動(dòng),我以為是代碼有問(wèn)題,折騰了1天多。。。
          第二天是自己機(jī)器上的IE8抽瘋弄得我以為是build有問(wèn)題。。。
          第三天從TimesTen轉(zhuǎn)到Psql的各種毛病。。。

          好吧。言歸正傳:
          1)找一個(gè)跟表無(wú)關(guān)的通用的單純的select語(yǔ)句作為測(cè)試語(yǔ)句不容易啊,
          Dual是Oracle自帶的表,其他DBS木有的。。不用Dual的話Oracle又不認(rèn)。

          2)Cause: org.postgresql.util.PSQLException: Method org.postgresql.jdbc2.Jdbc2PreparedStatement.setQueryTimeout(int) is not yet implemented.
          這個(gè)錯(cuò)誤,把sqlMapConfig.xml中在settings里配置的defaultStatementTimeout去掉就可以避免了。但是,這個(gè)配置對(duì)PSQL應(yīng)該OK啊。。。待查

          【續(xù)】——
          defaultStatementTimeout 確實(shí)不是所有的driver都支持的。
          但去掉的話,TimesTen又不干了:太囧了。。。
          [TimesTen][TimesTen 7.0.5.9.0 CLIENT]Query Timeout must be numeric; if the Network Timeout
          is non-zero, the Query Timeout must be greater than zero and less than the Network Timeout, else if the Network Timeout is zero, the Query Timeout must be greater than or equal to zero.
          兜兜轉(zhuǎn)轉(zhuǎn)又遇到了這個(gè)之前遇到過(guò)的問(wèn)題。這些driver就不能統(tǒng)一統(tǒng)一咩!

          posted @ 2012-02-01 17:32 cerulean 閱讀(1201) | 評(píng)論 (0)編輯 收藏
          parseInt(String s, int radix) 
          Parses the string argument as a signed integer in the radix specified by the second argument.

          今兒頭回用,真是……反省ing

          posted @ 2012-01-18 17:28 cerulean 閱讀(364) | 評(píng)論 (0)編輯 收藏
          文檔寫(xiě)到現(xiàn)在,猛然說(shuō)不上abbreviation 和 acronym 的區(qū)別。。。真是慚愧。。。
          abbreviation:?jiǎn)卧~、語(yǔ)句的縮略形式,縮到短一點(diǎn)兒。
          acronym:“首字母”縮寫(xiě)
          posted @ 2011-12-05 15:21 cerulean 閱讀(505) | 評(píng)論 (0)編輯 收藏
          之前都沒(méi)注意過(guò)有這么個(gè)方法,否則判斷日期格式就太不靠譜了。
          又是晦澀的單詞:setLenient(false),嚴(yán)格匹配日期格式
                  SimpleDateFormat df = new SimpleDateFormat("MMddyyyy");
                  
          /*
                   * With lenient parsing, the parser may use heuristics to interpret inputs that 
                   * do not precisely match this object's format. 
                   * With strict parsing, inputs must match this object's format. 
                   
          */
                  df.setLenient(
          false);
                  
          try {
                      Date a 
          = df.parse("23232011");
                      System.out.print(
          "date: " + a);
                  } 
          catch (java.text.ParseException e) {
                      
          // TODO Auto-generated catch block
                      e.printStackTrace();
                  }

          posted @ 2011-07-18 17:23 cerulean 閱讀(3209) | 評(píng)論 (0)編輯 收藏
          i18n,之前在J2EE里,自然用struts來(lái)做。但是Web Service里貌似應(yīng)該不需要這部分,但是實(shí)際上,有些操作還是避免不了要支持多國(guó)語(yǔ)言。
          查了一圈兒,好像WS-i18n還在working draft的階段,而且好像已經(jīng)好幾年了……也沒(méi)找到什么開(kāi)源中間件的實(shí)現(xiàn)。
          大意是在SOAP header中加上<i18n:international>相關(guān)的標(biāo)簽。
          因?yàn)楫吘故荳eb Service,利用http header還是不太妥,還是要放在SOAP里面。

          記錄一下查到的鏈接,備用。

          http://www.coderanch.com/t/224875/Web-Services/java/Web-Services-Internationalization-jax-ws
          For a SOAP web service the language/country code should be part of the SOAP request and possibly the SOAP response. You can always base your solution on the above WS-I18N working draft.
          Internationalization isn't as big a priority with SOAP web services as it is with web pages as web services are consumed by other applications - not humans. In most cases normalized "generic data" is exchanged which is displayed on the client using the client's locale. SOAP web services exchanging localized text are pretty much in the minority.

          http://www.w3.org/TR/ws-i18n/


          posted @ 2011-06-15 16:49 cerulean 閱讀(283) | 評(píng)論 (0)編輯 收藏
          這回是更加深深地體會(huì)到IDE的重要性了!
          想當(dāng)初要不是eclipse,估計(jì)上手過(guò)程會(huì)很痛苦;
          后來(lái)myeclipse的官方網(wǎng)站竟然封掉了;
          現(xiàn)在,眼巴巴瞅著NetBeans美麗的GUI Builder,假如當(dāng)年Swing那部分是用NetBeans開(kāi)發(fā)的,或者NetBeans可以不要那個(gè).form的文件直接解析代碼,就好了啊!!!
          唉……
          posted @ 2010-08-11 16:32 cerulean 閱讀(328) | 評(píng)論 (0)編輯 收藏
          繁瑣的登陸過(guò)程讓人抓狂,telnet到第一臺(tái)機(jī)器輸入用戶名之前,點(diǎn)擊SecureCRT里menu->Script->Start recording script,錄下接下來(lái)的步驟,然后點(diǎn)擊Stop recording script,就會(huì)提示保存腳本。以后登陸時(shí),選擇Run腳本就可以了。
          posted @ 2010-07-07 08:54 cerulean 閱讀(298) | 評(píng)論 (0)編輯 收藏
          遍歷集合,批量刪除時(shí),遇到ConcurrentModificationException
          因?yàn)椴僮鞯募蠒?huì)在過(guò)程中遇到結(jié)構(gòu)性的改變,例如:
          HashMap<String, String> testMap = new HashMap<String, String>();
                  testMap.put(
          "1""a");
                  testMap.put(
          "2""b");
                  testMap.put(
          "3""c");
                  Set
          <Map.Entry<String,String>> enterySet = testMap.entrySet();
                  

                  
          for(Iterator<Map.Entry<String, String>> i = enterySet.iterator(); i.hasNext();){
                      Map.Entry
          <String, String> entry = i.next();
                      
          if(entry.getValue().equalsIgnoreCase("a")){
                          testMap.remove(entry.getKey());
                      }

                  }


          解決方法:不要在集合上刪除,而是在迭代器上刪除:i.remove();

          p.s.還有另外一個(gè)可能性是多線程同時(shí)操作該集合了,那需要進(jìn)行同步來(lái)避免。
          posted @ 2010-06-11 13:57 cerulean 閱讀(379) | 評(píng)論 (0)編輯 收藏
          引子只是個(gè)小問(wèn)題,JTextArea多行文本,想設(shè)置文字的對(duì)齊方式為居中對(duì)齊,卻發(fā)現(xiàn)死活沒(méi)有合適有效的方法,又試了JTextField和JLabel,都不理想。搜了一溜夠看到JTextPane的解決方法,其實(shí)真是有點(diǎn)兒大材小用了。JTextPane里可以設(shè)置style,對(duì)齊方式、字體字號(hào)、顏色等等,并且還可以設(shè)置style的作用范圍,挺方便的。另外,想把文字區(qū)域背景設(shè)為透明的也是在API中找了一通,才發(fā)現(xiàn)敢情就是setOpacity,呃,對(duì)這個(gè)單詞實(shí)在是太不敏感了。。。。

          把在coderanch上搜的例子貼在這里吧,以防以后忘了:
          import java.awt.*;  
          import javax.swing.*;  
          import javax.swing.text.*;  
             
          public class Styling  
          {  
              
          public Styling()  
              
          {  
                  String text 
          = "To refer to locations within the sequence, the " +  
                                
          "coordinates used are the location between two " +  
                                
          "characters.\nAs the diagram below shows, a location " +  
                                
          "in a text document can be referred to as a position, " +  
                                
          "or an offset. This position is zero-based.";  
             
                  SimpleAttributeSet aSet 
          = new SimpleAttributeSet();   
                  StyleConstants.setForeground(aSet, Color.blue);  
                  StyleConstants.setBackground(aSet, Color.orange);  
                  StyleConstants.setFontFamily(aSet, 
          "lucida bright italic");  
                  StyleConstants.setFontSize(aSet, 
          18);  
             
                  SimpleAttributeSet bSet 
          = new SimpleAttributeSet();  
                  StyleConstants.setAlignment(bSet, StyleConstants.ALIGN_CENTER);  
                  StyleConstants.setUnderline(bSet, 
          true);  
                  StyleConstants.setFontFamily(bSet, 
          "lucida typewriter bold");  
                  StyleConstants.setFontSize(bSet, 
          24);  
             
                  JTextPane textPane 
          = new JTextPane();  
                  textPane.setText(text);  
                  StyledDocument doc 
          = textPane.getStyledDocument();  
                  doc.setCharacterAttributes(
          105, doc.getLength()-105, aSet, false);  
                  doc.setParagraphAttributes(
          0104, bSet, false);  
             
                  JFrame f 
          = new JFrame();  
                  f.setDefaultCloseOperation(JFrame.EXIT_ON_CLOSE);  
                  f.add(
          new JScrollPane(textPane));  
                  f.setSize(
          400,400);  
                  f.setLocation(
          200,200);  
                  f.setVisible(
          true);  
              }
            
             
              
          public static void main(String[] args)  
              
          {  
                  
          new Styling();  
              }
            
          }
            
          posted @ 2010-03-10 17:20 cerulean 閱讀(7901) | 評(píng)論 (1)編輯 收藏
          之前用axis2生成代碼的時(shí)候都沒(méi)有在意過(guò),一路用default configuration下來(lái)。
          前一陣子發(fā)現(xiàn)以前的代碼在生成時(shí)選擇的data binding不是用默認(rèn)的adb方式,而是用xmlbeans。
          google了一番不同數(shù)據(jù)綁定的區(qū)別,好像也沒(méi)什么結(jié)果,大意就是adb的最簡(jiǎn)單,但是有局限性;xmlbeans支持的比較全面,但是用起來(lái)有點(diǎn)兒復(fù)雜。不過(guò),我也沒(méi)有體會(huì)出來(lái)xmlbeans強(qiáng)大在哪里……只是知道生成的代碼更多了,調(diào)用起來(lái)更繞彎子而已。。。

          server端用xmlbeans生成,client端用adb生成,互通是沒(méi)有問(wèn)題的。
          client端用xmlbeans生成時(shí),需要把產(chǎn)生于resources里面的所有.class文件打成jar包加到client端的build path里,否則運(yùn)行client加載類(lèi)的時(shí)候就會(huì)報(bào)錯(cuò)了,好詭異,太不友好了。
          類(lèi)似這種錯(cuò)誤:

          ClassNotFoundException : Cannot load SchemaTypeSystem. Unable to load class with name schemaorg_apache_xmlbeans.system.s68C41DB812F52C975439BA10FE4FEE54.TypeSystemHolder. Make sure the generated binary files are on the classpath.


          所幸是在官方網(wǎng)站上有說(shuō)明:http://ws.apache.org/axis2/tools/1_2/CodegenToolReference.html
          posted @ 2009-12-30 15:59 cerulean 閱讀(694) | 評(píng)論 (0)編輯 收藏
          一個(gè)JNLP文件中的資源必須由同一個(gè)證書(shū)簽名
          當(dāng)需要不同證書(shū)時(shí),可以創(chuàng)建多個(gè)JNLP文件,并在主JNLP文件中引用之。

          遇到過(guò)的問(wèn)題:找不到子JNLP文件中的資源
          解決方法:竟然把子JNLP文件放到比主JNLP文件所在目錄低一級(jí)就可以了?!
          posted @ 2009-11-20 15:13 cerulean 閱讀(483) | 評(píng)論 (0)編輯 收藏

           

          JLabel.setText("<html>auto new line</html>");
          JLabel.setText("<html>line<br>force new line</html>");

           

          posted @ 2009-10-29 11:43 cerulean 閱讀(3451) | 評(píng)論 (1)編輯 收藏
          費(fèi)了半天勁,敢情Firefox在3.0版本后又支持彈出modal window啦
          window.showModalDialog


          posted @ 2009-09-22 15:59 cerulean 閱讀(344) | 評(píng)論 (0)編輯 收藏
          HttpClient.getHttpConnectionManager().getParams().setSoTimeout()
          HttpClient.getHttpConnectionManager().getParams().setConnectionTimeout()

          第一個(gè)針對(duì)連接建立后,但是沒(méi)有收到response的超時(shí)時(shí)間,測(cè)試時(shí)可將server simulator收到request后等一段時(shí)間后再回response。
          出錯(cuò)信息:
          java.net.SocketTimeoutException: Read timed out

          第二個(gè)針對(duì)連接建立的超時(shí)時(shí)間,測(cè)試時(shí)可將目的IP地址設(shè)為不存在的IP地址。
          出錯(cuò)信息:
          org.apache.commons.httpclient.ConnectTimeoutException: The host did not accept the connection within timeout of 8000 ms
                  at org.apache.commons.httpclient.protocol.ReflectionSocketFactory.createSocket(ReflectionSocketFactory.java:154)
          默認(rèn)值為0,如果不設(shè)置的話大概2分多鐘才會(huì)得到異常


          posted @ 2009-09-10 16:09 cerulean 閱讀(5181) | 評(píng)論 (1)編輯 收藏
          導(dǎo)入了某證書(shū)至truststore,建立SSL連接時(shí)遇到錯(cuò)誤
          javax.net.ssl.SSLKeyException: RSA premaster secret error
          Caused by: java.security.InvalidKeyException: Illegal key size or default parameters

          在windows上雙擊查看該證書(shū)時(shí)發(fā)現(xiàn)Public Key是4096bit,查了一番后發(fā)現(xiàn)Java默認(rèn)好像不能處理這么長(zhǎng)的key,必須要按照J(rèn)CE的一個(gè)Unlimited Strength Jurisdiction Policy
          http://java.sun.com/javase/downloads/index_jdk5.jsp里面就有下載,這樣貌似就可以處理這種強(qiáng)度比較高的了。


          posted @ 2009-09-08 17:24 cerulean 閱讀(2089) | 評(píng)論 (0)編輯 收藏
          打印數(shù)組的方法,小地方,卻老忘記,來(lái)自FindBugs的提示:
          The code invokes toString on an array, which will generate a fairly useless result such as [C@16f0472. Consider using Arrays.toString to convert the array into a readable String that gives the contents of the array.

          Arrays提供一系列接收不同類(lèi)型數(shù)組作為參數(shù)的toString方法

          String[] array = new String[]{"a","b","c"};
          System.out.println(Arrays.toString(array));

          posted @ 2009-08-17 15:17 cerulean 閱讀(1180) | 評(píng)論 (0)編輯 收藏
          FindBugs,http://findbugs.sourceforge.net/
          發(fā)現(xiàn)代碼中潛在bug的工具,有eclipse的插件,安裝后右鍵單擊java project name,點(diǎn)擊Find Bugs,切換到FindBugs得perspective可以看到結(jié)果,速度還比較快,比之前用過(guò)的一個(gè)(雖然已經(jīng)記不得名字了)快一些~具體的效果還是要逐個(gè)分析。

          Bug categories:

          Correctness bug
          Probable bug - an apparent coding mistake resulting in code that was probably not what the developer intended. We strive for a low false positive rate.
          Bad Practice
          Violations of recommended and essential coding practice. Examples include hash code and equals problems, cloneable idiom, dropped exceptions, serializable problems, and misuse of finalize. We strive to make this analysis accurate, although some groups may not care about some of the bad practices.
          Dodgy
          Code that is confusing, anomalous, or written in a way that leads itself to errors. Examples include dead local stores, switch fall through, unconfirmed casts, and redundant null check of value known to be null. More false positives accepted. In previous versions of FindBugs, this category was known as Style.
          Multithreaded correctness
               Incorrect lazy initialization and update of static field
               Calls Thread.sleep() with a lock held: better to use wait(lock)
               Synchronization on interned String could deadlock: 最好不用字符串,以免重復(fù)
          Performance
               invokes inefficient new String() constructor
               concatenates strings using + in a loop: better to use append StringBuffer
               inner class usage


          posted @ 2009-08-14 16:04 cerulean 閱讀(993) | 評(píng)論 (0)編輯 收藏
          Server

          創(chuàng)建本地證書(shū):

          keytool -genkey -alias testserver-keyalg RSA -keystore keystore

          其中alias自己起一個(gè)別名,keystore為證書(shū)庫(kù)的文件路徑

          還可以加上-keysize 1024、2048、4096等來(lái)指定公鑰的大小,由此導(dǎo)出的證書(shū)查看時(shí)可以看到公鑰的大小是與之一致的。keysize越大genkey時(shí)耗費(fèi)時(shí)間越長(zhǎng)。


          會(huì)要求鍵入一個(gè)密碼,為這個(gè)證書(shū)庫(kù)的訪問(wèn)密碼

          會(huì)要求填寫(xiě)一些信息,姓名、單位、地區(qū)之類(lèi)

          最后要求鍵入一個(gè)密碼,為這條證書(shū)別名的密碼

          導(dǎo)出cert

          keytool -export -alias testserver-file testcert.cer -keystore keystore

          這里的別名和文件名同上一步


          Client

          直接導(dǎo)入cert

          Truststore文件中存儲(chǔ)的是作為client,信任那些server的證書(shū)。所以需要將server提供的證書(shū)導(dǎo)入進(jìn)來(lái)(當(dāng)然可以導(dǎo)入n個(gè)),client才能信任。

          keytool -import -alias testserver-file testcert.cer -keystore truststore

          導(dǎo)入時(shí)需要輸入密碼,該密碼應(yīng)該是truststore文件的訪問(wèn)密碼,密碼正確才能修改其信息。

          提示是否信任該證書(shū)信息,確認(rèn)。

          查看證書(shū)信息:

          keytool –list –v –keystore truststore

          如果導(dǎo)入過(guò)多個(gè),則可以看到多條entry

          刪除某一個(gè)證書(shū)entry,通過(guò)指定別名來(lái)刪:

          keytool -delete -alias testserver-keystore truststore


          上述是自簽名的證書(shū),證書(shū)鏈的長(zhǎng)度只為
          1

          真正商用時(shí),需要找相關(guān)機(jī)構(gòu)(例如verisign)認(rèn)證通過(guò)才能成為有效的證書(shū):

          生成證書(shū)簽名請(qǐng)求:

          keytool -certreq -keyalg RSA -alias testserver -file certreq.csr -keystore keystore

          之后能夠收到一個(gè)證書(shū)文件,證書(shū)鏈信息包含了該機(jī)構(gòu)的一些信息,然后再導(dǎo)入。


          有兩種方法建立
          HTTPS連接,

          一種是,在java中可以設(shè)置相關(guān)的4個(gè)系統(tǒng)參數(shù),指向相關(guān)的keystore,truststore,一旦設(shè)置,在運(yùn)行時(shí)就不可改變了。除非一定要使用多個(gè)不同的證書(shū)庫(kù)文件,否則可以把多個(gè)不同證書(shū)都導(dǎo)入到同一個(gè)證書(shū)庫(kù)里,這樣,設(shè)置系統(tǒng)參數(shù)為唯一的值也夠用,而且也比較簡(jiǎn)單一些。

          另一種是,自己繼承相關(guān)接口實(shí)現(xiàn)自己的證書(shū)管理器,這樣可以自定義相關(guān)行為,也可以load不同的證書(shū)庫(kù)。


          如果不設(shè)置
          password,就認(rèn)為不檢查文件完整性,也能通過(guò)。如果設(shè)置了password,但是不正確,則會(huì)遇到密碼錯(cuò)誤的異常;如果server證書(shū)沒(méi)有導(dǎo)入到client得信任列表里,則會(huì)遇到找不到可信證書(shū)的異常。

          posted @ 2009-07-16 17:27 cerulean 閱讀(578) | 評(píng)論 (0)編輯 收藏
          一個(gè)反編譯的好工具,600KB,簡(jiǎn)單好使又免費(fèi),比之前用過(guò)的好~
          http://java.decompiler.free.fr/?q=jdgui
          posted @ 2009-06-24 13:45 cerulean 閱讀(300) | 評(píng)論 (0)編輯 收藏

          MySQL Cluster 不支持windows
          之前的說(shuō)法是max版支持集群,standard版不支持,但是官方下載點(diǎn)里已經(jīng)看不出任何關(guān)于max,standard的標(biāo)志。官方網(wǎng)站上又說(shuō)5.0版本已經(jīng)包含了MySQL Cluster,所以還是下了個(gè)5.0的試試,結(jié)果是可以的。

          基本的安裝:
          linux下官方網(wǎng)站的安裝說(shuō)明還是挺明確的,一步一步做就是了。
          遇到了一個(gè)問(wèn)題與這篇文章一模一樣:http://www.91linux.com/html/linux_pub/fedora/20071114/8195.html
          按它的方法修改之后再次

          cd /usr/local/mysql
          bin
          /mysqld_safe --user=mysql &


          Starting mysqld daemon with databases from /var/lib/mysql
          看到上面這一行說(shuō)明啟動(dòng)成功。

          修改密碼:

          bin/mysqladmin -u root password yourpassword


          允許遠(yuǎn)程訪問(wèn):

          bin/mysql -u root -p
          grant all on 
          *.* to root@"202.11.10.253" Identified by "dboomysql"

          允許地址202.11.10.253上用root用戶,密碼dboomysql來(lái)連接mysql的所有數(shù)據(jù)庫(kù),付給所有權(quán)限。
          實(shí)質(zhì)上是修改了自帶的database:mysql中user這一張表,與PostgreSQL需要修改配置文件相比還是方便一些。
          另外就是MySQL的GUI客戶端(MySQL Administrator)也比PostgreSQL的漂亮很多。

          停止MySQL:
          bin/mysqladmin -u root shutdown -p

          安裝完成后,按照這篇文章配置雙機(jī)互備
          http://hi.baidu.com/%CA%AB%D5%B9/blog/item/3b99dbc48140f7ca38db49f7.html
          但是這篇文章有筆誤:

          四、初始化集群
          在Server1中
          # ndbd --nodeid=3 --initial
          在Server2中
          # ndbd --nodeid=4 --iniitial

          應(yīng)該改為——
          四、初始化集群
          在Server1中
          # ndbd --ndb_nodeid=3 --initial
          在Server2中
          # ndbd --ndb_nodeid=4 --initial

          這樣的集群配置兩臺(tái)機(jī)器都是一樣的,所以有2個(gè)管理節(jié)點(diǎn),2個(gè)SQL節(jié)點(diǎn),2個(gè)數(shù)據(jù)節(jié)點(diǎn)。集群的驗(yàn)證:從任何一臺(tái)機(jī)器登上去操作數(shù)據(jù)都能雙寫(xiě)。

          ndb_mgm -e show

          可以看到集群節(jié)點(diǎn)的信息。
          從官方網(wǎng)站上看到的例子都是用了多于3臺(tái)的機(jī)器來(lái)做的集群,僅用兩臺(tái)來(lái)做的方法好像是大家特意這么做的。

          盡管集群配置完畢,但是應(yīng)用程序與數(shù)據(jù)庫(kù)建立連接不能使用其中任何一臺(tái)機(jī)器的真實(shí)IP,否則一旦該機(jī)器網(wǎng)絡(luò)連接出問(wèn)題還是不行,所以還是要給DB集群的機(jī)器配置虛擬IP以供外部訪問(wèn)。


          遇到過(guò)的問(wèn)題:
          無(wú)法mysqld_safe啟動(dòng),也找不到日志
          解決方法:加啟動(dòng)參數(shù)以指定日志

          mysqld_safe --log-error=/var/log/mysqld.log

          可以查看到錯(cuò)誤日志了。

          [ERROR] Fatal error: Can't open and lock privilege tables: Table 'mysql.host' doesn't exist
          沒(méi)轍,google唄,好像是系統(tǒng)數(shù)據(jù)庫(kù)mysql里host表的權(quán)限有問(wèn)題什么的,而mysql這個(gè)庫(kù)是之前安裝時(shí)初始化過(guò)的。

          解決方法:刪除data,重新install_db

          rm -rf /usr/local/mysql/data
          cd 
          /usr/local/mysql
          scripts
          /mysql_install_db --user=mysql
          chown 
          -R root .
          chown 
          -R mysql data
          chgrp 
          -R mysql .

           

          bin/mysqld_safe --log-error=/var/log/mysqld.log --ndb_nodeid=5 --user=mysql &

          啟動(dòng)成功了。

          btw, mysql官方網(wǎng)的forum好像不能“平板顯示”,好不方便。


          關(guān)閉Cluster,在管理節(jié)點(diǎn)所在的機(jī)器上:
          /usr/local/mysql/ndb_mgm -e shutdown
          關(guān)閉SQL節(jié)點(diǎn)的mysqld服務(wù):
          /usr/local/mysql/bin/mysqladmin -uroot shutdown

          posted @ 2007-12-17 21:38 cerulean 閱讀(618) | 評(píng)論 (0)編輯 收藏
          java默認(rèn)的JVM內(nèi)存占用:初始1MB,最大64MB
          可以通過(guò)java -Xms256m -Xmx256m ClassName來(lái)調(diào)整。
          xms和xmx的值最好相同,否則調(diào)整的效率可能不高。
          如果程序運(yùn)行中,發(fā)生內(nèi)存溢出,那么不會(huì)以Exception的形式拋出,而是"Error"
          如果沒(méi)有catch(Error error),那么控制臺(tái)將顯示錯(cuò)誤:Exception in thread "main" java.lang.OutOfMemoryError: Java heap space,而且后面的程序也不會(huì)執(zhí)行。
          posted @ 2007-12-17 21:26 cerulean 閱讀(1133) | 評(píng)論 (0)編輯 收藏
          雖然RMI已經(jīng)不大推薦使用了,但是方法還是要記住的。
          在產(chǎn)生.class文件的根目錄,例如/bin
          cd /bin
          rmic com.test.RMIImpl

          將在/bin/com/test目錄下產(chǎn)生RMIImpl_Stub.class文件
          cd /bin
          jar cvf test.jar com
          /test/RMIIntf.class com/test/RMIImpl_Stub.class

          將在/bin目錄下產(chǎn)生test.jar文件,供RMI客戶端調(diào)用
          posted @ 2007-12-17 21:12 cerulean 閱讀(893) | 評(píng)論 (0)編輯 收藏

          遇到經(jīng)典的getParameter中文亂碼的問(wèn)題,網(wǎng)上已經(jīng)有很多總結(jié)和討論了。
          在jsp里調(diào)用了*.do?param=name,當(dāng)name本身的值為中文時(shí),在action里獲取時(shí)有亂碼問(wèn)題。

          調(diào)用.do的jsp頁(yè)面頭已經(jīng)設(shè)置過(guò)

          <%@ page language="java" import="java.util.*" pageEncoding="gb2312"%>


          即便在action里設(shè)置了

          request.setCharacterEncoding 

          也沒(méi)有效果。

          最后的解決方法:

          String str = request.getParameter("param");

          改為

          String str = new String(request.getParameter("param").getBytes("ISO-8859-1"),"GB2312");
          posted @ 2007-12-17 21:09 cerulean 閱讀(3716) | 評(píng)論 (0)編輯 收藏

          struts的<html:form>標(biāo)簽中沒(méi)有"name"屬性,但是使用"styleId"屬性可以替代。
          需要注意的問(wèn)題是,假如定義了:

          <html:form styleId="test" action="testIt.do">

          同時(shí)還定義了一個(gè)一樣名為test的javascript function:
          function test(){
             alert('hello');
          }

          則,在試圖調(diào)用此function時(shí)會(huì)出現(xiàn)錯(cuò)誤:
          <onclick="test()">click me</a>
          posted @ 2007-12-05 10:53 cerulean 閱讀(3345) | 評(píng)論 (1)編輯 收藏
          windows下.exe安裝版中,TOMCAT_HOME/conf下,是沒(méi)有l(wèi)ogging.properties這個(gè)文件的(在解壓版中有)。安裝版的logging.properties文件位于TOMCAT_HOME/common/classes下。
          posted @ 2007-09-03 17:01 cerulean 閱讀(1141) | 評(píng)論 (0)編輯 收藏
          Windows->Preferences->General->Compare/Patch->Ignore white space
          posted @ 2007-08-28 16:45 cerulean 閱讀(876) | 評(píng)論 (0)編輯 收藏
          Team->Branch/Tag時(shí),必須輸入注釋,否則即便看起來(lái)好像執(zhí)行了操作,但是卻沒(méi)有真正創(chuàng)建分支在SVN server上。
          posted @ 2007-08-28 15:35 cerulean 閱讀(1095) | 評(píng)論 (0)編輯 收藏
          其實(shí)還是挺糊涂的,org.apache.struts.action.ActionForm的Reset()方法,不過(guò)知道可以在該方法中set該Form的一些屬性值,就能夠在頁(yè)面上顯示為該對(duì)應(yīng)控件的默認(rèn)值,比較方便。

          public void reset(ActionMapping mapping, HttpServletRequest request) {
             
          //set default value for the first display
             this.setType("0");
          }
          posted @ 2007-08-23 14:55 cerulean 閱讀(1263) | 評(píng)論 (0)編輯 收藏
          在eclipse中已經(jīng)集成了ant,如果創(chuàng)建名為build.xml的文件,就會(huì)被識(shí)別為ant的文件。ShowView->Outline會(huì)有一些提示。
          在eclipse中,右鍵build.xml,
          選擇:Run As Ant Build,會(huì)執(zhí)行默認(rèn)的任務(wù)
          選擇:Run As Ant Build...,在彈出框中,可以選擇執(zhí)行哪些任務(wù).

          當(dāng)直接使用ant命令時(shí),可以用-D來(lái)輸入?yún)?shù),
          例如ant -buildfile package.xml -Dversion=1_0,指定了version的值。
          posted @ 2007-08-14 15:18 cerulean 閱讀(450) | 評(píng)論 (0)編輯 收藏
          **.jsp?param=1
          那么request.getParameter("param")就可以勒!
          原來(lái)用request.getAttribute死活不行,以為必須得用form傳遞呢,敢情getParameter就行~~

          所以如果想只用jsp頁(yè)面的話,可以這樣子做:
          hello.jsp:
          function hello(name)
          {
              sayHello(name);
          }

          function sayHello(id)
          {
              window.location
          ="sayHelloCommit.jsp?id="+id;
          }

          sayHelloCommit.jsp:
          <%@ page contentType="text/html;charset=gb2312"%>
          <%
          String str = (String) request.getParameter("id");
          //To Something using the "str"
          //redirect to a page
          response.sendRedirect(
          "hello.jsp");
          %>

          posted @ 2007-08-13 16:51 cerulean 閱讀(695) | 評(píng)論 (0)編輯 收藏
          more *.log | grep keywords

          vi一個(gè)寫(xiě)有中文內(nèi)容的文件,只能看到其unicode。more該文件就可以看到中文內(nèi)容。
          當(dāng)keywords中包含空格時(shí),需要用""將keywords擴(kuò)起來(lái)。
           
          posted @ 2007-08-02 17:19 cerulean 閱讀(337) | 評(píng)論 (0)編輯 收藏
          如題
          posted @ 2007-08-01 09:41 cerulean 閱讀(2153) | 評(píng)論 (0)編輯 收藏

          Linux和windows下,文件中的換行符好像是不同的,當(dāng)在windows下用UE打開(kāi)一來(lái)自linux的文件時(shí),好像會(huì)問(wèn)你是不是要轉(zhuǎn)換到DOS格式什么的。在eclipse中打開(kāi)代碼時(shí),有時(shí)也會(huì)遇到類(lèi)似的問(wèn)題,尤其是.xml文件。
          今天在看weka的網(wǎng)站時(shí),無(wú)意看到在eclipse中有一個(gè)設(shè)置貌似是專門(mén)用來(lái)做這個(gè)的:
          eclipse->Window -> Preferences -> General -> Editors 里面有一個(gè)"New text file line delimiter",可以在other中選擇Unix。

          posted @ 2007-07-26 10:27 cerulean 閱讀(828) | 評(píng)論 (0)編輯 收藏
          7種武器
          array/String/HashMap
          regular expressions
          debug
          two programming languages
          one IDE
          SQL
          software idea
          posted @ 2007-07-25 22:21 cerulean 閱讀(253) | 評(píng)論 (0)編輯 收藏
          小心仔細(xì)的使用靜態(tài)變量,因?yàn)橛械臅r(shí)候它表現(xiàn)的過(guò)于“靜態(tài)”,而不符合習(xí)慣性的想法,容易引入不易發(fā)現(xiàn)的bug。
          因?yàn)榻?jīng)常是在單次運(yùn)行程序時(shí)還不會(huì)反映出來(lái),只有在多次運(yùn)行時(shí)才能顯露效果。
          posted @ 2007-07-25 22:20 cerulean 閱讀(294) | 評(píng)論 (0)編輯 收藏

          windows命令行支持的ftp命令,下載東西時(shí)默認(rèn)是ASCII編碼,于是一個(gè).war文件下載后的文件大小就不大對(duì),部署時(shí)tomcat也不認(rèn)識(shí),報(bào)出invalid header的錯(cuò)誤。
          因此用這個(gè)命令下載時(shí)需要轉(zhuǎn)換成二進(jìn)制。而如果用現(xiàn)成的FTP工具下載就不會(huì)有問(wèn)題。

          posted @ 2007-07-25 22:18 cerulean 閱讀(339) | 評(píng)論 (0)編輯 收藏

          以前天真的認(rèn)為只要把兩個(gè)tomcat的端口號(hào)修改成不同的就哦了呢,結(jié)果不行。
          實(shí)際情況是(轉(zhuǎn)自CSDN):
          1.特別要注意:不要設(shè)置CATALINA_HOME
          2.分別修改安裝目錄下的conf子目錄中的server.xml文件:
          a.修改http訪問(wèn)端口(默認(rèn)為8080端口),將8080修改為tomcat不在使用的端口號(hào)。此處所設(shè)的端口號(hào)即是以后訪問(wèn)web時(shí)所用的端口號(hào)。
          b.修改Shutdown端口(默認(rèn)為8005端口),將8005修改為沒(méi)有在使用的端口號(hào),例如8055。
          c.修改8009端口,將8009修改為沒(méi)有在使用的端口號(hào),例如8099
          (注意:兩個(gè)文件中對(duì)應(yīng)的端口號(hào)要不一樣)
          3.依次啟動(dòng)兩個(gè)tomcat。

          另外,因?yàn)榇蜷_(kāi)了axis2的SOAPMonitor,今天不知道怎么回事兒monitor頁(yè)面無(wú)法正常顯示了,tomcat啟動(dòng)時(shí)也報(bào)出了address in use:5001的錯(cuò)誤。一開(kāi)始以為是兩個(gè)tomcat的問(wèn)題,后來(lái)才意識(shí)到是SOAPMonitor的端口沖突了(也不知道是和誰(shuí)沖突了。。。)反正改吧:
          webapps/axis2/WEB-INF/web.xml
          <init-param>
                    <param-name>SOAPMonitorPort</param-name>
                    <param-value>5011</param-value>
          </init-param>
          把原來(lái)的5001改成比如5011就哦了。

          posted @ 2007-07-25 22:15 cerulean 閱讀(1387) | 評(píng)論 (0)編輯 收藏
          用myeclipse創(chuàng)建web工程時(shí),向web.xml文件中添加一些taglib的時(shí)候,總會(huì)報(bào)錯(cuò),不過(guò)不影響使用。
          在網(wǎng)上查了一下,好像是web.xml文件頭格式的問(wèn)題,最簡(jiǎn)單的解決方法是多加一個(gè)<jsp-config>標(biāo)簽,以struts標(biāo)簽為例:
          <jsp-config>
          <taglib>
                
          <taglib-uri>/WEB-INF/struts-html</taglib-uri>
                
          <taglib-location>/WEB-INF/struts-html.tld</taglib-location>
            
          </taglib>
            
            
          <taglib>
                
          <taglib-uri>/WEB-INF/struts-bean</taglib-uri>
                
          <taglib-location>/WEB-INF/struts-bean.tld</taglib-location>
            
          </taglib>
            
            
          <taglib>
                
          <taglib-uri>/WEB-INF/struts-logic</taglib-uri>
                
          <taglib-location>/WEB-INF/struts-logic.tld</taglib-location>
            
          </taglib>
          </jsp-config>
          posted @ 2007-04-15 10:13 cerulean 閱讀(1844) | 評(píng)論 (2)編輯 收藏
          在web.xml中,會(huì)將HTTP的404錯(cuò)誤導(dǎo)向一個(gè)錯(cuò)誤頁(yè)面:
          <error-page>
              
          <error-code>404</error-code>
              
          <location>/errors.jsp</location>
          </error-page>

          但是今天發(fā)現(xiàn)隨便訪問(wèn)一個(gè)不存在頁(yè)面時(shí),并沒(méi)有如預(yù)期的一樣出現(xiàn)自定義的錯(cuò)誤頁(yè)面。在網(wǎng)上查了一下,原來(lái)是IE對(duì)于內(nèi)容非常少的自定義錯(cuò)誤頁(yè)面是不會(huì)顯示出來(lái)的,而firefox就沒(méi)有問(wèn)題。
          于是,把錯(cuò)誤頁(yè)面的內(nèi)容多加了幾行字,就可以了。
          posted @ 2007-04-15 10:04 cerulean 閱讀(388) | 評(píng)論 (0)編輯 收藏

          ????以前上學(xué)的時(shí)候數(shù)據(jù)庫(kù)學(xué)的是皮毛中的皮毛,唯一的課程設(shè)計(jì)也只是跑幾個(gè)簡(jiǎn)單得很得SQL語(yǔ)句而已。無(wú)論是數(shù)據(jù)庫(kù)設(shè)計(jì),還是SQL語(yǔ)句的各種經(jīng)典寫(xiě)法和強(qiáng)大功能都沒(méi)有怎么好好地研究過(guò)。
          ??????? 功能上的學(xué)習(xí)都不全面,就更不要提性能、安全和大數(shù)據(jù)量等等在實(shí)際應(yīng)用中會(huì)遇到的問(wèn)題勒。參與的一個(gè)項(xiàng)目中,就涉及到比較大量的數(shù)據(jù)量的處理和存儲(chǔ)(當(dāng)然處理大數(shù)據(jù)量就是另外一個(gè)問(wèn)題勒)。加之分配給數(shù)據(jù)庫(kù)所在的磁盤(pán)空間相當(dāng)有限,造成了非常捉襟見(jiàn)肘的局面。
          ??????? 幻想著有朝一日可以不為這些事情煩惱,像google,sina一樣,用幾十上百臺(tái)配置一般的機(jī)器連起來(lái)也能作為一個(gè)強(qiáng)壯的server。

          從網(wǎng)上看到一些關(guān)于存儲(chǔ)海量數(shù)據(jù)的討論:
          1、分表、分?jǐn)?shù)據(jù)庫(kù)
          根據(jù)一定的規(guī)則把不同的數(shù)據(jù)庫(kù)表分開(kāi)
          缺點(diǎn):有一定風(fēng)險(xiǎn),因?yàn)橐坏┓珠_(kāi)存放的兩個(gè)數(shù)據(jù)庫(kù)表有朝一日需要“聯(lián)表”操作,那么就郁悶了,而且最好是把幾個(gè)數(shù)據(jù)量大的表分開(kāi),單獨(dú)拎出來(lái)幾個(gè)小表意義很不大,而且業(yè)務(wù)邏輯層的代碼需要知道自己要處理的數(shù)據(jù)存在哪個(gè)服務(wù)器里,有一點(diǎn)兒奇怪。

          例如:(來(lái)自ball_lei)
          ??????? 我現(xiàn)在采用的架構(gòu)采用數(shù)據(jù)庫(kù)群的方式,每個(gè)客戶的數(shù)據(jù)單獨(dú)存在一臺(tái)數(shù)據(jù)庫(kù)服務(wù)器上,所有的客戶根據(jù)一定的規(guī)則安排存放的數(shù)據(jù)庫(kù)服務(wù)器,在主數(shù)據(jù)庫(kù)服務(wù)器上有一張-索引表保存客戶與數(shù)據(jù)庫(kù)服務(wù)器的對(duì)應(yīng)關(guān)系,每臺(tái)數(shù)據(jù)庫(kù)服務(wù)器中用于存放這些數(shù)據(jù)的表按照月份分成12張,每張存放當(dāng)月的全部客戶的數(shù)據(jù),目前計(jì)算出單臺(tái)服務(wù)器-單表需要容納9億條數(shù)據(jù),并且每臺(tái)服務(wù)器在這種方式下可以容納10000個(gè)客戶的數(shù)據(jù),以后客戶數(shù)量增加時(shí)只需要增加數(shù)據(jù)庫(kù)服務(wù)器即可。
          ??????? 程序邏輯,我采用業(yè)務(wù)邏輯層的概念,對(duì)外提供應(yīng)用服務(wù)器接口,全部的客戶端通過(guò)應(yīng)用服務(wù)器接口進(jìn)行業(yè)務(wù)運(yùn)算,應(yīng)用服務(wù)器我也采用服務(wù)器群的概念,有一個(gè)主的應(yīng)用服務(wù)器,有幾個(gè)副應(yīng)用服務(wù)器,全部客戶端只知道該主應(yīng)用服務(wù)器的地址,上線時(shí)登陸主應(yīng)用服務(wù)器,然后主應(yīng)用服務(wù)器根據(jù)各臺(tái)應(yīng)用服務(wù)器的負(fù)載情況返回給客戶端真正的登陸地址(副應(yīng)用服務(wù)器的地址),然后客戶端再登陸到上面進(jìn)行業(yè)務(wù)處理,每臺(tái)應(yīng)用服務(wù)器都能夠訪問(wèn)各臺(tái)數(shù)據(jù)服務(wù)器進(jìn)行數(shù)據(jù)提取。

          問(wèn)題:需要每臺(tái)應(yīng)用服務(wù)器都配備一個(gè)公網(wǎng)ip么,還是有其他的方式可以只需要一個(gè)公網(wǎng)ip可以給全部的服務(wù)器公用?Nat能夠?qū)崿F(xiàn)么?或者能否進(jìn)行更好的負(fù)載均衡,就是客戶端的各種業(yè)務(wù)都可以在不同的服務(wù)器上運(yùn)算

          改進(jìn):
          用戶規(guī)則配置應(yīng)該不大,所以也可以做成配置一次Load到內(nèi)存中。

          如此大數(shù)據(jù)量的項(xiàng)目竟不用Oracle,實(shí)在讓人費(fèi)解。我現(xiàn)在的月數(shù)據(jù)量大概2.5億,用了3臺(tái)HP
          SUPERDEMO,9個(gè)CUSTERMOR DB。其中一個(gè)CATALOG數(shù)據(jù)庫(kù),相當(dāng)于你的客戶索引。
          你的插入操作很多,所以建議少建幾個(gè)索引,其實(shí)一些業(yè)務(wù)完全可以在數(shù)據(jù)庫(kù)中完成,通過(guò)觸發(fā)器,約束和存儲(chǔ)過(guò)程,這樣性能會(huì)有大的提高。大數(shù)據(jù)的表,分區(qū)的確是必須的,當(dāng)然,還需要更完善的維護(hù)計(jì)劃,否則很容易,你的業(yè)務(wù)可能就會(huì)因?yàn)樾阅軉?wèn)題掛起了。

          1、通過(guò)(數(shù)據(jù)庫(kù)+文件)方式進(jìn)行數(shù)據(jù)存儲(chǔ)

          2、集群方案

          還有當(dāng)初選修的“分布式數(shù)據(jù)庫(kù)”,不知道這個(gè)概念是不是能夠活生生的用到項(xiàng)目中來(lái)。。。

          posted @ 2007-03-20 21:21 cerulean 閱讀(891) | 評(píng)論 (0)編輯 收藏

          DAO層: JUnit test,需要用dbunit恢復(fù)現(xiàn)場(chǎng);
          service層:JUnit test,需要用dbunit恢復(fù)現(xiàn)場(chǎng),邏輯更重要些,分支覆蓋更重要些;
          action:不做測(cè)試;
          selenium:做集成測(cè)試。
          ????盡管有人認(rèn)為struts action不需要做測(cè)試,不過(guò)無(wú)意中看到strutsTestCase這個(gè)東東,還沒(méi)有試,用途是測(cè)試struts的action.覺(jué)得比較有用.
          ????尤其是,如果web頁(yè)面交由第三方來(lái)做的話,那么單獨(dú)對(duì)action進(jìn)行測(cè)試就是十分有必要的.
          ????但是,如果整個(gè)web系統(tǒng)從前臺(tái)到后臺(tái)都是一個(gè)team來(lái)做,那么個(gè)人認(rèn)為還不如跟頁(yè)面一起集成測(cè),畢竟這是真實(shí)情況,而且從頁(yè)面上可視性更強(qiáng),更容易發(fā)現(xiàn)問(wèn)題.與此同時(shí),使用腳本錄制回放測(cè)試工具(還沒(méi)有試過(guò))提高效率.

          posted @ 2007-03-20 21:17 cerulean 閱讀(435) | 評(píng)論 (0)編輯 收藏

          “jMock利用mock objects思想來(lái)對(duì)Java code進(jìn)行測(cè)試。jMock具有以下特點(diǎn):容易擴(kuò)展,讓你快速簡(jiǎn)單地定義mock objects,因此不必打破程序間的關(guān)聯(lián),你定義靈活的超越對(duì)象之間交互作用而帶來(lái)測(cè)試局限,減少你測(cè)試地脆弱性。”

          ??? 跟JMock功能類(lèi)似的還有EasyMock。
          ??? 簡(jiǎn)單試驗(yàn)后的感覺(jué)沒(méi)有試驗(yàn)DBUnit后的感覺(jué)強(qiáng)烈,試了DBUnit的感覺(jué)是這東西以后一定要用.
          ??? 但個(gè)人認(rèn)為mock object這種東西能不用就不用,模擬來(lái)模擬去,最后還是要和真東西聯(lián)調(diào),所以mock的階段應(yīng)該是盡可能的短才是.

          使用模仿對(duì)象進(jìn)行測(cè)試的常用編碼樣式是:
          · 創(chuàng)建模仿對(duì)象的實(shí)例
          · 設(shè)置模仿對(duì)象中的狀態(tài)和期望值
          · 將模仿對(duì)象作為參數(shù)來(lái)調(diào)用域代碼
          · 驗(yàn)證模仿對(duì)象中的一致性

          代碼中的大概過(guò)程:
          ???? Mock mock = new Mock(**.class);//構(gòu)造一個(gè)那個(gè)類(lèi)的mock對(duì)象,把這個(gè)類(lèi)傳入Mock
          ???? 使用mock.expects方法,來(lái)設(shè)置想要執(zhí)行的操作:執(zhí)行幾次、執(zhí)行哪個(gè)方法、傳什么參、返回什么值
          ?????獲得那個(gè)mock對(duì)象:** x = (**)mock.proxy();//proxy方法返回代理類(lèi)實(shí)例,即虛擬對(duì)象實(shí)例
          ???? 然后run **.class的那個(gè)方法(call methods on the mock object, expectation on it will deliver the result set up by yourself)

          ???? 寫(xiě)mock-object 測(cè)試,需要有獨(dú)立的接口作為mock的對(duì)象(從而促進(jìn)了針對(duì)接口編程的習(xí)慣),還有個(gè)好的副作用:他迫使你來(lái)重寫(xiě)一些代碼。實(shí)際上,代碼常常寫(xiě)的不好。你讓類(lèi)和環(huán)境之間產(chǎn)生了不必要的耦合。

          posted @ 2007-03-20 21:05 cerulean 閱讀(480) | 評(píng)論 (0)編輯 收藏

          DBUnit擴(kuò)展自JUnit.在使用DBUnit之前,為了驗(yàn)證自己編寫(xiě)的涉及數(shù)據(jù)庫(kù)操作方法的正確性,每次都要執(zhí)行一個(gè)簡(jiǎn)單的sql腳本,灌些數(shù)據(jù),然后人眼觀察著數(shù)據(jù)表中的數(shù)據(jù).然后,代碼執(zhí)行完畢后,再次觀察數(shù)據(jù)變化情況.久而久之,表里面的數(shù)據(jù)就變得雜亂,一般會(huì)全部刪除,重新來(lái)過(guò).
          ??? DBUnit的目標(biāo)正是保證數(shù)據(jù)庫(kù)數(shù)據(jù)環(huán)境的穩(wěn)定性,具備將數(shù)據(jù)庫(kù)中數(shù)據(jù)與xml文件之間雙向轉(zhuǎn)換的能力.
          試驗(yàn)了一下,

          首先,下載dbunit的jar包,加入工程即可.
          1.從xml中將數(shù)據(jù)導(dǎo)入數(shù)據(jù)庫(kù)表
          tc不再繼承自TestCase,而是繼承DatabaseTestCase
          覆蓋幾個(gè)方法,包括獲得xml文件內(nèi)容,獲得DB連接,以及在setup方法和teardown方法中調(diào)用提供的dbunit操作類(lèi)型,構(gòu)建數(shù)據(jù)庫(kù)內(nèi)數(shù)據(jù)環(huán)境.

          這時(shí),我以為如果只有幾個(gè)簡(jiǎn)單的數(shù)據(jù),寫(xiě)xml固然簡(jiǎn)單,但想測(cè)試大數(shù)據(jù)量時(shí)(雖然UT主要是測(cè)試功能而非性能,但是大數(shù)據(jù)量也方便驗(yàn)證)就有點(diǎn)問(wèn)題,好在是雙向的,可以先把數(shù)據(jù)用function灌入數(shù)據(jù)庫(kù),再導(dǎo)進(jìn)xml里面:

          2.從數(shù)據(jù)庫(kù)表數(shù)據(jù)導(dǎo)入xml文件
          ??? 用ant+DBUnit來(lái)完成這個(gè)任務(wù)非常方便!

          < target? name ="export" >
          ????????
          < taskdef? name ="dbunit" ?classname ="org.dbunit.ant.DbUnitTask" ?classpathref ="compile.path" ? />
          ????????
          < dbunit? driver ="com.mysql.jdbc.Driver" ?url ="jdbc:mysql://127.0.0.1:3306/mydb" ?userid ="root" ?password ="root" ?supportBatchStatement ="true" >
          ????????????
          < export? dest ="${test.srcpath}/export.xml" > ????????????????
          ????????????????
          < query? name ="test_table" ?sql ="SELECT?*?FROM?test_table" ? /> ????????
          ????????????????
          < table? name ="user_table" ? />
          ????????????
          </ export >
          ????????
          </ dbunit >
          ????
          </ target >


          ??? 疑問(wèn),看到有人說(shuō)DBUnit在清除數(shù)據(jù)時(shí),有時(shí)不能徹底,原因是分析不出來(lái)外鍵等表之間的約束.因?yàn)樵谠囼?yàn)中采用的數(shù)據(jù)庫(kù)里沒(méi)啥表之間的約束,所以還沒(méi)有體會(huì)到.

          ??? DatabaseTestCase類(lèi)提供了兩個(gè)方法來(lái)控制測(cè)試前和測(cè)試后的數(shù)據(jù)庫(kù)狀態(tài):getSetUpOperation() 和 getTearDownOperation().???????
          ??? 一種高效的實(shí)施方案就是讓getSetUpOperation()方法執(zhí)行REFRESH操作,通過(guò)這個(gè)操作,我們可以用種子文件中的數(shù)據(jù)去更新目標(biāo)數(shù)據(jù)庫(kù)里的數(shù)據(jù)。
          ??? 接下來(lái),就是getTearDownOperation(),讓他去執(zhí)行一個(gè)NONE操作,也就是什么也不執(zhí)行
          ??? 常用操作:
          ??? DatabaseOperation.CLEAN_INSERT;?先刪除表中所有,再插入準(zhǔn)備的數(shù)據(jù)
          ??? DatabaseOperation.REFRESH;?使用準(zhǔn)備數(shù)據(jù)更新表,存在則update,不存在則insert
          ??? DatabaseOperation.DELETE;??只刪除準(zhǔn)備的數(shù)據(jù)
          ??? DatabaseOperation.NONE;??啥都不做

          posted @ 2007-03-20 20:59 cerulean 閱讀(1812) | 評(píng)論 (0)編輯 收藏

          前提:testlink已經(jīng)跟mantis安裝在同一個(gè)環(huán)境下
          步驟:
          參照http://crystaliris.bokee.com/5588155.html,testlink網(wǎng)站也給出了比較清楚的文檔說(shuō)明。
          1.修改testlink關(guān)于interface的配置為"MANTIS",如果用別的BTS(Bug Trace System),有其他的對(duì)應(yīng)值。
          2.修改testlink目錄下cfg/mantis.cfg.php(如果用別的BTS,修改其他對(duì)應(yīng)目錄下的配置),配置一些關(guān)于mantis的數(shù)據(jù)庫(kù)和url屬性。
          3.修改mantis的配置文件,打開(kāi)匿名登錄,由于匿名登錄的用戶名需要是一個(gè)已經(jīng)存在的真實(shí)用戶,而我又沒(méi)在mantis上創(chuàng)建新的用戶,所以就填寫(xiě)成administrator了。

          posted @ 2007-03-11 21:33 cerulean 閱讀(864) | 評(píng)論 (0)編輯 收藏
          測(cè)試RMI接口實(shí)現(xiàn)修改后,jar包用不用重新打
          可以的,接口實(shí)現(xiàn)修改了,只要接口定義不變,RMIClient調(diào)用后,都會(huì)按照Server端最新的實(shí)現(xiàn)來(lái)得到結(jié)果.

          在class文件的根目錄下(例如bin目錄)執(zhí)行rmic命令,寫(xiě)完整接口實(shí)現(xiàn)的包名。
          posted @ 2007-03-11 21:29 cerulean 閱讀(352) | 評(píng)論 (0)編輯 收藏

          環(huán)境:windows
          下載scarab-1.0-b20.zip,直接解壓即可.
          需要JDK,Ant(或者maven,scarab推薦maven),DB(推薦MySQL)
          在解壓后的\scarab-1.0-b20目錄中,創(chuàng)建build.properties,以指定數(shù)據(jù)庫(kù)連接的參數(shù).

          例如:
          scarab.database.type=mysql
          scarab.database.name=scarab
          scarab.database.jdbc.driver=org.gjt.mm.mysql.Driver
          scarab.database.host=localhost
          scarab.database.port=3306
          scarab.database.username=root
          scarab.database.password=root
          scarab.database.admin.username=${scarab.database.username}
          scarab.database.admin.password=${scarab.database.password}

          #發(fā)送郵件的郵件服務(wù)器也可以寫(xiě)在這里
          system.mail.host=smtp.126.com

          數(shù)據(jù)庫(kù)方面,本來(lái)想使用postgreSQL,結(jié)果發(fā)現(xiàn)對(duì)于scarab來(lái)說(shuō)配置比較特殊,于是就裝了MySQL[見(jiàn)MySQL的那篇文吧].
          數(shù)據(jù)庫(kù)配置寫(xiě)好以后,進(jìn)入\scarab-1.0-b20\build\目錄,運(yùn)行ant,就對(duì)scarab進(jìn)行構(gòu)建啦,能夠看到BUILD SUCCESSFULLY就成功啦!!
          感覺(jué)scarab可以配置的地方很多很多,不過(guò)配置修改后還是需要重新build的.之前遇到過(guò)的錯(cuò)誤就是在寫(xiě)好數(shù)據(jù)庫(kù)配置后沒(méi)有重新build造成的.

          構(gòu)建成功后,就可以使用啦: 進(jìn)入\scarab-1.0-b20\tomcat\bin目錄,運(yùn)行startup.bat,tomcat就啟動(dòng)起來(lái)了,訪問(wèn)http://localhost:8080/scarab/就可以啦。

          因?yàn)楹芏喙δ芏夹枰l(fā)郵件來(lái)協(xié)助,所以要使用SMTP服務(wù)器,比方說(shuō)smtp.126.com,user=realuser,password=realuserpassword

          總得來(lái)說(shuō),覺(jué)得scarab界面不是很友好,也不是很美觀。
          由于一開(kāi)始郵件服務(wù)器不能用,所以直接到數(shù)據(jù)庫(kù)中update用戶的狀態(tài)為CONFIRMED。這樣子成功登錄后,點(diǎn)擊“申請(qǐng)新角色”時(shí),竟然拋出錯(cuò)誤了,不知道是什么原因,無(wú)法繼續(xù)了,挺郁悶的。

          posted @ 2007-03-06 22:11 cerulean 閱讀(805) | 評(píng)論 (0)編輯 收藏

          導(dǎo)航

          <2007年3月>
          25262728123
          45678910
          11121314151617
          18192021222324
          25262728293031
          1234567

          統(tǒng)計(jì)

          常用鏈接

          留言簿(3)

          隨筆分類(lèi)

          隨筆檔案

          搜索

          最新評(píng)論

          閱讀排行榜

          評(píng)論排行榜

          主站蜘蛛池模板: 托克托县| 常山县| 汝南县| 普宁市| 奇台县| 宣城市| 余干县| 岗巴县| 南汇区| 泸水县| 旬阳县| 天津市| 兴化市| 吉林市| 永定县| 莱西市| 安吉县| 汪清县| 叶城县| 明水县| 甘南县| 子长县| 辉县市| 盐城市| 呈贡县| 竹山县| 莫力| 武宣县| 柳林县| 盐亭县| 高雄县| 内黄县| 瓮安县| 涞源县| 奉化市| 永川市| 岚皋县| 萨嘎县| 乐都县| 施甸县| 梓潼县|