摘要:
每当要对序列中的内容进行循环处理时,就应该尝试用list comprehensions代替它>>> i = iter('abc')>>> i.next()'a'>>> i.next()'b'>>> i.next()'c'>>> i.next()Traceback (most recent call last): File "<pyshell#4>", line 1, in <module> i.ne 阅读全文
posted @ 2012-05-30 18:59
ghost&240
阅读(1297)
评论(0)
推荐(0)
摘要:
在线教程: http://docs.python.org/tut/tut.htmlwithopen("/home/ghost/had.txt", "w") as f: with语句可以在执行语句后自动关闭文件学习描述符__get__ __set__P84(高级)学习装饰器学习select模块中的epoll类importcollections 用于双端队列类 dequeimportheapq 用于堆函数的导入importfileinput 用于读取文件类的导入importsys 用于系统的一些东西导入imp... 阅读全文
posted @ 2012-05-30 18:53
ghost&240
阅读(1025)
评论(0)
推荐(0)
摘要:
323535试下malloc的sizeof;46485456576064看到78看函数模板和类模板的区别enum n{N,M,K,J,L};cout << sizeof(n) << endl; //输出4class B{public: virtual void x(){ cout << "call B virtual x()" << endl; }};class D: public B{public: void x(){ cout << "call D virtual x()" << 阅读全文
posted @ 2012-05-30 18:44
ghost&240
阅读(386)
评论(0)
推荐(0)
摘要:
const,c\c++中非常常用的关键字。首先我们看看const有那些修饰方法。最前面我们来看一个问题。char *p = "123";可能有的人不知道,这里的这个"123"是存储在常量区的,不容许修改的。也就是说它是个const类型的。标准的写法应该是char const *p = "123";至于为什么编译器容许上面的那个不标准的写法,可能是因为兼容性的问题吧。char p[4] = "123";//这个和上面的开始大不一样的啊。切入正题。const int s = 0;上面的很容易理解。但带上指针有些同学可能 阅读全文
posted @ 2012-05-30 18:34
ghost&240
阅读(230)
评论(0)
推荐(0)
摘要:
实际用户ID,有效用户ID和设置用户ID看UNIX相关的书时经常能遇到这几个概念,但一直没有好好去理清这几个概念,以致对这几个概念一直一知半解。今天好好区分了一下这几个概念并总结如下。说白了这几个UID引出都是为了系统的权限管理。下面分别用RUID, EUID,SUID来表示实际用户ID,有效用户ID,设置用户ID。另外用户ID是个整型数,为了说明方便真接使用了用户名来代表不同的UID。先解释一下这几个ID的作用:RUID,用于在系统中标识一个用户是谁,当用户使用用户名和密码成功登录后一个UNIX系统后就唯一确定了他的RUID.EUID,用于系统决定用户对系统资源的访问权限,通常情况下等于RU 阅读全文
posted @ 2012-05-30 18:32
ghost&240
阅读(390)
评论(0)
推荐(1)
摘要:
锁类型 初始化方式 加解锁特征 调度特征普通锁 PTHREAD_MUTEX_INITIALIZER 同一线程可重复加锁,解锁一次释放锁 先等待锁的进程先获得锁嵌套锁 PTHREAD_RECURSIVE_MUTEX_INITIALIZER_NP 同一线程可重复加锁,解锁同样次数才可释放锁 先等待锁的进程先获得锁纠错锁 PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP 同一线程不能重复加锁,加上的锁只能由本线程解锁 先... 阅读全文
posted @ 2012-05-30 18:31
ghost&240
阅读(346)
评论(0)
推荐(0)
摘要:
一、类型限定词volatile限定词volatile告诉编译器该变量除了可以被程序改变以外还可被其他代理改变。它通常被用于硬件地址和与其它并行运行的程序共享的数据。如:volatileintlocl;volatileint*ploc;你可能会奇怪为什么ANSI觉得有必要把volatile作为一个关键字。原因是它可以方便编译器优化。例如val1=x;/* 一些不使用x的代码 */val2=x;一个聪明的编译器可能注意到你使用了两次x,而没有改变它的值。那么,它有可能把x临时存储在一个寄存器中。接着,当val2需要x时,可以通过从寄存器而非初始的内存位置中读取该值以节省时间。这个过程被称为缓存(c 阅读全文
posted @ 2012-05-30 18:29
ghost&240
阅读(293)
评论(0)
推荐(0)
摘要:
上次课上学了lseek这个函数,可以制造出“空洞”文件。演示中,我们发现,用vi或者od命令查看带空洞的文件,空洞部分填满了字符0。于是产生了:问题一:空洞文件和用字符0写同样长度的文件一样吗?我们来写一个2000000个’/0’的文件write0.file,再创建一个有长2000000的空洞的文件hole.file。具体方法就不用赘述了(前面直接写,后面lseek)。然后用ls –ls命令查看(当然也可以用du,不过比较麻烦),发现write0.file的大小为1960k,而hole.file只有8k。所以:问题一的答案是:不一样。虽然我们用vi或者od读取这两个文件,内容都是显示的一样的, 阅读全文
posted @ 2012-05-30 18:29
ghost&240
阅读(2538)
评论(0)
推荐(0)
摘要:
如同其他UNIX类系统,Linux本身也是基于命令行的。试试 “Ctrl”+“Alt”+“F1”。这就是控制台,算是Linux的本来面目。至于使用方法,除了多出登录注销外,和前面章节所提到的“终端”差不多。 在X-Window出问题或不运行X-Window的时候,操作主要在这里完成。 Linux在控制台下提供了不止一个终端,支持多用户同时登录,包括在本机同时登录。控制台“Alt”+“Fx”能够切换到第x个终端。如果需要从X-Window里跳到第x个终端,需要“Ctrl”+“Alt”+“Fx”。 一般地,Linux发行版提供7个虚拟屏幕,1~6号是控制台终端,第7个上面跑X-Window。红.. 阅读全文
posted @ 2012-05-30 18:28
ghost&240
阅读(2392)
评论(0)
推荐(0)
摘要:
在大型web应用中,缓存可算是当今的一个标准开发配置了。在大规模的缓存应用中,应运而生了分布式缓存系统。分布式缓存系统的基本原理,大家也有所耳闻。key-value如何均匀的分散到集群中?说到此,最常规的方式莫过于hash取模的方式。比如集群中可用机器适量为N,那么key值为K的的数据请求很简单的应该路由到hash(K) mod N对应的机器。的确,这种结构是简单的,也是实用的。但是在一些高速发展的web系统中,这样的解决方案仍有些缺陷。随着系统访问压力的增长,缓存系统不得不通过增加机器节点的方式提高集群的相应速度和数据承载量。增加机器意味着按照hash取模的方式,在增加机器节点的这一时刻,大 阅读全文
posted @ 2012-05-30 18:27
ghost&240
阅读(238)
评论(0)
推荐(0)
摘要:
相关函数bcopy,memccpy,memcpy,memmove,strcpy,strncpy头文件#include定义函数void * memcpy(void * dest ,const void *src, size_t n);函数说明memcpy()用来拷贝src所指的内存内容前n个字节到dest所指的内存 地址上。与strcpy()不同的是,memcpy()会完整的复制n个字节,不会因为遇到字符串结束'?'而结束。 返回值返回指向dest的指针。 附加说明指针src和dest所指的内存区域不可重叠。#include#includeint main(int argc,c 阅读全文
posted @ 2012-05-30 18:26
ghost&240
阅读(424)
评论(0)
推荐(0)
摘要:
1.autoscan (autoconf): 扫描源代码以搜寻普通的可移植性问题,比如检查编译器,库,头文件等,生成文件configure.scan,它是configure.ac的一个雏形。 your source files --> [autoscan*] --> [configure.scan] --> configure.ac2.aclocal (automake):根据已经安装的宏,用户定义宏和acinclude.m4文件中的宏将configure.ac文件所需要的宏集中定义到文件 aclocal.m4中。aclocal是一个perl 脚本程序,它的定义是:“aclo 阅读全文
posted @ 2012-05-30 18:25
ghost&240
阅读(224)
评论(0)
推荐(0)
摘要:
此文所有的实验都是基于下面的程序:char str[10];for (int i = 0; i < 10; i++) str[i] = '!';执行完后str的值为str = "!!!!!!!!!!"我们把str的每个字符都初始化为惊叹号,当str的值发生变化时,使用printf打印str的值,对比先前的惊叹号,这样就可以方便的观察str发生了怎样的变化。下面我们做几个小实验,看看使用sscanf和正则表达式格式化输入后,str有什么变化。实验1:sscanf("123456","%s",str); ------ 阅读全文
posted @ 2012-05-30 18:23
ghost&240
阅读(286)
评论(0)
推荐(0)
摘要:
linux下最大文件描述符的限制有两个方面,一个是用户级的限制,另外一个则是系统级限制。先介绍如何修改系统级的限制通常我们通过终端连接到linux系统后执行ulimit -n 命令可以看到本次登录的session其文件描述符的限制,如下:$ulimit -n1024当然可以通过ulimit -SHn 102400 命令来修改该限制,但这个变更只对当前的session有效,当断开连接重新连接后更改就失效了。如果想永久变更需要修改/etc/security/limits.conf 文件,如下:vi /etc/security/limits.conf* hard nofile 102400* sof 阅读全文
posted @ 2012-05-30 18:21
ghost&240
阅读(1243)
评论(0)
推荐(0)
摘要:
D d1 = d; 这个是调用的是复制构造函数 函数参数是以copy constructor初始化的Default constructor的错误认为:(P47)任何class如果没有定义default constructor,就会被合成一个出来,其实不是.(要有四种之一,带有default constructor的member class object或base class或带有一个virtual function的class或者带有一个virtual base class 的class)编译器合成出来的default constructor会现实定义”class内每一个data mem... 阅读全文
posted @ 2012-05-30 18:20
ghost&240
阅读(208)
评论(0)
推荐(0)
摘要:
第一部分: DR模式配置OS: Redhat AS4U4 内核:2.6.9-42Server1: 192.168.1.91 (负载服务器)虚拟服务IP: 192.168.1.99Realserver: 192.168.1.92 (集群服务器)实验目的:在负载服务器上,配置LVS(DR模式),做web服务器的集群。实现最终用户访问虚拟IP,负载服务器,将请求分发到集群下的服务器,由集群服务器轮流提供web服务。 Redhat AS4U4的内核版本已经集成了ipvsadm功能模块,所以不需要安装,直接使用即可。 如果要用高版本的ipvsadm,到[url]http://www.linuxvirtu 阅读全文
posted @ 2012-05-30 18:12
ghost&240
阅读(293)
评论(0)
推荐(0)
摘要:
许多服务器部署(尤其是 web 服务器部署)面对的最大问题之一是必须能够处理大量连接。无论是通过构建基于云的服务来处理网络通信流,还是把应用程序分布在 IBM Amazon EC 实例上,还是为网站提供高性能组件,都需要能够处理大量并发连接。一个好例子是,web 应用程序最近越来越动态了,尤其是使用 AJAX 技术的应用程序。如果要部署的系统允许数千客户端直接在网页中更新信息,比如提供事件或问题实时监视的系统,那么提供信息的速度就非常重要了。在网格或云环境中,可能有来自数千客户端的持久连接同时打开着,必须能够处理每个客户端的请求并做出响应。在讨论 libevent 和 libev 如何处理多个 阅读全文
posted @ 2012-05-30 18:10
ghost&240
阅读(871)
评论(0)
推荐(0)
摘要:
先说明:本文基于hadoop 0.20.2版本。文章来源:http://www.codelast.com/(1)首先我们需要知道map-reduce的基本原理,这里不说了。其次我们需要知道,在用C++编写hadoop应用程序时,需要包含三个头文件:#include "Pipes.hh"#include "TemplateFactory.hh"#include "StringUtils.hh"这三个文件在hadoop安装包的 “c++\Linux-amd64-64\include\” 或 “c++\Linux-i386-32\inclu 阅读全文
posted @ 2012-05-30 18:08
ghost&240
阅读(3958)
评论(0)
推荐(0)
摘要:
在linux的网络编程中,很长的时间都在使用select来做事件触发。在linux新的内核中,有了一种替换它的机制,就是epoll。相比于select,epoll最大的好处在于它不会随着监听fd数目的增长而降低效率。因为在内核中的select实现中,它是采用轮询来处理的,轮询的fd数目越多,自然耗时越多。并且,在linux/posix_types.h头文件有这样的声明:#define __FD_SETSIZE 1024表示select最多同时监听1024个fd,当然,可以通过修改头文件再重编译内核来扩大这个数目,但这似乎并不治本。epoll的接口非常简单,一共就三个函数:1. int epol 阅读全文
posted @ 2012-05-30 18:06
ghost&240
阅读(303)
评论(0)
推荐(0)
摘要:
Linux修改环境变量,很简单但很重要一、Linux的变量种类按变量的生存周期来划分,Linux变量可分为两类:1. 永久的:需要修改配置文件,变量永久生效。2. 临时的:使用export命令行声明即可,变量在关闭shell时失效。二、设置变量的三种方法1. 在/etc/profile文件中添加变量【对所有用户生效(永久的)】用VI在文件/etc/profile文件中增加变量,该变量将会对Linux下所有用户有效,并且是“永久的”。例如:编辑/etc/profile文件,添加CLASSPATH变量# vi /etc/profileexport CLASSPATH=./JAVA_HOME/lib 阅读全文
posted @ 2012-05-30 17:59
ghost&240
阅读(5942)
评论(0)
推荐(2)
摘要:
1创建线程就像std::fstream类就代表一个文件一样,boost::thread类就代表一个可执行的线程。缺省构造函数创建一个代表当前执行线程的实例。一个重载的构造函数以一个不需任何参数的函数对象作为参数,并且没有返回值。这个构造函数创建一个新的可执行线程,它调用了那个函数对象。起先,大家认为传统C创建线程的方法似乎比这样的设计更有用,因为C创建线程的时候会传入一个void*指针,通过这种方法就可以传入数据。然而,由于Boost线程库是使用函数对象来代替函数指针,那么函数对象本身就可以携带线程所需的数据。这种方法更具灵活性,也是类型安全(type-safe)的。当和Boost.Bind这 阅读全文
posted @ 2012-05-30 17:55
ghost&240
阅读(423)
评论(0)
推荐(0)
摘要:
一、创建一个线程创建线程 boost::thread myThread(threadFun); 需要注意的是:参数可以是函数对象或者函数指针。并且这个函数无参数,并返回void类型。 当一个thread执行完成时,这个子线程就会消失。注意这个线程对象不会消失,它仍然是一个还处在它的生存期的C++对象。同理,当对一个堆上的线程对象的指针调用delete时候,线程对象被销毁,操作系统的线程并不能保证就消失。放弃时间片 boost::thread::yield(); 当前线程放弃余下的时间片。等待一个线程 myThread.join(); 调用这个方法的线程进入wait状态,直到myThread代表 阅读全文
posted @ 2012-05-30 17:54
ghost&240
阅读(516)
评论(1)
推荐(0)
摘要:
在boost根目录寻找boosttrap.sh并执行 如果不能执行就修改属性chmod a+x ./boosttrap.shsudo ./bjam "-sTOOLS=gcc" "--includedir=/usr/include" "--libdir=/usr/lib/boost" installsudo ./bjam --toolset=gcc --includedir=/usr/local/include --libdir=/usr/local/lib/boost install装完之后要到boost根目录下的/libs/rege 阅读全文
posted @ 2012-05-30 17:49
ghost&240
阅读(299)
评论(0)
推荐(0)
摘要:
Regex头文件: "boost/regex.hpp"正则表达式常用于对输入数据的格式进行验证。应用软件通常要求输入符合某种结构。考虑一个应用软件,它要求输入一定要符合如下格式,"3个数字, 一个单词, 任意字符, 2个数字或字符串"N/A," 一个空格, 然后重复第一个单词." 手工编写代码来验证这个输入既沉闷又容易出错,而且这些格式还很可能会改变;在你弄明白之前,可能就需要支持其它的格式,你精心编写的分析器可能就需要修改并重新调试。让我们写出一个可以验证这个输入的正则表达式。首先,我们需要一个匹配3个数字的表达式。对于数字,我们应 阅读全文
posted @ 2012-05-30 17:48
ghost&240
阅读(655)
评论(0)
推荐(0)
摘要:
使用protected可以保护不让生成对象,如A a;会编译错误,但可以A *a = new A;但此时如果delete a,也是会编译错误,所以总体来说还是错误的protected: virtual ~A() {}; shared_ptr不是线性安全的,因为存在一个引用计数.而intrusive_ptr是线性安全的,因为它要求我们自己写引用计数函数何时我们需要智能指针?有三种典型的情况适合使用智能指针: 资源所有权的共享 要写异常安全的代码时 避免常见的错误,如资源泄漏共享所有权是指两个或多个对象需要同时使用第三个对象的情况。这第三个对象应该如何(或者说何时)被释放?为了确保释放的时机是.. 阅读全文
posted @ 2012-05-30 17:47
ghost&240
阅读(349)
评论(0)
推荐(0)

浙公网安备 33010602011771号