#
封裝變化
多用組合,少用繼承
針對接口編程,不針對實現編程
為交互對象之間的松耦合設計而努力
類應該對擴展開放,對修改關閉
只和朋友交談
別找我,我會找你
類應該只有一個改變的理由
38、只針對不正常的條件使用異常
異常只應該被用于不正常的條件,它們永遠不應該被用于不正常的條件
設計API啟示:一個良好的API不應該強迫它的客戶為了正常的控制流而使用異常。對于邊界的判斷常用的有兩種方法:狀態測試方法和可被識別的返回值
40、對于可以恢復的條件使用被檢查的異常,對于程序錯誤使用運行時異常
Thowable(可拋出異常)有三種結構:被檢查的異常(checked exception)、運行時異常(run-time exception)和錯誤(error)
如果期望調用者能夠恢復,那么,對于這樣的條件應該使用被檢查的異常
運行時異常和錯誤,不需要也不應該是被捕獲的拋出物
用運行時異常來指明程序錯誤
對于被檢查的異常,提供一些輔助方法是非常重要的,通過這些方法,調用者可以獲得一些有助于恢復的信息
41、避免不必要地使用被檢查的異常
42、盡量使用標準異常
43、拋出的異常要適合于相應的抽象
高層的實現應該捕獲低層的異常,同時導出一個可以按照高層抽象進行解釋的---異常轉譯
低層的異常對于調試該異常被撥出的情形非常有幫助的話,可以使用異常鏈接。即低層的異常被高層的異常保存起來,并且高層的異常提供一個公有的訪問方法來獲得低層異常
44、每個異常的拋出都必須有文檔
45、在細節消息中包含失敗--捕獲信息
為了捕獲失敗,一個異常的的字符串表示應該包含所有“對異常有貢獻”的參數和域的值
在異常構造函數中以參數形式引入這些信息
46、努力使失敗保持原子性
一個失敗方法調用應該使用對象保持“它在被調用之前的狀態” ---failure atomic
幾種解決方法:在執行操作之前檢查參數的有效性
調整計算機過程,使得任何可能會失敗的計算部分發生在對象狀態被修改之前
編寫一段恢復代碼
在對象上臨時都拷貝一份,當操作完成之后把臨時拷貝中的結果復制給原來的對象。如:Collections.sort
47、不要忽略異常
寫上try catch塊
一、二分搜索
二分搜索可以說是無處不在,應用它的前提是,對象有序且在某一范圍之內。
二、基本操作的威力
靈機一動,經過許久的思考,得出的解決方案或許就是一些基本操作的組合,不是嗎?
求逆代碼:把ab變成ba,可以有如下的方法:ab->a
rb->a
rb
r->(a
rb
r)
r->ba
E.G. n元向量左移i個位置
reverse(0, rotdist - 1);
reverse(rotdist, n-1);
reverse (0, n-1);
三、排序
變位分詞的應用,關鍵在于:選擇標識和集中具有相同標識的單詞
四、原理
1)排序:產生有序輸出,將相等的元素集中在一起
2)二分搜索
3)標識:當使用等價類定義時,定義一種標識使同類中每一項都具有相同的標識,而該類之外的其它項則沒有該標識,這是很有用的
4)問題的定義:用戶的需求才是程序設計的根本
5)問題解決者的觀點:優秀的程序員有點懶,他們坐下來等待靈機一動的出現而不急于使用最開始的想法編程
昨天入手《編程珠璣》(第二版)一書,去年寒假已經把這書看了一大半,發現里面的一些算法和觀點簡單而富有哲理。
一、準確描述問題:程序員的主要問題與其說是技術問題,還不如說是心理問題,他不能解決問題,是因為他企圖解決錯誤的問題。所以準確描述一個問題非常重要,實際中往往體現中需求文檔的規范性和無異性中。
二、位圖或者向量表示集合
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)、程序的設計階段
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
在《組合數學》里面全排列是一個常見的問題。
描述如下:有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 for( int 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)的真子集,其核心算法還是一樣的
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已經在運行了。
---------------