观察者模式

前提:

之前的一家公司,因为人手紧缺就让学JAVA的同学转行来写PHP。

过程:

我维护代码的时候,发现里面有很多Listener方法。开始一直以为只是编写命名规范而已,然后才知道是设计模式

疑惑:

这种设计模式有什么意义?


要想知道,为什么这么写,就想要知道这种设计模式是怎么实现的,它存在的意义。观察者模式的定义,我这里就不复述了。

观察者模式

观察者模式

 

这个图是我从别人代码里面解读出来对观察者模式的理解,该模式的核心是监听。跟Jquery里面的On()绑定事件类似

然后查阅了一些资料。了解到,这种观察者模式,一点是用接口类来实现。当然传统的继承也可以实现类是的方法。但观察者模式还有一个核心:去耦合

代码网上一找一大把,但我一直以为我写的是技术博客的宗旨,不贴点代码好像有点说不过去。但我看别人代码的是发现了另一个东西 SplObserver 

这个是PHP的迭代器,之前我也有提到过,这是PHP提供的抽象类,提供一些使用有高效的处理方法的东西,传送门

[php]
SplObserver {
abstract public void update ( SplSubject $subject ) //一个更新的抽象接口 ,作用只是用来更新被监听者列表
}
[/php]

 

总结:

观察者模式的好处在于耦合逻辑分类,一对多。开发人员并不需要关注后续操作太大,只需要把通知的方法加上。

然后能用PHP迭代器的情况,要尽量用PHP的迭代器来处理数据,因为C语言写的代码,肯定比你PHP处理的要高效

Centos环境下安装SVN服务器并且理解“高端的打分支”技术

发版策略:分支开发,主干发版


分支开发的意义:
场景一,有客户想对产品做定制,但是我们并不想修改原有的svn中trunk的代码。
场景二,我们正在开发产品下阶段的任务,但上阶段的工作发现问题
以场景二为例,项目某一阶段开发完成后,这个时候要做一个tag,tag_mfcai_V1.01.00,
然后基于这个tag发布一个新的版本,假设项目是web项目,那么基于这个tag发布一个web包。
然后trunk进入下阶段继续开发,但是很不幸发布的版本被检测出来了bug,有人会提议,把bug放到下阶段的任务中去。假设下阶段的任务才刚开始,用户可等不起.他们会认为一个小的bug解决要这么长时间,效率太低了.
那么就需要基于tag_mfcai_V1.01.00做一个branch,branch_bugfix_V1.01.00,基于这个branch进行bugfix,
等到bugfix结束,做一个tag,tag名称假设为:tag_mfcai_V1.01.01,基于这个tag再发布一个版本。
这样,又没有影响trunk(主分支)的开发。然后,根据需要决定branch_bugfix_V1.01.00是否并入trunk。
如何使用先进的分支技术

  • “小乌龟”操作(图文并茂)

 

再介绍点打tag的知识。确认项目组成员的代码都commit后。

1)右击要打tag的目录—>TortoiseSVN—>branch/tag

2)再弹出来的对话框中,要求输入分支或标记的目标路径

3)创建分支或标记的时候,你有三个选项版本库中的最新版本,版本库中的指定版本,工作副本。

开始打分支第一步

1:指分支将存在的目录

2:分支的注释(不能丢呀,等分支多了!就搞坨数不清楚的拉)

3:这里分别说明三个分别是说明啥意思

     1)Head revision in the repository  –直接从版本库中最新创建,由于不需要从你的工作拷贝中传输数据,创建过程会很快。

     2)  Specific revision in repository   ——同样是从版本库中创建,不同的是你可以指定一个版本号。如果你忘了版本号,可以通过显示版本记录来找到你想要的版本号(如下图)。这种方式同样不需要从你的工作拷贝中传输数据,创建过程也很快。

     3)  Woking copy ——这种方式会依据当前工作拷贝的版本状况(无论是你做了本地的修改,或是将其中的某些文件更新到了一个历史版本)来创建分支拷贝。这种创建方式会根据工作副本中每个文件的版本情况来决定是否要从工作拷贝向版本库中传输数据。

在这里我们必需先弄明白一个合并背后的关健概念

合并的过程中发生的所有事:首先两个版本库树的比较,然后将区别应用到本地拷贝.

这个命令是包括三个参数的:

  1. 初始的版本树 2.最终的版本树 3一个接收区别的工作拷贝。 

弄明白这些概念之后我们继续往下操作。

在弹出的窗口中,选择主线目录和其版本号(初始的版本树),再选择主线目录和最新的版本号(最终的版本树),这里也可以是某一个版本号但应该比初始的版本树的版本号要高,接收区默认为你右键所指的目录,这里是clientt。

在合并之前我们可以通过点击“Unified diff”,查看两版本树之间所有文件的内容的变化,“diff”显示出有发生变化的文件列表,“dry run”能显示真正合并时的状态信息,但并没有做任何的合并操作。

我们点击“Merge”。
这里选择的是合并两个不同的版本树
分支合并到主线跟从主线上合并内容到分支上类似 
不同的是
1、开始的版本库是分支创建的版本

2、结束的版本库是完成所以开发工作之后的版本

3、应用的目的是主线目录
SVN服务器代建小礼包
SVN 关闭服务器 killall svnserve
SVN 开启服务器 svnserve -d -r  /SVN目录
后面的代建的全过程
系统环境
RHEL5.4最小化安装(关iptables,关selinux) + ssh + yum
一,安装必须的软件包.
yum install subversion (SVN服务器)
mysql-server (用于codestriker)

二,基本的SVN服务器配置
1,新建一个目录用于存储SVN所有文件
# mkdir /home/svn
2,新建一个版本仓库
# svnadmin create /home/svn/project
3,初始化版本仓库中的目录
# mkdir project project/server project/client project/test (建立临时目录)
# svn import project/ file:///home/svn/project -m “初始化SVN目录”

SVN服务器代建之后一定要初始化,不然根本就用不了。
4,添加用户

要添加SVN用户非常简单,只需在/home/svn/project/conf/passwd文件添加一个形如“username=password”的条目就可以了.为了测试,我添加了如下内容:

[html]
[users]
# harry = harryssecret
# sally = sallyssecret
Admin=admin
[/html]

5,修改用户访问策略
/home/svn/project/conf/authz记录用户的访问策略,以下是参考:

[html]
[/]
Admin=rw
Admin 所有的目录都是读写的权限
[/html]

6,修改svnserve.conf文件,让用户和策略配置升效.
svnserve.conf内容如下:

[html]
[general]
anon-access = none
auth-access = write
password-db = /home/svn/project/conf/passwd
authz-db = /home/svn/project/conf/authz
[/html]

7,启动服务器

[html]
# svnserve -d -r /home/svn
[/html]

8,测试服务器

[html]
# svn co svn://192.168.60.10/project
Authentication realm: <svn://192.168.60.10:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Password for ‘root’:
Authentication realm: <svn://192.168.60.10:3690> 92731041-2dae-4c23-97fd-9e1ed7f0d18d
Username: Admin
Password for ‘admin’:
svn: Authorization failed ( server_group没用根目录的访问权 )
A    project/test
A    project/server
A    project/client
Checked out revision 1.  ( 测试提取成功 )
# cd project/server
# vim main.c
# svn add main.c
# svn commit main.c -m "测试一下我的C程序,看什么看,不行啊??"
Adding         main.c
Transmitting file data .
Committed revision 2.  ( 测试提交成功 )
[/html]

如果你代建的SVN服务器都OK,但是小乌龟无法访问:防火墙的问题。。。简单粗暴的方法: etc/ini.d/iptables stop
当然不是好太建议直接关闭防火墙:(SVN默认是3690端口)

[html]
RH-Firewall-1-INPUT -p tcp -m state –state NEW -m tcp –dport 3690 -j ACCEPT
[/html]

再送一个小礼包
[html][/html]
SVN Error: Unreadable path encountered; access denied;
[html][/html]
解决方法:
编辑[代码仓库目录下]/conf/svnserve.conf
将[anon-access]的值设置为[none]
记得重启SVN服务器

PHP定时更新程序设计

说道定时器,我以前一直进入一个死胡同,而且一直迷惑不解的是:“服务器怎么能直接去执行PHP代码?”

现在回想起来,我以前的想法是错误的,网页的执行流程

 打开WEB页面 —- 加载HTML代码 (包括CSS,javascript)— 执行PHP代码 — 完成 

粗约的就先理解成上面的这个样子。

我们都知道PHP做成服务器端的脚本,它是有超时设置的,可以通过 set_time_limit() 函数来处理。但这样处理PHP代码十分

消耗CPU资源。所以不建议通过循环处理PHP代码来实现。

一般的情况是用javascript来处理。

[javascript]
$(function(){
var tims = 1000*60*60*10; //设置延迟处理的时间,这里设置的是10个小时
 setInterval(function(){
//要执行的码
$.post("./data.php",{ postdata },function(datas){
if(id.data == 1)
{
  $("body").append(id.info+"<br/>");
}
});
},tims);
},json);
[/javascript]

上面是WEB前台要执行的javascript代码,通过延时执行ajax来达到自动处理的效果 继续阅读

一个价值900的ASP仿站

本来不打算做ASP网站的,但既然辅导员推荐那就做吧~

自从有了laoY这个“伟人”以后,一个ASP网站都是美工问题。所有“腾讯精神”就显得尤为重要了。

说实话,这个也没什么意思,除了忽悠自己以外和外行以外,真没什么。不建议大家学我,我是逼于无赖。

做了一个宅男,我还是要发扬“人人为我,我为人人”的P2P精神,给大家共享一个东西。

发现,laoY的文章管理系统2.5的数据库和3.0的数据是不一样的。有字段增加,不能直接移植。 继续阅读

PHP链表操作

在php中运行数据结构,基本都是用数组模拟的,只是用一直思想而已。

今天遇到的这个问题是,两个链表进行合并。

链表合并效果图

链表合并效果图

问题描述:A链表是模版链表,B链表的长度不确定,A,B二个链表结合后形成C链表。链表结构单位是

说一下编程思想:A链表是模版链表所以在运算完成了,长度了唯一不变的。而B链表的长度是不确定的。所以可以先对B链表进行判断,分了三步
  1. B链表是不是为空
  2. B链表是不是比A链表短或者相等
  3. B链表是不是比A链表长

编程就是要列出尽可能的可能性。抓住变量,由于题目要求,当A链表和B链表相等时,直接返回B链表,所以不用考虑这个问题。 继续阅读

报告近期状况

感觉有一段时间没更新博客了,干嘛去了?先是被学校抓取充人数,开发《湖南工业大学毕业设计管理系统》,后来有遇到了一个创业的网友,叫我去帮忙。

直到今天才有空更新一下博客,就是为了告诉大家我还活在,我没其他的意思。

秋天了,看来去年的努力没白费呀~

今天回来,总不能一直灌水吧~还是给大家带来了点东西。

网上支付系统的应用 — 腾付通(PS:跟TX没有半毛钱关系,他就爱取这个名字。)

其实网上支付平台的搭建很简单,比thinkphp应用容易多了。下面一张图就可以告诉你真相

网上支付业务流程图

网上支付业务流程图

看完流程图可以了解:

用户是通过商户交易平台链接到支付平台,再由支付平台跟银行进行数据交换。通过返回信息来确定是否支付成功 继续阅读

博客开启了统计功能 -自主开发很水的IP访客统计

以前一直用百度统计,发现不能很好的突出博客被访问的次数。(PS:不适合装13)

昨天本来打算下一个统计插件算了,省的麻烦,发现wordpress插件很多都是国外的,对于生活在大中华局域网里面的chinese来说。你们懂得。我就不说太细了。先说重点。突出主题嘛!

先说说统计目的

记录访客的IP,访客的游览器信息,访问时间和次数。

重点:

  1. 对新来的访客,进行数据插入数据。
  2. 对于以前留过脚印的访客,更新访客次数字段更新。

[php]

//数据入库

private function save()
{

if($this->pr())
{

$this->getData();

$sql = "select id from dwz_tong where ip='{$this->ip}’ and view='{$this->view}’";

$query = mysql_query($sql);

//获得数据可以数据的条数
$num = mysql_num_rows($query);

$time = time();

if($num == 0)
{

//新访客
$vie = "insert into dwz_tong(ip,view,count,time) values(‘{$this->ip}’,'{$this->view}’,1,’$time’)";
}

else
{
//老访客
$vie = "update dwz_tong set count=count+1,time='{$time}’ where ip='{$this->ip}’ and view='{$this->view}’";
}

$_SESSION["time"] = time();
mysql_query($vie);
}
}
//获取访问者数据
private function getData()
{

//获取用户IP
$this->ip = $this->getIp();
//获取用户游览器信息
$this->view = sha1($_SERVER[‘HTTP_USER_AGENT’]);
}
[/php]

继续阅读