存档

2013年7月 的存档

linux下dd命令详解

2013年7月15日 没有评论

linux下dd命令详解
名称: dd
使用权限: 所有使用者

manpage 定义: convert and copy a file

使用方式:
dd [option]

dd –help

info dd

dd –version

输入或输出
dd if=[STDIN] of=[STDOUT]

强迫输入或输出的Size为多少Bytes
bs: dd -ibs=[BYTE] -obs=[SIZE]

语法:dd [选项]

if =输入文件(或设备名称)。

of =输出文件(或设备名称)。

ibs = bytes 一次读取bytes字节,即读入缓冲区的字节数。

skip = blocks 跳过读入缓冲区开头的ibs*blocks块。

obs = bytes 一次写入bytes字节,即写入缓冲区的字节数。

bs = bytes 同时设置读/写缓冲区的字节数(等于设置ibs和obs)。

cbs = byte 一次转换bytes字节。

count=blocks 只拷贝输入的blocks块。

conv = ASCII 把EBCDIC码转换为ASCIl码。

conv = ebcdic 把ASCIl码转换为EBCDIC码。

conv = ibm 把ASCIl码转换为alternate EBCDIC码。

conv = block 把变动位转换成固定字符。

conv = ublock 把固定位转换成变动位。

conv = ucase 把字母由小写转换为大写。

conv = lcase 把字母由大写转换为小写。

conv = notrunc 不截短输出文件。

conv = swab 交换每一对输入字节。

conv = noerror 出错时不停止处理。

conv = sync 把每个输入记录的大小都调到ibs的大小(用NUL填充)。

noerror
出错时不停止。

notrunc
不截短输出文件。

sync 把每个输入块填充到ibs个字节,不足部分用空(NUL)字符补齐。

—————————————————————-

认识下两个”伪文件”

/dev/null

位桶文件(bit bucket),就是我们常说的空文件。是一个输出设备。

  任何写入它的输出都会被抛弃。如果不想让消息以标准输出显示或写入文件,那么可以将消息重定向到位桶。把/dev/null看作”黑洞”. 它非常等价于一个只写文件. 所有写入它的内容都会永远丢失. 而尝试从它那儿读取内容则什么也读不到. 然而, /dev/null对命令行和脚本都非常的有用.

/dev/zero

是一个输入设备,你可你用它来初始化文件。

    该设备无穷尽地提供0(是ASCII 0 就是NULL),可以使用任何你需要的数目——设备提供的要多的多。他可以用于向设备或文件写入NULL。
   像/dev/null一样, /dev/zero也是一个伪文件, 但它实际上产生连续不断的null的流(二进制的零流,而不是ASCII型的). 写入它的输出会丢失不见, 而从/dev/zero读出一连串的null也比较困难, 虽然这也能通过od或一个十六进制编辑器来做到. /dev/zero主要的用处是用来创建一个指定长度用于初始化的空文件,就像临时交换文件.

————————————————————–

使用dd来测试硬盘读写速度
dd只能提供一个大概的测试结果,而且是连续IO 而不是随机IO ,理论上文件规模越大,测试结果越准确。
 
读性能测试
# time dd  iflag=direct,nonblock  if=/dev/sda2 of=/dev/null bs=8k count=8388608

   因为/dev/sda2是一个物理分区,对它的读取会产生IO,/dev/null是伪设备,相当于黑洞,of到该设备不会产生IO,所以,这个命令的IO只发生在/dev/sdb1上,也相当于测试磁盘的读能力。

写测试
# time dd oflag=direct,nonblock if=/dev/zero f=/opt/iotest bs=8k count=8388608 
    因为/dev/zero是一个伪设备,它只产生空字符流,对它不会产生IO,所以,IO都会集中在of文件中,of文件只用于写,所以这个命令相当于测试磁盘的写能力。 
读写测试
# time dd iflag=direct,nonblock oflag=direct,nonblock if=/dev/sda2 f=/opt/iotest bs=8k count=8388608  
 
  注:bs是一次io读的规模,理论上bs越大,所测得性能越高
      count是读多少个”bs”,也可以写成count=16G
     规避掉文件系统cache,直接读写,不使用buffer cache

iflag=direct,nonblock

oflag=direct,nonblock

iflag=cio

oflag=cio

direct 模式就是把写入请求直接封装成io 指令发到磁盘

非direct 模式,就把数据写入系统缓存,然后就认为io 成功,并由操作系统决定缓存中的数据什么时候被写入磁盘

分类: linux 标签:

[转]:Tomcat学习之Connector

2013年7月11日 没有评论

转载自:http://blog.csdn.net/aesop_wubo/article/details/7617416

如下图所示,Tomcat服务器主要有两大核心模块组成:连接器和容器,本节只分析连接器的实现。

连接器主要是接收用户的请求,然后封装请求传递给容器处理,tomcat中默认的连接器是Coyote.首先来看连接器的类图:

protocol

我们发现这个类里面有很多与protocol有关的属性和方法,tomcat中支持两种协议的连接器:HTTP/1.1与AJP/1.3,查看tomcat的配置文件server.xml可以看到如下配置:

  1. <Connector port=”8080″ protocol=”HTTP/1.1″
  2.                connectionTimeout=”20000″
  3.                redirectPort=”8443″ URIEncoding=”utf-8″/>
  4. <Connector port=”8009″ protocol=”AJP/1.3″ redirectPort=”8443″ />

HTTP/1.1协议负责建立HTTP连接,web应用通过浏览器访问tomcat服务器用的就是这个连接器,默认监听的是8080端口;

AJP/1.3协议负责和其他HTTP服务器建立连接,监听的是8009端口,比如tomcat和apache或者iis集成时需要用到这个连接器。

协议上有三种不同的实现方式:JIO、APR、NIO。

JIO(java.io):用java.io纯JAVA编写的TCP模块,这是tomcat默认连接器实现方法;

APR(Apache Portable Runtime):有C语言和JAVA两种语言实现,连接Apache httpd Web服务器的类库是在C中实现的,同时用APR进行网络通信;

NIO(java.nio):这是用纯Java编写的连接器(Conector)的一种可选方法。该实现用java.nio核心Java网络类以提供非阻塞的TCP包特性。

ProtocolHandler接口是对这些协议的抽象,其类层次结构图如下呼所示:

前面提到tomcat默认采用的是Http11Protocol,要么要怎么更换默认的protocolHandler呢,先看看setProtocol方法的源码:

  1. public void setProtocol(String protocol) {
  2.     if (AprLifecycleListener.isAprAvailable()) {
  3.         if (“HTTP/1.1”.equals(protocol)) {
  4.             setProtocolHandlerClassName
  5.                 (“org.apache.coyote.http11.Http11AprProtocol”);
  6.         } else if (“AJP/1.3”.equals(protocol)) {
  7.             setProtocolHandlerClassName
  8.                 (“org.apache.coyote.ajp.AjpAprProtocol”);
  9.         } else if (protocol != null) {
  10.             setProtocolHandlerClassName(protocol);
  11.         } else {
  12.             setProtocolHandlerClassName
  13.                 (“org.apache.coyote.http11.Http11AprProtocol”);
  14.         }
  15.     } else {
  16.         if (“HTTP/1.1”.equals(protocol)) {
  17.             setProtocolHandlerClassName
  18.                 (“org.apache.coyote.http11.Http11Protocol”);
  19.         } else if (“AJP/1.3”.equals(protocol)) {
  20.             setProtocolHandlerClassName
  21.                 (“org.apache.coyote.ajp.AjpProtocol”);
  22.         } else if (protocol != null) {
  23.             setProtocolHandlerClassName(protocol);
  24.         }
  25.     }
  26. }

从以上代码可以看出只要protocol不为HTTP/1.1也不为AJP/1.3就会调用setProtocolHandlerClassName来设置protocolHandler,也就是说要替换默认的protocolHandler,只需要修改server.xml文件Connector中的protocol属性即可!

 

 

Service

连接器和容器一起才能对外提供服务,Service里面包含了一个容器和多个连接器,连接器是怎么加入到Service中的,可以看一下StandardService中的代码:
  1. public void addConnector(Connector connector) {
  2.     synchronized (connectors) {
  3.         connector.setService(this);
  4.         Connector results[] = new Connector[connectors.length + 1];
  5.         System.arraycopy(connectors, 0, results, 0, connectors.length);
  6.         results[connectors.length] = connector;
  7.         connectors = results;
  8.         if (getState().isAvailable()) {
  9.             try {
  10.                 connector.start();
  11.             } catch (LifecycleException e) {
  12.                 log.error(sm.getString(
  13.                         “standardService.connector.startFailed”,
  14.                         connector), e);
  15.             }
  16.         }
  17.         // Report this property change to interested listeners
  18.         support.firePropertyChange(“connector”, null, connector);
  19.     }
  20. }

StandardService中还有setContainer方法,正是Service把容器和连接器关联在一起的

mapperListener

在连接器初始化的时候会初始化mapperListener,mapperListener在初始化的时候会调用mapper对象的addXXX方法

Mapper对象在tomcat中存在于两个地方:

1、每个context容器对象中,它只记录了此context内部的访问资源与相对应的wrapper子容器的映射;

2、connector模块中,这是tomcat全局的变量,它记录了一个完整的映射对应关系,即根据访问的完整URL如何定位到哪个host下的哪个context的哪个wrapper容器。
Servlet中forward跳转会用到第一种mapper,也就是说forward是服务器内部的重定向。

初始化与启动

Connector的初始化过程如下:
1、Tomcat初始化时会调用Bootstrap的Load方法,这里会解析XML文件,Digester解析的过程中,会调用Connector的构造方法
  1. public Connector(String protocol) {
  2.        setProtocol(protocol);
  3.        // Instantiate protocol handler
  4.        try {
  5.            Class<?> clazz = Class.forName(protocolHandlerClassName);
  6.            this.protocolHandler = (ProtocolHandler) clazz.newInstance();
  7.        } catch (Exception e) {
  8.            log.error(sm.getString(
  9.                    “coyoteConnector.protocolHandlerInstantiationFailed”), e);
  10.        }
  11.    }

这个构造方法首先设置protocol,然后初始化protocolhandler

2、紧接着初始化Server,一个Server可能有多个Service,在初始化Server的过程中会初始化多个Service.Service由一个容器和多个连接器组成,会先初始化容器,然后初始化化两个连接器,连接器的初始化是调用的Connector的initInternal方法
  1. protected void initInternal() throws LifecycleException {
  2.     super.initInternal();
  3.     // Initialize adapter
  4.     adapter = new CoyoteAdapter(this);
  5.     protocolHandler.setAdapter(adapter);
  6.     // Make sure parseBodyMethodsSet has a default
  7.     if( null == parseBodyMethodsSet ) {
  8.         setParseBodyMethods(getParseBodyMethods());
  9.     }
  10.     try {
  11.         protocolHandler.init();
  12.     } catch (Exception e) {
  13.         throw new LifecycleException
  14.             (sm.getString
  15.              (“coyoteConnector.protocolHandlerInitializationFailed”), e);
  16.     }
  17.     // Initialize mapper listener
  18.     mapperListener.init();
  19. }

(1)首先为protocolHandler设置一个adapter,然后初始化protocolHandler

(2)初始化mapperListener,啥都没做,只是调用了父类(LifecycleMBeanBase)的initInternal方法!
由于Tomcat的生命周期控制,连接器的启动过程和初始化过程几乎一样,也是由Catalina的start方法开始,Server启动,Service启动,Container启动,Connector启动。Connector启动调用了它的startInternal方法,这个方法只做了两件事:启动protocolHandler和mapperListener,连接器的启动过程就是这样!下面分别来看看protocolHandler和mapperListener启动时都做了哪些事?
protocolHandler的初始化是在其父类AbstractProtocol的start方法中完成的,
  1. public void start() throws Exception {
  2.     if (getLog().isInfoEnabled())
  3.         getLog().info(sm.getString(“abstractProtocolHandler.start”,
  4.                 getName()));
  5.     try {
  6.         endpoint.start();
  7.     } catch (Exception ex) {
  8.         getLog().error(sm.getString(“abstractProtocolHandler.startError”,
  9.                 getName()), ex);
  10.         throw ex;
  11.     }
  12. }

调用了endpoint的start方法,这个方法里面做了以下几件事:

(1)设置接收线程数和最大连接数,创建socket
(2)创建线程池,启动监听的线程监听用户请求
(3)启动一个线程来负责异步请求
mapperListener也继承了LifecycleMBeanBase类,也是受生命周期控制的。所以它的启动是在startInternal方法中完成的
  1. public void startInternal() throws LifecycleException {
  2.        setState(LifecycleState.STARTING);
  3.        // Find any components that have already been initialized since the
  4.        // MBean listener won’t be notified as those components will have
  5.        // already registered their MBeans
  6.        findDefaultHost();
  7.        Engine engine = (Engine) connector.getService().getContainer();
  8.        addListeners(engine);
  9.        Container[] conHosts = engine.findChildren();
  10.        for (Container conHost : conHosts) {
  11.            Host host = (Host) conHost;
  12.            if (!LifecycleState.NEW.equals(host.getState())) {
  13.                // Registering the host will register the context and wrappers
  14.                registerHost(host);
  15.            }
  16.        }
  17.    }

(1)注册已初始化的组件

(2)为各种容器添加监听器
(3)为各种容器建立映射关系
分类: Tomcat 标签:

[转]Tomcat性能调校之连接器模块JIO、APR和NIO

2013年7月11日 没有评论

转自:http://www.gootry.com/wangzhuan/article/100928211150/252

Tomcat提供了三种不同的服务器设计实现方法,以服务于HTTP,并实现与服务于AJP三种设计方法相同的设计方法。


JIO(java.io)

除非在Tomcat启动时找到了APR Connector的libtcnative库,否则这是Tomcat的默认连接器实现方法,这也称为“Coyote”。

 

   它是一个使用java.io核心Java网络类的纯Java TCP包服务器实现。它也完全是HTTP和AJP的模块化实现

 

于是用纯Java编写的,所以对完全支持Java的所有操作系统来说,JIO是二进制可随处移植的(portable)。

 

许多人认为这种实现方法比主流的Apache httpd要慢,因为它是用Java编写的。假定Java总是比编译的C要慢。真的吗?请拭目以待!


APR(Apache Portable Runtime)

第二种连接服务器的方法是以Java类的方式实现,这些Java类包含了一个以C编程语言编写的、置于小的libtcnative库文件中的JNI压缩包,这些Java类轮流取决于Apache Portable Runtime(APR)库文件。

 

   连接Apache httpd Web服务器的类库也是在C中实现的,而且用APR进行网络通信。

 

这种可选的实现方法的目标包括:使用胜过JIO连接器的相同开源C代码,作为Apache httpd的服务器实现方法,并提供至少与Apache httpd同等的性能。

 

因为这种方法主要是在C中实现的,所以缺陷在于单个二进制版本的这种连接器不能像JIO连接器一样运行在所有平台上。

 

这意味着Tomcat管理员需要编译连接器,因此必须具备一定的开发环境,而且可能有编译问题。

 

但是,这种连接器的作者通过要求得到比这种连接器实现要快的Tomcat的Web性能,验证了这种特殊设置的效果。

 

笔者将通过基准调校,让您亲眼看到其实际效果。

 

   NIO(java.nio)
这是用纯Java编写的连接器(Conector)的一种可选方法。该实现用java.nio核心Java网络类以提供非阻塞的TCP包特性。

 

这种Connector设计的主要目标是用非阻塞(nonblocking)的方式部分实现Connectot,以达到使用很少的线程给Tomcat管理员提供比JIO Connector执行效果更好的Connectot实现。

 

另一方面,NIO Connector只需要一个线程就能分析众多连接器的请求,但每个请求随后必须运行自身线程(Java Servlet规范要求限制的)才能寻到servlet。

 

因为部分请求处理是以非阻塞的Java代码完成的,因此,部分请求处理所占用的时间是Java线程不需处于在用状态的时间,这意味着小线程池可用于处理相同数量的并发请求。

 

小线程池通常意味着低CPU占用,轮流使用该线程池意味着获得更好的性能。这样处理使速度更快的理论原因建立在假设高堆栈可以或不可以用于任何入的自身Web应用程序和交换负荷之上。

 

因此,对一些请求处理,NIO Connector会执行更好,而对另一些请求处理,则执行效果更差,这要视其他Connector设计的情况而定。
依靠这些Tomcat Connector,笔者在prefork及worker多线程(Multi-Process Model,缩写为MPM)编译配置下进行Apache httpd基准调校,井要求通过Apache httpd连接器模块,把基准调校的请求所在的httpd prefork和worker配置从Apache httpd发送到Tomcat。

分类: Tomcat 标签:

glibc 和glibc-common版本冲突解决办法

2013年7月10日 没有评论
背景:
编译安装一个软件的时候,提示 configure: error: no acceptable C compiler found in $PATH ,一看应该知道应该是gcc没装,那准备yum安装gcc
yum安装gcc的时候报glibc 和glibc-common的版本冲突,centos6.3 x64 系统里面glibc-common有2个版本,glibc-common-2.12-1.107和glibc-common-2.12-1.80(至于为啥有2个版本的glibc-common无法追溯了),看报错,说要升级glibc的版本为 glibc-2.12-1.107.el6.x86_64
 –> Running transaction check
—> Package glibc.x86_64 0:2.12-1.80.el6 will be updated
–> Processing Dependency: glibc = 2.12-1.80.el6 for package: glibc-common-2.12-1.80.el6.x86_64
—> Package kernel-headers.x86_64 0:2.6.32-358.11.1.el6 will be installed
–> Finished Dependency Resolution
Error: Package: glibc-common-2.12-1.80.el6.x86_64 (@anaconda-CentOS-201207061011.x86_64/6.3)
Requires: glibc = 2.12-1.80.el6
Removing: glibc-2.12-1.80.el6.x86_64 (@anaconda-CentOS-201207061011.x86_64/6.3)
glibc = 2.12-1.80.el6
Updated By: glibc-2.12-1.107.el6.x86_64 (base)
glibc = 2.12-1.107.el6
You could try using –skip-broken to work around the problem
** Found 3 pre-existing rpmdb problem(s), ‘yum check’ output follows:
glibc-common-2.12-1.107.el6.x86_64 is a duplicate with glibc-common-2.12-1.80.el6.x86_64
glibc-common-2.12-1.107.el6.x86_64 has missing requires of glibc = (‘0’, ‘2.12’, ‘1.107.el6’)
libgcc-4.4.7-3.el6.x86_64 is a duplicate with libgcc-4.4.6-4.el6.x86_64
下载glibc 107版本。
显示依赖libfreebl3.so,(其他依赖比如glibc-common我们已经装过了)
那继续下载libfreebl3.so
他依赖libc.so.6 正好就是上面glibc
下载这2个软件后,同时安装这2个软件
然后查看下现在glibc 和glibc-common 的版本已经一致了,目前在yum 安装gcc就正常了。
分类: linux 标签:

SVNPath 与 SVNParentPath区别

2013年7月9日 没有评论

dav_svn.conf 的配置中有 SVNPath 与 SVNParentPath 两个选项.
SVNPath用于只有一个项目的情况,此时如果在主目录下面再建新项目,则不能访问.提示没有权限.
如果有多个项目的话,此时应该使用SVNParentPath来设置父目录来设置项目的父目录,这样子目录里面可以有多个项目了.

然后auth文件里面可以定义子目录的权限,apache的/etc/httpd/conf.d/subversion.conf 配置文件里面设置一个location就可以了

以后多个子项目都是用同样的认证文件,访问方式就为 http://ip/svn/pro1    http://ip/svn/pro2

认证文件给子项目赋权。

 

分类: svn 标签:

[python]列表操作方法append extend insert remove pop index count sort reverse

2013年7月9日 没有评论

已知列表: a = [1,2,3,4,5]

python list 索引:
列表索引的下标默认是从第0个开始的,比如我们需要获取第1个元素1,那我们可以用a[0].如果需要获取
最后一个元素,那可以通过a[-1]。

1 append()方法
向列表的尾部插入数据,有点像push操作,它可以push大部分数据,比如数字,字符串到列表里,
比如:
a.append(6)
a.append(7)
a.append([1,3])

如果你要进行列表的合并的话,用下面的extend方法
2 extend()方法
b = [‘a’,’b’]
a.extend(b)
print a
输出列表a的结果是[1,2,3,4,5,a,b]

3 insert()方法
insert 是想前面插入数据,插入数据时必须标注插入位置,比如下面的1 66 ,1就是列表位置,66是数据。
a.insert(1,66)
输出结果是[1, 66, 2, 3, 4, 5, ‘a’, ‘b’]

4 remove()方法
a.remove(66)
输出的结果是:[1, 2, 3, 4, 5, ‘a’, ‘b’]

删除列表里面指定的值,如果没有的话,报错:
Traceback (most recent call last):
File “”, line 1, in
ValueError: list.remove(x): x not in list

4 pop方法
a.pop()
输出的结果是’b’
a.pop(2)
输出的结果是3
如果你没有指定参数的话,默然是返回列表的最后一个字符,如果指定的话,返回当前指定的索引的值,使用pop后,列表中会删除该值

5 index方法
a.index(2)
打印该值在列表中的位置,发现了一个很奇怪的问题,我直接输出a.index(0)就会报错,因为index方法在取值的时候,有个判断元素是否存在,如果不存在则抛出异常。

6 python列表查找
我们可以通过in的方法来进行查找。如果需要查找的值在列表里,则返回true,否则返回false

7 判断python列表为空:
判断列表为空有两种方法,一个是通过len(列表),然后看返回结果,还有一个是通过if 判断,如果是空列表,则返回false

8 python 列表长度:
通过len(列表)就可以得到结果

9 python 列表变量循环:
直接用for in 迭代列表输出就行。

10 python 列表随机选值:
可以通过import random模块,然后随机生成一个整数,在到列表里面去取数据,但是如果超过索引范围,则会报错。

11 python 列表排序:
直接通过列表自身的sort()方法就能对列表进行排序,注意这个方法返回none,是原地的修改列表

12count()方法
返回一个字符在列表出现的次数
a.count(1)
输出的结果是2
如果是a.count(0)
返回的结果是0
所以它的意思是字符串存在列表当中的话,返回它出现的次数,如果字符不存在列表当中的话,返回0
13 sort()方法
对列表里的元素进行从小到大的排序
a.sort()
输出的结果是[1, 1, 2, 3, 4]
14 reverse()方法
对列表里的数据进行翻转显示
输出的结果是:[4, 3, 2, 1, 1]

分类: python 标签:

[转]4行python代码,删除svn文件夹

2013年7月5日 没有评论

svn很好用,但是如果要删除svn文件夹的绑定是个很麻烦的事情,每个目录下都有.svn的文件夹,必须全部删掉才行。手动删除费时费力,一般都写段脚本搞定,不过网上搜索出来的python脚本都太冗长了,一点也体现不出python的优势。如下,网上搜索到得代码:

其中实现功能的核心代码写得太过冗长,其实很简单的4行代码就能达到目的,如下:

转自:http://www.cnblogs.com/Alexander-Lee/archive/2010/02/23/1671905.html

分类: python 标签:

Web 服务器框架Tornado安装

2013年7月5日 没有评论

 

Tornado 是 FriendFeed 使用的可扩展的非阻塞式 web 服务器及其相关工具的开源版本。这个 Web 框架看起来有些像web.py 或者 Google 的 webapp,不过为了能有效利用非阻塞式服务器环境,这个 Web 框架还包含了一些相关的有用工具 和优化。

Tornado 和现在的主流 Web 服务器框架(包括大多数 Python 的框架)有着明显的区别:它是非阻塞式服务器,而且速度相当快。得利于其 非阻塞的方式和对 epoll 的运用,Tornado 每秒可以处理数以千计的连接,这意味着对于实时 Web 服务来说,Tornado 是一个理想的 Web 框架。我们开发这个 Web 服务器的主要目的就是为了处理 FriendFeed 的实时功能 ——在 FriendFeed 的应用里每一个活动用户都会保持着一个服务器连接。(关于如何扩容 服务器,以处理数以千计的客户端的连接的问题,请参阅 C10K problem。)

请参见 Tornado 文档 或 Tornado 原文文档(镜像)以详细了解该 Web 框架。

 

下载和安装

 

自动安装: Tornado 已经列入 PyPI ,因此可以通过 pip 或者 easy_install 来安装。如果你没有安装 libcurl 的话,你需要将其单独安装到系统中。请参见下面的安装依赖一节。注意一点,使用 pip 或 easy_install 安装的 Tornado 并没有包含源代码中的 demo 程序。

手动安装: 下载地址:wget https://pypi.python.org/packages/source/t/tornado/tornado-3.1.tar.gz

 

Tornado 的代码托管在 GitHub 上面。对于 Python 2.6 以上的版本,因为标准库中已经包括了对 epoll 的支持,所以你可以不用 setup.py 编译安装,只要简单地将 tornado 的目录添加到 PYTHONPATH 就可以使用了。

安装需求

Tornado 在 Python 2.5, 2.6, 2.7 中都经过了测试。要使用 Tornado 的所有功能,你需要安装 PycURL (7.18.2 或更高版本) 以及 simplejson (仅适用于Python 2.5,2.6 以后的版本标准库当中已经包含了对 JSON 的支持)。为方便起见,下面将列出 Mac OS X 和 Ubuntu 中的完整安装方式:

Mac OS X 10.6 (Python 2.6+)

 

Ubuntu Linux (Python 2.6+)

 

Ubuntu Linux (Python 2.5)

 

Hello, world

以下是经典的 “Hello, world” 示例:

 

分类: python 标签:

nginx 身份验证

2013年7月5日 没有评论

有些场景可能需求屏蔽写匿名访问者,比如wiki,或者想多加一层访问控制的话,nginx也可以做一层访问验证。

Nginx身份验证

 
看看打开页面是否需要输入用户名和密码!

分类: nginx 标签:

nginx 开启目录浏览功能

2013年7月5日 没有评论

这几个参数老是忘记,转篇文章过来,原文:http://blog.licess.org/nginx-autoindex/

Nginx默认是不允许列出整个目录的。如需此功能,

打开nginx.conf文件,在location server 或 http段中加入
autoindex on;
另外两个参数最好也加上去:

autoindex_exact_size off;
默认为on,显示出文件的确切大小,单位是bytes。
改为off后,显示出文件的大概大小,单位是kB或者MB或者GB

autoindex_localtime on;
默认为off,显示的文件时间为GMT时间。
改为on后,显示的文件时间为文件的服务器时间

location /images {
root   /var/www/nginx-default/ibugaocn;
autoindex on;
}

分类: nginx 标签:

[转]SVN的可视化日志统计工具StatSVN

2013年7月4日 没有评论

StatSVN很好的统计工具,能帮你统计团队成员各自的编写量,代码总数,提交情况,文件数量等情况,并且以html网页图表的方式发布统计结果。

以前写过一个叫NOVA的小程序,并用StatSVN管理,通过这个例子介绍StatSVN的一些功能

使用前提

StatSVN的主页:http://www.statsvn.org/

它是一个2M多的JAR文件,是SVN的统计工具,统计结果以HTML格式保存。所以,如果要发布结果供团队成员浏览,需要一台服务器(或PC,貌似是废话…),安装网页服务器(apache2等),需要 JVAV (笔误 实为JAVA)环境,至少安装有SVN客户端,以便取得SVN服务器上的最新版本。apache2,java,svn的安装这里不做详细介绍(网上资料比较齐全)。

使用方法

下载statsvn.jar

用SVN客户端取得SVN服务器上的最新版本代码,比如Linux上的命令如下:

1 #check out 最新版本
2 svn co http://xxxx.xxxxx.xxxxx/xxxxx

生成新版本的log日志:

1 #生成项目SVN日志
2 svn log -v --xml > 日志名XXX.log

在存放统计结果HTML的目录中,执行statsvn.jar,一个简单的例子:

1 #简单例子
2 java -jar ../statsvn.jar ../nova/日志名XXX.log ../nova  -charset utf-8 -disable-twitter-button -title Nova  -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*

java -jar ../statsvn.jar               执行statsvn.jar,后面是它的参数

参数1:../nova/日志名XXX.log                调用上面生成的SVN日志

参数2:../nova             最新版本所在的目录

参数3:-charset utf-8         生成的HTML所用的字符集

参数4:-disable-twitter-button            关闭twitter连接,可能statsvn的开发者是一个twitter爱好者,statsvn默认在项目和开发人员的名字后加个twitter连接按钮,方便互动。这在中国行不通,大家都懂的…所以让twitter连接按钮不显示。

参数5:-title 标题名             这个设置在HTML页面中显示的项目标题

参数6:-include **/*.cpp:**/*.h        表示统计的文件类型,默认情况下statsvn统计指定目录下的所有文件(包括一些开发环境自动生成的文件等,这个参数可以设置指定统计具体文件,例子中的表示只统计项目目录下得CPP与H文件。

参数7:-exclude **/sqlite3/*.*         表示不统计的内容,例子中的参数表示不统计项目文件夹中sqlite3的内容(因为sqlite3的内容是调用别人写的程序,统计进去没有意义~)

这就是statsvn最常用的几个参数,其他更详细参数可以参考官方网站的介绍。

扩展使用方法

由于StatSVN是静态的,需要执行一次才能查看新的结果,但是我们可以让他在系统中定时执行,比如每天晚上2:00执行一次,那么第二天就可以看到昨晚为止的所有统计情况。

以linux系统为例

我们可以把上述取得新版本,生成日志,生成统计的过程写成sh文件,并命名为”任务名.sh”

1 #!/bin/sh
2 cd ~
3 cd statsvn
4 svn co http://192.168.5.32/nova
5 cd nova
6 svn log -v --xml > svn.log
7 cd ..
8 cd novalog
9 java -jar ../statsvn.jar ../nova/svn.log ../nova  -charset utf-8 -disable-twitter-button -title Nova  -include **/*.cpp:**/*.h -exclude **/sqlite3/*.*

然后用crontab定时任务工具对这个sh进行定时执行(crontab的设置方法可以参考网上)

1 o@O:~$ crontab -l
2 # m h  dom mon dow   command
3 0 2 * * * /home/o/statsvn/任务名.sh
4 o@O:~$

把生成的html结果所在的目录软连接到apache的根目录(比如”www”文件夹下)就可以用过网页访问了。

 

StatSVN小巧简洁而且实用,是不错的团队管理工具,不过2010年初发布到版本0.7.0就没更新过了,不知道是不是烂尾了…实在可惜

分类: svn 标签:

redmine 微软ldap验证配置

2013年7月4日 没有评论

CN, OU, DC 都是 LDAP 连接服务器的端字符串中的区别名称(DN, distinguished   name)
LDAP连接服务器的连接字串格式为:ldap://servername/DN
其中DN有三个属性,分别是CN,OU,DC
LDAP是一种通讯协议,如同HTTP是一种协议一样的!
在 LDAP 目录中,

  • DC (Domain Component)
  • CN (Common Name)
  • OU (Organizational Unit)

例如:CN=test,OU=developer,DC=domainname,DC=com
在上面的代码中 cn=test 可能代表一个用户名,ou=developer 代表一个 active directory 中的组织单位。这句话的含义可能就是说明 test 这个对象处在domainname.com 域的 developer 组织单元中

先上我已经测试通过的图

Here is an typical example using Active Directory:

Here is another example for Active Directory with a compartmentalized intranet:

分类: redmine 标签: , ,