分类目录归档:IT World

灵媒苏小小

    【魔王重生】小编遇上大美女,怎料美女不是人。昔日情人下毒手,美女前来救小编。好奇终究害死猫,误打误撞放魔王。前世恩怨由此起,待听猫猫且来叙。
【穿越千年】苏小小失踪,小编且心急,唤来旧日友,再把美女寻,黑猫误乱阵,木子穿千年,往事再重现,纠结在此卷。
【修炼西游】玉帝再给机会,四人结成团队,重现西游又记,修炼魔身为人。

 

点击阅读灵媒苏小小   http://www.qdmm.com/MMWeb/2106599.aspx

灵媒苏小小最新章节试阅

    1.
结草原本想去给郁子找药材,可是就碰巧遇到魇离,二人便打了起来。这正是朱雀王所见到的两道紫色的光芒。
现在三人又再次相遇,可是同往日却再也不同,很多东西都像冬天泼出去的水一样,收不回又擦不去,结成冰块,凝结在地面,成为永久的疤痕。
“日辰,好久不见。”魇离淡淡地说,就如他往日,不张扬却又不屑。
日辰点点头,道:“嗯,还是本王大婚之前见到的呢。”
魇离冷冷一笑,肩膀也随之抽动,说:“原本是你嫂子的人,如今却变成了我的弟妹,却是让人不悦,不过也不劳烦臣弟多次提醒。”
“少废话!”结草大吼一声就朝着魇离扑过去,两人又打作一团,化为两团紫色的光雾穿梭在朱雀皇宫内。
整个朱雀都充斥着浓烈的血腥味,尖叫哭嚎四起,杀戮遍地。朱雀军已经溃不成军,恶鬼像坏死的蛆虫向城外扩去,朱雀瞬间就成了人间地狱。
皇宫里横七竖八歪斜着宫女和侍者的尸体,他们都像被蚕食的树叶一般,到处都是窟窿,这些恶鬼很是贪婪,并不把一个人吃完,他们有的只吃了脑袋,有的只是吃了腿脚,更有恶心的专门挑着肝脏吃,被吃了肝脏的人的腹部都有一个大窟窿。
朱雀王抬起脚,就会有粘稠的血液黏在脚底,让人的行动都变得缓慢。他的脸色越来越难看,就像是被镀上了一层铅一样,这是他整个家族多年的心血,却就在他的手里毁……

[笔记]SCP 命令详解 | ssh信任关系

自动登录ssh不需要输入密码

环境:
linux1        192.168.1.10
linux2        192.168.1.20

需求:由于要经常从linux1登录到linux2进行维护工作,每次都要输入密码,为了方便,使用下面方法将直接登录到linux2而不需要输入 密码

linux1上操作
1.生成公钥
ssh-keygen -t rsa
密码可以不用设置

2.将生成的公钥复制到linux2
scp .ssh/id_rsa.pub root@linux2:/root

linux2上操作
3.将复制过来的公钥生成授权key
mkdir ~/.ssh
cat id_rsa.pub >>.ssh/authorized_keys

PS by Gu:如果用>会覆盖之前的信任关系,所以应该用>>

登录测试,在linux1上
ssh root@linux2
这时候不需要输入密码即可进入linux2控制台

 

===============================================

SCP 命令跟 CP 命令类似,只不过CP命令是在同一台机器上用的,SCP是在2台机器上复制的命令。默认端口22

举例说明:
复制远程服务器的文件到本地

scp -P 22 root@21andy.com:/home/test.zip /home/

复制本地的目录到远程服务器

scp -P 22 -r /home/andy/ root@21andy.com:/home/

SCP 命令语法
scp [-1245BCpqrv] [-c cipher] [F ssh_config] [-I identity_file] [-l limit] [-o ssh_option] [-P port] [-S program] [[user@]host1:] file1 […] [[suer@]host2:]file2

 

 

Hudson持续集成PHP实践

一、什么是Hudson?

CI:Continuous Integration,持续集成,是一种软件开发实践,即团队开发成员经常集成它们的工作,每天可能会发生多次集成,每次集成都通过自动化的构建(包括编译,发布,自动化测试)来验证,从而尽快地发现集成错误,也可得到增量式的可发布文件。

Hudson:是一个基于Java实现的可扩展的持续集成(CI)引擎,主要用于:

1) 持续、自动地构建/测试软件项目(主要用途)

2) 监控一些定时执行的任务(比如定时发送集成结果到你的邮箱)

3. Hudson的特点

1) 使用方便,只要将Hudson提供的Hudson.war部署到你的servlet服务器上即可(Tomcat或者Jboss)

2) 分布式构建支持,Hudson能够让多台计算机一起构建/测试

3) 可以生成xUnit测试报告,可以很直观的看到测试结果

4) 插件支持:Hudson可以安装多种插件,从而完成你所需要的各种集成要求,并且可以支持非Java工程的集成(这个对我们很重要,我们项目大多采用PHP)

二、使用Hudson

Hudson的安装

1)      Hudson是基于Java开发的,需要部署到Web服务器上,我们所使用的Web服务器是Tomcat,而Tomcat的运行需要JRE的支持,所以运行Hudson首先要安装JRE和Tomcat。

2)      安装好JRE和Tomcat之后开始安装Hudson:

java -jar hudson.war -Dhudson.security.ExtendedReadPermission=”true” 1>>hudson.log 2>>hudson.log.wf &

拷贝hudson.war到Tomcat网站根目录下,执行以上命令,解压hudson.war并且记录日志把stdout到hudson.log ,stderr到hudson.log.wf

2.插件安装

由于hudson默认只支持Java项目,为了让它支持PHP项目的构建和自动化测试需要其他的一些工具和插件的支持,我们需要的工具和插件大体上有:

1)      Ant:是一种基于Java的build工具(编译打包工具),它有些类似于(Unix)C中的make ,但没有make的缺陷,ant脚本基于xml,所有的脚本都是xml文件,结构简单书写方便(具体格式百度一下),需自己安装。

2)      Phing:一个基于Ant的PHP项目构建系统.名字为PHing Is Not GNU make 的缩写(可以完成GNU make的所有功能,但使用较方便)

3)      Phing plugin: 为Hudson提供Phing支持的插件

4)      SVN:版本控制工具

5)      PHPUnit:PHP单元测试工具

6)      Clover: Clover 是一个测试代码覆盖率分析工具, 在软件测试过程中,它帮助查找有哪些没有被充分执行的方法、语句和判断条件,Clover 会把覆盖率分析结果以HTML、PDF等格式进行报告。Clover 是商业工具,但它可以免费用于开放源码项目。

7)      Clover plugin:为Hudson提供Clover的支持

8)      PCPD(phpcpd):PHP copy paste detector,重构工具,通过对项目源文件分析可以发现项目中可重构代码

9)      PHP_Depend(pdepend):源代码检查工具,通过对源代码进行静态分析得到抽象语法树和Software Metric以对代码质量进行度量。

10)   PMD(PHP MESS DETECTOR):基于pdepend的结果进行分析,对超过pdepend的具体指标的值显示提示信息。

11)   phpDocumentor(phpdoc):可以从PHP源代码直接得到完整说明文档。

12)   PHP CodeSniffer(phpcs):基于PHP5的程序,用来检查代码是否符合代码标准(默认标准为PEAR Coding Standard)

13)   Checkstyle plugin:本插件收集来自Checkstyle的分析结果,并将分析之后的提示展现出来。

三、Hudson Trouble Shooting
1.插件版本升级,名字可能会有变化,但是通过功能描述可以找到对应的插件
2.新建任务时,一般选择“构建一个自由风格的软件项目”
3.任务配置时,SVN设置,建议最好有SVN Browser,不然update代码时的构建会出问题,另外查看不到代码变更集信息。
4.SVN设置时,建议选择Use update,否则会每次构建都会全部重新check out代码,效率低。
5.Build触发设置,Poll SCM是指在有代码变更的触发之后,会按照什么样的Schedule进行构建。
比如:选择Poll SCM,Schedule填 30 * * * *,指有代码变更的那个时间点之后的下一个xx:30的时候构建一次
6.创建完任务之后,需要手动修改jobs/工程目录下的build.xml文件,他是一个ant脚本
7.Ant脚本中,target build位于脚本最后,它依赖于clean, phpcpd, pdepend, phpmd, phpcs, phpunit, code-coverage等target的执行。
注意clean的位置是在最前,如果在之后的话,会删除之前构建的文件,造成无法访问构建结果的error

Head First设计模式阅读笔记(三)

状态模式:
概念:允许对象在内部状态改变时改变它的行为,对象看起来好像修改了它的类。

定义一个状态的父类,限定了可以执行的操作,并实例化用于存储现在状态。子类通过继承关系,实现不同状态下,进行各种操作的逻辑。这样可以保证对修改封闭,对添加开放。 当加入一个新的状态的时候,只需要继承父类并实现相应操作,并修改主线程逻辑即可。

同策略模式大同小异,但是实现的意图不一样。 策略模式是为了类的多样化,操作的多样化;状态模式是为了状态转换的易于实现和添加。

状态模式

 

代理模式:
概念:为另一个对象提供一个替身或占位符以访问这个对象

现在看来,应该就是类似于webservice或者是云服务吧。为客户提供一个接口,告诉他可以实现的功能,然后客户就可以使用这个接口完成想要进行的操作。实际上,这个接口只是调用了一个远程的服务,将数据传递过去并将结果传递回来。

现在的很多像soap和hessian都可以很好的完成,另外还有python和ruby等脚本语言应该也比较方便的实现。

代理模式

 

复合模式:

概念:复合模式结合两个或以上的模式,组成一个解决方案,解决一再发生的一般性问题。

问题的引出:

一大堆Quackable —– 策略模式,继承

有一只鹅出现了,它希望自己像一个Quackable —– 适配器模式

然后,呱呱叫学家决定要计算呱呱叫声的次数 —– 工厂模式生成

但是呱呱叫学家担心他们忘了加上QuackCounter装饰者 —– 装饰者模式

又是鸭子,又是鹅,又是Quackable的……我们有管理上的困扰 —– 组合模式和迭代器模式

当任何呱呱声响起时,呱呱叫学家都希望能被告知 —– 观察者模式

实际上,就MVC框架就是很好的一个复合模式

 

其他的一些模式

桥接模式:不只改变你的实现,也改变你的抽象。

生成器模式:封装一个产品的构造过程,并允许步骤构造。

责任链模式:让一个以上的对象有机会能够处理某个请求。(处理流程)

蝇量模式:让某个类的一个实例能用来提供许多“虚拟实例”。(类似不同大小不同内容的注释文字)

解释器模式:为语言创建解释器。(编译原理的词法分析,语法分析)

中介者模式:集中相关对象之间复杂的沟通和控制方式。(卖房中介,可以应对不同房源,不同买房主,卖房主,有自己的营销策略)

备忘录模式:可以让对象返回之前的状态。(动态规划里面的备忘录方法)

原型模式:创建给定类的实例的过程很昂贵或很复杂时使用。

访问者模式:可以为一个对象的组合增加新的能力,且封装并不重要时使用。

PHPUnit和xdebug

第二个月工作第12天,时间过得还蛮快地。

工作起来,就会找回期待晚上和周末的感觉。

说:白天越累,晚上越high,平时越忙,周末越high~

============================

今天使用PHPUnit和xdebug一起做了一下覆盖率测试,还蛮好玩的。

生成的那个html非常漂亮,把覆盖的代码全部都标记了,这样可以很快的发现那些分支,那些代码还没有被测试到。

安装方法网上都有,就不赘述了,我使用的是zend方法:

[zend_extension]
zend_extension=”/home/work/local/php/ext/xdebug.so”
;zend_extension=”/home/work/local/pikagent/lib/xdebug/xdebug_php5.so”
;zend_extension=”/home/work/local/pikagent/lib/xdebug/xdebug_php5.so”
xdebug.profiler_enable=on
xdebug.trace_output_dir=”/home/work/var/xdebug”
xdebug.profiler_output_dir=”/home/work/var/xdebug”
;xdebug.profiler_output_name=”script”

之后使用phpunit,就可以进行覆盖率测试了

命令:phpunit –coverage-html /home/work/var/xdebug TestCase.php  就可以了

其中 /home/work/var/xdebug 是存放结果的目录

TestCase.php就是单测文件

之后到xdebug的目录下,拷贝生成的html文件及相关css和image,打开就可以查看啦。

效果图: 上面是统计结果,绿色的话就是比较好,黄色的部分表示还没覆盖到,很直观啦。

测试覆盖率结果

Head First设计模式阅读笔记(二)

适配器模式:
概念:将一个类的接口,转换成客户期望的另一个接口。适配器让原本不兼容的类可以合作无间。
比如我们要将一个火鸡封装成一个鸭子,因为我们现在只有处理鸭子的机器方法。那么我们使用一个将火鸡转换成鸭子的适配器类,类中包含一个火鸡对象,当需要它鸣叫时,调用火鸡的鸣叫方法,需要飞时,调用火鸡的飞行方法。通俗理解就像插头转换器一样,所以叫适配器模式。

与装饰者模式(不改变接口,但加入方法)不同的是,适配器模式是直接将一个接口转成另一个接口。

适配器模式

外观模式:

概念:提供了一个统一的接口,用来访问子系统中的一群接口。外观定义了一个高层接口,让子系统更容易使用。

就是说把一些相关的类的操作集合在了一起,创建了一个流程的感觉。类似于功能的集合,比如按遥控器的家庭影院按钮,会关灯,开音响,下降幕布等一系列操作。

外观模式

模板方法模式:

概念:在一个方法中定义一个算法的骨架,而将一些步骤延迟到子类中。模板方法使得子类可以在不改变算法结构的情况下,重新定义算法中的某些步骤。

算法的骨架使用final定义,不可改变。可以延迟的步骤使用抽象方法abstract。比如可以定义制造咖啡,牛奶和茶的方法步骤,只是冲泡的内容不一样,添加的调料不一样,都需要烧开水和装杯(可能杯子也不一样)。

模板方法模式

迭代器模式:

概念:提供一种方法顺序访问一个聚合对象中的各个元素,而又不暴露其内部的表示。

比较好理解,就是比如有几种集合元素,数组,ArrayList,Hashmap,使用Iterator迭代获得全部元素。需要注意的是可以自己写一些Iterator方法,和compareTo方法,来完成比较。

迭代器模式

组合模式:

概念:允许你将对象组合成树形结构来表现“整体/部分”层次结构。组合能让客户以一致的方式处理个别对象以及对象组合。

就是借鉴的树的概念,一个结点,可以是父节点,也可以是子结点,迭代器会相同对待。他们共同继承自Component,可以将对象的集合以及个别的对象一视同仁。。复杂的是在迭代的过程中,要考虑到遍历的顺序,可以参考深搜和广搜。

组合模式

 

PHPUnit学习

来自百度百科……
“PHPUnit是一个轻量级的PHP测试框架。它是在PHP5下面对JUnit3系列版本的完整移植,是xUnit测试框架家族的一员(它们都基于模式先锋Kent Beck的设计)。
单元测试是几个现代敏捷开发方法的基础,使得PHPUnit成为许多大型PHP项目的关键工具。这个工具也可以被Xdebug扩展用来生成代码覆盖率报告 ,并且可以与phing集成来自动测试,最后它还可以和Selenium整合来完成大型的自动化集成测试。”

简单来讲,使用PHPUnit的目的,就是在测试代码的时候,设置好检测点,检测方法和结果比对方式,进行大量的自动的代码测试。以下面这个例子说明:
assertEquals(0, sizeof($fixture));
   }

   public function testArrayContainsAnElement() {
   /* Create the Array fixture*/
   $fixture = array();
   /*Add an element to the Array * fixture*/
   $fixture[] = ‘Element’;
   /*Assert that the size of the * Array fixture is 1*/
   $this->assertEquals(1, sizeof($fixture));
   }
  }
?>
里面定义了一个测试点,测试Array的功能,两个测试方法:为空和为一个元素的时候;结果比对就是数组的大小,为空=0,一个元素=1. 这样使用phpunit ArrayTest就可以进行自动的测试,并给出测试结果。

要点:
  1 编写的测试用例是一个php脚本
  2 require_once ‘PHPUnit/Framework.php’是必须的,另外,你需要在测
  试用例脚本中包含你需要测试的代码
  3 测试用例的主体必须写在类中,类名必须和文件名保持一致,还必须是
  PHPUnit_Framework_TestCase的子类
  4 每一个测试用例都是一个public的成员函数,必须以test开头
  5 程序的输出使用assert*系列函数来进行验证
  该用例需要在Shell下键入phpunit ArrayTest.php来运行。结果如下示:
  [username@machine xx]$ phpunit ArrayTest.php
  PHPUnit 3.1.3 by Sebastian Bergmann.
  ..
  Time: 0 seconds
  OK (2 tests)
  结果中点号代表一个用例通过(即assert系列函数都通过)。如果将上面的测试用例testArrayContainsAnElement用例assertEquals函数中的1改为0,则运行结果为:
  PHPUnit 3.1.3 by Sebastian Bergmann.
  .F
  Time: 0 seconds
  There was 1 failure:
  1) testArrayContainsAnElement(ArrayTest)
  Failed asserting that matches expected value .
  /home/wiki/apache/htdocs1.5.0/ArrayTest.php:29
  FAILURES!
  Tests: 2, Failures: 1.
  可以很明显看出结果由原来的 .. 变为 .F ,F表示第二个测试用例未通
  过,并且具体与哪一条验证不符都在后有详细说明。
  除了F外,一个测试用例还有I(未完成),S (跳过),E (错误)三种状态

高级的一些用法比如:依赖关系和数据提供者大家可以百度学习,其实也不太用到
还有一些比如测试异常的方式,可以用:
try catch + fail法
public function testException() {
try {
// 这里写上会引发异常的代码
} catch (InvalidArgumentException $expected) {
// 抓到异常测试通过
return ;
}

// 没抓到异常就算失败
$this->fail(‘An expected exception has not been raised.’ );
}

常用的assert****
assertEquals(array $expected, array $actual[, string $message = ”])
断言数组$actual和数组$expected相同
assertFalse(bool $condition[, string $message = ”])
断言$condition的结果为false
assertTrue(bool $condition[, string $message = ”])
断言$condition为True,否则就报告错误

其他的话,其实都可以用assertEquals替代来写,实际应用实际操作吧。
其实做测试主要还是设计的考虑和边界值的选取等。

Mac OS Lion系统下安装apache,php,pear和phpunit

八月上班的第一天,加入项目组了,准备开始学习测试
============================
使用MacOS Lion还是不错的,想着做开发应该没啥问题吧,php嘛。但是实际操作起来还是有很多不同的。
首先他自带了php 5.3.6,版本很新啊,和apache2,所以就不需要装了
在命令行下直接php命令就可以了,但是如果要打开apache的功能,还需要做一些操作
开启apache对php的支持
在/etc/apache2/httpd.conf中,打开LoadModule php5_module libexec/apache2/libphp5.so这一项
然后去系统偏好设置,共享中打开web共享,然后访问http://localhost可以看到久违的It works!
自己设置的网站是在 ~/Sites/文件夹下,对应的url是
http://localhost/~[your_user_name]/index.php
可以使用常用的phpinfo()来试一下开通了没有。

然后就要开始装pear了
cd /usr/local下,然后使用
curl http://pear.php.net/go-pear | sudo php
命令,发现php版本太新了,提示用go-pear.phar > go-pear.php文件才行
安装完成如果发现pear命令可以用了,那就说明好了,如果还不行的话,就百度一下吧⋯⋯

开始安装phpunit
首先升级pear,使用 pear upgrade pear
然后添加pear的频道
pear channel-discover components.ez.no

pear channel-discover pear.phpunit.de

pear channel-discover pear.symfony-project.com

之后使用
pear install –alldeps –force phpunit/phpunit
即可完成安装
安装完成如果运气好的话,比如我在xp下面,就可以直接使用phpunit命令了,
但是在mac下还是不行,提示
PHP Warning: require_once(PHP/CodeCoverage/Filter.php): failed to open stream:
No such file or directory in phpunit on line 38
我先用pear install phpunit/PHP_CodeCoverage命令装了,还是不行。
肯定就是路径问题,可以使用修改include_path的方法,但是不太明白,所以
打开pear目录下phpunit在

Head First设计模式

这是一本好书
上班第17天,今天发工资,哇咔咔
============================================
策略模式:
概念:定义了算法族,分别封装起来,让它们之间可以互相替换,此模式让算法的变化独立于使用算法的客户。
通俗来讲,就是有一个父类型,他有一些方法,子类型可以继承这些方法,但是这些方法在子类中的表现又不尽相同。
所以将父类型中的一些方法,也变成接口和类来处理,这样可以在构造子类的时候,选择对应的父类不同的方法来构造。

策略模式

观察者模式:
概念:定义了对象之间的一对多依赖,这样依赖,当一个对象改变状态时,它的所有依赖者都会收到通知并自动更新。
例子是天气预报,接收到新数据后对三个指示器进行更新。指示器继承自object并都有update方法。主题对象将不同的object加入到array,在获取数据后对全部object进行自动更新。

观察者模式

装饰者模式:
概念:动态地将责任附加到对象上。若要扩展功能,装饰者提供了比继承更有弹性的替代方案。
比如星巴兹咖啡的解决方案:先定义一个基类,有描述和花费两个方法,一般的咖啡直接继承该父类即可。如果需要加调料,使用继承自基类的装饰者类,用原始的对象构造新的对象,并添加额外的花费即可。

装饰者模式

工厂方法模式:
概念:定义了一个创建对象的接口,但由子类决定要实例化的类是哪一个。工厂方法让类把实例化推迟到子类。
在制作pizza的时候,使用pizza工厂类,来根据不同的type选择实例化不同的pizza style。这样可以保证在对之后的处理独立。
也就是把一串的if else移到专门的工厂类里面去,保证代码的稳定性。
包括:一般工厂模式,抽象工厂模式(可以有很多不同的工厂实现自同一个抽象工厂,比如pizza的原料也可以不同)

工厂模式

单件模式:
概念:确保一个类只有一个实例,并提供一个全局访问点
Singleton模式的实现基于两个要点:
  1)不直接用类的构造函数,而另外提供一个Public的静态方法来构造类的实例。通常这个方法取名为Instance。Public保证了它的全局可见性,静态方法保证了不会创建出多余的实例。
  2)将类的构造函数设为Private,即将构造函数”隐藏”起来,任何企图使用构造函数创建实例的方法都将报错。这样就阻止了开发人员绕过上面的Instance方法直接创建类的实例。
  通过以上两点就可以完全控制类的创建:无论有多少地方需要用到这个类,它们访问的都是类的唯一生成的那个实例。

命令模式:
概念:将“请求”封装成对象,以便使用不同的请求、队列或者日志来参数化其他对象。命令模式也支持可撤销的操作。
定义一个命令接口,具有execute方法,其他命令已此为基础。使用命令的对象包含一个command,通过set方法指定不同的命令并调用execute方法即可实现命令操作。

命令模式