不少朋友都问我要我帮着推荐人,比如:像途牛,鲜果,都在招各种各方各面的牛人:从产品经理到市场运营,另外似乎都招大量的PHPer 中国雅虎这边也有8~10个PHP工程师名额,也还很期待c/python等人才的加盟~,前端工程师也需求旺盛,有意从速. 以上职位都相当不错,我都恨不能把自己复制粘贴一堆出来,每个公司去一个… 我的邮箱/Gtalk:xurenlu@gmail.com,不换工作的也可以认识一下,哈,以后我可以改行做猎头~
相对HTTP模块,mail模块要简单的多,我决定从这里入手,改造一个基于nginx的memcache代理模块,并在这个模块的基础上也实现upstream,再做数据的分布,后端挂tokyotyrant做的key-value存储。于是先学学mail模块。
mail模块跟其他模块也差不多,初始化是在src/ngx/ngx_mail.c里;也是先设置对配置文件的解析: 遇到mail指令(mail指令是MAIN_CONF|CONF_BLOCK),则调用ngx_mem_block函数. ngx_mem_block函数做了什么? 1.挂载type是NGX_MAIL_MODULE的模块;(同时给这些模块排了序号),NGX_MAIL_MODULE类型的模块也做了排序. 2.接下来依次为各个模块创建一个mail_conf,和srv_conf,loc_conf; 注:ngx_mail_core_module看来是是最重要的mail类模块了。 3.解析mail{}里的内容 ,并依次调用各模块的init_main_conf和merge_srv_conf来初始化MAIN_CONF和SERVER_CONF内容。 4.把模块ngx_mail_core_module中定义的端口号加入要监听的端口列表:调用ngx_mail_optimize_servers函数;
ngx_mail_optimize_servers做了什么? 1.对所有要监听的地址和端口排个序,如果某个地址是*:80这样的监听所有IP的,就放到列表的最后,同时会忽略其他端口的监听(这不是废话么…) 2.建立建听。设置回调函数是ngx_mail_init_connection.该函数定义在:src/mail/ngx_mail_handler.c
ngx_mail_init_connection做了什么? 建session和log对象。 调ngx_mail_init_session函数建立会话(session)对象。
ngx_mail_init_session函数干了些啥? 1.取出协议的种类; 2.设置该连接的写回调是ngx_mail_send; 3.调用指定协议的init_session函数来执行真正的会话初始化;
以smtp协议为例,查看init_session做了什么? 1.如果resolver为空,则用ngx_mail_smtp_greeting函数直接输出欢迎信息。 2.如果不是互联网联接(应该就是本地socket连接了),也直接用ngx_mail_smtp_greeting函数直接打欢迎信息。 3.解析客户端地址: 设置解析成功的的回调函数为ngx_mail_smtp_resolve_addr_handler,开始解析客户端IP.
ngx_mail_smtp_resolve_addr_handler干啥了? 1.如果解析成功: a:记录host信息; b;设置读事件的回调函数为:ngx_mail_smtp_resolve_name 如果解析成功,最终还是调用ngx_mail_smtp_greeting函数打出欢迎信息; 2.如果解打失败,直接用ngx_mail_smtp_greeting函数打出欢迎信息。 ngx_mail_smtp_resolve_name干啥了? …我还没看. ngx_mail_smtp_greeting干啥了? 1.日志记录中写上“我们欢迎来自****的朋友”….哈哈。我瞎扯的。代码中有类似动作,日志中见不到。 2.设置读取事件超时 3.处理读事件。如果失败(没有收到信息,调用ngx_mail_close_connection断开链接。 4.设置读事件回调为ngx_mail_smtp_init_protocol; 5.设置要输出的东西为greeting信息,然后写往客户端。 ngx_mail_smtp_init_protocol干什么? 1.如果已经超时,关掉它! 2.创建好会话的buffer; 3.设置状态为ngx_smtp_start; 4.设置读取回调为ngx_mail_smtp_auth_state; 调用ngx_mail_smtp_auth来启动用户校验。 ngx_mail_smtp_auth做些啥? 1.如果已经超时,函数返回。 2。如果写缓冲中还有数据,函数返回。 3。读入一段;读入失败的话函数返回; 4. 对读到的命令做处理,用smtp_parse_command解析命令:接下来就是状态机处理了,喔喔喔喔…..
作为一名系统管理员,经常需要在各种机器中倒腾来倒腾去的。嗯,做为一个超级大懒人,我想了不少办法来一步步简化连接方法。请一条条看,瘟到死插屁用户请绕行。 Section one:从终端复制字符串到剪贴板的工具:xclip 这个只针对linux/unix等X用户有效。我在bash_profile中写了这么一行: alias pw=’echo PASSWORD|xclip’ 然后在要输入密码之前,先在终端中输命令pw,这个密码就存在粘贴板里了。然后接下来,你就粘贴就行了,简单地Shift+Insert键搞定。我最喜欢用的就是这个。嗯,简单实用。不用写啥代码。 Section Two:Expect Expect是一个perl工具,根据你事先设定好规则响应服务器端的某个输入。Yahoo的机器上有一个工具叫dist_install,每次操作至少要输3次密码,另一个yinst,也经常要输5次左右的密码,我就常常用这个来解压。不过这个要写脚本。 网上有现成的脚本可用,比如这里: http://blog.chinaunix.net/u/21908/showart_1178288.html
Section Three: sshpass:一个简单的能用参数方式指定密码的ssh 连接工具 这个工具的使用方法有两种: A: 设置SSHPASS环境变量,比如在bashrc/bash_profile中写上 export SSHPASS=’********’ 接下来用sshpass -e ssh some.host.yahoo.com [some commands] 就可以了。 B: 直接用-p参数指定密码:sshpass -p ****** ssh some.host.yahoo.com [some comands] 哦,忘了说了,这个sshpass是一个开源的工具,放在sourceforge上了,http://sshpass.sourceforge.net/;但是这个程序有问题,就是那个著名的第一次问题,第一次连接一个主机时会询问你是否要将这个host加入known_hosts;原来的程序会直接退出,我做了修改,改动后的版本在这里:http://github.com/xurenlu/sshpass 安装,很简单,用tar -xzf sshpass-1.0.4.tar.gz将之解压,然后cd sshpass-1.0.4,再配置一下:./configure,最后make && sudo make install就行了。 推荐用我维护的版本,嗯,原来程序除开key问题外还有个缓冲区过小的问题,我把它从40改到1024了。另外,程序代码非常不雅,从排版到命名都相当不规范。
有人在网上评价说Redis、mongodb等Key-value对的数据库,说redis特别牛,能支持列出所有的key; 其实tokyotyrant也是可以的呀,因为我看他底层持tcmdb,tchdb等都是支持遍历所有Key的,于是小小地做了一个改动,以支持列出的tokyotyrant的所有Key. 代码放在http://github.com/xurenlu/mc_list_patch_4_tokyotyrant上了。 用法: 1.启动ttserver: ttserver db.tch 3.telnet上去,试试set命令:
telnet localhost 1978 Trying 127.0.0.1… Connected to localhost.localdomain. Escape character is ‘^]’. set kw2 1 1 3 123 STORED list LIST 9 kw kw2 END 看这里,已经支持list命令了。 2 再用php客户端来连接:我还没有去用c写php的memcached客户端,就从网上找了一个php做的类,在git目录里有:
include “memcache.class.php”; $hosts = array(’127.0.0.1:1978′); $mc = &new MemCachedClient($hosts); var_dump($mc->listkeys()); 关于安装: 1.tokyotyrant基于tokyocabinet,需要先安装 tokyocabinet,请在http://github.com/xurenlu/mc_list_patch_4_tokyotyrant/downloads 下载.
~/download@aragorn $ wget http://cloud.github.com/downloads/xurenlu/mc_list_patch_4_tokyotyrant/tokyocabinet-1.4.41.tar.gz ~/download@aragorn $ tar -xzf tokyocabinet-1.4.41.tar.gz ~/download@aragorn $ cd tokyocabinet-1.4.41 ~/download/tokyocabinet-1.4.41@aragorn $ ./configure ….省却若干输出… ~/download/tokyocabinet-1.4.41@aragorn $ make && make install 接下来,请先下载tokyotyrant 1.1.37,可以在http://github.com/xurenlu/mc_list_patch_4_tokyotyrant/downloads 这里下载. 下载下来后,解压、patch:
~/download@aragorn $ wget http://cloud.github.com/downloads/xurenlu/mc_list_patch_4_tokyotyrant/tokyotyrant-1.1.37.tar.gz ~/download@aragorn $ tar -xzf tokyotyrant-1.1.37.tar.gz ~/download@aragorn $ patch -p0 < mc_list.patch patching file tokyotyrant-1.1.37/ttserver.c 然后编译tokyotyrant:
~/download/@aragorn $cd tokyotyrant-1.1.37 ~/download/tokyotyrant-1.1.37/@aragorn $ ./configure …..若干输出,略去.. ~/download/tokyotyrant-1.1.37/@aragorn $ make && sudo make install 接下来就可以启动ttserver来玩了。
Nginx 是一款轻量,高效的web server,我最近在学习他的扩展开发,这里是我的学习笔记:nginx扩展开发笔记
篇幅较长,请移步:tokycabinet/tokyo tyrant 文档. 一直还想把flare和mongodb,redis的文档也加进来,时间不够.有空再搞.
1.绍明批评我说,博客数据库回档了,丢失数据,也不出来道个歉。我说,没事,反正迟早都是要和谐的。君不见,博客大巴啦,51.com啦,域名不是也被ban吗。我这博客,丢也,也没关系。 2.新年,实在没什么好总结的。没什么好展望的。 3.做好准备,迎接宝宝的到来。 4.闭关一阵,嗯,准备成仙。 5.欲向某人讨要一份停用词表,因为,介个人是做搜索的,不过自己也觉得直接去要显得脸皮太厚了一点。于是在推特上发一推:万能的推特,请给我一份停用词表吧。没成想,没要到,tiny同志提醒说:去问万能的google吧。接下来我发现我被鄙视了:批评说,现在某些人啊,只知道有问题就来问别人,不知道自己动手解决问题。于是心里很郁闷,想:我找人要一份词表,干你鸟事啊,稀罕你装专家来教育人啊。不过后来一想,人家在推上发,全凭个人喜好。也没找上门来鄙视我,我又何必去和人理论一番呢。我不爽,说明我这个现在有点小得瑟,容不得他人批评,这是个不好的苗头。以后我还需要带团队,有很多事情需要去做,这种苗头,实在很不好。面对批评,不管批评得对与不对,先笑而纳之。有则改之,无则加勉。一旦动怒,再也没有人敢对你的不对提出批评了。人生最可怕的事情就是,你做错了事情,却没有人告诉你。古之圣人,尚一日三省其身呢。so,面对批评,平和心态,有则改之,无则加勉。 6.某程序员捐了一点点钱。我想任何人都无法承受这种大悲。凑一点,是一点。如果你也想尽一点点力,请点击这里: 7.本人在github上的page:http://github.com/xurenlu/。我希望在宝宝出生的时候,我能把nginx的扩展给理清楚。 好鸟,封闭修仙去鸟。
slowphp是由本人开发的一个简单的PHP扩展。目的在于记录web server上执行时间过长的php脚本。用法和mysql上的slow query极为相似。 代码地址:http://github.com/xurenlu/slowphp/.本周内即可完成全部功能。 版本: 1.0 示例:在php.ini中加入: extension=slowphp.so [slowphp] slowphp.long_query_time=3 slowphp.long_query_log=”/var/log/php_long_query.log” 然后重启yapache,运行一段时间后即可查看/var/log/php_long_query.php中记录下了慢脚本的启动时间,消耗时间和脚本路径。 下一步功能: 为了方便调试,下一步将在ini中多加这样两项配置: slowphp.long_query_log_probability=0.0001 slowphp.long_query_lock_file=”/tmp/open_long_query” 功能分别为: 1.有0.0001的概率记录当前脚本执行时间。 2.有/tmp/open_long_query文件存在时才记录脚本运行文件。 这样一来能极大地方便线上脚本运行效率的监控。
很多小技术team,面对快速成长的业务,感到力不从心。他们觉得,迫切需要牛人,可是牛人总是,不是要价高,就是只想呆大公司,还不想在小企业冒风险,要了高薪还要期权…其实,牛人不需要多,牛人不总是能呆得住,牛人不解决一切问题。我想总结点什么,不过没啥经验,嗯。随便想点儿。不算指导,算是留此存照,将来有机会自己拉队队干革命,希望能解决好这个问题。
嗯 团队成长是痛苦Di,费心Di,让人头疼地。小团队,要稳步前进。
嗯,基本上这些题都答得好 那就… 直接上题.