Yii框架base包代码分析
周日闲来无事,打开Yii的源代码学习一下,今天主要看的代码都是base包里面的,也就是框架根目录下的base目录里的代码。这个目录里的代码不多,但是类很多,而且这些类对整个框架来说至关重要,都是非常基本的组件。老实说,这里面的代码,我已经看了无数次了,但是总觉得常看常新,转念一想,这也实属正常,毕竟这是原作者数年框架开发经验的结晶,岂是我这等工作一两年的菜鸟能随便吃透的?
最近又玩了两次Visual Paradigm这个软件,觉得自己操作水平又有进步,甚感欣喜,所以今天既然分析源代码,就正好再练练手,于是乎,我开始用VP UML开始画base包里的类,得图如下。(说明:这个图是基于Yii的1.1.8版本,另外这里面少了两个类,因为这两个类的功能比较特殊,我没有细看,所以也就没有画在图里,看后面是不是有兴致再来专门画一张,缺失的两个类是CSecurityManager和CStatePersister。)
怎么觉得Python这么混乱呢
开始学习写Python,写了一两个小脚本后,就产生了非常奇怪的感觉,我怎么觉得Python看着这么混乱呢?
一个是没有大括号了,代码那种段落感没了,第二个是没有分号了,觉得一行总是没完似的。靠缩进来流程控制,觉得非常难受,总是习惯性地搞不清楚一个if和一个for的结束在什么地方,为啥不像pascal和VB那样,加个关闭之类的东西,也让人看着舒服点。代码说完,再说说文档,去官网查文档,感觉那文档视觉效果跟代码一样,没有括号,分号这样分块,断句的地方。那文档就是秘密麻麻一片,从上到下,页面长长的一串,而且还太宽,连个索引也没有,还得不停地ctrl+F来找函数。排版也忒鹾了吧?
如何配置RHEL的iptables开放端口
要给一个朋友的服务器上架设ftp,一看,这哥们的服务器装的是RHEL AS4,看到这个发行版的名字,我就发怵了,果不其然,么有包管理器,我简直寸步难行,什么软件都没法装,各种依赖,太难解决了!!
看了一下已经安装的软件列表,发现已经装了vsftpd,就用这个吧,man了半天,最后配好了,但是一连,发现死活连不上,百思不得其解,各种google,各种百度,也不知道过了多少天,才发现问题的症结在iptables,原来,要使用passive mode登陆ftp,必须开一个范围的端口,而系统默认的iptables规则,不允许对这些端口的访问,导致ftp连不上。怎么开放iptables的端口呢?又是各种google,各种百度,搜到一个iptables的tutorial,竟然有290页之厚,太难用了。
Mac OS X上如何实现到Linux主机的ssh免登陆
本文要讲的,就是如何简化从Mac登录Linux主机的操作步骤,提高效率。所谓的“免登陆”其实是不存在的,只是说,从验证密码的登录方式,改为公私钥对的登录验证方式。使用后者的方式,每次会由ssh客户端自动发送验证信息,所以就免去了人工输入密码,看起来好像“免登陆”一样。
关于这么做的原理,大家可以自己去Google,关键词是“非对称加密”,“RSA算法”,“基于ssh密钥对的自动登录”,等等,我就不多解释了。我直接说操作步骤吧:
【边学边用】PHP5函数参数的按引用传递
PHP是支持引用的,但是关于一个变量什么时候是引用,什么时候是值,我脑子里总是迷迷糊糊的,所以,想用引用的时候,就会不自觉地在所有的地方加上&符号,真的很累赘。为了缓解这个问题,我特意写了下面这个代码片段来增进自己的理解。起初,我对这个东西的理解是,对于对象来说,PHP5就是按照引用传递的。但是我现在想,可能事情不是这么一回事情。下面的代码片段中,$obj其实是A的对象的一个引用,可以理解成一个指针,函数参数$o,其实还是对$obj的拷贝,只是拷贝的是引用本身,也即,$o其实是$obj的拷贝,只是由于其拷贝了$obj,所以,$o也指向A的对象。两个指针指向一个地方,这也是为什么函数changeObj可以改变A的对象的原因。我想,这样大概从技术来说,会更加合理一点。
ExtJS 4 的MVC
ExtJS是我听说了很久的一个js框架了,但是从来就没有用过,读研期间寝室里有个小哥在用,不过那时候醉心于WordPress开发,也懒得理会了。现在公司里,有个上线系统用到了这个框架中的一个TreePanel组件,整个界面上,就正中间扔了一个tree panel,而且不知道什么原因,CSS还有bug,把按钮都搞破了,弄得丑陋不堪,我于是自告奋勇,仔细调试,终于修复了那个显示上的bug,从此算是初次结识了ExtJS。它真正吸引我的原因是,它能够把富客户端应用的开发,从美工和基础交互中解放出来,只需要专注于业务逻辑开发即可,从而让后台工程师也能够有能力快速开发外观专业的网站应用系统。我觉得这真是功德无量的一个事情。(如果我直觉没错,Flex框架也是这一类东西,这也是我对其有兴趣的原因,当然还没有时间尝试)
VIM常用小窍门收集
vim应该是现在世界上最流行的编辑器,没有之一。就算你千般百般地不喜欢它,掌握它也成了一件必须的事情了。因为日后你如果做程序员,在非Win系列的服务器上搞开发,vim绝对是无法避免的。你日常能接触到的server,emacs可能没装,但是vi不可能没装,就这样。
特意开辟这个文章,用于收藏一些工作中常用的操作,主要有这么几个原则:
给SVN客户端配置代理服务器
最常见的SVN客户端其实是TortoiseSVN,我一直叫它作乌龟SVN。上班以后,我在办公室使用SVN连接非办公网络的服务器,发现无法连接,原来,是因为大多数办公网络都设置了防火墙,要连接外网的服务器,必须配置代理。如果使用的是TortoiseSVN,那么“右键”-》“Settings”-》“Networking”,就可以找到设置代理的地方:
我自己经常使用的是另一款SVN客户端,不知道国内有多少用户,总之我也提一下吧,下载的网站是这里:http://www.collab.net/,这家公司是SVN的幕后支持公司,他们开发基于命令行的各种操作系统的客户端,基于命令行,所以就非常的轻巧,最关键是装好以后,可以和NetBeans无缝集成,也不会弄一堆花花绿绿的图标在资源管理器里面,让你看了红色惊叹号凭空焦虑。
Yii框架中验证器的allowEmpty属性
Yii框架自带验证器这个包,提供了一组常见各类属性的验证器。如果使用Gii代码生成工具创建model,会根据数据库字段的属性默认生成一些验证器的配置。在配置验证器的时候,很多验证器都有以后属性叫做allowEmpty,这个属性的真正逻辑却不是看上去的那个意思。
数据库里的字段,有个属性,叫NULL,就是字段是否允许为空值,allowEmpty听起来跟这个NULL的约束是一样的,但是实际看验证器的代码:
protected function validateAttribute($object,$attribute)
Web开发专用IDE:Aptana Studio 3.0
Aptana Studio是一款专业的、开源的开发环境,主要用于Web应用开发。该开发环境支持最新的浏览器技术HTML5,CSS3,Javascript,除此之外,对服务器端语言Ruby(对RoR貌似有很好的支持),PHP,Python也有很好的支持。
目前能够在Web开发中对HTML,CSS,和JS同时提供编码帮助的IDE环境极其少见,Dreamweaver是我知道的做得比较好的,但是Dreamweaver对语言的支持只做到了静态语法检查和代码高亮,更进一步则无能为力了,只能算是准IDE,毕竟不是真正的IDE环境,NetBeans在这方面有不俗的表现,正是我选用此款IDE的原因。
Google用于提高网站质量的工具:Page Speed工具集
应该就是离现在不太远的时候,Google推出了用于提高网页质量的工具集,Page Speed。我最早听说是在若干月前的PHP Classes的news letter上。最近才有时间来仔细看看这个东西。
Page Speed现在的形态是一个工具集,目前提供了客户端和服务器端的两种组件。服务器端提供了Apache服务器的模块mod_pagespeed,该模块可以自动优化网页和资源文件。客户端的工具是一个插件,分别提供了firefox、Chrome的版本,其功能更加类似于Yahoo推出的YSlow,也是真对一个页面进行诊断,给出相应的优化建议,Yahoo提出的东西在业界被称为是14条军规,从Page Speed插件给出的建议来看,基本也没有逃出这14条军规的范畴。除此之外,Google还推出了一个网页版本的Page Speed,只要键入网址,就可以自动分析页面的问题给出建议。
Web服务器LiteSpeed
LiteSpeed Web Server is the leading high-performance, high-scalability web server. It is completely Apache interchangeable so LiteSpeed Web Server can quickly replace a major bottleneck in your existing web delivery platform. With its comprehensive range of features and easy-to-use web administration console, LiteSpeed Web Server can help you conquer the challenges of deploying an effective web serving architecture.
工作中常用的Linux命令集锦
tcpdump —— 打印出通过网口流入流出的数据内容,用于网络协议调试
tcpdump就是大家嘴里常说的抓包工具,在linux命令行下,使用tcpdump,可以查看服务器特定端口进出的数据包内容。
tcpdump -X -s0 -i any udp port 12009
Yii框架的Log系统的分析
昨天阅读了Yii框架中log部分的源代码,框架提供了灵活、强大的log功能,如果不是非常特殊的需求,框架中自带的类就已经能够满足一般的应用的需求了。实现log功能的源代码被存放在 framework/logging 目录下,这个目录下的代码都包含在包system.logging中。本文简要介绍一下我昨天阅读代码的所得。
视频教程:使用Yii框架开发Blog
Yii框架的官方网站上,有一个教学用demo,就是使用Yii框架开发一个blog。有非常详尽的文字描述,步骤基本也比较清楚。一遍走下来,基本上就差不多都学懂了。
上周正好要在公司做分享,害怕当堂演示会说不好,浪费时间,就在家里自己将blog的开发过程录制成了视频,这是我第一次录制视频,觉得格外新鲜,遂决定在这里分享给大家。大家一起乐一乐,O(∩_∩)O哈哈~
第0集 Blog功能需求及应用骨架搭建
MVC最佳实践
前一段日子,写了一篇《MVC就是一个选择题》,重点描述了我对MVC模式的迷惑。随着我对这个模式应用时间的深入,渐渐感到得心应手,这个模式早在30多年前就已经发明了,确实经受了时间的考验,可以说是千锤百炼。但是,实践过程中,我也发现,更多的时候照猫画虎还是有很多弊端的,想要真正做好MVC的选择题,必须在项目中不断犯错误,不断修正,才能逐渐走上正轨。我参加的项目主要运用了Yii框架,是目前比较流行的一个Web开发框架。随着前不久,1.1.6版本的发布,我发现Yii框架的文档中,多了一篇MVC最佳实践的文章。我想,这个文章对于初学者来说,应该具备相当的指导性,而且指导相当具体。如果也有跟我相同的迷茫,应该好好钻研一下这篇文章,并且身体力行去验证之,这里给出链接。我在这篇文章中,就是概括简述一下那篇文档的内容。
MVC就是个选择题
由于采用了Web开发框架来开发项目,所以我首次在真正的项目中采用MVC的开发模式。随着项目的不断深入,我也在不断反思,MVC设计模式到底给项目带来了什么?成倍的开发时间?复杂无比的目录结构?铺天盖地的文件数量?听起来都很难听对吗,但是确实如此。那么MVC所许诺的那些好处呢?清晰的代码结构,易于维护,易于扩展?真有吗?
当然,我不是在批判MVC,只是觉得,在使用MVC过程中,还是需要投入更深入的思考,到底怎样才能用好这个设计模式。MVC给我的感觉是,要求使用其的开发者有更高的觉悟,来正确选择存放一段代码的地方。从而实现解耦合,代码复用,和易于维护。为什么说使用MVC会有成倍的开发时间,主要就是因为在开发中,我们需要更多的时间去思考,这些代码放在哪里更合理一些。在MVC框架下代码被切割成一个又一个的小文件,分散在复杂的目录树中,那么到底怎样选择把代码写在哪里呢?这道选择题,并非有看起来那么容易。就我个人感受而言,更多的时候,无论将代码放在哪里都可以正确实现你的逻辑,MVC不是什么神兵利器,并不能通过其模式本身的约束,将开发者导入到一个正确的轨道上,反而会因为开发者本身错误的选择而让MVC自己变得一团糟。所以说,当一个团队确定要在一个项目中引入MVC时候,应该思考一下,每个团队成员是不是真的都有能力驾驭,如果没有对应的能力话,是不是要考虑前期对项目成员进行一定的培训。
Dedian 5的PHP包缺少readline支持
命令行下,PHP有一个很有趣的功能,就是interactive mode,在这种模式下,用户可以使用php shell,很自如的运行各种php函数。只要在shell下执行php -a命令即可。但是这个模式需要readline支持。
在Debian 5下,通过官方源使用apt安装的php5,不支持readline,所以,就无法使用interactive mode了。搜索了下,找到了解决办法。参见:http://www.dotdeb.org/instructions/ 这可能是一个组织,专门支持在Debian下搭建Web服务系统。
如何在Debian上安装PHPUnit
Debian上安装PHPUnit最方便的做法,就是使用apt-get或者aptitude,当然,如果你想安装最新版本的PHPUnit,那又另当别论了。
安装最新版本的PHPUnit,我推荐使用pear来安装,不过前提是首先要安装最新版本的pear,Debian源里的pear,版本低于1.8.1,不能安装最新版的PHPUnit。
好,下面的代码用来安装pear,然后是PHPUnit:

Most Commented Posts