炽翼铁冰's Blog

Trying to become a programmer

c++ 猜数字

 

#include <stdlib.h>
#include <iostream>

using namespace std;

int main()
{
    int number = rand()%100;
    int guess = -1;
    int trycount = 0;
    while(guess != number && trycount < 8)
    {
        cout<< "Please enter a guess: ";
        cin >> guess;

        if( guess < number)
            cout<<"Too low"<<endl;

        if( guess > number)
            cout<<"Too high"<<endl;

        trycount++;
    }
    if(guess == number)
        cout<<"You guessed the number";
    else
        cout <<"Sorry, the number was: <<"<< number;
    return 0;
}

在字符串中查找是否有重复字符(转)

http://blog.csdn.net/lilypp/article/details/6124683

【方法1】这是最节省内存的方法,但是效率一般般。复杂度为O(n2)。
思路是,从字符串的第一个字符开始,看后面有没有和它相同字符。

 

bool RepeatChar_2(char* str)
{
	if (*str == 0) return false;
	for (char *p = str; *p != 0; p++)
	{
		for (char *q = p + 1; *q != 0; q++)
		{
			if (*p == *q)
			{
				return true;
			}
		}
	}
	return false;
}

 

 

【方法2】此类题目追求的所谓最优解是复杂度越低越好,这个方法效率很高,O(N),空间换时间,需要辅助空间。思路是,开辟一个具有256个元素的整型数组,为什么是256个元素呢,因为ASCII字符一共256个(从0开始,前128个为常用的字符,如运算符、字母、数字等键盘上可以显示的,后128个为特殊字符,是键盘上找不到的字符)。这个数组的index就是字符的ASCII码,值就是该元素出现的次数。

 

bool RepeatChar_1(char* str)
{
	if (*str == 0) return false;

	int num[256] = {0};
	char *p = str;
	
	while(*p !=0)
	{
		if (num[*p] >=1)
		{
			return true;
		}
		num[*p]++;  //字符范围为0~128,扫描字符串,对应数组下标的值+1,重复的话即return
		p++;
	}

	return false;
}

 

【方法3】

 

bool RepeatChar_3(char* str)
{
	if (*str == 0) return false;
	int num[256] = {0};
	char *p = str;

	while (*p != 0 && num[*p] == 0)
	{
		num[*p++] = 1;
	}

	return *p == 0 ? false : true;

}

匹配函数

#include <stdio.h>
typedef int BOOL;
#define TRUE 1
#define FALSE 0

static const char MWILDCHAR = '*';
static const char SWILDCHAR = '?';
BOOL recmatch(const char* p, const char* s)
{

	char c;
	BOOL result;

	printf("test here\n");
	c = *(p++);
	printf("test here c=[%c]\n", c);
	if( c==0x00)
	{
		return *s == 0x0; //匹配空
	}
	if( c==SWILDCHAR)
	{
		return (*s!=0x0)? recmatch(p, s+1):FALSE;  //"?"模糊匹配(不包括空字符)
	}
	if( c==MWILDCHAR)  // "*"匹配所有字符
	{
		if(*p == 0)
			return TRUE;
		for( ; *s!=0x0;s++)
		{
			result = recmatch(p, s);
			if( result )
				return result;
		}
		return FALSE;
	}

	return (c==*s) ? recmatch(p, s+1):FALSE;
}

int main(void)
{
	char test1[]="abc*";
	char test2[]="abc";
	BOOL result= recmatch(test1, test2);
	printf("test1=[%s] test2=[%s] match result=[%d]\n", test1, test2, result);
}

创建视图 ORA-01031: 权限不足

转自:http://blog.sina.com.cn/s/blog_5d32e4930100txkv.html

视图就是一种虚拟的表,为了方便把各类表所需要的字段取出来创建的一张新的虚拟表。视图的增删改需要触发器的配合。

 

如果只是查找同一方案中的表去创建视图,则只需要该用户有create view的权限便可创建。但是如果创建的视图涉及到要查询别的方案中的表,这时我们就需要select any table的权限了。

 

授权命令:

cmd

sqlplus "/as sysdba

grant select any table,create view to user;

 

 

附:

oracle的系统和对象权限
  alter any cluster 修改任意簇的权限
  alter any index 修改任意索引的权限
  alter any role 修改任意角色的权限
  alter any sequence 修改任意序列的权限
  alter any snapshot 修改任意快照的权限
  alter any table 修改任意表的权限
  alter any trigger 修改任意触发器的权限
  alter cluster 修改拥有簇的权限
  alter database 修改数据库的权限
  alter procedure 修改拥有的存储过程权限
  alter profile 修改资源限制简表的权限
  alter resource cost 设置佳话资源开销的权限
  alter rollback segment 修改回滚段的权限
  alter sequence 修改拥有的序列权限
  alter session 修改数据库会话的权限
  alter sytem 修改数据库服务器设置的权限
  alter table 修改拥有的表权限
  alter tablespace 修改表空间的权限
  alter user 修改用户的权限
  analyze 使用analyze命令分析数据库中任意的表、索引和簇
  audit any 为任意的数据库对象设置审计选项
  audit system 允许系统操作审计
  backup any table 备份任意表的权限
  become user 切换用户状态的权限
  commit any table 提交表的权限
  create any cluster 为任意用户创建簇的权限
  create any index 为任意用户创建索引的权限
  create any procedure 为任意用户创建存储过程的权限
  create any sequence 为任意用户创建序列的权限
  create any snapshot 为任意用户创建快照的权限
  create any synonym 为任意用户创建同义名的权限
  create any table 为任意用户创建表的权限
  create any trigger 为任意用户创建触发器的权限
  create any view 为任意用户创建视图的权限
  create cluster 为用户创建簇的权限
  create database link 为用户创建的权限
  create procedure 为用户创建存储过程的权限
  create profile 创建资源限制简表的权限
  create public database link 创建公共数据库链路的权限
  create public synonym 创建公共同义名的权限
  create role 创建角色的权限
  create rollback segment 创建回滚段的权限
  create session 创建会话的权限
  create sequence 为用户创建序列的权限
  create snapshot 为用户创建快照的权限
  create synonym 为用户创建同义名的权限
  create table 为用户创建表的权限
  create tablespace 创建表空间的权限
  create user 创建用户的权限
  create view 为用户创建视图的权限
  delete any table 删除任意表行的权限
  delete any view 删除任意视图行的权限
  delete snapshot 删除快照中行的权限
  delete table 为用户删除表行的权限
  delete view 为用户删除视图行的权限
  drop any cluster 删除任意簇的权限
  drop any index 删除任意索引的权限
  drop any procedure 删除任意存储过程的权限
  drop any role 删除任意角色的权限
  drop any sequence 删除任意序列的权限
  drop any snapshot 删除任意快照的权限
  drop any synonym 删除任意同义名的权限
  drop any table 删除任意表的权限
  drop any trigger 删除任意触发器的权限
  drop any view 删除任意视图的权限
  drop profile 删除资源限制简表的权限
  drop public cluster 删除公共簇的权限
  drop public database link 删除公共数据链路的权限
  drop public synonym 删除公共同义名的权限
  drop rollback segment 删除回滚段的权限
  drop tablespace 删除表空间的权限
  drop user 删除用户的权限
  execute any procedure 执行任意存储过程的权限
  execute function 执行存储函数的权限
  execute package 执行存储包的权限
  execute procedure 执行用户存储过程的权限
  force any transaction 管理未提交的任意事务的输出权限
  force transaction 管理未提交的用户事务的输出权限
  grant any privilege 授予任意系统特权的权限
  grant any role 授予任意角色的权限
  index table 给表加索引的权限
  insert any table 向任意表中插入行的权限
  insert snapshot 向快照中插入行的权限
  insert table 向用户表中插入行的权限
  insert view 向用户视图中插行的权限
  lock any table 给任意表加锁的权限
  manager tablespace 管理(备份可用性)表空间的权限
  references table 参考表的权限
  restricted session 创建有限制的数据库会话的权限
  select any sequence 使用任意序列的权限
  select any table 使用任意表的权限
  select snapshot 使用快照的权限
  select sequence 使用用户序列的权限
  select table 使用用户表的权限
  select view 使用视图的权限

    select any dictionary 可查找任何字典
  unlimited tablespace 对表空间大小不加限制的权限
  update any table 修改任意表中行的权限
  update snapshot 修改快照中行的权限
  update table 修改用户表中的行的权限
  update view 修改视图中行的权限

const 与define的区别

转自:http://www.phpweblog.net/maple094/archive/2008/05/30/4054.html

define部分:
宏不仅可以用来代替常数值,还可以用来代替表达式,甚至是代码段。(宏的功能很强大,但也容易出错,所以其利弊大小颇有争议。)
 

宏的语法为:

#define 宏名称 宏值

注意,宏定义不是C或C++严格意义上的语句,所以其行末不用加分号结束。
 

作为一种建议和一种广大程序员共同的习惯,宏名称经常使用全部大写的字母。

利用宏的优点:

1)让代码更简洁明了

当然,这有赖于你为宏取一个适当的名字。一般来说,宏的名字更要注重有明确直观的意义,有时宁可让它长点。

2)方便代码维护



对宏的处理,在编译过程中称为“预处理”。也就是说在正式编译前,编译器必须先将代码出现的宏,用其相应的宏值替换,这个过程有点你我在文字处理软件中的查找替换。所以在代码中使用宏表达常数,归根结底还是使用了立即数,并没有明确指定这个量的类型。这容易带来一些问题,所以C++使用另一更稳妥的方法来代替宏的这一功能。

const部分
 

常量定义的格式为:

const 数据类型 常量名 = 常量值;

而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查。常量必须一开始就指定一个值,然后,在以后的代码中,我们不允许改变此常量的值。

两者之间的区别:
    内存空间的分配上。define进行宏定义的时候,不会分配内存空间,编译时会在main函数里进行替换,只是单纯的替换,不会进行任何检查,比如类型,语句结构等,即宏定义常量只是纯粹的置放关系,如#define null 0;编译器在遇到null时总是用0代替null它没有数据类型(还有疑问请找C语言书籍看预处理部分或者看MSDN.而const定义的常量具有数据类型,定义数据类型的常量便于编译器进行数据检查,使程序可能出现错误进行排查,所以const与define之间的区别在于const定义常量排除了程序之间的不安全性.

 

tar备份

  转自:http://eezjye.blog.163.com/blog/static/164760659201051093817291/

tar

系统备份:tar -cvf 目标文件名/设备名 备份文件,例如: 


tar -cvf backup.tar * 
命令将当前目录下的所有文件(包括各级子目录)都打包在backup.tar文件中。 


tar -cvf /dev/rmt/0 * 
命令将当前目录下的所有文件(包括各级子目录)都打包到磁带上。

 

查看tar文件的内 容:tar tvf 目标文件名/设备名,例如: 
tar -tvf backup.tar 
tar -tvf /dev/rmt/0 


将tar文件中的内容恢复到指定目录中去:tar xvf 目标文件名/设备名 [目录名],例 如: 
tar -xvf backup.tar /home 
tar -xvf /dev/rmt/0 /home 

oracle环境变量

新建变量名:NLS_DATE_FORMAT

变量值:YYYY/MM/DD HH24:MI:SS

crontab 无法写入的问题

本博文将帮助您解决以下问题:

转自:http://gma011.elfove.cn/blog/246

1)crontab -e,编辑后提示:设备上没有空间

2)没有空间的原因,和解决办法。快速删除/var/spool/clientmqueue/目录下存在大量文件

3)如何避免以后出现类似问题。

     搜索结果如下:
     问题现象:linux操作系统中的/var/spool/clientmqueue/目录下存在大量文件。
     原因分析:系统中有用户开启了cron,而cron中执行的程序有输出内容,输出内容会以邮件形式发给cron的用户,而sendmail没有启动所以就产生了这些文件;
     解决办法:
   将crontab里面的命令后面加上> /dev/null 2>&1
 2>&1:把错误重定向到输出要送到的地方。即把上述命令的执行结果重定向到/dev/null,即抛弃,同时,把产生的错误也抛弃。
 
     看了一下crontab中的内容, 果真是有人没有将程序输出的内容和错误没有定向,导致每次执行crontab中的程序就在/var/spool/clientmqueue/下产生一个小文件,居然还有两个程序是每分钟执行一次,基本上一天要产生近20W个文件.
 
     接下来当然是先将/var/spool/clientmqueue/下的文件删掉!这儿还有一个小技巧:
     cd /var/spool/clientmqueue
     如果文件太多,占用空间太大,用rm命令删除慢的话,就执行下面的命令:ls | xargs rm -f
 
      现在有空间了,就可以修改crontab了,首先将crontab中没有定向输出的都加上> /dev/null 2>&1, 不然的话,没几分钟/var/spool/clientmqueue/就又有好些个文件了!
      最后最后将需要修改的crontab中的内容加上就ok了!!

tuxedo 监控命令说明

TUXEDO作为优秀的中间件,被广泛的应用在电信、金融等领域。

通过简单的命令就可以对其进行比较全面的运行状况监控的。

下面简单做一些相关的介绍。

以AIX5.3为操作系统环境。

TUXEDO版本是8.1。

下面简单说明,以 tmboot  -y 启动TUXEDO服务。

输入下面的命令即可进入TUXEDO的监控环境了,

tmadmin


 


一、查看服务信息psr
(1) 命令: printserver 简写 psr
(2)  psr [-m machine] [-g groupname] [-i srvid] [-q qaddress]
-m machine LMID为 machine的所有服务进程
-g groupname 组名为groupname的所有服务进程
-I srvid SRVID为srvid的服务进程
-q qaddress 消息队列为qaddress的所有SERVERS查看server的信息
(3) 结果示例:
Prog Name Queue Name Grp Name   ID  RqDone  Load Done Current Service
--------- ---------- --------   --  ------  --------- ---------------
rz_Ecsb   00004.04000  APGP2    4000   0        0        (  IDLE )
BBL       70020        simple   0      1        50       (  IDLE )
IFMTMS    APGP2_TMS    APGP2    30001  1        50       (  IDLE )
ftpserv32 00002.00001  FTPGP    1      60      3000      (  IDLE )


结果说明:
列号  描述
1. 服务的可执行文件名
2. 服务连接的队列名
3. 组名
4. 服务的数字id
5. 服务已经处理的请求数(该SERVER的所有service的负载因子总和)
6. 服务处理的全部请求的参数和,如果当前没有service被调用,则为IDLE


二、查看交易信息psc
(1)  命令: printservice  简写: psc
psc [-m machine] [-g groupname] [-I srvid] [-q qaddress]
[-s service] [-a {0|1|2}]
-s service 显示名为sevice的service信息
-a {0|1|2} 显示系统的隐含的service
其他参数与psr命令相同
(2)  结果示例:
ServiceName Routine Name Prog Name Grp Name  ID Machine # Done   Status
416701      rz_Ecsb     rz_Ecsb    APGP2   4000  simple    0    AVAIL
416601      rz_Ecsb     rz_Ecsb    APGP2   4000  simple    0    AVAIL
416501      rz_Ecsb     rz_Ecsb    APGP2   4000  simple    0    AVAIL
(3)  结果说明:
列号    描述
1. Service Name :服务名
2. Routine Name :函数名(采用TUXEDO服务的别名机制,一个函数可以对应多个服务名)
3. Prog Name :service 所在的SERVER名
4. Grp Name :组名
5. ID :server的ID号
6. Machine :server所在的LMID
7. # Done :service被调用的次数
8. Status :service的状态。AVAIL表示可用

三、

查看队列信息pq
(1) 命令: printqueue 简写:pq [PADRESS]
(2) 结果示例:
pq 00004.05062
Prog Name  Queue Name  # Serve  Wk Queued  # Queued  Ave. Len  Machine
CCS_GEDAIPC_50 00004.05062     1     0        0       0.0       simple

(3) 结果说明:
列号    描述
1. Prog Name :队列连接的服务的可执行文件名
2. Queue Name :字符队列名,是RQADDR参数或一个随机值
3. #Serve :连接的服务数
4. Wk Queued :当前队列的所有请求的参数和
5. #Queued :实际请求数
6. Ave.Len :平均队列长度
7. Machine :队列所在机器的LMID


四、查看客户端信息pclt
(1) 命令: printclient 简写:pclt
-m machine 显示LMID号为machine上的客户端连接
-u username 显示用户名为username 的客户端连接
-c ctlname 显示用户进程为ctlname的客户端连接
(2) 结果示例:
  LMID   User Name    Client Name    Time    Status  Bgn/Cmmt/Abrt
simple   ccsmis          WSH        17:42:47   IDLE      0/0/0
simple   ccsmis          tmadmin    0:44:28    IDLE      0/0/0
(3) 结果说明:
列号  描述
1. 已经登录的客户端机器的LMID
2. 用户名,由tpinit()提供的
3. 客户端名,由tpinit()提供的
4. 客户端连接后经过的时间
5. 客户端状态
6. IDLE——表示客户端目前没有任何交易在工作
7. IDLET——表示客户端启动了一个交易
8. BUSY——表示客户端在工作中
9. BUSYT——表示客户端正在交易控制下工作
10. 启动/提交/中断的交易数

五、查看部分统计信息bbs
(1) 命令: bbstats  简写:bbs
> bbs
Current Bulletin Board Status:
Current number of servers: 335
Current number of services: 2324
Current number of request queues: 27
Current number of server groups: 11
Current number of interfaces: 0

六、观察某个节点的进程信息default
(1) 命令:default –m
> default -m SITE13

SITE13> psr
Prog Name  Queue Name  Grp Name  ID RqDone Load Done Current Service
BBL        30004.00000 SITE13         0  22827   1141350 ..ADJUNCTBB
BRIDGE     836437      SITE13         1      0         0 (  IDLE )
GWADM      00021.00019 BGWGRP1+      19      0         0 (  IDLE )
GWTDOMAIN  00021.00020 BGWGRP1+      20 123826         0
GWADM      00022.00021 BGWGRP2+      21      0         0 (  IDLE )
GWTDOMAIN  00022.00022 BGWGRP2+      22      0         0 (  IDLE )
GWADM      00025.00027 GWGRP1_+      27      4       200 (  IDLE )


 

七、查看消息发送状态pnw
(1) 命令:printnetwork 简写 pnw
> pnw SITE12

SITE12  Connected To:  msgs sent    msgs received
             SITE14      61904            62319
             SITE13      61890            62288
             SITE11      15972            13564


八、退出管理模式q
(1) 命令: quit  简写:q


本文来自CSDN博客,转载请标明出处:http://blog.csdn.net/lazy2008/archive/2009/05/27/4220452.aspx

编译proc程序可用makefile文件

 

#---------------------------------------------
# rules of making *.pc, DON'T change anytime !
# Author: 
.c.o:
	$(CC) $*.c ;
	echo    "        $(CC) $*.c\n";
.pc.o:
	$(PROC) iname=$*.pc
	$(CC) $*.c  
	@rm     $*.c
	@rm *.lis
	@echo   " "

.SUFFIXES:      .pc  .c  .o
#---------------------------------------------
OS=Linux
MACRO=TUXEDO
MACRO1=FUN

#PROCFLAGS = unsafe_null= yes dynamic=ansi mode=oracle dbms=v8 parse=full
PROCFLAGS = mode=oracle dbms=v8 dynamic=ansi unsafe_null=yes PARSE=none code=ansi_c lines=yes


CC      =       gcc $(INCL) -D$(OS) -D$(MACRO) -c  
PROC    =       proc $(INCL_PC) $(PROCFLAGS)
INCL    =	-I$(HOME)/incl -I$(HOME)/tbincl -I$(TUXDIR)/include \
		-I$(ORACLE_HOME)/precomp/public -I$(ORACLE_HOME)/rdbms/public\
		

INCL_PC =	include=$(ORACLE_HOME)/precomp/public \
		include=$(TUXDIR)/include \
                include=$(ORACLE_HOME)/rdbms/public \


LIB	=	 -f $(ORACLE_HOME)/lib/libclntsh.so
#将foo替换为需要编译的程序
OBJS    =	foo.o

FOBJS    =	-f foo.o

SOBJS    =	-s foo.o

BIN	=	foo

$(BIN):$(OBJS)

	#gcc -o $(BIN) $(OBJS) -L $(ORACLE_HOME)/lib -lcurses  -l clntsh $(LIB)
	buildclient $(FOBJS) $(LIB) -o $(BIN) -v -w
	@rm *.o
	@rm tp??????
	@echo   " "
	@echo	"       ==================MAKE [$(BIN)] SUCCESS!!=============="
#mv $(BIN) $(HOME)/bin