统计

留言簿(1)

DB

Others

QA

Tech Website

阅读排行榜

评论排行榜

#

常见的OO原则

封装变化

多用组合,少用继承

针对接口编程,不针对实现编程

为交互对象之间的松耦合设计而努力

类应该对扩展开放,对修改关闭

只和朋友交谈

别找我,我会找你

类应该只有一个改变的理由

posted @ 2011-02-13 10:23 XXXXXX 阅读(490) | 评论 (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 阅读(243) | 评论 (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 阅读(265) | 评论 (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 阅读(357) | 评论 (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 阅读(222) | 评论 (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 阅读(471) | 评论 (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 阅读(318) | 评论 (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 阅读(500) | 评论 (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 阅读(199) | 评论 (0)编辑 收藏

仅列出标题
共8页: 上一页 1 2 3 4 5 6 7 8