統計

          留言簿(1)

          DB

          Others

          QA

          Tech Website

          閱讀排行榜

          評論排行榜

          #

          常見的OO原則

          封裝變化

          多用組合,少用繼承

          針對接口編程,不針對實現編程

          為交互對象之間的松耦合設計而努力

          類應該對擴展開放,對修改關閉

          只和朋友交談

          別找我,我會找你

          類應該只有一個改變的理由

          posted @ 2011-02-13 10:23 XXXXXX 閱讀(512) | 評論 (0)編輯 收藏

          【Effective Java】--異常

          38、只針對不正常的條件使用異常
          異常只應該被用于不正常的條件,它們永遠不應該被用于不正常的條件
          設計API啟示:一個良好的API不應該強迫它的客戶為了正常的控制流而使用異常。對于邊界的判斷常用的有兩種方法:狀態測試方法和可被識別的返回值


          40、對于可以恢復的條件使用被檢查的異常,對于程序錯誤使用運行時異常
           Thowable(可拋出異常)有三種結構:被檢查的異常(checked exception)、運行時異常(run-time exception)和錯誤(error)
          如果期望調用者能夠恢復,那么,對于這樣的條件應該使用被檢查的異常
          運行時異常和錯誤,不需要也不應該是被捕獲的拋出物
          用運行時異常來指明程序錯誤
          對于被檢查的異常,提供一些輔助方法是非常重要的,通過這些方法,調用者可以獲得一些有助于恢復的信息


          41、避免不必要地使用被檢查的異常

          42、盡量使用標準異常
                


          43、拋出的異常要適合于相應的抽象
          高層的實現應該捕獲低層的異常,同時導出一個可以按照高層抽象進行解釋的---異常轉譯
          低層的異常對于調試該異常被撥出的情形非常有幫助的話,可以使用異常鏈接。即低層的異常被高層的異常保存起來,并且高層的異常提供一個公有的訪問方法來獲得低層異常

          44、每個異常的拋出都必須有文檔

          45、在細節消息中包含失敗--捕獲信息
          為了捕獲失敗,一個異常的的字符串表示應該包含所有“對異常有貢獻”的參數和域的值
          在異常構造函數中以參數形式引入這些信息


          46、努力使失敗保持原子性
          一個失敗方法調用應該使用對象保持“它在被調用之前的狀態” ---failure atomic
          幾種解決方法:在執行操作之前檢查參數的有效性
          調整計算機過程,使得任何可能會失敗的計算部分發生在對象狀態被修改之前
          編寫一段恢復代碼
          在對象上臨時都拷貝一份,當操作完成之后把臨時拷貝中的結果復制給原來的對象。如:Collections.sort

          47、不要忽略異常
          寫上try catch塊

          posted @ 2011-02-12 18:02 XXXXXX 閱讀(261) | 評論 (0)編輯 收藏

          【編程珠現】-算法設計技術

                  【編程珠璣】第一部分的基礎知識已經看完,比較有感觸的有以下幾點:
                      1)、數據決定程序結構:對不同的程序,選用最合適的數據結構,必要是可以借助數據庫來解決問題
                      2)、學會寫偽代碼:偽代碼是思想的結晶,拋開算法的細節,抓住算法的本質思想。

                    第二部分是關于程序性能的講解。在算法設計技術章節講到了以下幾個重要的技術:
                      1)、保存狀態,避免重要計算:這也是動態規劃所采用的思想,別浪費中間結果,它們很寶貴
                      2)、將信息預處理至數據結構中:保存中間結果的一種方法
                      3)、分治算法:算法課上第一個學習的算法,如:二分查找、Strassen矩陣乘法等等。核心思想在于把問題分解成簡單的子問題,然后對子
                                  問題進行合并,經常和遞歸一起使用
                      4)、掃描算法
                      5)、累積:通常用于求前i個值的和
                      6)、下界:許多問題要證明它的下界是多少


                      下面是習題14的解答思想:
                       描述:給定整數m、n和整數(實)數向量x[n],請找到出現使總和x[i]+……+x[i+m]最接近0的整數i( 0<=i<n-m)
                       解決思路:從i+1開始的長度為m+1的子向量等當前子向量減去x[i-1],再加上x[i+m]

                        
          int alg(int * x, int m , int n){
              
          if0 == n )
                  
          return 0;

              
          int i ;
              
          int start = 0;
              
          int subVal = 0;
              
          int sum = 0;

              
          for( i = 0; i <= m; i++){
                  sum 
          += x[i];
              }

              subVal 
          = abs(sum);
              
              
          for( i = 1; i < n-m; i++){
                  sum 
          -= x[i-1];
                  sum 
          += x[i+m];
                  cout 
          << "sum " << sum <<endl;
                  
          if(abs(sum) < subVal){  //如果subVal比當前sum絕對值大
                      start = i;
                      subVal 
          = abs(sum);
                      
                  }

              }

              
              cout 
          << "sum: " <<  sum << endl;
              cout 
          << "subVal: " << subVal << endl;
              
              
          return start;
          }

                   原題中的向量為實數,核心算法還是一樣的,只是浮點數比較的時候要注意下
                   有興趣的朋友歡迎一起討論 :)

          posted @ 2011-01-14 11:20 XXXXXX 閱讀(281) | 評論 (0)編輯 收藏

          【編程珠璣】-啊哈!算法


                  一、二分搜索
                          二分搜索可以說是無處不在,應用它的前提是,對象有序且在某一范圍之內。

                  二、基本操作的威力
                          靈機一動,經過許久的思考,得出的解決方案或許就是一些基本操作的組合,不是嗎?
                          求逆代碼:把ab變成ba,可以有如下的方法:ab->arb->arbr->(arbr)r->ba
                             E.G.  n元向量左移i個位置
          reverse(0, rotdist - 1);
          reverse(rotdist, n
          -1);
          reverse (
          0, n-1);
                
                  三、排序
                          變位分詞的應用,關鍵在于:選擇標識和集中具有相同標識的單詞

                  四、原理
                          1)排序:產生有序輸出,將相等的元素集中在一起
                          2)二分搜索
                          3)標識:當使用等價類定義時,定義一種標識使同類中每一項都具有相同的標識,而該類之外的其它項則沒有該標識,這是很有用的
                          4)問題的定義:用戶的需求才是程序設計的根本
                          5)問題解決者的觀點:優秀的程序員有點懶,他們坐下來等待靈機一動的出現而不急于使用最開始的想法編程
                         

          posted @ 2011-01-11 11:49 XXXXXX 閱讀(374) | 評論 (0)編輯 收藏

          【編程珠璣】-開篇


                 昨天入手《編程珠璣》(第二版)一書,去年寒假已經把這書看了一大半,發現里面的一些算法和觀點簡單而富有哲理。

                 一、準確描述問題:程序員的主要問題與其說是技術問題,還不如說是心理問題,他不能解決問題,是因為他企圖解決錯誤的問題。所以準確描述一個問題非常重要,實際中往往體現中需求文檔的規范性和無異性中。

                二、位圖或者向量表示集合
                        1)、位圖數據結構的實現
            
          #define BITSPERWORD 32
          #define SHIFT 5
          #define MASK 0x1F
          #define N 10000000

          int a[1 + N/BITSPERWORD];

          void set(int i) {        a[i>>SHIFT] |=  (1<<(i & MASK)); }

          void clr(int i) {        a[i>>SHIFT] &= ~(1<<(i & MASK)); }
          int  test(int i)return a[i>>SHIFT] &   (1<<(i & MASK)); }
                      2)、位圖可以用于排序和和統計當中,合理應用往往可以得到時間-空間折中與雙贏

                  三、原理
                   1)、正確的問題:明確了問題,這場戰役就成功了90%
                   2)、位圖數據結構
                   3)、多趟算法:這些算法多趟讀入其輸入數據,每次完成一步
                   4)、時間-空間折中與雙贏
                   5)、簡單的設計:設計者確定其設計已經達到了完美的標準不是不能增加任何東西,而是不能再減少任何東西
                   6)、程序的設計階段

          posted @ 2011-01-08 10:41 XXXXXX 閱讀(236) | 評論 (0)編輯 收藏

          K-Menas算法


          一、算法簡介
           k-means 算法接受輸入量 k ;然后將n個數據對象劃分為 k個聚類以便使得所獲得的聚類滿足:同一聚類中的對象相似度較高;而不同聚類中的對象相似度較小。聚類相似度是利用各聚類中對象的均值所獲得一個“中心對象”(引力中心)來進行計算的。


          二、偽碼

          算法:K-means。
          輸入:
              K:聚類的數目
              D:包含n個對象的數據集
          輸出:K個聚類的集合
          方法:
          1)    從D中任意選擇K個對象作為初始聚類中心;
          2)    repeat
                   根據聚類中對象的均值,將每個對象(再)指派到最相似的聚類;
                    更新聚類均值,即計算每個聚類中對象的均值;
          3)    until聚類不再發生變化

          算法復雜度為: O(nkt).其中t為迭代次數

          三、準確性評價



          四、應用和擴展

          posted @ 2011-01-04 11:05 XXXXXX 閱讀(490) | 評論 (0)編輯 收藏

          Install MySQL5.1.25 on Ubuntu

                Ubuntu crashed tonight which urged me to reintsall the system and MySQL. Damn!

          -------------------main procedure-------------------

          shell> groupadd mysql

          shell> useradd -g mysql mysql

          shell> gunzip < mysql-VERSION.tar.gz | tar -xvf -

          shell> cd mysql-VERSION

          shell> ./configure --prefix=/usr/local/mysql

          shell> make

          shell> make install

          shell> cp support-files/my-medium.cnf /etc/my.cnf

          shell> cd /usr/local/mysql

          shell> bin/mysql_install_db --user=mysql

          shell> chown -R root  .

          shell> chown -R mysql var

          shell> chgrp -R mysql .

          shell> bin/mysqld_safe --user=mysql &

          ------------------initilize the password ------------------
          #set the password for root
          shell> mysql -u root
          mysql> SET PASSWORD FOR 'root'@'localhost' = PASSWORD('newpwd');

          #creat user mysql and set its password '123456'
          CREATE USER mysql@localhost IDENTIFIED BY '123456';
          GRANT ALL ON db_name.* TO mysql@localhost


          References: http://dev.mysql.com/doc/refman/5.1/zh/index.html

          posted @ 2010-12-29 00:20 XXXXXX 閱讀(338) | 評論 (0)編輯 收藏

          打印全排列

          在《組合數學》里面全排列是一個常見的問題。
          描述如下:有x1,x2,x3,...xn,共n個元素,打印出它的全排列。
          如:1 , 2 , 3
          有6種排列: 123, 132, 213, 231, 312, 321
          思路: 元素的全排列,其實就是遍列全部元素組成的一個排列樹,用回溯法可以得到比較好的效率,特別是空間上,,由于遍列整棵樹,時間復雜度為O(n!)

           1 /** 
           2  *  打印出list[k,m]的全排列 
           3  * @param list 
           4  * @param k  beginning index 
           5  * @param m  finishing index 
           6  */  
           7 static void getPerm(Object[] list, int k , int m){  
           8     if( k == m){  
           9         for(int i = 0; i <= m; i++)  
          10             System.out.print(list[i]);  
          11         System.out.println();  
          12     }else  
          13         forint i = k; i <= m; i++){  
          14         MyMath.swap(list, i, k);  
          15         getPerm(list, k+1, m);  
          16         MyMath.swap(list, i, k);  
          17           
          18     }  
          19 }  


           引申:類似此種算法的還有就是打印字符串(如:ABC)的真子集,其核心算法還是一樣的

           

          posted @ 2010-11-21 00:27 XXXXXX 閱讀(514) | 評論 (0)編輯 收藏

          crontab 定時任務

           

          crontab 五個域的含義
          0~59 表示分
          1~23 表示小時
          1~31 表示日
          1~12 表示月份
          0~6 表示星期(其中0表示星期日

          * * * * * /home/milch/tmpmail      #每隔一分鐘執行一次后臺程序tmpmail
           

          腳本的路徑必須為全局路徑
          一個定時任務例子:
            1)設置環境變量
               在$HOME  .profile后面添加  export $EDITOR=vi
             2) 新建一個文件 davecron
                  * * * * * /bin/echo `date` >>$HOME/dateInfo.txt 
             3) 提交給cron進程
                 crontab davecron
             4)查看定時任務
                 crontab -l
          //
          root@ubuntu:/var/spool/cron/crontabs# cat root
          # DO NOT EDIT THIS FILE - edit the master and reinstall.
          # (davecron installed on Mon Oct 25 11:29:52 2010)
          # (Cron version -- $Id: crontab.c,v 2.13 1994/01/17 03:20:37 vixie Exp $)
          * * * * * /bin/echo `date` >>$HOME/dateInfo.txt
          //
          ---------------------------------------------
          重啟crond:
          service crond restart
          或者
          /etc/rc.d/init.d/crond restart

          查看自動自行項:
          crontab -l

          添加/編輯自動執行項:
          crontab -e
          ----------------------------------------------
          at命令
          at命令,用戶向cron守護進程提-交作業,提交后保留所有當前的環境變量
          /etc 下at.allow & at.deny 規定哪些用戶可以使用at和不可能使用

          提交一個任務
           

          列出所提交的作業  at -l
          清除一個作業   atrm job n.o.   # atrm 8


          向后臺提交命令
          命令 &
          find /etc -name "passwd" -print >$HOME/find.txt 2>&1 &

          退出帳戶后仍執行命令
          nohup command &

          -------------
          SSH
          1. 首先在服務器上安裝ssh的服務器端。
          $ sudo aptitude install openssh-server

          2. 啟動ssh-server。
          $ /etc/init.d/ssh restart

          3. 確認ssh-server已經正常工作。
          $ netstat -tlp
          tcp6    0    0 *:ssh                *:*                   LISTEN     -
          看到上面這一行輸出說明ssh-server已經在運行了。
          ---------------

           

          posted @ 2010-10-28 22:13 XXXXXX 閱讀(215) | 評論 (0)編輯 收藏

          僅列出標題
          共8頁: 上一頁 1 2 3 4 5 6 7 8 
          主站蜘蛛池模板: 怀仁县| 南投县| 陈巴尔虎旗| 阿鲁科尔沁旗| 新化县| 芦溪县| 陆良县| 林西县| 峨眉山市| 昌图县| 宜昌市| 阿克苏市| 清水河县| 嘉定区| 曲阜市| 贵溪市| 河池市| 衡山县| 汉源县| 镇雄县| 大新县| 丰顺县| 灵宝市| 象山县| 南和县| 曲靖市| 崇阳县| 普兰店市| 江华| 长丰县| 天祝| 古田县| 阿拉尔市| 麻城市| 伽师县| 饶河县| 原阳县| 金堂县| 景泰县| 沭阳县| 渝中区|