P NP问题理解

P和NP的定义

要理解P和NP问题,让我们首先来看看P和NP的定义:

P: The complexity class of decision problems that can be solved on a deterministic Turing machine in polynomial time.

NP: The complexity class of decision problems that can be solved on a non-deterministic Turing machine in polynomial time

翻译一下就是:

P类问题是指确定型图灵机可以在多项式时间内解决的问题

NP类问题是指非确定型图灵机可以在多项式时间内解决的问题

关键词:确定型/非确定型图灵机、多项式时间 …

more ...

问号在正则中的特殊作用

表示是否匹配

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

>>> 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 ...

从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 ...

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 ...

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 ...

Singleton和多线程

最简单的Singleton代码如下:

class Singleton
{
public:
    Singleton & getInstance()
    {
        static Singleton _s;
        return _s;
    }
private:
    Singleton(){}
};

或者

class Singleton
{
public:
    static Singleton * getInstance()
    {
        if(_s == NULL)
            _s = new Singleton();
        return _s;
    }
private:
    Singleton(){}
    static Singleton * _s;
};
Singleton * Singleton::_s=NULL;

如果getInstance会被多线程执行呢?第二种方式中,很明显if判断处是个race condition。那么第一种方式会不会有问题呢?可以想象,static变量只初始化一次肯定也是通过某个条件判断实现的。就要看编译器实现这个判断的时候有没有加锁了。很可惜,没有从编译器的文档中找到该说明,不过从msdn博客看到一篇文章说明了静态变量初始化在多线程情况下也是存在race …

more ...

申请域名和空间

1. 申请域名

在万网上申请一个cn域名,大概每年39左右,不过cn的域名需要先提交资料备案后才能使用,这有点令人不爽。因此果断选择了com域名,虽然也要提交资料审批,但是审批结果并不影响域名的使用。

选择com域名也不是没有代价的,代价就是每年多了20块钱,另外据说com域名有时可能不能正常解析,原因不能说,大家懂的。

万网上买个5年期的com域名,295元,都不够春节回家的路费,“一咬牙一狠心”也就买了,反正快捷支付只是输入了用户名密码,也感觉不到花了钱。

2. 申请站点空间

站点空间是用来干嘛的?可以理解为一个做了一些权限限制的远程主机,可以用来放你的web server。当然大部分站点空间供应商都已经提供了web server,你只需要将你的站点内容上传就可以了。
为什么不可以把网站内容放在用自己的电脑上呢?

一来是你可能没有固定的IP;二来是你的个人电脑也不能一直开着吧,就算不管电脑耗费,电费也不便宜呀,特别现在还发明了这么有创新意义的阶梯电价。如果这两个问题你都能解决,放在自己的电脑上也是个不错选择,省了一笔银子。

所以申请站点空间相对麻烦一点,不是因为操作复杂,而是因为站点空间的收费比域名要高的多,不敢再一买买个5年了。而且国内的一些VPS对流量的限制也比较严格,最好是先估算网站需要的空间和流量后再来选择一个合适的套餐。

对于个人用户来说,稳定性要求相对没那么高,免费的站点倒是个不错的选择。

尝试申请了Zymic …

more ...

使用wordpress搭建个人站点

1. 安装mysql

  1. 从mysql官网下载源码5.5.24源码地址
  2. 下载并安装cmake,用来生成makefile。2.8.9地址
  3. 解压mysql-5.5.24.tar.gz,进入解压后的目录
  4. 运行cmake -i,设置三个变量:CMAKE_INSTALL_PREFIX,MYSQL_DATADIR,SYSCONFDIR,其他默认即可。
  5. 运行make && make install
  6. 进入mysql安装目录,即CMAKE_INSTALL_PREFIX指定地址,运行nohup ./bin/mysqld &启动mysql

2. 安装apache

  1. 从apache官网下载地址找一个合适镜像下载源码。我选择的是北交大的镜像
  2. 选择需要的版本下载,然后tar –zxvf解压.tar …
more ...

非root使用源码安装mysql

安装步骤:

  1. 从mysql官网下载源码。5.5.24源码地址
  2. 下载并安装cmake,用来生成makefile。2.8.9地址
  3. 解压mysql-5.5.24.tar.gz,进入解压后的目录
  4. 运行cmake -i
  5. 设置三个变量:CMAKE_INSTALL_PREFIX,MYSQL_DATADIR,SYSCONFDIR,其他默认即可。
  6. 这三个值默认是/usr/local/mysql作为根目录,可以设置为/home/$USER/mysql或者其他地址
  7. 或者直接运行cmake -D CMAKE_INSTALL_PREFIX=/$HOME/tools/mysql -D MYSQL_DATADIR=/$HOME/tools/mysql/data –D SYSCONFDIR=/$HOME/tools/mysql …
more ...