今天有同学问如何用 grep 匹配 tab,想到这么几个方法:
- 在匹配模式里写上一个真正的 tab (bash下):
-
grep foo$'\t'bar … -
[ESC] tabORC-v tab
-
- 用 awk:
awk '/\t/' … - 有支持 PCRE 的 grep (编译时没有打开
--disable-perl-regexp),加上开关-P:grep –P '\t' … - 换个真正的工具:
perl
今天有同学问如何用 grep 匹配 tab,想到这么几个方法:
grep foo$'\t'bar … [ESC] tab OR C-v tab awk '/\t/' … --disable-perl-regexp),加上开关 -P : grep –P '\t' … perl
Tags: grep, shell, tab, tips
Posted in tech | 1 Comment »
如果设定了timer_resolution并在自己的模块中调用了ngx_localtime(),nginx极有可能失去响应。
原因看来是localtime_r(3)信号不安全。nginx内部会用ngx_time这个变量中存下当前的时间,默认是在每次event循环中更新这个变量,减少gettimeofday(2)的调用次数。设置timer_resolution参数会导致nginx使用SIGALRM信号来定时更新,作者认为这样会有更好的精度。触发信号处理函数ngx_timer_signal_handler()后,里面调用ngx_localtime(),最后落实到glibc的localtime_r(3)。由于localtime_r(3)信号不安全,这样自己的模块代码中也进行了ngx_localtime()调用的话,两者很容易冲突而死锁(不知道我说清楚了吗)。
这个问题看起来也没什么好修正的,不要在自己的模块里面用ngx_localtime()就好了。如果不需要设定timer_resolution,可以假装一切都很正常。我现在使用ngx_timeofday()/ngx_gmtime()来格式化时间,目前情绪稳定。
Update: nginx 0.7.66 已经修正了此问题。
参考:
ps: 为了这篇post,山寨了个在Windows Live Writer里面给选定文字加<code>标签的插件,有需要的同学吗……
Tags: dev, module, nginx, timer_resolution, webserver, 模块开发
Posted in tech | 1 Comment »
Windows 下面有最小化所有窗口的快捷键, 但默认没有最小化当前窗口的快捷键. 解决方法(之一)是使用仅16.5k的神器 HoeKey.
安装运行 HoeKey 后, 按Win+Q呼出配置界面, 选择编辑配置文件, 加入一条:
~0=Msg||274|61472
这样就可以用快捷键 Win+0 来最小化当前窗口了.
同理可以写 ~9=Msg||274|61488 来用 Win+9 最大化当前窗口.
Tags: hoekey, hotkey, minimize, shortcut, tips, window
Posted in tech | 4 Comments »
lighty 1.4 的 setenv 模块是可以操作 http 头的, 但它提供的三个指令实际只是把给定的值附加进去, 如果处理的请求本来有同名的头, 会变成这样: Host: foo.com, bar.com
对 X_FORWARD_FOR 这样的头可以如此处理, 但 Host 之类就不是希望的结果了.比如作为代理时, 伺服的主机名和后端伺服的不同, 需要覆盖掉 Host 头.
lighty 1.5 和 nginx 都提供了对应的指令, 1.4 下面得自助. 这里我添加了一个 set-request-header 指令, 顾名思义(set vs add), 会用给定值覆盖设置请求头的值. 响应头的因为我用不到所以没实现, 需要的同学自己折腾吧.
patch 放在 lighty 的论坛上, 但几个月了没人理, 是没人需要鹰语太烂还是要开 issue 才行?
Tags: dev, header, http, lighttpd, lighty, module, set, webserver, 模块开发
Posted in tech | 2 Comments »
我(曾经)觉得 HttpWatch 比 Fiddler 强的一处是,可以显示当前 http 会话中对话主机地址。其实 Fiddler 也早就可以了,而且更强大。方法是点菜单的Rules > Customize Rules,找到并修改文件中的Main()部份:
static function Main()
{
FiddlerObject.UI.lvSessions.AddBoundColumn("HostIP", 50, "x-
hostIP");
}
Fiddler 的订制能力挺强,参考它的文档可以加入很多元素。它的作者人很好,论坛里面帖子回复很及时。
另外,由于 .NET 中DNS.Resolve()不会进行缓存,所以在 Fiddler 代理时对 hosts 文件的修改可以即时生效。
Tags: dev, fildder, http
Posted in tech | 6 Comments »
前阵子在折腾Nginx的模块, 很有趣.
为了方便使用调试器, 可以单进程非daemon方式启动, 使用参数:
daemon off;
master_process off;
因为Nginx是事件驱动, 在读request body时, 第一个数据包一般发送不全, 需要异步读取余下的.
当在主handler部分调用ngx_http_read_client_request_body时, 需要注册一个回调的handler, 然后主handler直接返回NGX_DONE, 告诉Nginx留下这个请求的事件注册, 继续接收数据包.
经过若干次循环最终读完request body后, Nginx会去回调被注册的handler, 在此函数中产生响应, 最后调用ngx_http_finalize_request结束整个请求. 大概流程是:
ngx_http_foo_handler(){
ngx_http_read_client_request_body(r, ngx_http_foo_post_handler);
return NGX_DONE; // 主handler结束
}
ngx_http_foo_post_handler(){
// 请求全部读完后从这里入口, 可以产生响应
ngx_http_finalize_request(r, NGX_HTTP_OK);
}
一般的模块都是同步方式的, 我开始就没搞明白这异步读到底怎么搞, 走了不少弯路. 代码上可以简单参考dav模块, 复杂点还有upload模块.
Nginx可能会把request body放到两个buffer里面, 太大的话也可能存入文件中. 如果要在模块中读取request body进行处理, 自然不希望搞太麻烦,可以:
r->request_body_in_single_buf = 1;
使body存在一个buffer里面, 配置里面要留够需要的大小.
如果没有特殊的要求, 这类模块也可以拿 embedded perl 来写. 响应产生, sendfile都支持. Perl的开发效率自然很高, 维护也方便. 作者说此功能还是"experimental", 但实测了下没出啥问题.
我本着先写原型的目的试验了下, 结果发现性能还不错, 在双路5130机器上, perl版本的可以达到15k req/s (使用ab测试), 非常够用了.
Tags: dev, module, nginx, perl, webserver, 模块开发
Posted in tech | 2 Comments »
通过ssh来存取svn仓库自然是很方便的,不用架设webdav服务器,不用多侦听一个端口等等,一般的可以这样:
svn co svn+ssh://host/path/to/svn/repos
如果ssh不工作在默认的22端口上,如2222,有两个办法解决。
设置SVN_SSH变量:
export SVN_SSH="ssh -p 2222"
编辑~/.subversion/config,其中有tunnel一节,加入:
proa = ssh -p 2222
然后就可以这样用了:
svn svn+proa://host/path/to/svn/repos
如果遇到错误"bash: svnserve: command not found",是因为svn调用ssh后得到是非登陆shell。可以试着在放置svn仓库的服务器上加入相关路径到.bashrc,或者给svnserve在/usr/bin下面加个符号链接,确保非登陆shell可以找到svnserve。也可以搞的很复杂:
生成一个新的ssh密钥对,用下面的格式把公钥放到svn服务器上
command="/full/path/to/svnserve -t" TYPE KEY COMMENT
客户机上安上面指定端口的方法指定svn用特定的私钥
export SVN_SSH="ssh -p 2222 -i /home/dude/.ssh/id_svn_only"
这样svn在通过ssh隧道连接时就可以启动svnserve了。
大约需要的人早找到了英文的资料,不过我想用中文写出还是有人会看的。为什么还要用svn这么土的东西?当然是历史原因了。
Tags: dev, ssh, svn, tips
Posted in tech | 3 Comments »
我觉得XShell是Windows上目前最好的终端模拟器,但似乎大家只看到SecureCRT,很少人提XShell。
XShell vs. SecureCRT
XShell vs. Putty & Pietty
当然putty是自由软件,和商用的XShell比较不是很合适。putty也有很多插件可以实现部分有缺憾的功能,用起来会麻烦一些就是了。我个人平常还是以putty为主,功能够用,速度飞快。大量机器的管理还是XShell合适。
注意,XShell在商业环境使用下是需要买许可的。
update:
SecureCRT 使用screen时屏幕闪烁,关闭 visual bell 就好了,putty 也是如此:
$ cat >> ~/.screenrc
# turn visual bell off
vbell off
Tags: ssh, tips
Posted in tech | 6 Comments »