#
封装变化
多用组合,少用继承
针对接口编程,不针对实现编程
为交互对象之间的松耦合设计而努力
类应该对扩展开放,对修改关闭
只和朋友交谈
别找我,我会找你
类应该只有一个改变的理由
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已经在运行了。
---------------