问号在正则中的特殊作用

表示是否匹配

可以用来表示某个字符是否匹配

>>> print a
a123b123b
>>> print re.match(r"a0", a)
None
>>> print re.match(r"a0?", a)
<_sre.SRE_Match object at 0x100578780>
>>> print re.match(r"a0?", a).group()
a

也可以用来表示某个组是否匹配

>>> print a
a123b123b
>>> print re.match(r"a(1234)", a)
None
>>> print re.match(r"a(1234)?", a …
more ...

cat文件时文件访问时间没有改变

Linux文件系统中,每个文件有三个时间属性:atime(access time)、mtime(modify time)、ctime(change time)

其中atime比较容易理解,即文件的最后访问时间,mtime和ctime有点容易混淆。其中mtime是文件内容的最后修改时间,而ctime是文件inode、属性的最后修改时间。

如果有一个文件123:

  1. echo "test" >> 123会修改文件的mtime和ctime,mtime修改是因为文件内容多了一行"test",ctime修改是因为文件大小(属性)改变了。
  2. chmod +x 123则会修改文件的ctime,因为文件属性改变了,但是内容没有变
  3. 如果cat 123,则会修改文件的atime

操作步骤如下:

image

但是,最近发现一个情况:cat一个文件的时候文件的atime有时改变又是不改变。比如上图中最后一次cat并没有使得文件的atime发生改变。

细细研究了一下,原因如下:

如果每次打开文件的时候,都更新文件的atime,这对系统来说,I/O的负担比较大,影响了系统的性能 …

more ...

从Mac同步文档到iphone

最近迷上了一部电子书,电脑上下载下来想传到iphone好上下班的时候在路上看。

把几个txt文件从mac传到iphone,本来以为数据线连接mac和iphone直接拖拽一下就好了,没想到这么个简单的问题折腾了快一个小时。

感觉apple的易用性还有待提高,这都还是自家的产品,共享一个txt文档还这么麻烦(如果是图片、音乐啥的还是很方便的)。

好了,本帖的目的不是吐槽,最终发现几个比较简单的方法,记录一下:

1. mac安装iFunBox

mac上安装iFunBox,连接iphone之后,从iFunBox中可以看到iphone各APP的目录,直接把txt文件复制到某个阅读器APP下即可。

2. iphone安装Apabi Reader(需要iphone连接上Wi-Fi和mac位于同一局域网)

iphone安装Apabi Reader,打开Apabi Reader,最左下角有个无线信号的标志,点击打开。按提示,在mac浏览器中打开一个网址,就可以把文档复制到iphone中了。

如果iphone连接了Wi-Fi,且和mac位于同一局域网,这个方法还是蛮推荐的。况且装个Apabi Reader也不错,蛮好用的阅读软件。

3. iphone安装kindle

注意这里的kindle是指kindle APP,apple store可以下载,然后申请一个kindle账户。最后通过电子邮件把txt文档以附件的形式发送到你的kindle账户,过一会你打开kinlde app,就可以看到服务器端有这个文档了 …

more ...

TCP建立和断开连接过程中的状态转换

最近看到netstat中的一些状态,比较好奇,整理了一下tcp连接建立和断开过程中的状态转换。

为了简单起见,这里没有包含一些异常情况。

另外有些状态转换具体是发生在收包还是收包+发包后,还没有搞清楚,比如TCP建立过程中,Server从LISTEN到SYN_RCVD状态的变化,是在接受到SYN包的时候还是在接受的SYN包然后发出ACK+SYN之后。但因为收包+发包都是在一台机器做的,轻载的情况下这两者之间的时间应该可以忽略,暂且把它们画在一起,认为几乎同时发生且状态转换在此之后。

TCP建立过程,如下图:

image

TCP断开过程,如下图:(断开过程的状态转换可能有两种情况)

image

image

备注:

MSL=Maximum Segment Lifetime

more ...

使用linux mail发送邮件及一些问题解决

使用方式如下:

echo "test" | env from="fromaddress@yourdomain.com" mail -s "$(echo -e "title\nContent-Type: text/html")" toaddress@dianping.com

or

env from="fromaddress@yourdomain.com" mail -s "$(echo -e "title\nContent-Type: text/html")" toaddress@dianping.com < "context.html"

其中:

  1. 通过设置from变量来修改邮件的发件人
  2. 通过-s指定邮件标题,Content-type指定文件内容格式,chareset指定编码
  3. 通过管道echo "test" |或者<写入邮件内容,可以是文本也可以是html格式

不过在使用过程中遇到两个问题导致邮件发送失败 …

more ...

maven dependency:tree中反斜杠的含义

一个mvn dependency:tree命令执行的输出如下:

[INFO] +- junit:junit:jar:3.8.1:test (scope not updated to compile)  
[INFO] +- com.dianping:easyUtil:jar:0.0.2-SNAPSHOT:compile  
[INFO] | +- org.slf4j:slf4j-api:jar:1.5.8:compile  
[INFO] | +- org.slf4j:slf4j-log4j12:jar:1.5.8:compile  
[INFO] | | \- log4j:log4j:jar:1.2.14 …
more ...

python 打印数字的正负号

python中使用print "%d"%i时,默认是不显示"+"号的:

>>> print "%d"%123  
123  
>>> print "%d"%-123  
-123

有没有方法在print "%d"%123显示"+123"呢? 很幸运,是有的,使用print "%+-d"%123print "%+d"%123即可。

more ...

python join不响应信号

python在写多线程程序时,发现多线程启动之后,用ctrl+c终止不了了,之前也没太关注,因为用kill -9还是可以终止的。

今天在写为一个python程序写一个signal handler的时候,发现竟然不生效。仔细研究了一下才发现,原来是当调用Thread.join之后,程序就不再能响应信号了(-9除外)。这应该就是之前ctrl+c不生效的原因,因为ctrl+c实际就是发了一个SIGINT信号。

为了要实现signal handler的问题,不能继续使用Thread.join了,只能使用下面的代码代替了:

while threading.activeCount > 1:
    time.sleep(interval)

循环检测剩余的线程数,如果线程数大于1,证明还有子线程未退出,那么进入sleep等待。

这样实现可以绕过Threading.join之后不能响应信号的问题,不过缺点是会占用额外的CPU资源。占用多少CPU资源,要视循环间隔而定(即interval的值大小)。

more ...

Jmeter学习笔记

最近在学习使用Jmeter完成web的压力测试。

Jmeter是Apache的一款开源的压力测试工具,纯java编写,可用于测试web、SOAP、java service等等接口的压力测试。

具体介绍见官网

下面介绍一个简单常用的web功能的压力测试步骤。

测试需求:登录web,然后进行一些操作,最后退出。需要模拟一些并发,每个并发使用不同的用户登录。很常见的需求是吧?

好,下面是测试准备步骤:

  1. 录制登录、操作、退出这一系列操作的脚本(当然也可以直接在Jmeter中添加一个个操作,不过录制的方式比较快)
  2. 配置cookie管理器,否则多个请求之间不能共享cookie,登录之后的其他操作还会出于非登录状态
  3. 修改并发,并且配置每个并发使用不同用户  

下面具体介绍上面每个步骤需要的操作:

录制脚本

看到有很多人用badboy来录制脚本,可以导入jmeter,不过我是直接使用jmeter自带的http代理录制脚本的,也蛮好用。

  1. jmeter中新建一个线程组(测试计划上右击)

image

  1. 工作台上右击,添加一个HTTP代理服务器,配置Test plan content的目标控制器为“测试计划 > 线程组”,分组为“每个组放入一个新的控制器”(其实选不分组也行)

image

image

  1. 启动代理服务器

image 4. 在浏览器中配置使用该代理 …

more ...

Linux 进程调度策略与top命令的PR NI值

Linux进程有SCHED_OTHER/SCHED_BATCH/SCHED_IDLE/SHCED_FIFO/SCHED_RR五种调度策略,前面三种是常规调度策略,后面两种是实时调度策略。具体介绍点击这里

之前一直不能理解的是:RR是分时间片来调度的,是分时调度常用策略,这里为啥还属于实时调度策略。

后来了解到:RR是分时调度常用的策略,也就是说SCHED_OTHER的底层实现也可能是RR。SCHED_RR之所以属于实时调度,是其及时性更高,也就是RR的时间片要比分时的时间片小得多。

Linux的线程也是由进程实现的,只不过是一种可以共享资源的进程(说明在此)。 因此Linux上,线程调度策略应该也不外乎这些。Linux平台上,POSIX线程支持:SCHED_OTHER/SCHED_FIFO/SCHED_RR这三种调度策略。

SCHED_RR和SCHED_FIFO调度的进程属于实时进程,SCHED_OTHER调度的进程属于非实时进程。Linux中大部分进程都是分时进程,实时进程是优先于非实时进程调度的。可以使用top查看,如果PR的值为RT,则为实时进程。

PR和NI的含义

PR 进程的优先级。在Linux 2 …

more ...