程序员装B指南

转自(源地址已经死链接了)

一.准备工作

“工欲善其事必先利其器。”

1.电脑不一定要配置高,但是双屏是必须的,越大越好,能一个横屏一个竖屏更好。一个用来查资料,一个用来写代码。总之要显得信息量很大,效率很高。

2.椅子不一定要舒服,但是一定要可以半躺着。

3.大量的便签,各种的颜色的,用来记录每天要完成的事务,多多益善。沿着电脑屏幕的边框,尽量贴满,显出有很多事情的样子。

4.工具书,orelly的,机械工业,电子工业什么的都可以,能英文就英文,不行影印版的也可以,反正越厚越好,而且千万不要放在书架上,一定要堆在桌上,半打开状。

二.从进门开始

0..绝对不10点以前出现在公司.

1.着装!着装!不管你是去实验室,或者去公司的大楼,在或者是小公司的民宅,或是自己创业的黑作坊;无论是春夏秋冬白天晚上刮风下雨电闪雷鸣台风 龙卷风,一个装b的程序员都要十分在意自己着装!这里只提出参考建议。初级装:衬衣+牛仔裤+休闲鞋。中级装:T恤+宽松短裤+拖鞋。高级装:背心+宽松 大花裤衩+人字拖。

2.得体的举止。在走廊以及任何形式的过道里,一定要双手插兜,走得像个痞子,至少要看起来有点反社会,如若不行,可走文弱天才型geek路线。。

3.如果有女性在你背后指指点点,小声嘀咕说这一定是一个技术男的时候,应该先低头,然后保持低头状态,缓缓回头,坏坏地蔑笑但是不要出声,然后快步前行。

4.进门后,一定不要跟任何人打招呼,笔直走向自己的位置,最多路过打一杯咖啡,千万不要有多余的动作,显示出自己的专注与心无旁骛。

三.坐下就不要再动了

1.坐下以后,姿势需要略微后仰,能翘着二郎腿最好了,然后在后仰的情况下低着头,以便看到屏幕,然后千万就不要再动了。

2.粗暴地把电脑前的大堆书推开一个口,然后摘下电脑上的一个便签,看一眼,不过3秒,可以开始coding了。

3.能不用IDE就不要用,实在装不了,无论IDE是什么,一定要调成DOS那种黑色背景的。

4.如果写前台界面,就不停地调试后台代码;如果写java,就在里面混编C;如果写C,就在里面混编汇编。不光要coding,还要时不时的翻出一本什么英文的书翻一翻,看不懂就看看插图,然后扔到面前假装懂了继续coding。

5.什么看起来高端就用什么,不要管实用不实用。例如对C++:switch统统重构成多态;如果有指针,统统改成智能的;C++一定要自己写 template;数字是全部要替换成宏的名字能起多长就起多长;struct就不要出现了,如果出现,也一定要用__attribute__修饰一下; 运算都是位操作的;操作符都是重载的;网络都是并发缓冲线程池的;int只用int32_t声明的;继承不用普通的,什么多继承虚继承 啊;helloworld也要写捕获异常的;后人一看代码,中间一堆关键字 extern,asm,auto,XXXXX_cast,volatile,explicit,register,template,让一般总在敲 int,if,else,for的小程序员顿时心生崇拜。

6.注释?算了吧。只有两个路线可以选:一,变量名起得巨长无比,看代码就和读英文文章一样顺畅,根本不需要加注释。 二,代码无比晦涩,加不加注释根本无影响。

7.千万不要用IM工具交流,千万不要问同事问题,显得自己没有水平,都是自己上网或者查书。

8.无论是同事间开玩笑或者发生任何群体性事件,不要抬头,更不要东张西望,即使地震火灾,也一定要先提交代码再行离开。

四.潇洒地离开

1.人走,主机是千万千万不能关的,至少要跑个daily build,实在不行正在svn提交也勉强算过关。

2.书应该已经又堆到屏幕前了,千万不要整理,明天再来推开。

3.不强求最后一个走,但一定要所有的非程序员,什么市场啊前台啊pm啊都走光了,才可以走。

4.走得时候一定要率性,千万不要收拾任何东西,站起来,出门,好的,就这样。

5.如果今天一定要说句话的话,找到那个最苦逼的程序员,跟他说,你进度太慢了啊,不要老让我等你。

就写这么些吧。

使用lsof命令查问题一例

因为一个bug,导致httpd进程中一些文件描述符(后称fd)不能正常关闭,当无法关闭的fd累计到limit限制的最大描述符后,继续打开文件将出现“too many open files”的情况,导致影响服务;

下面是如何查看哪些进程出现了“too many open files”的情况:

 

关于tokyotrant的内存使用问题

同样是互为主从的两个tokyotrant进程,数据量和数据条目(基本)相同,但是内存使用却差别很大,却是为何? 是内存碎片还是内存泄露?

 

 

4131端口的内存map如下:

 

 

4141端口的内存map如下:

 

 

PHP的mongo模块连接失败的处理

实例代码:

 

  1. 当IP地址可以ping通,但是端口未开启时(直接返回Reset数据包),返回错误信息为:
    错误号: 0; 错误信息:Transport endpoint is not connected
  2. 当IP地址不能ping通,或者发送syn数据包,但是不能收到Reset或sys-act数据包时,返回错误信息为:
    错误号: 0; 错误信息: Operation now in progress

 

了解了一下gravatar

概述

Gravatar是Globally Recognized Avatar的缩写,是gravatar推出的一项服务,意为“全球通用头像”。如果在Gravatar的服务器上放置了你自己的头像,那么在任何支持 Gravatar的blog或者留言本上留言时,只要提供你与这个头像关联的email地址,就能够显示出你的Gravatar头像来。

申请Gravatar

步骤很简单,如果你也有兴趣想做看看,就跟着一起试作吧:

(一)、首先是到Gravatar网站上去注册一个账号,很简单,只要填写一个你最常用的email,接着输入两次密码,送出之后,系统会寄一封确认信到你的信箱,开信,点一下启用账号连结即可。

(二)、接着,到Gravatar去登入,登入后,就可以开始上传你的图片了。格式支持JPG/GIF/PNG,推荐使用JPG和PNG格式 (Gravatar已经支持透明PNG图片)。另外,Gravatar在11月底开始支持摄像头拍照功能,这项功能由来自中国的工程师设计、开发。图片上 传完成后,等待着网站的管理员对头像图片分级(G 普通级、PG 辅导级、R 和 X 为限制级)。

注:一般来说24-72小时就可以审核通过。如果图片不含暴力或者暴露内容,多半会得到G级别的等级。通过之后这个头像就可以使用了。在任何支持Gravatar的地方,在填写email地址时,请填写你申请注册头像用的这个email地址。你的头像就会出现在留言中。另:WordPress2.5之后已经直接支持Gravatar,如果想在老版本的WordPress的留言中显示Gravatar头像,可以安装Gravatar2插件,它是由Gravatars改进而来,能缓存头像,这样可以减轻Gravatar的负担和加快显示速度。官方也提供了WordPress Gravatar Plugin插件。

wordpress 的一个问题

在wordpress中添加代码高亮更之后,发现文章可以编辑但是不能显示,将需要高亮的代码去掉之后,文章可以显示。于是,认为问题出现在代码高亮上,但是怎么检查、调试都不能发现哪里有问题。

尝试将高亮的代码部分写一篇新的文章,可以正常显示,更加郁闷。

最后,发现去掉其它部分内容,也能是的显示文章的,怀疑是文章内容太大了,毕竟里面有两个大图片,将其中一个图片转换为附件形式,问题解决。

不明白为什么可以编辑却不能显示,可能是显示过程中某个处理环节出错了,暂且不嵌入大图片,图片尽量使用附件,有时间再解决这个bug吧。

伤心的泪水,血的教训。。。

Bo-Blog2WordPress 时遇到的问题

引子:

因为Bo-Blog2WordPress时丢失了200多篇文章,所以重转一次试试,这时表前缀设置为wp2_ ; 仍然时候BoWP.php 来转, 虽然内容确实写到了wp2_ 为前缀的表中,但是管理后台却无法登录,查了一通,发现在usermeta表中的”wp_user_level” 中的wp_ 应该和表前缀相同,修改为 wp2_user_level 后,问题解决。

 

修改后的转换程序: BoWP.php

 

php 的一个bug

 

Bug描述
在使用file_get_contents($ur);请求一个$url 时,如果server在http请求头还没有完全输出时就意外关闭了连接,则file_get_contents($ur)将因无法读取完整的数据而陷入死循环,这时,进程占用cpu约 100%

影响版本
本次故障出现在PHP-5.3.3 ,相信此前的版本中应该也存在;以后的版本就不得而知了

Bug重现方法

server.php

 

client.php

 

在A终端模拟server端:

 

在B终端执行client.php

在C终端观察client.php 的执行情况

使用gstack查看堆栈状况:

使用gdb分析,参看脚本: php-5.3.3/ext/standard/http_fopen_wrapper.c

可以通过: https://svn.php.net/repository/php/php-src/tags/ 直接查看,在php5.4中还没有修复该bug

 

 


解决办法

提交bug 到 php.net, bug地址: https://bugs.php.net/bug.php?id=63338

关于从终端执行程序的问题

通常在一个终端执行一个耗时很长的程序时,我们使用nohup来执行,避免终端关闭时程序退出; 程序退出多半是程序需要输出,而输出终端已经不存在了,导致IO错误。

下面观察了一下test.php 的程序在终端执行的情况:
<?php
while(1) {
    echo "hello world\n";
    sleep(5);
}

————————————–
在一个终端启动程序:
php test.php
# ltrace  -p 19197  
write(1, "hello world\n", 12)                                                     = 12
fflush(0x8515c0)                                                                  = 0
sleep(5)                                                                          = 0
write(1, "hello world\n", 12)                                                     = 12

在另一个终端使用gdb调试该进程,当前一个终端关闭时,程序因写失败而进入函数php_handle_aborted_connection ; 这里将连接状态设置为abort,然后检查是否忽略连接abort,因为我设置为不忽略,所以程序退出了。修改程序,添加 ignore_user_abort(true); 这样的话,终端退出后,进程也不会退出了。但是,我们就又发现另外一个现象,这时候使用ltrace跟踪时,write调用没有了,因为php使用函数:php_ub_body_write_no_header 输出时,检查了变量output_globals.disable_output, 而该变量在发现连接断开时被置为 1 , 所以再也看不到输出了。

奇怪的是,使用ltrace跟踪的使用,命名是使用write系统调用输出的,gdb调试时,给write函数设置断点,居然不能拦住????