【JQuery】分割函数(split)的用法和定义

想把数字123分割成1,2,3,一开始想到JS有一个split函数,但是有没有想到的是可以通过它实现该功能,本来以为split函数的参数需要加一些分割符。

实现代码如下:

  1. var ddaystrs= new Array();
  2. ddaystrs = String("123").split("");

定义和用法
split() 方法用于把一个字符串分割成字符串数组。

语法
stringObject.split(separator,howmany)

参数  
separator 必需。字符串或正则表达式,从该参数指定的地方分割 stringObject。
howmany 可选。该参数可指定返回的数组的最大长度。如果设置了该参数,返回的子串不会多于这个参数指定的数组。如果没有设置该参数,整个字符串都会被分割,不考虑它的长度。

返回值

一个字符串数组。该数组是通过在 separator 指定的边界处将字符串 stringObject 分割成子串创建的。返回的数组中的字串不包括 separator 自身。

但是,如果 separator 是包含子表达式的正则表达式,那么返回的数组中包括与这些子表达式匹配的字串(但不包括与整个正则表达式匹配的文本)。

【JQuery】动态添加删除class方法

说明:一直只用过动态添加class方法以及删除class方法,可在写一个倒计时的时候,遇到了一个问题,要对某个标签的属性根据时间的不同来修改,一开始想到的是替换class属性,最后行不通,只好采用先全部删除标签的class属性,然后再重新添加class属性.

代码如下:

/*删除所有class*/
$(".days span").removeClass();

$(".hours span").removeClass();

$(".minutes span").removeClass();

var ddaystrs= new Array();
ddaystrs = String(dday).split("");

var ddayoneclass = "number cdL" + ddaystrs[0];
var ddaytwoclass = "number cdR" + ddaystrs[1];

$(".days span").eq(0).addClass(ddayoneclass);
$(".days span").eq(1).addClass(ddaytwoclass);

var dhourstrs= new Array();
dhourstrs = String(dhour).split("");

var dhouroneclass = "number cdL" + dhourstrs[0];
var dhourtwoclass = "number cdR" + dhourstrs[1];

$(".hours span").eq(0).addClass(dhouroneclass);
$(".hours span").eq(1).addClass(dhourtwoclass);

var dminstrs= new Array();
dminstrs = String(dmin).split("");

var dminoneclass = "number cdL" + dminstrs[0];
var dmintwoclass = "number cdR" + dminstrs[1];

$(".minutes span").eq(0).addClass(dminoneclass);
$(".minutes span").eq(1).addClass(dmintwoclass);

效果如下:

获取与设置样式

获取class和设置class都可以使用attr()方法来完成。例如使用attr()方法来获取p元素的class,JQuery代码如下:

var p_class = $("p").attr("class"); //获取p元素的class

使用attr()方法来设置p元素的class,JQuery代码如下:

$("p").attr("'class", "high"); //设置p元素的class为 "high"

大多数情况下,它是将原来的class替换为新的class,而不是在原来的基础上追加新的class。

追加样式

什么是追加class呢?假如p元素原本的class为myClass,那么追加一个名叫high的class后,class属性变为 “myClass high”,即myClass和high两种样式的叠加。JQuery提供了专门的addClass()方法来追加样式。为了使例子更容易理解,首先在 style标签里添加另一组样式:

color : red; /* 字体颜色设置红色*/
font-style:italic;
color:blue;

以上的样式中,存在两个“color”属性,而后面的“color”属性会覆盖前面的“color”属性,因此最终的“color”属性的值为“blue”,而不是“red”。

移除样式

如果用户单击某个按钮时,要删除class的某个值,那么可以使用与addClass()方法相反的removeClass()方法来完成,它的 作用是从匹配的元素中删除全部或者指定的class。例如可以使用如下的JQuery代码来删除p元素中值为“high”的class:

$("p").removeClass("high"); //移除p元素中值为"high"的class

如果要把p元素的两个class都删除,就要使用两次removeClass()方法,代码如下:

$("p").removeClass("high").removeClass("another");

jQuery提供了更简单的方法。可以以空格的方式删除多个class名,代码如下:

$("p").removeClass("high another");

此外,还可以利用removeClass()方法的一个特性来完成同样的效果。当它不带参数时,就会将class的值全部删除,JQuery代码如下:

$("p").removeClass(); //移除p元素的所有class

切换样式 JQuery中有一个方法toggle(),JQuery代码如下:

 toggleBtn.toggle(function(){
 //元素显示代码
 }, function(){
 //元素隐藏代码
 })

toggle()方法此处的作用是交替执行代码③和代码④两个函数,如果元素原来是显示的,则隐藏它:如果元素原来是隐藏的,则显示它。此时,toggle()方法主要是控制行为上的重复切换。

另外JQuery还提供了一个toggleClass()方法控制样式上的重复切换。如果类名存在则删除它,如果类名不存在则添加它。例如对p元素进行toggleClass()方法操作。

$("p").toggleClass("another"); //重复切换类名“another”

不断单击“切换样式”按钮时,p元素的class的值就会在“myClass”和“myClass another”之间重复切换。

判断是否含有某个样式 hasClass()可以用来判断元素中是甭含有某个class,如果有,则返回true,否则返回false。例如可以使用下面的代码来判断p元素中是否含有“another”的class:

$("p").hasClass("another");

个方法是为了增强代码可读性面产生的。在JQuery内部实际上是调用了is()方法来完成这个功能的.该方法等价于如下代码:

$("p").is(".another"); //is("."+class);

【JQuery】倒计时代码

function setcountdown(theyear,themonth,theday){
yr=theyear;mo=themonth;da=theday
}
setcountdown(2013,6,17)

var montharray=new Array("Jan","Feb","Mar","Apr","May","Jun","Jul","Aug","Sep","Oct","Nov","Dec")
var crosscount=''
function start_countdown(){
if (document.layers)
document.countdownnsmain.visibility="show"
else if (document.all||document.getElementById)
crosscount=document.getElementById&&!document.all?document.getElementById("countdownie") : countdownie
countdown()
}
//if (document.all||document.getElementById)
//document.write('<span id="countdownie" style="width:'+countdownwidth+'; background-color:'+countdownbgcolor+'"></span>')
window.onload=start_countdown
function countdown(){
var today=new Date()
var todayy=today.getYear()
if (todayy < 1000)
todayy+=1900
var todaym=today.getMonth()
var todayd=today.getDate()
var todayh=today.getHours()
var todaymin=today.getMinutes()
var todaysec=today.getSeconds()
var todaystring=montharray[todaym]+" "+todayd+", "+todayy+" "+todayh+":"+todaymin+":"+todaysec
futurestring=montharray[mo-1]+" "+da+", "+yr
dd=Date.parse(futurestring)-Date.parse(todaystring)
dday=Math.floor(dd/(60*60*1000*24)*1)
dhour=Math.floor((dd%(60*60*1000*24))/(60*60*1000)*1)
dmin=Math.floor(((dd%(60*60*1000*24))%(60*60*1000))/(60*1000)*1)
dsec=Math.floor((((dd%(60*60*1000*24))%(60*60*1000))%(60*1000))/1000*1)
if(dday<=0&&dhour<=0&&dmin<=0&&dsec<=1&&todayd==da){

if (document.layers){
document.countdownnsmain.document.countdownnssub.document.write(opentags+message_on_occasion+closetags)
document.countdownnsmain.document.countdownnssub.document.close()
}
else if (document.all||document.getElementById)
crosscount.innerHTML=opentags+message_on_occasion+closetags
return
}
else if (dday<=-1){
if (document.layers){
//document.countdownnsmain.document.countdownnssub.document.write(opentags+"时间已经过了!"+closetags)
//document.countdownnsmain.document.countdownnssub.document.close()
}
else if (document.all||document.getElementById)
//crosscount.innerHTML=opentags+"Occasion already passed! "+closetags
return
}
else{
if (document.layers){
//document.countdownnsmain.document.countdownnssub.document.write(opentags+dday+ " days, "+dhour+" hours, "+dmin+" minutes, and "+dsec+" seconds left until "+occasion+closetags)
//document.countdownnsmain.document.countdownnssub.document.close()
}
else if (document.all||document.getElementById)
//crosscount.innerHTML=opentags+"还有 "+dday+ " 天, "+dhour+" 小时, "+dmin+" 分, "+dsec+" 秒"
{
$(".days span").text(dday)

$(".hours span").text(dhour)

$(".minutes span").text(dmin)
}

}
setTimeout("countdown()",1000)
}

效果如下:

【mysql】经典SQL语句大全

一、基础

1、说明:创建数据库
CREATE DATABASE database-name 

2、说明:删除数据库
drop database dbname

3、说明:备份sql server
— 创建 备份数据的 device
USE master
EXEC sp_addumpdevice 'disk', 'testBack', 'c:\mssql7backup\MyNwind_1.dat'
— 开始 备份
BACKUP DATABASE pubs TO testBack
 

4、说明:创建新表
create table tabname(col1 type1 [not null] [primary key],col2 type2 [not null],..)

根据已有的表创建新表: 
A:create table tab_new like tab_old (使用旧表创建新表)
B:create table tab_new as select col1,col2… from tab_old definition only

5、说明:删除新表

drop table tabname 

6、说明:增加一个列
Alter table tabname add column col type

列增加后将不能删除。DB2中列加上后数据类型也不能改变,唯一能改变的是增加varchar类型的长度。

7、说明:添加主键: Alter table tabname add primary key(col) 
说明:删除主键: Alter table tabname drop primary key(col) 

8、说明:创建索引create [unique] index idxname on tabname(col….) 
删除索引:drop index idxname
注:索引是不可更改的,想更改必须删除重新建。


9、说明:创建视图:create view viewname as select statement 
删除视图:drop view viewname

10、说明:几个简单的基本的sql语句
选择:
select * from table1 where 范围
插入:insert into table1(field1,field2) values(value1,value2)
删除:delete from table1 where 范围
更新:update table1 set field1=value1 where 范围
查找:select * from table1 where field1 like ’%value1%’ —like的语法很精妙,查资料!
排序:select * from table1 order by field1,field2 [desc]
总数:select count as totalcount from table1
求和:select sum(field1) as sumvalue from table1
平均:select avg(field1) as avgvalue from table1
最大:select max(field1) as maxvalue from table1
最小:select min(field1) as minvalue from table1

11、说明:几个高级查询运算词
A: UNION 运算符
 
UNION 运算符通过组合其他两个结果表(例如 TABLE1 和 TABLE2)并消去表中任何重复行而派生出一个结果表。当 ALL 随 UNION 一起使用时(即 UNION ALL),不消除重复行。两种情况下,派生表的每一行不是来自TABLE1 就是来自 TABLE2。 
B: EXCEPT 运算符 
EXCEPT
 运算符通过包括所有在 TABLE1 中但不在 TABLE2 中的行并消除所有重复行而派生出一个结果表。当ALL 随 EXCEPT 一起使用时 (EXCEPT ALL),不消除重复行。 
C: INTERSECT 运算符
INTERSECT
 运算符通过只包括 TABLE1 和 TABLE2 中都有的行并消除所有重复行而派生出一个结果表。当 ALL 随 INTERSECT 一起使用时 (INTERSECT ALL),不消除重复行。 
注:使用运算词的几个查询结果行必须是一致的。 

12、说明:使用外连接 
A、left (outer) join: 
左外连接(左连接):结果集几包括连接表的匹配行,也包括左连接表的所有行。 
SQL: select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c
B:right (outer) join: 
右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。 
C:full/cross (outer) join: 
全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。

13、分组:Group by:
   
一张表,一旦分组 完成后,查询后只能得到组相关的信息。
    组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
  
  在SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
   在selecte统计函数中的字段,不能和普通的字段放在一起;

14、对数据库进行操作:
   分离数据库
 sp_detach_db; 附加数据库sp_attach_db 后接表明,附加需要完整的路径名

15.如何修改数据库的名称:
sp_renamedb 'old_name', 'new_name'

二、提升

1、说明:复制表(只复制结构,源表名:a 新表名:b) (Access可用)
法一:
select * into b from a where 1<>1(仅用于SQlServer)
法二:select top 0 * into b from a

2、说明:拷贝表(拷贝数据,源表名:a 目标表名:b) (Access可用)
insert into b(a, b, c) select d,e,f from b;

3、说明:跨数据库之间表的拷贝(具体数据使用绝对路径) (Access可用)
insert into b(a, b, c) select d,e,f from b in ‘具体数据库’ where 条件
例子:..from b in '"&Server.MapPath(".")&"\data.mdb" &"' where..

4、说明:子查询(表名1:a 表名2:b)
select a,b,c from a where a IN (select d from b ) 或者: select a,b,c from a where a IN (1,2,3)

5、说明:显示文章、提交人和最后回复时间
select a.title,a.username,b.adddate from table a,(select max(adddate) adddate from table where table.title=a.title) b

6、说明:外连接查询(表名1:a 表名2:b)
select a.a, a.b, a.c, b.c, b.d, b.f from a LEFT OUT JOIN b ON a.a = b.c

7、说明:在线视图查询(表名1:a )
select * from (SELECT a,b,c FROM a) T where t.a > 1;

8、说明:between的用法,between限制查询数据范围时包括了边界值,not between不包括
select * from table1 where time between time1 and time2
select a,b,c, from table1 where a not between 数值1 and 数值2

9、说明:in 的使用方法
select * from table1 where a [not] in (‘值1’,’值2’,’值4’,’值6’)

10、说明:两张关联表,删除主表中已经在副表中没有的信息 
delete from table1 where not exists ( select * from table2 where table1.field1=table2.field1 )

11、说明:四表联查问题:
select * from a left inner join b on a.a=b.b right inner join c on a.a=c.c inner join d on a.a=d.d where …..

12、说明:日程安排提前五分钟提醒 
SQL: select * from 日程安排 where datediff('minute',f开始时间,getdate())>5

13、说明:一条sql 语句搞定数据库分页
select top 10 b.* from (select top 20 主键字段,排序字段 from 表名 order by 排序字段 desc) a,表名 b where b.主键字段 = a.主键字段 order by a.排序字段
具体实现:
关于数据库分页:

  declare @start int,@end int

  @sql  nvarchar(600)

  set @sql=’select top’+str(@end-@start+1)+’+from T where rid not in(select top’+str(@str-1)+’Rid from T where Rid>-1)’

  exec sp_executesql @sql


注意:在top后不能直接跟一个变量,所以在实际应用中只有这样的进行特殊的处理。Rid为一个标识列,如果top后还有具体的字段,这样做是非常有好处的。因为这样可以避免 top的字段如果是逻辑索引的,查询的结果后实际表中的不一致(逻辑索引中的数据有可能和数据表中的不一致,而查询时如果处在索引则首先查询索引

14、说明:前10条记录
select top 10 * form table1 where 范围

15、说明:选择在每一组b值相同的数据中对应的a最大的记录的所有信息(类似这样的用法可以用于论坛每月排行榜,每月热销产品分析,按科目成绩排名,等等.)
select a,b,c from tablename ta where a=(select max(a) from tablename tb where tb.b=ta.b)

16、说明:包括所有在 TableA 中但不在 TableB和TableC 中的行并消除所有重复行而派生出一个结果表
(select a from tableA ) except (select a from tableB) except (select a from tableC)

17、说明:随机取出10条数据
select top 10 * from tablename order by newid()

18、说明:随机选择记录
select newid()

19、说明:删除重复记录
1),
delete from tablename where id not in (select max(id) from tablename group by col1,col2,…)
2),select distinct * into temp from tablename
  delete from tablename
  insert into tablename select * from temp
评价: 这种操作牵连大量的数据的移动,这种做法不适合大容量但数据操作
3),例如:在一个外部表中导入数据,由于某些原因第一次只导入了一部分,但很难判断具体位置,这样只有在下一次全部导入,这样也就产生好多重复的字段,怎样删除重复字段

alter table tablename
–添加一个自增列
add  column_b int identity(1,1)
 delete from tablename where column_b not in(
select max(column_b)  from tablename group by column1,column2,…)
alter table tablename drop column column_b

20、说明:列出数据库里所有的表名
select name from sysobjects where type='U' // U代表用户

21、说明:列出表里的所有的列名
select name from syscolumns where id=object_id('TableName')

22、说明:列示type、vender、pcs字段,以type字段排列,case可以方便地实现多重选择,类似select 中的case。
select type,sum(case vender when 'A' then pcs else 0 end),sum(case vender when 'C' then pcs else 0 end),sum(case vender when 'B' then pcs else 0 end) FROM tablename group by type
显示结果:
type vender pcs

电脑 A 1
电脑 A 1
光盘 B 2
光盘 A 2
手机 B 3
手机 C 3

23、说明:初始化表table1

TRUNCATE TABLE table1

24、说明:选择从10到15的记录
select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

三、技巧

1、1=1,1=2的使用,在SQL语句组合时用的较多

“where 1=1” 是表示选择全部    “where 1=2”全部不选,
如:
if @strWhere !='' 
begin
set @strSQL = 'select count(*) as Total from [‘ + @tblName + ‘] where ' + @strWhere 
end
else 
begin
set @strSQL = 'select count(*) as Total from [‘ + @tblName + ‘]' 
end

我们可以直接写成

错误!未找到目录项。
set @strSQL = 'select count(*) as Total from [‘ + @tblName + ‘] where 1=1 安定 '+ @strWhere 2、收缩数据库
–重建索引
DBCC REINDEX
DBCC INDEXDEFRAG
–收缩数据和日志
DBCC SHRINKDB
DBCC SHRINKFILE

3、压缩数据库
dbcc shrinkdatabase(dbname)

4、转移数据库给新用户以已存在用户权限
exec sp_change_users_login 'update_one','newname','oldname'
go

5、检查备份集
RESTORE VERIFYONLY from disk='E:\dvbbs.bak'

6、修复数据库
ALTER DATABASE [dvbbs] SET SINGLE_USER
GO
DBCC CHECKDB('dvbbs',repair_allow_data_loss) WITH TABLOCK
GO
ALTER DATABASE [dvbbs] SET MULTI_USER
GO

7、日志清除
SET NOCOUNT ON
DECLARE @LogicalFileName sysname,
 @MaxMinutes INT,
 @NewSize INT

USE tablename — 要操作的数据库名
SELECT  @LogicalFileName = 'tablename_log', — 日志文件名
@MaxMinutes = 10, — Limit on time allowed to wrap log.
 @NewSize = 1  — 你想设定的日志文件的大小(M)

Setup / initialize
DECLARE @OriginalSize int
SELECT @OriginalSize = size 
 FROM sysfiles
 WHERE name = @LogicalFileName
SELECT 'Original Size of ' + db_name() + ' LOG is ' + 
 CONVERT(VARCHAR(30),@OriginalSize) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(@OriginalSize*8/1024)) + 'MB'
 FROM sysfiles
 WHERE name = @LogicalFileName
CREATE TABLE DummyTrans
 (DummyColumn char (8000) not null)


DECLARE @Counter    INT,
 @StartTime DATETIME,
 @TruncLog   VARCHAR(255)
SELECT @StartTime = GETDATE(),
 @TruncLog = 'BACKUP LOG ' + db_name() + ' WITH TRUNCATE_ONLY'

DBCC SHRINKFILE (@LogicalFileName, @NewSize)
EXEC (@TruncLog)
— Wrap the log if necessary.
WHILE @MaxMinutes > DATEDIFF (mi, @StartTime, GETDATE()) — time has not expired
 AND @OriginalSize = (SELECT size FROM sysfiles WHERE name = @LogicalFileName)  
 AND (@OriginalSize * 8 /1024) > @NewSize  
 BEGIN — Outer loop.
SELECT @Counter = 0
 WHILE   ((@Counter < @OriginalSize / 16) AND (@Counter < 50000))
 BEGIN — update
 INSERT DummyTrans VALUES ('Fill Log') DELETE DummyTrans
 SELECT @Counter = @Counter + 1
 END
 EXEC (@TruncLog)  
 END
SELECT 'Final Size of ' + db_name() + ' LOG is ' +
 CONVERT(VARCHAR(30),size) + ' 8K pages or ' + 
 CONVERT(VARCHAR(30),(size*8/1024)) + 'MB'
 FROM sysfiles 
 WHERE name = @LogicalFileName
DROP TABLE DummyTrans
SET NOCOUNT OFF

8、说明:更改某个表
exec sp_changeobjectowner 'tablename','dbo'

9、存储更改全部表

CREATE PROCEDURE dbo.User_ChangeObjectOwnerBatch
@OldOwner as NVARCHAR(128),
@NewOwner as NVARCHAR(128)
AS

DECLARE @Name    as NVARCHAR(128)
DECLARE @Owner   as NVARCHAR(128)
DECLARE @OwnerName   as NVARCHAR(128)

DECLARE curObject CURSOR FOR 
select 'Name'    = name,
   'Owner'    = user_name(uid)
from sysobjects
where user_name(uid)=@OldOwner
order by name

OPEN   curObject
FETCH NEXT FROM curObject INTO @Name, @Owner
WHILE(@@FETCH_STATUS=0)
BEGIN     
if @Owner=@OldOwner 
begin
   set @OwnerName = @OldOwner + '.' + rtrim(@Name)
   exec sp_changeobjectowner @OwnerName, @NewOwner
end
— select @name,@NewOwner,@OldOwner

FETCH NEXT FROM curObject INTO @Name, @Owner
END

close curObject
deallocate curObject
GO


10、SQL SERVER中直接循环写入数据
declare @i int
set @i=1
while @i<30
begin
    insert into test (userid) values(@i)
    set @i=@i+1
end
案例
有如下表,要求就裱中所有沒有及格的成績,在每次增長0.1的基礎上,使他們剛好及格:

    Name     score

    Zhangshan   80

    Lishi       59

    Wangwu      50

    Songquan    69

while((select min(score) from tb_table)<60)

begin

update tb_table set score =score*1.01

where score<60

if  (select min(score) from tb_table)>60

  break

 else

    continue

end

数据开发-经典


1.按姓氏笔画排序:
Select * From TableName Order By CustomerName Collate Chinese_PRC_Stroke_ci_as //从少到多

2.数据库加密:
select encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1–相同;否则不相同 encrypt('原始密码')
select pwdencrypt('原始密码')
select pwdcompare('原始密码','加密后密码') = 1–相同;否则不相同

3.取回表中字段:
declare @list varchar(1000),
@sql nvarchar(1000) 
select @list=@list+','+b.name from sysobjects a,syscolumns b where a.id=b.id and a.name='表A'
set @sql='select '+right(@list,len(@list)-1)+' from 表A' 
exec (@sql)

4.查看硬盘分区:
EXEC master..xp_fixeddrives

5.比较A,B表是否相等:
if (select checksum_agg(binary_checksum(*)) from A)
     =
    (select checksum_agg(binary_checksum(*)) from B)
print '相等'
else
print '不相等'

6.杀掉所有的事件探察器进程:
DECLARE hcforeach CURSOR GLOBAL FOR SELECT 'kill '+RTRIM(spid) FROM master.dbo.sysprocesses
WHERE program_name IN('SQL profiler',N'SQL 事件探查器')
EXEC sp_msforeach_worker '?'

7.记录搜索:
开头到N条记录
Select Top N * From 表
——————————-
NM条记录(要有主索引ID)
Select Top M-N * From 表 Where ID in (Select Top M ID From 表) Order by ID   Desc
———————————-
N到结尾记录
Select Top N * From 表 Order by ID Desc
 

案例
例如1:一张表有一万多条记录,表的第一个字段 RecID 是自增长字段, 写一个SQL语句, 找出表的第31到第40个记录。

 select top 10 recid from A where recid not  in(select top 30 recid from A)

分析:如果这样写会产生某些问题,如果recid在表中存在逻辑索引。

    select top 10 recid from A where……是从索引中查找,而后面的select top 30 recid from A则在数据表中查找,这样由于索引中的顺序有可能和数据表中的不一致,这样就导致查询到的不是本来的欲得到的数据。

解决方案

1, 用order by select top 30 recid from A order by ricid 如果该字段不是自增长,就会出现问题

2, 在那个子查询中也加条件:select top 30 recid from A where recid>-1

例2:查询表中的最后以条记录,并不知道这个表共有多少数据,以及表结构。
set @s = 'select top 1 * from T   where pid not in (select top ' + str(@count-1) + ' pid  from  T)'

print @s      exec  sp_executesql  @s

9:获取当前数据库中的所有用户表
select Name from sysobjects where xtype='u' and status>=0

10:获取某一个表的所有字段
select name from syscolumns where id=object_id('表名')

select name from syscolumns where id in (select id from sysobjects where type = 'u' and name = '表名')

两种方式的效果相同

11:查看与某一个表相关的视图、存储过程、函数
select a.* from sysobjects a, syscomments b where a.id = b.id and b.text like '%表名%'

12:查看当前数据库中所有存储过程
select name as 存储过程名称 from sysobjects where xtype='P'

13:查询用户创建的所有数据库
select * from master..sysdatabases D where sid not in(select sid from master..syslogins where name='sa')
或者
select dbid, name AS DB_NAME from master..sysdatabases where sid <> 0x01

14:查询某一个表的字段和数据类型
select column_name,data_type from information_schema.columns
where table_name = '表名'

15:不同服务器数据库之间的数据操作

创建链接服务器

exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '

exec sp_addlinkedsrvlogin  'ITSV ', 'false ',null, '用户名 ', '密码 '

–查询示例

select * from ITSV.数据库名.dbo.表名

–导入示例

select * into 表 from ITSV.数据库名.dbo.表名

以后不再使用时删除链接服务器

exec sp_dropserver  'ITSV ', 'droplogins '

 

连接远程/局域网数据(openrowset/openquery/opendatasource)

–1、openrowset

–查询示例

select * from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

–生成本地表

select * into 表 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

 

–把本地表导入远程表

insert openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)

select *from 本地表

–更新本地表

update b

set b.列A=a.列A

 from openrowset( 'SQLOLEDB ', 'sql服务器名 '; '用户名 '; '密码 ',数据库名.dbo.表名)as a inner join 本地表 b

on a.column1=b.column1

–openquery用法需要创建一个连接

–首先创建一个连接创建链接服务器

exec sp_addlinkedserver   'ITSV ', ' ', 'SQLOLEDB ', '远程服务器名或ip地址 '

–查询

select *

FROM openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')

–把本地表导入远程表

insert openquery(ITSV,  'SELECT *  FROM 数据库.dbo.表名 ')

select * from 本地表

–更新本地表

update b

set b.列B=a.列B

FROM openquery(ITSV,  'SELECT * FROM 数据库.dbo.表名 ') as a 

inner join 本地表 b on a.列A=b.列A

 

–3、opendatasource/openrowset

SELECT   *

FROM   opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ' ).test.dbo.roy_ta

–把本地表导入远程表

insert opendatasource( 'SQLOLEDB ',  'Data Source=ip/ServerName;User ID=登陆名;Password=密码 ').数据库.dbo.表名

select * from 本地表 

SQL Server基本函数

SQL Server基本函数

1.字符串函数 长度与分析用

1,datalength(Char_expr) 返回字符串包含字符数,但不包含后面的空格
2,substring(expression,start,length) 取子串,字符串的下标是从“1”,start为起始位置,length为字符串长度,实际应用中以len(expression)取得其长度
3,right(char_expr,int_expr) 返回字符串右边第int_expr个字符,还用left于之相反
4,isnull( check_expression , replacement_value )如果check_expression為空,則返回replacement_value的值,不為空,就返回check_expression字符操作类

5,Sp_addtype 自定義數據類型
例如:EXEC sp_addtype birthday, datetime, 'NULL'

6,set nocount {on|off}
使返回的结果中不包含有关受 Transact-SQL 语句影响的行数的信息。如果存储过程中包含的一些语句并不返回许多实际的数据,则该设置由于大量减少了网络流量,因此可显著提高性能。SET NOCOUNT 设置是在执行或运行时设置,而不是在分析时设置。
SET NOCOUNT 为 ON 时,不返回计数(表示受 Transact-SQL 语句影响的行数)。
 SET NOCOUNT 为 OFF 时,返回计数
常识
在SQL查询中:from后最多可以跟多少张表或视图:256
SQL语句中出现 Order by,查询时,先排序,后取
SQL中,一个字段的最大容量是8000,而对于nvarchar(4000),由于nvarchar是Unicode码。    
SQLServer2000同步复制技术实现步骤
一、 预备工作
1.发布服务器,订阅服务器都创建一个同名的windows用户,并设置相同的密码,做为发布快照文件夹的有效访问用户
--管理工具
--计算机管理
--用户和组
--右键用户
--新建用户
--建立一个隶属于administrator组的登陆windows的用户(SynUser)
2.在发布服务器上,新建一个共享目录,做为发布的快照文件的存放目录,操作:
我的电脑--D:\ 新建一个目录,名为: PUB
--右键这个新建的目录
--属性--共享
--选择"共享该文件夹"
--通过"权限"按纽来设置具体的用户权限,保证第一步中创建的用户(SynUser) 具有对该文件夹的所有权限
--确定
3.设置SQL代理(SQLSERVERAGENT)服务的启动用户(发布/订阅服务器均做此设置)
开始--程序--管理工具--服务
--右键SQLSERVERAGENT
--属性--登陆--选择"此账户"
--输入或者选择第一步中创建的windows登录用户名(SynUser)
--"密码"中输入该用户的密码
4.设置SQL Server身份验证模式,解决连接时的权限问题(发布/订阅服务器均做此设置)
企业管理器
--右键SQL实例--属性
--安全性--身份验证
--选择"SQL Server 和 Windows"
--确定
5.在发布服务器和订阅服务器上互相注册
企业管理器
--右键SQL Server组
--新建SQL Server注册...
--下一步--可用的服务器中,输入你要注册的远程服务器名 --添加
--下一步--连接使用,选择第二个"SQL Server身份验证"
--下一步--输入用户名和密码(SynUser)
--下一步--选择SQL Server组,也可以创建一个新组
--下一步--完成
6.对于只能用IP,不能用计算机名的,为其注册服务器别名(此步在实施中没用到)
 (在连接端配置,比如,在订阅服务器上配置的话,服务器名称中输入的是发布服务器的IP)
开始--程序--Microsoft SQL Server--客户端网络实用工具
--别名--添加
--网络库选择"tcp/ip"--服务器别名输入SQL服务器名
--连接参数--服务器名称中输入SQL服务器ip地址
--如果你修改了SQL的端口,取消选择"动态决定端口",并输入对应的端口号
二、 正式配置
1、配置发布服务器
打开企业管理器,在发布服务器(B、C、D)上执行以下步骤:
(1) 从[工具]下拉菜单的[复制]子菜单中选择[配置发布、订阅服务器和分发]出现配置发布和分发向导 
(2) [下一步] 选择分发服务器 可以选择把发布服务器自己作为分发服务器或者其他sql的服务器(选择自己)
(3) [下一步] 设置快照文件夹
采用默认\\servername\Pub
(4) [下一步] 自定义配置 
可以选择:是,让我设置分发数据库属性启用发布服务器或设置发布设置
否,使用下列默认设置(推荐)
(5) [下一步] 设置分发数据库名称和位置 采用默认值
(6) [下一步] 启用发布服务器 选择作为发布的服务器
(7) [下一步] 选择需要发布的数据库和发布类型
(8) [下一步] 选择注册订阅服务器
(9) [下一步] 完成配置
2、创建出版物
发布服务器B、C、D上
(1)从[工具]菜单的[复制]子菜单中选择[创建和管理发布]命令
(2)选择要创建出版物的数据库,然后单击[创建发布]
(3)在[创建发布向导]的提示对话框中单击[下一步]系统就会弹出一个对话框。对话框上的内容是复制的三个类型。我们现在选第一个也就是默认的快照发布(其他两个大家可以去看看帮助)
(4)单击[下一步]系统要求指定可以订阅该发布的数据库服务器类型,
SQLSERVER允许在不同的数据库如 orACLE或ACCESS之间进行数据复制。
但是在这里我们选择运行"SQL SERVER 2000"的数据库服务器
(5)单击[下一步]系统就弹出一个定义文章的对话框也就是选择要出版的表
注意: 如果前面选择了事务发布 则再这一步中只能选择带有主键的表
(6)选择发布名称和描述
(7)自定义发布属性 向导提供的选择:
是 我将自定义数据筛选,启用匿名订阅和或其他自定义属性
否 根据指定方式创建发布 (建议采用自定义的方式)
(8)[下一步] 选择筛选发布的方式 
(9)[下一步] 可以选择是否允许匿名订阅
1)如果选择署名订阅,则需要在发布服务器上添加订阅服务器
方法: [工具]->[复制]->[配置发布、订阅服务器和分发的属性]->[订阅服务器] 中添加
否则在订阅服务器上请求订阅时会出现的提示:改发布不允许匿名订阅
如果仍然需要匿名订阅则用以下解决办法 
[企业管理器]->[复制]->[发布内容]->[属性]->[订阅选项] 选择允许匿名请求订阅
2)如果选择匿名订阅,则配置订阅服务器时不会出现以上提示
(10)[下一步] 设置快照 代理程序调度
(11)[下一步] 完成配置
当完成出版物的创建后创建出版物的数据库也就变成了一个共享数据库
有数据 
srv1.库名..author有字段:id,name,phone, 
srv2.库名..author有字段:id,name,telphone,adress 
要求: 
srv1.库名..author增加记录则srv1.库名..author记录增加 
srv1.库名..author的phone字段更新,则srv1.库名..author对应字段telphone更新 
--*/ 
--大致的处理步骤 
--1.在 srv1 上创建连接服务器,以便在 srv1 中操作 srv2,实现同步 
exec sp_addlinkedserver 'srv2','','SQLOLEDB','srv2的sql实例名或ip' 
exec sp_addlinkedsrvlogin 'srv2','false',null,'用户名','密码' 
go
--2.在 srv1 和 srv2 这两台电脑中,启动 msdtc(分布式事务处理服务),并且设置为自动启动
。我的电脑--控制面板--管理工具--服务--右键 Distributed Transaction Coordinator--属性--启动--并将启动类型设置为自动启动 
go 
--然后创建一个作业定时调用上面的同步处理存储过程就行了 
企业管理器 
--管理 
--SQL Server代理 
--右键作业 
--新建作业 
--"常规"项中输入作业名称 
--"步骤"项 
--新建 
--"步骤名"中输入步骤名 
--"类型"中选择"Transact-SQL 脚本(TSQL)" 
--"数据库"选择执行命令的数据库 
--"命令"中输入要执行的语句: exec p_process 
--确定 
--"调度"项 
--新建调度 
--"名称"中输入调度名称 
--"调度类型"中选择你的作业执行安排 
--如果选择"反复出现" 
--点"更改"来设置你的时间安排 
然后将SQL Agent服务启动,并设置为自动启动,否则你的作业不会被执行 
设置方法: 
我的电脑--控制面板--管理工具--服务--右键 SQLSERVERAGENT--属性--启动类型--选择"自动启动"--确定. 
--3.实现同步处理的方法2,定时同步 
--在srv1中创建如下的同步处理存储过程 
create proc p_process 
as 
--更新修改过的数据 
update b set name=i.name,telphone=i.telphone 
from srv2.库名.dbo.author b,author i 
where b.id=i.id and
(b.name <> i.name or b.telphone <> i.telphone) 
--插入新增的数据 
insert srv2.库名.dbo.author(id,name,telphone) 
select id,name,telphone from author i 
where not exists( 
select * from srv2.库名.dbo.author where id=i.id) 
--删除已经删除的数据(如果需要的话) 
delete b 
from srv2.库名.dbo.author b 
where not exists( 
select * from author where id=b.id)
go

【php】搭建CVS服务器和CVS客户端教程

       在Linux和Windows下搭建CVS服务器与CVS客户端的详细配置指南

  ***********************************

  目录:

  一、CVS入门知识详解

  1、什么是 CVS?

  2、CVS基本概念

  二、Linux下CVS服务器与客户端的配置

  1、Linux下CVS服务器的配置

  2、Linux下CVS客户端的配置

  三、Windows下CVS服务器与客户端的配置

  1、windows下CVS服务器的配置

  2、windows下CVS客户端的配置

  四、结束语

  *********************************** 

  一、CVS入门知识详解 

  1、什么是 CVS? 

  CVS 是一种客户机/服务器系统,类似于microsoft SourceSafe,可以让开发人员将他们的项目存储在称为资源库的中央位置。使用 cvs 客户机工具,开发人员可以对资源库的内容进行更改。CVS 资源库会依次记录对每个文件所做的每个更改,并创建一个完整的项目开发进展历史。开发人员可以请求特定源文件的旧版本、查看更改日志,并根据需要执行其它 一些有用的任务。所有重要的免费软件项目都使用 CVS 作为其程序员之间的中心点,以便能够综合各程序员的改进和更改。这些项目包括: Gnome, KDE, The GIMP, Wine, 等等。 

  CVS 的基本工作思路是这样的:在一台服务器上建立一个仓库,仓库里可以存放许多不同项目的源程序。由仓库管理员统一管理这些源程序.这样,就好象只有一个人在 修改文件一样.避免了冲突.每个用户在使用仓库之前,首先要把仓库里的项目文件下载到本地。用户做的任何修改首先都是在本地进行,然后用 cvs 命令进行提交,由 cvs 仓库管理员统一 修改.这样就可以做到跟踪文件变化,冲突控制等等. 

  CVS可以协助一组人共同开发一个工程。如果你是一个项目中的一组成员之一,CVS也能够帮助你。除非你特别仔细,你很容易覆盖其他人的工作。一些编辑 器,例如GNUEmacs,试图去判定一个文件是否被两人同时修改。不幸的是,如果一个人使用其它的编辑器时,这个安全方式将不再有效。CVS使用让不同 开发者独立工作的方式解决了这个问题。每一个开发者的工作都在他自己的目录内,并且CVS将 在每个开发者的工作完成后进行合并工作。 

  由于 CVS 是典型的 C/S 结构的软件,因此它也分成服务器端和客户端两部分。不过大多数CVS 软件都把它们合二为一了。我们这里就分别从服务器和客户端的角度讨论cvs的使用。 

  2、CVS基本概念 

  Repository(仓库)

  CVS的仓库存储全部的版本控制下的文件copy,通常不容许直接访问,只能通过cvs命令,获得一份本地copy,改动后再check in(commit)回仓库。而仓库通常为与工作目录分离的。CVS通过多种方式访问仓库。每种方法有不同目录表示形式。数据如何存放在 repository中:随着CVS版本的不同,存放结构会发生变化,一般情况下用户无需了解数据到底是如何存放的。 

  Revision(修订版)

  每一个file的各个revision都不相同,形如1.1, 1.2.1,一般1.1是该文件的第一个revision,后面的一个将自动增加最右面的一个整数,比如1.2, 1.3, 1.4…有时候会出现1.3.2.2,原因见后。revision总是偶数个数字。一般情况下将revision看作时CVS自己内部的一个编号,而 tag则可以标志用户的特定信息。 

  Tag(标签)

  用符号化的表示方法标志文件特定revision的信息。通常不需要对某一个孤立的文件作tag,而是对所有文件同时作一个tag,以后用户可以仅向特定 tag的文件提交或者checkout。另外一个作用是在发布软件的时候表示哪些文件及其哪个版本是可用的;各文件不同revision可以包括在一个 tag中。如果命名一个已存在的tag默认将不会覆盖原来的; 

  Branch(分支)

  当用户修改一个branch时不会对另外的branch产生任何影响。可以在适当的时候通过合并的方法将两个版本合起来;branch总是在当前 revision后面加上一个偶数整数(从2开始,到0结束),所以branch总是奇数个数字,比如1.2后面branch为1.2.2,该分支下 revision可能为1.2.2.1,1.2.2.2,… 

  Conflict(冲突)

  完全是纯文本的冲突,不包含逻辑上的矛盾,比如CVS不能解决如下问题:某人修改了函数f的参数,而另外一个人在另外一个地方用老的参数调用该函数。文本 冲突需要用户自己参与解决,CVS无法自动解决

  Module(模块):CVS服务器根目录下的第一级子目录。通常用于存放一个项目的所有文件

  Check out(检出):通常指将仓库中的一整个模块首次导出到本地。

  Check in(导入)::通常指通过提交整个目录结构并创建一个新的模块。

  Release(发行版本):整个产品的版本

  Update(更新):从模块中下载其他人的修改过的文件。更新本地的拷贝。

  Commit(提交):将自己修改过的文件提交到模块中。 

  二、Linux下CVS服务器与客户端的配置与使用 

  1、Linux下CVS服务器的配置

  在RedHat Linux 7.1之后的版本上,都有自动安装CVS服务器软件,只要对该软件进行设置,即可使用。此次配置我用的是虚拟机VMware环境下的linux redhat9.0,下面是具体的配置过程。 

  1.1 创建cvs组并加入用户

  在root权限下,创建一个cvs组并加入成员

  1) 创建组:groupadd cvs

  2) 打开/etc/group文件,找到该组,如cvs:x:514:,在后面添加要加入的用户,比如piaoyang,chen等,以逗号隔开,编辑结果是:cvs:x:514:piaoyang, chen

  只有加入这个组中的成员才能进行相关CVS操作。保存该文件。 

  1.2 创建一个仓库

  假定将CVSROOT指向/usr/local(也可以指向别的目录),用root登录。

  1) 创建cvsroot目录:mkdir /usr/local/cvsroot

  2) 设置该目录的模式:chmod 1777 /usr/local/cvsroot

  3) 修改环境变量:export CVSROOT= /usr/local/cvsroot

  4) cvs init 这样就创建了 CVSROOT。

  5) 更新环境变量:

  #source /etc/profile

  此时系统已经认识$CVSROOT这样的环境变量 

  1.3 装入源代码

  1) 进入代码所在目录:cd [sourcedir],如cd test

  2) 装载cvs import -m “[repository test]” [cvstest] [vendortag] [releasetag]

  -m后面引号内填入log内容,接下来是源代码模块名称,接着是装载者,最后是标识符号,

  例如:cvs import –m “cvs test” cvstest piaoyang start

  cvs组中的用户也可以创建仓库,但必须有写权限,该权限的设置在下面将会提到。(如还有不明之处,请联系飘扬,你可以到我的博客(飘扬博客)给我留言或QQ,我会尽力解答你的问题。) 

  1.4 设置权限

  cvs初始化结束以后,在管理员用户(这里是cvs用户)的主目录/usr/local/cvsroot/下有一个 CVSROOT 目录,这个目录里有三个配置文件:readers,writers, passwd。我们可以通过设置这三个文件来配置 CVS 服务器用户的权限,下面分别介绍这几个文件的作用:

  readers文件:此文件中的用户允许对模块进行读取,不允许写入;

  writers文件:此文件中的用户允许对模块进行读取和写入;

  passwd文件:此文件存储用户名和密码,当用户登录时进行验证;

  1) readers和writers的格式如下,每个用户占据一行:

  aaa

  bbb

  ccc

  2) passwd文件的格式如下,每个用户占据一行:

  [cvs 用户名]:[加密的口令]:[等效系统用户名]

  如: piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:piaoyang

  其中“piaoyang:$1$rPVPciBw$IK3fb4jO7hQbPXFjK3ee..:”从/etc/shadow中拷贝过来。

  3) 上面三个文件在缺省安装的时候可能都不存在,需要我们自己创建,好吧,现在还是让我们用一个例子来说明吧。假设我们有下面几个用户需要使用 cvs:

  laser,gumpwu,henry,betty,anonymous

  其中 laser 和 gumpwu 是系统用户,而henry, betty, anonymous 我们都不想给系统用户权限,并且 betty 和 anonymous 都是只读用户,而且 anonymous 更是连口令都没有。

  然后编辑 cvs 管理员家目录里 CVSROOT/passwd 文件,加入下面几行: 

  laser:$xxefajfka;faffa33:cvspub gumpwu:$ajfaal;323r0ofeeanv:cvspub henry:$fajkdpaieje:cvspub betty:fjkal;ffjieinfn/:cvspub anonymous::cvspub 

  注意:上面的第二个字段(分隔符为 :)是密文口令,从/etc/shadow中拷贝过来即可(此方法适合cvs用户较少的情况,如果用户过多,则需要自己用程序生成密码了)。

  编辑 readers 文件,加入下面几行:

  anonymous

  betty

  编辑 writer 文件,加入下面几行:

  laser

  gumpwu

  henry

  这样就 ok 了,你再用几个用户分别登陆测试,就会发现一切都 ok 了。这里面的原理和说明我想就不多说了,其实很简单,和系统管理用户的概念是一样的。 

  1.5 设置开机自动运行CVS

  1) 在/etc/xinetd.d目录下生成一个文件cvspserver。输入命令:

  touch cvspserver

  vi cvspserver

  在cvspserver文件里写入如下内容并保存:

  # CVS : current version contrl system # DEFAULT: services is enable # this server script was be writed by piaoyang.org # www.piaoyang.org service cvspserver { socket_type = stream protocol = tcp wait = no user = root server = /usr/bin/cvs server_args = -f –allow-root=/usr/local/cvsroot pserver log_on_success +=USERID log_on_failure +=USERID disable = no } 

  2) 修改该文件权限:

  chmod 644 cvspserver

  3),到/etc/rc.d/init.d路径下,运行如下指令重新启动xinetd即可:

  ./xinetd restart

  4) 重启后用root登录,察看cvs服务器是否已经运行:

  netstat -l |grep cvspserver

  如果返回tcp 0 0 *:cvspserver *:* LISTEN,则说明cvs服务器已经运行。 

  2、Linux下CVS客户端的配置

  为了连接到 CVS 资源库,您需要知道称为 “CVSROOT” 的路径。CVSROOT 是一个字符串,就象 URL,它告诉 CVS用户远程资源库在哪里,以及如何连接它。不仅如此,根据 CVS 资源库是本地的还是远程的,以及连接到它的不同方式,CVS 还有许多不同的 CVSROOT 格式。 

  2.1 连接CVS服务器

  当然你必须拥有cvs用户帐号和密码,以及相关权限。在Linux环境下:

  1) 本地 CVSROOT

  export CVSROOT=/usr/local/cvsroot (告诉CVS客户端,存放代码的资源库在什么地方)

  一个实际的例子,在版本管理员将代码库存放在192.168.0.8 的机器上,路径为:

  /usr/local/cvsroot(如果你telnet 到 192.168.0.8 的机器上的时候,此时你就是在本机)

  2) 远程密码服务器 CVSROOT

  export CVSROOT=:pserver::/usr/local/cvsroot(注意冒号不能漏掉,句子中间没有空格)

  pserver 是CVS内部的一种传输协议。

  piaoyang 是用户名,

  192.168.0.8 机器的IP或名字(如果有DNS才能用名字)

  /usr/local/cvsroot 是代码库的具体路径

  (注意:如果你不想每次敲这么多枯燥的命令,你可以在你登陆的时候让系统作这些事情,具体的作法是修改你登录的环境变量。现在用piaoyang作为例子,在文件/home/piaoyang/.bash_profile后面加入

  export CVSROOT=/home/cvsroot 或export CVSROOT=:pserver::/home/cvsroot

  并在根目录下运行:. ./.bash_profile) 

  2.2 登录CVS服务器

  cvs login

  (Logging in to )

  CVS password:(在此输入密码) 

  2.3 拷贝相应模块代码并进行开发

  如输入: cvs -z5 checkout VPN

  此命令告诉 CVS 客户端使用 gzip 压缩级 5 (”-z5″) 在慢速连接上加快传输速度,来检出 (”checkout”)VPN模块。

  一旦检出命令完成,将在包含最新源码的当前工作目录中看到 “VPN” 目录。还会注意到每个子目录下都有一个”CVS”目录 — CVS 在这些目录中存储帐户信息,可以放心地忽略它们。一旦检出结束,用户就无需担心是否设置了 CVSROOT 环境变量,也无需再在命令行上指定它,因为现在所有额外的 “CVS” 目录里都有它的缓存。

  记住:只需要为初始登录和检出设置 CVSROOT。至此你就可以在刚才check out的VPN模块上进行修改或开发了


  三、Windows下CVS服务器与客户端的配置 

  1、windows下CVS服务器的配置

  在此,我们以WinCVS为例来介绍。WinCVS顾名思义,是用在windows上的,它是一款相当不错的基于Windows的CVS客户端软件。安装 时没有什么特别的地方,与普通的Windows软件相同,一路next就OK了。(在http: //www1212.com/project 上下载到最新的或其它版本的WinCVS。)由于是软件界面配置,所以针对界面选项填入相应的参数即可,在此不再赘述。 

  2、windows下CVS客户端的配置

  同样我们以WinCVS为例来介绍。安装这个WinCVS不用再啰嗦一遍了吧,跳过,来看配置过程! 

  2.1 配置WinCVS

  选择Admin->Preferences…,在出现的界面上进行一般选项的设置:

  1) Authentication:用来配置cvs服务器的认证方式,可以从下拉框中选择其它的认证方式,不过一般只要选择默认的pserver方式就可以,要注意的是必须与cvs服务器配置时所指定的认证方式一致;

  2) Path:用来配置cvs在服务器上的主目录路径,也就是服务器上用进行cvs初始化的目录,如:/home/cvsroot;

  3) Host Address:用来配置cvs服务器所在服务器的地址,可以是IP地址,也可以是DNS名,如:10.104.1.204;

  4) User name:用来配置要使用些WinCVS来登录CVS服务器的用户名,如:cvsyxwu,用户的登录必须由管理员把其添加cvs用户组中;

  5) CVSROOT:此项一般都不需要用户进行修改,用户在输入上边的几个选项时,系统将自动根据用户的输入生成此项的相应内容。

  6)在上一个界面上选择“Globals” ,进行全局选项的设置,此项的配置主要是要注意这几选项:

  第一,Checkout read-only不要选上,否则,checkout出来的源代码将不允许用户进行修改,并且此选项默认是选中的;

  第二,Prune (remove) empty directories也不要选上,否则,会自动删除空目录;

  第三,对一般配置没有特殊要求的,把Dirty files support、Supply control when adding与TCP/IP compression选项选中; 

  2.2 登录WinCVS服务器

  选择Admin->login,将出现如下对话框要求用户输入登录口令。输入口令后,选择“OK”按钮,如果CVS服务器与WinCVS的配置都没出错的话,将在CVS的状态栏中提示:

  cvs -z9 -d :pserver::/home/cvsroot login

  Logging in to :pserver::2401/home/cvsroot

  ***** CVS exited normally with code 0 *****

  code 0表示正确的登录;而如果出错的话,将是code 1,那么要根据错误的提示进行相应的修改。 

  2.3拷贝相应模块代码并进行开发

  1) 在workspace中的Modules选中要存放checkout模块的目录;

  2) 选择Create->Checkout Modeles,将出现一个对话框,需要进行选择。其中,Module name and path on the server就是要存放checkout 内容的目录,由用户输入;而Local folder to checkout to就是第一种用户所选择的目录。

  3) 至此你就可以在刚才check out的代码上进行修改或开发了。

Jhonse技术博客说明:

来源于: 去云博客

【技术新闻】产品经理回家过年请坐火车

云科技读者投稿。该作者是中国人民大学的柳洋同学。峰哥做了删改

坐火车对一个产品经理是个莫大的享受。只有在火车上才能聚集如此多的用户,如此多的终端,用户足够无聊,时间足够充裕,交流足够便利。

尤其是过年的火车。你能获得非常多有价值的信息。

中国人民大学的老校长黄达有一次被学生问到:“春运这么难,不鼓励国人回家过年不就化解了吗?”

老校长说:春运是必须的。春运在形式上是几亿人集中的东西大挪移,实质上价值包括:1、沿海文化对内地人群的灌输。2、沿海务工接受内地传统的熏陶。3、资金的流动,弥补东西差距。4、亲情维持,稳定社会。

春运是个大熔炉。我愿意相信,一个NB产品会抓住这个春节上一个台阶。比如,微信不是有3亿用户了吗?春节过后会到多少?3.5亿还是4亿?

案例一:

T61。北京到昆明的火车硬座区,某大二学生跑过来跟同学聊天。“….balabala……我来之前把电脑充满了电,还有两块备用电池,就等着在车上看电影,看个爽…..”。

跟她对话的学生,拿出手机看看剩余电量说,“才过3个小时,玩了会游戏,就快没电了”。

所以很多人手机中会装金山电池医生或360省电王这样的应用。来关注和保养电池。

在火车上你会看到充电宝这样的设备大行其道。在长途的T和K字头的火车上,列车员一般会在第二天兜售充电宝,而且价格不菲。

如果小米或魅族发布下一代产品时,有个主打亮点是电池耐用性。带着这款手机你坐火车从北京到拉萨,行程43小时40分,待机时间超过行程,不需要充电宝。一台手机,一个背包,行天下。

案例二:

T145。北京到南昌的火车硬座区,三个北京高校第一次放假回家的学生,在班级QQ群里聊天。两个联通3G网络,一个移动2G网络。2G那个同学聊天信息永远比别人刷出来慢很多。

所以每次他发出的信息总是跟群里聊天的内容前言不搭后语,三个人一直在捧腹大笑。

每天泡在办公室wifi下的产品经理们,你为用户考虑过这个问题吗?

微信朋友圈,在移动2G网络下,北京的sim卡,在其他城市分享图片后无法获取”显示所在城市“的位置信息。已尝试过的城市有哈尔滨,南京,郑州。转到wifi下,立即可获取。

豆瓣FM,在没有wifi情况下,自动转到红心歌曲的播放,多么体贴的设计。同时,让用户不管在什么网络情况下都能继续听豆瓣FM。

案例三:

T145。北京到南昌硬座区,一个农民工兄弟,用一款叫不出名字的国产山寨机在发短信,用的是手写输入法。

突然令我感触很深,自己的父亲也不会拼音。每次发短信也只能用手写输入法。是不是声音输入是对他们的一次解放?

父母辈让我帮助选购智能机时,告诉我的第一要求,不么双核、屏幕、处理器。而是字号。

你还是会一知半解,装模作样的给自己的应用加上调节字体大小的设置。像微信,虽然设置了字体大小选择,但从小到超大,变化幅度不大。最大的字号,我老花眼的母亲依然看不清楚。

再看一下iPhone的设置中,字体从20磅到56磅,一个大范围的跨度,这是真正贴心。

案例四:

T18。哈尔滨到北京卧铺区,一个满头白发的老头,在刷微信的朋友圈,我十分惊讶。

上去攀谈,原来他爱好摄影,旅行,骑马。好潮的老头子。是朋友介绍他使用微信的,现在通过微信和这三个圈子的朋友保持联系。他给我看朋友圈的照片,用手机能拍出这样的照片确实佳作。

但是…他抱怨。他朋友都是在朋友圈一次传多张照片,前面几张刷出来了,后面几张却刷不出来。

他用的是移动2G网络,我告诉他是运营商的问题,他不同意。说:“给你一点网络,你就该把图片都刷出来。每次都要太长时间,长了就不想看了。”

又一个在不同网络下的问题。既然是网络的问题,能不能给用户一点提示?像weico的客户端刷图片,告诉用户这张图片刷了多少,大概还要刷多少,给一个心理预期。

案例五:逛车厢

K59。北京到广州卧铺区,第一次坐30小时的火车。还好我还没开始工作,没压力,没钱,有时间,正好坐这种慢慢悠悠的火车。

逛了6节卧铺车厢,发现坐这种车的人和坐动车的人的手机完全不同。首先是iPhone瞬间减少。在D和G字头的车上,基本人手一部iPhone。如果不是,也是三星或者htc之流。

而在这趟车上,大量国产机涌现。pad和PC也要远远小于D和G字头的列车。

使用应用的情况:拿出手机的人都在玩游戏,或者聊QQ和微信,基本没人发短信。移动通信市场已是腾讯一家天下。

跟做动车的另外一个明显区别是,用设备看电子书,听音乐,学英语的基本没有。

……

扯了这么多,希望IT圈的PM们过年回家坐趟火车,受点苦,接地气。

对了,在火车上碰到一个在艾瑞实习的同学。问他们最近做啥项目。说腾讯手机浏览器给了艾瑞58万,做一个用户调研。

我问她为什么花这么多钱,他说大部分钱都用在电话调查上了。好吧,我忽然有点明白大公司的毛病了。对于这种人傻钱多的公司,建议他们的白富美和高富帅都去坐火车吧。

Jhonse技术博客说明:

原文链接:http://www.yunkeji.com/?p=9424