Becomin' Charles

算法 | LNMP | Flutter | Mac

Becomin' Charles

PHP是支持引用的,但是关于一个变量什么时候是引用,什么时候是值,我脑子里总是迷迷糊糊的,所以,想用引用的时候,就会不自觉地在所有的地方加上&符号,真的很累赘。为了缓解这个问题,我特意写了下面这个代码片段来增进自己的理解。起初,我对这个东西的理解是,对于对象来说,PHP5就是按照引用传递的。但是我现在想,可能事情不是这么一回事情。下面的代码片段中,$obj其实是A的对象的一个引用,可以理解成一个指针,函数参数$o,其实还是对$obj的拷贝,只是拷贝的是引用本身,也即,$o其实是$obj的拷贝,只是由于其拷贝了$obj,所以,$o也指向A的对象。两个指针指向一个地方,这也是为什么函数changeObj可以改变A的对象的原因。我想,这样大概从技术来说,会更加合理一点。

1
2
3
4
5
6
7

a = 3;
$o->b = 5;
}
changeObj($obj);
var_dump($obj);

执行结果如下:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

object(A)#1 (2) {
["a"]=>
int(1)
["b"]=>
int(1)
}
object(A)#1 (2) {
["a"]=>
int(3)
["b"]=>
int(5)
}

然后再看一个普通变量的引用传递的例子,这个例子里面使用的是原生的整型变量,然后函数changeInt的函数声明里,也用一般方法声明参数,普通的调用,我们发现函数不能改变$x和$y的值,这符合我们的预期,但是第二个形式的调用,就是传参数时候,带上引用标志&,结果我们发现,$x和$y的值也改变了,这是为什么呢,跟上面的例子是一个原因,函数的形式参数a和b其实是$x和$y的引用的拷贝,所以a和b也指向x和y,所以,a和b可以改变x和y的值。再看最下面的一种形式,这种是我认为的真正的按照引用传递参数。非常的绕乎对吧?我也觉得如此,确实太过灵活了。确实不利于学习和理解,代码也不容易维护,如果真的想用引用传递参数,推荐用最底下一种方式,明确告诉调用的人,这里其实是引用,千万别用changeInt(&$x, &$y);这种形式,这个代码散步在各处,将极难定位bug。

ExtJS 是我听说了很久的一个 js 框架了,但是从来就没有用过,读研期间寝室里有个小哥在用,不过那时候醉心于 WordPress 开发,也懒得理会了。现在公司里,有个上线系统用到了这个框架中的一个 TreePanel 组件,整个界面上,就正中间扔了一个 tree panel,而且不知道什么原因,CSS 还有 bug,把按钮都搞破了,弄得丑陋不堪,我于是自告奋勇,仔细调试,终于修复了那个显示上的 bug,从此算是初次结识了 ExtJS。它真正吸引我的原因是,它能够把富客户端应用的开发,从美工和基础交互中解放出来,只需要专注于业务逻辑开发即可,从而让后台工程师也能够有能力快速开发外观专业的网站应用系统。我觉得这真是功德无量的一个事情。(如果我直觉没错,Flex 框架也是这一类东西,这也是我对其有兴趣的原因,当然还没有时间尝试)

阅读全文 »

Vim 应该是现在世界上最流行的编辑器,没有之一。就算你千般百般地不喜欢它,掌握它也成了一件必须的事情了。因为日后你如果做程序员,在非 Win 系列的服务器上搞开发,Vim 绝对是无法避免的。你日常能接触到的 server,emacs 可能没装,但是 Vi 不可能没装,就这样。

特意开辟这个文章,用于收藏一些工作中常用的操作,主要有这么几个原则:

  1. 非常有用
  2. 不常用
  3. 每次用都想不起来应该怎么用

不知道大家是不是经常跟我一样有这种感受呢?我会把我遇到的这类操作,都详细写在这里。

简单的列编辑

比如:将配置文件中的指定列前面加上注释符号。

1
2
3
4
5
6
7
8
9
10
11
12
#fastcgi.conf
fastcgi_param GATEWAY_INTERFACE CGI/1.1;
fastcgi_param SERVER_SOFTWARE nginx;
fastcgi_param QUERY_STRING $query_string;
fastcgi_param REQUEST_METHOD $request_method;
fastcgi_param CONTENT_TYPE $content_type;
fastcgi_param CONTENT_LENGTH $content_length;
fastcgi_param SCRIPT_FILENAME $document_root$fastcgi_script_name;
fastcgi_param SCRIPT_NAME $fastcgi_script_name;
fastcgi_param REQUEST_URI $request_uri;
fastcgi_param DOCUMENT_URI $document_uri;
fastcgi_param DOCUMENT_ROOT $document_root;

如上代码是一个很常见的配置文件,我现在要给第 2-12 行前面都加上一个 # 号,注释掉他们,在 EmEditor 里面这个事情无敌简单的,但是到了 Vi 里面,你是不是总也想不起来应该怎么弄?

1
:2,12s/^/#/g

解释一下,【2,12】在 Vi 中叫 range,看帮助的时候,如果看到 range,这就是一种写法,表明第 2 行到 12 行。
还有一种写法:

1
:s/^/#/g 11

将光标移动到第二行,然后执行上面的命令,后面的【11】代表,执行这个命令,重复11次。这里一直没解释里面那个至关重要的乱码串,那个就是替换的命令了。下次再说。

删除的时候使用 f 和 t

删除是 Vim 里面非常常用的功能,一个一个字幕删除,用 x,可以代替 del 用。整行删除,dd,应该都会了。删除一个单词,用 dw。这些都是简单提一下,我主要讲两个很好用的功能,就是 f 和 t。

f 的本意是行查找,fa,就是从光标当前位置开始,在本行中,找到第一个字母 a,和 d 结合起来以后,就非常方便了,比如:

在这个代码里,你想删掉第一个参数,可以把光标放在(后面的第一个$上,然后按”df,”,就可以把$a连同后面的逗号都删掉,非常方便。当然了,你可以发挥一下,”d2f,”这个按键序列就是把$a和$b都删掉了,但是呢,用数字这种东西,在实际操作中,我感觉大脑经常反应不过来,需要思考,不实用。

在来说一下 t,t 这个东西,跟f非常像,区别就是t把找光标放到找到的那个字符前面一个位子,比如上面那个例子,我把光标放在第一个 $ 上,然后按下 “dt)” 这个序列,可以把函数的 3 个参数都删掉,但是却不会删掉括号,非常舒服,在括号里删东西,我经常用这个功能。

惹人烦恼的^M

久用 Vim 的人,可能会遇到这样的情况,打开一个从别的环境拷贝过来的文件,发现每一行的末尾都有一个^M,非常恼人。

这个问题产生的原因,是因为三种系统的换行符定义不一样造成的。在Dos系统下,行结束符为\r\n,在linux下,行结束符为\n,在Mac下,行结束符为\r,当一个文件在一个系统上编辑,然后拷贝到另一个系统打开的时候,就会出现^M,事实上,还会出现别的恼人情况,比如一打开,发现没有任何断行,这在理论上完全可行,但是估计在Google搜索,这会是另一个问题,其实都是同一个起因。

Vim下面有两个变量 fileformat 和 fileformats,简写为 ff 和 ffs。当你发现文件没有断行或者有 ^M 的时候,你有几种选择。

在 Linux 上,看到 ^M 可以执行 dos2unix,然后将 Windows 文件的 \r\n 转换成\n,然后发现 ^M 消失了。

还可以,:set ff=win,让 linux 下的 Vim 按照 Windows 格式来解析文件。当然也可以查找替换把 ^M 给替换掉。

除此之外,还可以用ffs添加到配置文件来告诉 Vim 按照怎样的顺序来尝试适配。

比如我在 Mac 系统下,set ffs=mac,unix,dos,这样,一般情况下我打开任何系统过来的文件,都能按照正确的格式显示。

最好看的配色方案

常用Vim的人,经常会为了配色方案而纠结,仿佛每一种都不是特别好看。其实我也这么觉得的,我分析下来,原因可能是,为Vim贡献配色方案的,大都是西方人,他们的眼睛是蓝色的,感受到的对比度,饱和度,亮度,和东方人的黑眼睛看起来是不一样的。所以他们配出来的配色方案,我们东方人,怎么着都觉得不太好看。

当然,还是能找出来一些能够勉强一看的。我个人比较熟比较习惯的是自带的evening和desert,感觉多不错,而且对我用到的好几种语言,都有不错的表现。

最近,还发现了一套非常强大,经过精心设计的配色方案,叫 solarized,在圈子里影响也很大,http://ethanschoonover.com/solarized 特此推荐给大家,因为,我觉得它配色还算是相当舒服的,对比略低,但是不影响美观。

编码相关Encoding

使用:set fileencoding 可以显示文件的编码格式,简写形式是 :set fenc,使用 :set fenc=utf-8 可以转换文件的编码格式为 utf-8

使用 :set encoding 可以显示编辑器当前使用什么编码方案来展示文档,简写为enc,如果utf-8文档使用非utf-8显示,汉字会出现乱码,使用:set enc=utf-8可以将vim使用的编码方案切换的utf-8

Tab view

用一个vi编辑器,打开多个代码文件,vim从7.0版本开始,支持文件标签页,使用方法也非常简单,使用:tabnew filename来打开一个新文件,就会自动出现在新tab里面,并且在打开文件超过两个的时候,顶部出现标签控制行。

#在vim中,用新tab打开文件 :tabnew filename

#在命令行中,用标签页一次打开多个文件
$ vim -p filename1 filename2 filename3

#在vim中,各个标签页的切换
:tabn #下一个tab
或者 gt
:tabp #上一个tab
或者 gT

#搜索已经打开的tab #tabf keyword

手动加载代码高亮

比如,你使用 Vim 从头开始编辑一个 Shell 下的脚本,这个脚本是个命令,所以,一开始你没有给这个脚本设置扩展名,你会在脚本的开头使用 shabang 来指定解析器,后面用 chmod +x 后就可以执行了。

这时候,你发现写了几行代码后,代码高亮并没有生效,是因为你刚开始编辑文件的时候,文件名没有扩展,而且文件的内容全空。所以无法匹配正确的语法高亮,这个时候,你可以保存,然后重新打开文件,那也可以激活代码高亮。Vim 可以通过 shabang 来识别语法类型。

如果你不想这么麻烦,先保存关闭再打开,你可以执行命令:

1
:filetype detect

当然,如果你没有写扩展名,也不写 shabang 的话,那是没用的。

最常见的SVN客户端其实是TortoiseSVN,我一直叫它作乌龟SVN。上班以后,我在办公室使用SVN连接非办公网络的服务器,发现无法连接,原来,是因为大多数办公网络都设置了防火墙,要连接外网的服务器,必须配置代理。如果使用的是TortoiseSVN,那么“右键”-》“Settings”-》“Networking”,就可以找到设置代理的地方:

set proxy in tortoise svn

我自己经常使用的是另一款SVN客户端,不知道国内有多少用户,总之我也提一下吧,下载的网站是这里:http://www.collab.net/,这家公司是SVN的幕后支持公司,他们开发基于命令行的各种操作系统的客户端,基于命令行,所以就非常的轻巧,最关键是装好以后,可以和NetBeans无缝集成,也不会弄一堆花花绿绿的图标在资源管理器里面,让你看了红色惊叹号凭空焦虑。

给这个命令行客户端设置代理有点纠结,看不明白的童鞋,自动忽略好了。首先打开CMD,然后键入命令echo %APPDATA%,得到的结果,就是你的配置所在的根目录,进入那个目录,然后进入Subversion子目录,你会看到两个配置文件,一个叫config,一个叫servers,用写字板编辑那个servers的配置文件:

1
2
3
4
5
6
7
8

[global]
# http-proxy-exceptions = *.exception.com, www.internal-site.org
http-proxy-host = defaultproxy.whatever.com
http-proxy-port = 7000
http-proxy-username = defaultusername
http-proxy-password = defaultpassword

配置好后,就可以实现给SVN客户端挂上了代理,如果只想给特定的域挂代理,就使用另一个section来配置代理:

1
2
3
4
5
6
7
8
9
10
11
12
13
14

[groups]
group1 = *.googlecode.com
# othergroup = repository.blarggitywhoomph.com
# thirdgroup = *.example.com

### Information for the first group:
[group1]
http-proxy-host = proxy.myoffice.com
http-proxy-port = 8080
# http-proxy-username = blah
# http-proxy-password = doubleblah
# http-timeout = 60

如上只是我的配置的一个节选,是我给googlecode这个域配置了一个代理。

Yii框架自带验证器这个包,提供了一组常见各类属性的验证器。如果使用Gii代码生成工具创建model,会根据数据库字段的属性默认生成一些验证器的配置。在配置验证器的时候,很多验证器都有以后属性叫做allowEmpty,这个属性的真正逻辑却不是看上去的那个意思。

阅读全文 »

本站创立始于2008年三月,估计最老的一批读者现在几乎已经都不再来了,一开始,我的这个小站就专注于WordPress的周边一些话题,包括主题定制,插件开发,DIY,hacks,插件汉化等等。最早,域名不是现在这个,是charlestang.cn,那是一个在国内注册的域名(你们懂的),后来,随着博客的成长,我发现我的博客主要内容都已经偏向了WordPress,其他技术内容已经非常少了,那个时候,我做出了一次结构的重大调整,就是将跟技术无关的内容都移出了本博客,专门开辟了个人生活内容博客,而这个博客则专注于WordPress相关的内容。

在使用原来的域名的时候,曾经接入过一次Google分析,但是感觉拖慢了网站的速度,就弃用了,因为觉得自己的博客反正无法盈利,统计是否强大,完全无所谓,所以那个时候,就使用了站长统计,一直用到今天,现在仍然挂着。随着我毕业走上工作岗位,终于进入了互联网行业,最近正好要研究一些网站统计的相关内容,所以又想起了Google分析,这次,我算是正式给小站挂上了Google分析了。特此写一篇文章,纪念这个时间,希望未来1年,3年,5年的时候,还能从这篇文章的内容,回想起事情的始末。

Aptana Studio是一款专业的、开源的开发环境,主要用于Web应用开发。该开发环境支持最新的浏览器技术HTML5,CSS3,Javascript,除此之外,对服务器端语言Ruby(对RoR貌似有很好的支持),PHP,Python也有很好的支持。

目前能够在Web开发中对HTML,CSS,和JS同时提供编码帮助的IDE环境极其少见,Dreamweaver是我知道的做得比较好的,但是Dreamweaver对语言的支持只做到了静态语法检查和代码高亮,更进一步则无能为力了,只能算是准IDE,毕竟不是真正的IDE环境,NetBeans在这方面有不俗的表现,正是我选用此款IDE的原因。

之所以注意到这款IDE,是因为有业内比较资深的工程师提到了这个东西,所以专门了解了一下,这个IDE基于Eclipse框架开发,专门针对Web应用开发领域,尤其强化了对HTML,CSS,JS等语言的支持,对于Server端的语言,选择的也都是专门用于Web开发的语言。本来我对其对PHP开发的支持抱有一定的期待,但是后来听说其将PHP模块从项目中移除,转而投向PDT Project,我就有点失望了,感觉PDT的能力真的只能算一般,不过在不是很了解Aptana的基础上,我还是可以说,那些用普通Eclipse+PDT开发的童鞋,完全可以转头Aptana的怀抱,因为你二者都不会失去,反而可以得到对HTML,CSS,JS的强大支持。使用NetBeans进行Web开发的童鞋,并且平常工作偏重于Server端PHP开发的,可以等待我的进一步体验报告。

应该就是离现在不太远的时候,Google推出了用于提高网页质量的工具集,Page Speed。我最早听说是在若干月前的PHP Classes的news letter上。最近才有时间来仔细看看这个东西。

Page Speed现在的形态是一个工具集,目前提供了客户端和服务器端的两种组件。服务器端提供了Apache服务器的模块mod_pagespeed,该模块可以自动优化网页和资源文件。客户端的工具是一个插件,分别提供了firefox、Chrome的版本,其功能更加类似于Yahoo推出的YSlow,也是真对一个页面进行诊断,给出相应的优化建议,Yahoo提出的东西在业界被称为是14条军规,从Page Speed插件给出的建议来看,基本也没有逃出这14条军规的范畴。除此之外,Google还推出了一个网页版本的Page Speed,只要键入网址,就可以自动分析页面的问题给出建议。

对于没有使用Apache作为Server的,Page Speed还放出了C++ SDK,支持第三方开发。

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.

LiteSpeed是一款先进的高性能,高扩展性Web服务器。它和Apache是完全可互换的,所以,它可以快速替换您Web分发平台的瓶颈。它拥有丰富的特性和易用的Web管理控制台,可以帮助您克服高效部署web服务器架构时的挑战。

阅读全文 »

使用Nexus S(下面简称NS)已经一段时间了,我看了一下,之前发布的文章《入手Nexus S》,是3月14日,到现在,应该正好是一个半月左右的时间,很多的怨念、新鲜都已经退却,那我就再来谈谈关于这款手机的实际使用体验。

首先说一下价格,我入手NS的时候,在淘宝上买的美国代购,价格是4300元,相对这款手机的实际使用体验来看,这个价格是虚高的,事实是我入手后2天,降价了60块钱,现如今,黑色版iPhone4港行已经4300左右了,那NS应该进一步降价,否则的话,恐怕不是很合算的。iPhone4的使用体验要好太多了。

阅读全文 »