2015年4月

我之前写过很久 PHP, 但现在是 PHP 黑,简单说一下原因。

语法设计不合理


这个诚然有历史原因,但确实是不合理。

命名空间用()分隔,简直丧心病狂;对象成员用(->)访问,略显繁琐
函数名不区分大小写,老版本的类名也不区分大小写,而变量名却区分大小写
数组的写法繁琐(array()),直到 5.4 才有简写语法([])
这样function test_array(array $input_array), 可以限制参数的类型,适用于类和数组,却不适用于int 和 string
unset, echo, empty, list 长得像函数,却不是函数
直到 5.4 才支持 func()[0] 这种写法
大部分内部函数默认不会抛出异常,导致 PHP 中存在两套独立的错误处理机制
很多被弃用的功能仍被广泛使用,新的功能被普及得很慢

这个是使用者的事情,但情况就是如此。

在开源软件中更为突出,比如 WordPress 为了尽可能兼容旧的 PHP 版本,没法用上例如匿名函数(5.3), 数组简写语法(5.4) 这种能够大幅改善代码可读性的功能。

下面是一些被弃用的功能,这些功能大多是设计上存在失误,后来因为可能导致潜在的问题被弃用,但因为网络上互相转载的一些不靠谱教程,所以很多人依然在使用。

__autoload
mysql_* 系列函数
Register Globals
Magic Quotes
Safe Mode

缺少好用的包管理器和依赖管理方案


PHP 和 Python, Ruby, Node.js 在使用领域上是有一定重叠的,我们来比较一下包的数量:

PHP Composer: 46k
Python PyPI: 53k
Ruby Gems: 94k
Node.js NPM: 116k
虽然包的数量不代表质量,但是代表了人们是否愿意发布和使用包。

Composer 在 PHP 中的普及率恐怕不及上面其他三款包管理器,比如作为最火的博客程序 WordPress, 和国内的 Typecho 都没有使用 Composer, 而是直接在源代码中包含所有依赖。

必须为每个请求创建一个单独的进程


PHP 必须为每个请求创建一个进程(或线程),这导致在高并发的情况下会占用大量内存。

在 PHP 中很难创建一个资源,并让它可以在全局范围内,可以被所有请求访问到,只能通过外部的数据库或缓存来实现。亦没有办法定义一项任务,独立于其他请求运行,只能通过单独的任务队列来解决。虽然这两个问题并不严重,但无法轻量级地维护全局的状态,算是一个缺憾。

PHP 是为 Web 优化的编程语言


可以直接用 $_GET 和 $_POST 访问来自客户端的 GET 和 POST 数据
可以用 <?php ?> 的方式嵌入到 HTML 文件中
现在大多数 Web 程序,往往都是 MVC 架构,在这种架构下,具有额外语法糖的 PHP 并不会比通用编程语言更好用。

相反的方面,虽然 PHP 可以用于 Web 之外的场景,但坑实在是多。例如缺少好用的异步流程控制的方案等。

你想要的往往不是你真正需要的
这话一点不假
总有那么一个时刻
每个年轻人都面临着重要的选择
是选择安逸的生活
还是独当一面
外面的世界充满了危险
然而没有挑战的生命
注定无人喝彩

母亲给了我们生命和温暖的童年
而只有阅历才能让我们真正的成长
前路或许有面目狰狞的敌人
也有意想不到的转折
如果够幸运
你一定会趋吉避凶
在奔跑中度过非凡的一生

修改阿里云CentOS Linux服务器的主机名(实例名)

阿里云主机的默认主机名是为AY开头的随机名称,如何修改为易于区分的友好名称呢?请看下面的操作步骤:

vi /etc/hosts

i键,修改主机名,esc键,:x键保存退出

vi /etc/sysconfig/network

i键,修改主机名(HOSTNAME=),esc键,:x键保存退出

输入以下命令:

hostname 新主机名

然后用ssh重新登录,就会显示新的主机名。

各领域毁我三观的书单飘过,一句话短评,领走不谢。

【思维方法软技能】


人生定位 (原书叫“赛马理论”,颠覆我的人生规划,如何投入少回报大,而不是傻努力。)
你的灯亮着吗? (如何分析解决问题的思维方式)
策略思维 (实用博弈论,有很多技巧在生活和商业上都用得到。)
学会提问 (如何和别人正确讨论问题,能够有自己的判断力,不再被别人牵着鼻子走)
沃顿商学院最实用的谈判课(颠覆你对“谈判”的了解,谈判不是辩论也不是吵架,而是信息交换)
穷查理宝典 (巴菲特推荐,成功学)
金字塔原理 (迅速提升写报告做演讲的水准,看完以后写知乎答案都更有效率了呢)
思考,快与慢 (这书都烂大街了。。。可以当做闲书来看的。)

【科普】


科学究竟是什么 (整天说这个科学那个不科学,这本书帮你建立科学科学观,什么是科学!)
与“众”不同的心理学 (还在说弗洛伊德?觉得心理学很神秘?这本书告诉你理解的心理学错了!)
复杂 (复杂科学史,进入一个新的科学领域,看了4遍,每次都热血沸腾想去SFI的暑期学校!)
哥德尔、艾舍尔、巴赫 (故事化给你讲高深的世界本源。太厚没看完,通俗易读但就是太厚了!)
生命是什么 (薛定谔跨界之作,也写得很易读,而且好消息是,很薄!!!!!!)

【文史哲政】


休谟散文集 (休谟答知乎问,小清新谈谈哲学谈谈婚姻,和主流知乎体非常不同。)
阿特拉斯耸耸肩 (安兰德的理性利己主义,精彩!就是又厚又啰嗦。)
人生的枷锁 (毛姆经典,反电视剧三俗情节,我学会了“不是努力就有回报”“不鸟你的女生最有吸引力”。。。)
君主论 (站在统治者高度看问题,会有新想法,虽然作者失败了。。。)
枪炮、病菌与钢铁 (社会命运,一切源于新月沃地)
崩溃 (楼上的姊妹篇)
第三种猩猩 (了解你自己,嗯,要不再推荐裸猿三部曲吧)
卡尔维诺文集(脑洞大开!什么奇幻小说和他比简直弱爆了!)
博尔赫斯小说集 (既然有卡尔维诺就要有博尔赫斯,一个是奇幻界小清新,一个是奇幻界死黑)
银河系漫游指南 (科幻梗不解症治疗指南,马文太逗了啊马文!)

【传记】


别闹了,费曼先生 (科学界顽童经典,一切源于好奇,读后让你觉得做自己爱做的事才是最好的生活)
三双鞋 (Zappos老大谢家华自传,一个懒蛋有喜感的创业心路历程)

【创业商业】


精益创业 (创业必读方法论,我见一个客户推荐一次)
诡辩与真相 (非官方经济学的另一种解读)
人月神话 (项目管理必读,让你知道为什么你有那么多工程师,开发速度却还是那么慢。)

【修身养性】


禅者的初心 (乔布斯教主的第一本禅修书,教打坐没神好说的,有很多看事物的心态很奇特。)
你的误区 (心理亚健康人群必读)
这书能让你戒烟 (黄继新推荐,让老烟枪不吸烟的奇书)

更多详情: http://www.zhihu.com/question/26647663/answer/35511459

起因
最近使用nohup创建了一个后台进程,默认日志输出到了nohup.out文件中,程序跑起来也就没再管,过了大约一周,发现硬盘空间不够了,于是查找原因,发现这个nohup.out文件已经到了70G了,导致硬盘空间不足了。

解决方案

只输出错误信息到日志文件

nohup ./program >/dev/null 2>log &

什么信息也不要

nohup ./program >/dev/null 2>&1 &

知识补充,关于Linux的重定向

Linux的3中重定向

0:表示标准输入

1:标准输出,在一般使用时,默认的是标准输出

2:标准错误信息输出

可以用来指定需要重定向的标准输入或输出。例如,将某个程序的错误信息输出到log文件中:./program 2>log这样标准输出还是在屏幕上,但是错误信息会输出到log文件中。另外,也可以实现0,1,2之间的重定向。2>&1:将错误信息重定向到标准输出。

关于/dev/null文件

Linux下还有一个特殊的文件/dev/null,它就像一个无底洞,所有重定向到它的信息都会消失得无影无踪。这一点非常有用,当我们不需要回显程序的所有信息时,就可以将输出重定向到/dev/null

xx(临时响应)
表示临时响应并需要请求者继续执行操作的状态代码。

代码 说明
100 (继续) 请求者应当继续提出请求。 服务器返回此代码表示已收到请求的第一部分,正在等待其余部分。
101 (切换协议) 请求者已要求服务器切换协议,服务器已确认并准备切换。

2xx (成功)
表示成功处理了请求的状态代码。
代码 说明
200 (成功) 服务器已成功处理了请求。 通常,这表示服务器提供了请求的网页。
201 (已创建) 请求成功并且服务器创建了新的资源。
202 (已接受) 服务器已接受请求,但尚未处理。
203 (非授权信息) 服务器已成功处理了请求,但返回的信息可能来自另一来源。
204 (无内容) 服务器成功处理了请求,但没有返回任何内容。
205 (重置内容) 服务器成功处理了请求,但没有返回任何内容。
206 (部分内容) 服务器成功处理了部分 GET 请求。

3xx (重定向)
表示要完成请求,需要进一步操作。 通常,这些状态代码用来重定向。

代码 说明
300 (多种选择) 针对请求,服务器可执行多种操作。 服务器可根据请求者 (user agent) 选择一项操作,或提供操作列表供请求者选择。
301 (永久移动) 请求的网页已永久移动到新位置。 服务器返回此响应(对 GET 或 HEAD 请求的响应)时,会自动将请求者转到新位置。
302 (临时移动) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。
303 (查看其他位置) 请求者应当对不同的位置使用单独的 GET 请求来检索响应时,服务器返回此代码。
304 (未修改) 自从上次请求后,请求的网页未修改过。 服务器返回此响应时,不会返回网页内容。
305 (使用代理) 请求者只能使用代理访问请求的网页。 如果服务器返回此响应,还表示请求者应使用代理。
307 (临时重定向) 服务器目前从不同位置的网页响应请求,但请求者应继续使用原有位置来进行以后的请求。

4xx(请求错误)
这些状态代码表示请求可能出错,妨碍了服务器的处理。

代码 说明
400 (错误请求) 服务器不理解请求的语法。
401 (未授权) 请求要求身份验证。 对于需要登录的网页,服务器可能返回此响应。
403 (禁止) 服务器拒绝请求。
404 (未找到) 服务器找不到请求的网页。
405 (方法禁用) 禁用请求中指定的方法。
406 (不接受) 无法使用请求的内容特性响应请求的网页。
407 (需要代理授权) 此状态代码与 401(未授权)类似,但指定请求者应当授权使用代理。
408 (请求超时) 服务器等候请求时发生超时。
409 (冲突) 服务器在完成请求时发生冲突。 服务器必须在响应中包含有关冲突的信息。
410 (已删除) 如果请求的资源已永久删除,服务器就会返回此响应。
411 (需要有效长度) 服务器不接受不含有效内容长度标头字段的请求。
412 (未满足前提条件) 服务器未满足请求者在请求中设置的其中一个前提条件。
413 (请求实体过大) 服务器无法处理请求,因为请求实体过大,超出服务器的处理能力。
414 (请求的 URI 过长) 请求的 URI(通常为网址)过长,服务器无法处理。
415 (不支持的媒体类型) 请求的格式不受请求页面的支持。
416 (请求范围不符合要求) 如果页面无法提供请求的范围,则服务器会返回此状态代码。
417 (未满足期望值) 服务器未满足"期望"请求标头字段的要求。

5xx(服务器错误)
这些状态代码表示服务器在尝试处理请求时发生内部错误。 这些错误可能是服务器本身的错误,而不是请求出错。

代码 说明
500 (服务器内部错误) 服务器遇到错误,无法完成请求。
501 (尚未实施) 服务器不具备完成请求的功能。 例如,服务器无法识别请求方法时可能会返回此代码。
502 (错误网关) 服务器作为网关或代理,从上游服务器收到无效响应。
503 (服务不可用) 服务器目前无法使用(由于超载或停机维护)。 通常,这只是暂时状态。
504 (网关超时) 服务器作为网关或代理,但是没有及时从上游服务器收到请求。
505 (HTTP 版本不受支持) 服务器不支持请求中所用的 HTTP 协议版本。

在CentOS 6更新后,不可避免的会在启动选项中产生多个内核选项,一个内核文件大概占100兆左右(一般100M以下),可以使用以下命令进行删除多余的内核.

1.首先列出系统中正在使用的内核:

# uname -a

2.查询系统中全部的内核:

# rpm -qa | grep kernel

3.将你想删除的内核删除掉:(例如,在我的系统中,我要删掉2.6.32-71.el6.i686的内核,需要把所有含有2.6.32-71.el6.i686字样的全部删掉)

#yum remove kernel-2.6.32-71.el6.i686
#yum remove kernel-devel-2.6.32-71.el6.i686

4.重启后就可以看到,内核被删掉了,同时多余的启动项也自动被删掉了,不需要自己手动修改/boot/grub/menu.lst

在默认情况下,linux终端输出的文字并不是彩色的。那么,如果想让linux输出彩色文本,那么应该怎么做呢? `echo -e
"e[1;颜色代码m显示的文字e[0m"`

  • 红色:31
  • 绿色:32
  • 黄色:33
  • 蓝色:34
  • 洋红:35
  • 青色:36
  • 白色:37
  • 黑色:38