219 views | 2011/11/20
周日闲来无事,打开Yii的源代码学习一下,今天主要看的代码都是base包里面的,也就是框架根目录下的base目录里的代码。这个目录里的代码不多,但是类很多,而且这些类对整个框架来说至关重要,都是非常基本的组件。老实说,这里面的代码,我已经看了无数次了,但是总觉得常看常新,转念一想,这也实属正常,毕竟这是原作者数年框架开发经验的结晶,岂是我这等工作一两年的菜鸟能随便吃透的?
最近又玩了两次Visual Paradigm这个软件,觉得自己操作水平又有进步,甚感欣喜,所以今天既然分析源代码,就正好再练练手,于是乎,我开始用VP UML开始画base包里的类,得图如下。(说明:这个图是基于Yii的1.1.8版本,另外这里面少了两个类,因为这两个类的功能比较特殊,我没有细看,所以也就没有画在图里,看后面是不是有兴致再来专门画一张,缺失的两个类是CSecurityManager和CStatePersister。) Continue reading "Yii框架base包代码分析"
Pages: 1 2 3
Posted in Yii, 工作相关 | Tagged analytics, code reading, framework, source code, yii |
70 views | 2011/10/23
想学学怎么写jQuery的插件,结果发现举步维艰,于是想通过研究插件代码的案例,来积累经验,结果看到第一行,我就郁闷了,天下间最郁闷的事情莫过于你出门去约会,结果刚打开门,就摔个狗吃屎,现在我就那个感觉。看代码:
- //第一种“包装盒”
- (function($){
- // to do things here, I like use this way
- })(jQuery);
-
- //第二种“包装盒”
- (function(window, undefined){
- // this is the wrapper of jquery
- })(window);
-
- //第三种“包装盒”
- (function($, undefined){
- // this is the wrapper of jquery ui components
- }(jQuery));
闭包是个好东西啊,自打初窥门径后,我干什么都喜欢在外面套个闭包,我把这个称为是打包盒,而且这个盒子很神奇,里面看得到外面,但是外面看不到里面。好处很多,比如可以放心大胆地命名变量啊,不用担心污染全局空间,也不用担心被全局空间的其他变量污染,还有像上面片段里,第一种那种写法,可以非常安全地去使用$符号代表的jQuery对象。因为在全局空间里,如果一个页面上引入多个类库的话,$符号很可能代表的不是jQuery对象,而用了第一种写法后,$符号变得很安全了。
翻开jQuery和其各类插件的源代码,你会发现,它们都被安放在一些“打包盒”里面,不禁有种英雄所见略同的感觉,但是不要感觉太好,为什么人家用的,跟我用的不太一样呢?看第二种,是jQuery用的“打包盒”。乍看跟第一种很像,但是那两个形参,简直匪夷所思。第一个是window,这明显是地球人都知道的全局变量啊,第二个是undefined,这更加神了@#$%^&。淘宝UED有篇文章解释了这个问题。文章观点大体是,将window由全局变量变为形参,可以在后期代码最小化时候,通过对局部变量名的替换,来大幅度减小代码体积,这算是一个优化吧,undefined那个同理。另一点文中提到的是,undefined可以被重新定义成自定义的值,也即可能被污染,使用这种方式,会得到真正的一个undefined。当然,我的眼光和专业程度也止于此了,但是我还是觉得,还有可能有一些额外的好处,如果看官童鞋你知道,请不吝赐教。
第三种的话,看过了两种,基本上已经有点差不多全懂了,但是仔细一看,还差那么一点的。$形参,和undefined形参不多解释了。请大家关注那个不同点,就是最后一个闭合小括号的位置,发现了吧,最后闭合小括号,为什么是放在最后面了呢?由此我也发现了一个特性,就是在小括号里面的匿名函数,如果在函数结束的大括号后面,直接跟一对小括号的话,会使那个匿名函数立刻执行。如果离开了外面那对小括号,匿名函数是不能生存的,如果是具名函数呢,在闭合大括号后,跟一对小括号,也无法实现对函数的立即调用,反倒会有语法错误。但是还是来看最关键的那个不同,如下:
- //写法A
- (function($, undefined){
- // this is the wrapper of jquery ui components
- }(jQuery));
-
- //写法B
- (function($, undefined){
- // this is the wrapper of jquery ui components
- })(jQuery); //不用找茬了,这行不一样,看“)”的位置
这两种“包装盒”到底有何不同?第一种比第二种有什么特别的好处么?
Posted in jQuery | Tagged code reading, jQuery |
128 views | 2011/10/04
开始学习写Python,写了一两个小脚本后,就产生了非常奇怪的感觉,我怎么觉得Python看着这么混乱呢?
一个是没有大括号了,代码那种段落感没了,第二个是没有分号了,觉得一行总是没完似的。靠缩进来流程控制,觉得非常难受,总是习惯性地搞不清楚一个if和一个for的结束在什么地方,为啥不像pascal和VB那样,加个关闭之类的东西,也让人看着舒服点。代码说完,再说说文档,去官网查文档,感觉那文档视觉效果跟代码一样,没有括号,分号这样分块,断句的地方。那文档就是秘密麻麻一片,从上到下,页面长长的一串,而且还太宽,连个索引也没有,还得不停地ctrl+F来找函数。排版也忒鹾了吧?
目前都还只是视觉上的别扭吧。估计Python的粉要来嘲我了。再往后学学吧~
Posted in 工作相关 | Tagged Linux, python |
97 views | 2011/10/02
要给一个朋友的服务器上架设ftp,一看,这哥们的服务器装的是RHEL AS4,看到这个发行版的名字,我就发怵了,果不其然,么有包管理器,我简直寸步难行,什么软件都没法装,各种依赖,太难解决了!!
看了一下已经安装的软件列表,发现已经装了vsftpd,就用这个吧,man了半天,最后配好了,但是一连,发现死活连不上,百思不得其解,各种google,各种百度,也不知道过了多少天,才发现问题的症结在iptables,原来,要使用passive mode登陆ftp,必须开一个范围的端口,而系统默认的iptables规则,不允许对这些端口的访问,导致ftp连不上。怎么开放iptables的端口呢?又是各种google,各种百度,搜到一个iptables的tutorial,竟然有290页之厚,太难用了。
几经周折又找到了一个图形化系统界面可以配置防火墙规则的,system-config-securitylevel-tui,通过这个东西,很容易就可以开放一个端口,但是这个东西也有问题,我要开10000号段的端口100个,就麻烦了,虽然网上说,用格式形如10000-10100:tcp这样的写法可以开放一个系列的端口,但是实际上,这么写是不管事的,也不知道是不是软件的版本的问题。
最后,知道这个ui界面生成的规则被写到了/etc/sysconfig/iptables文件里面,然后又看了一下man,研究了一下如果手动配置规则的话,端口范围的写法(--dport 10000:10100),先用ui工具生成一条一个端口的规则,然后手动改文件,将端口改成范围,一重启,发现终于一切都按照预期的搞定了,真是累死我了。
在RHEL下面,启动,重启,关闭,查询iptables状态的方法:
Usage: /etc/init.d/iptables {start|stop|restart|condrestart|status|panic|save}
Posted in Linux | Tagged ftp, iptables, Linux, rhel |
134 views | 2011/09/30
以前写博客,我就喜欢使用客户端,感觉客户端更像是在自己的地盘,用网页界面写博客,就感觉像在论坛发贴一样。少了一种严肃,多了一种随意。后来博客荒废已经多年,今天偶然想起来写一下,还是想用客户端写,于是好奇地在Google上搜了一下,找到了我现在用的这个MarsEdit(火星编辑器?哈哈)
这款客户端软件非常完美地体现了MacOS的设计哲学,高度的用户友好,不把用户不懂的东西暴露给用户。你只需要告诉软件,你的部落格的网址是什么,然后他就帮你做好一切,最多是问你要一下登陆密码,从这点来说,可能比Windows下的Windows Live Writer更加友好。输入完密码,就会使用一个看起来像是Mail的一个界面来展示你部落格的所有文章列表,这是一种体验延续,或者也是一种体验借鉴,因为所有的Mac系统预装Mail,所以,作者恐怕觉得让界面长得像Mail,就能极大地减少教育成本。(我觉得这个设计思路相当值得借鉴,要想你的东西不言自明,一种是让用户不会犯错,无敌简单的UI,比如只有一个按钮,另一种,就是站在巨人肩膀上,重复用户非常熟悉的一种体验)。创建新文章,也像是写一封邮件一样,首先选一个blog(收件人),然后写标题,然后是tags,地下就是正文编辑区域。与Mail不同的是右侧多了分类列表和博文的基本属性。
本文写地有点四不像了,说白了,其实也就是我想借机会测试一下这款客户端编辑器的效果怎么样。结论,东西还不错,比较好用,兼容中文也比较好,支持HTML所见即所得,也支持HTML代码直接编辑。支持预览。
Posted in Mac | Tagged blogging, client, mac, MarsEdit |
463 views | 2011/09/04
本文要讲的,就是如何简化从Mac登录Linux主机的操作步骤,提高效率。所谓的“免登陆”其实是不存在的,只是说,从验证密码的登录方式,改为公私钥对的登录验证方式。使用后者的方式,每次会由ssh客户端自动发送验证信息,所以就免去了人工输入密码,看起来好像“免登陆”一样。
关于这么做的原理,大家可以自己去Google,关键词是“非对称加密”,“RSA算法”,“基于ssh密钥对的自动登录”,等等,我就不多解释了。我直接说操作步骤吧:
- 生成密钥对
- 用密码登录远程主机,将公钥拷贝过去
- done
怎么样,无敌简单吧?
生成密钥对
执行命令 ssh-keygen -t rsa
执行结果如下:
charles@mac:~ > ssh-keygen -t rsa
Generating public/private rsa key pair.
Enter file in which to save the key (/Users/charles/.ssh/id_rsa):
Created directory '/Users/charles/.ssh'.
Enter passphrase (empty for no passphrase):
Enter same passphrase again:
Your identification has been saved in /Users/charles/.ssh/id_rsa.
Your public key has been saved in /Users/charles/.ssh/id_rsa.pub.
The key fingerprint is:
c8:4b:85:87:90:7c:1a:67:b6:71:f5:51:0c:9d:a2:89 charles@TCMBP.local
The key's randomart image is:
+--[ RSA 2048]----+
| ... .. o=.. |
| +.*o. ...+ |
| Bo+o. o.. |
| ...+E o |
| + S |
| . . |
| . |
| |
| |
+-----------------+
注意:提示enter passphrase的时候,不要输入,因为你本来就想少打一次密码的,这里如果设置了用密码保护私钥,那登录的时候还是要输密码,就白做了。
做完这个步骤后,cd ~/.ssh,你就可以看到你刚才生成的密钥对,id_rsa是私钥,id_rsa.pub是公钥。下一步,就是把公钥拷贝到目标主机上。
将公钥拷贝到目标主机
用ssh登录到目标主机,然后cd ~/.ssh目录,如果目录不存在,那么要自己创建mkdir -p ~/.ssh。你今后要用哪个帐户登录主机,就在哪个帐户的home目录下操作,如果要免登陆root,就要去/root下操作。使用~比较好,不用多想了。
有了.ssh目录后,进去,然后把id_rsa.pub传过去,可以用scp命令,这里要做的一个主要操作,就是将id_rsa.pub,的文件内容,写到一个叫authorized_keys的文件中去,如果目标主机的相应用户名下已经有了.ssh目录和authorized_keys文件,那你操作要小心一点,可能别人也做过免登陆的设置,这个时候你要小心不要把别人的设置给覆盖了。如果没有的话,就创建文件touch ~/.ssh/authorized_keys,然后执行cat id_rsa.pub >> authorized_keys,将你的公钥写入到authorized_keys中,公钥文件.pub里面只有一行信息,上面的命令相当于把那一行信息追加到authorized_keys文件最后一行。
如果.ssh目录是你主机刚刚创建的,那么可能还需要改变一下这个目录的权限,将权限放低,chmod -R 0600 ~/.ssh,到此,所有设置就算做完了,你可以退出登录,在自己的主机上试一下了,现在再敲入ssh命令后,不用密码就可以登录主机了。
Posted in Linux, 工作相关 | Tagged DIY, Linux, ssh, tips, usage |
Most Commented Posts