acegi内置了对CAS的支持。这里的CAS是3.0。建立CAS server是一个比较简单的事情。CAS server就是一个标准的war文件,把它发布就可以运行。需要做的仅仅是调整登陆和其他一些页面。先了解一下CAS如何实现SSO。
例子:原有系统A和系统B,现在在它们之间做SSO。
很显然,系统A和B都是CAS client。首先是访问系统A,干掉A的登陆页面,在A的入口判断有没有Ticket(票据),如果没有则重定向到CAS server,在CAS server提供Credential(大多数情况就是用户名和密码)。CAS server的作用非常简单:就是来验证用户密码。正确,则发送Ticket。CAS有5种Ticket,分别是TGC(通过cookie发送的 ticket),ST(Service Ticket),PGT,PGTIOU,PT。其中PGT,PGTIOU,PT属于代理ticket,这里不作讨论。具体可以参考
http://www.blogjava.net/openssl/archive/2006/04/26/SSO_CASProxy.html
TGC和ST的关系可以打个比方:
我去中央电视塔去玩,结果发现地下还有个海底世界。SSO前我是这么玩的:先去电视塔买张门票,玩完了;再去海底世界买张门票,玩完了。发现真累,两个景点这么近还要买两次门票,就不能搞个通票吗?于是就SSO。于是这样:我先去电视塔,门卫告诉我你不能进去要买票,于是把我送到通票售票处(CAS server)买票(登录),买吧,于是给了我两张票,注意,是两张,一张发到我手里,上面写着仅限电视塔使用(ST);靠,不是通票吗,咋仅限电视塔使用?别急,还有一张票(TGC)通过cookie发送你看不见。人家说了保证没问题,我咋办,这是人家的规矩,那就先去玩吧。出了电视塔我直扑海底世界,
门卫说要海底世界票,不会吧,我买的通票啊,门卫说不着急,又把我送回通票售票处(CAS server),通票售票处(CAS server)一看,发现我有TGC,嘿嘿,这家伙买过票了不用再买(不用再登录),于是换我一张票(ST)上面写着仅限海底世界使用,于是我就拿着这张票又去海底世界了。于是我明白了啥是SSO了,不就是把买票改成换票了吗?
PHP 判断内网的函数
大家知道,为了内网使用,ip地址中分被从A类、B类、C类网划分出一些地址供内网使用,后来工作中有个需求,需要判断ip是否是预留的ip地址,我也很懒,知道很有规律,但是就是不想自己写,就想到网上找个,但是翻破了互联网都没找见,一气之下就直接写了一个,同时也为互联网的更加强大添砖加瓦,以下是本人写的,仅供参考,如有不足之处(我相信肯定有的),烦请留言指教!
<?php//判断内网的函数
//Author :lijunjie
//Mail :lijunjie1982@yahoo.com.cn
function is_internal_ip($ip) {
$ip = ip2long($ip);
$a = ip2long(‘10.0.0.0’); //A类网的预留ip
$b = ip2long(‘172.16.0.0’); //B类网的预留ip
$c = ip2long(‘192.168.0.0’); //C类网的预留ip
return ($ip & $a) === $a || ($ip & $b) === $b || ($ip & $c) === $c);
}
?>
上面写错了,应该利用掩码的概念来处理这个问题。
<?php
function is_internal_ip($ip) {
$ip = ip2long($ip);
$net_a = ip2long(‘10.255.255.255’) >> 24; //A类网预留ip的网络地址
$net_b = ip2long(‘172.31.255.255’) >> 20; //B类网预留ip的网络地址
$net_c = ip2long(‘192.168.255.255’) >> 16; //C类网预留ip的网络地址
return $ip >> 24 === $net_a || $ip >> 20 === $net_b || $ip >> 16 === $net_c;
}
?>
注:
ip地址中预留的内网ip地址如下:
A类: 10.0.0.0 ~ 10.255.255.255
B类: 172.16.0.0 ~ 172.31.255.255
C类: 192.168.0.0 ~ 192.168.255.255
二进制表示:
A类: 00001010 00000000 00000000 00000000 ~ 00001010 11111111 11111111 11111111
B类: 10101100 00010000 00000000 00000000 ~ 10101100 00011111 11111111 11111111
C类: 11000000 10101000 00000000 00000000 ~ 11000000 10101000 11111111 11111111
十进制的表示基本看不出规律,写成二进制就有规律了,注意红色的部分
下面看另外一个判断内网ip的写法:
<?php
function _isPrivate($ip) {
$i = explode(‘.’, $ip);
if ($i[0] == 10) return true;
if ($i[0] == 172 && $i[1] > 15 && $i[1] < 32) return true;
if ($i[0] == 192 && $i[1] == 168) return true;
return false;
}
?>
判断ip是否属于某个子网的函数:
<?php
/**
* isValidateIP
* 检查ip是否属于某个子网
* @param subnet:子网;如: 10.10.10/24 或 10.10.10.0/24 都是一样的
* @return true | false
*/
function isValidateIP($subnet,$ip)
{
$arr = explode(‘/’,trim($subnet));
if(count($arr) == 1) //支持单个ip的写法
{
return $ip == $arr[0];
}
$long_ip = ip2long(trim($ip));
$net = ip2long($arr[0]);
$hosts = pow(2,32–$arr[1]) – 1; //主机部分最大值
$host = $net ^ $long_ip; //客户端ip的主机部分
return $host >= 0 && $host <= $hosts;
}
?>
tcpdump 用法实例
1. 只捕获80端口的syn请求:
tcpdump -i eth0 -n ‘dst port 80 && tcp[13] | 2 == 2’
2. 按照物理地址过滤
tcpdump -i eth0 -n ‘ether 00:0E:35:D4:76:7E’
WEB版的聊天工具
简介: web版的聊天工具就是免除了安装客户端的麻烦,如果你有很多聊天工具的帐号,那么安装msn qq ami google talk 等一大堆的聊天客户端是不是很麻烦,这里介绍几个web聊天工具的地址:
1. msn ami google talk
https://www.meebo.com/index-zh-CN.html
2. qq 自己的webqq 好像曾经是 webqq.qq.com 但是现在访问不了了
3. msn自己也有web版的:http://webmessenger.msn.com/default.aspx?mkt=zh-cn ,但是他自己做自己的都不如meebo.com 做的web版的msn漂亮
常用下载工具 lftp wget
下载工具
Linux 下的下载工具很多,字符界面的有lftp, wget,prozilla 等,图形界面有gftp,kget,d4x等。大部分文件在浏览器中查看和下载是最直接的。但也有一些情况使用浏览器就并不是很方便或者根本就不能用浏览器完成任务。
Windows的用户可能都熟悉leapftp,在Linux中Gftp同leapftp的功能能差不多,它支持FTP,HTTP,SSH和本地文件系统协议。但在Linux中最优秀的下载软件是字符界面的。这里我们推荐lftp和wget.用它们两个可以完成非常复杂的下载任务。
lftp
lftp 是一个功能强大的下载工具,它支持访问文件的协议: ftp, ftps, http, https, hftp, fish.(其中ftps和https需要在编译的时候包含openssl库)。llftp的界面非常想一个shell: 有命令补全,历史记录,允许多个后台任务执行等功能,使用起来非常方便。它还有书签、排队、镜像、断点续传、多进程下载等功能。
命令行语法
要看lftp的命令行语法,只要在shell中输入lftp --help
1 |
lftp [OPTS] <site>`lftp' 是在 rc 文件执行后 lftp 执行的第一个命令 -f <file> 执行文件中的命令后退出 -c <cmd> 执行命令后退出 --help 显示帮助信息后退出 --version 显示 lftp 版本后退出 其他的选项同 `open' 命令 -e <cmd> 在选择后执行命令 -u <user>[,<pass>] 使用指定的用户名/口令进行验证 -p <port> 连接指定的端口 <site> 主机名, URL 或书签的名字 |
如果在命令行中输入的站点名称,lftp将直接登录站点,比如
1 |
[yhj@ccse-yhj yhj]$ lftp ftp://dsec.pku.edu.cn:27/incoming/ ... ... (此处略去站点登录信息)cd 成功,当前目录=/incominglftp dsec.pku.edu.cn:/incoming> |
如果在命令行不输入站点名称,则必须在进入到lftp界面后用open命令打开
1 |
[yhj@ccse-yhj yhj]$ lftp lftp :~> open ftp://dsec.pku.edu.cn:27/incoming/cd 成功,当前目录=/incominglftp dsec.pku.edu.cn:/incoming> |
常用命令
- 下载单个文件和一组文件,断点续传用-c参数
1lftp dsec.pku.edu.cn:/> get -c ls-lR.txtlftp dsec.pku.edu.cn:/> mget *.txt
- 镜像(反镜像即上传)一个目录,可以用多个线程并行镜像一个目录(–parallel=N)
1lftp dsec.pku.edu.cn:/> mirror incoming local_namelftp dsec.pku.edu.cn:/> mirror -R local_namelftp dsec.pku.edu.cn:/> mirror --parallel=3 incoming local_name
- 多线程下载,类似网络蚂蚁的功能;缺省是5个线程
1lftp dsec.pku.edu.cn:/> pget -n 4 ls-lR.txt
- 后台任务管理
缺省情况下,按 Ctrl+z,正在执行的任务将转为后台执行,也可以 在命令行末尾加&符号使任务在后台执行。用jobs命令可以查看所 有的后台进程。用queue命令可以排队新的任务。如果退出lftp是
还有任务在后台执行,lftp将转为后台执行。
- 其它用法
lftp支持类似bash的管道操作,例如用下面的命令可以将ftp服务 器上的特定目录下(也可以是整个站点)所有文件的大小存到本地的
文件ls.txt中
1 |
lftp dsec.pku.edu.cn:/> du incoming > ls.txt |
相关文件
- /etc/lftp.conf
- 全局配置文件,实际位置依赖系统配置文件目录,可能在/etc,也可能在/usr/local/etc
- ~/.lftp/rc, ~/.lftprc
- 用户配置文件,将在/etc/lftp.conf之后执行,所以这里面的设置会覆盖/etc/lftp.conf中的设置。
lftp 缺省不会显示 ftp 服务器的欢迎信息和错误信息,这在很多时候不方便,因为你有可能想知道这个服务器到底是因为没开机连不上,还是连接数已满。如果是这样,你可以在 ~/.lftprc 里写入一行1debug 3
更多的配置选项请查man手册或在lftp界面内用命令set -a
获得。 - ~/.lftp/log
- 当lftp转为后台非挂起模式执行时,输出将重定向到这里
- ~/.lftp/bookmarks
- 这是lftp存储书签的地方,可以lftp查看bookmark命令
- ~/.lftp/cwd_history
- 这个文件用来存储访问过的站点的工作目录
wget
wget是一个从网络上自动下载文件的自由工具。它支持HTTP,HTTPS 和FTP协议,可以使用HTTP代理.
所谓的自动下载是指,wget可以在用户退出系统的之后在后台执行。这意味这你可以登录系统,启动一个wget下载任务,然后退出系统, wget将在后台执行直到任务完成,相对于其它大部分浏览器在下载大量数据时需要用户一直的参与,这省去了极大的麻烦。
wget可以跟踪HTML页面上的链接依次下载来创建远程服务器的本地版本,完全重建原始站点的目录结构。这又常被称作"递归下载"。在递归下载的时候,wget遵循Robot Exclusion标准(/robots.txt). wget 可以在下载的同时,将链接转换成指向本地文件,以方便离线浏览。
wget非常稳定,它在带宽很窄的情况下和不稳定网络中有很强的适应性.如果是由于网络的原因下载失败,wget会不断的尝试,直到整个文件下载完毕。如果是服务器打断下载过程,它会再次联到服务器上从停止的地方继续下载。这对从那些限定了链接时间的服务器上下载大文件非常有用。
wget的常见用法
wget的使用格式
1 |
Usage: <font style="BACKGROUND-COLOR: #ffff00">wget</font> [OPTION]... [URL]... |
- 用wget做站点镜像:
1 |
<font style="BACKGROUND-COLOR: #ffff00">wget</font> -r -p -np -k http://dsec.pku.edu.cn/~usr_name/# 或者<font style="BACKGROUND-COLOR: #ffff00">wget</font> -m http://dsec.pku.edu.cn/~usr_name/ |
- 在不稳定的网络上下载一个部分下载的文件,以及在空闲时段下载
1 |
<font style="BACKGROUND-COLOR: #ffff00">wget</font> -t 0 -w 31 -c http://dsec.pku.edu.cn/BBC.avi -o down.log &# 或者从filelist读入要下载的文件列表<font style="BACKGROUND-COLOR: #ffff00">wget</font> -t 0 -w 31 -c -B ftp://dsec.pku.edu.cn/linuxsoft -i filelist.txt -o down.log & |
上面的代码还可以用来在网络比较空闲的时段进行下载。我的用法是:在mozilla中将不方便当时下载的URL链接拷贝到内存中然后粘贴到文件filelist.txt中,在晚上要出去系统前执行上面代码的第二条。
- 使用代理下载
1 |
<font style="BACKGROUND-COLOR: #ffff00">wget</font> -Y on -p -k https://sourceforge.net/projects/wvware/ |
代理可以在环境变量或wgetrc文件中设定
1 |
# 在环境变量中设定代理export PROXY=http://211.90.168.94:8080/# 在~/.<font style="BACKGROUND-COLOR: #ffff00">wget</font>rc中设定代理http_proxy = http://proxy.yoyodyne.com:18023/ftp_proxy = http://proxy.yoyodyne.com:18023/ |
wget各种选项分类列表
- 启动
1 |
-V, --version 显示<font style="BACKGROUND-COLOR: #ffff00">wget</font>的版本后退出 <br /> -h, --help 打印语法帮助 <br /> -b, --background 启动后转入后台执行 <br /> -e, --execute=COMMAND 执行`.<font style="BACKGROUND-COLOR: #ffff00">wget</font>rc'格式的命令,<font style="BACKGROUND-COLOR: #ffff00">wget</font>rc格式参见/etc/<font style="BACKGROUND-COLOR: #ffff00">wget</font>rc或~/.<font style="BACKGROUND-COLOR: #ffff00">wget</font>rc |
- 记录和输入文件
1 |
-o, --output-file=FILE 把记录写到FILE文件中 <br /> -a, --append-output=FILE 把记录追加到FILE文件中 <br /> -d, --debug 打印调试输出 <br /> -q, --quiet 安静模式(没有输出) <br /> -v, --verbose 冗长模式(这是缺省设置) <br /> -nv, --non-verbose 关掉冗长模式,但不是安静模式 <br /> -i, --input-file=FILE 下载在FILE文件中出现的URLs <br /> -F, --force-html 把输入文件当作HTML格式文件对待 <br /> -B, --base=URL 将URL作为在-F -i参数指定的文件中出现的相对链接的前缀 <br /> --sslcertfile=FILE 可选客户端证书 <br /> --sslcertkey=KEYFILE 可选客户端证书的KEYFILE <br /> --egd-file=FILE 指定EGD socket的文件名 |
- 下载
1 |
--bind-address=ADDRESS 指定本地使用地址(主机名或IP,当本地有多个IP或名字时使用) -t, --tries=NUMBER 设定最大尝试链接次数(0 表示无限制). -O --output-document=FILE 把文档写到FILE文件中 -nc, --no-clobber 不要覆盖存在的文件或使用.#前缀 -c, --continue 接着下载没下载完的文件 --progress=TYPE 设定进程条标记 -N, --timestamping 不要重新下载文件除非比本地文件新 -S, --server-response 打印服务器的回应 --spider 不下载任何东西 -T, --timeout=SECONDS 设定响应超时的秒数 -w, --wait=SECONDS 两次尝试之间间隔SECONDS秒 --waitretry=SECONDS 在重新链接之间等待1...SECONDS秒 --random-wait 在下载之间等待0...2*WAIT秒 -Y, --proxy=on/off 打开或关闭代理 -Q, --quota=NUMBER 设置下载的容量限制 --limit-rate=RATE 限定下载输率 |
- 目录
1 |
-nd --no-directories 不创建目录 <br /> -x, --force-directories 强制创建目录 <br /> -nH, --no-host-directories 不创建主机目录 <br /> -P, --directory-prefix=PREFIX 将文件保存到目录 PREFIX/... <br /> --cut-dirs=NUMBER 忽略 NUMBER层远程目录 |
- HTTP 选项
1 |
--http-user=USER 设定HTTP用户名为 USER. <br /> --http-passwd=PASS 设定http密码为 PASS. <br /> -C, --cache=on/off 允许/不允许服务器端的数据缓存 (一般情况下允许). <br /> -E, --html-extension 将所有text/html文档以.html扩展名保存 <br /> --ignore-length 忽略 `Content-Length'头域 <br /> --header=STRING 在headers中插入字符串 STRING <br /> --proxy-user=USER 设定代理的用户名为 USER --proxy-passwd=PASS 设定代理的密码为 PASS <br /> --referer=URL 在HTTP请求中包含 `Referer: URL'头 <br /> -s, --save-headers 保存HTTP头到文件 <br /> -U, --user-agent=AGENT 设定代理的名称为 AGENT而不是 <font style="BACKGROUND-COLOR: #ffff00">Wget</font>/VERSION. <br /> --no-http-keep-alive 关闭 HTTP活动链接 (永远链接). <br /> --cookies=off 不使用 cookies. <br /> --load-cookies=FILE 在开始会话前从文件 FILE中加载cookie <br /> --save-cookies=FILE 在会话结束后将 cookies保存到 FILE文件中 |
- FTP 选项
1 |
-nr, --dont-remove-listing 不移走 `.listing'文件 -g, --glob=on/off 打开或关闭文件名的 globbing机制 --passive-ftp 使用被动传输模式 (缺省值). --active-ftp 使用主动传输模式 --retr-symlinks 在递归的时候,将链接指向文件(而不是目录) |
- 递归下载
1 |
-r, --recursive 递归下载--慎用! -l, --level=NUMBER 最大递归深度 (inf 或 0 代表无穷). --delete-after 在现在完毕后局部删除文件 -k, --convert-links 转换非相对链接为相对链接 -K, --backup-converted 在转换文件X之前,将之备份为 X.orig -m, --mirror 等价于 -r -N -l inf -nr. -p, --page-requisites 下载显示HTML文件的所有图片 |
- 递归下载中的包含和不包含(accept/reject)
1 |
-A, --accept=LIST 分号分隔的被接受扩展名的列表 -R, --reject=LIST 分号分隔的不被接受的扩展名的列表 -D, --domains=LIST 分号分隔的被接受域的列表 --exclude-domains=LIST 分号分隔的不被接受的域的列表 --follow-ftp 跟踪HTML文档中的FTP链接 --follow-tags=LIST 分号分隔的被跟踪的HTML标签的列表 -G, --ignore-tags=LIST 分号分隔的被忽略的HTML标签的列表 -H, --span-hosts 当递归时转到外部主机 -L, --relative 仅仅跟踪相对链接 -I, --include-directories=LIST 允许目录的列表 -X, --exclude-directories=LIST 不被包含目录的列表 -np, --no-parent 不要追溯到父目录 |
原文地址:http://dsec.pku.edu.cn/~yuhj/wiki/LftpWget.html
PHP 框架
php:web编程界的巨无霸 目标直指java.net等大腕
草根出身的PHP语言挑战的对象是Java、.Net这样的大腕。
Zeev这位30岁的以色列小伙子看起来一点也不像有权势的人物,可是他共同创始的PHP语言,却成为网络时代异军突起的一个传奇。最新的消息是,Sun公司已决定把免费公开Java源代码提上日程,而微软的脚本语言ASP.net也只得一直实行免费赠送。这个小个子PHP及其同伙Linux、Apache、MySQL掀起的开放源代码浪潮影响了整个Web世界,给程序编写及发布方式带来了革命性的变化。重要的是,PHP两不耽误,一边保持着开源的真谛,另一边则取得了商业上的成功。
就在最近,PHP商业化公司Zend又 获得了2000万美元的投资,投资人包括Intel Capital和SAP Ventures。IBM也将与Zend合作,把PHP引入到IBM的中级服务器平台,以支持访问DB2数据库,这笔交易价值数百万美元。而Zend的下 一步很有可能是进行首次公开募股(IPO)。
在今天,全球已有2000万个网站使用PHP,包括最流行的雅虎、Google、百度、YouTube、Digg,也包括像汉莎航空电子订票系 统、德意志银行的网上银行、华尔街在线的金融信息发布系统,甚至军队系统这类五花八门和苛刻的环境。PHP究竟是怎样炼成的?
源于草根
作为目前全球最流行的网站应用软件编 程语言,PHP的成长历程和Linux有异曲同工之妙。1994年,它由Rasmus Lerdorf最早创建,Lerdorf只是想记录自己的在线简历,后来许多人都向他要程序的拷贝。1995年6月,Lerdorf在加入了一些介绍文档 之后,在Usenet新闻组发布出去,这就成了最早的PHP 1.0。
这期间,两位大学生Zeev Suraski和Andi Gutmans需要能做一个基于Web的软件项目,需要能很好地支持Linux,但当时的ASP并不完善,JSP又比较复杂,所以就选择了PHP。其后他们在工作中发现PHP还有些不足,便自愿加入PHP语言开发工作组,并重新编写了底层的解析引擎。1998年6月,有着历史意义的PHP 3.0发布,用户数开始飞涨。1999年,他们两人又创建了Zend公司,开发了Zend Engine,大大提高了PHP的性能。
雅虎是PHP语言最早的使用者之一,随着雅虎的兴起,大量的站点开始学习雅虎背后的语言—PHP。此时,软件开始从传统模式向基于Web模式转变,几大势力一一长成:Linux操作系统、Apache网络服务器、MySQL服务器,以及以PHP语言为代表的“P”族语言(PHP、Perl、Python),一本德国计算机杂志把它们共同称为LAMP(明 灯),也由此与J2EE架构(以Java为编程语言,Sun公司主导)、.Net架构(微软公司主导)形成了三足鼎立之势。在Evans Data公司的一份统计资料中,PHP使用者比Java及.Net的使用者稍有差距,但预计2007年的增长率将达37%,超过Java的16%和. Net的27%,这场草原上燃烧的星火正越来越旺。
从革命者到务实者
PHP成功的两大秘诀,第一条就是简单。PHP简单到让喜欢卖弄技巧的程序员感到羞愧,但让那些渴望进入Web开发领域的初学者欣喜若狂。PHP像是一条鲶鱼,与XML、Web Services融合无间。即使历次的版本升级,也无需担心PHP会丧失这种简单的特性。无疑,这个特点给需要快速开发、交互应用的Web2.0潮流极大的带来了方便,有超过半数的Ajax-enabled和Web2.0站点都选择了PHP。
PHP的第二个秘诀,就是“Community(强大的社区)”。Discuz!软件的开发者,25岁的康盛创想公司CEO戴志康就是这个特性 的受益者。他说,不像其他的开发者需要从零开始,大量的PHP程序都有开放源代码可供学习,后人站在前人的肩膀上加以改进,又将这种知识积累的结果回馈给 社区。这曾被比喻为“大教堂和集市”,在集市中,知识得到了最大化的利用,效率提高、错误减少、成本降低。而大教堂只能越垒越高,不断延迟发布时间。
现在,全球已有450万名PHP开发工程师,被称为“PHPer”,他们成为了软件世界中最有影响力的社区之一。有趣的是,开源的浪潮经过数年的发展,早已经走向庙堂,无论是Intel、IBM、Oracle,甚至是微软,都成为鼓吹甚至主导开源的力量。11月初,微软与Zend公司达成了一项长期合作的伙伴关系,共同推动PHP语言的发展。
与其说开源运动是个颠覆者,不如说更像是粘合剂。中国开源软件推进联盟主席陆首群说,LAMP也可以派生出WAMP(W代表Windows)。 事实上,PHP与.Net是并存的,PHP也可以和Windows捆绑在一起,两者并没有冲突,可以因地致宜地使用开源与闭源混合架构(Mix)。
目前PHP社群和Zend公司的目标,是将PHP推广到企业级应用。在这一点上,欧洲和北美远远领先于中国。Zend(中国)技术支持中心总监耿志军说,PHP已经在金融、政府、交通、电信、媒介、娱乐等各大行业被广泛使用,完全脱离了一个简单网络语言开发工具的境界。而在中国, PHP只应用于门户网站和部分的专业网站,严谨的政府和金融网站难以看到它的身影。
即便如此,PHP正在崛起,这一点毫无疑问。正如Red Hat推动了Linux的发展,Zend也正努力将PHP带入黄金时代。Zend于2005年在慕尼黑新开设了一家子公司;今年在法国也将设立一个子公 司;在中国,Zend公司与康盛创想公司建立了合作关系,并成立了Zend(中国)技术支持中心。有很多像耿志军这样的年轻人正加入到这个队伍中,这些围 绕着PHP的力量和这个语言本身一样充满了朝气。
PHP是一个简单而有生命力的语言
—专访PHP语言创始人之一Zeev Suraski
2006年10月23日,作为PHP语言核心缔造者之一的Zeev首次来到中国,本刊记者对他进行了独家专访。
《互联网周刊》:随着PHP版本的升级,软件包会不会越来越复杂,以致偏离它的原始设计目标?
Zeev(Zend公司创始人、CTO、PHP的创始人之一):这个问题确实有可能存在,但我们一直在尽量避免。十年前,当我和Andi Gutmans进行PHP开发时,就已经非常注意保持简洁这个核心要素。比如说,PHP 5就比PHP 4更为简化。当然我们会支持一些新的技术,但简单是我们最根本的一个特点。
《互联网周刊》:我们知道商业公司的决策人会是董事会或CEO,但在像PHP这样的开源社区里,重大决策是如何形成的?
Zeev:做决策时我们有一个社区的基础,并不是由1个人拍板就能决定的。有一个大概20人的团队,都可以对决策过程施加影响,包括我,包括 Andi Gutmans,还有一些研发人员。通常我们会对讨论的问题有一个共识,在此基础上再进行决策。但如果没有共识,就会有一些麻烦了,讨论的时间也会比较 长。经过10年的发展,我们基本形成了一套机制。不过在决策方面,我们的确会比一般的商业公司占用的时间要长一些。
《互联网周刊》:这样会不会出现一个问题,PHP会不停的有补丁释出,导致软件的发布时间被拖长,比如从PHP 5到PHP 6。
Zeev:你说的这种情况有时的确会发生。但是我们有一个底线,就是尽早确定一些最主要的特征。比如PHP 6中的Unicode特性。我们会定义一个目标,就是这个产品本身必须是高质量的,即使发布拖的时间比较长,但总体能保证它是一个好产品。
《互联网周刊》:许多公司因为PHP的使用而受益并且发了大财,但语言和体系的创始人却往往不是最富有的,比如Java的创始人、Linux的创始人。你对金钱怎么看待?
Zeev:未来总是不可预测的。目前虽然我不是百万富翁或亿万富翁,但是我对生活非常满意,而且非常喜欢。
我首先是为Zend公司工作。Zend已经价值数亿美元,但我们的主要目标还是推进PHP语言的发展。当然我们仍是一个公司,而不是一个非盈利 性的组织,但我们的关注点并不只是赚钱。如果有一个公司对我们说,我们想收购你或想和你合作,我们不会立刻就说同意。因为我们看重的不光是钱,关键是要看 我们是不是有共同的目标,能够推进PHP语言的发展。
关于开源
LUPA 是开源高校推进联盟( Leadership Of Open Source University Promotion Alliance )的 英文缩写,于 2005 年 6 月 12 日 在杭州成立。
什么是云计算
最近,大公司如MS、Google、IBM等都在炒作一个概念就是云计算,如IBM跟欧盟 合作开展云计算,欧盟拨款1.7亿万欧元;Google与IBM 联合力推云计算模式;Yahoo! 也把宝押在了云计算上;我国也在无锡 跟IBM公司联合建立了一个云计算中心;有人说微软收购Yahoo!一个重要的考虑就是在Yahoo在云计算方面的领先地位,多少有点儿道理。那么,什么是云计算哪?我看到有一位推广自由开源的老先生把云计算(Cloud Computing)翻译成“云雾计算”着实是可笑,好多网友也在问什么是云计算,什么是雾计算,说明好多人对于云计算是一头雾水。云计算可不是“云雨”,可不是云山雾罩。
“云计算”(Cloud Computing)是分布式处理(Distributed Computing)、并行处理(Parallel Computing)和网格计算(Grid Computing)的发展,或者说是这些计算机科学概念的商业实现。许多跨国信息技术行业的公司如IBM、Yahoo和Google等正在使用云计算的概念兜售自己的产品和服务。云计算这个名词可能是借用了量子物理中的“电子云”(Electron Cloud),强调说明计算的弥漫性、无所不在的分布性和社会性特征。量子物理上有“电子云(electron cloud)”,在原子核周围运动的电子不是一个经验世界的轨道例如像天体一样的运行轨道,而是弥漫空间的、云状的存在,描述电子的运动不是牛顿经典力学而是一个概率分布的密度函数,用薛定谔波动方程来描述,特定的时间内粒子位于某个位置的概率有多大,这跟经典力学的提法完全不同。电子云有以下特性,概然性、弥漫性、同时性等等,云计算可能的确是来自电子云的概念,前今年就有所谓“无所不在的计算”,IBM有一个无所不在的计算叫“Ubiquitous “,MS(Bill)不久也跟着提出一个无所不在的计算“Pervade“,现在人们对无所不在的计算又有了新的认识,现在说是”Omnipresent “。但是,云计算的确不是纯粹的商业炒作,的确会改变信息产业的格局,现在许多人已经用上了Google Doc和Google Apps,用上了许多远程软件应用如Office字处理而不是用自己本地机器上安装这些应用软件,以后谁还会花钱买Office软件哪?还有许多企业应用如电子商务应用,例如要写一个交易程序,Google的企业方案就包含了现成的模板,一个销售人员根本没学习过Netbeanr也能做出来。这种计算和产业动向是符合开源精神的,符合SaaS(Software as a Service)趋势。现在有这样的说法,当今世界只有五台计算机,一台是Google的,一台是IBM的,一台是Yahoo的,一台是Amazon的,一台是微软的,因为这五个公司率先在分布式处理的商业应用上捷足先登引领潮流。Sun公司很早就提出说“网络就是计算机”是有先见之明的。
有以下五个主要原因使得分布式计算必然会越来越普遍,逐渐发展成主流的计算模式而取代集中式的大型计算机:
- 现在分布式系统的第一个原因就是因为他具有比集中式系统更好的性能价格比。你不要花几十万美元就能获得高效能计算。
- 多数应用本身就是分布式的。如工业企业应用,管理部门和现场不在同一个地方。
- 高可靠性。冗余不仅是生物进化的必要条件,而且也是信息技术。现代分布式系统具有高度容错机制,控制核反应堆主要采用分布式来实现高可靠性。
- 可扩展性。买一台性能更高的大型机,或者再买一台性能相同的大型机的费用都比添加几台PC的费用高得多。
- 高度灵活性。能够兼容不同硬件厂商的产品,兼容低配置机器和外设而获得高性能计算。
粗略地计算,目前的个人计算机每个CPU芯片的处理能力是200MIPS,就是每秒种执行
按照计算机操作系统的宗师Andrew S. Tanenbaum(AST)给分布式系统的的定义:“分布式系统是这样的系统,它运行在不具有共享内存的多台机器上,但在用户的眼里却像是一台计算机”。(引自《现代操作系统》,机械工业出版社,1999年中文版)。它的目标是让每个用户感觉联网的计算机是一个分时系统——就像使用个人计算机一样 ——而不是一个由许多计算机联合起来的集体,即使由五个节点组成的分布式系统也应该让用户感觉自己是在使用一台价值20万美元的大型计算机,唯一不寻常的感觉是处理速度提高了许多,别的没有什么不同。例如,这里有一个简单的例子,在机器A的用户要使用安装在机器B上用户的目录里的文件,A用户要使用远程登录命令rlogin B登录到机器B的目录上,那么这就不是一个真正的分布式系统,因为用户A意识到了另外一台机器的存在,分布式系统必须要做到,用户A登录到一个目录上的时候不知道自己是在本地机器上还是在远程机器上的目录上,对于用户A来说机器B是透明的,这就是分布式系统设计时考虑的“透明性”要求。其他有关的问题包括:分布式文件系统的问题,目录和文件访问机制以及一致性问题,分布式系统进程的通信问题等等。目前的云计算严格说还没有到达真正的分布式计算的语义学水平。