我的关注

linux(centos) 卸载Xwindow

centos作服务器用途,不使用xwindow,但已安装,遂卸载!

不必使用rpm -e,这样会有很多依赖等麻烦

使用yum,这和debian的apt-get一样的方便!

yum groupremove “X Window System”

需要安装的话,同样

yum groupinstall “X Window System”

下辈子,无论爱与不爱,都不会再见

《下辈子,无论爱与不爱,都不会再见—-送给儿子的备忘录 》

我儿 , 写这备忘录给你,基于三个原则:
(一)人生福祸无常,谁也不知可以活多久,有些事情还是早一点说好。
(二)我是你的父亲,我不跟你说,没有人会跟你说。
(三)这备忘录里记载的,都是我经过惨痛失败得回来的体验,

可以为你的成长省回不少冤枉路。以下,便是你在人生中要好好记住的事:
(一)对你不好的人,你不要太介怀,在你一生中,没有人有义务要对你好,除了我和你妈妈。至于那些对你好的人,你除了要珍惜、感恩外,也请多防备一点,因为,每个人做每件事,总有一个原因,他对你好,未必真的是因为喜欢你,请你必须搞清楚,而不必太快将对方看作真朋友。
(二)没有人是不可代替,没有东西是必须拥有。看透了这一点,将来你身边的人不再要你,或许失去了世间上最爱的一切时,也应该明白,这并不是什么大不了的事。
(三)生命是短暂的,今日你还在浪费着生命,明日会发觉生命已远离你了。因此,愈早珍惜生命,你享受生命的日子也愈多,与其盼望长寿,倒不如早点享受。
(四)世界上并没有最爱这回事,爱情只是一种霎时的感觉,而这感觉绝对会随时日、心境而改变。如果你的所谓最爱离开你,请耐心地等候一下,让时日慢慢冲洗,让心灵慢慢沉淀,你的苦就会慢慢淡化。不要过分憧憬爱情的美,不要过分夸大失恋的悲。
(五)虽然很多有成就的人士都没有受过很多教育,但并不等于不用功读书,就一定可以成功。你学到的知识,就是你拥有的武器。人,可以白手兴家,但不可以手无寸铁,谨记!
(六)我不会要求你供养我下半辈子,同样地我也不会供养你的下半辈子,当你长大到可以独立的时候,我的责任已经完结。以后,你要坐巴士还是Benz(奔驰),吃鱼翅还是粉丝,都要自己负责。
(七)你可以要求自己守信,但不能要求别人守信,你可以要求自己对人好,但不能期待人家对你好。你怎样对人,并不代表人家就会怎样对你,如果看不透这一点,你只会徒添不必要的烦恼。
(八)我买了十多二十年六合彩,还是一穷二白,连三奖也没有中,这证明人要发达,还是要努力工作才可以,世界上并没有免费午餐。
(九)亲人只有一次的缘分,无论这辈子我和你会相处多久,也请好好珍惜共聚的时光,下辈子,无论爱与不爱,都不会再见。

使用DenyHosts阻止SSH暴力破解

DenyHosts是Python语言写的一个程序,它会分析SSHD的日志文件,当发现重复的攻击时就会记录IP到/etc/hosts.deny文件,从而达到自动屏蔽IP的功能。

DenyHosts官方网站为:http://denyhosts.sourceforge.net

以下是安装记录(以CentOS 4.4, DenyHosts 2.5 为例)

# cd /usr/local/src
# wget http://mesh.dl.sourceforge.net/sourceforge/denyhosts/DenyHosts-2.6.tar.gz
# wget http://jaist.dl.sourceforge.net/project/denyhosts/denyhosts/2.6/DenyHosts-2.6.tar.gz
# tar -zxvf DenyHosts-2.5.tar.gz
# cd DenyHosts-2.5
# python setup.py install

# cd /usr/share/denyhosts/
# cp denyhosts.cfg-dist denyhosts.cfg
# vi denyhosts.cfg

# cp daemon-control-dist daemon-control
# vi daemon-control

DENYHOSTS_BIN = “/usr/bin/denyhosts.py”
DENYHOSTS_LOCK = “/var/lock/subsys/denyhosts”
DENYHOSTS_CFG = “/usr/share/denyhosts/denyhosts.cfg”

# chown root daemon-control
# chmod 700 daemon-control

# ./daemon-control start
# cd /etc/init.d
# ln -s /usr/share/denyhosts/daemon-control denyhosts
# chkconfig –add denyhosts
# chkconfig –level 2345 denyhosts on

DenyHosts配置文件说明:
SECURE_LOG = /var/log/secure

#sshd日志文件,它是根据这个文件来判断的,不同的操作系统,文件名稍有不同。

HOSTS_DENY = /etc/hosts.deny

#控制用户登陆的文件

PURGE_DENY = 5m

#过多久后清除已经禁止的

BLOCK_SERVICE = sshd

#禁止的服务名

DENY_THRESHOLD_INVALID = 1

#允许无效用户失败的次数

DENY_THRESHOLD_VALID = 10

#允许普通用户登陆失败的次数

DENY_THRESHOLD_ROOT = 5

#允许root登陆失败的次数

HOSTNAME_LOOKUP=NO

#是否做域名反解

DAEMON_LOG = /var/log/denyhosts

#DenyHosts的日志文件

CentOS 5.4 yum安装Apache+php+Mysql

Centos 里的 yum 在线安装很慢.以下是替换为中国CentOS镜像服务器!
中国官方镜像网站: http://centos.ustc.edu.cn/
/* 使用说明 */
cd /etc/yum.repos.d  [进入yum.repos.d目录]
mv CentOS-Base.repo CentOS-Base.repo.save   [修改源文件名称备份]
wget http://centos.ustc.edu.cn/CentOS-Base.repo.5  [下载]
mv CentOS-Base.repo.5 CentOS-Base.repo     [下载后的文件更名]

1. 更新系统内核到最新.
yum -y update
系统更新后,如果yum安装时提示错误信息,请执行以下命令修复.
rpm –import /etc/pki/rpm-gpg/RPM-GPG-KEY*

2. 安装Apahce, PHP, Mysql, 以及php连接mysql库组件

yum -y install httpd php mysql mysql-server php-mysql

//安装mysql扩展
yum -y install mysql-connector-odbc mysql-devel libdbi-dbd-mysql
//安装php的扩展
yum -y install php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc
//安装apache扩展
yum -y install httpd-manual mod_ssl mod_perl mod_auth_mysql

一次性粘贴安装:
yum -y install httpd php mysql mysql-server php-mysql httpd-manual mod_ssl mod_perl mod_auth_mysql php-mcrypt php-gd php-xml php-mbstring php-ldap php-pear php-xmlrpc mysql-connector-odbc mysql-devel libdbi-dbd-mysql

3. 启动服务配置

/sbin/chkconfig httpd on [设置apache为自启动]
/sbin/chkconfig mysqld on [mysqld服务]

/sbin/service httpd start [自启动 httpd 服务]
/sbin/service mysqld start [自启动mysqld服务]

4.设置mysql数据库root帐号密码。
mysqladmin -u root password ‘新密码’ [引号内填密码]

让mysql数据库更安全

代码:

mysql -u root -p [此时会要求你输入刚刚设置的密码,输入后回车即可

mysql> DROP DATABASE test; [删除test数据库]

mysql> DELETE FROM mysql.user WHERE user = ”; [删除匿名帐户]

mysql> FLUSH PRIVILEGES; [重载权限]

mysql> GRANT ALL PRIVILEGES ON *.* TO ‘root’@’192.168.1.13’ IDENTIFIED BY ‘密码’ WITH GRANT OPTION; [增加远程链接用户]

按照以上的安装方式, 配置出来的默认站点目录为/var/www/html/

测试环境

rpm -qa |grep mysql

rpm -qa |grep httpd

rpm -qa |grep php

5.配置文件存放的位置

apache配置文件存放的位置:/etc/httpd/conf/httpd.conf

php配置文件存放的位置:/etc/php.ini 和/etc/php.d里面的文件

mysql配置文件存放的位置:/etc/my.cnf

6、安装phpMyAdmin

进入phpMyAdmin官方下载(不要最新版本,下phpMyAdmin 2.11.9.5
就行了,3.1以上需php 5.2以上),上传到你的网站目录下,然后进行配置。只需几步即可搞定。

I. config.sample.inc.php更名为config.inc.php;

II. 打开config.inc.php文件,进行以下修改;

// $cfg[‘Servers’][$i][‘controluser’] = ‘pma’;

// $cfg[‘Servers’][$i][‘controlpass’] = ‘pmapass’;

// $cfg[‘Servers’][$i][‘pmadb’] = ‘phpmyadmin’;

// $cfg[‘Servers’][$i][‘bookmarktable’] = ‘pma_bookmark’;

// $cfg[‘Servers’][$i][‘relation’] = ‘pma_relation’;

// $cfg[‘Servers’][$i][‘table_info’] = ‘pma_table_info’;

// $cfg[‘Servers’][$i][‘table_coords’] = ‘pma_table_coords’;

// $cfg[‘Servers’][$i][‘pdf_pages’] = ‘pma_pdf_pages’

// $cfg[‘Servers’][$i][‘column_info’] = ‘pma_column_info’;

// $cfg[‘Servers’][$i][‘history’] = ‘pma_history’;

// $cfg[‘Servers’][$i][‘designer_coords’] = ‘pma_designer_coords’;

去掉每行前面的//;

II.$cfg[‘blowfish_secret’] = ”; |修改为| $cfg[‘blowfish_secret’] = ‘http’;

IV.$cfg[‘Servers’][$i][‘controluser’] = ‘pma’; |把’pma’修改为你的帐号|$cfg[‘Servers’][$i][‘controlpass’] = ‘pmapass’; |把’pmapass设置为你的mysql登录密码|

V. $cfg[‘blowfish_secret’] = ”; | 添加短语密码例如:$cfg[‘blowfish_secret’] = ‘onohot’;

快速入门PHP面向对象编程

前言

面向对象博大精深,对于从未接触过得的人,会觉得一头雾水。

学习的资料很多,但大多比较抽象,所以我用经典的游戏-星际争霸来讨论PHP面向对象。

现在假设我们来用PHP开发星际争霸,从而接触PHP面向对象。

注意,为了便于学习,除了特殊说明,否则各部分代码之间没有关联。而且同一件事情往往用的是不同的代码。

另外我也不去考证各个兵种的属性数字,仅仅用来说明。

一、类和对象

如果玩家制造了一个机枪兵,那么我们怎么表示他呢,因为每个机枪兵有几个基本的数据要记录:剩余的血,杀敌数量,攻击力等等。

我们可以用一个数组来记录一个机枪兵剩余的血和杀敌数量,因为这对于每个机枪兵是独立的。

但攻击力比较麻烦,因为经过升级,攻击力会增加,这就必须要找出所有表示机枪兵的数组,然后进行修改,非常麻烦。

从这里我们可以看出一件事情,首先每个机枪兵有独立的数据需要记录和修改,比如剩余的血。同时他们有相同的数据需要共用,比如攻击力。

这时候面向对象就能帮上我们的忙了。

1.1、类的定义

我们先来处理一部分问题,也就是每个机枪兵独有的数据。

class marine

{

   public $blood = 50;//剩余的血

   public $kills = 0;// 杀敌数量

   //这个函数(通常叫做方法)表示攻击敌人时候的运行代码
   function attack($enemy)

   {

   // 攻击敌人的代码

   }

}

这叫做类,我们建立了一个表示所有机枪兵的类marine,这里面保留了需要每个兵独有的数据,比如上面代码里的剩余的血。

1.2、对象的创建和使用

接下来我们来使用对象,也就是每个机枪兵:

$m1 = new marine();

通过new后面加一个类的名字和括号,我们新建了一个机枪兵$m1,$m1被叫做类marine的对象,我们可以把它想象成一个特殊变量,只不过里面保存了多个数据。

如果需要使用或者操作某个机枪兵的血(对象的属性),只要用$m1->blood来表示就可以了:

echo $m1->blood;// 输出机枪兵$m1剩余的血

我们再建立一个机枪兵

$m2 = new marine();

如果此时$m1被敌人攻击过了,还剩下10个血。而$m2没受过攻击:

echo $m1->blood;//结果是10

echo $m2->blood;//结果是50

使用对象可以很简单的保存每个机枪兵的血,不会互相影响。

如果机枪兵$m1攻击敌人的时候,可以这样使用对象的方法:

$m1->attack($z1);//假设攻击的是某个小狗的对象$z1

不同的类内可以用同名的函数,比如小狗的类Zergling里面也可以有一个函数attack

要注意的是,从PHP5开始,无论在哪里改变一个对象的属性,都能改变它。比如上面一个小狗对象被作为参数传入机枪兵的attack函数,执行函数之后这个小狗对象的血减少了,这和一般的函数不同。但这是很直观的,如果一个小狗被攻击了,它的血就应该减少。

二、构造函数和析构函数

每次我们新建一个机枪兵的时候,总人口应该加1,如果一个机枪兵被杀,人口应该减少1。

可以通过构造函数和析构函数来自动处理:

class marine

{

   // 构造函数
   function __construct()

   {

   //增加总人口的代码

   }

   //析构函数
   function __destruct()

   {

   // 减少总人口的代码

   }

}

在一个类中,名字为__construct的函数叫做构造函数,每次new新建一个类的对象的时候就会执行:

$m1 = new marine();//每次制造一个机枪兵时系统会调用类marine的构造函数,自动增加总人口

在一个类中,名字为__destruct的函数叫做析构函数,每次销毁一个类的对象的时候就会执行:

unset($m1);//unset可以用于对象,表示销毁一个对象。每次一个机枪兵被杀时系统会调用类marine的析构函数,自动减少总人口

三、静态

机枪兵的攻击力是属于所有机枪兵对象,每个机枪兵的攻击力都是一样的,如果升级,应该一起变化。

这就用到static,表示静态:

class marine

{

static $attackNumber = 10;//攻击力的数字

   //这个函数表示攻击敌人时候的运行代码
   function attack($enemy)

   {

   //攻击敌人的代码,$enemy->blood表示敌人对象的血属性

   $enemy->blood -= self::$attackNumber;

   }

}

静态属性表示类所有的对象都共享的属性,一旦改变,所有的对象都跟着变化。

静态属性用static开头,比如上面的static $attackNumber。

静态属性可以用类直接访问:

echo marine::$attackNumber;//显示10

如果类以内的函数访问,用 self::$attackNumber表示本类的$attackNumber属性

所以如果我们升级了机枪兵的攻击力,所有的机枪兵都受影响,这就是面向对象的好处之一,也解决了我们前面讨论的共同数据的问题。

函数也可以是静态的,这样就可以用类直接访问,不需要新建对象来调用:

class marine

{

static $attackNumber = 10;//攻击力的数字

   //这个函数表示机枪兵升级的运行代码
   static  function upgrade()

   {

   self::$attacknum++;

   }

}

如果科技建筑升级完毕,直接就调用这个函数:

marine::upgrade();

四、继承

兵营用来造机枪兵,坦克房用来制造坦克,他们都是建筑,但是却有很多不同,如果用一个类“建筑”来表示,很困难。

但我们要保留他们的共性,比如都能飞行,不希望飞行的代码在各个类重复写,又要让他们能各自独立的生产不同的东西。

所以我们可以用继承来处理,继承表示父子关系,被继承的叫父类,继承的叫子类。用extends表示继承

//建筑类

class building

{

   function fly()

   {

   // 建筑飞行的代码

   }

}

//兵营类

class marineBuilding extends building

{

   function createMarine()

   {

   //制造机枪兵的代码

   }

}

// 坦克房类

class tankBuilding extends building

{

   function createTank()

   {

   // 制造坦克的代码

   }

}

接下来,我们看看继承产生的效果:

//如果造了一个兵营:

$mb1 = new marineBuilding();

/**

一旦他需要飞行,就可以直接使用建筑类的函数fly(),尽管兵营类的定义里没有这个函数

*/

$mb1->fly();

//而他要制造机枪兵的时候:

$mb1->createMarine();

同样是继承建筑类的坦克房类,就无法制造机枪兵,因为这是兵营类的个性。

如果在子类中的函数调用父类的函数,要使用parent,比如parent::fly()

注意,一个类只能有一个父类,PHP不允许多重继承,也就是说一个孩子只能有一个爹,一个爹可以有N个孩子!

五、访问控制

如果用$attackNumber = 10表示属性的话,系统默认是public $attackNumber = 10,所以建议这样写:

class marine

{

public static $attackNumber = 10;//攻击力的数字

}

public表示这个属性是公共的,也就是在任何地方都可以访问和操作的。

但这就存在一些问题,如果有玩家知道了类marine的一些代码结构,那他做个简单的补丁程序,运行的时候加载上去:

//补丁

marine::$attackNumber = 10000;

这样的话,他的机枪兵有10000的攻击力,呵呵,这样的话,谁打得过他!

为此我们要用private,表示这个属性只有类里面的函数才能访问:

class marine

{

private static $attackNumber = 10;//攻击力的数字

   // 这个函数表示机枪兵升级的运行代码
   function upgrade()

   {

      //这样防止无限升级

      if(self::$attacknum<13)

      {

      self::$attacknum++;

      }

   }

}

这样一来,只有升级才能改变机枪兵的攻击力。

但是现在往往是团队开发,而且很多用到类的继承,如果private的话,子类就无法访问了,但又不希望随便都可以修改某些属性。

那么可以用 protected,protected的属性可以被子类的函数访问。

六、重载

6.1、属性重载

如果我们把地面部队作为一个类,让机枪兵类来继承他,这时候如果地面部队类和机枪兵类里面都定义了攻击力$attackNumber,那么每个兵的攻击力就决定于机枪兵类,而不是地面部队。这就叫做重载。

//地面部队

class groundArmy

{

public $attackNumber = 5;

}

//机枪兵

class marine extends groundArmy

{

public $attackNumber = 10;//攻击力的数字

}

$m1 = new marine();//新建一个机枪兵

echo $m1->attackNumber;//显示攻击力为10

6.2、函数重载

重载也可以用于函数,子类的函数如果和父类函数同名,除非另行说明,否则子类的对象默认调用子类内的函数。

比如人族的鬼兵类ghost和神族类的黑暗圣堂类(隐刀),都是隐形兵种,但是鬼兵隐形的时候会减少能量,黑暗圣堂根本没有能量属性。

如果我们把隐形能力作为父类,鬼兵类 ghost和神族类的黑暗圣堂类DarkTemplar来继承它,同时实现不同的隐形代码:

//隐形能力类

class concealAbility

{

   //这个函数表示隐形的运行代码
   function conceal()

   {

      //隐形的运行代码

   }

}

// 鬼兵类

class ghost extends concealAbility

{

$energy = 150;

   // 这个函数表示隐形的运行代码
   function conceal()

   {

      //隐形的运行代码

      //减少鬼兵的能量,$this表示当前对象,也就是当前这个鬼兵

      $this->energy -= 25;

   }

}

//黑暗圣堂类

class DarkTemplar extends concealAbility

{

   // 这个函数表示隐形的运行代码
   function conceal()

   {

      //隐形的运行代码,不影响能量

   }

}

// 新建一个鬼兵

$g1 = new ghost();

//显示能量为150

echo $g1->energy;

// 鬼兵隐形

$g1->conceal();

//显示能量为125

echo $g1->energy;

//新建一个黑暗圣堂

$d1 = new DarkTemplar();

// 黑暗圣堂隐形,他没有能量属性

$g1->conceal();

七、接口

PHP不允许多重继承,那么有些问题就难办了。

假如为了规范处理,我们把隐形的能力建立一个类,然后把飞行能力放一个类,那么人族的侦察机怎么处理?不能继承两个类!

那我们不用继承也行,但是开发组的其他人一旦涉及到侦察机,要把长长的代码读一遍吗?有没有可能知道类的所有方法的简要描述?

可以用到接口interface,一个类可以执行(继承)多个接口,接口中定义的函数不能有函数体,执行接口的类必须将这些函数完整定义。

这样我们知道侦察机实现了飞行能力接口,必然有接口里面描述的飞行方法:

//隐形能力的接口

interface concealAbility

{

public function conceal();

}

//飞行能力的接口

interface flyAbility

{

public function fly();

}

//侦察机类

class Wraith implements flyAbility, concealAbility

{

   //这个函数表示侦察机飞行的运行代码
   function fly()

   {

      // 飞行的运行代码

   }

   //这个函数表示侦察机隐形的运行代码
   function conceal()

   {

      //隐形的运行代码

   }

}

八、总结

我们讨论了PHP面向对象的基本知识,通过星际争霸这一经典的游戏来说明,大家可以看到面向对象的初步作用。

我们看到通过面向对象可以使代码更加清晰,类将代码组织起来,比较方便的重复使用。

同时对象也减少了变量的冲突,方便相关性数据的保存和使用。

如果要解决的问题涉及很多方面,面向对象可以演化出更加灵活和有技巧的方式,比如通常提到的设计模式,和很多框架。

当然,面向对象也有缺点,从上面的代码可以看到,首先代码就多了,简单的任务如果定义许多类,反而麻烦。

对于简单任务,面向对象也可能使代码运行的效率降低。

深入的探讨,超出了本文的范围。