转载至www.x9byod.com
nova中把通用的功能模块放在openstack/common下,实现了很多基本的常用功能,比如log,time,包引用等等;这个模块与其它模块高度独立,因此可以被很容易的被各个模块,甚至其它工程复用。这里介绍openstack比较常用和重要的几个模块:
- db
nova数据库默认采用的后台是sqlalchemy,common/db实现了抽象的DBAPI类,所有对数据库的操作都通过DBAPI来代理。DBAPI只是一个简单的wrapper,真正的实现由它的初始话参数backend_mapping来决定。nova里采用的默认值为“{‘sqlalchemy’: ‘nova.db.sqlalchemy.api’}”,也就是说,db的后台实现在目录nova/db/sqlalchemy下。nova.db.sqlalchemy.api中实现了所有对数据库操作函数的封装,任何一个对数据库状态有修改的函数,都可以在这里找到对应的数据库更新函数。数据库的表定义在nova.db.sqlalchemy.models中。
- log
nova的log可以认为是对python标准库里logging函数的封装和增强。它根据配置文件,对输出的内容,级别,格式以及输出目的进行控制。同时,配合gettextutils模块,log还支持多语言的数据
- gettextutils
是对gettext工具的封装,用来提供多语言的输出。典型用法也是通过_(“index message id”)来提供不同语言的输出。gettextutils提供两种模式,如果用普通模式(非lasy),会调用gettext模块中translation的ugettext直接翻译输出。如果用lazy模式,_会返回一个Message对象,只有在访问Message对象的str或者unicode方法时,才会从po文件里查找对应的翻译内容。
- service
简单说就是把函数或者可执行程序放在后台执行。服务有launch函数启动,有两种启动方式:一是直接在thread里执行,另一个是创建子进程执行。nova中service的实现在nova.service中,由cmd下的all.py来启动对应的服务。启动过程首先创建service或者wsgi_service,wsgi_service由对应的manager启动,service除了manager外,还实现了rpc的接口,用来相应远程命令的实现。nova-compute’, ‘nova-network’, ‘nova-scheduler’都属于Service,’ec2′属于wsgi_service。
- periodic_task
nova在运行时需要很多定时任务,例如检查vm状态,更新节点信息等等。periodic_task是用来简化nova中定时任务的处理,通过periodic_task我们不必为每一个任务写一个单独的定时器进行调度。periodic_task的核心是一个decorator,一个metaclass,一个定时任务的基类。
periodic_task.periodic_task是decorator,它为函数设置必要的属性(例如定时间隔,执行时间等),保存在函数的属性中(函数也是对象);PeriodicTasks是定时任务的基类,它的run_periodic_tasks函数会在定时器到达时,检查并执行所有需要被执行的成员函数。而_PeriodicTasksMeta作为PeriodicTasks的metaclass,在生成PeriodicTasks类时,会把所有需要定时执行的成员函数(PeriodicTasks中被periodic_task decorated的成员函数)保存到数组_periodic_tasks中。而run_periodic_tasks函数就是在这个数组中进行检查的。
待续
一、NSString字符串连接
NSString* string; // 结果字符串
NSString* string1, string2; //已存在的字符串
1. string = [NSString initWithFormat:@"%@,%@", string1, string2 ];
2. string = [string1 stringByAppendingString:string2];</p>
3 . string = [string stringByAppendingFormat:@"%@,%@",string1, string2];
4 . string = [string stringByAppendingFormat:@"%@%@%@%@%@%@",string1, string2, string3, string4......];
可以拼接很多,%@中间加逗号字符串里也带逗号
二、NNString用法
astring = @"This is a String!";
NSLog(@"astring:%@",astring);
[astring release];
NSLog(@"astring:%@",astring);
[astring release];
//4、创建临时字符串
astring = [NSString stringWithCString:"This is a temporary string"];
NSLog(@"astring:%@",astring);
int j = 2;
NSString *astring = [[NSString alloc] initWithString:[NSString stringWithFormat:@"%d.This is %i string!",i,j]];
NSLog(@"astring:%@",astring);
[astring release];
-----从文件读取字符串-----
NSString *path = @"astring.text";
NSString *astring = [[NSString alloc] initWithContentsOfFile:path];
NSLog(@"astring:%@",astring);
[astring release];
-----写字符串到文件----
NSString *astring = [[NSString alloc] initWithString:@"This is a String!"];
NSLog(@"astring:%@",astring);
NSString *path = @"astring.text";
[astring writeToFile: path atomically: YES];
[astring release];
-----比较两个字符串-----
//1、用C比较:strcmp函数
char string1[] = "string!";
char string2[] = "string!";
if(strcmp(string1, string2) = = 0)
{
NSLog(@"1");
}
//2、isEqualToString方法
NSString *astring01 = @"This is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 isEqualToString:astring02];
NSLog(@"result:%d",result);
//3、compare方法(comparer返回的三种值:NSOrderedSame,NSOrderedAscending,NSOrderedDescending)
NSString *astring01 = @"This is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 compare:astring02] = = NSOrderedSame; //NSOrderedSame 判断两者是否相同
NSLog(@"result:%d",result);
NSString *astring01 = @"This is a String!";
NSString *astring02 = @"this is a String!";
BOOL result = [astring01 compare:astring02] = = NSOrderedAscending;
NSLog(@"result:%d",result);
//NSOrderedAscending 判断两对象值的大小(按字母顺序进行比较,astring02大于astring01为真)
NSString *astring01 = @"this is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 compare:astring02] = = NSOrderedDescending;
NSLog(@"result:%d",result);
//NSOrderedDescending 判断两对象值的大小(按字母顺序进行比较,astring02小于astring01为真)
//4、不考虑大小写比较字符串1
NSString *astring01 = @"this is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 caseInsensitiveCompare:astring02] = = NSOrderedSame;
NSLog(@"result:%d",result);
//NSOrderedDescending判断两对象值的大小(按字母顺序进行比较,astring02小于astring01为真)
//5、不考虑大小写比较字符串2
NSString *astring01 = @"this is a String!";
NSString *astring02 = @"This is a String!";
BOOL result = [astring01 compare:astring02
options:NSCaseInsensitiveSearch | NSNumericSearch] = = NSOrderedSame;
NSLog(@"result:%d",result);
//NSCaseInsensitiveSearch:不区分大小写比较 NSLiteralSearch:进行完全比较,区分大小写 NSNumericSearch:比较字符串的字符个数,而不是字符值。
NSLog(@"%@ ",order);//打印字典
NSLog(@"%@ ",imageUrlString);
grep -r "spring.profiles.active" ./
JAVA_OPTIONS="-Xmx512m -Xms512m -Xss256k -XX:MaxPermSize=256m -Djava.awt.headless=true -Dspring.profiles.active=test"