| Profile老王的网络日志BlogLists | Help |
|
|
7/17/2006 phpe的t恤邮寄到了。本来说好上周末去北四环取的,可惜临时有事情没去成,发短信问能不能同城快递,结果今天就给送过来了,我还以为是收件人付款来着,结果原来phpe的人已经给付款了,够仗义,赶紧发短信看能不能网上支付,可惜不能了,只好周末再说了,看到邮件上面的地址写的是新浪,估计是easychen了,虽然没见过,不过感觉是个不错的家伙。。。 7/13/2006 想搬家了正在考虑把blog放到http://hi.baidu.com/thinkinginlamp/上,因为长久以来,我都把msn的空间当成记事本,没有认真地写过东西,以后想在baidu空间里好好写点东西。
------------------------------------------------------------------
随便唠叨一下,下午重新编译了一下mysql,很多人都说--with-extra-charsets=complex就可以加入多字节字符的支持,我这样做却找不到gbk编码,最后我都给编辑了--with-extra-charsets=all
------------------------------------------------------------------
使用rsync备份的时候,rsync -vzrtopg --progress --password-file=/etc/rsyncd.secrets 用户名@yourip::模块名 /data/dir.bak/ 出现了错误信息,rsync error: some files could not be transferred (code 23) at main.c(1298) [generator=2.6.8],估计了一下,可能是rsync服务端的某些文件没有read权限造成的,于是在服务端执行:chmod -R a+r ./htdocs/,然后再重复rsync备份,正常!
------------------------------------------------------------------
------------------------------------------------------------------ 7/12/2006 浮点数精度问题<?php
$a = 64; $b = 64.1; echo $b - $a; ?> Windows XP SP2结果输出:0.099999999999994
RedHat AS 4结果输出:0.1
别的网友的测试结果有的和我一样,有的和我不一样。
类似的还有:
<?echo floor((0.1+0.7)*10);?>
<?echo ceil((0.1+0.7)*10);?>
linux下利用wget和cron来定时运行看了neo的文章,转过来。
*/5 * * * * wget -qO - http://{SERVER NAME}/refresh.php
cron没啥说的,说说wget的这几个参数,man了一下,如下:
-q
--quiet Turn off Wget's output. -O file
--output-document=file The documents will not be written to the appropriate files, but all will be concatenated together and written to file. If - is used as file, documents will be printed to standard output, dis- abling link conversion. (Use ./- to print to a file literally named -.) Note that a combination with -k is only well-defined for download-
ing a single document. 7/11/2006 ORM和ROM的胡思乱想RoR的风行带动了很多PHP同行开始研究数据持久化,自然而然的出现了一批ORM的php实现。
先看看什么叫orm,在我的理解看来,orm是为了缓解面向对象和关系数据库的不一致性而建立的,从方向性上看是o -> r才对,但是从目前的一些php的orm来看,方向似乎变成了r -> o,如常见的phpdoctrine, cake等等都是这样。
<?php
class User extends Doctrine_Record { public function setTableDefinition() { // set 'user' table columns, note that // id column is always auto-created $this->hasColumn("name","string",30); $this->hasColumn("username","string",20); $this->hasColumn("password","string",16); $this->hasColumn("created","integer",11); } } ?> 上面的代码是phpdoctrine的代码,从代码里可以看到,没有描述对象如何如何,都是有哪些列,啥类型,多长之类的数据信息。
这样来说,称他们为ROM或许更贴切些,他们这些实现是不是有些本末倒置呢,我自己头脑也很混乱,想想再下结论。
To Be or Not to Be, That Is The Question.
ORM or ROM,同样也是一个问题。 NuSOAP乱码问题的解决正常调用Web Service,结果发现返回数据(UTF-8编码)有乱码,调试发现echo '<h2>Response</h2><pre>' . htmlspecialchars($client->response, ENT_QUOTES) . '</pre>';为正常,没有乱码,但是$result = $client->call($action, array('parameters' => $param));后$result就是乱码,解决方式如下:
$client->soap_defencoding = 'UTF-8'; $client->decode_utf8 = false; 7/9/2006 RoR风潮的背后RoR的流行速度确实很有点出人意料,老实说,RoR在技术上没有大的创新,而且在php里早就有类似的尝试,别的不说,RoR作者在写RoR之前,就是一个php程序员,也有一个php版本的RoR,不过同样的东西在php阵营里却没有产生任何反响,反倒是Ruby阵营里红透半边天。为什么会有这样的情况出现,是一个值得思考的事情,一方面,php阵营内framework数量众多,用户有很多选择,这点和java类似,任何一个framework都很难达到RoR在Ruby阵营里那种一呼百应的效果,因为对于Rubyer来说,他们没有别的选择,RoR是唯一的framework,这样的垄断地位,某种程度上加速了RoR的火爆。另一方面,Ruby本身也确实存在一些php不及的优点,如完整的动态语言的特性。但在我看来,从一个长远的角度来看,php的表现仍然会优于ruby,原因如下:php有更好的用户群,10多年的积累不是初出茅庐的ruby能在短时间内超越的,而且,ibm, oracle都开始对php提供了企业级的支持,再者,php的社区是活跃的,语言级别上的一些不足之处会在未来的适当时候得到袮补。
btw:在说说ror本身,很多人认为它是web开发的终极杀手,我一直有点怀疑,它只不过是一个Active Record的应用而已,本质上讲,RoR是以数据库为中心而设计的,只适用于那些业务逻辑和数据结构十分相似的项目,可能是受了这几天看《领域驱动设计》这本书的影响,我一直认为这样的设计在一定的前提下是可以的,但不能体现OOP的真谛,从某种程度上来说,它掩盖了问题的实质:领域对象的价值!唉,全世界的程序员辛辛苦苦的研究了面向对象几十年,一觉醒来,被RoR打回解放前。 7/8/2006 一个小题刚才在QQ群里,神仙出了一道小题:不用中间变量,不用内置函数,交换$a, $b两个整数变量的值。
偶想了一会,给出下列答案:
<?php
$a = 1234; $b = 5678;
$a = $b + $a - ($b = $a);
echo $a, ', ', $b;
?> 就是利用赋值表达式的返回值这么一个小技巧而已,很容易想到。
神仙给了一个参考答案:
<?php
$a=1234; $b=5678; $a^=$b; $b^=$a; $a^=$b; printf("%d, %d\n", $a, $b); ?> 开始我没太明白,神仙给了我一个简单的解释:
$a = $a ^ $b ^ $b;
$b = $b ^ $a ^ $a;
QQ群里的老白不知道啥原因,程序调试不过去,正发愁呢,呵呵。
------------------------------------------------------------------------------------
附录:
------------------------------------------------------------------------------------
按位异或运算符(^)
按位异或运算将两个运算分量的对应位按位遵照以下规则进行计算: 0 ^ 0 = 0, 0 ^ 1 = 1, 1 ^ 0 = 1, 1 ^ 1 = 0 即相应位的值相同的,结果为 0,不相同的结果为 1。 例如,013^035结果为026。 异或运算的意思是求两个运算分量相应位值是否相异,相异的为1,相同的为0。按位异或运算的典型用法是求一个位串信息的某几位信息的反。如欲求整型变量j的最右4位信息的反,用逻辑异或运算017^j,就能求得j最右4位的信息的反,即原来为1的位,结果是0,原来为0的位,结果是1。 ------------------------------------------------------------------------------------ 7/5/2006 AOP在PHP中的实现方式题记:此文是老王在公司利用中午吃饭时间所写,今天带了饭,老婆给做的猪肉炒圆白菜,所以此文版权归老王及老王的老婆所有。
目前的PHP还不能说是一种和RUBY,PYTHON类似的纯粹的脚本语言,所以在实现类似AOP技术的时候,多少还是有点困难。
最理想的解决方式当然是PHP本身能提供内置的支持,PHP也确实有这样的PECL扩展,如以前的ClassKit,现在的RunKit,但是这些扩展还都是beta状态,而且他们要成为php的默认模块的话,恐怕得等到PHP8出来的时候
那么我们能不能用纯粹的php脚本来实现aop技术呢?我google了一些资料,大体给出以下方案,并作一个简单的比较。
此文作者把需要AOP功能的对象作为一个子类,继承了他实现的AspectProxy类,利用AspectProxy中的__call魔术方法完成AOP功能的实现。
下面说说我的感觉,我觉得这样的实现应该说是不理想的,因为aop的实现,一个很重要的前提就是不能对源代码有很明显的侵入,而这里强制对象要继承AspectProxy类,无疑侵入了对象,设想如果我们的对象已经继承了一个父类,那我们怎么利用AspectProxy来实现AOP呢?另外,这个解决方法对类的方法名称也有限制,在它的示例中,所有的类名,方法名都要有同样的前缀,所以总体来说,限制很多。
再来看看另一种方式:
这个实现方式其实和上一个很类似,同样是利用__call等魔术方法,但是一个重要的不同是这里没有使用继承关系,而是委托关系。返回的不是我们要的对象,而是BunnyAspect对象,它本身对我们要的对象进行了一个delegate的委托包装。
相应的演示代码如下:
include('warren/lang/BunnyAspect.php'); //tihs might change depending on where you have it
class MyFoo
{ function Bar($a) { return $a * $a; } } function double($method, $retval)
{ return $retval * 2; } $foo = new MyFoo();
// Prep the foo object to be wowen
$fooAspected = BunnyAspect($foo); // $foo = new BunnyAspect($foo); works just as well here // Weave the function "double" after the Bar method of the foo object
$fooAspected->weave(array('after','Bar'), 'double'); $foo->Bar(5);
// Returns 25 $fooAspected->Bar(5);
// Returns 50 可能大家会说,这样同样是有侵入的,因为要显式的调用BunnyAspect,不能对客户端保证调用的透明性。不错,确实存在这个问题,不过我们可以想一些办法来克服,比如说,我们可以利用工厂模式来封装对象的实例化过程,这样,对于BunnyAspect的调用都在工厂中完成,保证了对客户端的透明,客户端只要利用工厂来得到对象就可以了,换个角度讲,即使不用aop,我们从编程规范来讲也不应该随随便便在客户端new一个对象,因为这样的硬编码太缺乏灵活性了。
这样做也有一个缺点,就是返回的对象类型不是我们需要的,而是一个包装的对象,那么如果我们的php5代码是如下构建的话,会出问题:
class MyPhp5Class
{
public function funcName(classType $classname)
}
至于怎么避免这个问题,我没有想好,本来php就是弱类型的语言,非得加上这些类型声明,再想想吧。现在满脑子都是猪肉炒圆白菜,失陪了。
另记:phpunit单元测试的作者对aop做了深入的研究,可以浏览它的blog看看http://www.sebastian-bergmann.de/ 他也新开了一个项目:http://www.sebastian-bergmann.de/AspectPHP/ 7/4/2006 一个效率的小技巧快下班了,拿过同事的《代码大全》随便翻了翻,偶然翻到623页,学了一招:把最忙的循环放在最内层(putting the busiest loop on the inside)
用php代码来表示:
for($i=0;$i<10000;$i++)
{ for($j=0;$j<5;$j++) { echo "Hello, World"; } } for($j=0;$j<5;$j++)
{ for($i=0;$i<10000;$i++) { echo "Hello, World"; } } 就是后一个的效率高,至于为什么,聪明的大家应该可以看出来。 利用DIA+UML2PHP5完成PHP的对象建模本文为老王在公司利用上班时间偷偷写的,所以版权归老王及公司所有
写作条件那是相当艰苦,一来因为上班,要偷偷进行,二来没有截图软件,只能用qq自带的截图功能。 btw:家里电脑中了IEBAR,上网搜索才发现IEBAR这个流氓软件发现竟然是我们公司的产品(除了PHP组,我和公司别人都不熟悉),相煎何太急啊。B4坐我后面那几个制造iebar的程序员,强烈建议中央出台相关法规,监督并提高程序员的道德修养。
言归正传,有的人可能说,php这东西也搞UML似乎有点不守本分了,UML是java才搞的东西。我不由得想反驳一下,八路军虽然装备差,但也不能只搞游击战,时不时也要根据情况来个百团大战,php也是一样,小项目你可以随心所欲的做,但是不见得不能使用uml这些高级货,共产党还用从国民党手里缴获的美式装备武装自己呢,我们也不妨把这遍文章看成是php从java阵营中缴获的战利品。
老实说,我很少进行UML建模,至多是自己在纸上画画,为了脱离这种土八路的境地,我决定学习一下,让自己成为正规军。我选择的工具是DIA+UML2PHP5,因为免费,而且跨平台,Linux,Windows都可以运行。
安装很简单,先安装DIA,然后解压缩UML2PHP5压缩包,把下列文件覆盖到DIA目录的xslt子目录内:
stylesheet.xml dia-uml-classes.zx dia-uml2php5.zx dia-uml2phpsoap.zx dia-uml2php5.conf.xsl 注意:先把xslt目录下的stylesheet.xml改名为stylesheet.xml.old,以免覆盖。 这个时候,基本的安装就已经完成了,我们可以画UML图并生成源代码了。
打开dia,并新建一个文件。注意在下面的面板菜单中选这个uml。
然后随便画一个对象关系图,我这里画了一个简单的继承。 注意在画继承关系的连线时,一定要确认已经连接了两个对象,如果已经连接了,连接点会变红,我们拖动对象的方框,连线会自动跟随
先保存.dia文件,然后选择export导出,对应的选项选择如下:
确定后会再弹出一个菜单,相应选择如下:
确定就可以了,在你保存.dia的目录里应该已经生成了相应的.php文件了。
我们还可以通过php代码生成相应的uml图,注意要使用uml2php5-2.2.0版本,低版本没有这个功能,不过我测试了一下,似乎只能生成类图,和继承关系,而实现接口,聚合/合成等等关系没有实现。至于具体的过程并不复杂,我还在上班,就不写了,详细可以看 http://uml2php5.zpmag.com/en/TOOLS_php2uml.php
昨天KnightE留言说dia不好,我想他喜欢的应该是ArgoUML那样的东西,改天我也熟悉一下。
--------------------------------------------------------------------------------------
7月5日补充:***************************************
偶然发现了新版本的dia for windows,使用了gtk库,界面好了很多,推荐使用这个。
下载地址:
http://dia-installer.sourceforge.net/
http://prdownloads.sourceforge.net/gimp-win/gtk%2B-2.8.15-setup.zip?download http://prdownloads.sourceforge.net/dia-installer/dia-setup-0.95-1.zip?download 7/2/2006 建模php : dia + uml2php5 (http://uml2php5.zpmag.com/en/index.php)
mysql: dbdesigner4 (http://fabforce.net/dbdesigner4/downloads.php) flickrflickr上有些照片不让用鼠标右键保存,做了些小伎俩,上面放了个透明的gif,要保存还得看源代码
<img src="http://static.flickr.com/56/130368734_54e4d34bed.jpg?v=0" alt="" width="315" height="500" onload="show_notes_initially()">
<img style="position:relative; top:-502px; margin-bottom:-502px; display:block;" src="/images/spaceball.gif" alt="" width="315" height="500"> 下面是我在flickr上淘到的一张好图,现在喜欢每天游荡在flickr的五花八门的tags中,很有意思。 6/29/2006 SSH不用密码登陆配置小节ssh可以用公匙,私匙来完成无密码登陆,我以前一直使用的是密码登陆,今天改过来了。过程如下:
首先看看服务器是否支持rsa登陆验证。
vi /etc/ssh/ssh_config 察看RSAAuthentication yes
可以了后,我们先在我们的windows电脑上用puttygen来生成钥匙文件。
puttykey生成了以后,保存好private key file.
用putty套装的puttygen来产生密钥。密钥的类型建议选择SSH2 RSA,因为用的 最为广泛,大多数server支持。密钥的位数选择1024对大多数用户已经足够,除 非你觉得还是不安全。然后点击"Generator",此时密钥生成当然也有几个选项 出现。如果你有不止一个key,你可以在“Key comment”作注释用于区别其他的key。 “Key passphrase“和“Confirm passphrase“用于对硬盘上的key进行加密,如 过你自己一个人用机器觉得安全有保障的话可以让它们为空。然后保存两个key。 不要关掉puttygen,它还有用呢。 在远程系统自己的目录下建立目录".ssh",然后进入目录建立一个新文件authorized_keys ,然后把puttygen中"Public key for pasting into authorized_keys file"粘贴 于authorized_keys这个文件中。然后执行以下命令: chmod 700 $HOME/.ssh chmod 600 $HOME/.ssh/authorized_keys 执行putty,建立一个session命名为ssh,设定ip,协议设为ssh,Connection设定ssh的 auth中,private key的文件选择为puttygen产生的密钥。 连接开始后,要求输入username,远程系统开始public key认证,如果密钥有passphrase 则需要输入,否则直接就登录了。 如果服务器端使用的是旧版本的Openssh或者www.ssh.com的产品,那么authorized_keys 的设定有所不同,具体看手册了,我这里就不详述了。 6/28/2006 准备下载一个ruby看看最简单的安装方法就是下载最新的One-Click Ruby安装包(现在是1.8.2-14 Final),双击安装就可以了,在http://rubyforge.org/上可获得下载,然后运行安装OK了,安装文件里不但包含了Ruby,还有它的IDE,安装程序帮我们搞好了一切配置。 然后设置路径(适合Windows 2000/XP): 学学ruby语法,也好能看明白RoR的代码,先写这些。 6/27/2006 awstats安装实战。服务器:redhat as 4
上http://awstats.sourceforge.net/ 下载了最新的rpm包:http://prdownloads.sourceforge.net/awstats/awstats-6.5-1.noarch.rpm 安装很方便:rpm -Uvh awstats* 就ok了。
cd /usr/local/awstats/tools
./awstats_configure.pl 配置一些选项
cp -r /usr/local/awstats/wwwroot/cgi-bin /yoursite/ 把相应的cgi-bin设置好,重启apache,搞定
还要注意httpd.conf的一些设置,CustomLog var/logs/access_log combined
http://yourdomain/cgi-bin/awstats.pl?config=yourdomain 预览
别忘了在crontab -e中设置 /yoursite/cgi-bin/awstats.pl -update -config=yourdomain
awstats的皮肤要是能做得好看点就好了,有机会尝试http://www.webalizer.org/看看,好像不错的说。
ps: 统计生成的搜索引擎关键字部分乱码,加载awstats.xxx.conf配置文件里面LoadPlugin="decodeutfkeys"
数据源日志格式和按天的截断规则
6/21/2006 aop on php?不断更新中......aop一直只是了解而已,不过今天看到一篇文章,感觉还是不错的,有空了要自己实现一个aop出来
这几天会不断地把了解到的aop知识添加到这个帖子里。
before
after
around SSI服务端包含以前我写php代码的时候,一个很重要的准则就是写的东西要和服务器配置无关,举例来说,类似于一些复杂的静态化问题,我以前是绝不会使用ssi来做的,一般都是静态化成相应的javascript代码,但是那样也会有很多问题,比如有很多浏览器不支持或禁止了Js代码。今天尝试了一下ssi,还是很简单好用的,看来写代码不应该太过迂腐,哈哈,下面看看我的ssi使用过程:
首先,确认你的apache已经正常安装了,
然后 httpd -l 看看你的静态模块中是否有include_module,没有也没有关系,我们可以在httpd.conf里用LoadModule include_module libexec/mod_include.so来动态加载。
然后保证你的相应的<Directory 。。。>里面的options设置包含了includes。
在我的httpd.conf里还有下面两行代码
AddType text/html .shtml
AddOutputFilter INCLUDES .shtml 这样,设置就ok了 建立一个test.shtml文件,里面包含
<!--#include virtual="a.html"-->
再建立一个a.html里面写上hello,world,ok,就成功了。
也可以使用
<!--#include file="a.php"-->
这样的方式,具体差异看手册吧。 |
|
|