Energy of Love  
          日歷
          <2025年7月>
          293012345
          6789101112
          13141516171819
          20212223242526
          272829303112
          3456789
          統計
          • 隨筆 - 70
          • 文章 - 0
          • 評論 - 80
          • 引用 - 0

          導航

          常用鏈接

          留言簿

          隨筆分類

          隨筆檔案

          搜索

          •  

          最新評論

          閱讀排行榜

          評論排行榜

           

          /**
          *作者:張榮華(ahuaxuan)
          *2007-8-15
          *轉載請注明出處及作者
          */

          前兩天在看Spring內置的攔截器的時候,發現了一個之前沒有注意的類:org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor,好奇心促使我上網查了一下這個jamon。大概看了一下之后發現這個玩意還真挺好用的而且挺重要的,而且現在國內對它的介紹也很少,所以寫了一篇文章和大家分享。

          一,Jamon簡介:
          Jamon的全名是:Java Application Monitor。它是一個小巧的,免費的,高性能的,線程安全的性能監測工具。它可以用來測定系統的性能瓶頸,也可以用來監視用戶和應用程序之間的交互情況。 Jamon主要是用來檢測jee的應用程序。它最新的版本是2.1,可以用在1.4以上的jdk上。

          二,將jamon導入到你的應用程序中去
          首先下載jamon的開發包,見我的附件,同時你也可以去Sourceforge上自己下載。Sourceforge的下載地址為http://jamonapi.sourceforge.net。解壓之后可以得到一個jar包和一個war包。jar包是自己會用到的,而war包是一個例子(不要小看這個例子,待會也要把它導入到項目中)。把war包之間丟到服務器上,訪問:localhost:8080/jamon就可以看到這個例子了,這個例子是一個簡單的性能監控系統。

          接著把例子中的所有的包都導入到項目中,并把war包中的jsp和images還有css都考到項目中,比如新建一個目錄叫monitor(它和WEB-INF是同級目錄)。

          三,正確配置自己的應用
          我們在性能監測的時候最監測的就是頁面的訪問率和類中方法的訪問率。所以在這一部分主要講解一下如何監測自己的頁面和類中方法的訪問。

          1, 檢測自己的頁面訪問率
          首先我們需要在web.xml中添加一個filter,這個filter就是用來判斷哪些頁面需要被監視的,如下所示:
          Java代碼 復制代碼
          1. <filter>   
          2.         <filter-name>JAMonFilter</filter-name>   
          3.         <filter-class>com.easywebwork.filter.EasyPageMonFilter</filter-class>   
          4.     </filter>   
          5.     <filter-mapping>   
          6.         <filter-name>JAMonFilter</filter-name>   
          7.         <url-pattern>/*</url-pattern>   
          8.     </filter-mapping>  
          接下來我們看看這個filter的寫法:
          Java代碼 復制代碼
          1. /**  
          2.  * @author 張榮華(ahuaxuan)  
          3.  *  
          4.  * @since 2007-8-13  
          5.  */  
          6. public class PageMonFilter extends JAMonFilter{   
          7.   
          8.     private static final long serialVersionUID = 5746197114960908454L;   
          9.   
          10.     public void doFilter(ServletRequest request, ServletResponse response, FilterChain filterChain) throws IOException, ServletException {   
          11.          Monitor allPages = MonitorFactory.start(new MonKeyImp("org.easywebwork.allPages",getURI(request),"ms."));   
          12.          //這里就是我們要監視的所有的頁面的配置   
          13.          Monitor monitor = MonitorFactory.start(getURI(request));   
          14.          //這里就是我們要監視的某個頁面的配置   
          15.          try {   
          16.           filterChain.doFilter(request, response);   
          17.          } finally {   
          18.           monitor.stop();   
          19.           allPages.stop();   
          20.          }   
          21.        }   
          22.   
          23.        protected String getURI(ServletRequest request) {   
          24.          if (request instanceof HttpServletRequest) {   
          25.            return ((HttpServletRequest) request).getRequestURI();   
          26.          }  else {   
          27.            return "Not an HttpServletRequest";   
          28.          }   
          29.        }   
          30.   
          31.        private FilterConfig filterConfig = null;   
          32.           
          33. }}  

          這個類看上去很簡單,其實也挺簡單的,就是得到uri,然后把它注冊到MonitorFactory類中。這樣只要我們去訪問剛才創建的monitor目錄下的jsp就可以看到性能監測頁面了。

          2, ,接下來我們看看在使用spring的情況下如何監測一個bean的方法調用。Spring也提供了對Jamon的支持(spring支持的東西還真多啊),也就是文章開頭提出的那個攔截器,為了給我們的bean加上攔截器,我們在spring的applicationcontext配置文件中加入如下語句:
          Java代碼 復制代碼
          1. <bean class="org.springframework.aop.framework.autoproxy.BeanNameAutoProxyCreator">   
          2.         <property name="beanNames">   
          3.             <list>   
          4.                 <value>userService</value>                 
          5.             </list>   
          6.         </property>   
          7.         <property name="interceptorNames">   
          8.             <list>   
          9.                 <value>jamonInterceptor</value>   
          10.             </list>   
          11.         </property>   
          12.     </bean>   
          13.        
          14.     <bean id="jamonInterceptor" class="org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor">   
          15. </bean>  

          上面這個是典型的spring的aop的配置,如果對spring的aop配置不了解的可以去看一下spring中文文檔,當然如果不想了解的話即使直接把這段配置拷到自己的項目中也是可以直接使用的。

          還有一個步驟就是在你的log4j.properties中加入這句代碼:
          Java代碼 復制代碼
          1. log4j.logger.org.springframework.aop.interceptor.JamonPerformanceMonitorInterceptor = TRACE  

          如果沒有這一行,那么這個攔截器是不會把方法調用的信息向MonitorFactory注冊的。

          只需要這些步驟,userservice中的方法在調用的時候就可以被攔截,然后將其注冊到MonitorFactory中去了。

          所有的配置完成之后我們來看一下效果吧:
          http://www.javaeye.com/topics/download/b2bac96e-6c18-4340-b7e0-f84c7bb6adca從這個圖上我們可以看到,所有頁面被訪問的次數,UserService中的getAllUsers被調用的次數,最右邊的是訪問時間。這只是整個圖的一部分,當然這個頁面中也包括每一個頁面被訪問的次數和第一次訪問的時間等等。下載附件運行,就可以看到所有的頁面了。

          三,總結
          根據以上的步驟,我們就可以監測我們的程序了,應用程序中哪些頁面被訪問的多,哪些頁面被訪問的少,哪些方法被訪問的多,哪些方法被訪問的少,以及訪問高峰期集中在什么時間等等,有了這些參數,我們更可以有針對性的對應用程序進行優化了,比如說某個頁面訪問比較頻繁,我就可以用ehcache或oscache給這個頁面做一個緩存。如果某個方法的訪問比較頻繁那就看看這個方法能否進一步優化,是需要異步,還是需要緩存,還是需要其他等等,總之有了jamon可以給我們帶來更多的便捷,既可以讓我們知道我們的客戶的行為,也可以讓我們知道我們開發的程序的“能力”。

          其實本文提供的只是對頁面和方法調用的監控,但是jamon可以提供更多功能,比如說sql語句的監控等等,這就需要我們共同去發掘了。

          附件中包括了一個easywebwork的例子,我把jamon導入到這個例子工程中去,大家可以直接下載運行觀看效果。Easywebwork是一個旨在減少webwork2.2.x系列的xml配置文件的項目,
          如果對這個主題感興趣請到
          http://www.javaeye.com/topic/91614
          http://www.javaeye.com/topic/93814
          參加討論。





          之前有一篇文章講到如何使用jamon來監控請求以及方法得調用(原文地址見:[url]http://www.javaeye.com/post/354575 [/url]),本文屬于其姊妹篇,使用jamon監控系統的sql調用及其調用效率。

          需求:
          1我們知道在使用hibernate得時候,我們可以打開show sql選項,可以直接查看sql語句調用的情況,那么當我們使用其他持久技術的時候我們也需要這個功能怎么辦呢,沒有關系,jamon能夠幫我們做到。

          2 很多時候,不同的程序員會寫出不同的性能的sql,有時候可能會不小心或者因為不知道而寫出性能很差的sql,我自己曾經就發生過這種事情,在500w條數據的表里使用了一個limit來分頁,到后面,執行一條sql都需要幾分鐘,諸如此類的時候可能大家都有碰到過,如果能有監控sql性能的工具嵌在應用里該多好,當然有jamon就可以幫我們做到。

          對于jamon來說,每一個query的執行之后的統計結果都會被保存下來,這些概要統計都以MonProxy-SQL開頭。這些統計中包括查詢執行的時間,有比如平均時間,執行總時間,最小執行時間,最大執行時間,這些東西難道不是我們正想要的嗎。

          那么讓我們開始吧,我們知道,這些query執行的統計應該是在connection中被統計的,也就是說我們要代理一般的connection,而connection又是由datasource產生的,所以我們可以代理datasource,說干就干。

          一個datasource接口中關于connection的方法只有兩個:
          Java代碼 復制代碼
          1. /**  
          2.    * <p>Attempts to establish a connection with the data source that  
          3.    * this <code>DataSource</code> object represents.  
          4.    *  
          5.    * @return  a connection to the data source  
          6.    * @exception SQLException if a database access error occurs  
          7.    */  
          8.   Connection getConnection() throws SQLException;   
          9.          
          10.   /**  
          11.    * <p>Attempts to establish a connection with the data source that  
          12.    * this <code>DataSource</code> object represents.  
          13.    *  
          14.    * @param username the database user on whose behalf the connection is   
          15.    *  being made  
          16.    * @param password the user's password  
          17.    * @return  a connection to the data source  
          18.    * @exception SQLException if a database access error occurs  
          19.    * @since 1.4  
          20.    */  
          21.   Connection getConnection(String username, String password)    
          22.     throws SQLException;  

          也就是說我們只要override這兩個方法即可。
          根據這個思路我寫了以下代碼:
          Java代碼 復制代碼
          1. /**  
          2.  * @author ahuaxuan(aaron zhang)  
          3.  * @since 2008-2-25  
          4.  * @version $Id$  
          5.  */  
          6. public class MonitorDataSource implements DataSource {   
          7.     public DataSource realDataSource;   
          8.   
          9.     public void setRealDataSource(DataSource realDataSource) {   
          10.         this.realDataSource = realDataSource;   
          11.     }   
          12.   
          13.     public DataSource getRealDataSource() {   
          14.         return realDataSource;   
          15.     }   
          16.     public Connection getConnection() throws SQLException {   
          17. //表示由jamon來代理realDataSource返回的Connection   
          18.         return MonProxyFactory.monitor(realDataSource.getConnection());   
          19.     }   
          20.   
          21.     public Connection getConnection(String username, String password)   
          22.             throws SQLException {   
          23. //表示由jamon來代理realDataSource返回的Connection   
          24.   
          25.         return MonProxyFactory.monitor(realDataSource.getConnection(username,   
          26.                 password));   
          27.     }   
          28. }  

          顯然這個一個代理模式。接下來就是生成這個代理類,我是在spring中注冊了這么一個類:
          Java代碼 復制代碼
          1. <bean id="writeMonitorDataSource" class="org.ahuaxuan.MonitorDataSource" destroy-method="close">   
          2.         <property name="realDataSource" ref="writeDataSource"/>   
          3.     </bean>  


          writeMonitorDataSource 所依賴的writeDataSource就是我們真正配置的datasource,比如:
          Java代碼 復制代碼
          1. <bean id="writeDataSource" class="org.apache.commons.dbcp.BasicDataSource" destroy-method="close">   
          2.         <property name="driverClassName">   
          3.             <value>${jdbc.driverClassName}</value>   
          4.         </property>   
          5.         <property name="url">   
          6.             <value>${jdbc.url}</value>   
          7.         </property>   
          8.         <property name="username">   
          9.             <value>${jdbc.username}</value>   
          10.         </property>   
          11.         <property name="password">   
          12.             <value>${jdbc.password}</value>   
          13.         </property>   
          14.         <property name="maxActive">   
          15.             <value>${jdbc.maxActive}</value>   
          16.         </property>   
          17.         <property name="maxIdle">   
          18.             <value>${jdbc.maxIdle}</value>   
          19.         </property>   
          20.         <property name="maxWait">   
          21.             <value>${jdbc.maxWait}</value>   
          22.         </property>   
          23. </bean>  

          好了,那么在使用datasource的時候,我們應該用哪個呢,當然是writeMonitorDataSource這個里,我們可以把它注入給jdbcTemplate,或者sessionfactory,或者其他需要用到datasource的地方。

          到這里,就一切準備完畢了,我們可以看看我們sql語句的執行效率了(這個頁面的地址為sql.jsp):
          見圖1
          當然要我們的應用能夠顯示這個頁面,我們需要把jamon的一組頁面拷到我們的應用中,這一組頁面包含在我提供下載的包中,最新的jamon版本是2.7。

          我們可以看到id為153的那條sql語句執行了78ms,我要去看看這條sql語句是不是有點什么問題或者是否有優化的可能性。

          當然,剛才說到每一條sql語句都是有統計平均時間,最大最小執行時間等等,沒錯,在另外一個頁面jamonadmin.jsp上就包含這些內容
          見圖2
                

          上面的圖片代表hits表示執行次數,avg表示sql執行的平均時間,后面的min和max表示sql執行的最小耗時和最大耗時。從這里我們能夠更直觀的看到我們每條sql語句執行的情況。很有用的一個功能。

          而且在上面那兩個頁面上,我們還可以選擇把sql執行的結果導出來,可以導成xml或excel格式。

          總結:使用jamon來監控我們的sql語句我覺得很有使用意義,而且使用jamon對我們的應用來說完全是松耦合的,根本不需要更改我們的業務邏輯代碼,完全是可插拔的,我們也可以開發時使用jamon,部署時拔掉jamon。有了它能夠使一些程序員能夠更多一點的關注自己所寫的sql的效率,當然如果之前開發的時候沒有使用jamon也沒有關系,即使上線后也可以查看一下sql語句是否有問題,比如哪些sql語句執行得比較頻繁,是否存在給其做緩存得可能性等等。總之使用jamon在應用程序中來監控我們得sql語句具有很強得實用意義,

          再次總結:jamon,很好,很強大。
          posted @ 2010-07-28 16:06 不高興 閱讀(2090) | 評論 (0)編輯 收藏
           
          我在解析XML文件中出現如下錯誤:

          org.xml.sax.SAXParseException: The reference to entity "Stars" must end with the  ';' delimiter.

          經查實發現,xml文件里有&的字眼

          把其中的"&"轉義字符&amp; 代替,就OK了

          posted @ 2010-06-01 13:42 不高興 閱讀(1013) | 評論 (2)編輯 收藏
           
                  var check=function(e){
          e=e||window.event;
          if((e.which||e.keyCode)==116 || (e.ctrlKey && (e.which||e.keyCode)==82)){
          if(e.preventDefault){
          e.preventDefault();
          }
          else{
          event.keyCode = 0;
          e.returnValue=false;
          }
          }
          }
          if(document.addEventListener){
            document.addEventListener("keydown",check,false);
          }
          else{
            document.attachEvent("onkeydown",check);
          }
          posted @ 2010-05-31 20:48 不高興 閱讀(722) | 評論 (0)編輯 收藏
           
          function inti(){
           var temp="6668913&dflkewiofsdlfhewjl";
           
          var ByteCount =0;
           for (i=0;i<temp.length;i++){
            ByteCount  = temp.charCodeAt(i);
            if(ByteCount.length==1){
                 ByteCount  ="0"+ByteCount 
            }
            ByteCount  = ByteCount.toString(16).toUpperCase();
            document.getElementById('result').innerHTML +=ByteCount ;
            }
          }
          posted @ 2010-05-27 15:39 不高興 閱讀(4348) | 評論 (2)編輯 收藏
           

          1. Java語言基礎

          談到Java語言基礎學習的書籍,大家肯定會推薦Bruce Eckel的《Thinking in Java》。它是一本寫的相當深刻的技術書籍,Java語言基礎部分基本沒有其它任何一本書可以超越它。該書的作者Bruce Eckel在網絡上被稱為天才的投機者,作者的《Thinking in C++》在1995年曾獲SoftwareDevelopment Jolt Award最佳書籍大獎,《Thinking in Java》被評為1999年Java World“最愛讀者歡迎圖書”,并且贏得了編輯首選圖書獎。作者從1986年至今,已經發表了超過150篇計算機技術文章,出版了6本書(其中4本是關 于C++的),并且在全世界做了數百次演講。他是《Thinking in Java》、《Thinking in C++》、《C++ Inside & Out》《Using C++》和《Thinking in Patterns》的作者,同時還是《Black Belt C++》文集的編輯。他的書被讀者稱為“最好的Java參考書……絕對讓人震驚”;“購買Java參考書最明智的選擇”;“我見過的最棒的編程指南”。作 者的非凡才華,極其跨越語言的能力,使作者被選為Java發展10年間與Java關系最密切的10個人物之一。

          《Thinking in Java》講述了Java語言的方方面面,很多Java語言的老手都評價“這是一本將Java語言講得相當丑陋的書”。該書談及了java語言的很多細節,每一個方面都是相當深刻的。通過本書你可以看到“丑陋的”java語言。

          網絡上關于java語言講解的視頻很多很多,其中不凡有垃圾。《翁愷—JAVA語言》可能是你學習java語言基礎的唯一選擇,該講座基本按照 《Thinking in Java》這本書講解,其中不凡有翁老師的很多有意思的笑話。我很幸運學習就是從此視頻開始的。內容包括30講,我總共看了3遍。

          不過,對于初學者我不太推薦使用《Thinking in Java》,我比較推薦Prentice Hall PTR 的《Core Java 2》國內稱為《Java 2 核心技術》,目前是第七版。網絡上大家都可以下載到電子版。Oreilly的《Java in a nutshell》也是一個不錯的選擇。讀完以上兩本后,你可以看看翁愷老師的視頻,接著可以研究《Thinking in Java》了。


          2. Java數據結構

          市面上關于Java數據結構的書本身就很少很少。大致有APress 的《Java Collections》,Jones 和Bartlett 的《Data Structures in Java》、《Object-oriented Data Structures Using Java》以及Prentice Hall 出版的《Data Structures and Algorithms in Java》 (Dec 19, 2005)還有一本就是《Data Structures And Algorithms With Object-oriented Design Patterns In Java》。很幸運我的第一本英文書就是APress 的《Java Collections》(本書在國內可能根本就沒有中文版――只能下載英文版了),很不錯,講得很有條例、很簡單,是一本完完全全Java Collections API介紹的書籍,其中不凡有擴展API的例子。這是我推薦你學習java數據結構的唯一一本好書。其它的Jones 和Bartlett的那兩本國內好像有一本中文版,想看你也可以看看。

          在學習完API后,你可以看看java.util包中對應的類了。不過只有在學習過設計模式后你才有可能完全理解整個Java Collections Framework。Java Collections Framework使用了很多著名的設計模式如:迭代器(Iterator)模式,工廠方法模式、裝飾器模式、適配器模式等等。通過研究 java.util包中數據結構的源代碼,你可以知道臭名昭著的Properties類的設計了,同時可能基本具備設計簡單的數據結構的能力了。

          所謂學習無止境,學習完Sun提供了Java Collections Framework后,你可以研究Apche的另一個Java Collections Framework,很有意思哦。互為補充的兩個Framework。



          在大家學習、研究Java Collections之前,我提示一下Java Collections主要包括以下三部分:接口(Interface)、實現(Implemention)和算法(Algorithm)。

          1. 接口主要有List、Set、Queue和 Map。List 、Se t和Queue是 Collection接口的子接口。

          2. 實現主要是實現這些接口的具體類。如實現List接口的ArrayList、LinkedList、Stack和Vector;實現Set接口的 HashSet、TreeSet 和LinkedHashSet;實現Queue接口的PriorityQueue、SynchronousQueue等等;實現Map接口的 HashMap、TreeMap、Hashtable、Properties、WeakHashMap等等。

          3. 算法主要是由Arrays類和Collections類提供的,它是整個Java Collection Framework算法的核心。支持各種類型的排序,查找等常用操作。

          Java Collections中包含兩個版本的數據結構,主要是原先的支持同步的數據結構和后來不支持同步的數據結構。

          Java Collection Framework在使用Comparator和Comparable接口支持排序。同時提供新舊兩個版本的迭代器Iterator和Enumeraton,以及它們如何轉換等等。

          在java.util包中的Obserable接口和Observer類是考察者模式的核心。

          ……


          3. Java IO

          市面上關于IO的書籍也僅僅只有Oreilly出版社的兩本,都是Elliotte Rusty Harold的著作。兩本書的風格基本一致,推薦閱讀是第一版的《Jvava I/O》,講得比較淺顯,內容相對比較集中,實例也很多。第二版今年5月國外才出版,很有幸我在網絡上下載了第二版,講得極其詳細――726頁的大塊頭(我化了兩個星期),這次將NIO和IO和在一起,還包括J2ME部分的,不過串口、并口通信部分好像類庫支持不夠,自己不能實際操作。

          與第一版的《Jvava I/O》一起的Oreilly還有一本《Jvava NIO》,也是很不錯的哦。

          大家在依次閱讀完《Jvava I/O》以及《Jvava NIO》后,可以研究java.io包中的源代碼了。在大家研究源代碼前我給點提示:

          Java的io包主要包括:

          1. 兩種流:字節流(byte Stream)和字符流(character stream),這兩種流不存在所謂的誰代替誰、誰比誰高級之說,它們互為補充,只是側重點不同而已。

          2. 兩種對稱:1.字節流、字符流的對稱;2.輸入、輸出的對稱。

          3. 一個橋梁:將字節流轉變為字符流的InputStreamReader和OutputStreamWriter。

          其中必須注意:

          1. PipedInputStream和PipedOutputStrem是兩個比較有趣的類。

          2. 支持Buffered的流是我們經常使用的類。

          3. 裝飾器(Decorator)模式在java最著名的應用就是用于io的設計。仔細研究各個Filter流與具體流的關系,多看設計模式的書籍。相信你會有所所獲。

          4. 學習好io包,是研究net包,rmi包……的基礎哦!


          4 . Java數據庫

          數據庫的書籍太多太多了,也是太爛太爛了!這方面的書我基本都研究過,推薦的你就看看Apress的《JDBC Recipes A Problem Solution Approach 》很不錯,國外2005年底才出版,(國內好像沒有中文版,不過出了中文版也不一定值得看――國內經常將國外的書翻譯得一塌糊涂、不堪入目)不過我們真的很幸運,網絡上有電子版的。值得一看。推薦我看的第一本比較滿意的――Wiley出版的《Java Database Bible》,講得很不錯!Sun公司自己的關于JDBC API介紹的那一本《JDBC API Tutorial andRefernece》也不錯。我第二本JDBC的就是研究的這套API。

          不過目前這些書都是一些相對比較浮淺的API應用的書籍。有機會我會給大家帶來介紹JDBC API以及JDBC實現內部細節的書!我盡快努力,同時希望得到大家的支持!

          順便給學習JDBC的朋友一點提示:

          JDBC的學習和使用主要是這套API,其使用過程也是極其簡單,下面是使用JDBC的一般流程:

          1. 加載某個數據庫的驅動(Driver類),通常使用Class.forName(“驅動的類名“);

          2. 連接數據庫――

          Connection con = DriverManager.getConnection(url,username,password);

          3. 得到會話――Statement stmt = con.createStatement();

          4. 執行操作――Result rs = stmt.executeQuery(“SQL查詢語句”);

          5. 處理結果――

          while(rs.next()){

          String col1 = rs.getString(1);

          ……

          }

          簡單吧!整個JDBC中可以變化的一般是:

          1. 可以由Connection對象創建Statement、PreparedStatement和CallableStatement創建三種類型的Statement。

          2. 可以創建多種類型的ResultSet:支持單向移動和個自由移動;可更新的和不可更新的;支持不同等級的交易的…..

          3. 數據輸入的批處理。

          4. 結果集中特殊類型(Blob、Clob、Arrary和Ref、Struct)列的操作。

          5. 這些特殊類型的錄入數據庫。

          6. javax.sql包中特殊結果集(CachedRowSet、JdbcRowSet、WebRowSet)的操作。

          7. 其它的就是一個DataSource了,也很簡單!一個J2EE中的被管理對象

          簡單吧!相信大家很快就會征服JDBC。


          5. Java 網絡編程

          網絡編程――一個神秘的、充滿挑戰的方向。不過在談Java網絡編程之前首先感謝Sun公司的開發人員,因為它們天才的設想,充滿智慧的架構,使廣大java程序員學習java網絡編程變得異常簡單。

          Java網絡編程方面的書,我推薦O'Reilly的《Java Network Programming》,目前已經第三版了,以前的版本市面上肯定有!網絡上早有第三版的電子版,國外2004年出版,706頁哦!講得很全,比較深入,太深入的可能由于Sun有些東西沒有完全公開,所以也就不好講了,有興趣的可以下載看看!第二本還是O'Reilly 1998年出版的《Java distributed computing 》,基礎部分寫得比較詳細,后面的實例還是值得研究的。

          在大家閱讀這些書之前,給大家一點提示:

          java網絡編程其實相對比較簡單,入門也很快很快。java網絡編程主要包括兩個部分:1.Socket;2.URL部分。不過第二部分也完全建立在第一部分的基礎上。

          1. Socket包括客戶端的Socket和服務器端的ServerSocket。還有就是DatagramSocket和DatagramPacket,它對應于UDP通信協議。 總之,Socket部分是建立其它高級協議的基礎。

          2. URL類是一個網絡資源定位器,通常和具體的網絡協議如HTTP,FTP,Telnet……相關。通過該類可以連接網絡上的資源,通過其 openStream可以以io包中的流(InputStream)的形式讀取網絡資源;通過其OpenConnection方法,可以打開一個連接,在此連接上可以不僅可以完成讀的操作,還可以完成寫的操作。

          Java的網絡編程大體包括以上兩部分。網絡編程和IO以及多線程部分非常密切,在學習此部分前大家一定對這兩部分了解比較透徹。

          學習了以上部分你可以研究java.net 包中的與此相關的源代碼了!研究所有的源代碼還為時尚早。在整個net包中包含: ContentHandlerFactory、URLStreamHandlerFactory、URLStreamHandler、 URLClassLoader等輔助類,它們構成了java.net網絡編程的框架,通過研究其源代碼,你不僅可以快速理解java.net包,還可以為 以后擴展該包打下基礎,甚至可以將此思維方式運用到自己的項目中。

          到此為止你對java.net 包應該才了解60%,還有一部分你可以使用JDecompiler之類的反編譯軟件打開你JDK安裝目錄下\jdkxxx\ jre\lib目錄中的rt.jar,用WinRAR之類的軟件打開它的sun.net包,反編譯所有的文件,它是URL類工作的細節。當研究完該 sun.net包,你就會對整個網絡編程很熟悉很熟悉了。

          一切看起來我們已經對網絡編程很精通了。其實不然,剛剛開始而已,要想深入,請繼續吧!網絡上很多優秀的網絡編程庫甚至軟件可以為我們“添加功力”。如 Apache的HttpCore和HTTPConnection 是兩個和HTTP協議相關庫;JGroups是研究分布式通信、群組通信的必讀庫;接著我們可以研究P2P的軟件包,如Sun公司的JXTA,它可能是 java平臺點對點通信未來的標準哦!接著你可以研究成熟得不得了,使用極其廣泛得P2P軟件Azureus!www.sourceforge.net可以下載到!

          千里之行始于足下!Just do it !(目前我也只研究了net包,其它的會在不久的將來繼續深入。Sun公司因為某些原因沒有公開net的其它實現細節,在其允許將其源代碼以文字的形式加 以研究,以及允許將其沒有公開的實現寫入書中時,我很希望能出一本java網絡編程的書籍,以飧廣大讀者!!)
          6. Servlet和JSP

          Servlet、JSP的書也是滿地都是!值得推薦的也僅僅兩三本。實推Addison Wiley的《Servlets and JavaServer pages :The J2EE Technology Web Tier》,又是一本很厚的哦!國外2003年出版、784頁,講得比較全,例子也很多,特別是第八章Filter,舉了幾個不錯的例子。其它所有我看到的關于Servlet和JSP的書都沒有如此深入的!(可能有我沒有看到而已)。O’reilly的《Java Servlet Programming》和《Java Server Pages》相對比較好懂一些,可以讀讀!

          在大家學習Servlet和Jsp之前我還是要提醒一下:

          本質上說Servlet就是一個實現Servlet接口的、部署于服務器端的服務器端的程序罷了!它可以象寫其它任何java應用程序一樣編寫,它可以操作數據庫、可以操作本地文件、可以連接本地EJB……編寫Servlet程序的一般流程為:

          1. 繼承一個HttpServlet類;

          2. 覆蓋其doGet、doPost方法;

          3. 在覆蓋方法的內部操作方法參數HttpServletRequest和HttpServletResponse。

          4. 讀取請求利用HttpServletRequest。利用HttpServletRequest你可以操作Http協議的協議頭、可以得到請求的操作方法、可以得到請求的路徑、可以得到請求的字符串、以及和請求客戶相關的信息,更主要的你可以得到Cookie和HttpSession這兩個對象。

          5. 利用Cookie你可以操作“甜心”對象或者將其寫入HttpServletResponse中。

          6. 向客戶輸出信息可以使用HttpServletResponse。使用HttpServletResponse可以寫入各種類型的協議頭、可以增加Cookie、可以重定向其它URL、可以向客戶發送Http協議的狀態碼。

          7. 利用HttpSession在會話內完成你想實現的任何功能。

          同時Servlet還提供了一些事件和事件監聽器(簡單的觀察者模式而已)。還有就是過濾器(Filter)和包裝器(ServletRequestWrapper、ServletResponseWrapper)――簡單的流的使用和裝飾器模式的使用。

          學習Sevlet、JSP必然要部署到服務器中,記住通常文件部署的步驟和參數的設置以及在程序中如何使用就可以了。

          完全理解Servlet后,學習jsp相對比較容易了!Jsp完全建立在Servlet的基礎上,它是為了迎合那些喜歡在Html文檔中嵌入腳本(如:PHP之類的網頁編程語言)的程序員的需要罷了!學起來也相當的容易!

          一切看起來似乎那么的風平浪靜,簡單好學!簡單的表象背后有其復雜的機理。要想對Servlet和Jsp徹底研究,你得研究Tomcat等開源軟件的具體實現。它無非就是一個服務器,在客戶利用網頁通過HTTP協議向服務器發送請求后,服務器將此HTTP請求轉化為相應的 HttpServletRequest對象,調用你編寫的Servlet罷了,在你的Servlet中你肯定操作了此 HttpServletRequest了吧,同時操作了HttpServletResponse了吧,服務器就將此 HttpServletResponse按照HTTP協議的要求利用HTTP協議發送給你的瀏覽器了!在服務器端的Jsp網頁在被客戶請求后, Tomcat會利用編譯軟件,使用javax.servlet.jsp包中的模板,編譯此jsp文件,編譯后就是一個Servlet!以后的操作和 Servlet完全一樣哦!

          在Servlet和Jsp的基礎上出現了,所謂的高級技術:JSTL,Struts……無非就是一些標簽和MVC模式的使用。

          繼續前進吧!勝利就在前方!!


          7. 多線程

          一個看起來很神秘,卻很容易上手、很難精通的方向!

          我推薦兩本我感覺很好的書籍。首先是我第一本能上手看的這方面的書,Sams 1998年出版的《Java Thread Programming》,寫得暴好,很容易讀懂,我有空還時常看當時的筆記!要知道怎么好你自己看吧!第二本OReilly三次出版的《Java Threads》,最新是2004版,國內好像有中文版,推薦你還是看英文版的吧!書中談到了與多線程相關的N個方向,如IO、Swing、 Collection等等。

          給大家一點提示吧!java類庫中與多線程相關的類不是很多,主要有:Thread、ThreadGroup以及ThreadLocal和 InheritableThreadLocal四個類和一個Runnable接口;關鍵字synchronize、volatile ;以及Object對象的wait、notify、notifyAll方法!

          1 Thread是多線程的核心類,提供了一系列創建和操作多線程的方法。

          2 ThreadGroup是一個管理Thread的工具類。

          3 ThreadLocal和InheritableThreadLocal為Thread提供了一個類似保險箱功能的存儲線程對象的類!

          4 Runnable不用說了吧!

          5 synchronize是同步方法和同步塊的核心哦!多個線程調用此方法時,只有一個線程可以使用此方法,其它方法阻塞,從而保證被操作對象內部狀態完整性。某個線程調用帶有synchronize的方法或塊時會得到該對象的對象鎖,完成塊中的操作后釋放此對象鎖,從而其它對象可以繼續操作。

          6 wait、notify、notifyAll提供了有效的等待/通知機制。Java語言中每一個對象都有一個休息室,任何線程在其操作的對象的狀態不滿足 的情況下,在該對象的休息室中休息,釋放對象鎖;當其它線程操作該對象后,喚醒休息室中的線程,它們再檢查條件,當條件滿足后,執行相應的操作。

          多線程大致就這么多基礎的!簡單嗎!這對于一個真正的程序員應該是不夠的,真正對多線程要有所掌握,請您研究java.util.concurrent包 吧!大師Doug Lea的作品,原先是一個開源的一致性編程的庫,后來被Sun公司并入java類庫。作者的網站上也有另外一個版本的該類庫!值得研究的好東西! Hibernation、OpenJMS等開源軟件都使用了此包!


          8. 設計模式

          談到設計模式很多人多會推薦GOF的那本,該書在Amzon上是五星級的推薦書籍。不過對于學習java沒多久的、特別是java初學者,我很不推薦這本書。主要是該書的例子基本都是C++的,很多細節沒有講述得足夠清楚。

          我給大家推薦的第一本是閻宏博士的《Java 與模式》,它是第一本中國人自己寫的關于設計模式的書籍,寫的比較有趣,融合了很多中華民族的文化和觀念,例子、類圖都比較多,且相對簡單!非常不錯的入門書籍――又是大塊頭哦!

          其次我推薦Wiley出版社出版的《Pattern In Java》一套三本,我才看了第一本,好像第二本不怎么樣,第三本還不錯!

          第三本是中文翻譯版的關于多線程模式的(很難得的中文翻譯版)中國鐵道出版社2003年出版的《Java多線程設計模式》,將多線程模式講得非常淺顯,配有大量的圖例,每章都有習題,最后有答案!我研究多線程模式就是由它開始的!

          第四本,今年出版的Head First系列的《Head First Design Pattern》,秉承Head First系列圖書的優點,大量的類圖、豐富的實例、有趣的注解,值得購買!

          其次在J2EE方向你可以研究閱讀Addison Wesley 2002年出版的《Patterns of Enterprise Application Architecture》,眾多大腕的作品,講企業消息集成的!Sun提供的《J2EE PATTERNS SL500》也很好!晚了推薦那一本Amzon 4星半的《Holub on patterns》,大師的作品,提供了,很值得研究的例子,不過對上面四本不是很熟悉的讀者,最好不要讀它!可能會讓你比較累!

          我學習設計模式經過一段很曲折的路線,前前后后大約看了20本,閻宏博士的《Java 與模式》我看了4遍,還排除我第一次基本沒看懂的看!記得研一時老師給我們講了GOF的那本,作為選修課,我和它們計算機系的碩士、博士們一起,到最后一個班40-50個人,不超過3個人明白,我也沒有明白任何一點(基礎差吧――主要我對C++語言一點都不了解),憑我不伏輸的性格,我認為我對java語 言理解還可以,我就借了《Java 與模式》,結果還是基本沒看懂。很有幸的是讀研三時,聽過了上交大饒若楠老師關于Java OOP語言的講座,我懂了組合書籍模式等三種設計模式后,對其它模式有了強烈的興趣和要征服它的愿望!工作后我買的第一本就是《Java 與模式》,第一遍花了2個月研究了這個1000多頁的大塊頭,后來第三遍15天左右就可以搞定,筆記記了一大本!從此一發不可收拾。

          選對書、埋頭研究。相信很快就會入門的!



          學習Java語言8個簡單的部分,這只是我們研究Java語言的開始!這些都懂了充其量一個java程序員而已,后面的路很長很長!我們可以繼續研究數據庫實現的源代碼、Servlet服務器的源代碼、RMI、EJB、JNDI、面向方面編程、重構、ANT工具、Eclipse工具、Spring工具、 JBoss、JOnAS、Apache Geronimo等J2EE服務器!研究了這些你可能會成為一個出色的J2EE Architecture!你可以繼續研究剖析器、編譯器、JNODE(java寫的操作系統)……



          感謝大家有此耐心,聽我羅羅嗦嗦大半天!感謝大家的閱讀,感謝群里的朋友!這篇文章主要應群里朋友的呼聲――不知道如何選書、不知道從何看起!大半天的功夫完成趕此文章,字句上難免有失誤,同時由于能力有限不凡有錯誤!請閱讀后批評指正!

          上面基本是我研究java語言的順序,以上書籍都是我閱讀過的,不存在替任何出版社宣傳的成分!有的方法可能不適合你,假如你能收獲一點,兩點甚至更多,請你不要吝嗇推薦給你的朋友――共同學習!

          感謝大家的閱讀;感謝互聯網的設計者;感謝java的設計師;感謝www.open-open.com和www.sourceforge.net網站!

          posted @ 2010-01-17 01:16 不高興 閱讀(833) | 評論 (1)編輯 收藏
           

          上海,我的奮斗歲月(非常精彩)                     作者:藍色づ憂郁

          看了論壇里有的兄弟越來越多對現實不滿,工作壓力大,想起自己在上海這五年的經歷,不由感慨頗多。這位兄弟的這些苦惱,曾幾何時也占據了我的頭腦,讓我痛苦不堪。然而,如今回
          首看來,這五年來也這是這些苦惱最終成為我前進的機遇,讓我擁有了目前還算可以生活境遇-700萬身價,對有些兄弟來說可能是微不足道,但是我想大多數朋友還可能,暫時沒有達到這個狀態---沒有半點炫耀的意思,我知道朋友們很多都會成功,會比我
          強得多---所以會對我的經歷感興趣,我決定定下心來,好好寫點文字,希望不會讓朋
          友們失望。

          今天我的心里有一個想法更加清晰,那就是:愛,只有愛,才是一個男人成功的最好動
          力、最合適的動力。而絕不是自己的虛榮心,或者所謂的雄心壯志。作為一個男人,首
          要的一件事是你要有你的真正所愛。它會像原子彈一樣激發你的能力,讓你爆發無窮的
          動力,上帝也會為你感動。這樣的狀態,就是每個人夢寐以求的狀態。
          朋友們,也許你們不同意我的看法,我們先不忙爭論,您先看看我的經歷,看看是不是
          有道理。

          1,上海
          1999年中,我辭去了剛剛分配的國家機關的工作,從***來到了上海。當時我躊躇滿
          志,認為憑借自己的力量和努力一定能夠在這個大都市里站穩腳跟,創下一片屬于自己
          的天空。

          我是1976年出生在***,***的日照和高原氣候,讓我的身材像白楊一樣挺拔,相貌雖
          不敢說英俊非凡,但也讓絕大多數人不討厭。我從小學習可以說是優異的,大學考上了
          國家排名前5的重點大學,當時分配是98年,父親害怕工作難找,一定要我回去做個清
          閑穩定的機關公務員。我覺得自己也可以歷練以下為人處事,就回到了***自治區政
          府。工作了幾個月后,和本部門的同事混得極熟,喝酒、吹牛、查顏觀色的本領提高飛
          快,但是覺得工作實在是研磨青春,浪費生命,就決定辭職,去上海打拼一下。呵呵,
          現在我的同學在***的也都混得很好。這是個性不同了。
          我的專業是經濟管理類的,當時不懂事,自視頗高,到了上海我就傻了:這種人企業根
          本不要,他們要的是有一定技能的人,能干事的人,像我這種實際工作沒做過的人根本
          沒人提供培訓的機會。同學和朋友一個個工作都找到了,就我搞不成低不就的,眼看帶
          來的錢慢慢要見底了,這心里越來越急-難道這里還真沒有我的用武之地了嗎?
          3個月后,我終于找到了一個讓自己暫時滿意的工作,但遠遠不是自己的專業了。我這
          個人興趣比較廣泛,精力也充沛,大學里涉獵很多領域,想法也多,文字功底還可以。
          正好有一個廣告公司招策劃文案,我覺得自己能行,結果一試,公司面試者說我雖然沒
          有做過,但是思路和功底還不錯,再說畢業的學校名聲不錯,就留下我了---現在我還
          是很感激那位前輩,后面的工作也證明了他的眼光。月薪3500,還好,生活問題暫時解
          決了。

          很快我的生活進入了工作狀態,我覺得很快樂。2個月過后,一件讓我猝不及防發生
          了,沒想到由此開始,我的生活發生了這么大的變化。

          2,邂逅
          上班后我對工作極其熱忱,也非常努力,一兩個月后我已經做過了3個Case,客戶和老
          板還有上司都比較滿意。當時我一則是剛從機關出來,一心想好好干個工作,二則是想
          報公司識人用人之恩,做事情時即不惜努力,又謙虛肯學,另外因為經過機關的歷練,
          做人上路又大方,經常請同事喝酒吃飯,他們也愿意幫我,所以很快上手成為部門的骨
          干。到現在我還在勸年輕的朋友們,工作是應該用全身心來投入的,這項投入從理財的
          角度說對任何人來說都不會虧本。呵呵,不過,那段時間存款為0。
          有一天我去上班,那天早上下小雨,從住的地方要打車去公司那里,要車的人多,根本
          打不到車。剛剛輪到我就要上車的時候,一個女孩子從路邊沖過來,頭發已經淋得不像
          話了,拉開后門就要上車。我回頭剛想出口請她下車,看看她淋得那樣,再說讓一個女
          孩子出去我還說真不出來,她也好像也實在沒辦法了,看著我臉紅紅的。我就對她笑了
          一下,退了出去。

          第二天早上,我們又在同一個地方見面了。那天是晴天,大家都在等公交車,她一見我
          就主動向我報以歉意的笑容,我指著快來的公交車笑著說:"你不會把這輛車也搶走
          吧?",她呵呵笑了,說:"今天就讓給你了!"。
          就這樣,我們認識了。

          3,熱戀
          她叫蕓,來自湖南。她不僅有湘妹子的美麗溫婉,也有湖南女子的潑辣和善解人意。她
          也是剛到上海,在一家貿易公司工作。

          我們迅速的認識,相知,然后熱戀。也許熱戀還在相知之前。我至今也有點不明白,為
          什么會忽然愛的一塌糊涂。也許是剛到一個陌生的地方,剛剛脫離了生存的威脅,也許
          是我工作后一直嘻嘻哈哈慣了,忽然有個好女孩出現了,也有了真實的感情我就繳械
          了。

          我們因為住的近,下班后每天都在一起,蕓說我第一次擁抱她時,她就離不開我了,她
          說我的體味讓她無比迷戀。熱戀時我感覺我的精力無窮,每天陪我的蕓到夜里11點12
          點,靈感來了還去公司加班,那段時間工作效率也很高。朋友們都說我的眼睛熠熠閃
          光。我們一天不見就如隔三秋。看著她的眼睛我會忘了饑餓,有很多次我心里碰碰跳著
          回到住所時,忽然發現自己已經餓得受不了了,呵呵。

          有一次我去崇明跟項目,因為晚了船班次停了回不來,所以給她打電話說不回來了。我
          們一晚上竟然通了50多個電話,不是她打過來就是我打過去。第二天一早我一下船,居
          然在碼頭上發現了我的蕓---要知道那里打車也要1個小時的路,她流著眼淚說一夜沒
          睡,一早就來等我了。我們相擁而泣,幸福異常。

          很快我們雙方都認為對方是自己未來家庭里的另一半。到年底的時候,蕓說讓我去她家
          見見她家人。我很緊張,但是很高興,開始準備見面禮。呵呵,那時我們都愛昏了頭,
          根本沒有存錢的想法。好在我的薪水漲到了5500,她也有2500,我們還夠花。
          然而沒多久,一個消息把我的心情打入了十八層地獄。

          4,彩禮
          到年底了,我的禮物也準備的差不多了,一共花了大概4000多。半年多來,我已經成為
          公司的干將,老板也比較看好我。因為我一直是西北人的性格,豪爽但不失明智,工作
          從不計較加班,補助什么的。年底老板還多發了不少,買好禮物手邊已經有1萬了,感覺
          自己有錢了,所以根本沒想到錢的事。
          這時候她的一個表妹從她的老家來了,說是來看看。我想可能主要是她家里人讓她來看
          看我這個未上門的女婿的。她早就給我說過,她家里她媽市老大,決定一切事宜。我們
          不敢怠慢,帶她表妹在上海好好的玩來一遍。最后我感到她表妹對我還是比較滿意,我
          的心也放下來了。

          到了臨走的前幾天,蕓忽然告訴我說,這次上門可能比較正式,語言有些閃爍其詞。我
          有點不明白,心里想可能她媽已經初步考察通過了吧。一天,我們三個人在的時候,她
          表妹開玩笑的樣子對她說,姐,你這么好的條件,彩禮可不能少要啊!姨說了,前街的
          老李家的閨女都要了男方8萬呢,我們決不能少于15萬的。說著還看看我。
          天啊,我像被電打一下,呆住了。說實話,我從小在***長大,風氣很開明的,結婚男
          方有送錢的一般不過4~5萬了不起了,而且還是說明給孩子的。彩禮這個概念只有讀小
          說時接觸過,萬萬沒有想到會有朝一日到自己頭上。她家里人現在說出這個話,絕對是
          當真的,說話的方式都掌握的這么有技巧。我該怎么辦?讓她嫁改變做法想法?省省
          吧!憑什么?家里的底子我清楚,決不能向家里伸手。那該怎么辦?我還是笑著看看蕓
          和她表妹,蕓有點緊張,我心里更不忍了。"呵呵!看來我要表現誠意了。",我笑著
          不置可否的回答。

          我該怎么辦?回去后我翻來覆去地想這個問題。

          5,諾言
          這是痛苦的3天,我幾乎沒怎么睡覺。蕓也看出來了,她小心翼翼地不敢惹我。我心里
          很憋火:怎么弄得嫁女兒跟賣女兒一樣?有時候想干脆吹了算了,可是一想到我們要分
          開,心里就像刀割一樣,眼淚就不由自主的下來。家里一直是清貧的家庭,弟弟還在上
          大學,不可能向家里伸手的;自己的工資?天啊,我現在都覺得錢不夠話,手邊只有1
          萬塊錢,這次去還要準備出血,再說我就是攢錢,也要為我們結婚買房作準備啊,15萬
          給了她家,我們將來怎么辦?。。。

          這么多年來,我對自己的了解是,我喜歡出奇招。想了3天,我有了一個辦法,心就定
          了。蕓有時看著我,不知所措-她知道我的脾氣,家境和經濟狀況,可是,她也知道
          她無力改變她媽的想法,而且關鍵的是,她還有一點想法是彩禮是應該給的。我告訴
          她,別擔心,我有辦法了。

          很快,到了她家了,見面,遞上禮物,聊天。。。她母親和藹而精明,父親穩重而慈
          愛。很快兩天過去了,我們也該走了,這時該來的也該來了。最后的晚餐,她的母親說
          話了:"小D,你在我們這里已經2天了,我們對你還是比較滿意的。你是個不錯的孩
          子。如果沒有意外,希望你們能今年(新的一年)把婚定了。你看什么時候把禮節辦
          了?你們商量一下,也和你家里商量一下,好嗎?對了,我們這邊的風俗你可能還不清
          楚,也不知阿蕓小月給你講了沒有。"

          我馬上接住了話題,笑著說:"謝謝阿姨,伯父,小月和我說了。"這時我看到阿蕓緊
          張的臉都變了,看著我怕得要命。是啊,最后一段千萬別搞砸了。我笑笑讓她放心。
          "阿姨,伯父,你們的心情我我理解,養女兒不容易,再說只有一個女兒,我覺得15萬
          如果比比投入,不算多,甚至還根本不夠。這個錢我們家應該給。"
          "我想阿蕓也把我家里的情況告訴二位老人了,我是這么想的,也不一定合適,您二位
          先聽聽。

          "15萬應該給。但是我覺得既然我工作了,我自食其力了,而且是我娶阿蕓,同時你們
          也覺得我合適,那么這個15萬應該由我來給,而不是我家里來給。

          "你們和阿蕓看中的人,不應該僅僅需要家里有15萬,還要有能力,有能力給阿蕓將來
          的生活帶來幸福。我想,我有這個能力。我自己不僅要有15萬,而且應該向你們證明,
          我有能力給阿蕓幸福。

          "我只有一個要求,就是給我不長的時間,兩年吧。我們還小(阿蕓比我小2歲),晚
          一點結婚也沒關系。兩年后,我會拿出15萬,而且會證明給你們看,我和阿蕓有能力生
          活的幸福。"

          其實,當天晚上我的語言遠遠比我的文字精彩,因為有愛在心里,我打動了她家所有
          人,阿蕓的臉也紅撲撲的。我們走的時候,他家里人很開心,當然也許只是表面上是,
          但是至少他媽默認了我的要求。當然從此后,我感覺有個巨大的大山壓在了我的心里,
          我的生活改變了。

          6,開端
          回到上海以后,我的心情沒有低落,反而有種大戰來臨時的平靜和激動。我心里暗暗下
          定決心,為了我的愛人,我的未來幸福生活,我要付出比別人幾倍的努力,實現我的諾
          言。我全身心地渴望這樣做,而且相信自己一定能夠成功。

          蕓反而很擔心,她和我說要不我們搬到一起,生活上可以節省一些,她和我一起攢錢。
          我拒絕了她。雖然我們早就有了肌膚之親,但是我不想讓她家里人知道,這樣對她不
          好。而且我也不愿讓她一起攢錢,畢竟我說了,這是我的事。我知道一個女孩,生活、
          衣服、化妝品等等,每個月的花費怎么說也要2000塊左右的。我說,蕓這段時間我可能
          就不能給你買很多衣服和化妝品了,她鄭重地點點頭。我不知道,以后我是否會為這個
          決定而后悔。

          我的初步想法是這樣的:因為我只工作了7個月,而我的薪水已經漲到了5500。如果依
          照這個速度,半年后我的薪歲至少應該到8000,一年后最不濟也應該到10000左右。我
          可以什么都作,而且可以往管理方面發展,這樣,我每月存下70%的工資,2年下來加上
          年終獎,也就差不多了。而且,那時候即便把15萬都"上供"了,我的年收入也能夠讓
          我們生活的小康。

          現在回想我那時候想法,心里只有兩個字:幼稚。事態的發展果然證實了那句話:計劃
          在現實面前永遠是無用的。

          7,失敗
          很快,現實給了我重重一擊。一個偶然的機會,我和大老板聊起來,他告訴我策劃和創
          意人才可以很快贏得中等偏上的薪資,但是要達到5位數,只有2年的工作經歷基本不可
          能。因為國內的商業條件還不成熟,客戶的能力也有限。所有的公司愿意付出一些成本
          搞定客戶,在策劃和創意上達到80%的滿意就可以了。而且,公司愿意把高薪給業務人
          員和管理人員,一個只有2年工作經歷的人基本不具備它所需要的人脈資源、操作能力
          和管理能力。

          我明白了老板的意思。我開始在市場上尋找其他的公司。但是現實很快讓我失望,要在
          一年內獲得萬元以上的月薪根本是不可能的。好的公司有,但都說2到3年內有希望,如
          果做得好的話。老天,我的時間不夠了!同時,公司知道了我在外面找工作的事情,老
          板們很不開心,因為平心而論公司覺得已經待我不薄了。說實話,這條路成功的可能
          性很大,但是時間不夠啊!
          怎么辦?

          我決定辭職。

          8,艱辛
          既然已經證明此路不通,再留下去就是浪費時間。我的時間不多了。而且我認為自己如
          果辭職,就有的是大塊的時間,能夠接觸更多更深的社會,機會也相應的多了。阿蕓不
          同意,她說這樣太不穩定了。我沒法說服她,她也沒辦法說服我。這件事我還是做了,
          我知道,只能破釜沉舟了。

          臨走時和老板深談了一次,請他原諒。也把我的處境部分告訴了他。我們談得很好。老
          板很惋惜,讓我以后有可能還回來工作,我也很依依不舍,但是我已經沒有退路了。
          我開始了在上海灘到處漫游的經歷,騎著一輛破自行車到處在上海轉,到處找有限的熟
          人,問有沒有項目做。我身邊有1萬2千多塊錢,覺得還可以支撐半年吧。我想,這半年
          里如果有策劃項目做,我就辛苦點,把所有的事情都自己做了,應該可以掙個2到3萬,
          多做幾個項目就比打工好了。呵呵,如果朋友們誰有我那時一樣的想法,今天我一定勸
          你千萬別!事后想,我太自信了太著急了,真是應該邊工作邊找機會,時機成熟再干
          的,否則下海99%是被淹死。我就這樣風里來雨里去,跑了2個月,一個單子也沒有跑
          到,加上有一次丟了包,損失了1000多塊錢和手機。住宿、吃飯、交通花了3500塊錢,
          身邊只剩7000多塊錢了。可是一點沒有轉機的跡象出現。

          9,機遇
          就在這時候,一個令人不敢相信的、非常好的機會出現了。我以前的一個客戶找到我,
          說是他的一個朋友在上海嘉定那邊的一個鎮里做鎮長,他們鎮上3個月后要辦一個"水
          鄉情思"的活動,主要是吸引港臺和外籍人士的資金投資。他們要我構思起草一個大型
          活動的策劃書,價格是4萬元。這個客戶說以前在我們公司和我合作過,覺得我有這個
          能力,而且拿到公司去做策劃,價格一般要到8萬以上。我們合作空間更大,而且如果
          策劃書做的好的話,活動組織和制作我們還有機會。我很開心,明白他是想自己也賺一
          些,立刻給了他2000元的好處費。不知道這個習慣有沒有影響我,直到現在我都認為機
          會來了一定要投入,而不是大多數人認為的不見兔子不撒鷹。

          我廢寢忘食地工作了20多天,每天夜里干到2點,稿子改了4次。然后又自己貼了400多
          塊錢制作了3本樣本。交給那朋友的時候,他非常贊賞,連聲說做的太好了,看來后面
          的制作也沒問題了,一周之內我就等著拿錢吧。我也心里感嘆投入沒有白投,連忙把這
          個好消息告訴了蕓,她也非常開心。畢竟這是我的第一筆收入啊!而且金額還算不少。

          10,被騙
          我萬萬沒有想到,這次看起來不錯的機會竟然實際上是碰上了一個騙子。這個客戶拿到
          了我的方案以后,竟然人間蒸發了!我苦苦等了一周以后,這家伙死活不再和我聯系
          了。我打電話,手機已經停機,跑到他原來公司去找他,公司的人說他早就不做了,現
          在在和一個人合作開公司。我又跑到嘉定的那個鎮上去找我們以前一起見過的他的鎮長
          朋友,鎮長說這個項目早就簽約了,他和我那個客戶也不是朋友,只是簽約公司說策劃
          書部分包給他,他又找到了我,說我是他的助手。現在策劃書已經通過,錢都已經付
          了。我馬上又找到了那家公司,公司說我那個客戶不是他們公司的人,只是他讓公司把
          策劃書部分包給他,錢公司和他剛結清了。知道我的情況后,他們表示同情,但沒辦
          法:現在他們也找不到人,錢也結清了。

          這個打擊對那時的我是致命的,讓我的處境雪上加霜。我已經花了大量的精力不說,原
          來剩下的7000多塊錢已經被我花去了大半,只剩3000多了。更可怕的是我的時間又用去
          了一個多月。

          這是后話:那個客戶我這幾年就再也沒有見過。后來聽說他過得很不好,很多人都在找
          他,他又讓合作伙伴坑了一次,基本上就再也沒有聽說在這個行業里做過什么了。

          11,灰心
          萬分沮喪的我把情況告訴了蕓,告訴她的時候我分明聽到了一個美麗的泡沫在她心里破
          碎的聲音。她表面上沒有說什么,但我知道她失望極了。我們相擁無言,我只能從她這
          里得到一絲溫暖和安慰。她說,你別急,沒關系,我們從頭再來。可是,我的愛人,你
          知道嗎,這個打擊甚至讓我回頭審視自己,懷疑自己:我這樣的一個北方人,是不是適
          合在上海打拼?

          盡管萬分失落和失望,可我不能讓我的女孩對我失望。第二天我強打精神對阿蕓說我要
          重新開始。我考慮了一夜,因為我已經沒錢了,不能再租原來的房子了,我必須去找一
          個民房住,每個月可以省7~800元左右。但是這樣就不能和蕓象以前那樣離的那么近
          了。我說我不能停下來,時間不多了。蕓哭著抱著我說,我一定要多來看她,她會很想
          我,我有經濟困難一定要來找她。我笑著說,你有經濟困難也要來找我啊。
          朋友們,盡管時間已經過去了那么久,可是今天我回憶到這里的時候仍然淚流不止。那
          時候我已經處于最低谷,生存也成問題,可是我仍然愿意回憶那時的事情。我怎么可能
          想到,命運老人會讓以后的我和她發生那么大的變化?

          12,初醒
          我搬到的一個民居是個私房,就是農民自己蓋的房子,房子里面夏天熱冬天冷,而且只
          有10個平房大小。我已經很滿足了,這里每個月租金才200元,比以前我已經省了800塊
          錢了。

          搬過來以后,我有很長一段日子不知自己干什么好。我想這是載過跟頭的人的通病吧,
          相信有過類似經歷的朋友會有同感。可是不做事情我心里又焦急萬分。這種矛盾的感覺
          真是讓我每天心里都不好受。

          轉眼一個月就要過去了,這個月里我基本上是饅頭就咸菜,肚子里油水實在缺的厲害。
          我決定去買點熟肉解解饞。我這個民房周圍有幾個新改成的小區,因為離市區比較遠,
          基本上是一些市內動遷戶遷到這里來的,真的購買這里房子的人也都沒什么錢,但是這
          樣的人在上海很多,小區外人氣還是不錯的。這里不像高價房,高價房是開盤很久了還
          沒見幾個人煙。小區之間有條街,人很多但大都是些老人孩子在轉悠。熟肉店生意好象
          不是很好,我要了一些肉又買了一瓶啤酒,在旁邊小店的簡易桌上坐下來吃。

          多年以后我回想那個時刻,還是認為那是上帝給處于絕境的我的一個機遇。就在那時,
          忽然有人和熟食店老板說話,在說老板,你這生意不行啊!是啊,那老板說,我下禮拜
          農忙,準備回家了,不做了。那人說,那你這店怎么辦?那老板說,轉了唄,這半年沒
          賺什么錢,還不如做點別的。忽然我有一種蘇醒的感覺,我到處找錢賺,可是好高騖
          遠,忽視了這身邊的機會,難道自己一直沒看見?我馬上站起來,讓老板再給我一點牛
          肉,然后漫不經心地問他轉讓店面的情況。

          不過十分鐘,我就清楚了:這個店也就10個平方左右,月租金1200,租金他多付了兩個
          月。轉讓費他要求不高,不虧就行,帶一點簡單的設施,2萬塊錢吧。我說我想接手,
          但是價格太高,他降到了1萬8。我說1萬5我今天就要,他回去和他老婆商量了以下,同
          意了。我立刻回房拿了我僅剩的3000塊錢作為訂金付給他,然后當晚立下轉讓書,當然
          他同意我7天內把余款付清。

          13,努力
          我找到以前公司的老板,請他借給我錢。我還帶去了我做的那份策劃書,說我送給公司
          的。老板也多少聽說了我的事情,他詳細地了解了我的境況,二話沒說借給了我1萬5千
          塊錢。我笑著說:"老板,我把身份證押在你這里吧?",老板也笑著說:"你要不要
          我的身份證,1萬5我押在你那里?"其實到現在我都一直敬佩我的老板。他的事業現在
          也做得很好,家資3000多萬了。

          拿到店面前的3天我一直在苦苦思考,怎么能讓我的店面生意大為改觀呢?首先,我回
          憶到以前的雞粥店,覺得上海人愛吃雞,特別是白斬雞,還有烤鴨,決定經營品種適當
          變化;另外,飲食業最重要的是衛生(衛生許可證一年一辦,已經有了),我決定徹底
          打掃店面一天,店面重新貼開業標志,另外買了一個二手的消毒柜,特意擺到臺面上讓
          客戶看到消毒設施的過程;然后,我找了一個上海老師傅來指導制作工藝(退休了返
          聘,很便宜的),再找了2個勤快的四川妹幫忙,允諾給他們業績5%的提成,但是不行
          我就換人;等等大概有20多條措施吧,我當時可是寫滿了2頁紙的,全部做完已經過了
          近10天了。最后,我買了一些鞭炮,噼哩啪啦一放,人氣立刻被我吸引過來了。呵呵,
          當天忙到夜里11點,一盤點營業額居然有500多!

          14,曙光
          做過生意的朋友都知道,開業的當天生意好不見得以后生意一直會好。因為剛開始客戶
          是好奇,試一試,一旦沒有什么特別吸引之處,他們就會立刻忘了你。而你要再吸引他
          們的注意力就困難得多了。

          我明白這個道理,所以第二天開始就在店面前不停的拉人聊天,問味道怎么樣,然后不
          由分說要送他們一些熟食。上海人內外分的很清楚,他們決不會白要別人的東西,絕大
          多數都付點錢,當然他們也不會白給別人東西。當然我明白,生意的關鍵是我的貨品要
          合客戶的口味。慢慢的我的小店人氣就有了。我還請人在幾個小區里張貼了我們店的廣
          告,也請人故意拎我們的烤鴨在幾個小區人多的地方走動,相互之間含喧,巧妙吸引人
          們注意。通過很多這樣的方法,一個月后我的店每天的營業額可以達到800元左右,而
          且還在不斷上升中。呵呵,我以前的策劃功底全部用在這上面了。

          我這樣起早貪黑的忙碌,每天大概干14、5個小時吧,完全把心思撲在了店面上。作了
          第一個月的生意后,我盤點了一下,我一共賺了9000元錢;第二個月我賺了12000。把
          欠的債還掉后,我又沒錢了。但是我感到,我生命中久違的曙光已經來了。說實話,這
          種感覺真的很美妙。

          15,做夢
          我就這樣經營著自己的小店,時間又過了3~4個月。其間我忙得每天只睡5、6個小時,
          一躺下就昏迷不醒的樣子。我和阿蕓通過幾次電話,她也忙,因為她升職為資深業務
          了。我們見過幾次面,她都讓我好好休息一下,我笑著說,把你娶回來再說吧。她說你
          靠那個門臉賺到錢了?我笑笑,決定幾個月后給她一個驚喜。

          4個月后,我已經攢了5萬塊錢,可是也快到年底了。算算我的時間只剩13個月多一點
          了。如果按照現在這個模式發展下去,我完成目標15萬的可能性是穩穩的。我每個月只
          要保持現在的狀態,那么一年以后我應該用18~20萬。錢是夠了,還可以辦個像樣的婚
          禮,不過買房子是暫時不用想的。呵呵,看到這里,不知道又有多少朋友在笑我-樓
          主的幼稚病又犯了!是啊,如果沒有房東的收租事件,我想我會把這樣的夢做下去吧。
          房東來收過幾個月租后,就到年底了。有一天房東忽然出現說是要簽明年的租房合同,
          但是價格貴了一倍。氣得我差點翻臉,這分明是看我生意好了眼紅嘛!可是我知道人在
          屋檐下,不能不低頭啊。再說我現在可是一點問題也不能出。我和他好說歹說,又送給
          他了一些熟食,房東還是加了我1000塊錢。

          這件事讓我意識到危機已經顯現。生意做得好了以后,第一房東的房租會漲價,不可能
          再跌價,各種費用也會漲;第二,很快競爭者就會出現,出現以后和我的小店是同樣規
          模,勢必會分流客戶。所以這種賺錢的狀態是不會持久的。如果我不動作,最后的結果
          我想也想得出:小店幾個月后就回到維持生計的地步。那么我該怎么辦呢?我一夜沒
          睡,苦思對策。

          第二天一早,我下定了決心,決定孤注一擲,冒一把大險!

          16,冒險
          我的計劃是這樣的:第一步,在附近的小區再開幾家這樣的熟食店。地段只要和我現在
          的店面地段差不多就行了,但是不能太近了,然后用一樣的裝修、一樣的名字、一樣的
          策劃手段,建立起小區居民心目中品牌形象,這樣進貨價格會便宜很多,還可以逼迫后
          來者提高投入。這個計劃實施的越快越好。第二步,我覺得現在這個商鋪的價格不高,
          2000多交租不如我把它買下來。上海的朋友都知道,2000年底上海郊區的房子價格只有
          2000多,商鋪也只有3000多。這一步必須穩步實施,一個一個來。但是這樣我就是必須
          投入我現在所有的5萬塊錢,如果一旦失敗,我的時間、金錢投入可能會讓我的目標徹
          底無法實現。但是我又想,我不去做,就把希望寄托在別人別來搶生意上,我去做了,
          希望在我自己身上。相比一下,我愿意把希望寄托在自己身上。

          但是我以前所想的給我的蕓一個驚喜的計劃只能延時了。我心里對自己說,為了她,拿
          出你所有的勁吧!那是無比艱辛的一個月。我不僅要照顧一號店的生意,又要為二號
          店、三號店選址、選人、買設施、店面布置等等。后來我提高了一個一號店店員的提成
          比例,封他為店長,告訴他1個月后店里的營業額如果下降5%以上,立刻換店長。這樣
          我就全身心投入到新店的開張。1個月過后,我的二號店、三號店相繼開張,我還是無
          法清閑,又開始了以前那樣的策劃造勢,而且開始了四號店的準備工作。

          后面的一個月,我一號店的盈利狀況還是不錯,達到了12000元,二號店5000元,3號店
          最好,居然有10000!要知道這是頭一個月,人員還不熟呢!我發現原因是一個女孩店
          員做生意很有天賦,也會招睞客戶,我二話沒說給她工資翻倍,直接提升為店長。

          年底如期到來,我和蕓只在一起度過了半天,就不得不忙著自己的店面了。蕓要回家
          去,我不能走,目標沒有完成我怎么能見她家人呢?不過我和她媽通了一個電話,她媽
          笑著說:"小D,我們知道你是個好樣的孩子,我們都盼著你把我家蕓蕓早點娶走
          呢!"我知道這話里的意思,也笑著回答說:"我會的,謝謝阿姨和伯父的信任。"
          年底年頭的2個月,因為過年,節日也多,我的生意好的一塌糊涂。四號店也趕在春節
          前開了。這兩個月每個店平均一月能賺15000,2個月后我身邊的現金達到了12萬。元旦
          前還有一件事,原來的老板給我打電話說,他公司還有一個轉入戶口的名額,問我要不
          要,我說要。他說我什么都不用管了,把資料給他就行了。為了好好感謝他,過年時我
          去他家給他的孩子送了一個5000塊的紅包。年后不久我的戶口辦下來了。我開始逐步的
          和各個東房談要購買鋪面,如果他們不賣,我就找別的房東談,那是很多房子是物業
          的,比較好拿。而且那時候房價低,再說我找房子前就打的有伏筆,另外我價格給的稍
          高一些,前面3家都談的很順利,單價大概在3700一個平方吧,一共13萬,我全部給的
          是現金。第四家以一共要5萬(生意好啊,房東要挾我),我沒錢了,但是抵押了前面
          的一家店作為3萬先簽了意向書,等到一個月后,資金回籠了,把錢湊齊了把店拿了下
          來。

          這時候已經是3月底了,我還剩8個月。生意好象在穩步進行,目標好像越來越近。可是
          我沒想到,一個足以摧毀我的重創也越來越近了。直到今天我回想到這個讓我記憶深刻
          的時間段,還覺得眼眶里淚水未干。

          17,重創
          時間又過了3個半月,馬上要到7月10日了,我之所以記得這個日子,因為這是蕓的生
          日。我決定在這個日子之前攢足15萬,并把這個消息作為生日禮物送給她。想到她得到
          這個禮物時候的開心,我的心里別提多激動了。這幾個月店面也爭氣,每個店都能夠達
          到10000多的利潤,這是因為我店多了,進貨成本低了,而且房租也不用交了,還有一
          個最主要的原因就是我用了一個很好的店長-小成。

          小成就是我前面破格提拔為店長的那個女孩子。這女孩是從浙江來的,只有19歲,人長
          的清秀漂亮(因為要招徠客戶,這是一個比較重要的因素,招人的時候我就特別注意要
          找看著舒服的女孩)。因為一般的外來妹大多不是浙江來的,所以我特別留意她。沒想
          到這個女孩在做生意方面真的很有天賦,她一直是很開心的樣子,從沒見過她煩過,會
          說話,人很甜,客戶緣很好。而且她很有腦子,開業沒幾天就把所有的常客的名字記熟
          了(我估計她是問周圍的店主和客戶的),還建議我,天氣熱了,店面里配點素菜,啤
          酒,買點簡易桌椅,晚上讓客戶邊吃邊納涼。她還把周圍的幾家飯店的電話弄到了,把
          飯店的生意也拉了進來。后來我們熟食店里的生意飯店進貨居然占了30%!

          不過她也有一點不好,就是好像身體太單薄,力氣活干不了多久就累得臉發白、出虛
          汗。小店生意好的時候,這也挺影響的。我考慮了幾天,決定揚其長,避其短,在店里
          又招了一個身強力壯的小伙子給她打下手,告訴她只管招徠客戶,管理帳務。

          這時候我的一個朋友打電話給我。原來他不知道從什么地方得知我開了幾個店,做得
          還行,而他正在做房產銷售,代理一個別墅的盤子,非要我去看看。上海的朋友都知
          道,2001年的時候上海的房產還遠遠不熱,房產銷售尤其是高價房的銷售很難做。他代
          理的那個別墅房型有180多個平方,周邊的配套還不完善,再說總價要80萬朝上,我不
          想買,就告訴他沒那么多錢。他說,你來看看吧,看了肯定喜歡,再說錢的事情好辦,
          貸款就行了。我說那還要首付呢,我首付也沒有。他說沒關系,他可以在合同上做點手
          腳,讓我零首付,全部貸款。我沒辦法只好去看看,沒想到看了以后特別喜歡別墅下面
          的花園,因為我記得蕓曾經告訴我說,她的夢想就是住在花園的上面,每天早上打開窗
          戶就能聞到花的清香。朋友看我有意,就拼命鼓動我說,買了這個房子這個優惠,那個
          免費的,每月只要付6000多就可以了。我還是有點猶豫,說我不想每月跑銀行。他說,
          我幫你辦,每月自動劃款,不用你操心的。我沒什么再挑的了,想想就定了一套。不過
          后來知道,這小子還是打了埋伏,有些言過其實:窗戶就不是他說的雙層的,車位也不
          是免費的,呵呵。

          7月9日,我拿著那份15萬元的存折卡,興沖沖地拿著一束花,拎著一品瓶紅酒(蛋糕明
          天叫人送來)趕往蕓的住處。之前,我已經給她媽打了一個電話,向她父母親問好。同
          時告訴他們,我已經提前5個月實現了諾言,很快就會娶她家女兒了。我決定先給蕓一
          個驚喜,然后今晚就住在她那里。我特意趕在她下班前一點趕到,準備突然出現,嚇得
          她快樂的大叫。

          可是讓我始料不及的事情出現了,蕓下車時不是一個人,而是和一個男孩一起。他們手
          拉著手,好像很親昵。我一下傻了,不知道怎么辦好,他們一起進了小區,我傻乎乎地
          跟在后面。在光線陰暗處,那男的還一把摟住蕓親了一下。我的腦袋轟的一下,再也受
          不了了。我大叫著蕓的名字,沖上前去一把抓住蕓,然后就要打那個男的。蕓嚇了一
          跳,拼命地拉住我,對那個男人說快走,你先走,我跟他解釋。男的走了,蕓還是拉住
          我不放,我叫到解釋什么?解釋什么?一邊眼淚就快下來了。蕓看著我,很冷靜,冷靜
          的我們好像不認識。她對我說對不起,早該告訴我。但是我今天太不冷靜,她希望我先
          冷靜下來,現在的氣氛我們沒法談。我沒辦法冷靜,說不行,今天你就必須給我一個說
          法。她被我糾纏的沒辦法了,對我說,D,一直以來,我以為你的素質很高,你今天這
          樣會讓我很失望。我停了下來,看著她,眼淚慢慢地流下來,最后對她說,好,我走,
          明天來再談。出了小區,發現花和紅酒居然還在手中,一把把他們扔進了垃圾箱。
          那夜我一夜無眠,盯著外面發呆,怎么也想不明白事情怎么會到這種地步。第二天一早
          我在蕓的樓下等著。蕓下來說我們找個地方吧。我們到了一家茶室,我呆呆坐下,等她
          解釋。那天她說了很多,我都有些記不清了。她說,其實從我搬走我們就很少在一起
          了。她知道我很努力,很辛苦,但是經歷那么多波折,真的很懷疑我是不是能夠實現15
          萬的諾言。她心里開始很怕,但是又沒機會和我說。我的壓力又不和她分擔。在上海這
          么長時間,她和我一樣做得很辛苦也都沒有歸宿感,覺得很累。這時候她的上司,就是
          那個男孩出現在她身邊,男孩是上海人,比她大4歲,在公司職位不錯,家里條件也
          好。蕓說和他在一起,她會覺得很安心,很安定,很有安全感,不像和我在一起,雖然
          感情曾經很熱烈,但是總是不知道我們的將來在那里。她說對不起,真的對不起。我激
          動的渾身亂顫,說不出話來。好容易稍微平靜一些,我告訴她說,我現在有15萬了,你
          還會愛我嗎?她說,對不起,我覺得現在很好,我不能再對不起他了,我們不會再在一
          起了,希望你將來幸福。出門的時候我發現了那個男孩,心里又一陣刺痛。約在這里,
          一定是他們商量的結果。

          18,懷疑
          這真是一個巨大的諷刺。一直以來,我以她為努力奮斗的動力,可是等我奮斗到了目標
          跟前,卻發現目標忽然消失了。我記得那時候,我開始失眠,希望自己趕快入睡,然后
          夢見蕓。可是我一次也沒有夢見她,倒是我清醒的時候一刻也沒有停止想她。我經常覺
          得心里刺痛,頭皮發麻。一直以來,我那么小心翼翼地把她放到我心里的一個最溫暖、
          最柔軟的地方,沒想到最痛苦的打擊卻由這里產生。

          有一個朋友曾經回貼問我,怎樣才能獲得不愛你的女孩的愛,我沒有回答。不是我不愿
          回答,而是我不知道怎樣回答。我真的不是這方面的專家,我也曾痛苦無比,希望能夠
          改變我愛的女孩的心。可是我沒有什么辦法,只有自己默默地退回,獨自一人舔著自己
          的傷口。

          那段時間我對自己過去的所作所為產生了懷疑,我這么做到底有什么意義?如果我還在
          公司工作,每天還有時間,情況就不會這樣。如果我不搬家,事情也不會這樣。如果我
          不開店,就有時間陪她,情況也不會這樣。就是開店了,如果我不開分店,也有時間去
          看她,應該也能阻止她情變。每天我這樣亂七八糟的想法充斥了我的腦海,讓我對生意
          根本提不起興趣。

          店里的員工都看出來了,他們小心翼翼的不敢惹我。幾個店長都很稱職,生怕店里的事
          情會引得我大發雷霆。尤其是小成,她主動找到我說她來每天到個家店里盤點,讓我忙
          我自己的事。我很感激她,也相信她的能力,就告訴幾個店以后由她來查店。我知道自
          己這個狀態如果硬讓我去,非出事不可。小成很有手段,也有能力,查店每天要多做2
          個小時,她很快讓其他人服服帖帖。還好,有小成和他們的幫助,我的生意沒有什么影
          響。

          但是我自己知道,我已經迷失了前進的方向。我不知道怎么再找到這個方向。

          19,迷失
          有人說工作累的時候,家里壓力大的時候很辛苦,我卻不是這樣認為。我覺得一個人迷
          失方向的時候最痛苦,因為你不知道自己應該做什么,這種狀態每天無時無刻不深刻地
          提醒你不過是一具行尸走肉罷了。那個時候就是我迷失方向的時候。我就像一個被抽去
          發條的時鐘鐘擺,每天不過是由慣性推動我在擺動。我不知道什么時候會停擺。也許在
          我的內心深處還在暗暗期盼那停擺的時刻。

          蕓的媽媽給我打了一個電話,接到電話知道是她,我心里真的不知道是什么滋味。她媽
          對我說,孩子,阿姨知道你很難過。你們年輕人的事真不知怎么搞的。但是阿姨告訴
          你,你是個好孩子。你的前途還很遠大。阿蕓不能和你在一起,是她沒福。好好的,我
          們全家都祝福你。聽了這話,我的眼淚又留下來了。以前覺得她是那么固執和勢力,今
          天怎么覺得她的話那么溫暖。我終于能夠真正站到一個父母的角度上來看彩禮這件事,
          是啊,那是要把自己女兒未來幸福生活盡量多地抓到手里的感覺。

          在這里我要感謝我的一位大學同學楓,如果不是他湊巧來到上海,要我陪同的話,我不
          知道我這種狀態要持續多久。楓來上海玩,指定我陪,而且說陪得不好當即給所有哥們
          打電話說上海沒我。我強打精神,楓還是有所察覺。楓一見我就說,你小子怎么減肥減
          的那么明顯,不行不行,我們不能一起照相,否則班花見了照片,我一點想頭都沒了。
          他就是這樣,那幾天逗得我開心了一些。要走的時候,楓說,說說吧,怎么了。我這才
          知道,他早看出我有事,所以一直在讓我開心。從蕓變心以來,我從沒有向人傾訴過。
          楓聽過了之后,很久沒有說話。后來一開口就是一句:"好!這是好事!"我聽的愣
          了。

          楓接著解釋說,我和蕓現在分開始好事。因為就是現在不分開,我們早晚要分開。因為
          我們不是一路人。蕓的內心深處時那種安分守己的人,經不起動蕩,分開的時間主要視
          我波動的強度而定;而我是那種不安分守己的人,越是不利、越是艱難,越能激發我的
          能力。我適宜在變數中求生存,求發展。而且我不是很在乎物質,所以要的感情是非常
          純粹的,女孩子大多到了要結婚的關鍵時刻,生活現實和撫育后代的本能讓她們不得不
          物質起來。這不能說不對。這也是為什么當初蕓自己也不反對彩禮的原因。他說,我這
          樣的人,只有物質生活到了一個水準后,交往的女孩子才會有安穩的感覺。現在還不
          行。但是我應該感謝蕓,她激發了我,她放了我是我的幸運,否則我們在一起,蕓一定
          會成為我的桎梏。他還說,你的奮斗動力就是她?那你的家人,朋友呢?我們呢?你以
          前的老板呢?你的員工呢?我們還一直以為你能成大氣,為了我們這份信任,你也不應
          該放棄。而且,說實話,你的這點家業還很小很小,一不小心,很快就敗了。

          他還告訴我要留意小成,這小姑娘太聰明。我就是對女的太遲鈍了才栽的跟頭。以后絕
          對不能讓她獨掌財務大權,我一定要控制住她。最后,他拍拍我說,兄弟,醒過來吧,
          外面的世界很殘酷,也很精彩,但是絕對不是為這個樣子的你準備的。

          楓,今天的你也在看這份貼子嗎?如果是的話,我想對你說:哥們,真的謝謝你!

          20,心意
          因為那一場直抒胸臆的傾訴和楓的精到勸慰,我終于慢慢開始擺脫失戀的陰影。我特地
          給家里打了電話,給弟弟也打了電話,同時也和同學朋友紛紛聯系,又去拜訪了以前的
          老板,他們都為我在上海的奮斗狀態和所得高興。我之所以這樣做是想提醒自己,我的
          世界還在,我的生活還在,我要主動地讓他們把我拉回到我的世界里。他們對我的愛也
          會成為我的動力,這是更綿綿不絕,更持久的動力。

          同時我也聽取了楓的建議,重新收回了店面的管理權限和財務權限。我把小成和另外一
          個店長互換了位置,然后仔細的查詢了最近的賬目,還悄悄地私下和其他人談了談,側
          面問了問他們對小成的看法,大家都沒說什么有價值的話,除了一號店店長,他的資格
          最老。一號店長說小成太跋扈,太不尊重人,什么事情都自己定,也不和老板商量,更
          別說其他人了。每天的財務帳、現金全是她管,根本不讓別人插手,也不知道她是怎么
          想的。因為我暫時沒有查到什么小成的把柄,所以只能安慰一下他,也沒有做什么動
          作。

          這時候4號店的小徐(他就是我招的為小成打下手的伙計)找到我,要求要換地方,他
          要跟小成到一個店里去,否則就辭職。我一開始很奇怪,后來恍然大悟,明白了小徐的
          心意:原來小徐已經喜歡上了小成。我同意了小徐的要求,同時更為警惕,因為公司里
          有一對的話,容易形成小集體,而且他們容易一起跳槽,成為我新的競爭對手。我不得
          不暗自多留心小成和小徐。

          21,真愛
          我的心意逐漸回到了生意上。不得不承認,小成有一套。她總結出一些管理規范和待客
          方法很有用處。她的做法比我原來的做法更細,我比較傾向于策劃一些活動和辦法,短
          期效應比較明顯,但長期的發展還是需要細化的管理。生意還是緩步發展,我們基本上
          每半年利潤提升20%,這一方面因為管理的細化,人員的熟悉;另一方面還是得益于這
          里的人氣漸漸旺起來了。這樣過了年,到了2002年4月份,我的手頭已經有了超過50萬
          的資金。經過和小成交談,了解了她的很多想法,我覺得我暫時還時離不開小成。這段
          時間我發現小成對小徐也是淡淡的,他們的關系好像并沒有變得密切起來。

          因為對小成的留心,我發現了小成身上的越來越多的細節:她一個人住,愛干凈,愛
          笑,愛看書,很怕冷,尤其害怕感冒,不喜歡貓狗等等。因為生意的緣故,我和小成的
          交流越來越多,也就越來越了解她的聰明和能干。有時候我想,這么聰明的女孩因為家
          庭的原因不能上大學真是可惜了!又轉念一想,就是上了大學又怎么樣呢?大學生我自
          己不就是嗎?我見得還少嗎?原來戒備心理也可以讓人如此留意一個人。

          有一天我去查店,發現小成沒來上班。我們一般上班很晚,下班也相應晚一些,因為生
          意一般是在下半天。寫到這里,我想到有的朋友懷疑一個10幾平方的熟食店一個月的利
          潤怎么會有10000塊錢,我想說,生意人人做,關鍵看你怎么做。我們的每個店周圍都
          有1000戶左右的小區,很多是租戶,他們不愿開伙。我們每天晚飯時段一般要做50筆生
          意,每筆十幾元,這樣營業額就有700元左右。食品行業一般利潤率一半左右。節假日
          更好做,還不算飯店的生意。當然,我們不用交房租。而且現在的生意也不如那時了,
          這是后話。言歸正傳,我發現小成沒來,就問了一下,有員工說她不舒服,今天不來
          了。小成沒來,小徐也沒來,我想想反正上午每什么事,應該去看看小成是不是病得很
          嚴重,就向他們問了地址,出來買了點水果,打車往小成住的地方趕去。

          小成住的地方我沒有來過,到了小區門口我才發現是個比較高檔的小區,這里一室一廳
          的房子一個月要1000塊吧,我邊走邊想,一邊又很不解為什么小成會把月收入的一小半
          用來租房,尤其是想想自己才剛從私房里搬出不久,現在的房子也不過是1000元左右。
          正在胡思亂想,忽然發現小徐從一個門洞里出來,急匆匆的樣子,我連忙回避在一旁,
          看著小徐跨上自行車往店面的方向趕去。

          忽然在這里看見了小徐的片刻,我的心里產生了一種很奇怪的滋味。一種很不舒服、心
          頭微酸--好像是吃醋的感覺,同時覺得一陣懊惱。這種感覺沒有經過理智,完全好像是
          自然而然產生的,只是片刻之后,我忽然一陣震驚---難道我如此在意小成?難道我不
          知不覺已經愛上了她?這是一個連我自己都吃驚的發現,因為失戀的很久以來,我一直
          覺得自己好像已經不會愛、不能愛了,有時候我會接觸到一些女孩,可是我根本無法提
          起感覺。沒想到,我愛的感覺會在小成這里復蘇?小成可是我一直提防的人啊!

          剎那之間,我的腦海里風起云涌,萬種思路好像被同時激活:是我失去了蕓,把小成作
          為一個感情的替代者了嗎?不是,和小成在一起的感覺完全和蕓不同,我們的交流更平
          和,因而更交融,我也感到更輕松。和蕓在一起完全是被激情和沖動淹沒,我們心靈層
          面的交流顯得更少---如果更多的話,也不致有那樣的結果;是我因為她病了而憐惜她
          嗎?不,憐憫和愛我是分得清的,現在我的心里分明有一種心痛而且甜蜜的感覺;難道
          是見到小徐引起的男人本能的異性排他性不滿?也不是,因為我清清楚楚的知道,我決
          不是一個把身邊所有女孩都看成情人的情圣…..你呀你呀,你經歷過感情的痛苦,所以
          你一定要分辨清楚,這是你的真感情,你的真愛嗎?你不要糊里糊涂的再帶給自己或別
          人痛苦了!

          可是我越是想,小成的笑臉、話語和我們交流的場景等等印象就越清晰,我就越覺得小
          成是真正適合我的女孩。她的開朗,她的平和,她的聰明能干,她的善解人意,還有她
          為我的事業作的努力和成效,當然還有她可愛的、惹人憐惜的樣子---這些我以前都沒
          有明顯地感覺到,可是今天我感覺對我來說就象空氣一樣不可缺少!

          愛情的幼苗一旦破土,成長的速度真是驚人!在我佇立樓下不到30分鐘的之后,我已經
          感到我的心胸開始無法承受它的奔涌,必須要向她傾訴才能緩解。可是我不是一個語言
          表達愛意的能手,尤其是現在這個令人激動的時刻,我覺得我現在激動的別說講話了,
          連一口氣都不能順暢的呼出。我忐忑不安,但又決定立刻向她說出來-就是現在!
          敲開她的房門的時候,她的臉色有些蒼白,可是她的目光那么平靜,柔和,一點也不吃
          驚。我反而更加慌張,不管了,我必須要說---"我,我……你,你,你病了……我
          發現我離不開你!我發現我愛你!小成,你聽我說,我愛你。我喜歡你。我要給你說,
          我離不開你了!"

          那天我說了很多吧?不知道,記不得了。可是結果我卻記得,小成拒絕了我。
          (周一請看:22,原因
          各位,21這一節和理財關系不大,可是對我的人生卻關系重大,所以我把它寫的很細。
          希望你們喜歡。)

          22,原因
          在感情方面,我是一個臉皮很薄的人。小成不聲不響地聽完我語無倫次的表白后,低著
          頭平靜地搖頭表示不能接受,我就不知道該怎么做了。為什么?因為你和小徐?我問。
          她搖搖頭,沒有說話,但我看到她有眼淚流下。呆了一會,我不知該怎么做,一直惶惶
          惑惑地。最后,我還是離開了她的住處。再見到小成,是2天后了。她來上班,我早早
          等在店里,遠處一見她的身影,心里就怦怦跳個不停,可是見了她的面又不知該怎么說
          話。她看見我,好像臉紅了一下,就再沒和我說話。說實話,我覺得她是喜歡我的,尤
          其是回憶到她以前幫我時那種自告奮勇和盡心盡力,我越發這樣認為,但是她為什么拒
          絕我呢?我想不明白,哎,真不理解女孩子的心思啊。她工作起來還是那樣井井有條效
          率很高。我不愿打擾,就去其他店了。

          到了4,5月份,天氣有點熱了,因為剛過了年,生意是屬于淡季。我們希望再熱一些,
          這樣人們愿意出來吃飯;不過因為天熱,食品行業風險很大,絕對不能出現食品變質,
          否則對生意的傷害是很大的。我們這時候一般加緊和飯店聯系,因為飯店要量大,而且
          可以預知,這樣風險小。因為這方面一直是小成負責,所以現在淡季反而她會比較忙,
          我也比較放心。沒想到,不久小成忽然出了事情---她累得暈倒在了店里。

          當時我接到電話飛速趕到店里,小徐已經把小成扶在椅子上坐著,根據小成的指點正在
          給她味藥。小成堅決不同意去醫院,小徐他們也沒辦法,看見我來了,都像看到救星一
          樣。我不由分說,對小徐說:你出去打車,我們兩把她送醫院!小徐一出門,我一把抱
          起小成就走。小成在邊掙邊說不去,我根本不停。我知道,不讓小徐他會和我急的,但
          是我也要和小徐公平競爭。很快送到了市八院---離我們那兒打車要30分鐘吧,我們
          等在旁邊,護士就要開始測血壓、測血、停診了,對站在旁邊誰都不肯離去的我和小徐
          說:"女孩子脫衣服你們小伙子也在旁邊嗎?"沒辦法,我們只好出去。

          我們等在外面,小徐一直不和我說話。大概他感覺出我對小成的意思,他有些戒備吧。
          大概過了幾十分鐘吧,醫生出來小聲說:"成**,同事還是家屬?"我們都站了起來,
          醫生責備的對我們說,小成有先天性心臟病,根本不能工作勞累、激動,更不能感冒。
          她的心臟已經比普通人大了,因為小時候沒有手術治療,現在手術的可能性很小,只能
          靜養。

          這時候我的腦海里如電光火石一般,一下明白了為什么她一累就臉色發白;為什么她不
          能干體力活;為什么她怕冷,不能感冒;為什么她住那樣的房子---因為醫院近;甚
          至,我也明白了---為什么她拒絕我。小徐顯然也不知道這個真相,他愣在一旁一時有
          些不知所措。我搶先沖進急診室,小成也看見了我,她顯然也聽見了醫生叫我們。她的
          目光平靜,柔和,還有---期待。我走到小成身邊,抓住她的手,對她輕聲說:我知
          道了。你該早點告訴我。我和你一起,我們一起面對,好嗎?說著把她的手貼在了自己
          臉上,小成的眼淚刷地下來了。這時候,小徐進來正好看見。護士著急地說,她不能激
          動的,你們出去!出去!

          我終于得到了小成的認可。她后來對我說,其實她開始是覺得我失戀了,很可憐,愿意
          幫我多做點事,后來就慢慢喜歡上了我;可是后來她發現我在防她,很讓她傷心;她拒
          絕我一方面是因為這個---女孩子的報復心,她也有;另一方面,她早知道自己的
          病,也不想拖累我。最后她在病床邊倚著我,淚光閃閃的對我說:"你知道嗎?一個女
          孩子在外面,很多時候真累啊。我暈倒的時候,心里想,真去了,別的沒什么,就是好
          后悔啊,我應該和你愛一場啊。我是不是好自私?我真的是不甘心。"我什么也沒說,
          只是把她緊緊的摟在懷里。

          小成還告訴我,其實她是出生就有這個病了,他父母親一直在做生意,家里人其實不缺
          錢。家里人讓她讀書讀到高中,考大學已經考上了,但是擔心遠沒人照顧,死活不讓她
          去上。小成很不愿意自己成為家里人的累贅,自己跑了出來打工,決心自己養活自己。
          她以前就和家里人耳濡目染,所以對生意很在行。正好我把她招了進來。她說,小徐一
          直對她很好,她加班小徐一直陪著,可是她知道他們不可能。

          沒幾天小成堅持要出院,她說住了多少次院了,還是家里舒服---不就是靜養嗎。我
          們搬在了一起。這是我的堅持要求,我說我一定要照顧好你。小徐要辭職,我沒說什么
          同意了。最后,我和他一起吃了頓晚飯。他深情黯然的說,沒想到她有那么嚴重的病,
          我就是愣了一會,哎,你先跑進去了。后來喝了點酒,他又說,你比我有錢,她當然選
          你。我一般抓住他,對他說,你胡說,小成不是那種看重錢的人。至于錢,小徐,好好
          努力,你還年輕,你也會有錢,也許比我還有錢。到那時也許你會明白小成。

          3年以后的一個偶然的機會,我又在閔行體育公園附近見到了小徐。不過他早已今昔非
          比,他對我說,他一直沒忘我的話,也自己憋了一口氣。辭職了以后,他先是自己騎三
          輪車從七寶蔬菜批發市場批蔬菜到小區賣,后來自己租了個攤位,后來賣豬肉,再后來
          自己買了一輛二手嘉寶,自己去江蘇進豬肉賣。3年以后,剛剛掙了50萬,在附近買了
          一套80平方的房子。他最后說,還是要謝謝你。我想起身邊和網上很多朋友不停地抱怨
          房價飛漲,抱怨沒有工作,抱怨辛苦賺不到錢,抱怨這里抱怨那里---其實他們連一
          個高中都沒有讀完的小徐都不如!

          23,乏術
          我看到有人在懷疑我的經歷的真實性,想要向他們爭辯,想想又算了。每個人的生活軌
          跡不同,想法不同,就是向他們證實了又能怎么樣呢?能改變生活現狀嗎?我還是寫下
          去,就算是經歷了這么多的總結吧。但愿有朋友在看的時候能夠獲得共鳴,獲得激勵,
          產生力量,進而改變你們自己的人生。如果不信,也沒什么,因為我們生活不同,而且
          都要繼續。

          小成和我的關系定了以后,我們會經常長時間的交談。她讀書很多,尤其喜歡古詩詞。
          我們很多事情都談的津津有味,可以就一個事件談上幾個小時。現在我在想,談戀愛談
          戀愛,說談是有道理的吧。她有時候會從夢里醒來,一聲不響地看我半天。我問她為什
          么,她說她高興,睡不著。有時候她會流淚,說是想家了。我要和她家聯系,她又不
          讓。我不再讓她查店,每天帶著她看看就行了。可是她閑不住,對我說,我要閑著就在
          家耗著,跑這來干嘛?我也沒辦法。本想生意就這么發展下去,我們也不會擔心未來錢
          的事。可是這時候生意忽然被一件沒有料到的事情影響了。

          過了幾個月,我們這里要聽說要修路了,要打通和大馬路接上。因為我們有2家店面是
          屬于臨時房,肯定會被拆掉。臨時商業房拆掉,市政會補一點錢,但是對我們來說并不
          劃算,因為附近的鋪面已經漲價了,客戶也熟悉了。我考慮了很久,也沒有什么辦法。
          為了不讓小成知道擔心,我并沒有在她面前表現的壓力很大。

          同時我也暗暗留心小成的病情,我覺得好像越來越嚴重了。我也到處查找她的這個病的
          原因,治療方式和注意事項。大夫給我說的是對的,這個病一般不能結婚,更禁止生
          育,因為她的心臟會受不了。一般在嬰兒時期手術解決,成人后手術成功率很低。目前
          除了靜養,不能勞累,尤其不能感冒。除此之外,還沒有比較好的治療辦法。我覺得這
          個障礙比我以前碰到的任何一個都艱巨、困難,有一種一籌莫展的感覺。

          24,訣別
          也許很多朋友的感情經歷比我復雜的多,但是一直以來我都認為命運待我不公,一直以
          來我也在問上蒼:為什么不給我一段長一點的真愛,比如說一輩子。直到不久以前,我
          才解開這個心結(請看后續章節)。看到這一節的標題,朋友們想必已經知到了結果。
          原諒我寫得這么慢,我不能平靜自己的心情。

          小成自己也有感覺。她有時候會摟住我說,真不想把你交給另一個人,我讓她別胡說。
          有時候她會說,我走了以后,你一定要找一個好的。你看,她在不停的矛盾。我覺得她
          真是普通人,一個平凡女孩的心思和想法她都有,正是這些讓我覺得她一個讓我無比憐
          惜的人。她的心跳越來越快,也不規則了。我不再讓她跟我去店里,還找了一個阿姨照
          顧她。有一天,她對我說,不行,我幫你賺了那么多錢,從來沒有做過主婦的感覺,你
          要把錢都交出來,我要管錢,做做主婦。我笑著把存折、密碼、身份證、房產證都交給
          了她。有什么不能呢?這些我失去了相信還可以賺回。

          到了秋天,天氣冷了,小成好象更不好了。她臉色不好,心跳過快,我還是把她送進了
          醫院。我覺得一定要把她的家人叫來。她這次沒有拒絕,但是她說她先和家里人打個電
          話,不讓我聽。電話不到2天,她的父母親就趕來了。不知道她和她的父母說了什么,
          她的父母見了我特別的親,一個勁在我面前流淚,還說這孩子脾氣太倔了。我們3個人
          的時候,她的父母親會象我自己的父母一樣,不停的讓我注意身體,多吃一些,多穿一
          些。

          我真的不愿意回憶那個日子,12月21號,她住進醫院2個月半月的時候。其實她走的時
          候,心臟已經很大了。醫生說,這樣的病一般是心臟忽停,突然死亡,象她這樣的比較
          少,她也屬于比較嚴重的了。我留著淚在她床前聽到最后的一句話是:難受,胸好悶。
          謝謝。

          25,禮物
          我送走了小成。我不知道怎樣描述當時我的悲痛欲絕的心情。因為我不能在她的父母面
          前表現出來,否則她的母親根本沒有辦法控制自己的感情。想起前面有個朋友問我,如
          果用我的全部身家去換取真愛,我會怎樣選擇?我想我在這里可以回答了:朋友,如果
          你的一只手要離你而去,代價是你的全部身家,你會怎樣選擇?如果你有猶豫,那答案
          很簡單---這不是你的真愛。我感覺到我的心已經是不再完整的了。

          在她的遺物中我發現了以前給她的存折,但是已經少了一個房產證---我的別墅的房產
          證。當然,我還發現了一封信。其實我早就知道她在寫遺書,只是不忍在內心承認罷
          了。她這么聰明的女孩,一定會想到這些的。

          遺書里說:對不起,我不能和你一起忙下去了。別太難過,以后就是你要經常想我。遇
          見你很好,我本來害怕就這樣糊里糊涂地走了,現在知道我的生命比我以前的想法好多
          了,我不那么遺憾了。就是會帶給你和我父母痛苦……
          ……

          你要堅強,要挺住,你還要走很長的路吧。我把你的別墅給賣了---這是你給另外一
          個女孩買的,是嗎?我做主了,你會怪我嗎?因為我們的熟食店不是長久之計,你也不
          會甘心一輩子賣肉,是吧?我去定了一個商鋪,首付就用別墅賣的錢,剩下的2個店,
          賣了吧,還有拆遷的店,拿到了補償,和我們(我用了我們,你愿意嗎?)以前的錢,
          不少了吧,別亂花。然后到我家去,和我爸交流一下,也許你能夠找到機會。他會幫你
          的,我和他們說過了。你應該有更大的事業。

          如果我這樣替你做主,真的賺了錢,就算是我留給你的禮物吧。虧了,就當我以前為你
          忙碌賣命,我應得的錢我又拿走了。呵呵,我不想要錢,只想你過的快樂一些,就看你
          自己的努力了……

          26,轉型
          小成的事情之后,我的生意大不如前了,可能也和我的心情有關。2003年1月底,我賣
          掉了我的2個店。又過了3個月,我拿到了市政補助的資金。加上我手里的錢,一共109.
          5萬。我的別墅,小成以8500左右的單價賣出,用80萬左右做首付買了一個300平方左右
          的商鋪,但是要4個月以后交房。這個地方的商鋪,近一年后我在2003年12月時以每平
          方每天7元出租,一個月能收回6萬多塊錢,扣除還款我每月還能剩余4萬塊錢。這已經
          基本相當于我以前4個店一個月的盈利了,今年年初,我讓評估師估了一下價格,已經
          到19000左右每平方了。小成,你又一次讓我見識了你的聰慧。

          想到以前小成每天那么開心,那么充實的樣子,現在我明白了:其實她一直處在生命隨
          時會停止的陰影下,所以她的生活態度反而那么豁達,開朗,而又忙碌充實。這才是生
          命本來應該有的態度。我也應該這樣生活。而且我不能僅靠收租為生。我又開始想著新
          的事業了,我決定如小成所說,到她家里去一次。我和她父母聯系了一下,他們很熱
          情,讓我隨時都可以去。我雖然比以前多了100萬現金,可是我心里面一點也不輕松,
          因為這一次我面臨著從飲食業到其他行業的轉型,其實也是一種重頭再來。

          2003年4月,我去了小成家。小成的父母在做皮革生意,他們一直在為國外的汽車和家
          具提供定制的真皮座椅和包墊。真沒想到,他們生意做得很大。而且他們那里家家是作
          坊,戶戶是工廠,浙江真是讓我見識了民營經濟的力量。和她的父母交流之后,我才知
          道自己這100萬現金根本不夠做這個方面。她家人對我說,可以提供資金幫助,我也可
          以和他們合股做,我愿意留下來也行。但是我拒絕了。我有種感覺,這不是我要找的那
          個行業,另外我還是愿意自己奮斗。她的父母認了我為干兒子,我走的那一天,在她家
          吃飯,我喝醉了。她的母親又哭了。

          27,嘗試
          我最終沒有接受小成父母的美意,不知道遠在天國的小成知道我的這個選擇后是滿意還
          是不滿意。我想她是理解我的吧,我一直那么獨立,一直以為自己的事情要自己做。雖
          然沒有做她父母的那個行業,但是她父母臨走時說的一句話倒是讓我思索很久。她父母
          說,現在他們的產品慢慢地國內的汽車廠家也開始要貨了,這是不是說明這個大行業內
          還是有機會的呢?

          2003年4月底我回到上海以后,又以70萬總價70%貸款買了一套商品房,畢竟自己也要住
          的,付房租不如付貸款了。然后我就主要在考慮下一步的努力方向了。飲食業我是不再
          考慮了,可能有點傷心的原因在里面吧。我希望有個嶄新的事業,嶄新的我。IT業我也
          認為不好,原因是我看到這幾年身邊的年輕人開公司有80%選擇IT業,競爭太激烈了,
          而且經營狀況并不理想,我估計還要至少幾年淘汰這個行業才會正常。電子加工,服務
          業什么的,我都考慮過。想來想去比較了很長時間,我決定嘗試代理國外品牌做汽車機
          油和高檔潤滑油。我覺得小成的父母給我的啟示還是有幾分道理的:國內的汽車市場現
          在才剛剛開始,還會有10幾年的高速發展期,這個行業就像10幾年前做計算機行業一
          樣,是值得我投入的。

          我的習慣是:想法一經決定,行動決不遲疑。5月初,我找好了辦公地點,開始招人;5
          月底,辦公家具和人員進場;6月份,我拿到了營業執照和發票。我開始熟悉這個市場
          的渠道、客戶、產品。那個時候我幾乎每天都去吳中路,每天都上網查資料,每天都向
          國外寫電子郵件詢問產品性能,報價,索要樣品等等信息。到了8月份的時候,我公司
          終于定下了一個全權代理和4項一級代理的產品。然后我開始在江浙一帶的城市里不停
          地奔波,尋找、拜訪代理和零售商,以及和他們洽談。我是這樣認為,以我目前的實力
          在上海的這個行業里撕開口子太難了,我應該先從周邊入手。開始我是租車開,后來10
          月份的時候,我自己貸款賣了一輛馬自達-福美來。我的現金我認為還是應該留著公司
          發展用。

          雖然2003年下半年我做的很辛苦,但是到了年底一算,我的這個公司并沒有賺錢,反而
          虧損了12萬-平均每個月2萬的虧損。可能有的朋友會問,汽車行業2003年是最熱
          了,你怎么還虧了呢?這個虧損我卻一點也沒有心痛和意外,一方面是因為我已經經歷
          了很多生意上的風雨,更重要的是因為這都在我的預想之內。

          做生意有很多種,有的人是以長時間積累的技巧、經驗、關系和渠道掙錢-這是以時間
          換空間;有的人是一招鮮、吃遍天-這是壟斷或是以技術制勝;還有的人是用錢換取技
          巧、經驗、關系和生意流通的渠道,這是以空間換時間-我就是這么做的。我剛進入
          這個行業,經驗、關系、客戶基礎和渠道都不行,一進來就賺錢是不太可能的。但是更
          不能害怕花錢而停止腳步,生意一定要走出去,開發的流程不能停止。這半年來,雖然
          我出貨不多,遠遠不能養活公司,但是我一是組織了團隊,熟悉了團隊,鍛煉了團隊的
          力量;二是建立了銷售渠道,江浙一帶我們開發了70多家下級代理,我們讓他們試用先
          打開市場,還要熟悉競爭對手,客戶公關等等,這一切都進展順利。2003年汽車銷售是
          很熱,但是我認為我們這一塊屬于汽車保養和維修類會有一個滯后期。我們2003年底的
          業績已經大大好于8月份。對于即將到來的2004年,我胸有成竹。

          28,歸宿
          公司的實際經營果然是按照我的預想發展。2004年1月份,我們的銷量獲得了突破,我
          們已經有些許的盈利了。2月份因為過節,生意比1月份下降5%。3月份獲得30%的大幅增
          長,這樣我們已經凈盈利4萬了。我加大了激勵力度,我的團隊志氣如虹,一個個宣稱
          今年底要比3月份的銷量翻番。我知道,這是有可能的。因為我們前期搭就的平臺完全
          可以承載這個銷量----70~100個有規模的下級代理,每個月每個代理的銷量達到
          8000~10000元并非難事。

          我的公司里招了幾個上海的女孩子。原來我很少和上海女孩打交道---其實我就很少
          和女孩打交道,阿蕓和小成而已。但是通過和我們公司的上海女孩溝通,合作,熟悉
          之后,她們讓我以前對上海女孩的看法大為改觀-----我以前是心里有偏見了。她們
          初看打扮時髦而又干練,說話快而利落,腦子清楚毫不拖泥帶水,對價格非常敏感,你
          以為她們很勢力很在乎金錢。是的,對普通人陌生人是的。可是交往久了,我覺得她們
          工作盡職盡責----加班從來都是自己要求的,自己的事自己做完;做事很有責任心
          ----對公司的財物,以及用水用電完全像對自己家的一樣;很重感情----我們公司
          有不只一個女孩為了男朋友、同學而付出了金錢,時間,甚至家庭的埋怨。也許,外人
          對他們的誤解只是因為大家做事情的方法不同罷了,畢竟,人更重要的是心靈和思想。
          可是我的感情生活依舊空白。我覺得現在的我不可能再發展一段戀情---在我的心里
          小成一刻也不曾離開。每天我都會看小成給我的那封信,那信其實寫得很長。看了之后
          我總覺得她離我不遠,我的心里也覺得很溫暖。小成,你的心靈和思維脫離了肉體的羈
          絆,應該飛的更快更遠了吧。這段時間由于小成的離去,我每天努力的工作回家之后,
          會覺得失去了歸宿感。有時候我會忽然想,我來這里干什么?哪里是我的歸宿呢?我努
          力奮斗,努力掙錢,掙了很多錢又怎么樣呢?

          這是我第一次考慮這個問題----金錢對我意味著什么。以前生存和事業的壓力,以及
          一個接著一個的打擊和磨礪讓我始終無暇顧及這個具有終極意義的話題。是啊,雖然我
          現在還不是很有錢,但是我有錢了以后怎么辦?以前我國傳統的精神也只講過:君子愛
          財,取之有道。可是如果取到了有怎么樣呢?原諒我的陋學,我沒有看到這方面的闡
          述。很多中國人有錢了以后,生活奢靡、大講排場、意志低落、胡亂花錢,很多還喪失
          了生活的動力,多少人在貧賤時堅持的修身養性,成仁取義,在富貴來臨時煙消云散。
          更有很少的人捐錢給慈善事業和救助他人,我想這一切也和我們的傳統文化有關。我堅
          決不要這樣的生活。可是為什么西方人有那么多有錢人,給慈善事業捐錢呢?而且他們
          一些窮人也有給慈善事業捐錢的習慣呢?

          一個偶然的機會我看到了《圣經-馬太福音》,里面的闡述讓我如夢初醒。那里面
          說,雖然富人因為上帝給予的機會和能力獲得了財富,但是那財富并不是富人的,只是
          上帝因為看到財富由于在富人手中增值而讓那些富人代為保管的,一旦有需要,應該把
          財富還給所有人。這就是我所要尋找的原因。我于是如饑似渴地每天看《圣經》,那里
          面的文字讓我的安靜,安定,安心。在這里面,我找到了和我心靈合拍的仁愛心、慈悲
          心、謙卑心和使命心。我進一步了解到我以前毫無信仰,或者以自己為信仰時的無知、
          自以為是、狂妄自大和故步自封。朋友,也許你和我信仰不同,請不要在這里爭執孰是
          孰非。也許只有每個人只有經歷苦苦思索和重重磨礪,才能接近你所認為的真理。最終
          我在這里找到了歸宿,也找到了問題的答案。

          我在徐家匯教堂受了洗,成為主的信徒。受洗之后,我每周都要去教堂坐坐。我知道,
          小成一定會成為天使,主一定也會指引我。我以前認為的愛是我前進的動力,這愛字,
          今天我才體會到更廣泛更宏大的意義。它已經成為了我的使命。

          29,疑問
          2005年的1月,我在徐家匯附近,漕溪路旁的那塊大空地上停好車出來的時候,忽然意
          外地發現了蕓和她的男朋友----現在應該已經是老公了吧,因為他們手里還抱著一個2
          歲大小的孩子。他們顯然也發現了我,但是顯然雙方都有點錯諤。我先打招呼,笑著
          說,這是你們的孩子啊?真漂亮!我們之間的氣氛一下融洽了。交談中我得知,他們
          2001年底結婚,2002年底有了這個可愛的女兒。他們的生活不錯,買車買房也是2004年
          的事。我衷心的祝福他們。他們問我的情況,我也告訴了他們,我也得到了他們的祝
          福。我們還約好下次一起吃飯。

          我曾經以為,如果我再見到蕓,我絕對不會保持平靜,甚至我不知道怎么見她。可是我
          做到了,我不僅做到了心情平靜,還做到了如常交流,更做到了絕對真心地祝福他們,
          理解他們。經歷了那么多,看到了那么多,失去了那么多,我也得到了那么多。穿破圍
          墻,我的心靈獲得了更大的空間和放飛的舞臺。

          我公司的生意到了2004年的9月份已經能夠保持每個月70萬左右的營業額,12萬左右的
          利潤了。10,11,12三個月我們又在原來的基礎上開拓了30家左右的零售店面,基本能
          夠實現每個月15萬左右的利潤。到年底的時候,我手上的資金加上商鋪出租收入,公司
          原有資金和盈利,已經達到了180萬。我的一個專門做公司投資的朋友說,像我們這樣
          的小公司,只要我能保持公司連續盈利36個月,那么公司的價值一般就是公司60個月的
          利潤總和。他笑著說,算算你的公司也值四五百萬了吧,如果你保持現在的盈利狀況。
          我的心中不相信"保持現狀"這句話,以前的經歷屢屢說明這一點:沒有人能夠保持現
          狀。只有改變現狀,才能保持不敗。可是我經過粗粗一算之后,心里產生了疑問。因為
          我要提升目前的經營水準,勢必重新打造一個更大更快速的經營平臺,管理要上新臺
          階,還要進行更嚴密更系統的市場推廣計劃---我叫它"重生"計劃。這個計劃我粗粗
          算了一下,要求我投入300萬左右的資金。我陷入了思考:這樣的計劃風險是否太大?
          如果失敗,我會失去現有的所有公司盈利和手上資金,還有我部分的不動產。那么我應
          該保持現狀,這也沒什么不好,這樣總有其他競爭者先做,然后我再靜觀事變嗎?如果
          我實施"重生"計劃,完成后如果發揮100%的效果,我9~10個月可以收回成本,公司隨
          后還有應該有更大的發展。如果發揮70%的效果,我15~18個月可以收回成本。如果發揮
          50%以下的效果,那就是失敗。

          可是奮斗這種東西已經進入了我的血液,變成了我的基因。我實在不能忍受自己什么也
          不做而失去這個成為自己領域內前幾位的機會。為主,為小成,為我,為我所有的朋友
          和家人,還有我的員工,我決定放手一博。我把買的商品房(現在已經漲價了,達到
          150萬了)和汽車做了二次抵押,貸了120萬資金,這樣我手上的資金已經有300萬了。
          2004年12月21日夜里11點,我終于完成了17萬字的詳細的"重生計劃"的策劃報告。我
          沒有忘了這一天,我一定要在這一天完成這報告。

          半夜里我開車從主干道下來,到了以前我和小成三號店的舊址----她是在這里愛上
          我,我也是在這里愛上她的。這里一切已經今昔非比,再也見不到路邊的臨時房了,全
          部都是寬寬的馬路和人行道,誰也不會再關心這里曾經發生的事情了。我停下車,下車
          來靠著車點燃一只煙。看著天邊半滿的月亮,我清清楚楚地看見了小成妍妍的笑臉。我
          也笑了,只是臉上已經流滿了淚水。

          朋友們,我在上海的奮斗歲月-----結束了嗎?不,我心里知道,一切才剛剛開始!

          30,經驗(大結局)
          下面是我自己的感悟和我的經驗,權做參考:
          1,人生就是投資和收益的人生。如果你有錢,就投入金錢;如果你沒有金錢,而有經
          驗和能力,就投入經驗和能力;如果你既沒有金錢,也沒有經驗和能力,但是你有熱
          情、勤奮和努力,那就投入熱情、勤奮和努力。如果你既沒有金錢,也沒有經驗和能
          力,連熱情、勤奮和努力也沒有,那就別想這些了。
          2,比賺錢更重要的是找到你自己的賺錢動力;
          3,比金錢重要的是時間,比時間重要的是時機,比時機重要的是你要抓住時機的決
          心,動力和準備!
          4,別好高騖遠,機會一般都在你看不起眼的角落里藏著;
          5,舍得投入;
          6,決定一下,行動要快;
          7,永遠盡可能準備好資源,隨時準備抓住機會,要快!
          8,待人以誠,對人以善。有時候,機會是別人給的;
          9,給別人的比別人期待的多一些(這是我抄李嘉誠的,我很喜歡);
          10,賺錢有個普遍的法則:多做,快做,動腦筋變著花樣做,就是別跟著別人一樣
          做。
          11,合理規劃有錢以后的日子,會讓你走的更遠;
          12,有信仰,有原則,有愛心。

          posted @ 2009-12-16 01:10 不高興 閱讀(648) | 評論 (0)編輯 收藏
           

          select   *   from   mytable   where   to_char(install_date,'YYYYMMDD')   >   '20050101'  

          select   *   from   mytable   where   install_date     >   to_date('20050101','yyyymmdd');

          取得當前日期是本月的第幾周

          SQL>   select   to_char(sysdate,'YYYYMMDD   W   HH24:MI:SS')   from   dual;
            
          TO_CHAR(SYSDATE,'YY
          -------------------
          20030327   4   18:16:09
            
          SQL>   select   to_char(sysdate,'W')   from   dual;
            
          T
          -
          4

          №2:取得當前日期是一個星期中的第幾天,注意星期日是第一天

          SQL>   select   sysdate,to_char(sysdate,'D')   from   dual;
            
          SYSDATE       T
          ---------   -
          27-MAR-03   5

          類似:

          select   to_char(sysdate,'yyyy')   from   dual;   --年
          select   to_char(sysdate,'Q'   from   dual;           --季
          select   to_char(sysdate,'mm')   from   dual;       --月
          select   to_char(sysdate,'dd')   from   dual;       --日
          ddd   年中的第幾天
          WW   年中的第幾個星期
          W   該月中第幾個星期

          DAY 周中的星期幾
          D   今天對映的NUMBER

          '1','星期日',  '2','星期一', '3','星期二', '4','星期三', '5','星期四',  '6','星期五',  '7','星期六'
          hh   小時(12)
          hh24   小時(24)
          Mi   分
          ss   秒

          №3:取當前日期是星期幾中文顯示:

          SQL>   select   to_char(sysdate,'day')   from   dual;
            
          TO_CHAR(SYSDATE,'DAY')
          ----------------------
          星期四

          №4:如果一個表在一個date類型的字段上面建立了索引,如何使用

          alter session set NLS_DATE_FORMAT='YYYY-MM-DD HH24:MI:SS'


          №5: 得到當前的日期
          select sysdate from dual;

          №6: 得到當天凌晨0點0分0秒的日期
          select trunc(sysdate) from dual;

          -- 得到這天的最后一秒
          select trunc(sysdate) + 0.99999 from dual;

          -- 得到小時的具體數值
          select trunc(sysdate) + 1/24 from dual;

          select trunc(sysdate) + 7/24 from dual;

          №7:得到明天凌晨0點0分0秒的日期

          select trunc(sysdate+1) from dual;

          select trunc(sysdate)+1 from dual;


          №8: 本月一日的日期
          select trunc(sysdate,'mm') from dual;


          №9:得到下月一日的日期
          select trunc(add_months(sysdate,1),'mm') from dual;

          №10:返回當前月的最后一天?
          select last_day(sysdate) from dual;      
          select last_day(trunc(sysdate)) from dual;
          select trunc(last_day(sysdate)) from dual;
          select trunc(add_months(sysdate,1),'mm') - 1 from dual;


          №11: 得到一年的每一天
          select trunc(sysdate,'yyyy')+ rn -1 date0
          from
          (select rownum rn from all_objects
          where rownum<366);


          №12:今天是今年的第N天
          SELECT TO_CHAR(SYSDATE,'DDD') FROM DUAL;

          №13:如何在給現有的日期加上2年
          select add_months(sysdate,24) from dual;

          №14:判斷某一日子所在年分是否為潤年
          select decode(to_char(last_day(trunc(sysdate,'y')+31),'dd'),'29','閏年','平年') from dual;

          №15:判斷兩年后是否為潤年
          select decode(to_char(last_day(trunc(add_months(sysdate,24),'y')+31),'dd'),'29','閏年','平年') from dual;


          №16:得到日期的季度

          select ceil(to_number(to_char(sysdate,'mm'))/3) from dual;

          select to_char(sysdate, 'Q') from dual;


          獲取本周一,周日的日期

          select trunc(sysdate,'d')+1,trunc(sysdate,'d')+7 from dual;

          posted @ 2009-12-15 13:40 不高興 閱讀(1542) | 評論 (0)編輯 收藏
           
          1.
          概述
          最近論壇很多人提的問題都與行列轉換有關系,所以我對行列轉換的相關知識做了一個總結,希望對大家有所幫助,同時有何錯疏,懇請大家指出,我也是在寫作過程中學習,算是一起和大家學習吧!
          行列轉換包括以下六種情況:
          1)
          列轉行
          2)
          行轉列
          3)
          多列轉換成字符串
          4)
          多行轉換成字符串
          5)
          字符串轉換成多列
          6)
          字符串轉換成多行
          下面分別進行舉例介紹。
          首先聲明一點,有些例子需要如下10g及以后才有的知識:
          A.
          掌握model子句
          B.
          正則表達式
          C.
          加強的層次查詢
          討論的適用范圍只包括8i,9i,10g及以后版本。
          2.
          列轉行
          CREATE TABLE t_col_row(
          ID INT,
          c1 VARCHAR2(10),
          c2 VARCHAR2(10),
          c3 VARCHAR2(10));
          INSERT INTO t_col_row VALUES (1, 'v11', 'v21', 'v31');
          INSERT INTO t_col_row VALUES (2, 'v12', 'v22', NULL);
          INSERT INTO t_col_row VALUES (3, 'v13', NULL, 'v33');
          INSERT INTO t_col_row VALUES (4, NULL, 'v24', 'v34');
          INSERT INTO t_col_row VALUES (5, 'v15', NULL, NULL);
          INSERT INTO t_col_row VALUES (6, NULL, NULL, 'v35');
          INSERT INTO t_col_row VALUES (7, NULL, NULL, NULL);
          COMMIT;
          SELECT * FROM t_col_row;
          2.1
          UNION ALL
          適用范圍:8i,9i,10g及以后版本
          SELECT id, 'c1' cn, c1 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c2' cn, c2 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c3' cn, c3 cv FROM t_col_row;
          若空行不需要轉換,只需加一個where條件,
          WHERE COLUMN IS NOT NULL 即可。
          2.2
          MODEL
          適用范圍:10g及以后
          SELECT id, cn, cv FROM t_col_row
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY (ID)
          DIMENSION BY (0 AS n)
          MEASURES ('xx' AS cn,'yyy' AS cv,c1,c2,c3)
          RULES UPSERT ALL
          (
          cn[1] = 'c1',
          cn[2] = 'c2',
          cn[3] = 'c3',
          cv[1] = c1[0],
          cv[2] = c2[0],
          cv[3] = c3[0]
          )
          ORDER BY ID,cn;
          2.3
          COLLECTION
          適用范圍:8i,9i,10g及以后版本
          要創建一個對象和一個集合:
          CREATE TYPE cv_pair AS OBJECT(cn VARCHAR2(10),cv VARCHAR2(10));
          CREATE TYPE cv_varr AS VARRAY(8) OF cv_pair;
          SELECT id, t.cn AS cn, t.cv AS cv
          FROM t_col_row,
          TABLE(cv_varr(cv_pair('c1', t_col_row.c1),
          cv_pair('c2', t_col_row.c2),
          cv_pair('c3', t_col_row.c3))) t
          ORDER BY 1, 2;
          3.
          行轉列
          CREATE TABLE t_row_col AS
          SELECT id, 'c1' cn, c1 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c2' cn, c2 cv
          FROM t_col_row
          UNION ALL
          SELECT id, 'c3' cn, c3 cv FROM t_col_row;
          SELECT * FROM t_row_col ORDER BY 1,2;
          3.1
          AGGREGATE FUNCTION
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          MAX(decode(cn, 'c1', cv, NULL)) AS c1,
          MAX(decode(cn, 'c2', cv, NULL)) AS c2,
          MAX(decode(cn, 'c3', cv, NULL)) AS c3
          FROM t_row_col
          GROUP BY id
          ORDER BY 1;
          MAX聚集函數也可以用sum、min、avg等其他聚集函數替代。
          被指定的轉置列只能有一列,但固定的列可以有多列,請看下面的例子:
          SELECT mgr, deptno, empno, ename FROM emp ORDER BY 1, 2;
          SELECT mgr,
          deptno,
          MAX(decode(empno, '7788', ename, NULL)) "7788",
          MAX(decode(empno, '7902', ename, NULL)) "7902",
          MAX(decode(empno, '7844', ename, NULL)) "7844",
          MAX(decode(empno, '7521', ename, NULL)) "7521",
          MAX(decode(empno, '7900', ename, NULL)) "7900",
          MAX(decode(empno, '7499', ename, NULL)) "7499",
          MAX(decode(empno, '7654', ename, NULL)) "7654"
          FROM emp
          WHERE mgr IN (7566, 7698)
          AND deptno IN (20, 30)
          GROUP BY mgr, deptno
          ORDER BY 1, 2;
          這里轉置列為empno,固定列為mgr,deptno。
          還有一種行轉列的方式,就是相同組中的行值變為單個列值,但轉置的行值不變為列名:
          ID CN_1 CV_1 CN_2 CV_2 CN_3 CV_3
          1 c1 v11 c2 v21 c3 v31
          2 c1 v12 c2 v22 c3
          3 c1 v13 c2 c3 v33
          4 c1 c2 v24 c3 v34
          5 c1 v15 c2 c3
          6 c1 c2 c3 v35
          7 c1 c2 c3
          這種情況可以用分析函數實現:
          SELECT id,
          MAX(decode(rn, 1, cn, NULL)) cn_1,
          MAX(decode(rn, 1, cv, NULL)) cv_1,
          MAX(decode(rn, 2, cn, NULL)) cn_2,
          MAX(decode(rn, 2, cv, NULL)) cv_2,
          MAX(decode(rn, 3, cn, NULL)) cn_3,
          MAX(decode(rn, 3, cv, NULL)) cv_3
          FROM (SELECT id,
          cn,
          cv,
          row_number() over(PARTITION BY id ORDER BY cn, cv) rn
          FROM t_row_col)
          GROUP BY ID;
          3.2
          PL/SQL
          適用范圍:8i,9i,10g及以后版本
          這種對于行值不固定的情況可以使用。
          下面是我寫的一個包,包中
          p_rows_column_real用于前述的第一種不限定列的轉換;
          p_rows_column用于前述的第二種不限定列的轉換。
          CREATE OR REPLACE PACKAGE pkg_dynamic_rows_column AS
          TYPE refc IS REF CURSOR;
          PROCEDURE p_print_sql(p_txt VARCHAR2);
          FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)
          RETURN VARCHAR2;
          PROCEDURE p_rows_column(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_cols IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc);
          PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_col IN VARCHAR2,
          p_pivot_val IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc);
          END;
          /
          CREATE OR REPLACE PACKAGE BODY pkg_dynamic_rows_column AS
          PROCEDURE p_print_sql(p_txt VARCHAR2) IS
          v_len INT;
          BEGIN
          v_len := length(p_txt);
          FOR i IN 1 .. v_len / 250 + 1 LOOP
          dbms_output.put_line(substrb(p_txt, (i - 1) * 250 + 1, 250));
          END LOOP;
          END;
          FUNCTION f_split_str(p_str VARCHAR2, p_division VARCHAR2, p_seq INT)
          RETURN VARCHAR2 IS
          v_first INT;
          v_last INT;
          BEGIN
          IF p_seq < 1 THEN
          RETURN NULL;
          END IF;
          IF p_seq = 1 THEN
          IF instr(p_str, p_division, 1, p_seq) = 0 THEN
          RETURN p_str;
          ELSE
          RETURN substr(p_str, 1, instr(p_str, p_division, 1) - 1);
          END IF;
          ELSE
          v_first := instr(p_str, p_division, 1, p_seq - 1);
          v_last := instr(p_str, p_division, 1, p_seq);
          IF (v_last = 0) THEN
          IF (v_first > 0) THEN
          RETURN substr(p_str, v_first + 1);
          ELSE
          RETURN NULL;
          END IF;
          ELSE
          RETURN substr(p_str, v_first + 1, v_last - v_first - 1);
          END IF;
          END IF;
          END f_split_str;
          PROCEDURE p_rows_column(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_cols IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc) IS
          v_sql VARCHAR2(4000);
          TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_keep v_keep_ind_by;
          TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_pivot v_pivot_ind_by;
          v_keep_cnt INT;
          v_pivot_cnt INT;
          v_max_cols INT;
          v_partition VARCHAR2(4000);
          v_partition1 VARCHAR2(4000);
          v_partition2 VARCHAR2(4000);
          BEGIN
          v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;
          v_pivot_cnt := length(p_pivot_cols) -
          length(REPLACE(p_pivot_cols, ',')) + 1;
          FOR i IN 1 .. v_keep_cnt LOOP
          v_keep(i) := f_split_str(p_keep_cols, ',', i);
          END LOOP;
          FOR j IN 1 .. v_pivot_cnt LOOP
          v_pivot(j) := f_split_str(p_pivot_cols, ',', j);
          END LOOP;
          v_sql := 'select max(count(*)) from ' || p_table || ' group by ';
          FOR i IN 1 .. v_keep.LAST LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          EXECUTE IMMEDIATE v_sql
          INTO v_max_cols;
          v_partition := 'select ';
          FOR x IN 1 .. v_keep.COUNT LOOP
          v_partition1 := v_partition1 || v_keep(x) || ',';
          END LOOP;
          FOR y IN 1 .. v_pivot.COUNT LOOP
          v_partition2 := v_partition2 || v_pivot(y) || ',';
          END LOOP;
          v_partition1 := rtrim(v_partition1, ',');
          v_partition2 := rtrim(v_partition2, ',');
          v_partition := v_partition || v_partition1 || ',' || v_partition2 ||
          ', row_number() over (partition by ' || v_partition1 ||
          ' order by ' || v_partition2 || ') rn from ' || p_table;
          v_partition := rtrim(v_partition, ',');
          v_sql := 'select ';
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          FOR i IN 1 .. v_max_cols LOOP
          FOR j IN 1 .. v_pivot.COUNT LOOP
          v_sql := v_sql || ' max(decode(rn,' || i || ',' || v_pivot(j) ||
          ',null))' || v_pivot(j) || '_' || i || ',';
          END LOOP;
          END LOOP;
          IF p_where IS NOT NULL THEN
          v_sql := rtrim(v_sql, ',') || ' from (' || v_partition || ' ' ||
          p_where || ') group by ';
          ELSE
          v_sql := rtrim(v_sql, ',') || ' from (' || v_partition ||
          ') group by ';
          END IF;
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_sql := v_sql || v_keep(i) || ',';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          p_print_sql(v_sql);
          OPEN p_refc FOR v_sql;
          EXCEPTION
          WHEN OTHERS THEN
          OPEN p_refc FOR
          SELECT 'x' FROM dual WHERE 0 = 1;
          END;
          PROCEDURE p_rows_column_real(p_table IN VARCHAR2,
          p_keep_cols IN VARCHAR2,
          p_pivot_col IN VARCHAR2,
          p_pivot_val IN VARCHAR2,
          p_where IN VARCHAR2 DEFAULT NULL,
          p_refc IN OUT refc) IS
          v_sql VARCHAR2(4000);
          TYPE v_keep_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_keep v_keep_ind_by;
          TYPE v_pivot_ind_by IS TABLE OF VARCHAR2(4000) INDEX BY BINARY_INTEGER;
          v_pivot v_pivot_ind_by;
          v_keep_cnt INT;
          v_group_by VARCHAR2(2000);
          BEGIN
          v_keep_cnt := length(p_keep_cols) - length(REPLACE(p_keep_cols, ',')) + 1;
          FOR i IN 1 .. v_keep_cnt LOOP
          v_keep(i) := f_split_str(p_keep_cols, ',', i);
          END LOOP;
          v_sql := 'select ' || 'cast(' || p_pivot_col ||
          ' as varchar2(200)) as ' || p_pivot_col || ' from ' || p_table ||
          ' group by ' || p_pivot_col;
          EXECUTE IMMEDIATE v_sql BULK COLLECT
          INTO v_pivot;
          FOR i IN 1 .. v_keep.COUNT LOOP
          v_group_by := v_group_by || v_keep(i) || ',';
          END LOOP;
          v_group_by := rtrim(v_group_by, ',');
          v_sql := 'select ' || v_group_by || ',';
          FOR x IN 1 .. v_pivot.COUNT LOOP
          v_sql := v_sql || ' max(decode(' || p_pivot_col || ',' || chr(39) ||
          v_pivot(x) || chr(39) || ',' || p_pivot_val ||
          ',null)) as "' || v_pivot(x) || '",';
          END LOOP;
          v_sql := rtrim(v_sql, ',');
          IF p_where IS NOT NULL THEN
          v_sql := v_sql || ' from ' || p_table || p_where || ' group by ' ||
          v_group_by;
          ELSE
          v_sql := v_sql || ' from ' || p_table || ' group by ' || v_group_by;
          END IF;
          p_print_sql(v_sql);
          OPEN p_refc FOR v_sql;
          EXCEPTION
          WHEN OTHERS THEN
          OPEN p_refc FOR
          SELECT 'x' FROM dual WHERE 0 = 1;
          END;
          END;
          /
          4.
          多列轉換成字符串
          CREATE TABLE t_col_str AS
          SELECT * FROM t_col_row;
          這個比較簡單,用||或concat函數可以實現:
          SELECT concat('a','b') FROM dual;
          4.1
          || OR CONCAT
          適用范圍:8i,9i,10g及以后版本
          SELECT * FROM t_col_str;
          SELECT ID,c1||','||c2||','||c3 AS c123
          FROM t_col_str;
          5.
          多行轉換成字符串
          CREATE TABLE t_row_str(
          ID INT,
          col VARCHAR2(10));
          INSERT INTO t_row_str VALUES(1,'a');
          INSERT INTO t_row_str VALUES(1,'b');
          INSERT INTO t_row_str VALUES(1,'c');
          INSERT INTO t_row_str VALUES(2,'a');
          INSERT INTO t_row_str VALUES(2,'d');
          INSERT INTO t_row_str VALUES(2,'e');
          INSERT INTO t_row_str VALUES(3,'c');
          COMMIT;
          SELECT * FROM t_row_str;
          5.1
          MAX + DECODE
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          MAX(decode(rn, 1, col, NULL)) ||
          MAX(decode(rn, 2, ',' || col, NULL)) ||
          MAX(decode(rn, 3, ',' || col, NULL)) str
          FROM (SELECT id,
          col,
          row_number() over(PARTITION BY id ORDER BY col) AS rn
          FROM t_row_str) t
          GROUP BY id
          ORDER BY 1;
          5.2
          ROW_NUMBER + LEAD
          適用范圍:8i,9i,10g及以后版本
          SELECT id, str
          FROM (SELECT id,
          row_number() over(PARTITION BY id ORDER BY col) AS rn,
          col || lead(',' || col, 1) over(PARTITION BY id ORDER BY col) ||
          lead(',' || col, 2) over(PARTITION BY id ORDER BY col) ||
          lead(',' || col, 3) over(PARTITION BY id ORDER BY col) AS str
          FROM t_row_str)
          WHERE rn = 1
          ORDER BY 1;
          5.3
          MODEL
          適用范圍:10g及以后版本
          SELECT id, substr(str, 2) str FROM t_row_str
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY(ID)
          DIMENSION BY(row_number() over(PARTITION BY ID ORDER BY col) AS rn)
          MEASURES (CAST(col AS VARCHAR2(20)) AS str)
          RULES UPSERT
          ITERATE(3) UNTIL( presentv(str[iteration_number+2],1,0)=0)
          (str[0] = str[0] || ',' || str[iteration_number+1])
          ORDER BY 1;
          5.4
          SYS_CONNECT_BY_PATH
          適用范圍:8i,9i,10g及以后版本
          SELECT t.id id, MAX(substr(sys_connect_by_path(t.col, ','), 2)) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM t_row_str) t
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id
          GROUP BY t.id;
          適用范圍:10g及以后版本
          SELECT t.id id, substr(sys_connect_by_path(t.col, ','), 2) str
          FROM (SELECT id, col, row_number() over(PARTITION BY id ORDER BY col) rn
          FROM t_row_str) t
          WHERE connect_by_isleaf = 1
          START WITH rn = 1
          CONNECT BY rn = PRIOR rn + 1
          AND id = PRIOR id;
          5.5
          WMSYS.WM_CONCAT
          適用范圍:10g及以后版本
          這個函數預定義按','分隔字符串,若要用其他符號分隔可以用,replace將','替換。
          SELECT id, REPLACE(wmsys.wm_concat(col), ',', '/') str
          FROM t_row_str
          GROUP BY id;
          6.
          字符串轉換成多列
          其實際上就是一個字符串拆分的問題。
          CREATE TABLE t_str_col AS
          SELECT ID,c1||','||c2||','||c3 AS c123
          FROM t_col_str;
          SELECT * FROM t_str_col;
          6.1
          SUBSTR + INSTR
          適用范圍:8i,9i,10g及以后版本
          SELECT id,
          c123,
          substr(c123, 1, instr(c123 || ',', ',', 1, 1) - 1) c1,
          substr(c123,
          instr(c123 || ',', ',', 1, 1) + 1,
          instr(c123 || ',', ',', 1, 2) - instr(c123 || ',', ',', 1, 1) - 1) c2,
          substr(c123,
          instr(c123 || ',', ',', 1, 2) + 1,
          instr(c123 || ',', ',', 1, 3) - instr(c123 || ',', ',', 1, 2) - 1) c3
          FROM t_str_col
          ORDER BY 1;
          6.2
          REGEXP_SUBSTR
          適用范圍:10g及以后版本
          SELECT id,
          c123,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 1), ',') AS c1,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 2), ',') AS c2,
          rtrim(regexp_substr(c123 || ',', '.*?' || ',', 1, 3), ',') AS c3
          FROM t_str_col
          ORDER BY 1;
          7.
          字符串轉換成多行
          CREATE TABLE t_str_row AS
          SELECT id,
          MAX(decode(rn, 1, col, NULL)) ||
          MAX(decode(rn, 2, ',' || col, NULL)) ||
          MAX(decode(rn, 3, ',' || col, NULL)) str
          FROM (SELECT id,
          col,
          row_number() over(PARTITION BY id ORDER BY col) AS rn
          FROM t_row_str) t
          GROUP BY id
          ORDER BY 1;
          SELECT * FROM t_str_row;
          7.1
          UNION ALL
          適用范圍:8i,9i,10g及以后版本
          SELECT id, 1 AS p, substr(str, 1, instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          UNION ALL
          SELECT id,
          2 AS p,
          substr(str,
          instr(str || ',', ',', 1, 1) + 1,
          instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          UNION ALL
          SELECT id,
          3 AS p,
          substr(str,
          instr(str || ',', ',', 1, 1) + 1,
          instr(str || ',', ',', 1, 2) - instr(str || ',', ',', 1, 1) - 1) AS cv
          FROM t_str_row
          ORDER BY 1, 2;
          適用范圍:10g及以后版本
          SELECT id, 1 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 1), ',') AS cv
          FROM t_str_row
          UNION ALL
          SELECT id, 2 AS p, rtrim(regexp_substr(str||',', '.*?' || ',', 1, 2), ',') AS cv
          FROM t_str_row
          UNION ALL
          SELECT id, 3 AS p, rtrim(regexp_substr(str||',', '.*?' || ',',1,3), ',') AS cv
          FROM t_str_row
          ORDER BY 1, 2;
          7.2
          VARRAY
          適用范圍:8i,9i,10g及以后版本
          要創建一個可變數組:
          CREATE OR REPLACE TYPE ins_seq_type IS VARRAY(8) OF NUMBER;
          SELECT * FROM TABLE(ins_seq_type(1, 2, 3, 4, 5));
          SELECT t.id,
          c.column_value AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.column_value) + 1,
          instr(t.ca, ',', 1, c.column_value + 1) -
          (instr(t.ca, ',', 1, c.column_value) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t
          INNER JOIN TABLE(ins_seq_type(1, 2, 3)) c ON c.column_value <=
          t.cnt
          ORDER BY 1, 2;
          7.3
          SEQUENCE SERIES
          這類方法主要是要產生一個連續的整數列,產生連續整數列的方法有很多,主要有:
          CONNECT BY,ROWNUM+all_objects,CUBE等。
          適用范圍:8i,9i,10g及以后版本
          SELECT t.id,
          c.lv AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.lv) + 1,
          instr(t.ca, ',', 1, c.lv + 1) -
          (instr(t.ca, ',', 1, c.lv) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 5) c
          WHERE c.lv <= t.cnt
          ORDER BY 1, 2;
          SELECT t.id,
          c.rn AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.rn) + 1,
          instr(t.ca, ',', 1, c.rn + 1) -
          (instr(t.ca, ',', 1, c.rn) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT rownum rn FROM all_objects WHERE rownum <= 5) c
          WHERE c.rn <= t.cnt
          ORDER BY 1, 2;
          SELECT t.id,
          c.cb AS p,
          substr(t.ca,
          instr(t.ca, ',', 1, c.cb) + 1,
          instr(t.ca, ',', 1, c.cb + 1) -
          (instr(t.ca, ',', 1, c.cb) + 1)) AS cv
          FROM (SELECT id,
          ',' || str || ',' AS ca,
          length(str || ',') - nvl(length(REPLACE(str, ',')), 0) AS cnt
          FROM t_str_row) t,
          (SELECT rownum cb FROM (SELECT 1 FROM dual GROUP BY CUBE(1, 2))) c
          WHERE c.cb <= t.cnt
          ORDER BY 1, 2;
          適用范圍:10g及以后版本
          SELECT t.id,
          c.lv AS p,
          rtrim(regexp_substr(t.str || ',', '.*?' || ',', 1, c.lv), ',') AS cv
          FROM (SELECT id,
          str,
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL)) AS cnt
          FROM t_str_row) t
          INNER JOIN (SELECT LEVEL lv FROM dual CONNECT BY LEVEL <= 5) c ON c.lv <= t.cnt
          ORDER BY 1, 2;
          7.4
          HIERARCHICAL + DBMS_RANDOM
          適用范圍:10g及以后版本
          SELECT id,
          LEVEL AS p,
          rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
          FROM t_str_row
          CONNECT BY id = PRIOR id
          AND PRIOR dbms_random.VALUE IS NOT NULL
          AND LEVEL <=
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
          ORDER BY 1, 2;
          7.5
          HIERARCHICAL + CONNECT_BY_ROOT
          適用范圍:10g及以后版本
          SELECT id,
          LEVEL AS p,
          rtrim(regexp_substr(str || ',', '.*?' || ',', 1, LEVEL), ',') AS cv
          FROM t_str_row
          CONNECT BY id = connect_by_root id
          AND LEVEL <=
          length(regexp_replace(str || ',', '[^' || ',' || ']', NULL))
          ORDER BY 1, 2;
          7.6
          MODEL
          適用范圍:10g及以后版本
          SELECT id, p, cv FROM t_str_row
          MODEL
          RETURN UPDATED ROWS
          PARTITION BY(ID)
          DIMENSION BY( 0 AS p)
          MEASURES( str||',' AS cv)
          RULES UPSERT
          (cv
          [ FOR p
          FROM 1 TO length(regexp_replace(cv[0],'[^'||','||']',null))
          posted @ 2009-12-15 13:16 不高興 閱讀(1242) | 評論 (0)編輯 收藏
           
            select 'select * from '||wl.table1||' where rowid= ''' || wl.aa||''';' from
            (select o.object_name table1 ,dbms_rowid.rowid_create(1,s.row_wait_obj#,s.row_wait_file#,s.row_wait_block#,s.row_wait_row#) aa
                from  v$session s , dba_waiters w , v$locked_object l , dba_objects o
                where w.waiting_session=s.SID
                  and w.mode_held='Exclusive'
                  and w.waiting_session=l.SESSION_ID
                  and l.OBJECT_ID=o.object_id ) wl;
          posted @ 2009-12-01 11:34 不高興 閱讀(441) | 評論 (0)編輯 收藏
           
          最近在做一個工資核算的系統,所有的運算全部在前臺進行,因此用了的是JS來做。
          做完以后,經手工核算,發現一個奇怪的問題。就是JS算出來的結果跟用計算器算出來的結果有差距。
          想了很久,也沒有想出問題出在哪里。
            問題這樣的:
            37.5*5.5=206.08  (JS算出來是這樣的一個結果,我四舍五入取兩位小數)
            我先懷疑是四舍五入的問題,就直接用JS算了一個結果為:206.08499999999998
            怎么會這樣,兩個只有一位小數的數字相乘,怎么可能多出這么小數點出來。
            我Google了一下,發現原來這是JavaScript浮點運算的一個bug。
            比如:7*0.8 JavaScript算出來就是:5.6000000000000005

            網上找到了一些解決辦法,就是重新寫了一些浮點運算的函數。
            下面就把這些方法摘錄下來,以供遇到同樣問題的朋友參考:
            
             程序代碼
          //除法函數,用來得到精確的除法結果
          //說明:javascript的除法結果會有誤差,在兩個浮點數相除的時候會比較明顯。這個函數返回較為精確的除法結果。
          //調用:accDiv(arg1,arg2)
          //返回值:arg1除以arg2的精確結果
          function accDiv(arg1,arg2){
              var t1=0,t2=0,r1,r2;
              try{t1=arg1.toString().split(".")[1].length}catch(e){}
              try{t2=arg2.toString().split(".")[1].length}catch(e){}
              with(Math){
                  r1=Number(arg1.toString().replace(".",""))
                  r2=Number(arg2.toString().replace(".",""))
                  return (r1/r2)*pow(10,t2-t1);
              }
          }

          //給Number類型增加一個div方法,調用起來更加方便。
          Number.prototype.div = function (arg){
              return accDiv(this, arg);
          }

          //乘法函數,用來得到精確的乘法結果
          //說明:javascript的乘法結果會有誤差,在兩個浮點數相乘的時候會比較明顯。這個函數返回較為精確的乘法結果。
          //調用:accMul(arg1,arg2)
          //返回值:arg1乘以arg2的精確結果
          function accMul(arg1,arg2)
          {
              var m=0,s1=arg1.toString(),s2=arg2.toString();
              try{m+=s1.split(".")[1].length}catch(e){}
              try{m+=s2.split(".")[1].length}catch(e){}
              return Number(s1.replace(".",""))*Number(s2.replace(".",""))/Math.pow(10,m)
          }

          //給Number類型增加一個mul方法,調用起來更加方便。
          Number.prototype.mul = function (arg){
              return accMul(arg, this);
          }

          //加法函數,用來得到精確的加法結果
          //說明:javascript的加法結果會有誤差,在兩個浮點數相加的時候會比較明顯。這個函數返回較為精確的加法結果。
          //調用:accAdd(arg1,arg2)
          //返回值:arg1加上arg2的精確結果
          function accAdd(arg1,arg2){
              var r1,r2,m;
              try{r1=arg1.toString().split(".")[1].length}catch(e){r1=0}
              try{r2=arg2.toString().split(".")[1].length}catch(e){r2=0}
              m=Math.pow(10,Math.max(r1,r2))
              return (arg1*m+arg2*m)/m
          }

          //給Number類型增加一個add方法,調用起來更加方便。
          Number.prototype.add = function (arg){
              return accAdd(arg,this);
          }



            在你要用的地方包含這些函數,然后調用它來計算就可以了。
            比如你要計算:7*0.8 ,則改成 (7).mul(8)
            其它運算類似,就可以得到比較精確的結果。
          posted @ 2009-11-26 20:33 不高興 閱讀(761) | 評論 (0)編輯 收藏
          僅列出標題
          共7頁: 上一頁 1 2 3 4 5 6 7 下一頁 
           
          Copyright © 不高興 Powered by: 博客園 模板提供:滬江博客
          主站蜘蛛池模板: 吉首市| 盘锦市| 白城市| 始兴县| 道真| 民县| 博客| 纳雍县| 三原县| 灵宝市| 来安县| 常宁市| 大宁县| 长顺县| 彭水| 永丰县| 宜春市| 应城市| 垣曲县| 宣化县| 临朐县| 樟树市| 绥中县| 游戏| 哈巴河县| 泽州县| 吉木萨尔县| 通江县| 淮阳县| 莲花县| 论坛| 奉新县| 台南市| 金秀| 舞阳县| 杂多县| 石首市| 大理市| 隆子县| 澄城县| 塘沽区|