越来越觉得自己走测试这条路是对的,越来越觉得自己适合做测试,这么久以来兴趣一直在激发我前进,一直在寻找下一个站点,我相信测试路上我一定会走的很远,我的测试道路一定会很宽阔,努力就有收获,也希望还在测试路口迷惘的朋友,不要再犹豫了,因为你的犹豫不决,会使你错过很多~~~~~喜欢就去just do it ,因为只有尝试了才知道自己适不适合,喜不喜欢。如果一味的问别人,永远找不到最终的答案。因为每个人的感觉不一样,每个人的情况不一样,每个人的前提条件都不一样,你会得到不同的答案,这样只能会使你更迷茫~~~~

发布新日志

  • JMeter基础之—录制脚本

    2015-11-05 11:25:17

    Jmeter 是一个非常流行的性能测试工具,虽然与LoadRunner相比有很多不足,比如:它结果分析能力没有LoadRunner详细;很它的优点也有很多:

      l       开源,他是一款开源的免费软件,使用它你不需要支付任何费用,

      l       小巧,相比LR的庞大(最新LR11将近4GB),它非常小巧,不需要安装,但需要JDK环境,因为它是使用java开发的工具。

          l       功能强大,jmeter设计之初只是一个简单的web性能测试工具,但经过不段的更新扩展,现在可以完成数据库、FTPLDAPWebService等方面的测试。因为它的开源性,当然你也可以根据自己的需求扩展它的功能。

    我觉得它更像一个瑞士**,小巧,且功能齐全。初次认识Jmeter的时候,我觉得它不好,是因为相比LR来说,它没有脚本录制功能,也许不是没有,只是我不知道,因为文档上介绍的是这样,我要做一个web性能测试的话,就手动的一个个添加循环控制器、http信息管理头、http请求等等各种元件。如果测试的脚本较多时,这无疑是个体力活。

           Badboy是一款不错web自动化测试工具,利用它来录制脚本,并且录制的脚本可以直接保存为JMeter文件来使用。我无疑给我们带来了很大我方便。

    ----------------------我的环境------------

    Badboy  version 2.1.1

    Apache  JMeter-2.3.4 (需要JDK环境来运行)

    --------------------------------------------

    第一种方法:通过bodboy来录制脚本。

     

    1.打开人badboy工具,点击工栏目上的红色圆形按钮,在地址栏目中输入被测试项目的地址。

     

    录制完成后,点击工具栏旁边黑色按钮,结束录制。

    选择“文件”--àExport to Jmeter…

     

     

     

    2.打开Jmeter工具,选择“文件”-->“打开”选择刚才保存的文件(.jmx类型),将文件导入进来了。

     

     

     

    第二种方法,通过JMeter自身设置来录制脚本。

     

    这种方法是我才发现的(鄙视一下自己的无知,嘻嘻~!),觉得方法比较简单。 

    1.       打开JMeter工具

    创建一个线程组(右键点击“测试计划”--->“添加”---->“线程组”)

    创建一个http代理服务器(右键点击“工作台”--->“添加”--->“非测试元件”--->“http代理服务器”

    完整的设置参照下图:

     

    2.  下面来设置一下IE浏览器

    IE--->“internet属性”--->“连接”--->“局域网设置”

    设置为本机IP就可以了,注意端口号要与Jmeter上的端口号一致。默认都是8080端口。

    3.   现在点击jmeter上的“启动”按钮,打开浏览器输入需要录制web项目地址,jmeter会自动记录你IE所访问的页面。

    PS:第二种方法是我刚才知道的一种,关于这两种方法哪个更好,现在还不知道,但第二方法有通过IE浏览器辅助的,我想可能只要IE能打开的,它都能记录,但它录制的脚本看上去比较乱(感觉上)

    还就是http代理服务器的设置,(比如:分组:每一个组放入一个新的服务器---只有这一个选项才能正常录制),有时间再仔细比较一下两种方法的不同之处。

  • 性能测试监控工具nmon安装及使用方法

    2015-11-02 17:03:16

    1、概述$^'eJgnO$g| G0

    {:T"^:O6nh6F"}/K)nLB @0  监控,在检查系统问题或优化系统性能工作上是一个不可缺少的部分。通过操作系统监控工具监视操作系统资源的使用情况,间接地反映了各服务器程序的运行情况。根据运行结果分析可以帮助我们快速定位系统问题范围或者性能瓶颈点。

    AK,{.l$i!z9A051Testing软件测试网$w IoixY?

      nmon是一种在AIX与各种Linux操作系统上广泛使用的监控与分析工具,相对于其它一些系统资源监控工具来说,nmon所记录的信息是比较全面的,它能在系统运行过程中实时地捕捉系统资源的使用情况,并且能输出结果到文件中,然后通过nmon_analyzer工具产生数据文件与图形化结果。51Testing软件测试网&Rx.? M&o"IO

    51Testing软件测试网3b`%t ] Pb J@n|L

      nmon所记录的数据包含以下一些方面(也是我们在寻找问题过程中所关注的资源点):51Testing软件测试网!Sc2D:dfM

    TG A&qe5p7Au0  ● cpu占用率51Testing软件测试网Q)E [,t'd gH\QxO,d

    e*ID}XD0  ● 内存使用情况51Testing软件测试网xz p+~,?

    A%VIw9Glp z D*z0  ● 磁盘I/O速度、传输和读写比率51Testing软件测试网&]'v;w1N{u H

    ;K+@ }-~x.t;iL&T!n0  ● 文件系统的使用率51Testing软件测试网3^:h0k7^7g,e&mY!aO

    51Testing软件测试网2il)F#{5HB _

      ● 网络I/O速度、传输和读写比率、错误统计率与传输包的大小

    Np4\B}?-@GgY0

    /og)Tr0a:["f,U0  ● 消耗资源最多的进程

    (iq%I S:DG`wz051Testing软件测试网%~}m2O3Y k8p

      ● 计算机详细信息和资源

    g X ~`Bj051Testing软件测试网K7\cXf#e(j~My

      ● 页面空间和页面I/O速度51Testing软件测试网:gRBsBh

    51Testing软件测试网&|?T+SdA*V#g(R

      ● 用户自定义的磁盘组51Testing软件测试网:wy2M(?!Mrj5?$^

    4v n)A2VkB[:I0  ● 网络文件系统51Testing软件测试网? ?0E+U"pWyE z

    51Testing软件测试网&Daj;[3J;K-O.k#a8_A

      另外在AIX操作系统上,nmon还能监控到其他的一些信息,如异步I/O等。51Testing软件测试网#f!~6OR.]4fCE

    51Testing软件测试网'nXj7d;r]#O

      2、下载安装nmon51Testing软件测试网T*fi;YQL`

    A,UyEhQ!p~0  如何获取nmon呢?我们可以在IBM的官方网站上免费下载获取,下载网址为:http://www.ibm.com/developerworks/wikis/display/WikiPtype/nmon。

    4b8|]f\W051Testing软件测试网/E0s/J*UkX2H

      nmon的安装步骤如下:

    \ `I:eJGHh0

    ;E*w k4\C-v1It0  1)用root用户登录到系统中;51Testing软件测试网UM*Jw'e x:{t'H

    t&j YhVZ \o0  2)建目录:#mkdir /test;

    @s8Kf S7aA051Testing软件测试网 U b2@B+pi(~E

      3)把nmon用ftp上传到/test,或者通过其他介质拷贝到/test目录中;51Testing软件测试网h^C3Jd.ZyHk/P{

    cQ3OBX8x S2[Jd0  4)执行授权命令:#chmod +x nmon。

    RM QS LC t1c;?5a051Testing软件测试网$a9UXl8U'Rk

      3、nmon数据采集

    &Zz4u5qceR0

    )HnR qpS^Wb0  3.1 数据采集

    n3@qfM7b0

    vma W,KR"Fd0  为了实时监控系统在一段时间内的使用情况并将结果记录下来,我们可以通过运行以下命令实现:51Testing软件测试网4s3fM8fX _n

    h}R pZJ"x0  #./ nmon -f -t -s 30 -c 18051Testing软件测试网2Oy9_#a7x XH

    )^7?n3n[(?;D)ms0  n -f:按标准格式输出文件:<hostname>_YYYYMMDD_HHMM.nmon;51Testing软件测试网 s0`_e#^_El!e

    51Testing软件测试网0{Y.T M9I\G

      n -t:输出中包括占用率较高的进程;

    -R Q\w0Q1w1u051Testing软件测试网{~0V;b/n O"bk

      n -s 30:每30秒进行一次数据采集51Testing软件测试网-En xZy!V0mm9AT

    51Testing软件测试网MX!ei r*Q p4y/c R

      n -c 180:一共采集180次51Testing软件测试网*M| j'K*@3\

    -ZenZ#_ z*Q/J$x0  输入命令回车后,将自动在当前目录生成一个hostname_timeSeries.nmon的文件,如果hosname为test1,生产的文件为:test1_090308_1313.nmon。51Testing软件测试网#yg mok1i8J,D,R;b

    51Testing软件测试网1w`0rYwO bn_

    'QQ @U&P]q0  通过sort命令可以将nmon结果文件转换为csv文件:51Testing软件测试网D ^ a3B+m\

    51Testing软件测试网`T\N4R?I

      # sort -A test1_090308_1313.nmon > test1_090308_1313.csv51Testing软件测试网(r&^P HE4O*{

    51Testing软件测试网rL"U@G2X'w

      执行完sort命令后即可在当前目录生产test1_090308_1313.csv文件。51Testing软件测试网Z$lW0EW(m

    51Testing软件测试网r{ Uxx

      3.2 生成图形化结果51Testing软件测试网/B0hLq ad.kKs

    51Testing软件测试网L o9L$^ZQ+j:Z

      为了分析nmon监控获得的结果,IBM还提供了相应的图形化分析工具nmon_analyser,通过nmon analyser.xls工具可以把监控的结果文件转换成excel文件,方便分析系统的各项资源占用情况。51Testing软件测试网'T clhe5a%R

    51Testing软件测试网 xK;k!C)U7_

      nmon analyser.xls工具的使用方法如下:51Testing软件测试网3T*WU} b\"u9R

    51Testing软件测试网0aucV'x6[)n!d

      (1)打开nmon analyser.xls工具;

    0N*g!O6{8nx$^4~v051Testing软件测试网"LM%Ye'A{4?zZ_l{

      (2)调整excel宏安全性:工具-宏-安全性

    9@g-sk%l2E4D0

    ^6A J|@ `4W]^0  (修改安全级别与可靠发行商)51Testing软件测试网q&^4XqWy,\ KM

    Qrx(A-p] n ]0  (选择)安全级别:低51Testing软件测试网S4k+R_IP){"c

    51Testing软件测试网k8]-}CRM

      (勾上)信任所有安装的加载项和模板

    Wy X2j,O.B-LNW0

    ,n GWhVMn0b0  (勾上)信任对于“Visual Baisc项目”的访问

    uz)yy]_%vr:\3z051Testing软件测试网TO2lH v8^d `h

      (3)修改完后,确定-关闭nmon analyser.xls,重新打开;

    xx8IoGu%~"HK0

    1[| M2~}0  (4)点击Analyse nmon data按钮,加载之前下载的test1_090308_1313.csv文件。

    "`d v~6_nK"M051Testing软件测试网`R0^!U z bR }

      以下是分析结果的截图:

    3vp7}1L*Y:QY!xr0

    5|d&X [ ]/vFX0

      以上就是nmon的简单描述与使用介绍,大家可以根据自己所采集到的结果分析系统的情况。

  • [转]从程序员到项目经理(三):认识项目经理

    2015-05-21 15:02:59

    本文转自:http://www.cnblogs.com/watsonyin/archive/2012/09/25/2701483.html

    (阅读提示:本文比较长,如赶时间,可直接跳到第二节的第四点,即“西西吹雪的六种能力模型”) 

        在希腊德尔斐的阿波罗神庙上,刻得着一句神秘的箴言:“认识你自己”。从某种程度上来说,我们都是自己的“最熟悉的陌生人”。认识自己的位置,是每个人获得成长的第一堂课。一个人的位置,对其言行的影响是至关重要的,俗话说:“屁股决定脑袋”,虽然听着粗俗,却饱含人生哲理。既然我们屁股在项目经理的位置上,就应该像项目经理一样去思考问题,做事情。

    一.项目经理的处境

    经过数年的打拼,怀着美好的向往,我们终于成了他——项目经理。然而,梦做到最真的时候,往往也是梦醒的时候。

    项目经理其实也是悲情人物。从“程序猿”到项目经理,可以说是刚出虎穴,又入狼窝。要知道,做一个合格的项目经理,比成为一个优秀的程序员,还要难得多。

    本来以为当上了项目经理,王子和公主从此就可以幸福的生活在一起了,没想到,跋涉的路才刚刚开始。我实在不想打碎这美好的梦想,这有些残忍,但清醒的痛着,总好过麻木的睡着。更何况人生本来就是一个接一个的杯具,每个角色都有他的难处,我们只能接受这个现实。人生就像登山,当你到达一个山头时,发现还有更高峰,一山还比一山高。

    王子和公主,一直在路上。

     

    1. 高和低

    没有成为项目经理之前,期望着当上了项目经理,可以拿着更高的工资,被别人尊敬的称呼为某某经理,还可以干着更少、更简单的活——指挥别人干活,这谁不会啊?

    然而,人生不如意十之八九。更高的工资,应该是有的,但往往还不会达到让你眼前一亮的数字。被尊称为经理,也是应该的,Project Manager,名正言顺的经理。然而,在大部分公司里,项目经理也就是像弼马温一样的小官,明白真相之后,又难免有一些失落。至于干更少、更简单的活,那就只能说是痴人说梦了。

    事实上,在兴奋过后,等你翻到硬币的另一面,你会看到和你想像不一样的高和低:能力要求高、职位低。

    (1)能力要求高

    能力要求高不高,口说无凭,我在网上随便找了一个软件项目经理的招聘信息,要求如下:

     

     

    职责范围:

    1、负责软件项目管理及计划实施;

    2、具备较强管理、协调及沟通能力,帮助开发人员解决开发过程中遇到的技术问题,做好日常的开发团队管理工作;

    3、与各团队协同工作,确保开发工作正常顺利的开展;

    4、具备较强的分析问题、解决问题的能力,能够解决项目团队在开发过程中遇到的技术难题; 

     

    任职要求:

    1、计算机相关专业,4年以上JAVA软件从业经验,2年以上开发经理或团队管理经验;

    2、精通java、jsp、HTML、JS、xml、AJAX编程语言,精通Struts、Hibernate、Spring、IBatis等常用框架技术;

    3、精通中间件技术,对Websphere、WebLogic等有很深的了解;

    4、快速适应工作环境,应变能力强,抗压能力强;

    5、重视成本和进度控制,合理有效利用资源,有较强的责任心;

    6、熟悉Android开发、Hadoop技术者优先考虑;

     

    上面的要求写得比较随意,我帮他整理一下,并点评一番:

    表1 项目经理职责要求

    类别

    职责/要求

    点评

    专业技术

    精通多种编程语言和技术框架;精通中间件技术;熟悉Android及Hadoop。

    项目经理必须是技术专家,也许你自己不用写代码,但你必须能指导下属,解决技术问题。必要时,还得参与做系统架构和系统分析。

    管理技能

    项目整体管理;成本管理;进度管理;资源管理;团队管理;沟通协调能力。

    难道风险管理、质量管理、采购管理就不需要了吗?九大领域一个都不能少。

    个人内在

    适应能力;应变能力;抗压能力;责任心;分析问题解决问题的能力。

    ①     适应能力:像变色龙。能适用不同公司文化和氛围,不同性格的同事,特别是上司。

    ②     应变能力:像变形虫。项目过程中会出现各状况,必须能调整自己、调整计划,以适应变化。

    ③     抗压能力:像驴子。项目管理压力很大哦,天塌下来要也扛着。

    ④     责任心:项目出问题,基本上责任都是你的,决不可推卸责任,勇敢的去解决问题吧,不要辜负领导的重托。

    ⑤     逻辑思维:项目经常会出问题的,所以你必须思维清晰,能够客观的分析问题和解决问题。

    相关经验

    4年开发经验+2年管理经验

    老板可不想冒险,把项目给你去做试验田。

     

    怎么样,要求很高吧?能完全达到这样的要求,我想去铁道部当个CIO应该是没什么问题了。即便如此,对于项目经而言,这些要求也没有哪一项是多余的,也就是说,项目经理必须成为一个超人,最好是像《蜘蛛侠》里面沙人那样,可以随心所欲的变化自己,穿越一切障碍,拥有无穷的威力。

     

    (2)职位低

    说职位低,有以偏概全之嫌。在项目型组织结构的公司中,项目经理的职权还是很大的,项目经理一般直接向总经理汇报工作。但在IT行业中,比较少采用项目型组织结构,大部分是矩阵型或职能型的组织结构。在这种架构中,项目经理基本上就是最小的官了。

     

    2. 大和小

    项目经理之所以需要很强的个人能力,归根到底是由项目经理的责任所决定的。项目是一种个人责任制的管理方式,项目经理是项目组的核心,责任无疑很大;与之相对应,其权力又是比较小的,这让项目经理的处境更加困难。

    (1)责任大

    项目经理作为项目组的最高领导,对项目的成败起着至关重要的作用。对项目的目标和实施过程中的一切问题,负有最终的责任。影响项目成败的因素也许有许多,但不管是什么原因,最终的责任会落实在项目经理身上,领导会说,项目经理不给力。

     

    (2)权力小

    项目经理的正式权力包括指挥权、人事权、财权、技术决策权以及采购权等,项目经理一般在某一限度内具有完全的权力,无需沟通汇报即可自行做出决定;在超出限度时,则需要与高级经理或职能经理商议决定。在一个矩阵型组织结构的公司中,项目经理的权力大致如下表所示:

    表1 矩阵型组织中项目经理权力情况

    权力类型

    完全的权力

    部分权力

    指挥权

    对项目内的人、财、物的调度安排,可以自主决定。

    对项目结果产生较大影响时,需与高级经理讨论。

    人事权

    可以依据公司制度对员工进行考核、奖惩。

    人员的聘用、辞退等决定一般由职能经理安排,项目经理可以作出建议。

    财权

    小额活动经费一般可以自主决定

    达到一定金额需要申请,由高级经理直至总经理审批

    技术决策权

    一般技术措施可以自主决定

    重大技术措施,必须通过外部评审,并请上级领导拍板

    采购权

    小额采购项目必须品

    达到一定金额需要申请,由高级经理直至总经理审批

    乍看上去项目经理权力并不小。但在实际操作中,项目经理权力范围的这个限度往往比较小,并不足以保证项目经理推动项目顺利开展,项目经理必须花去大量的时间去与上级领导沟通、汇报、提出建议、争取支持。在有些公司,甚至连项目组聚餐也要向上汇报请示。项目经理的这种处境往往会导致其工作畏首畏尾,做事犹豫不决,久而久之,失去了对工作的激情。

     

    3. 夹心饼

    项目经理的位置是比较尴尬的。下面的兄弟要你多争取一些奖金;领导要你经费更省一些;客户要你更快一些;用户要你的产品更好用一些。在员工面前,你代表老板;在老板面前,你代表项目组员工;在客户面前,你代表公司。你代表了很多人,就是没有代表自己的时候。

    项目经理就是一个不折不扣的夹心饼。做人难,做项目经理更难啊。

     

     

     

    图1 项目经理成了夹心饼

     

    4. 为什么还要做项目经理

    也许你会问,既然项目经理这么难、这么惨,好像比“程序猿”还要苦逼,那我为什么还要做项目经理呢?这看上去不是个问题,“人往高处走,水往低处流”嘛,高处虽然艰险,向上追求的脚步却不能停止。无限风光在险峰,还是别埋怨攀登的辛苦,好好享受一路的风景吧。

    当然,人的一生有不同过法,有些人喜欢在泳池中游水,有些人在热衷于在大海的激流中冲浪,还有些人,一辈子也不会游泳,他们只是偶尔到河边洗洗手,用冷漠或者好奇的目光看着那些乘风击浪的人们。每种活法的选择权在自己手上,一旦选择,无怨无悔。

     

    二.项目经理素质模型

    1. 素质模型的作用

    谈素质模型是一件很严肃的事情。因为素质模型就像一面镜子,项目经理拿来一照,可以发现自己的优势和弱点。只有扬长补短,才能在职业发展之路上步步高升。

    管理方面的素质模型很多,但不是每一个都是客观的镜子,如果不能在镜中看到一个真实的自己,那它也就失去了应有的价值:

    如果它是一面哈哈镜,那看到的将是一个变形的自己,无法作为自己的参照;

    如果镜子太小,就只能照到自己的局部,会导致产生盲目的悲观或乐观;

    如果镜子太大,可能会看到太多无关的东西,反倒干扰了自己的视线。

     

    2. 他山之石

    (1)PMI知识体系模型

     PMI将项目经理应具备的知识和技术分为五类,即:项目管理知识体系,应用领域知识、标准与规章制度,理解项目环境,通用管理知识与技能,人际关系技能,如下图所示:

     

    图2 PMI的项目经理知识技术体系

    (2)麦克利兰的素质模型

    美国心理学家麦克利兰经过研究提炼并形成了21项通用素质要项,并将21项素质要项划分为6个具体的素质族,同时依据每个素质族中对行为与绩效差异产生影响的显著程度划分为2~5项具体的素质。6个素质族及其包含的具体素质如下:

    ①管理族,包括团队合作、培养人才、监控能力、领导能力等;

    ②认知族,包括演绎思维、归纳思维、专业知识与技能等;

    ③自我概念族,包括自信等;

    ④影响力族,包括影响力、关系建立等;

    ⑤目标与行动族,包括成就导向、主动性、信息收集等;

    ⑥帮助与服务族,包括人际理解力、客户服务等。

    (3)管理者胜任特征模型

    胜任力是指任何直接与工作绩效有关的个体特质、特点或技能等,在本质上也就是应该具备的素质组合。有学者利用物元分析和可拓评价方法建立了基于管理技能、个人特质和人际关系3个维度的胜任特征物元模型。

    ①管理技能的维度,包括团队领导、决策能力、信息寻求和市场意识等;

    ②个人特质的维度,包括影响力、自信、成就欲、主动性、分析思维和概括性思维等;

    ③人际关系的维度,包括人际洞察力、发展他人、关系建立、社会责任感和团队协作等。

    (4) 四种能力论

    Robert hogan和Rodney B.Warrenfeltz研究指出管理人员的素质可以分为4种,分别为:自我管理能力、人际关系能力、领导能力和商业能力。

    ①自我管理能力,包括自我尊重、正确对待权利的态度和自我控制等;

    ②人际关系能力,包括换位思考、正确预计他人的需要、考虑他人的行动等;

    ③领导能力,包括建立团队、维持团队、激励团队、建立共同愿景和巩固团队等;

    ④商业能力,包括制订计划、管理预算、绩效评估、成本管理和战略管理等。

     

    3. 几种素质模型的分析

    上面这些模型,都是被广泛认可的模型,我本人对四种能力论,更是情况独钟。为了找出一个适合项目经理学习修炼的模型,我们有必要对这几种模型进行评价。

    首先确定评价的指标:

    (1)针对性:是否适合于项目管理领域;

    (2)完整性:是否太过宽泛或狭窄;

    (3)实用性:是否适合于项目经理修炼。

    表2 几种素质模型的评价

    模型

    针对性

    完整性

    实用性

    PMI的项目经理知识技术体系

    太小

    麦克利兰的素质模型

    较差

    太宽

    较差

    管理者胜任特征模型

    太宽

    较差

    四种能力论

    太宽

     

    那我们能不能找到一种这三个指标都吻合的模型呢?

     

    4. 西西吹雪的六种能力模型

    “六种能力模型”力图在针对性、完整性和实用性方面达到最佳。六种能力分别是:知识、技能、逻辑思维、执行力、心智**和领导力。这六种能力是一个有机的整体,如下图所示:

     

    图3 项目经理的六种能力模型

     

    1)人、事结合

    管理,就是管人理事,这个理念已经深人心。这个模型首先就是一个管人理事的素质模型。

    从“理事”的角度来讲看,项目经理应当具备四大素质:

    • 知识

    必须具备项目管理的理论知识,所处的行业知识, 以及专业知识;

    • 技能

    光有知识是不够的,还要能知道怎么做。主要有项目管理技能、沟通表达技能、写作技能、专业技能等。

    • 逻辑思维

    项目经理必须具有较强的逻辑能力、思维清晰,对项目任务和要做的工作,随时都有清晰的分类和列表。逻辑思维能力有很多种,如果要挑出两种对项目经理最重要,我觉得是归纳能力、判断力。

    • 执行力

    项目经理本人必须具有很强的执行力。如果项目经理像个蔫老头,整个项目的执行结果可想而知。

     

    从“管人”的解度来讲,项目经理应当具备两大素质:

    • 心智**

    要管人,首先必须学会与人相处,心智不**的人,与人相处往往会无所适从。心智**,也就是要管好自己的内心。自己都管不好, 怎么管别人呢?

    • 领导力

    项目不是一个人的战斗,有些项目经理,只顾自己埋头干活,乐不滋滋,下面的同事却不知道每人要做什么,这是缺乏领导力的表现。余世维说:“管理就是让别人完成事情”,“真正厉害的人不是自己累死,而是要让手下做事情累死,这个才叫本事”,“优秀的管理者不会让员工觉得他在管人”。这三句话,可以说是领导力的三种境界。

     

    简而言之,项目经理就像一个贤妻良母,要上得厅堂,下得厨房。上得厅堂意味着,项目经理要擅长与人打交道,也就是“管人”的要求。下得厨房则意味着项目经理懂技术、懂业务,能把复杂的事情理清楚,并解决各种问题,这就是“理事”的要求。理事主要靠智商,而管人则主要靠情商。

     

    2)内、外兼修

    这个模型还是一个内外兼修的模型。古人云:“胜人者力,自胜者强”,说的其实就是一个人的外在修养与内在修养的关系。

    战胜外在的事物,你需要是“力”,因此模型也有两个力:执行力和领导力。有这两种力,我们可以在管人、理事都做得很好。

    要战胜自己,则非要靠一个人的内在修养不可。因此模型中,有四项个人内在素质的修炼:知识、技能、逻辑思维和心智。

    从表面上看,“自胜”似乎比“胜人”更牛一些。但是从一个人成长的角度来看,我们主张要先“自胜”,再“胜人”。如果以树类比,“自胜”是根,“胜人”则旧枝干,一棵没有发达根系的树,是不可能长成参天大树的。所以不要让自己一开始就显得很牛,而是首先让自己成为一个真正的牛人,否则大树会过早夭折。

     

    3)从独立到互赖

    一个人有成长过程可以分为三个阶段:依赖期、独立期和互赖期。每到一个新的阶段,都是一次巨大的飞跃。

    ●依赖期:围绕着“你”这个观念——你照顾我;你为我的成败得失负责;事情若有差错,我便怪罪于你。

    ●独立期:着眼于“我”的观念——我可以自立;我为自己负责;我可以自由选择。

    ●互赖期:从“我们”的观念出发——我们可以自主、合作、统合综效,共创伟大前程。

    也许你已经注意到了,在素质模型里面没有依赖期,这是因为在依赖期的人是无论如何也成不了项目经理的。这个模型,是一个从独立期走向互赖期的素质模型。

    在独立期,我们主要擅长做“理事”的工作。我们是技术英雄,可以把每件事都做得很完美;

    在互赖期,我们的精力转向了“管人”。我们懂得如何与各种不同类型的人相处,如果驱动团队为一个共同的目标而努力。

     

    4)层次分明

    这个模型是还是一个层次分明的、渐进的模型。从知识到执行力,实际上是一个从“知道”到“去做”的过程,而从心智**到领导力,是发挥团队力量的两个阶段。

     

     

     

    图3六种能力的层次

     

    由于内容较多,本文只能点到即止。要了解更多,请关注后续博文。   

  • [转]从程序员到项目经理(一)

    2015-05-21 15:02:05

    本文转自:http://www.cnblogs.com/watsonyin/archive/2012/09/10/2679528.html

    “从程序员到项目经理”,这个标题让我想起了很久以前一本书的名字《从JavascriptJava》。然而,从JavascriptJava充其量只是工具的更新,而从程序员到项目经理,却是一个脱胎换骨的过程。从JavascriptJava,是一个取巧的方法;而从程序员到项目经理,却并无捷径可走,必须从内而外的改变和提升。

    一.为什么要当项目经理

    1. 问题本质

    如果我对一个老程序员说:“有必要转项目经理啦”,很多人第一反应是“为什么一定要当项目经理?!”,反问很给力,基至会让人哑口无言。但反问成功的结果可能只是使自己麻醉,暂时忘却现实中面临的烦恼和压力,这无异于把头埋进沙子中的鸵鸟。只有理智的分析,才能作为自己行动的指南。

    首先申明,不是每个程序员都需要当项目经理,也不是每个程序员都当项目经理,更不是每个程序员都当项目经理。因此,当不当项目经理,可以说是一个“需不需要、想不想、能不能”的问题。

    想不想,是一个意愿的问题。这是前提,毕竟强扭的瓜不甜嘛。显然,富二代一般是不想当项目经理的,因为他们想直接当总裁。还有些人,只想钻研技术,不想钻研人,他们也是不会想当项目经理的。如果你没有意愿当项目经理,也就没有讨论的必要了。什么,你不知道想不想?呃,那就继续往下读吧,也许读着读着,你就想当了。

    能不能,是能力的问题。这是不关键,因为只要有意愿,能力是可以培养的。程序员连复杂得让人琢磨不透的软件都能搞定,还有什么搞不定的?

    因此最后落实在需不需要这个问题上。这个问题很棘手,需要从程序员自身以及外部环境等方面进行分析。要讨论这个问题,就要弄清楚它和想不想的关系。想和需要是紧密相关的,但并不是一回事。想不想,主是感情的因素,而需不需要则要进行理智的分析的了。理智与感情,并不总是一致的。有些东西,是你需要的,但你未必想要。比如,被困沙漠的时候,有时被逼喝自己的尿液,这是理智战胜了感情。电影《色戒》中的汤唯,则是感情战胜了理智,爱上了敌人,最后造成了悲剧的结局。因此,我们还是少说气话了,不要冲动,冷静的分析自己的处境吧。

    2. 鸭梨山大

    当我从网上看到码农这个词时,觉得网民很有自嘲精神,后来我看到了码畜和码奴这个两个词,不禁从心底涌起了深深的悲哀,为这个行业,也为这个社会。

    看看智慧的网民对IT人士级别的划分:

    IT领袖:年入过亿(例如任正非、马化腾、李彦宏、丁磊、马云等,包括期权股票以及投资理财等收入。)

    IT大哥:年入千万(级别次于以上几位大佬的公司老板,不缺钱,普遍对上一条里的人物羡慕嫉妒恨。)

    IT精英:年入百万(各IT公司副总裁级别人物,包括COOCTO等,大多为职业经理人,赚够钱就跑。)

    IT人才:年入50万(各IT公司总监级别人物,有房有车,生活压力相对较小)

    IT工程师:年入20万(高级经理级别,有房贷,生活压力大)

    IT民工:年入10万(经理级别,基本无房,学会装波一,生活压力大)

    码农:年入6万到10万(工作三四年,租房,继续混日子)

    码奴:年入3万到6万(工作一两年,租房,混日子)

    码畜:年入低于3万(刚毕业的,租房,傻乐)

    我知道你想问什么问题了。不要问哥赚多少,哥只是一个普通的IT人士而已。前面三级都是牛人,是成功人士,他们的作用不是让去成为他们,而是激励我们自己。你现在读到的也不是一篇成功学的文章,而是和你一起分析程序员的处境、以及怎样缓解压力的文章罢了。

    言归正传。看到这个表,是不是有鸭梨山大的感觉。找到了自己的位置吗?什么,不好意思?没关系啦,园子里面不是很多人称自己为程序猿或者猴子吗?那大概也就是相当于码畜吧。我想能读到这篇文章的,大概都是“IT工程师(高级经理)”以下,他们的主要特征是“生活压力大”和“混日子”。如是你是前面四级,建议你果断退出本文。

     

    我在上一篇博文中提到30岁现象,有些人认为车到山前必有路,这是杞人忧天。不错,程序员确实可以干到30多岁,甚至四五十岁,但他们面临的压力却可能是“不足与外人道也”。

    我经常与30岁以上的程序员交流,他们流露出来的对现状的不满、无奈、无力、对安全感的缺乏,让我感同身受。

    虽然谈压力并不是一件愉快的事情,但我仍然必须要说出来,因为我宁可清醒的痛着,也不要在麻醉中睡去。那就让我们拿着手术刀,对自己进行痛苦的解剖吧。

    下面是一个简单的“危机评估表”,总共有30项。在“是否认同后面打出分数,每一项如果认同为1分,不认同为0分。

    类别

    评估项

    是否认同

    身体

    悄然发现已经没有以前经折腾了。

     

    没有定期的体育运动。

     

    中餐午餐都是在外面吃快餐。

     

    确信自己是亚健康。

     

    家庭

    每月开支不算不知道,一算吓一跳。

     

    有房贷或房租。

     

    有孩子了,上幼儿园是一笔大开支。或者超过30岁了还没结婚。

     

    买不起车,或有车子,开不起。

     

    家里时有摩擦,经常有不开心的事。

     

    每个月存不了多少钱。

     

    时间

    要花很多时间陪家庭成员。

     

    加班时间越来越少。

     

    社交时间较少。

     

    激情

    只想休息,不想工作。

     

    对新技术、新工具不甚了解,有心无力。

     

    没有制度明确的短期、中期和长期目标。

     

    理想已经模糊了。

     

    社会

    只有交税,没有回报。

     

    担心老了病无所依,老无所养。

     

    担心国家经济衰退,陷入失业。

     

    收入增长跟不上通货膨胀的速度。

     

    行业

    新人比我更具有性价比。

     

    行业竞争激烈,低价抢标现象严重。

     

    行业被某些公司垄断。

     

    行业正在慢慢衰落。

     

    公司

    公司发展前景不是很明朗。

     

    公司薪资福利一般。

     

    公司没有企业文化。

     

    公司员工关系比较紧张,有内斗现象。

     

    公司缺乏活力。

     

    总分

     

    (说明:此表并不精确,仅供参考)

    如果总分小于10分,那要恭喜你,说明你生活稳定幸福,让人羡慕。我觉得这篇文章你也不用往下看了。

    如果你的总分大于20分,说明你承受的压力过大,可能面临职业方面的危机,应当寻求改变了。

    如果总分在10-20分,说明你生活比较稳定,收入方面可能是中上等水平,但职业发展方面仍有风险。

    3. 另一片天地

    所谓“穷则变、变则通”,如果你还是普通的老程序员,并且还在为自己的职业彷徨和苦闷,那就应该寻求变化之道了。

    如果你愿意,转向项目管理乃是上上之策。

    当然转项目管理只是程序员很多选择中的一个。显然不是每个程序员都需要当项目经理。一般每个公司都最少提供了技术和管理两条职业发展通道,如果你技术超牛,你完全可以从程序员做到系统分析师,一直做到技术总监。如果技术方面你信心不足,转项目管理就是一件自然而然的事情了。

    技术和管理,这是两条绝然不同的路,虽然“条条大路通罗马”,但沿途的风景却是完全不一样。一旦你从事了项目管理,你将看到不同的另一片天地。

    1)在管理的天地里,你将不再有职业瓶颈。

    程序员虽然也可以干一辈子,但工资水平是有天花板的,不要问我为什么,行业就是这样。项目经理则有无限上升的空间,不但工资更高,职位上也可以升至部门经理、副总经理甚至总经理职位。

    2)促进项目经理内在成长,心智更加**。

    美国项目管理协会PMI认为,项目经理75%-90%的时间应该用在沟通上。沟通的对象显然是人,因此,项目管理主是要一项与人打交道的工作。如果说解决技术问题人主要是靠一个人的智商,那么与人打交道,则是要靠一个人的情商。

    虽然不当项目经理也可以发展情商,但在项目中锻炼是自我成长、自我完善的捷径。

    3)项目管理知识可以用在生活中的各个方面。

    生活中的许多事情,我们并没有称之为一个项目,但可以用项目管理的方法来对待。例如一次婚礼的组织,或一次自助旅游。你在项目管理中培养起来的情商,更是让你面对生活中的各种问题游刃有余,你的家庭也会更家和谐,就像范范的一首歌里唱的:“好像什么困境都知道该怎么办”。当到达这种境界时,你会有一种海阔天高,一览众山小的感觉。

    因此,即使你不想从事项目管理,也建议你学习一下项目管理知识。有一本书叫《不懂项目管理,还敢拼职场》,虽然觉得内容一般,但对标题深以为然。

     

    二.项目管理倒底难不难

    程序员问:“我现在想当项目经理,但心里没底,不知道项目管理到底难不难?”这个问题确实不好回答。俗话说,“会者不难、难者不会”,很多事情都是如此。

    有些人觉得不难,他们好像天生就具有管理的才能,他们举止得体、八面玲珑,具有很强的个人魅力,可以把大事化成小事,把坏事变成好事。这样的人,想不成功都难。

    大部分人还是会觉得难。在PMI的知识体系里,项目管理有九大领域,五大过程组,44个过程,有数不清的工具和方法。项目执行中方方面面出了问题,都是项目经理的责任,项目经理又不是超人,怎么应付得过来。项目管理确实有点难。

    你若问我,我会说项目管理既难,又不难。对于愿意改变自己的人而言,它不难;对于性格偏执的人而言,项目管理确实太难了。

    很多人无法意识到自己的偏执。上级只要提出一点批评,他们就要拼命的辩解和反驳。他们的保护壳太厚了。

    项目经理最重要的素质,就是心智的**,一个心智**的人,不会是一个偏执的人。

    毕竟,人无完人,项目经理必须从善如流,才能完成自己角色的转变。对于从程序员转过来的项目经理,做事的方法与以前应是翻天覆地的不同,必须迅速审时夺势,改变自己。否则,那你不还只是个有项目经理职位的程序员么?

    因此可以说,项目管理难就难在项目经理要改变自己。这个改变,不只是知识体系的扩充,更可能是性格的改变,而一个人要改变性格是极其困难的。

    程序员习惯于与机器打交道,通过严密的代码和逻辑来控制机器;而项目经理是跟人打交道,人是有感情的,绝对不是你给他输入1+1,他就给你输出2。项目经理必须时时用心去思考、体会,然后改进。几番回合下来,项目经理会惊喜的发现自己变了,有种脱胎换骨的感觉----那是当然的,因为变得更**了。

    只要你愿意改变自己,假以时日,你一定会成为一个优秀的项目经理。

     

    三.程序员应克服的障碍

    程序员与项目经理之间,往往有一条鸿沟。对技术钻研越深的程序员,这条鸿沟可能越大。这是由程序员的性格特征决定的。

    程序员普遍有非常多的优点:例如聪明、逻辑思维强、学习能力强、创新能力强、直率等。但优点往往也是弱点之所在,例如:

    1)太讲逻辑:与人相处时容易忽视人际关系、感情等方面的因素。

    2)过于直率:说话直来直去,容易伤害他人感情。

    3)自傲:总觉得自己技术不错、比周围的人要强一点。好比一只鸡看到同类觉得自己最大,看到鹅觉得跟自己差不多,看到火鸡才觉得比自己大一点。

    4)固执:在自己的逻辑中不能自拔,无法听取别人的意见。

    5)沟通能力较弱:大部分程序员在口头表达、写作、汇报、交流等方面存在不足。

    而这些缺点,也是心智不够**有表现,这是项目经理的大忌,往往会成为程序员晋升项目经理的障碍。因此,必须要克服这些障碍,给自己制定符合项目经理要求的行为准则,时时提醒自己,每日进行反省,坚持下去,必然会成功。   

  • [转]从程序员到项目经理(12):如何管理自己的时间(上)

    2015-05-21 15:01:17

    本文转自:http://www.cnblogs.com/watsonyin/archive/2013/02/19/2917764.html

    对很多项目经理而言,是没有什么所谓的“我的时间”的,因为他们不是在管项目,而是被工作的潮水带着跑而已,他们的时间被工作主宰了。项目经理必须要主动的管理自己的时间,合理安排自己的工作,才能真正“翻身”做自己时间主人。

    1.谁动了我的时间

    时间对于每个人而言,都是最稀缺的资源,对于一个管理者更是如此,时间不够用成为几乎所有管理者共同的问题。如果要对项目经理常说的话做一个调查的话,想信“我很忙”一定可以名列前茅。以我的经验,当要求项目经理按时提交项目材料,或者临时支援某件紧急事务的时候,经常会听到同样的回答:“我很忙”。

    多年以前,我就从经理那里听说,厉害的管理者都是很轻松的,因为他的工作全部交出去了,根本不用自己操心,所以他们出去度假十天半个月,一切工作都会如常进行。从那时起,我就充满了对管理的神往,可是后来我才发现原来这只是个传说,现实中忙忙碌碌的经理比比皆是,而轻松自如的管理者则是众里难寻。

    为什么管理者都这么忙呢?是谁动了他们的时间?实际上,这是一个综合性的问题,既有内部原因,也有外部原因,既有主观原因,也有客观原因。总的来说,让经理们不堪重负的因素有三:

    (1)工作

    对于一个程序员来说,他的工作是比较单纯的,基本上是单线程运作,只需要项目经理交待开发任务即可,可是当上了项目经理就不一样了。以前好比在游泳池中游泳,现在是在大海里冲浪,各种事情如潮水一般向你涌来,让你顾此失彼,手足无措。

    (2)下属

    下属也是一种资源,即人力资源,这种资源与时间一样,同样具有稀缺性。其实我们可以设想一下极端情况,如果你的下属人数足够,能力也很强的话,你完全可以像我的经理说的一样,把你的全部工作授权给你的下属,你自己也就不用整天焦头烂额了。

    因为你的下属不给力,所以你总是要自己来制定计划、自己来做系统架构、自己来监控进度、自己来检查质量、自己来写文档、自己来汇报工作、自己来解决重要问题、甚至自己来编写代码,你整天忙忙碌碌,就是在忙这样的事情。

    然而,千万不要怪你的下属,因为他们不给力正是老板雇佣你的原因,况且资源的稀缺性是永远存在的——从原始社会到将来的共产主义社会。要知道,老板做项目为了赚钱,而不是让管理者更轻松,如果每个项目都是精兵强将,你只要一声令下工作就会自动完成,你倒是轻松了,但老板还要你来做什么?

    (3)自己

    既然资源受限是一定的,项目经理还是应该反求诸己,从自己身上找到解决之道。这就好比天下雨了,你怪老天是没有用的,只能怪你自己没有带雨伞。经常问一问自己,我对工作安排合理吗?我抓住了主要问题吗?我在旁枝末节的事情上浪费时间了吗?我有充分发挥下属的能力吗?我自己工作拖拖拉拉吗?通过不断的自省,改善自己的管理方法和行为习惯,我们对时间利用也必然会变得越来越高效。

     

    2.时间管理的本质是对工作的梳理

    要破解忙的难题,必须要有意识的对时间进行管理。其实时间本身是没法管理的,因为无论你怎样管理,时间既不会变多,也不会变少,既不会变快,也不会变慢。所谓的时间管理,其实就是如何更有效的利用时间的问题,更加直白地说,其本质就是工作管理,即通过对工作的梳理,让我们在有限的时间内,使得工作更有条理、更有成效。

    必须要主动、有目标地对工作进行梳理,这是对一个管理者的基本要求。工作梳理就好比整理房间,你不去整理它,杂物就会堆积得越来越多,你房子最终会变得不适合人类居住。一个好的家庭主妇,必定善于将各位物品分门别类,并且适时扔掉一些用处不大的物品。一个好的项目经理也一样,同样需要对工作进行分类,对不同类型工作采用不同的策略,有些工作要现在就做,有些可以晚点做,或者不做;有些工作一定要自己做,有些工作则可以请其他人来完成。

    通常对工作梳理,可以采用5W1H法,即:

            Why——为什么干这件事?(目的);

         What——什么事情?(对象);

        Where——在什么地方执行?(地点);

        When——什么时间执行?什么时间完成?(时间);

                     Who——由谁执行?(人员);

        How——怎样执行?采取哪些有效措施?(方法)。

    在一般的项目中,Whywhere往往不是什么问题,或者说对项目经理的时间管理影响较小,因此我们不妨将其简化为3W1H,也就是确定要做什么,不做什么;先做什么,后做什么;谁来做;怎样做才更有效。基于此,项目经理可以按以下三个步骤来梳理工作:

    (1)分析要做什么、不做什么,以及先做什么、后做什么

    解决WhatWhen的问题。事有轻重缓急,事情的重要程度和紧急程序直接决定其处理的优先级。虽然很多事情来势汹汹,但并不表示一定要当即处理,有些事情只是静静的躺在那儿,也并不意味着要“等有了时间再做”。

    (2)分析由谁来做

    解决Who的问题。虽然我们提倡项目经理要以身作则、亲力亲为,但并不是说每件事项目经理要亲自去做。对于下属可以胜任的事情,就把它分配出去。如果出现项目经理很忙、下属很闲的情况,那就说明项目经理你做得太多了,不要和你的下属抢事情做。

    (3)  如何让工作更有成效

    做不做、什么时候做以及谁来做的问题都解决了,剩下就要解决怎么做才能让工作更有成效的问题了。在这里我们不是要讨论编码或写文档的技巧,而是个人的习惯和认识,这对工作成效的影响更是本质上的。

     

     

    3.做事要分轻重缓急

    老外就是善于总结,中国有词语叫“轻重缓急”,可是到了国外摇身一变,变成了“时间管理四象限法”——自从美国总统艾森豪威尔提出以来,人人将其奉为圭臬,成为时间管理领域最重要的方法论。

    所谓的“四象限法”,就是将工作按照重要程度和紧急程度两个维度进行分类。我们找一张白纸,以紧急程度为纵轴,以重要程序为横轴,在纸上划上一个十字,将纸面分为四个象限,然后将当前所有要做的工作放到这个四个象限中。

    一个典型的项目经理四象限图如下所示:

           (1) 第一象限:重要紧急

    这一类往往是火烧眉毛的事情,需要马上去处理,否则项目会受到重大影响,比如客户服务器崩溃。

    (2) 第二象限:重要不紧急

    这类事情一般是预防型的工作,例如制定项目计划、团队建设等,它们不需要你停下手上的工作马上去做,但如果没做好的话,可能就会导致产生项目危机。许多第一象限工作产生的原因,正是因为第二象限的工作没有去做。

    (3) 第三象限:紧急不重要

    这类事情虽然不重要,却需要马上去处理。一个典型的例子就是桌上的电话响了,你接还是不接?当然要接,因为你不知道是谁。接通后,发现是推销保险的,你又不好意思立即挂掉,只好被对方折磨一番了。

    (4)第四象限:不紧急也不重要

    这类事情看上去最不需要做了,例如上网偷菜、看新闻、写博客等,但如果你在办公室走上一圈,就会发现很多人正在干着这些不需要干的事情。

     

    我们到底该怎样安排四个象限的工作呢?对于一个普通的管理者,其工作的优先级一般是这样的:第一象限>第四象限>第二角限>第三象限。可是,等做完了第一、四象限的工作,根本就没有时间来人做第二象限的工作,于是项目到了后期项目经理只好四处救火。

    管理大师彼德.德鲁克十分推崇“时间管理四象限法”,并将其总结为“要事第一”的原则。根据这个原则,每个象限的工作处理策略是不一样的。

    (1)重要紧急

    优先级最高,需要尽快处理。很多人都玩过《植物大战僵尸》的游戏吧,那你一定知道“一大波僵尸正在逼近”的感觉,是的,你必须要马上打死它们,不然它们就会冲进你的房子,吃掉你的大脑!

    (2)重要不紧急

    这类事情看上去可以暂缓,但考虑到其重要性,应当与第一象限的工作并行去做。如果不及时去做,它们就会转移到让你头疼的第一象限中去,或者在第一象限产生更多新的“僵尸”。所以,要在僵尸还没有逼近的时候,就好防御工事,并尽快打死它们,如果等到它们冲了过来,你还能不能保住大脑,就要看你的运气了。

    (3)紧急不重要

    它们就像是在你耳边“嗡嗡嗡”地叫着的苍蝇,你必须要花时间去赶走它们。这多少让人有些无奈,但这些事情确实层出不穷。有些公司在实施紧急项目时,经常采用封闭式开发,这样做的一个重要原因就是要回避那些紧急不重要的事情。很多管理专家建议我们在必要的时候勇敢说“不”,其实就是针对这类事情。如果实在无法说不,建议安排或委托其他人来做。

    (4)不紧急也不重要

    如果不是时间充裕的话,建议不要去做。如果碍于人情的话,建议安排或委托其他人来做。它们就像一群在几百米远处飞的苍蝇而已,你完全不必要放下手中的饭碗,举起苍蝇拍跑过去和它们决斗。

    因此,对于一个卓有成效的管理者,其优先级应该是这样的:第一象限=第二象限>>第四角限。第三象限就像数学中的无穷小一样,被舍弃了。

    写到这里,我想起了前不久一位项目经理的故事:

    项目定于当天上线,项目组决定搬到客户现场办公,以应付可能出现在的突发事件。项目成员电脑已经全部打包好,都围在项目经理周围等待。原来项目经理正在理一大堆**准备报销,于是发生了这下面这样的对话:

    我:“大家都在等你,怎么还在填报销单呢?”

    项目经理:“今天是公司的报销日,不填好单子,又得推后很久。”

    我:“你的电脑打包了没有?”

    项目经理:“没有”

    我:“放行条开了没有?”

    项目经理:“没有”

    我:“申请用车了没有?”

    项目经理:“没有”

    我不知道说什么好了。要知道公司的报销单粘贴和填写非常严格,经常被打回重新弄,那一堆**,显然不是十几分钟可以搞定的事情。还有公司的用车也比较紧张,不赶紧申请,说不定就没有了,到时就只能租车或打的,这无疑又会耽误更多的时间。更何况六七个同事都在等项目经理一个人,耽误的时间还得要乘以他们的人数。万一系统上线,状况频出,客户火烧眉毛,项目组却仍然在路上,这样的后果是很严重的。

    贴报销单看上去一件重要紧急的事情,实际上它既不重要也不紧急,因为今天不报销,以后还是可以报销,可是因此耽误的宝贵时间,却无法再要回来。如果项目经理更加理智一些,分清楚什么才是真正紧急重要的事,也就不会出现这样的状况了。   

  • [文摘20121009]优秀PMP项目经理必备的8个要素

    2015-05-21 15:00:30

    本文转自:http://www.csaipm.com/pmp/201202221652371640.htm

     

    结合本人这几年在项目管理上的总结和得失,本人认为优秀的项目经理要有 责任心、要 善于沟通、能 引导客户、能 预测风险、 善于总结、 随需应变、善于 激励团队、同时也要 懂技术。

      责任心

      作为项目经理首先要有 责任心。有了 责任心,你会把项目当成自己的孩子,倾注你的全部心血。责任,会驱使你关注项目的进度,千方百计去寻找各种资源,推着项目往前走。甚至吃饭、睡觉,走路、坐车,都想着整个项目团队,想着他们还在加班加点,你可能很自然地给他们带点夜宵、冲杯咖啡,犒劳员工。

      有了项目经理做表率,整个团队会鼎力支持工作,士气非常高,技术问题也迎刃而解,得到领导称赞和客户肯定,项目将朝着预想的方向发展。

      许多开发人员抱怨项目经理一天没干多少事情,而工资还挺高。其实,项目经理一刻都没闲着,他总在想着怎样更好的执行项目计划,调整项目进度等,脑子一直在不停地运转,所以说项目经理是心累。

      善于沟通

      PMBOK(项目管理的知识体系)指出,项目经理75%~90%的时间用在沟通上。沟通无处不在,项目经理要具备良好的沟通能力。如:跟领导报告工作进度、跟客户介绍产品及说明工作成果、跟项目成员交待工作、跟公司内的其它人员争取支持、跟合作厂商协调配合事项等。对项目经理来说,每天大部分的时间是跟人沟通。项目经理上有老板、客户,下有项目组员,属于夹板层,沟通不好,容易出事。

      沟通的关键在于:在什么时间,用什么方式,将什么信息,传达给什么人?特别要强调的是要做好沟通计划。同时,要掌握项目干系人的沟通需求,满足他们的期望!

      当然,沟通的方式有多种,正式的、非正式的。正式的有:各种评审会议、周例会、项目启动会议、项目总结会议等,非正式的如:个人谈话、餐桌上的聊天,MSN聊天等。要结合着使用各种沟通的技巧。有时候,非正式的沟通反而能获得项目的实际信息,尤其是开发人员对项目的期盼、想法和思想。

      引导客户

      “客户是上帝”,但客户不一定全对,而且有的时候是错的,尤其在项目还没开发出模型的时候,客户有时根本不知道自己需要什么样的东西。所以,在项目启动会议后,双方要“把丑话说在前面”,分清责任。
     项目经理要站在客户的立场,努力满足客户的业务要求,让软件真正为客户创造价值。但是,如果项目经理总被客户牵着鼻子走,就很容易陷入被动的局面,结果是客户的需求一直在变化,造成程序不停地返工,项目总在原地打转,很难推进,久而久之,大家筋疲力尽,积极性严重受挫。最后,项目做得一蹋糊涂!

      开发方和使用方,要讲究“职位相当”,要找有话语权、能拍板的客户,统一接口人员,对需求的变更,不能说改就改,要做适当的变更控制,笔者一直建议要做到“落到纸面上”,有时需要客户签字确认。

      对于客户提出的需求,项目经理要凭借优秀的技术水平、充沛的业务知识快速估算需求的变更需要多少开发工作量,有没有更好的解决方法。理想的情况是程序基本不做改动,又能满足客户的需要。但笔者往往是采用变通的方法,换一种方式实现客户的需求。这种情况下,需要项目经理对系统结构有全局的认识,尺寸一定拿捏得很准。

      项目经理有时充当白脸、有时是黑脸,但无论如何,一定要维护组员的利益,笔者经常看到很多项目经理有意无意地在客户面前说开发人员的不是,遇到客户不满意的地方,就指责开发人员。这种方法欠妥,笔者一般是跟客户表态,向客户承认“错误”,回头再找开发人员讲道理,做到“内部的问题内部解决”。

      不过,这些年笔者做过很多项目,不少是大型项目,作为项目经理,笔者和客户关系处理得很不错,双方合作很愉快,最后客户变成了朋友。坦诚相待,有礼有节,“双赢”是项目经理努力的方向和追求的目标。

      预测风险

      风险贯穿项目之始终。作为项目经理,必须具有 预测风险的能力,如技术储备是否满足项目需要,人员是否充足,项目预算够不够等。

      随着项目的推进,项目经理要预测哪个环节会有风险,并及早采取规避措施。很多风险都是在和客户、和老板的私下接触才能获取的,比如跨年度可能会换领导,国企的当年预算必须当年使用,跨年度将作废等。

      如果项目经理像程序员一样忙于整天的编程,而不关注项目风险的变化,就会很被动,甚至措手不及。记住,风险无处不在,作为项目经理要引起足够的重视,要有风险意识,能 预测风险并控制风险。

      善于总结

      笔者常说,“总结是为了提高,思考是为了做得更好”。尤其是年轻的项目经理,经验不太丰富,只能一边做,一边总结,在总结中前进。经历不等于经验,经历总结、沉淀后才能成为自己的经验。孔夫子说的“吾日三省吾身”,主要是多用心,经常向经验丰富的前辈请教。

    很多项目经理,尤其是刚开始自己负责项目的项目经理,总把项目的一些过失归咎于外部因素,有时自以为正确,其实,常常犯先入为主的错误。其实要多从自身找原因,勇于自我批评,很多环节可以做得更好。

      随需应变

      “凡事预则立,不预则废”,做任何事情都必须有清晰的目标和计划,以目标为导向。有了计划,项目成员就看到了努力的方向,有“奔头”和干劲,唤起员工的工作热情,整个团队士气很高。

      当然,软件这个行业,尤其是做国内项目,因为市场、客户、软件改进等需求,需要调动各种资源,所以即使规模很大的专业化软件公司,也没有一成不变的计划。虽然“计划赶不上变化”,但项目经理不要以此为借口而不重视计划的连贯性。做计划要留有适当的缓冲空间,松紧适度,随需应变!

      市场主导研发,研发促进市场。项目的三驾马车:技术、业务、管理,哪个都不能少。项目的三要素:进度、质量、成本,项目经理要牢牢贯彻。有的项目经理没有“成本”的概念,一味地追求完美,痴迷于技术,而忘记及时交付,这是软件开发人员的通病。

      激励团队

      项目组就是一个团队,项目经理作为一个团队的领导,首先要认知自己的角色,明确自己的职责,逐步加强与团队成员的关系,善于激励别人,建立友好关系,要用不同的方式和不同的人打交道,同时要帮助绩效不佳的人。所以说,项目经理不能只是埋头于技术钻研,更重要的是带动整个团队,燃起团队的激情,俗话说“兵熊熊一个,将熊熊一窝”。   

  • [转]项目经理的“势能”培养

    2015-05-21 14:59:35

    [转]项目经理的“势能”培养

    本文转自:http://www.cnblogs.com/2hill/archive/2012/04/01/2428316.html

    我很早之前就听说过,做为一个项目经理,至少要在公司工作两年以上,且年龄不小于三十岁。我当时还年轻,对这两点很不屑。而现在,我却很理解。在公司工作时间短,对人员不熟悉,将很难横向协调资源;年纪过轻则不够沉稳、练达,难以实现快速沟通。

     

    作为IT企业,很多项目经理都是由基层做起的,技术好、经验丰富、熟悉行业知识。作为项目经理本人,也觉得自己对团队的领导能力勿庸置疑。并不会认为自己沟通上会有问题。在这里,我也不想讲什么大道理,只举例子、讲故事。

    举一个例子。

    去财务报帐,出纳说票贴的不对,公司财务制度上要求餐费与交通费分开贴,退回来重贴。贴完让出纳整好单子,找老总签字,老总出去了,没办法,只好到明天。而到明天,老总回来,自己却要出差了。

    好不容易等老总签了字,拿到财务室,出纳说,财务上没有钱,票先放这里,等两天吧。一拖好几天,票压一堆报不了,项目中各项开销还得支出,严重影响工作情绪。这里要说明一下,财务上没有现金是很正常的,当然也不是完全没有,还是要留一些费用应对日常开销的,至于给不给你,就看财务的心情了。

    如果换一个场景。

    **拿到财务室,出纳一看不合格,直接开涮:“你怎么搞的呀,刚公布的财务制度都没看吗,整天忙啥哩?算了,算了,放这吧,反正老总不在,等会儿还是我整一下吧,指望你干这活也没指望。你该干啥干啥去吧,下一回再这样我就给你扔出去。”

    过两天,财务电话过来:“你的钱还要不要呀?公司有回款了,要拿钱的赶紧啦。”然后项目经理直接到财务签字拿钱,**老总已经签过字,整个流程出纳都帮做了。

     

    一个空降的项目经理与一个老员工项目经理,在协调资源时,差别是很明显的。

    为什么空降的项目经理不能很好的协调资源。因为他跟同事不熟悉,他的团队会很支持他,其它人员则不一定。人家只给你照章办事,或许不会影响你工作,但同样不会推动你的工作。

    而老员工项目经理,与各部门人员都很熟悉,老总也很信任他。这样处理工作就比较顺利,例如前面说的,出纳帮助你贴票,然后替你拿到老总那里,老总出于对项目经理与出纳的信任,就直接把字签了。项目经理出差回来签字就能领钱,效率高多了。

    再举一个例子。

    项目临近结束,各个功能都差不多要做完了,项目完成进度也被标到90%。而项目经理心里很清楚,后面的修修补补,测试、调整会占用大量时间。公司项目管理不够完善,很多隐性的东西都无法显现出来。而客户此时又提出了一些新的要求,急切要完成。

    如果告诉老总说,现在还需增加三个月的工作时间,老总肯定不同意,因为既然都完成90%了,剩下的工作还不加把劲在两星期内搞定,竟然还要增加三个月,挨批是难免的。如果给客户说,实在没有精力做新功能,客户要挟说,不做就不验收。

    项目经理谁也不敢得罪,心里明白问题关键,却不知道该如何说服别人。只有硬着头皮往下做。结果项目延期,质量下降,勉强验收了,还有一大堆问题。最主要是因为工作强度加大,加班加点,透支团队成员工作激情,项目最终结束后,大批成员离职。

     

    而如果项目经理换种思路。首先向团队成员灌输“行百里者半九十”,越到后面,繁杂琐事越多,越不能放松冲刺。要尽可能保持成员的工作积极性。一方面,向公司说明情况,通过项目管理的知识来讲解问题的具体原因,尤其是项目收尾管理,并不是代码写完就是项目结束,还有很多事情要做。总之,摆事实讲道理,积极向公司申请资源,尤其是宽限项目时间(此时单独强调增加开发人手并不明智)。

    再一方面,与客户方负责人沟通,甚至私人宴请以促进感情。尽可能把一些新功能放到项目运营维护中来实现,或是项目二期中实现。如果客户仍然坚持,则最好说服他降低质量要求,在验收时放自己一马。向其承诺,在运维中提升质量。

    整个情况要向团队成员说明,争取成员的理解与支持。也要向公司说明情况,尽可能多申请些额外福利。

     

    从这个例子中可以看出,项目经理所做的工作,都不是“高科技”的,非技术的却又是重要的。针对不同对象,例如团队成员、公司高层、客户方负责人等,分析利害与关注点,权衡利益,各个击破。

    一个年轻的项目经理与一个老成的项目经理,在处理这些事情时,风格会大不相同。就像上个例子,客户方负责人一般也不会太年轻,三十来岁才会担当个负责人,如果项目经理太年轻,阅历浅薄,则不太容易与对方平等交流。即便他明白道理,也很难影响他人支持自己工作。

    讲一个故事

    很多年前,我还年少的时候,喜欢下象棋,在学校里基本上我能下赢的,我总能下赢,我下不赢的,总也下不赢。不得其解,也慢慢懒得操练了。

    后来有次学校搞业余活动,有个老师是省象棋协会的,组织了一节棋课。我去晚了,只听了半节。大致意思是讲,下棋要讲全局观,要有战略,例如中局五种策略,中局成杀、不成杀则优、不占优占先、不占先则多子、不多子则求和。还有什么炮破士、马破相、残局炮归家等等。却没有讲如何下棋,课堂上也没有摆个象棋,或是什么棋谱。

    我并没有把这些当回事儿,之后也很少下棋。

    又过多年,毕业后同学聚一起,闲来无事,与一个同学下了两盘。刚开始,他问我这两年有没有下棋,我说没有。他调侃我,“那你以前下不赢我,今天你也难赢了”。我也笑着认同,反正只是玩玩,何必认真。

    可是一开局,他就傻眼了,一直处在下风,且每局必输。他很吃惊,我也很吃惊。之后我认真思考了这件事,觉得是那节棋课影响了我,人的思考能力、计算能力都差不多,而思维方式不同,结果也会有很大不同。他看到的是“棋”,我看到的是“局”。决定胜败的不是棋艺。

     

    又过了几年,我已经不再年少,但还算年轻吧。有一次找一个朋友玩,正好他的一个朋友也在,吃完饭没事儿做,恰巧有副象棋,就与他的朋友下了几局。他们都比我年龄大,已经三十多岁了。不过我也没有放在眼里,自以为水平相当可以,三局我两胜,颇为自得。

    等他走后,我朋友问我:“他水平怎么样呀?”我带着些“谦虚”,洋洋自得:“他水平挺可以的,我差点就输了,还好我三局两胜,略胜那么一点点。”

    我朋友听完哈哈大笑:“你知道他是干吗的吗?他是卖保险的。卖保险的吗,任何人都可能是他的潜在客户,他自然不会去赢你,不光让你赢,还要让你赢得有面子,这才是高手。他原来是在象棋协会的,论象棋,那叫牛×死了。”

    我听完之后,惭愧至极。我关注的是“棋局”,人家所关注的,则超脱棋局之外。眼界不一样,看到的也不一样,操控点也不一样,输赢已经不重要,重要的是输与赢,哪个更有利于自己,然后才是“如何去输”与“如何去赢”。棋局只是一个棋子。决定成败的不是棋艺。

     

    我讲这个故事,是想说明,一个项目经理,对自己操作的项目要有全局观;而且,视角不能仅限于项目本身。明确自身定位,了解外部环境,才能最大成度影响到整个“局”中的各个元素,而这个影响力,就叫“势”。可以这么说,你明确的势力范围,可以只是你的团队,但你的影响力却不能仅限于团队本身。

    做到这些,容易吗?当然不容易。如文章开头所说,“做为一个项目经理,至少要在公司工作两年以上,且年龄不小于三十岁。”这样,才有可能会做得好一些。   

  • [转]项目管理心得:一个项目经理的个人体会、经验总结

    2015-05-21 14:53:57

     

    本文转自:http://kb.cnblogs.com/page/157087/

    本人做项目经理工作多年,感到做这个工作最要紧的就是要明白什么是因地制宜、因势利导,只有最合适的,没有什么叫对的,什么叫错的,项目经理最忌讳的就是完美主义倾向,尤其是做技术人员出身的,喜欢寻找标准答案,耽误了工作进度,也迷茫了自己。以下是本人一些做项目的个人体会,写出来供大家指点,在讨论过程中共同提高水平。

    项目开始阶段是一个最重要的阶段。项目经理在接手一个新项目的时候,首先要尽可能地多从各个方面了解项目的情况,如:

      1. 这个项目是什么项目,具体大概做什么事情,是谁提出来的,目的是解决什么问题。在国内很多客户都很不**的情况下,千万不要根据项目的名称望文生义地去想象项目的目标。一个名为“办公自动化”的项目很有可能在你进场以后一个月才发现客户其实需要的是一个计算机生产管理辅助信息系统。前期了解情况的工作越详细,后面的惊讶就越少,项目的风险就越小。

      2. 这个项目里牵涉哪些方面的人,如投资方、具体业务干系方、项目建成后的运营方、技术监督方等等,很多项目里除了业主单位的结构很复杂以外,还有一些其他单位也会牵涉进来,如项目监理公司、业主的行业主管机构等。项目经理需要了解每个方面的人对这个项目的看法和期望是什么。事先了解各个方面的看法和期望,可以让你在做项目碰到问题的时候,就每件事情分析哪些人会在什么方面支持你,哪些人会出于什么目的反对你,从而提前准备联合朋友去对抗敌人,让事情向你所希望的方向发展。没有永远的朋友,也没有永远的敌人,只有一致的利益,这句话作为项目经理是一定要记住的。

      3. 基本了解了客户的情况后,下面的事情就是了解自己公司各方面对这个项目的看法。首先是高层领导是否重视,这个决定了你在需要资源的时候,公司是否会根据你的要求提供最有力的支持。领导口头肯定是说支持的,你需要做的是了解公司对这个项目的实际期望,是想把项目越做越大还是想赚钱?是想做样板工程还是干脆想敷衍了事,公司领导对项目的态度决定了你做这个项目的战略,而这个战略方针将对你做项目计划产生直接的影响。

      4. 在做整体项目计划前,还要大致计算一下你手上的资源。首先是时间,现在市场竞争激烈,往往很多项目要求在几乎不可能的时间范围里完成。对于这一点,你在做项目的风险控制计划的时候要充分考虑。其次是人员,根据项目预算和已往经验,大致计算一下未来的项目小组有多少种角色,每个角色目前公司是否有人,是否能完全归这个项目使用,是否需要另外招聘一些人员,招聘的准备工作要尽早启动。最后就是一些设备的准备,项目所需大件关键设备要尽早预定,以后不管发生设备等人还是人等设备的情况,浪费的都是你的时间。

      5. 现在是做项目说明书的时候了。一份好的项目说明书不仅将要做的事情描述得很清楚(主要是讲做什么,而不是说怎么做),而且把如何检查也说明得很透彻。也就是说它不仅说明白了要做哪些事情,也让客户的业务人员(一般不懂技术)知道项目做成什么样就算完成了。简单地说,项目说明书描述项目做哪些事情和每件事情做到什么程度以及如何检查每一个结果。

      6. 是到做总体计划的时间了吗?不,你现在已经知道了客户的目标和你手上的资源,那么做计划以前,你还需要和你的经理和客户充分沟通资源的问题。因为很多资源是还不明确的,你需要写一份报告,详细分析这个项目的风险以及对资源的需求情况。如果一些问题不能得到解决的话,将发生什么样的后果。如果资源不够,就要高层改变策略,增加对这个项目的投入。甚至在条件许可的情况下,有些公司会放弃这个项目。总之,没有人能完成一个不可能完成的任务,如果项目经理不能尽早发现风险,那么就只能去当烈士了。

      7. 明白了要做哪些事情和你手上的筹码以及你做这个项目的总体策略,现在是成立项目小组的时候了。很多项目经理都没有自己选择组员的权利,那么,就尽量发挥你的影响力去寻找那些你想要的人吧。成员的组成根据项目不同,相差较大,很难有什么具体要求,但是,一定要有精通客户业务的人,很多小项目里,这个人就是项目经理本人,大项目里会配备行业专家(Industry expert),这样和客户沟通起来才不会鸡同鸭讲,双方才可以相互理解。我经常看到的情况是我们的技术人员和客户交谈时满口的专业术语,结果搞得客户一头雾水,反过来,他还指责客户不懂技术。其实,明白自己想做什么的客户已经是很好的客户了,不知道自己要做什么,更不懂怎么做还要指手画脚的客户到处存在,但是要明白,是客户选择了你,而不是你选择了客户,有了客户你才有工资拿,心平气和一点吧。

      对于这种需求天天变的客户,你就一定要事先做好规矩:

      一、统一联系人,客户指定一个人和项目组进行沟通,不能张领导、王领导都来说几句,如果他们意见不一致,那你只有得罪领导的选择了。所以,项目的最初就要定好规矩,我项目组只认一个的意见,有什么要求你们内部先统一再和我谈,我不想卷入你们内部业务部门之间的矛盾之中。

      二、所有需求变更全部要有书面文字,这点切记!这样做好处多多:

    • 有书面证据,以后他还想改,你有了他以前要求的证据,告诉他:你以前可是这么说的。
    • 便于需求变更管理,需求如何慢慢演变的历史可以看清楚,从而更深切地体会客户的目。
    • 对于客户来说,嘴巴一动最方便,反正是你们做,不花他的资源,所以要求是否合理,是否和项目的目的一致,他是不负责任的。但是如果要他写书面要求,还要签字盖章,他就要谨慎多了,而且一写东西,思想就会更加深入,很多无理要求也就这样胎死腹中了。

      8. 现在你要面对三群人:你的领导、你的组员和你的客户,和这些人沟通,让他们知道你打算怎么做,什么时候要他们做什么准备,这些事情将是你的主要工作。既然沟通这么重要,那事先定义一下沟通的原则也是一件很要紧的事情。很多沟通原则都是潜规则,如果你在一个部门时间做长了,对这些规则的运用觉得是一件理所应当的事情。但是,你现在面对的是多个部门甚至多个单位,不把沟通规则说清楚,你以后就会吃亏。下面的东西看起来无聊,其实还是很管用的:第一个是规定信息的流动方式和介质,是推还是拉。推的意思就是项目经理将主动发布信息,不管通过电话、邮件还是书面方式,保证将信息传达到每个人。这种情况适合小项目,人少。拉的意思就是项目经理就是一个类似web服务器,你自己需要什么信息就去问他。当然,没有项目经理把自己搞得那么累,他会用发布信息到公共介质的方式公布信息,简单的是白板,复杂一点的是项目的公共信息交互区,潜规则就是我发了你没去看就不要说我没告诉你。说这些看似很无聊,其实里面牵涉信息传达不完全的责任问题。当然,这些都是指一般的方式,而且不要绝对化,一般情况下,主动沟通和被动访问是同时存在的,尤其是对领导,项目经理更加应该主动去和领导沟通。第二个问题就是文档问题,很多人怕写文档,但是项目经理一定要牢记“好记性不如烂笔头”的道理。有理有时候为什么会说不清呢?就是因为没有证据。所以项目经理开始就要和客户说清楚有些文档是必须签字的,比如项目经理的项目日志,每个星期至少让客户签字,另外所有达成共识的东西,比如会议纪要,甚至领导的讲话记录,都要写成文档,双方签字,这样以后扯皮的时候,就能做到有据可查。记住:说了的就和没说一样,只有写下来大家签字后才算真正发生了的。还有一些问题,比如你提交的报告,给领导(包括本方领导和客户领导)做一个选择题,结果领导压住不批,让你无所适从,结果拖延了进度。这时候,你可以等,但是注意要留记录,标明是谁的责任;另外,如果你在开始阶段就和领导商定:如果批示提交三天后没有得到领导答复就算对方同意,这样你就会主动很多。再比如不同事件的审批流程问题:什么等级的事情记录在项目日志里、什么等级的事情要双方项目经理专门签署备忘录、什么等级的事情要双方领导出面签署合同附件等等。事先想得越周到,以后的工作就越主动

      9. 好了,做了很多前期工作,定义了一些游戏规则,现在是坐下来做计划的时候了。这一节,任意找一本项目管理的书都会说得比我好,所以我就少写一点,说一些自己的体会就是了。首先是找几个关键组员,比如客户业务专家、系统分析员等等,做一下项目模块划分工作。项目分成几块去做,每一块完成什么,模块之间的信息如何交换等等。需求定义的是做什么的问题,而这里说的是怎么做的问题。这里要强调一点:完成一个目标有很多种方式,你要选一种你最熟悉的,而不是看上去最完美的,这个思路会让你的项目减少很多风险。有时候客户会被某种新技术打动,坚持要你采用那种新技术,你就应该告诉他:你选我做这个项目,就应该容许我采用自己最喜欢的方式做事情,新技术之所以有**力,就是因为吃亏的人还不多,我不希望你成为第一批受害者。采用一个计划会让你的工作更加明确,比如用微软的Project软件,你填写完表格以后,就可以知道这个项目有多少件事情要做,每件事情需要什么资源,他们之间的前后关系如何,消耗的时间有多长,完成后有什么标志等。所有的结果最后用一个叫做甘特图的形式表现出来。你做完这个表以后会惊奇地发现,甘特图上项目的结束时间会远远落后于你的计划结束时间(签合同的人永远不会先征求你的意见的)。当然,学过项目管理的人会大谈什么WBS、优化路径之类的东西,但是我的经验是你再优化也不可能把这些东西安排到计划的时间结束。如果你没碰到这个问题,在我恭喜你挑了一个轻松活之前,请你再去确认你是否罗列了所有要做的事情和正确评估了它们所需要的时间。这时候,你就要考虑牺牲一些任务的时间(也意味着质量)了。按照什么标准牺牲?这个项目的战略!我们在第三节提到过的战略。我的经验是如果你什么都赶进度,其结果可能就是十件事情你一件也没做好,想想多么失败啊。所以,把资源投到你熟悉和有把握的事情上,最后的结果是十件事情,你有三件做成了精品,三件完成,还有四件因为某些原因延误,成绩单是否靓丽了很多呢?战略决定优先级,而正确排列事情的优先级是一个项目经理能力的主要体现。

      10. 好,现在项目已经完成了前期工作,了解了项目的目标、搞清楚了手上的资源,制定了项目的策略,然后编制了项目的整体计划,项目进入实施阶段。进入这个阶段反而是项目经理比较空闲的时候,不像前期的时候项目经理要象记者一样到处和不同的人接触,搞清楚他们在说什么,努力猜测他们在想什么和他们的真正目的,那才是最累人的事情。当然,小项目的项目经理往往自己也是一个资源,要做很多事情,这时候反而比谁都苦。项目经理这段时间的主要工作是保持和客户领导以及自己领导的沟通。和客户领导沟通时特别要注意,除非你需要对方给你支持,那么你才需要讲得具体一点,否则,告诉他一切正常就可以了,而且态度要积极一些,千万不要说一些领导不懂的细节,比如:“王局长,最近项目进度还算正常,就是JVM经常发生一些内存泄漏的情况…”王局长:“(*&$@@”。和自己的领导汇报也要注意这个问题,除非他是一个技术高手,你需要他的技术经验,否则一般就汇报进度是否正常以及有问题时你的对策和打算就可以了,有些需要他支持的地方,比如资源调用需要说详细一点。和组员开会,除了一些项目进度跟踪会议以外,还有很多讨论会,需要大家用头脑风暴方法给出解决问题。与会人员很多都是技术人员,他们的特点是注重细节、缺乏大局观、有点消极悲观、自尊心强(如果总结得不对,欢迎大家拍砖),所以,你作为会议的主持人,只要负责提出问题和记录下他们的观点,千万不要做评判者的角色。一个问题,有很多方面,从不同的角度看,现象是完全不同的,想想盲人摸象的故事吧。这些技术人员,他们往往精通一个方面,就自己的角度发表见解,除非一些很特别的情况,你都应该认为,他们提出的方案,从他们的角度来看是最合理的。你的长处是掌握事情的优先级,评估各个方面的轻重缓急,从而根据他们的意见得出一个合适的(而不是正确的)方案。所以,在会议上,你要充分尊重每一个人和他的意见,夸奖那些意见提得比较好的人,千万不要把会议带入无休止的争论(你要让大家知道事情不是非黑即白的,而是多元的,唉,我们的教育惹的祸…)。会后,你自己写文档,做决定。会议上大家的面子都被照顾了,自己实施起来的阻力就小,如果还有意见的,你就私下找他聊,如果还不能说服他,你就要让他明白,因为你负责这个项目、你担当风险,所以,这个优先级应该你来判断。组织中的高层,并不见得水平会比一般的成员高,但是,他要承担组织的风险,加之信息的不对称性,所以,对事情的优先级的判断肯定比下属强。

      终可交付成果一定要是可以被检查的,比如,【界面要求:美观大方、简洁明快】,这个要求我就不知道如何检查。所以,给开发小组布置任务的时候就要考虑如何检查结果,比如我见过一个计划,里面有一个任务【开发人员熟悉EJB编程】,这个任务,除了让这些人去参加一些专业认证考试,否则,结果很难被检查。所以,时刻考虑如何检查结果、如何向客户交付是项目经理一直要注意的事情,我听说有些老项目经理拿到项目是倒排计划的,即首先看如何验收和验收标准,然后决定工作计划。很多项目开始了很久,还不知道如何验收,那么这个项目出问题的可能性就很大了。做项目就是为了验收,我们的角色不是研究机构,我们的目的就是在付出那么多劳动后得到结果。

      另外我插一句:我是极其不主张到客户现场开发的。尤其是一大群技术人员直接和客户交流,很容易引起冲突和矛盾(技术人员的本性决定的)。我的做法是项目经理和项目实施人员到现场,软件开发人员还是在公司做项目。项目实施人员就是初级项目经理,他们了解自己的产品,懂得一些客户的业务,关键是在于他们具有良好的沟通能力,俗称“皮厚”。他们是客户和研发人员的桥梁,其职业方向也是很机动灵活,以后可以有很多方向可以转,比开发人员的路要宽得多。

      11. 接着,我们再谈谈最让人头痛的需求变更问题。变更通常分为两种:一种是部分更改了原先的目标,即需求变更;另一种是没改变目标,但是客户不满意目前的实现方式,大到流程的实现,小到界面的布局,都是属于这类。碰到这种情况是难以避免的,主要是事先沟通的不够充分和客户随着项目的进展,慢慢想清楚了问题,改变了以前的思路。这时候,如果需要改并且你的战略是容许这种情况的,那么注意下面几点:

    1. 确保以前的文档,就是记载着以前的结论的东西,客户是否签过字,如果没有,赶紧把你的工作停下来,赶快再和客户自己确认一下你的方案,然后让他签字,避免以后说话没有凭据;
    2. 和客户坐下来,探讨他修改的根本目的是什么,是不是有同样能达到相同目的、但是对你来说有代价更小的选择?
    3. (项目初期的工作)明确更改流程,一般是客户指定一人签字(否则客户每个领导都有权力来插一杠子,你就废了),以正式项目文件的方式提交给你,然后,你做评估分析,分析对成本、进度的影响,在你的领导同意后,出相应意见书,主要是要说明更改设计的原因和指出由此带来的不确定后果(这个东西先写出来,后面如果真的发生了,至少不是你的错)。然后再让客户在上面签字。见过医院给病人做手术以前让家人签的免责条款吗?对,就学习那个,让大家都意识到任何的更改都有成本和代价。

      12. 系统开发告一段落后,就进入客户培训、系统验收阶段,这个阶段,我一般会注意以下几个问题:

      一、给客户做培训前,多注意一些表面功夫。很多程序员认为,系统的逻辑核心是否正确是关键,至于界面如何,界面上的用词是否准确,那是无关紧要的问题,而且培训的时候也是信手拈来,想到哪里说到哪里,下面听讲的人不知所云,云山雾罩,培训效果自然可以想象。我的体会是,给客户做培训的版本,如果你在做多次测试以后仍然不能确定逻辑是否合乎要求,那么,你至少要在界面上多花一点功夫。注意每个界面的布局、用词、链接的正确性等等,总之不要让客户看到一些他不该看到的东西。文档方面,准备至少两个文档:用户手册和培训手册。这两个文档的内容很多都是一致的,但是角度完全不同。用户手册往往是站在系统设计者的角度,按照自己的思路,分模块讲解系统的操作和功能;而培训手册,一定要站在客户业务人员的角度,根据每个角色面对不同业务的**,如何通过使用本系统的一系列功能来实现目标。所以,第一次培训以前,系统界面是否完整正确、培训文档是否完备都是很关键的因素,第一炮打不响,以后就麻烦很多

      作为项目经理,其实脑子里就是几样东西:做哪些事情、做到什么程度、怎么交货、手上的资源以及各个事情的优先级。所谓多快好省那是人类的梦想,这四个方面都是相互矛盾的,属于典型的又要马儿跑,又要马儿不吃草的类型。考虑问题的轻重缓急方面,往往是把快放在第一位,各方领导都会给你最后期限,所以保进度是第一位的;省是第二位的,企业的根本目的是盈利,如果收入不能增加的话,至少费用要控制住;好是第三位的,没办法,谁都想精益求精,但是,没有强大的资源保障,质量只好先牺牲了;最后是多,客户的要求源源不断,如何降低客户的期望值,让他们从理想回到现实也是项目经理的分内工作。

      验收前,除了做好文档工作,即可交付成果以外,多花时间搞清楚客户的做事情流程是很重要的事情,这些在前面已经有所提及,这里就不再多说。

      我对验收最大的体会就是举证问题。即千万不要让客户这么想:你必须有证据证明你的系统是没问题的。这样你就没戏了,微软那么多天才,做了XP还天天打补丁,要你的程序没问题,既不可能,你也没办法拿出证据。你要让客户明白,所谓验收,就是我按照测试文档的测试用例跑一遍,结果和预期结果一致就应该算通过了,而且还容许有一些小错误留在验收后改正,他可以对测试用例提意见。所以,验收前双方要确认测试计划和测试用例。如果他认为系统不符合要求,那么他应该举证,证明这个系统和最初设计相背离的。所以,参考法律概念,千万不要举证倒置。另外,认为系统完美了才能验收的想法也是错误的,软件开发合同里一定要注明验收以后维护期的费用问题,否则,客户担心一旦验收就得不到你们的支持,自然不配合验收,那么,你这个项目经理就很难交功课了。   

  • Android自动化压力测试图解教程——Monkey工具

    2015-05-21 14:16:49

    有时候我们需要对一个软件进行压力测试,检查该软件的性能。如果是人工进行测试的话,效率会低很多,而且会比较枯燥。这时,Android中的一个命令行工具Monkey就可以为我们减轻很多重复而又繁琐的工作。

     

            一、Monkey简介

          至于Monkey的名字是有何而来的呢?这个没有去怎么考究,Monkey这个工具就是一个调皮的猴子,在App中乱按、乱摸、乱滚、乱跳。Monkey测试是Android平台下自动化测试的一种快速有效的手段,通过Monkey工具可以模拟用户触摸屏幕、滑动轨迹球、按键等操作来对模拟器或者手机设备上的软件进行压力测试,检测该软件的稳定性、健壮性。它的原理是向系统发送伪随机的用户事件流(如按键输入、触摸输入、手势输入等),实现对正在开发的应用程序进行压力测试。

     

          二、Monkey的特性

        (1)测试的对象仅为应用程序包(apk包),有一定的局限性;

        (2Monkey测试使用的事件流数据流是随机的,不能进行自定义;

        (3)可对MonkeyTest的对象、事件数量、类型、频率等进行设置。

          虽然Monkey工具并不完善,但是足于应付应用程序的基本测试需要了。如果需要功能更强大的测试工具的话,可以使用Monkey的进化版MonkeyRunner如果把Monkey看作是幼儿园的小孩,那么它的进化版MonkeyRunner就可以看作是一个初中生了。它支持自定义插件,控制事件,随时截图,简而言之,任何你在模拟器/设备中能干的事情,MonkeyRunner都能干,而且还可以记录和回放。在这里,就不详细介绍MonkeyRunner了,具体可以参考其官方文档或者其他相关资料。

         注:MonkeyRunner官方文档的网址

        http://developer.android.com/guide/developing/tools/monkeyrunner_concepts.html

     

        三、Monkey的基本用法

        基本语法如下:

        $ adb shell monkey [options]

        如果不指定optionsMonkey将以无反馈模式启动,并把事件任意发送到安装在目标环境中的全部包。下面是一个更为典型的命令行示例,它启动指定的应用程序,并向其发送1000个伪随机事件:

        $ adb shell monkey -p your.package.name -v number

        $ monkey -ppackage的意思)  指定文件名 -v(测试的次数和频率) number(次数)

     

        四、Monkey测试示例图解

        通过简单的测试示例,初步了解并掌握Monkey测试的步骤。注意,这里主要是使用adb命令进行安装和相关操作。测试的具体参考步骤如下:

       (1)首先,先准备了一个测试用的应用程序(apk文件)。为了测试,这里选择了一个格瓦拉手机购票App进行测试。下载地址为: http://www.gewara.com/mobile/mobileMovie.xhtml

       下载好后,得到下图所示的apk文件。

     

       (2)将apk文件复制到android sdk对应platform-tools的目录下。例如,笔者的sdk路径为 D:\android\android-sdk-windows\platform-tools。如图所示

      

        (3)进行apk文件的安装(安装的前提是,已经启动并可以检测模拟器):有安装91助手或者豌豆的用户可以直接双击apk文件进行安装;也可以使用android下的adb命令进行安装(如下图所示,Success表示安装成功)。adb命令下安装apk文件的命令为:adb install 文件名.apk

      

     (4)安装好后,会在模拟器上看到应用程序的启动图标

        

       (5)安装好apk文件后,需要知道应用程序主Activity(第一个启动的Activity)所在的包名。这时,我们可以使用adb shell命令查找到程序主Activity所在的包名,如下图所示。(知道了apk的包名,我们也可以利用adb命令进行应用程序的卸载;卸载apk文件的命令为:adb uninstall 包名)

     

        (6)这里是最关键的一步,使用moneky命令进行自动化压力测试。

        命令为:#monkey -p com.gewara -v 1000(参数说明:-p后跟着软件所在包名,-v后跟测试的次数)。这里对该软件进行1000次的自动化测试,几分钟内即可以完成测试。如图所示

      

      

     

      

     

      (7)测试完毕,发现程序出错了。程序出错,表明该软件的稳定性和健壮性还有待提高。

      这时,可以打开Lotcat查看出错信息。如图所示

         

      

          五、Monkey测试的停止条件

       (1)如果先顶了Monkey运行在一个或几个特定的包上,那么它会检测试图转到它包的操作,并对其进行阻止;

       (2)如果应用程序崩溃或接收到任何失控异常,Monkey将停止并报错

       (3)如果应用程序产生了应用程序不响应(application not responding)的错误,Monkey将会停止并报错。

        通过多次并且不同设定下的Monkey测试才算它是一个稳定性和健壮性足够的程序。

     

        六、Monkey命令参数说明

        随着测试的深入,我们需要忽略App的崩溃(App的崩溃会导致Monkey测试的停止),而不是停住,monkey同样能做到。--ignore crashes

       甚至,它还能生成profiling报告。 --hprof

       注:Monkey具体参数的设定可参考:

       http://developer.android.com/guide/developing/tools/monkey.html

       通过参数的设置,可以完成更多的调试功能,Monkey命令行参数中文相关说明见下表。

       

  • 经典SQL语句大全

    2015-01-23 13:46:36

    一、基础

    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],..)

    根据已有的表创建新表:
    Acreate 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
    、说明:使用外连接
    Aleft 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
    Bright outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    Cfull/cross outer join
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    12
    、分组:Group by:
      
    一张表,一旦分组 完成后,查询后只能得到组相关的信息。
       
    组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
     
      SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
      
    selecte统计函数中的字段,不能和普通的字段放在一起;

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

    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、说明:子查询(表名1a 表名2b)
    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、说明:外连接查询(表名1a 表名2b)
    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、说明:在线视图查询(表名1a )
    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 中但不在 TableBTableC 中的行并消除所有重复行而派生出一个结果表
    (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、说明:列示typevenderpcs字段,以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、说明:选择从1015的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    11=11=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


    10SQL 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

  • 经典SQL语句大全

    2015-01-23 13:44:26

    经典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],..)

    根据已有的表创建新表:
    Acreate 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
    、说明:使用外连接
    Aleft 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
    Bright outer join:
    右外连接(右连接):结果集既包括连接表的匹配连接行,也包括右连接表的所有行。
    Cfull/cross outer join
    全外连接:不仅包括符号连接表的匹配行,还包括两个连接表中的所有记录。
    12
    、分组:Group by:
      
    一张表,一旦分组 完成后,查询后只能得到组相关的信息。
       
    组相关的信息:(统计信息) count,sum,max,min,avg  分组的标准)
     
      SQLServer中分组时:不能以text,ntext,image类型的字段作为分组依据
      
    selecte统计函数中的字段,不能和普通的字段放在一起;

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

    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、说明:子查询(表名1a 表名2b)
    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、说明:外连接查询(表名1a 表名2b)
    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、说明:在线视图查询(表名1a )
    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 中但不在 TableBTableC 中的行并消除所有重复行而派生出一个结果表
    (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、说明:列示typevenderpcs字段,以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、说明:选择从1015的记录
    select top 5 * from (select top 15 * from table order by id asc) table_别名 order by id desc

    三、技巧

    11=11=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


    10SQL 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

    查看(498) 评论(0) 收藏 分享 管理

  • 客栈小下息

    2014-05-20 21:30:26

    此时此刻宝宝已经躺在身边睡着了,今天是520,对于有宝万事足的女人来讲。一切节日都悄然无声的变成浮云。老公似乎在"逃避",要么怎么会选择今天加班呢?好吧难得到安静。可以让我有时间躺下来写写征文。
    时间真的很快,想起第一次帮51testing庆生的时候,它才三四岁的样子。转眼间已经十岁了。51testing足足陪伴了我七年。七年间亲眼目睹着它的壮大,七年,我的生活也发生了很大的变化。
    回想起这七年的测试生涯,我似乎过于平坦。职业发展没有受任何阻碍,按着当年的职业规划有序滴进行着。也是自己的踏实稳重,我这三年的工作中遇到不少"桃花运"不少机会再向我招手,可是出于各种原因我抵制住了诱惑,仍然保持在老东家。也许这一切都是为了今天舒坦的日子在做铺垫。总之现在我在职业客栈里小息。我在享受着边工作边照顾宝宝到幸福时光。虽然不会长久,但我很珍惜有这段日子,让我的生活没有出现大多数新妈妈所遇到的工作与生活冲突的情况。我服务于外包公司,领导考虑到我个人情况没有强迫我去项目组,我边在公司"打杂"边兼顾一个离岸项目到测试工作。我觉得很幸运可以有这样的过渡时间,也很庆幸自己抵制住了曾经的诱惑。不难看出,我不是一个一味追求金钱的女人。我自认为自己是一个懂得舍得的人。也正因为此,我才能快乐的工作,愉快的生活吧。(自恋一下,其实我是想说,人不能一味和别人比工资,当自己的能力达到一定的高度,你一样会超越别人,不过是有些人在意眼前,有些人看长远)。但是这并不代表我是一个没有追求的人,俗话说不想当将军的士兵不是好士兵。我暂时的"忍耐"是在"蓄谋"一个新的里程碑。我想万能的51testing正在帮我接近目标。因为我又开始在论坛里挖金啦。七年之后还是想说一句话"当年挖过的坛子,只有51成了测试人的"娘家"。因为它拥有这些金主的无私奉献,希望家圆的人继续默默奉献,分享自己的技能,自己的宝贵经验,让它继续影响后来人。让我们测试领域的亲们时刻惦记着"回家"。
    说到这里,我突然很想念当年和我一起侃侃而谈的兄弟姐妹们,时隔七年,你们都好么。很想念和你们一起切磋问题,一起灌水的日子。那个千里,原点,矿泉水,小杜子,开心果,默默巫,愚人...还有那些我一时叫不出名字的兄弟姐妹,你们是我这一路走来的目击证人。曾经的无话不谈,如今也因为家庭,工作的重负而不得已断了联系,不过百合心里一直怀念曾经一起成长的日子。还有那些被百合和千里影响的学弟学妹们,如今你们也都好么,几年的历练,相信你们早已成为不可替代的主力军了吧。(此时此刻,脑海里涌现了七年前的一目目)
    说说重点吧,最近在做一个App项目,目前是需求分析,编写用例阶段。在几次的研讨会上,我发现我曾经认为学不到东西的项目经验中给了我很多的启发,同时我把这些问题提出来,规避了好多问题。我就想就这个事和亲们交流一下,站在今天,我们认为好与不好的项目,都会成为昨天,变成经验,我们永远看不到明天,我们始终交替在今天和昨天,只要你用心对待今天,昨天的经验就会很好的为我们今天的项目服务。这大概就是经验累加吧,做过web,wap ,pc,app之后,我发现软件这东西实在是共通的地方太多。所以那个方向都别小看,都是可以学到东西的。抱怨当前工作不好的亲,不如调整心态,愉快的工作吧,它会为你下一份工作带来益处的。
    不扯了,越扯越远,目前属于被同事嘲笑需要补充dha的阶段,所以思路总是不够清晰,表达总是不够清楚。但是为了51testing庆生,还是来冒险一次,让大家见笑啦。最后祝51生日快乐,越办越好,祝各位马上有工作,马上有钱,马上有对象,马上有娃。(第一次用ipad敲这么多字,手腕都酸了,各位晚安吧)

  • HttpClient入门

    2011-11-15 16:21:49

    HttpClient简介

    HTTP 协议可能是现在 Internet 上使用得最多、最重要的协议了,越来越多的 Java 应用程序需要直接通过 HTTP 协议来访问网络资源。虽然在 JDK 的 java.net 包中已经提供了访问 HTTP 协议的基本功能,但是对于大部分应用程序来说,JDK 库本身提供的功能还不够丰富和灵活。HttpClient 是 Apache Jakarta Common 下的子项目,用来提供高效的、最新的、功能丰富的支持 HTTP 协议的客户端编程工具包,并且它支持 HTTP 协议最新的版本和建议。HttpClient 已经应用在很多的项目中,比如 Apache Jakarta 上很著名的另外两个开源项目 Cactus 和 HTMLUnit 都使用了 HttpClient,更多使用 HttpClient 的应用可以参见http://wiki.apache.org/jakarta-httpclient/HttpClientPowered。HttpClient 项目非常活跃,使用的人还是非常多的。目前 HttpClient 版本是在 2005.10.11 发布的 3.0 RC4 。


    HttpClient 功能介绍

    以下列出的是 HttpClient 提供的主要的功能,要知道更多详细的功能可以参见 HttpClient 的主页。

    • 实现了所有 HTTP 的方法(GET,POST,PUT,HEAD 等)
    • 支持自动转向
    • 支持 HTTPS 协议
    • 支持代理服务器等

    下面将逐一介绍怎样使用这些功能。首先,我们必须安装好 HttpClient。


    HttpClient 基本功能的使用

    GET 方法

    使用 HttpClient 需要以下 6 个步骤:

    1. 创建 HttpClient 的实例

    2. 创建某种连接方法的实例,在这里是 GetMethod。在 GetMethod 的构造函数中传入待连接的地址

    3. 调用第一步中创建好的实例的 execute 方法来执行第二步中创建好的 method 实例

    4. 读 response

    5. 释放连接。无论执行方法是否成功,都必须释放连接

    6. 对得到后的内容进行处理

    根据以上步骤,我们来编写用GET方法来取得某网页内容的代码。

    • 大部分情况下 HttpClient 默认的构造函数已经足够使用。
      HttpClient httpClient = new HttpClient();
      

    • 创建GET方法的实例。在GET方法的构造函数中传入待连接的地址即可。用GetMethod将会自动处理转发过程,如果想要把自动处理转发过程去掉的话,可以调用方法setFollowRedirects(false)。
      GetMethod getMethod = new GetMethod("http://www.ibm.com/");
      

    • 调用实例httpClient的executeMethod方法来执行getMethod。由于是执行在网络上的程序,在运行executeMethod方法的时候,需要处理两个异常,分别是HttpException和IOException。引起第一种异常的原因主要可能是在构造getMethod的时候传入的协议不对,比如不小心将"http"写成"htp",或者服务器端返回的内容不正常等,并且该异常发生是不可恢复的;第二种异常一般是由于网络原因引起的异常,对于这种异常 (IOException),HttpClient会根据你指定的恢复策略自动试着重新执行executeMethod方法。HttpClient的恢复策略可以自定义(通过实现接口HttpMethodRetryHandler来实现)。通过httpClient的方法setParameter设置你实现的恢复策略,本文中使用的是系统提供的默认恢复策略,该策略在碰到第二类异常的时候将自动重试3次。executeMethod返回值是一个整数,表示了执行该方法后服务器返回的状态码,该状态码能表示出该方法执行是否成功、需要认证或者页面发生了跳转(默认状态下GetMethod的实例是自动处理跳转的)等。
      //设置成了默认的恢复策略,在发生异常时候将自动重试3次,在这里你也可以设置成自定义的恢复策略
      getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER, 
              new DefaultHttpMethodRetryHandler()); 
      //执行getMethod
      int statusCode = client.executeMethod(getMethod);
      if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: " + getMethod.getStatusLine());
      }
      

    • 在返回的状态码正确后,即可取得内容。取得目标地址的内容有三种方法:第一种,getResponseBody,该方法返回的是目标的二进制的byte流;第二种,getResponseBodyAsString,这个方法返回的是String类型,值得注意的是该方法返回的String的编码是根据系统默认的编码方式,所以返回的String值可能编码类型有误,在本文的"字符编码"部分中将对此做详细介绍;第三种,getResponseBodyAsStream,这个方法对于目标地址中有大量数据需要传输是最佳的。在这里我们使用了最简单的getResponseBody方法。
      byte[] responseBody = method.getResponseBody();
      

    • 释放连接。无论执行方法是否成功,都必须释放连接。
      method.releaseConnection();
      

    • 处理内容。在这一步中根据你的需要处理内容,在例子中只是简单的将内容打印到控制台。
      System.out.println(new String(responseBody));
      

    下面是程序的完整代码,这些代码也可在附件中的test.GetSample中找到。


    package test;
    import java.io.IOException;
    import org.apache.commons.httpclient.*;
    import org.apache.commons.httpclient.methods.GetMethod;
    import org.apache.commons.httpclient.params.HttpMethodParams;
    public class GetSample{
      public static void main(String[] args) {
      //构造HttpClient的实例
      HttpClient httpClient = new HttpClient();
      //创建GET方法的实例
      GetMethod getMethod = new GetMethod("http://www.ibm.com");
      //使用系统提供的默认的恢复策略
      getMethod.getParams().setParameter(HttpMethodParams.RETRY_HANDLER,
        new DefaultHttpMethodRetryHandler());
      try {
       //执行getMethod
       int statusCode = httpClient.executeMethod(getMethod);
       if (statusCode != HttpStatus.SC_OK) {
        System.err.println("Method failed: "
          + getMethod.getStatusLine());
       }
       //读取内容 
       byte[] responseBody = getMethod.getResponseBody();
       //处理内容
       System.out.println(new String(responseBody));
      } catch (HttpException e) {
       //发生致命的异常,可能是协议不对或者返回的内容有问题
       System.out.println("Please check your provided http address!");
       e.printStackTrace();
      } catch (IOException e) {
       //发生网络异常
       e.printStackTrace();
      } finally {
       //释放连接
       getMethod.releaseConnection();
      }
     }
    }
    

    POST方法

    根据RFC2616,对POST的解释如下:POST方法用来向目的服务器发出请求,要求它接受被附在请求后的实体,并把它当作请求队列(Request-Line)中请求URI所指定资源的附加新子项。POST被设计成用统一的方法实现下列功能:

    • 对现有资源的注释(Annotation of existing resources)
    • 向电子公告栏、新闻组,邮件列表或类似讨论组发送消息
    • 提交数据块,如将表单的结果提交给数据处理过程
    • 通过附加操作来扩展数据库

    调用HttpClient中的PostMethod与GetMethod类似,除了设置PostMethod的实例与GetMethod有些不同之外,剩下的步骤都差不多。在下面的例子中,省去了与GetMethod相同的步骤,只说明与上面不同的地方,并以登录清华大学BBS为例子进行说明。

    • 构造PostMethod之前的步骤都相同,与GetMethod一样,构造PostMethod也需要一个URI参数,在本例中,登录的地址是http://www.newsmth.net/bbslogin2.php。在创建了PostMethod的实例之后,需要给method实例填充表单的值,在BBS的登录表单中需要有两个域,第一个是用户名(域名叫id),第二个是密码(域名叫passwd)。表单中的域用类NameValuePair来表示,该类的构造函数第一个参数是域名,第二参数是该域的值;将表单所有的值设置到PostMethod中用方法setRequestBody。另外由于BBS登录成功后会转向另外一个页面,但是HttpClient对于要求接受后继服务的请求,比如POST和PUT,不支持自动转发,因此需要自己对页面转向做处理。具体的页面转向处理请参见下面的"自动转向"部分。代码如下:
      String url = "http://www.newsmth.net/bbslogin2.php";
      PostMethod postMethod = new PostMethod(url);
      // 填入各个表单域的值
      NameValuePair[] data = { new NameValuePair("id", "youUserName"),
      new NameValuePair("passwd", "yourPwd") };
      // 将表单的值放入postMethod中
      postMethod.setRequestBody(data);
      // 执行postMethod
      int statusCode = httpClient.executeMethod(postMethod);
      // HttpClient对于要求接受后继服务的请求,象POST和PUT等不能自动处理转发
      // 301或者302
      if (statusCode == HttpStatus.SC_MOVED_PERMANENTLY || 
      statusCode == HttpStatus.SC_MOVED_TEMPORARILY) {
          // 从头中取出转向的地址
          Header locationHeader = postMethod.getResponseHeader("location");
          String location = null;
          if (locationHeader != null) {
           location = locationHeader.getValue();
           System.out.println("The page was redirected to:" + location);
          } else {
           System.err.println("Location field value is null.");
          }
          return;
      }
      

    完整的程序代码请参见附件中的test.PostSample


    使用HttpClient过程中常见的一些问题

    下面介绍在使用HttpClient过程中常见的一些问题。

    字符编码

    某目标页的编码可能出现在两个地方,第一个地方是服务器返回的http头中,另外一个地方是得到的html/xml页面中。

    • 在http头的Content-Type字段可能会包含字符编码信息。例如可能返回的头会包含这样子的信息:Content-Type: text/html; charset=UTF-8。这个头信息表明该页的编码是UTF-8,但是服务器返回的头信息未必与内容能匹配上。比如对于一些双字节语言国家,可能服务器返回的编码类型是UTF-8,但真正的内容却不是UTF-8编码的,因此需要在另外的地方去得到页面的编码信息;但是如果服务器返回的编码不是UTF-8,而是具体的一些编码,比如gb2312等,那服务器返回的可能是正确的编码信息。通过method对象的getResponseCharSet()方法就可以得到http头中的编码信息。
    • 对于象xml或者html这样的文件,允许作者在页面中直接指定编码类型。比如在html中会有<meta. http-equiv="Content-Type" content="text/html; charset=gb2312"/>这样的标签;或者在xml中会有<?xml version="1.0" encoding="gb2312"?>这样的标签,在这些情况下,可能与http头中返回的编码信息冲突,需要用户自己判断到底那种编码类型应该是真正的编码。

    自动转向

    根据RFC2616中对自动转向的定义,主要有两种:301和302。301表示永久的移走(Moved Permanently),当返回的是301,则表示请求的资源已经被移到一个固定的新地方,任何向该地址发起请求都会被转到新的地址上。302表示暂时的转向,比如在服务器端的servlet程序调用了sendRedirect方法,则在客户端就会得到一个302的代码,这时服务器返回的头信息中location的值就是sendRedirect转向的目标地址。

    HttpClient支持自动转向处理,但是象POST和PUT方式这种要求接受后继服务的请求方式,暂时不支持自动转向,因此如果碰到POST方式提交后返回的是301或者302的话需要自己处理。就像刚才在POSTMethod中举的例子:如果想进入登录BBS后的页面,必须重新发起登录的请求,请求的地址可以在头字段location中得到。不过需要注意的是,有时候location返回的可能是相对路径,因此需要对location返回的值做一些处理才可以发起向新地址的请求。

    另外除了在头中包含的信息可能使页面发生重定向外,在页面中也有可能会发生页面的重定向。引起页面自动转发的标签是:<meta. http-equiv="refresh" content="5; url=http://www.ibm.com/us">。如果你想在程序中也处理这种情况的话得自己分析页面来实现转向。需要注意的是,在上面那个标签中url的值也可以是一个相对地址,如果是这样的话,需要对它做一些处理后才可以转发。

    处理HTTPS协议

    HttpClient提供了对SSL的支持,在使用SSL之前必须安装JSSE。在Sun提供的1.4以后的版本中,JSSE已经集成到JDK中,如果你使用的是JDK1.4以前的版本则必须安装JSSE。JSSE不同的厂家有不同的实现。下面介绍怎么使用HttpClient来打开Https连接。这里有两种方法可以打开https连接,第一种就是得到服务器颁发的证书,然后导入到本地的keystore中;另外一种办法就是通过扩展HttpClient的类来实现自动接受证书。

    方法1,取得证书,并导入本地的keystore:

    • 安装JSSE (如果你使用的JDK版本是1.4或者1.4以上就可以跳过这一步)。本文以IBM的JSSE为例子说明。先到IBM网站上下载JSSE的安装包。然后解压开之后将ibmjsse.jar包拷贝到<java-home>\lib\ext\目录下。
    • 取得并且导入证书。证书可以通过IE来获得:

      1. 用IE打开需要连接的https网址,会弹出如下对话框:



      2. 单击"View Certificate",在弹出的对话框中选择"Details",然后再单击"Copy to File",根据提供的向导生成待访问网页的证书文件



      3. 向导第一步,欢迎界面,直接单击"Next",



      4. 向导第二步,选择导出的文件格式,默认,单击"Next",



      5. 向导第三步,输入导出的文件名,输入后,单击"Next",



      6. 向导第四步,单击"Finish",完成向导



      7. 最后弹出一个对话框,显示导出成功



    • 用keytool工具把刚才导出的证书倒入本地keystore。Keytool命令在<java-home>\bin\下,打开命令行窗口,并到<java-home>\lib\security\目录下,运行下面的命令:

      keytool -import -noprompt -keystore cacerts 
      -storepass changeit -alias yourEntry1 -file your.cer
      

      其中参数alias后跟的值是当前证书在keystore中的唯一标识符,但是大小写不区分;参数file后跟的是刚才通过IE导出的证书所在的路径和文件名;如果你想删除刚才导入到keystore的证书,可以用命令:

      keytool -delete -keystore cacerts -storepass changeit -alias yourEntry1
      

    • 写程序访问https地址。如果想测试是否能连上https,只需要稍改一下GetSample例子,把请求的目标变成一个https地址。
      GetMethod getMethod = new GetMethod("https://www.yourdomain.com");
      

      运行该程序可能出现的问题:

      1. 抛出异常java.net.SocketException: Algorithm SSL not available。出现这个异常可能是因为没有加JSSEProvider,如果用的是IBM的JSSE Provider,在程序中加入这样的一行:

       if(Security.getProvider("com.ibm.jsse.IBMJSSEProvider") == null)
       Security.addProvider(new IBMJSSEProvider());
       

      或者也可以打开<java-home>\lib\security\java.security,在行

      security.provider.1=sun.security.provider.Sun
      security.provider.2=com.ibm.crypto.provider.IBMJCE
      

      后面加入security.provider.3=com.ibm.jsse.IBMJSSEProvider

      2. 抛出异常java.net.SocketException: SSL implementation not available。出现这个异常可能是你没有把ibmjsse.jar拷贝到<java-home>\lib\ext\目录下。

      3. 抛出异常javax.net.ssl.SSLHandshakeException: unknown certificate。出现这个异常表明你的JSSE应该已经安装正确,但是可能因为你没有把证书导入到当前运行JRE的keystore中,请按照前面介绍的步骤来导入你的证书。

    方法2,扩展HttpClient类实现自动接受证书

    因为这种方法自动接收所有证书,因此存在一定的安全问题,所以在使用这种方法前请仔细考虑您的系统的安全需求。具体的步骤如下:

    • 提供一个自定义的socket factory(test.MySecureProtocolSocketFactory)。这个自定义的类必须实现接口org.apache.commons.httpclient.protocol.SecureProtocolSocketFactory,在实现接口的类中调用自定义的X509TrustManager(test.MyX509TrustManager),这两个类可以在随本文带的附件中得到
    • 创建一个org.apache.commons.httpclient.protocol.Protocol的实例,指定协议名称和默认的端口号
      Protocol myhttps = new Protocol("https", new MySecureProtocolSocketFactory (), 443);
      

    • 注册刚才创建的https协议对象
      Protocol.registerProtocol("https ", myhttps);
      

    • 然后按照普通编程方式打开https的目标地址,代码请参见test.NoCertificationHttpsGetSample

    处理代理服务器

    HttpClient中使用代理服务器非常简单,调用HttpClient中setProxy方法就可以,方法的第一个参数是代理服务器地址,第二个参数是端口号。另外HttpClient也支持SOCKS代理。


    httpClient.getHostConfiguration().setProxy(hostName,port);
    


    结论

    从上面的介绍中,可以知道HttpClient对http协议支持非常好,使用起来很简单,版本更新快,功能也很强大,具有足够的灵活性和扩展性。对于想在Java应用中直接访问http资源的编程人员来说,HttpClient是一个不可多得的好工具。


    参考资料

    • Commons logging包含了各种各样的日志API的实现,读者可以通过站点http://jakarta.apache.org/commons/logging/得到详细的内容

    • Commons codec包含了一些一般的解码/编码算法。包含了语音编码、十六进制、Base64和URL编码等,通过http://jakarta.apache.org/commons/codec/可以得到详细的内容

    • rfc2616是关于HTTP/1.1的文档,可以在http://www.faqs.org/rfcs/rfc2616.html上得到详细的内容,另外rfc1945是关于HTTP/1.0的文档,通过http://www.faqs.org/rfcs/rfc1945.html可以得到详细内容

    • SSL――SSL 是由 Netscape Communications Corporation 于 1994 年开发的,而 TLS V1.0 是由 Internet Engineering Task Force(IETF)定义的标准,它基于 SSL V3.0,并且在使用的加密算法上与其有些许的不同。例如,SSL 使用 Message Authentication Code(MAC)算法来生成完整性校验值,而 TLS 应用密钥的 Hashing for Message Authentication Code(HMAC)算法。

    • IBM JSSE提供了SSL(Secure Sockets Layer)和TLS(Transport Layer Security)的java实现,在http://www-03.ibm.com/servers/eserver/zseries/software/java/jsse.html中可以得到详细的信息

    • Keytool是一个管理密钥和证书的工具。关于它详细的使用信息可以在http://www.doc.ic.ac.uk/csg/java/1.3.1docs/tooldocs/solaris/keytool.html上得到

    • HTTPClient的主页是http://jakarta.apache.org/commons/httpclient/,你可以在这里得到关于HttpClient更加详细的信息

  • CURL使用HTTPS的技术小结

    2011-11-01 15:05:00

    原创作品,允许转载,转载时请务必以超链接形式标明文章 原始出处 、作者信息和本声明。否则将追究法律责任。http://dannyyuan.blog.51cto.com/212520/124957

    cURLlinux下命令行提交HTTP(S)请求的一个很有用的工具,支持表单数据提交、文件上传、文件下载、批量访问,多种HTTP方法等。其中对HTTPS的支持有些技术细节还是很有点讲究的,也是我在最近工作中费了不少时间摸索出来的。 

    cURLHTTPS的支持是通过--cacert, --capath, --with-ca-bundle等参数来对HTTPS加以支持的,详细信息可以curl --help来得到参数明细。[url]http://curl.haxx.se/docs/sslcerts.html[/url]里是curl的官方文档介绍,其中讲了如何导入CA的具体方法,以及使用CA的方法。其中--with-ca-bundle可以用环境变量CURL_CA_BUNDLE(LINUX下)或curl-ca-bundle.crt(WINDOWS下可搜索到该文件)来实现默认指定。
    通过IE或其他浏览器访问HTTPS服务器我们可以很容易得到SSLX.509安全证书,证书导出可以选择编码格式,我们通常选择DER或者BASE64编码方法,导出文件为cer后缀。需要注意的是对于openssl生成crt证书文件时--info参数会有区别。如对DER编码文件命令应该是
    openssl x509 -inform. DES -in /aaa-der.cer -text -out /.aaa-der.crt 
    其中aaa-der.cer是浏览器里导出的x.509证书文件,aaa-der.crt是加密CA证书被curl所需加载验证的。如果导出用BASE64编码导出的,则命令行应该改为 
    openssl x509 -inform. PEM -in /aaa-b64.cer -text -out /.aaa-b64.crt 
    其中-inform参数需要改为PEM,来对应编码格式BASE64 
    另外,X.509证书如果是三层以上的,即除了底层的URL外,上面还有两层以上的,则说明该证书是一个证书夹,即便里面只有一个证书。这时候用在curl时需作为--capath的参数值代入才能生效; 反之,如果只有两层的,即除了底层的URL外,上面只有一层的,则说明该证书只是一个证书,用在curl里需作为--cacert里的参数值才能生效。
     
    证书在curl里能被通过必须具备以下三个条件: 
    1、被CA签证过的证书; 
    2、期限有效的; 
    3URL能匹配请求。 
     
    其中第三个可以用过hosts添加ip-name对来实现欺骗,如果服务器的SSL证书属于复制使用的话。 
     
    千试百试,终于得到以上体会,希望有相关问题的人可以参考借鉴,也给自己以后参考使用。 
     
    另,一个期间碰到的环境问题,让自己白忙活了一天,也记录在此,警醒自己: 
    curl对某web server进行访问,在几台不同网络的机器试,http在所有机器上都是正常的,https在其中的两台上不行,报socket 111无法连接的错误,其他的机器没问题。证书也没有问题。一整天也没有搞明白。因为web server不是我的可触及范围,结果也就是web server的问题,让我白忙活了这么久。因为web server没有启用ssl,它提供的ssl是网络设备ssl-box (netscaler)所支持的,所以所有内网机器都不会成功访问到web serverhttps端口,外网地址都可以,因为ssl是网络提供的,内网不会经过到netscaler去重定向https。这个是netscaler没配全的原因,唉!真苦!

  • linux下curl命令详解

    2011-11-01 15:04:09

    linux下curl命令详解
    2011-03-04 17:03

    Curl是Linux下一个很强大的http命令行工具,其功能十分强大。

    1) 二话不说,先从这里开始吧!

    $ curl http://www.linuxidc.com

    回车之后,www.linuxidc.com 的html就稀里哗啦地显示在屏幕上了    ~

    2) 嗯,要想把读过来页面存下来,是不是要这样呢?


    $ curl http://www.linuxidc.com > page.html

    当然可以,但不用这么麻烦的!

    用curl的内置option就好,存下http的结果,用这个option: -o

    $ curl -o page.html http://www.linuxidc.com

    这样,你就可以看到屏幕上出现一个下载页面进度指示。等进展到100%,自然就 OK咯

    3) 什么什么?!访问不到?肯定是你的proxy没有设定了。

    使用curl的时候,用这个option可以指定http访问所使用的proxy服务器及其端口: -x

    $ curl -x 123.45.67.89:1080 -o page.html http://www.linuxidc.com

    4) 访问有些网站的时候比较讨厌,他使用cookie来记录session信息。

    像IE/NN这样的浏览器,当然可以轻易处理cookie信息,但我们的curl呢?.....

    我们来学习这个option: -D <— 这个是把http的response里面的cookie信息存到一个特别的文件中去

    $ curl -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

    这样,当页面被存到page.html的同时,cookie信息也被存到了cookie0001.txt里面了

    5)那么,下一次访问的时候,如何继续使用上次留下的cookie信息呢?要知道,很多网站都是靠监视你的cookie信息,来判断你是不是不按规矩访问他们的网站的。

    这次我们使用这个option来把上次的cookie信息追加到http request里面去: -b

    $ curl -x 123.45.67.89:1080 -o page1.html -D cookie0002.txt -b cookie0001.txt http://www.linuxidc.com

    这样,我们就可以几乎模拟所有的IE操作,去访问网页了!

    6)稍微等等    ~我好像忘记什么了    ~

    对了!是浏览器信息

    有些讨厌的网站总要我们使用某些特定的浏览器去访问他们,有时候更过分的是,还要使用某些特定的版本     NND,哪里有时间为了它去找这些怪异的浏览器呢!?

    好在curl给我们提供了一个有用的option,可以让我们随意指定自己这次访问所宣称的自己的浏览器信息: -A

    $ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -o page.html -D cookie0001.txt http://www.linuxidc.com

    这样,服务器端接到访问的要求,会认为你是一个运行在Windows 2000上的 IE6.0,嘿嘿嘿,其实也许你用的是苹果机呢!

    而"Mozilla/4.73 [en] (X11; U; Linux 2.2; 15 i686"则可以告诉对方你是一台 PC上跑着的Linux,用的是Netscape 4.73,呵呵呵

    7)另外一个服务器端常用的限制方法,就是检查http访问的referer。比如你先访问首页,再访问里面所指定的下载页,这第二次访问的 referer地址就是第一次访问成功后的页面地址。这样,服务器端只要发现对下载页面某次访问的referer地址不是首页的地址,就可以断定那是个盗 连了    ~

    讨厌讨厌 ~我就是要盗连    ~!!

    幸好curl给我们提供了设定referer的option: -e

    $ curl -A "Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.0)" -x 123.45.67.89:1080 -e "mail.linuxidc.com" -o page.html -D cookie0001.txt http://www.linuxidc.com

    这样,就可以骗对方的服务器,你是从mail.linuxidc.com点击某个链接过来的了,呵呵呵

    8)写着写着发现漏掉什么重要的东西了!——- 利用curl 下载文件

    刚才讲过了,下载页面到一个文件里,可以使用 -o ,下载文件也是一样。比如,

    $ curl -o 1.jpg http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

    这里教大家一个新的option: -O 大写的O,这么用:

    $ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen1.JPG

    这样,就可以按照服务器上的文件名,自动存在本地了!

    再来一个更好用的。

    如果screen1.JPG以外还有screen2.JPG、screen3.JPG、....、screen10.JPG需要下载,难不成还要让我们写一个script来完成这些操作?

    不干!

    在curl里面,这么写就可以了:

    $ curl -O http://cgi2.tky.3web.ne.jp/~zzh/screen[1-10].JPG

    呵呵呵,厉害吧?! ~

    9)再来,我们继续讲解下载!

    $ curl -O http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

    这样产生的下载,就是

    ~zzh/001.JPG

    ~zzh/002.JPG

    ...

    ~zzh/201.JPG

    ~nick/001.JPG

    ~nick/002.JPG

    ...

    ~nick/201.JPG

    够方便的了吧?哈哈哈

    咦?高兴得太早了。

    由于zzh/nick下的文件名都是001,002...,201,下载下来的文件重名,后面的把前面的文件都给覆盖掉了 ~

    没关系,我们还有更狠的!

    $ curl -o #2_#1.jpg http://cgi2.tky.3web.ne.jp/~{zzh,nick}/[001-201].JPG

    —这是.....自定义文件名的下载? —对头,呵呵!

    这样,自定义出来下载下来的文件名,就变成了这样:原来: ~zzh/001.JPG —-> 下载后: 001-zzh.JPG 原来: ~nick/001.JPG —-> 下载后: 001-nick.JPG

    这样一来,就不怕文件重名啦,呵呵

    9)继续讲下载

    我们平时在windows平台上,flashget这样的工具可以帮我们分块并行下载,还可以断线续传。curl在这些方面也不输给谁,嘿嘿

    比如我们下载screen1.JPG中,突然掉线了,我们就可以这样开始续传

    $ curl -c -O http://cgi2.tky.3wb.ne.jp/~zzh/screen1.JPG


    当然,你不要拿个flashget下载了一半的文件来糊弄我    别的下载软件的半截文件可不一定能用哦 ~

    分块下载,我们使用这个option就可以了: -r

    举例说明

    比如我们有一个http://cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 要下载(赵老师的电话朗诵 :D )我们就可以用这样的命令:

    $ curl -r 0-10240 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\

    $ curl -r 10241-20480 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\

    $ curl -r 20481-40960 -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3 &\

    $ curl -r 40961- -o "zhao.part1" http:/cgi2.tky.3web.ne.jp/~zzh/zhao1.MP3

    这样就可以分块下载啦。不过你需要自己把这些破碎的文件合并起来如果你用UNIX或苹果,用 cat zhao.part* > zhao.MP3就可以如果用的是Windows,用copy /b 来解决吧,呵呵

    上面讲的都是http协议的下载,其实ftp也一样可以用。用法嘛,

    $ curl -u name:passwd ftp://ip:port/path/file

    或者大家熟悉的

    $ curl ftp://name:passwd@ip:port/path/file

    10) 说完了下载,接下来自然该讲上传咯上传的option是 -T

    比如我们向ftp传一个文件:

    $ curl -T localfile -u name:passwd ftp://upload_site:port/path/

    当然,向http服务器上传文件也可以比如

    $ curl -T localfile http://cgi2.tky.3web.ne.jp/~zzh/abc.cgi

    注意,这时候,使用的协议是HTTP的PUT method

    刚才说到PUT,嘿嘿,自然让老服想起来了其他几种methos还没讲呢! GET和POST都不能忘哦。

    http提交一个表单,比较常用的是POST模式和GET模式

    GET模式什么option都不用,只需要把变量写在url里面就可以了比如:

    $ curl http://www.linuxidc.com/login.cgi?user=nickwolfe&password=12345

    而POST模式的option则是 -d

    比如,

    $ curl -d "user=nickwolfe&password=12345" http://www.linuxidc.com/login.cgi

    就相当于向这个站点发出一次登陆申请    ~

    到底该用GET模式还是POST模式,要看对面服务器的程序设定。

    一点需要注意的是,POST模式下的文件上的文件上传,比如

    <form. method="POST" enctype="multipar/form-data" action="http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi">

    <input type=file name=upload>

    <input type=submit name=nick value="go">

    </form>

    这样一个HTTP表单,我们要用curl进行模拟,就该是这样的语法:

    $ curl -F upload=@localfile -F nick=go http://cgi2.tky.3web.ne.jp/~zzh/up_file.cgi

    罗罗嗦嗦讲了这么多,其实curl还有很多很多技巧和用法比如 https的时候使用本地证书,就可以这样

    $ curl -E localcert.pem https://remote_server

    再比如,你还可以用curl通过dict协议去查字典    ~

    $ curl dict://dict.org/d:computer


  • curl 命令详解

    2011-11-01 15:02:52

     转贴

    curl是一个利用URL规则在命令行下工作的文件传输工具。它支持文件的上传和下载,所以是综合传输工具,但按传统,习惯称url为下载工具。 

     一,curl命令参数,有好多我没有用过,也不知道翻译的对不对,如果有误的地方,还请指正。
      -a/--append 上传文件时,附加到目标文件
      -A/--user-agent <string>  设置用户代理发送给服务器
      - anyauth   可以使用“任何”身份验证方法
      -b/--cookie <name=string/file> cookie字符串或文件读取位置
      - basic 使用HTTP基本验证
      -B/--use-ascii 使用ASCII /文本传输
      -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
      -C/--continue-at <offset>  断点续转
      -d/--data <data>   HTTP POST方式传送数据
      --data-ascii <data>  以ascii的方式post数据
      --data-binary <data> 以二进制的方式post数据
      --negotiate     使用HTTP身份验证
      --digest        使用数字身份验证
      --disable-eprt  禁止使用EPRT或LPRT
      --disable-epsv  禁止使用EPSV
      -D/--dump-header <file> 把header信息写入到该文件中
      --egd-file <file> 为随机数据(SSL)设置EGD socket路径
      --tcp-nodelay   使用TCP_NODELAY选项
      -e/--referer 来源网址
      -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
      --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
      --key <key>     私钥文件名 (SSL)
      --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
      --pass  <pass>  私钥密码 (SSL)
      --engine <eng>  加密引擎使用 (SSL). "--engine list" for list
      --cacert <file> CA证书 (SSL)
      --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
      --ciphers <list>  SSL密码
      --compressed    要求返回是压缩的形势 (using deflate or gzip)
      --connect-timeout <seconds> 设置最大请求时间
      --create-dirs   建立本地目录的目录层次结构
      --crlf          上传是把LF转变成CRLF
      -f/--fail          连接失败时不显示http错误
      --ftp-create-dirs 如果远程目录不存在,创建远程目录
      --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
      --ftp-pasv      使用 PASV/EPSV 代替端口
      --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
      --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输
      --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输
      -F/--form. <name=content> 模拟http表单提交数据
      -form-string <name=string> 模拟http表单提交数据
      -g/--globoff 禁用网址序列和范围使用{}和[]
      -G/--get 以get的方式来发送数据
      -h/--help 帮助
      -H/--header <line>自定义头信息传递给服务器
      --ignore-content-length  忽略的HTTP头信息的长度
      -i/--include 输出时包括protocol头信息
      -I/--head  只显示文档信息
      从文件中读取-j/--junk-session-cookies忽略会话Cookie
      - 界面<interface>指定网络接口/地址使用
      - krb4 <级别>启用与指定的安全级别krb4
      -j/--junk-session-cookies 读取文件进忽略session cookie
      --interface <interface> 使用指定网络接口/地址
      --krb4 <level>  使用指定安全级别的krb4
      -k/--insecure 允许不使用证书到SSL站点
      -K/--config  指定的配置文件读取
      -l/--list-only 列出ftp目录下的文件名称
      --limit-rate <rate> 设置传输速度
      --local-port<NUM> 强制使用本地端口号
      -m/--max-time <seconds> 设置最大传输时间
      --max-redirs <num> 设置最大读取的目录数
      --max-filesize <bytes> 设置最大下载的文件总量
      -M/--manual  显示全手动
      -n/--netrc 从netrc文件中读取用户名和密码
      --netrc-optional 使用 .netrc 或者 URL来覆盖-n
      --ntlm          使用 HTTP NTLM 身份验证
      -N/--no-buffer 禁用缓冲输出
      -o/--output 把输出写到该文件中
      -O/--remote-name 把输出写到该文件中,保留远程文件的文件名
      -p/--proxytunnel   使用HTTP代理
      --proxy-anyauth 选择任一代理身份验证方法
      --proxy-basic   在代理上使用基本身份验证
      --proxy-digest  在代理上使用数字身份验证
      --proxy-ntlm    在代理上使用ntlm身份验证
      -P/--ftp-port <address> 使用端口地址,而不是使用PASV
      -Q/--quote <cmd>文件传输前,发送命令到服务器
      -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围
      --range-file 读取(SSL)的随机文件
      -R/--remote-time   在本地生成文件时,保留远程文件时间
      --retry <num>   传输出现问题时,重试的次数
      --retry-delay <seconds>  传输出现问题时,设置重试间隔时间
      --retry-max-time <seconds> 传输出现问题时,设置最大重试时间
      -s/--silent静音模式。不输出任何东西
      -S/--show-error   显示错误
      --socks4 <host[:port]> 用socks4代理给定主机和端口
      --socks5 <host[:port]> 用socks5代理给定主机和端口
      --stderr <file>
    -t/--telnet-option <OPT=val> Telnet选项设置
      --trace <file>  对指定文件进行debug
      --trace-ascii <file> Like --跟踪但没有hex输出
      --trace-time    跟踪/详细输出时,添加时间戳
      -T/--upload-file <file> 上传文件
      --url <URL>     Spet URL to work with
      -u/--user <user[:password]>设置服务器的用户和密码
      -U/--proxy-user <user[:password]>设置代理用户名和密码
      -v/--verbose
      -V/--version 显示版本信息
      -w/--write-out [format]什么输出完成后
      -x/--proxy <host[:port]>在给定的端口上使用HTTP代理
      -X/--request <command>指定什么命令
      -y/--speed-time 放弃限速所要的时间。默认为30
      -Y/--speed-limit 停止传输速度的限制,速度时间'秒
      -z/--time-cond  传送时间设置
      -0/--http1.0  使用HTTP 1.0
      -1/--tlsv1  使用TLSv1(SSL)
      -2/--sslv2 使用SSLv2的(SSL)
      -3/--sslv3         使用的SSLv3(SSL)
      --3p-quote      like -Q for the source URL for 3rd party transfer
      --3p-url        使用url,进行第三方传送
      --3p-user       使用用户名和密码,进行第三方传送
      -4/--ipv4   使用IP4
      -6/--ipv6   使用IP6
      -#/--progress-bar 用进度条显示当前的传送状态
      -a/--append 上传文件时,附加到目标文件
      -A/--user-agent <string>  设置用户代理发送给服务器
      - anyauth   可以使用“任何”身份验证方法
      -b/--cookie <name=string/file> cookie字符串或文件读取位置
      - basic 使用HTTP基本验证
      -B/--use-ascii 使用ASCII /文本传输
      -c/--cookie-jar <file> 操作结束后把cookie写入到这个文件中
      -C/--continue-at <offset>  断点续转
      -d/--data <data>   HTTP POST方式传送数据
      --data-ascii <data>  以ascii的方式post数据
      --data-binary <data> 以二进制的方式post数据
      --negotiate     使用HTTP身份验证
      --digest        使用数字身份验证
      --disable-eprt  禁止使用EPRT或LPRT
      --disable-epsv  禁止使用EPSV
      -D/--dump-header <file> 把header信息写入到该文件中
      --egd-file <file> 为随机数据(SSL)设置EGD socket路径
      --tcp-nodelay   使用TCP_NODELAY选项
      -e/--referer 来源网址
      -E/--cert <cert[:passwd]> 客户端证书文件和密码 (SSL)
      --cert-type <type> 证书文件类型 (DER/PEM/ENG) (SSL)
      --key <key>     私钥文件名 (SSL)
      --key-type <type> 私钥文件类型 (DER/PEM/ENG) (SSL)
      --pass  <pass>  私钥密码 (SSL)
      --engine <eng>  加密引擎使用 (SSL). "--engine list" for list
      --cacert <file> CA证书 (SSL)
      --capath <directory> CA目录 (made using c_rehash) to verify peer against (SSL)
      --ciphers <list>  SSL密码
      --compressed    要求返回是压缩的形势 (using deflate or gzip)
      --connect-timeout <seconds> 设置最大请求时间
      --create-dirs   建立本地目录的目录层次结构
      --crlf          上传是把LF转变成CRLF
      -f/--fail          连接失败时不显示http错误
      --ftp-create-dirs 如果远程目录不存在,创建远程目录
      --ftp-method [multicwd/nocwd/singlecwd] 控制CWD的使用
      --ftp-pasv      使用 PASV/EPSV 代替端口
      --ftp-skip-pasv-ip 使用PASV的时候,忽略该IP地址
      --ftp-ssl       尝试用 SSL/TLS 来进行ftp数据传输
      --ftp-ssl-reqd  要求用 SSL/TLS 来进行ftp数据传输
      -F/--form. <name=content> 模拟http表单提交数据
      -form-string <name=string> 模拟http表单提交数据
      -g/--globoff 禁用网址序列和范围使用{}和[]
      -G/--get 以get的方式来发送数据
      -h/--help 帮助
      -H/--header <line>自定义头信息传递给服务器
      --ignore-content-length  忽略的HTTP头信息的长度
      -i/--include 输出时包括protocol头信息
      -I/--head  只显示文档信息
      从文件中读取-j/--junk-session-cookies忽略会话Cookie
      - 界面<interface>指定网络接口/地址使用
      - krb4 <级别>启用与指定的安全级别krb4
      -j/--junk-session-cookies 读取文件进忽略session cookie
      --interface <interface> 使用指定网络接口/地址
      --krb4 <level>  使用指定安全级别的krb4
      -k/--insecure 允许不使用证书到SSL站点
      -K/--config  指定的配置文件读取
      -l/--list-only 列出ftp目录下的文件名称
      --limit-rate <rate> 设置传输速度
      --local-port<NUM> 强制使用本地端口号
      -m/--max-time <seconds> 设置最大传输时间
      --max-redirs <num> 设置最大读取的目录数
      --max-filesize <bytes> 设置最大下载的文件总量


    -M/--manual  显示全手动

      -n/--netrc 从netrc文件中读取用户名和密码

      --netrc-optional 使用 .netrc 或者 URL来覆盖-n

      --ntlm          使用 HTTP NTLM 身份验证

      -N/--no-buffer 禁用缓冲输出

      -o/--output 把输出写到该文件中

      -O/--remote-name 把输出写到该文件中,保留远程文件的文件名

      -p/--proxytunnel   使用HTTP代理

      --proxy-anyauth 选择任一代理身份验证方法

      --proxy-basic   在代理上使用基本身份验证

      --proxy-digest  在代理上使用数字身份验证

      --proxy-ntlm    在代理上使用ntlm身份验证

      -P/--ftp-port <address> 使用端口地址,而不是使用PASV

      -Q/--quote <cmd>文件传输前,发送命令到服务器

      -r/--range <range>检索来自HTTP/1.1或FTP服务器字节范围

      --range-file 读取(SSL)的随机文件

      -R/--remote-time   在本地生成文件时,保留远程文件时间

      --retry <num>   传输出现问题时,重试的次数

      --retry-delay <seconds>  传输出现问题时,设置重试间隔时间

      --retry-max-time <seconds> 传输出现问题时,设置最大重试时间

      -s/--silent静音模式。不输出任何东西

      -S/--show-error   显示错误

      --socks4 <host[:port]> 用socks4代理给定主机和端口

      --socks5 <host[:port]> 用socks5代理给定主机和端口

      --stderr <file>

      -t/--telnet-option <OPT=val> Telnet选项设置

      --trace <file>  对指定文件进行debug

      --trace-ascii <file> Like --跟踪但没有hex输出

      --trace-time    跟踪/详细输出时,添加时间戳

      -T/--upload-file <file> 上传文件

      --url <URL>     Spet URL to work with

      -u/--user <user[:password]>设置服务器的用户和密码

      -U/--proxy-user <user[:password]>设置代理用户名和密码

      -v/--verbose

      -V/--version 显示版本信息

      -w/--write-out [format]什么输出完成后

      -x/--proxy <host[:port]>在给定的端口上使用HTTP代理

      -X/--request <command>指定什么命令

      -y/--speed-time 放弃限速所要的时间。默认为30

      -Y/--speed-limit 停止传输速度的限制,速度时间'秒

      -z/--time-cond  传送时间设置

      -0/--http1.0  使用HTTP 1.0

      -1/--tlsv1  使用TLSv1(SSL)

      -2/--sslv2 使用SSLv2的(SSL)

      -3/--sslv3         使用的SSLv3(SSL)

      --3p-quote      like -Q for the source URL for 3rd party transfer

      --3p-url        使用url,进行第三方传送

      --3p-user       使用用户名和密码,进行第三方传送

      -4/--ipv4   使用IP4

      -6/--ipv6   使用IP6

      -#/--progress-bar 用进度条显示当前的传送状态

      二,常用curl实例

      1,抓取页面内容到一个文件中

      [root@krlcgcms01 mytest]# curl -o home.html  http://blog.51yip.com

      [root@krlcgcms01 mytest]# curl -o home.html  http://blog.51yip.com

      2,用-O(大写的),后面的url要具体到某个文件,不然抓不下来。我们还可以用正则来抓取东西

      [root@krlcgcms01 mytest]# curl -O 
      [root@krlcgcms01 mytest]# curl -O 
      3,模拟表单信息,模拟登录,保存cookie信息

      [root@krlcgcms01 mytest]# curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

      [root@krlcgcms01 mytest]# curl -c ./cookie_c.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

      4,模拟表单信息,模拟登录,保存头信息

      [root@krlcgcms01 mytest]# curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

      [root@krlcgcms01 mytest]# curl -D ./cookie_D.txt -F log=aaaa -F pwd=****** http://blog.51yip.com/wp-login.php

      -c(小写)产生的cookie和-D里面的cookie是不一样的。

      5,使用cookie文件

      [root@krlcgcms01 mytest]# curl -b ./cookie_c.txt  http://blog.51yip.com/wp-admin

      [root@krlcgcms01 mytest]# curl -b ./cookie_c.txt  http://blog.51yip.com/wp-admin

      6,断点续传,-C(大写的)

      [root@krlcgcms01 mytest]# curl -C -O 
      7,传送数据,最好用登录页面测试,因为你传值过去后,curl回抓数据,你可以看到你传值有没有成功

      [root@krlcgcms01 mytest]# curl -d log=aaaa  http://blog.51yip.com/wp-login.php

      [root@krlcgcms01 mytest]# curl -d log=aaaa  http://blog.51yip.com/wp-login.php

      8,显示抓取错误,下面这个例子,很清楚的表明了。

      [root@krlcgcms01 mytest]# curl -f http://blog.51yip.com/asdf

      curl: (22) The requested URL returned error: 404

      [root@krlcgcms01 mytest]# curl http://blog.51yip.com/asdf

      <HTML><HEAD><TITLE>404,not found</TITLE>

      。。。。。。。。。。。。

      [root@krlcgcms01 mytest]# curl -f http://blog.51yip.com/asdf

      curl: (22) The requested URL returned error: 404

      [root@krlcgcms01 mytest]# curl http://blog.51yip.com/asdf

      <HTML><HEAD><TITLE>404,not found</TITLE>

      。。。。。。。。。。。。

      9,伪造来源地址,有的网站会判断,请求来源地址。

      [root@krlcgcms01 mytest]# curl -e http://localhost http://blog.51yip.com/wp-login.php

      [root@krlcgcms01 mytest]# curl -e http://localhost http://blog.51yip.com/wp-login.php

      10,当我们经常用curl去搞人家东西的时候,人家会把你的IP给屏蔽掉的,这个时候,我们可以用代理

      [root@krlcgcms01 mytest]# curl -x 24.10.28.84:32779 -o home.html http://blog.51yip.com

      [root@krlcgcms01 mytest]# curl -x 24.10.28.84:32779 -o home.html http://blog.51yip.com
    11,比较大的东西,我们可以分段下载
      [root@krlcgcms01 mytest]# curl -r 0-100 -o img.part1 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100   101  100   101    0     0    105      0 --:--:-- --:--:-- --:--:--     0
      [root@krlcgcms01 mytest]# curl -r 100-200 -o img.part2 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100   101  100   101    0     0     57      0  0:00:01  0:00:01 --:--:--     0
      [root@krlcgcms01 mytest]# curl -r 200- -o img.part3 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100  104k  100  104k    0     0  52793      0  0:00:02  0:00:02 --:--:-- 88961
      [root@krlcgcms01 mytest]# ls |grep part | xargs du -sh
      4.0K    one.part1
      112K    three.part3
      4.0K    two.part2
      [root@krlcgcms01 mytest]# curl -r 0-100 -o img.part1 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100   101  100   101    0     0    105      0 --:--:-- --:--:-- --:--:--     0
      [root@krlcgcms01 mytest]# curl -r 100-200 -o img.part2 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100   101  100   101    0     0     57      0  0:00:01  0:00:01 --:--:--     0
      [root@krlcgcms01 mytest]# curl -r 200- -o img.part3 http://blog.51yip.com/wp-
      content/uploads/2010/09/compare_varnish.jpg
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      100  104k  100  104k    0     0  52793      0  0:00:02  0:00:02 --:--:-- 88961
      [root@krlcgcms01 mytest]# ls |grep part | xargs du -sh
      4.0K    one.part1
      112K    three.part3
      4.0K    two.part2
      用的时候,把他们cat一下就OK了,cat img.part* >img.jpg
      12,不会显示下载进度信息
      [root@krlcgcms01 mytest]# curl -s -o aaa.jpg  
      13,显示下载进度条
      [root@krlcgcms01 mytest]# curl -# -O  
      ######################################################################## 100.0%
      14,通过ftp下载文件
      [zhangy@BlackGhost ~]$ curl -u 用户名:密码 -O http://blog.51yip.com/demo/curtain/bbstudy_files/style.css
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      101  1934  101  1934    0     0   3184      0 --:--:-- --:--:-- --:--:--  7136
      [zhangy@BlackGhost ~]$ curl -u 用户名:密码 -O http://blog.51yip.com/demo/curtain/bbstudy_files/style.css
      % Total    % Received % Xferd  Average Speed   Time    Time     Time  Current
      Dload  Upload   Total   Spent    Left  Speed
      101  1934  101  1934    0     0   3184      0 --:--:-- --:--:-- --:--:--  7136
      或者用下面的方式
      [zhangy@BlackGhost ~]$ curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css
      [zhangy@BlackGhost ~]$ curl -O ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/style.css
      15,通过ftp上传
      [zhangy@BlackGhost ~]$ curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/
      [zhangy@BlackGhost ~]$ curl -T test.sql ftp://用户名:密码@ip:port/demo/curtain/bbstudy_files/
  • curl

    2011-11-01 14:59:54

    curl并不是双击即可运行,你需要在命令提示符下使用它

    如何进入命令提示符

    点击“开始”——“运行”——输入CMD
    
    或,WIN+R,输入CMD
    
    下载我下载版本的CURL后,解压后文件夹放在如:D:\curl的文件夹里(curl路径)
    
    命令提示符窗口中输入"d:"回车,然后输入“cd curl”即可跳转到curl文件夹,
    
    至此可以输入curl命令了(根据你的curl类推)或你也可以将curl加入到系统环境变量

    如何将curl所在文件夹加入系统变量

    右键单击“我的电脑”——“属性”——“高级”——“环境变量”——
    
    “系统变量”——“Path”——“编辑”——加入“;D:\curl”(注意分号,
    
    D:\curl换成你的curl路径)——“确定”
    加入到系统环境变量后可在命令提示符内直接运行如
    
    “curl -O http://curl.haxx.se/download/curl-7.19.5-win32-ssl-sspi.zip”
    
    这样的命令,无需进入curl所在文件夹
  • bugzilla+windows安装手册

    2011-10-13 22:18:50

     

    转自:http://blog.csdn.net/will2ni/article/details/5169366

    for windows的安装,请先查看:

    https://wiki.mozilla.org/Bugzilla:Win32InstallPackages

     


    Bugzilla安装手册

     

    for windows

     

     

     

    will

    2010-1-9

     

     

    目录

    1.      概述 ..............................................  4

    1.1    安装环境 ........................................  4

    2.      安装........................................... ...  4

    2.1    安装前准备 .....................................  4

    2.2     安装 Perl.......................................  5

    2.3    安装XAMPP................................... .  5

    2.4    Bugzilla.........................................  5

    2.5    安装Perl 模块 ..................................  6

    2.5.1      自动安装( *推荐 * ..................  6

    2.5.2      网络安装 ....................................  6

    2.5.3      手动安装 ....................................  6

    3.      配置 ...............................................  7

    3.1    localconfig.....................................  7

    3.2    MySQL...........................................  8

    3.3    checksetup.pl................................  8

    3.4    Appache .......................................  8

    3.5    修改注册表 ......................................  8

    3.6    汉化 ................................................  8

    3.7     解决报告和图表的中文乱码问题 ...........  8

    4.      附录 ................................................  9

    4.1    Perl模块列表 ....................................  9

    1 概述

     

       Bugzilla 在项目中已经使用了一段时间,相对其他商业缺陷跟踪系统,Bugzilla 还是有很多优势的。

       或许因为我是开源爱好者,特别钟爱这些开源的测试工具,想在其他项目中推广。但是Bugzilla 的安装和配置,经常令很多人郁闷,尤其是在Windows 下的安装。

       为此在Windows 上进行了多次试验,并简化了安装过程,这篇文章就是为了让更多的人轻松按装和使用Bugzillahope this helps

    1.1 安装环境

     

    版本

    Windows 2003 Server

    ActivePerl-5.10.0.1002-MSWin32-x86-283697.msi

    5.10.0 .1002

    XAMPP

    1.7.1

    2 安装

    2.1 安装前准备

    1.  下载ActivePerl-5.10.0

    本文中使用5.10.0 版本测试通过,因此推荐使用5.10.0 版本,已上传到CSDN ,地址如下:

    http://download.csdn.net/source/1978649

    如果想使用其他版本,可在此处下载:

    https://www.activestate.com/activeperl/downloads/


    2.  下载XAMPP-1.7.1

    本文中使用1.7.1 版本测试通过,因此推荐使用1.7.1 版本。

    http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/1.7.1/xampp-win32-1.7.1-installer.exe/download

    如果想使用其他版本,可在此处下载:

    http://sourceforge.net/projects/xampp/files/XAMPP%20Windows/


    3.  下载Perl 模块(* 推荐*

    若选择网络安装Perl 模块,可跳过此步。

    这些模块是根据bugzilla-3.4.4和perl-5.10.0,整理成的压缩包,并且包含自动安装脚本"install_ppms.pl”。推荐下载这些模块,然后使用“install_ppms.pl”自动 安装,下载地址如下:

    http://download.csdn.net/source/1981169


    4.  下载bugzilla

    本文中使用bugzilla-3.4.4 ,下载地址如下:

    http://ftp.mozilla.org/pub/mozilla.org/webtools/bugzilla-3.4.4.tar.gz


    5.  下载汉化包

    http://download.csdn.net/source/1981400

    2.2 安装perl

     

    1. 执行activeperl.exe

    2. 选择安装目录

    3. 完成

     

    安装完成后,可使用perl –v   查看版本。

    2.3 安装XAMPP

    1. 执行xampp-win32-1.7.1-installer.exe

    2. 选择安装目录

    3. 安装完成时,保持默认选项即可

     

    安装完成后,打开“XAMPP Control Panel ”,启动ApacheMySQL ,访问:http://127.0.0.1/ ,检查是否正常。

    2.4 Bugzilla

    1. 解压bugzilla-3.4.4.tar.gz

    2. 拷贝bugzilla-3.4.4xampp/htdocs/ 目录下(可跳过)

    2.5 安装perl模块

    bugzilla 目录下,执行checksetup.pl –check-modules ,检查有哪些模块还未安装。安装前准备的perl 模块中以经包含了几乎所有所需要的模块。

    2.5.1 自动安装(*推荐*

    为了方便安装,已经将bugzilla-3.4.4 所需的模块整理成压缩包,下载地址见安装前准备部分。

    压缩包内包含了近50 个模块,详细列表见附录。

     

    安装步骤如下:

    1.  解压PPM_bugzilla3.4.4_required.zip 至某个目录(路径中不要包含中文字符、空格)。

    2.  执行“install_ppms.pl

    3.  检查是否有错误信息

    2.5.2 网络安装

    如果你的服务器可以直接连接上网络,也可以使用ppm install<module_name> 通过网络安装。

     

    使用默认的库,有时会找不到指定的模块,执行如下命令添加ppm 库后,再尝试安装:

    ppm repo add  http://ppm4.activestate.com/MSWin32-x86/5.10/1000/package.xml


    或者使用这种方式安装(package 替换成模块名):

    ppm install http://cpan.uwinnipeg.ca/PPMPackages/10xx/package .ppd

    但是在通过代理上网的环境中,有时会不能正常安装。此类问题,可以搜索ppm install proxy 等关键字来解决。若不能解决代理问题,可先将源文件或已编译好的文件下载至本地后,再通过手动安装,见3.4.3

    2.5.3 手动安装

    已编译的二进制包

    1.  下载http://ppm4.activestate.com/MSWin32-x86/5.10/1000/package.xml

    2.  打开该package.xml ,搜索模块名称。

    如:Template-Toolkit


    3.  根据标签<CODEBASE HREF=”path/of/module/module-version.tar.gz ”/> 确定下载地址:

    http://ppm4.activestate.com/MSWin32-x86/5.10/1000/path/of_module/module-version.tar.gz

    如:<CODEBASE HREF="A/AB/ABW/Template-Toolkit-2.22.tar.gz "/> ,从而确定下载地址:http://ppm4.activestate.com/MSWin32-x86/5.10/1000/A/AB/ABW/Template-Toolkit-2.22.tar.gz


    4.  下载该文件后,使用7-zip 解压。解压后会有2 个文件:blibmodule-versioon .ppd

    如:Template-Toolkit-2.22.tar.gz 解压后会有blib Template-Toolkit-2.22.ppd

     

    5. blib 文件夹压缩成module-version .tar.gz 格式。

    如:Template-Toolkit-2.22.tar.gz


    6.  执行ppm install  module-version. ppd 安装该模块。

    如:ppm install Template-Toolkit-2.22.ppd

    之所以按照上述方法下载和安装,是因为 Activestate 上的模块比较全,基本上所需要的都可以找到。

    当然也可以在其他地址下载 zip 包,解压后直接就可以安装。

    http://cpan.uwinnipeg.ca/PPMPackages/10xx/zips/

    源码安装

    1.  安装7-zip ,以解压.tar.gz 文件。

    2.  下载编译器http://download.csdn.net/source/1981273

    3. 在http://search.cpan.org 上搜索并下载模块

    4. 解压module .tar.gz

    5. perl Makefile.pl

    6. nmake

    7. nmake test

    8. nmake install

    3 配置

    3.1 localconfig

    再次执行checksetup.pl ,不需要加参数。

     

    checksetup.pl 会列出你已经正确安装的Perl 模块及版本信息。还会生成一个localconfig 文件。这里面包含bugzilla 一些参数的默认设置。

    用文本编辑器打开localconfig ,需要修改$db_driver$db_pass 两个值。更改$db_driver 为正确的数据库,如:mysqlPgoracle (本例中使用mysql )。修改$db_pass ,为访问数据库创建一个密码。

    3.2 MySQL

    1. 添加用户

    需要为bugzilla 创建一个新的MySQL 用户(让bugzilla 使用root 用户是很不安全的)。

     

    下面的例子基于localconfig 的默认设置。如果你更改过,需要在下面的SQL 中做同样的修改。“$db_pass ”要替换为localconfig 中的值(本例中$db_pass=bugs )。

    进入cmd命令窗口,并转到 XAMPP套件的mysql目录下,比如:X:\xampp\mysql\bin

    mysql>create database bugs;

    mysql> GRANT SELECT, INSERT, UPDATE, DELETE, INDEX, ALTER, CREATE, LOCK TABLES, CREATE TEMPORARY TABLES, DROP, REFERENCES ON bugs.* TO bugs@"localhost" IDENTIFIED by "bugs";

    mysql> FLUSH PRIVILEGES;

    3.3 checksetup.pl

    接下来,重新运行checksetup.pl 。它会编译UI 模板,连接到数据库并创建数据库及表。

    完成后,会请求你输入管理员帐号的信息。Bugzilla 可以有多个管理员帐号(你可以在稍后进行创建),但是你需要有一个来开始。输入管理员的Email 地址,他或她的全称,以及密码。

    Checksetup.pl 就执行完成了,你可以在任何时候重新执行它。

    3.4 Appache

    打开xampp/apache/conf/httpd.conf,在末尾添加如下内容:

    Alias /bugzilla "x:/path/of/bugzilla "
    <Directory "x:/path/of/bugzilla ">
        Options ExecCGI All
        AllowOverride All
        ScriptInterpreterSource Registry-Strict
        Order allow,deny
        Allow from all
    </Directory>

    3.5 修改注册表

    打开注册表编辑器,在HKEY_CLASSES_ROOT下新建.cgi项,在.cgi下新建Shell项,在Shell下新建ExecCGI项,在ExecCGI下新建Command项。

    修改Command的默认值为:X:/Perl/bin/perl.exe -T

    如图:

    修改注册表

     

    F5刷新后,重启Apache。

    3.6 汉化

    1. 解压bugzilla_chinese_template.zip

    2. 复制defaultextensionxampp/htdocs/bugzilla/template/en 目录下,替换原文件夹

    3. 重新访问,测试是否为中文页面

    3.7 解决报告和图表中文乱码问题

    打开perl/site/lib/GD/Graph/axestype.pm ,找到子函数sub initialize {}

    找到以下内容:

      $self->set_x_label_font(GD::gdSmallFont);

       $self->set_y_label_font(GD::gdSmallFont);

       $self->set_x_axis_font(GD::gdTinyFont);

       $self->set_y_axis_font(GD::gdTinyFont);

       $self->set_legend_font(GD::gdTinyFont);

       $self->set_values_font(GD::gdTinyFont);

    修改为:

      $self->set_x_label_font('C:/WINDOWS/Fonts/SURSONG.TTF');

      $self->set_y_label_font('C:/WINDOWS/Fonts/SURSONG.TTF');

       $self->set_x_axis_font('C:/WINDOWS/Fonts/SURSONG.TTF');

       $self->set_y_axis_font('C:/WINDOWS/Fonts/SURSONG.TTF');

       $self->set_legend_font('C:/WINDOWS/Fonts/SURSONG.TTF');

       $self->set_values_font('C:/WINDOWS/Fonts/SURSONG.TTF');

    4 附录

    4.1 模块列表

    PPM_bugzilla3.4.4_required.zip 中包含了近50 个模块,列表如下:

    1: 1_CGI.pm
    2: 2_TimeDate
    3: 3_Params-Validate
    4: 4_Class-Singleton
    5: 5_DateTime-TimeZone
    6: 6_DateTime-Locale
    7: 7_DateTime
    8: 8_AppConfig
    9: 9_Template-Toolkit
    10: 10_Email-Address
    11: 11_Email-Simple
    12: 12_Return-Value
    13: 13_Email-Send
    14: 14_Email-MIME-Encodings
    15: 15_MIME-Types
    16: 16_Email-MIME-ContentType
    17: 17_Email-MIME
    18: 18_Email-MessageID
    19: 19_Email-MIME-Modifier
    20: 20_DBD-mysql
    21: 21_GD
    22: 22_Chart
    23: 23_Template-GD
    24: 24_GDTextUtil
    25: 25_GDGraph
    26: 26_XML-Twig
    27: 27_IO-stringy
    28: 28_MailTools
    29: 29_MIME-tools
    30: 30_Authen-SASL
    31: 31_Email-Date-Format
    32: 32_MIME-Lite
    34: 34_Email-Abstract
    35: 35_Email-Simple-Creator
    36: 36_Email-MIME-Creator
    37: 37_Email-Reply
    38: 38_Email-MIME-Encodings
    39: 39_Email-MIME-Attachment-Stripper
    40: 40_PatchReader
    41: 41_Convert-ASN1-0.22
    42: 42_perl-ldap
    43: 43_Data-HexDump
    44: 44_RadiusPerl
    45: 45_FCGI
    46: 46_constant
    47: 47_Crypt-SSLeay
    48: 48_Task-Weaken
    49: 49_SOAP-Lite
    50: 50_HTML-Scrubber

  • cygwin 类linux开发环境的配置

    2011-09-14 16:29:36

    花了半天配置好了cygwin的界面, 下面做一纪录,以备下次查阅

    1. 关于term的问题, 如果嫌安装的term不够pp,可以使用putty,那就需要安装openssh包,以便可以使用putty, openssh的安装过程参阅http://pigtail.net/LRP/printsrv/cygwin-sshd.html 里面介绍的很详细。下面挑几个关键点记录如下:

    (2b) g Download cygwin's setup.exe from http://www.cygwin.com/ and save setup.exe in c:/cygwin
    Click Start...Run...and type c:/cygwin/setup.exe

    If you are asked about "Just Me" or "All Users", choose "All Users"

    When it asks for "Local Package Directory", type c:/cygwin
    When a selection screen comes up, (you can resize the windows to see better)
    click the little View button for "Full" view  g,
    find the package "openssh", click on the word "skip" so that an x appears in Column B,
    see this illustration.

    Click next to start installing cygwin and ssh.
    Size of the basic cygwin system is about 40 Meg, this may take a while.

    Take a coffee break. g

    (3) Right click My Computer, Properties, Advanced, Environment Variables
    See this illustration (red dots)
    Click the "New" new button to add a new entry to system variables:
    variable name is CYGWIN
    variable value is ntsec

    (4) Right click My Computer, Properties, Advanced, Environment Variables
    See this illustration (green dots)
    Select the Path variable and click the "Edit" edit button:
    append  ;c:/cygwin/bin  to the end of the existing variable string.

    (5) Open a cygwin window (by double clicking theg icon), a black screen pops open, type
    ssh-host-config      (on slower computers, it may take several minutes to generate the dsa keys)
    When the script. asks you about "privilege separation", answer yes
    When the script. asks about "create local user sshd", answer yes
    When the script. asks you about "install sshd as a service", answer yes
    When the script. asks you for "CYGWIN="     your answer is ntsec

    See Note 5 below if you need to run ssh-host-config again.

    (6) While you are still in the (black) cygwin screen, start the sshd service
    net start sshd
    or
    cygrunsrv  --start  sshd

    Note: if you need to stop the sshd service, pop open a g cygwin window
    net stop sshd   or   cygrunsrv  --stop  sshd

    (7) Make sure every Windows user has a password set, if not, 
    go to g Control Panel....User Accounts and create a password.

    (8) important Pop a cygwin gwindow, harmonize Windows user information with cygwin, otherwise they cannot login
    mkpasswd   --local   >   /etc/passwd
    mkgroup   --local    >   /etc/group


    Test to see if sshd is working, pop a cygwin gwindow (note: the command below is case sensitive)
    whoami
    ssh    localhost

    or
    ssh    "$USERNAME@127.0.0.1"

    If you get a prompt without error messages, type
    ls  -lh  /cygdrive/c
    if you see a directory listing, success! g g g
    (type exit to end the cygwin ssh session) 

    If you have a Windows username that contain space, expand the space into / [space],
    e.g. if the Windows login name is  mickey mouse
    ssh  mickey/  mouse@127.0.0.1

    2. Putty现在可以连接到本机上了,界面的字体pp多了吧:)  接下来是几个个性化的设置。

    首先是 shell的设置

    修改 $HOME/.bashrc文件,找到修改或者添加如下部分:

    # Use the command line history just as in linux
     set -o vi

    # Interactive operation...
     alias rm='rm -i'
     alias cp='cp -i'
     alias mv='mv -i'
     alias more='less'

    # Misc :)
     alias less='less -r'                          # raw control characters
    # alias whence='type -a'                        # where, of a sort
     alias grep='grep --color'                     # show differences in colour

    # Some shortcuts for different directory listings
     alias ls='ls -hF --color=tty'                 # classify files in colour
    # alias dir='ls --color=auto --format=vertical'
    # alias vdir='ls --color=auto --format=long'
     alias ll='ls -l'                              # long list
    # alias la='ls -A'                              # all but . and ..
    # alias l='ls -CF'                              #

    这样你的shell就可以显示pp的目录颜色了。

    3. 接下来是vim的设置

    在$HOME/目录下建立.vimrc文件,内容如下:


    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Download:  http://napali.ch/stotz/config/vim.tgz
    " File:   $HOME/.vimrc
    " Version:  1.0.4
    " Date:         2004-07-11
    " Author:  Urs Stotz <stotz@gmx.ch>
    " Comment:  Please send me suggestion for improvement
    "               Tested on: Debian and Sun Solaris.
    "               For vim and gvim you will need only .vimrc
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " Changelog
    " 1.0.4         tests templates for perl and perlmodules
    " 1.0.3         new perl dictionary
    " 1.0.2         smale changes
    " 1.0.1         fix ttyscroll it was slowly
    " 1.0.0         Init Version
    """"""""""""""""""""""""""""""""""""""""""""""""""""""""""""
    " vim settings "
    """"""""""""""""
    " version 6.0
    " set autoindent   
    " the same as |:set backspace=indent,eol,start|
    set backspace=2   
    " keyword completion with dictionary the command is: |i_CTRL-X_CTRL-K|

    " xterm backspace settings
    if &term == "xterm"
      set t_kb=^?
      fixdel
    endif

    if &term == "xterm"
      set t_kD=^[[3~
    endif

    set dict=~/.vim/dict/perl,~/.vim/dict/programming,~/.vim/dict/american  
    set formatoptions=tcqr
    " by a compressed helpfile
    " set helpfile=$VIMRUNTIME/doc/help.txt.gz
    set incsearch
    " always show status line
    set laststatus=2
    " use extended regular expressions
    set magic
    set nobackup
    " use Vim features
    set nocompatible
    " quiet and peaceful (your colleges thanks you)
    set noerrorbells
    " exrc is a potential security leak
    set noexrc
    " I don't like hlsearch
    set nohlsearch
    set nonumber
    set wrap
    " show the cursor position all the time
    set ruler
    " Show (partial) command in status line.
    set showcmd
    set showmode
    set smartindent
    " create new window below current one
    set splitbelow
    set suffixes=.bak,~,.swp,.o,.info,.aux,.dvi,.bbl,.blg,.brf,.cb,.ind,.idx,.ilg,.inx,.out,.toc
    " Don't wrap words by default
    set textwidth=0
    " For terminals where scrolling is very slow and redrawing is not slow.
    " set ttyscroll=3
    set viminfo=/"200,%,'200,/100,:100,@100,f1,h,n~/.vim/viminfo
    " wildmenu : command-line completion operates in an enhanced mode
    set wildmenu

    """""""""""
    " tabstop "
    """""""""""
    " see :help 'tabstop'
    set shiftwidth=4
    set tabstop=4
    set smarttab
    set expandtab         

    """"""""""""""
    " c settings "
    """"""""""""""
    set cindent
    set cinoptions=:0,p0,t0
    set cinwords=if,else,while,do,for,switch,case

    """"""""""""""""""
    " color settings "
    """"""""""""""""""
    if !has ("gui_running")
        " if vim in a terminal
        """"""""""""""""""""""""""
    """""""""""""""""""""""""""""""""""""""""""""
      
      " set the colors for vim on "xterm" - not necessary on all systems    "
        """""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""""
        if &term =~ "xterm-debian" || &term =~ "xterm-xfree86" || &term =~ "xterm"
          set t_Co=16
          set t_Sf=[3%dm
          set t_Sb=[4%dm
        endif
        " http://www-2.cs.cmu.edu/~maverick/VimColorSchemeTest/index-perl.html
        colorscheme default
        set background="/dark"
        " hi Normal  ctermfg=white ctermbg=black
        " hi PreProc ctermfg=gray  ctermbg=black
    else
        "set guifont=fixed
        "set guifont=Monospace/ 10
        " http://www-2.cs.cmu.edu/~maverick/VimColorSchemeTest/index-perl.html
        colorscheme blackbeauty
        set background="/dark"
        " colorscheme default

        " set background="/light"
        " hi PreProc guifg=#c0c0c0 guibg=#000040
        " hi Normal  guifg=black   guibg=white
    endif

    if has("syntax") && &t_Co > 2
      syntax on
    endif

    """"""""""
    " maping "
    """"""""""
    " useful for changelog the Dateformat is in ISO8601
    " map #log mq:r!date +"/%Y-/%m-/%d /%H:/%M:/%S $ <$@$>"`qJ
    map #log mq:r!date +"/%Y/%m/%dT/%k/%M/%S Urs Stotz <stotz@gmx.ch>"`qJ
    " map CTRL-] to // (useful by german keyboards)
    map // 

    """"""""""""""""""""""""""""""""""""""
    " Additional settings and parameters "
    """"""""""""""""""""""""""""""""""""""
    filetype plugin on
    filetype indent on

    """"""""""""
    " Plugins: "
    """"""""""""
    " set ctags for the plugin taglist command is |:Tlist| see |:help taglist|
    let Tlist_Ctags_Cmd = '/usr/bin/ctags'
    " open the tags file
    map [I:let nr = input("Which one: ")exe "normal " . nr ."[/t"
    noremap :cal VimCommanderToggle()

    " http://www.vim.org/scripts/script.php?script_id=65
    " au   BufEnter *   execute ":lcd " . expand("%:p:h")

    """"""""""""""
    " Templates: "
    """"""""""""""
    ":set verbose=9
    " :command! -nargs=1 Templ :set ft=| :0r! ~/.vim/templates/perl %

    """"""""""""""""""""""""""""
    " Plugins in ~/.vim/plugin "
    """"""""""""""""""""""""""""
    " ~/.vim/plugin/DirDiff.vim
    "   :DirDiff dir1 dir2
    "   vim ~/.vim/plugin/DirDiff.vim
    "
    " ~/.vim/plugin/MakeDoxygenComment.vim
    "   :Dox
    "   vim ~/.vim/plugin/MakeDoxygenComment.vim
    "
    " ~/.vim/plugin/bufexplorer.vim
    "   /be         - To start exploring in the current window
    "   /bs         - To start exploring in a newly split window
    "   /bv         - To start exploring in a newly split window
    "   :he bufexplorer
    "
    " ~/.vim/plugin/grep.vim
    "   :Grep       - Grep for the specified pattern in the specified files
    "   :Rgrep      - Run recursive grep
    "   :GrepBuffer - Grep for a pattern on all open buffers
    "   :GrepArgs   - Grep for a pattern on all the Vim argument filenames
    "   :Fgrep      - Run fgrep
    "   :Rfgrep     - Run recursive fgrep
    "   :Egrep      - Run egrep
    "   :Regrep     - Run recursive egrep
    "   :Agrep      - Run agrep
    "   :Ragrep     - Run recursive agrep
    "   vim ~/.vim/plugin/grep.vim

    "
    " ~/.vim/plugin/info.vim
    "   :Info info
    "   vim ~/.vim/plugin/info.vim
    "
    " ~/.vim/plugin/manpageview.vim
    "   :Man man
    "   :he manpageview
    "
    " ~/.vim/plugin/matchit.vim
    "   %           - Cycle forward through matching groups
    "   g%          - Cycle backwards through matching groups
    "   :he matchit
    "
    " ~/.vim/plugin/taglist.vim
    "   :Tlist
    "   :he taglist
    "
    " ~/.vim/plugin/tar.vim
    "   :e foobar.tgz
    "   vim ~/.vim/plugin/tar.vim


    这可以使得vim能高亮显示代码,便于编辑文件。

    只是不够满意的一点是vim的backspace 在putty里面变成了shift+backspace才好使。

    可以用fixdel修复,但是好像不能保存

      If your delete key terminal code is wrong, but the
       code for backspace is alright, you can put this in
       your .vimrc:
        :fixdel
       This works no matter what the actual code for
       backspace is.

       If the backspace key terminal code is wrong you can
       use this:
        :if &term == "termname"
        :  set t_kb=^V
        :  fixdel
        :endif
       Where "^V" is CTRL-V and "" is the backspace key
       (don't type four characters!). Replace "termname"
       with your terminal name.

    可以在vim编辑界面下输入 :h fixdel来参考详细的说明, 不过在cygwin的term下似乎vim是正常的。

     

    4. 对于cygwin下没有more命令的问题,可以用less代替,用关了more,就在.bashrc里做一alias即可。

  • Cygwin的简介以及使用方法

    2011-09-14 16:26:14

    0:简介
    1:下载和安装
    2:使用

    简介
    Cygwin是一个运行于Windows下的免费的UNIX的子系统,使用一个Dll(动态链接库)来

    实现,这样,我们可以开发出Cygwin下的UNIX工具,使用这个DLL运行在Windows下,大家可以想

    一下,你在运行Windows的同时,也可以使用VI,BASH,TAR,SED等UNIX下的工具,不是很好吗?这个VM

    虚拟机有很相同的原理,但是VM是虚拟多个,而Cygwin是同时使用Windows和UNIX,很爽吧,这样

    对于那些在Windows和Unix下移植的程序来说是比较简单的事情了.

    一:下载和安装

    其下载安装程序在Http://www.cygwin.com,下载安装程序以后,运行,然后会要你选择是通过什么方

    式进行下载安装所需要的文件,有三种方式,Http.Ftp.本地,我建议你首先通过Http和Ftp把安装所需要的

    文件全部下回来以后选择本地安装比较好,在线安装比较慢,会是一个很长的等待,虽然所需要的文件

    不大,但是全部安装的话会是4G大小,还是有选择性的安装吧,在安装界面,有Prev(老版本),Curr(当前版本)
    Exp(最新版本测试版本),苹果这里建议你选择Curr,然后你单击View按钮,这样你可以在可以使用的安装

    文件之间进行选择性的安装,如果你真的想全部安装的话,那么左键点击一下最上面的All,然后看到

    INSTALL,这样选择了全部,进行全部安装便可以了,安装完以后,会在桌面产生一个图标,双击这个图标,

    呵呵,你便可以使用Cygwin了.关于安装的具体参数方法,网络上有比较详细的介绍,我就不罗嗦了.

    PS:下载方面我建议如下:你可以下载以下几个版本的Cygwin:

    原始站: http://sources.redhat.com/cygwin/;
    印地安那大学的免安裝光盘cygwin, 叫做 XLiveCD:http://xlivecd.indiana.edu/ ,
    USA, Indiana ftp://ftp.ussg.indiana.edu/pub/xlivecd/xlivecd-20041201.iso
    Mirrors:
    Belgium, Geel ftp://sin.khk.be/mirror/xlivecd/xlivecd-20041201.iso
    Germany, Bochum ftp://linux.rz.ruhr-uni-bochum.de/xlivecd/xlivecd-20041201.iso
    Germany, Bochum http://linux.rz.ruhr-uni-bochum.de/download/xlivecd/xlivecd-20041201.iso
    Sweden, Ume? http://ftp.acc.umu.se/mirror/xlivecd/xlivecd-20041201.iso
    USA, Wisconsin ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso
    USA, Georgia ftp://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso
    USA, Georgia http://ftp.gtlib.cc.gatech.edu/pub/XLiveCD/xlivecd-20041201.iso
    苹果提示:USA, Wisconsin ftp://xlivecd.mirrors.tds.net/pub/xlivecd/xlivecd-20041201.iso
    这个下载速度快
    Shelley Yen 的cygnuwin : ftp://ftp.tceb.edu.tw/pub/free_software/cygnuwin/
    ftp://ftp.tcc.edu.tw/iso/cygwin/cyg+gnu.iso(cygwin 与 gnuwin 的合成版本)
    老古开发网:ftp://ic.laogu.com/down/cygwin.rar
    http://soft.laogu.com/down/cygwin.rar (均为05年3月版本)

    苹果提示:这个站点是高人站点,比较NB,呵呵,喜欢单片机的朋友有福气,超级多 的下载资料等着你,包含*NIX下的东西...

    其他的镜像站点:http://cygwin.com/mirrors.html

    苹果自己也下载了最新版本的Cygwin,但是偶没有空间,真的需要的话,请哪位好心人提供空间

    偶可以上传上去,联系请加偶的QQ:4791821,或者给偶发邮件:Taynni@gmail.com注明一下就可以了.


    二:使用


    使用上的方便性很是不错,启动Cygwin以后,会在Windows下得到一个Bash Shell,由于Cygwin是以

    Windows下的服务运行的,所以很多情况下和在Linux下有很大的不同,这点上,苹果建议你多理解下这个

    工作环境。我们开始使用Cygwin吧,比如PS,相当于Windows下的TM(任务管理器),呵呵,直接Ps的话

    那么得到的会是Cygwin下的Shell的进程如下
    Taynni-417@ENTERBD-417 ~
    $ ps
    PID PPID PGID WINPID TTY UID STIME COMMAND
    2212 1 2212 2212 con 1003 01:54:29 /usr/bin/bas
    3384 2212 3384 3232 con 1003 01:59:24 /usr/bin/ps

    如果这个时候你需要在Cygwin下显示Windows下的进程你可以在PS后面加上参数-aW,

    PS的相关用法:

    Quote
    Usage ps [-aefl] [-u uid]
    -f = show process uids, ppids
    -l = show process uids, ppids, pgids, winpids
    -u uid = list processes owned by uid
    -a, -e = show processes of all users
    -s = show process summary
    -W = show windows as well as cygwin processes
    很容易看懂吧,呵呵

    有点不一样的地方,我想大家一定想知道在Cygwin下怎么访问Windows下的内容了,

    呵呵,首先使用DF命令直接查看下本地驱动器,呵呵,很容易了吧,显示的内容

    如下:
    Quote
    Taynni-417@ENTERBD-417 ~
    $ df
    Filesystem 1k-blocks Used Available Use% Mounted on
    e:/cygwin/bin 10231384 4844432 5386952 48% /usr/bin
    e:/cygwin/lib 10231384 4844432 5386952 48% /usr/lib
    e:/cygwin 10231384 4844432 5386952 48% /
    c: 5106676 1240312 3866364 25% /cygdrive/c
    d: 10239408 6560328 3679080 65% /cygdrive/d
    e: 10231384 4844432 5386952 48% /cygdrive/e
    f: 6333252 4065564 2267688 65% /cygdrive/f
    g: 7150972 4672724 2478248 66% /cygdrive/g
    如上便是我的硬盘的全部了,在后面的/cygdrive/c便是C盘了,然后/cygdrive/d便是D盘了

    这样的话,想进D盘便可以这样进,呵呵
    Quote
    Taynni-417@ENTERBD-417 ~
    $ cd /cygdrive/d

    Taynni-417@ENTERBD-417 /cygdrive/d
    $ ls -l
    ls: pagefile.sys: Permission denied
    total 0
    drwxr-xr-x 9 Taynni-4 None 0 Aug 31 20:56 Book
    drwxr-xr-x 2 Taynni-4 None 0 Aug 23 05:24 Ftproot
    drwxr-xr-x 30 Taynni-4 None 0 May 10 23:38 HACKER
    drwxr-xr-x 11 Taynni-4 None 0 Feb 1 2005 JIAOXUE
    drwxr-xr-x 8 Taynni-4 None 0 Jan 3 2005 Local Settings
    dr-xr-xr-x 24 Taynni-4 None 0 Oct 16 2004 My Documents
    drwxr-xr-x 12 Taynni-4 None 0 May 14 16:48 Mywww
    drwxr-xr-x 2 Taynni-4 None 0 Jun 29 2004 Recycled
    drwxr-xr-x 3 Taynni-4 None 0 Aug 22 04:44 SECBOOK
    drwxr-xr-x 6 Taynni-4 None 0 Feb 28 2005 TaynniCHX
    drwxr-xr-x 15 Taynni-4 None 0 Mar 30 01:04 TaynniGZ
    drwxr-xr-x 12 Taynni-4 None 0 May 11 01:30 TaynniH
    drwxr-xr-x 15 Taynni-4 None 0 Mar 12 04:27 TaynniYM
    drwxr-xr-x 6 Taynni-4 None 0 Dec 13 2004 Taynniwww
    drwxr-xr-x 8 Taynni-4 None 0 Aug 31 20:55 Word

    Taynni-417@ENTERBD-417 /cygdrive/d
    $

    在Cygwin下还可以运行Windows下的程序,如下:
    Taynni-417@ENTERBD-417 ~
    $ cmd.exe
    Microsoft Windows XP [Version 5.1.2600]
    (C) Copyright 1985-2001 Microsoft Corp.

    e:/cygwin/home/Taynni-417>d:

    D:/>cd hacker

    D:/HACKER>cd tools

    D:/HACKER/Tools>cd pstools

    D:/HACKER/Tools/Pstools>ls
    pdh.dll pskill.exe pspasswd.exe
    Psinfo.exe psexec.exe pslist.exe psservice.exe
    Pstools.chm psfile.exe psloggedon.exe psshutdown.exe
    README.TXT psgetsid.exe psloglist.exe pssuspend.exe

    D:/HACKER/Tools/Pstools>exit

    Taynni-417@ENTERBD-417 ~
    $
    很明显的,直接输入CMD.EXE便可以得到一个本机CMDSHELL,这样你想运行什么程序都可以了

    退出到Cygwin的Bash shell需要使用exit命令,很方便吧,呵呵

    在Cygwin下还可以进行编译程序,比如C和perl,当然,你也可以借助ActivePy,这个东西也很不错

    也是一个仿真器,在Windows下模拟perl的解释器.

    对于一个系统而言,没有相应的系统工具是不可能的,在Cygwin下拥有的UNIX工具基本上够你使用

    了。当然,这需要你安装完整的Cygwin包,我的机子上就安装了完整的,比较大,如果硬盘允许,苹果建

    议你完整安装!像grep,cut,sed,strings,strace,md5sum,diff,patch,ssh,xxd,等等工具

    你都可以进行安装和使用,如果你真的不知道应该怎么用这些工具,其实苹果很多也不会,只要去接触

    你就会了!!!没有不会使用的东西,只有你愿意不愿意去使用而已!说笑了,言归正传,请使用

    所要使用的命令 --help获取帮助,如下所示:比如我不知道md5sum做什么用的

    (这个命令是用于效验文件md5值的,主要是为了文件的完整性和安全性)
    Quote
    Taynni-417@ENTERBD-417 ~
    $ md5sum --help
    Usage: md5sum [OPTION] [FILE]...
    or: md5sum [OPTION] --check [FILE]
    Print or check MD5 (128-bit) checksums.
    With no FILE, or when FILE is -, read standard input.

    -b, --binary read files in binary mode (default on DOS/Windows)
    -c, --check check MD5 sums against given list
    -t, --text read files in text mode (default)

    The following two options are useful only when verifying checksums:
    --status don't output anything, status code shows success
    -w, --warn warn about improperly formated checksum lines

    --help display this help and exit
    --version output version information and exit

    The sums are computed as described in RFC 1321. When checking, the input
    should be a former output of this program. The default mode is to print
    a line with checksum, a character indicating type (`*' for binary, ` ' for
    text), and name for each FILE.

    Taynni-417@ENTERBD-417 ~
    $
    基本使用上应该没有多大的问题了,文章因为我偷懒,也是不知道该怎么写才可以帮助大家

    我很苦恼的是,并没有人给我意见,所以先写这么点吧,如果你有问题的话,请加我的qq或者

    给我邮件,大家可以讨论,不是么?

    下面给出一些关于Cygwin的资料:
    1:http://www.isi.edu/nsnam/ns/ns-cygwin.html
    2:http://pigtail.net/LRP/printsrv/cygwin-sshd.html
    3:http://kde-cygwin.sourceforge.net/
    4:http://x.cygwin.com/
    5:http://chinyi.ncit.edu.tw/~peterju/cygwin.html
    6:http://cygnome.sourceforge.net/
    http://xlivecd.indiana.edu/

     

    根据cygwin user guide翻译整理,希望对大家有所帮助。有错误清指出。

    1 引言
            cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。本文将对其作一介绍。

    ---------------------------------------------------------------------

    根据cygwin user guide翻译整理,希望对大家有所帮助。有错误清指出。

    1 引言
            cygwin是一个在windows平台上运行的unix模拟环境,是cygnus solutions公司开发的自由软件(该公司开发了很多好东西,著名的还有eCos,不过现已被Redhat收购)。它对于学习unix/linux操作环境,或者从unix到windows的应用程序移植,或者进行某些特殊的开发工作,尤其是使用gnu工具集在windows上进行嵌入式系统开发,非常有用。随着嵌入式系统开发在国内日渐流行,越来越多的开发者对cygwin产生了兴趣。本文将对其作一介绍。

    2 机理
            cygnus当初首先把gcc,gdb,gas等开发工具进行了改进,使他们能够生成并解释win32的目标文件。然后,他们要把这些工具移植到windows平台上去。一种方案是基于win32 api对这些工具的源代码进行大幅修改,这样做显然需要大量工作。因此,他们采取了一种不同的方法——他们写了一个共享库(就是cygwin dll),把win32 api中没有的unix风格的调用(如fork,spawn,signals,select,sockets等)封装在里面,也就是说,他们基于win32 api写了一个unix系统库的模拟层。这样,只要把这些工具的源代码和这个共享库连接到一起,就可以使用unix主机上的交叉编译器来生成可以在windows平台上运行的工具集。以这些移植到windows平台上的开发工具为基础,cygnus又逐步把其他的工具(几乎不需要对源代码进行修改,只需要修改他们的配置脚本)软件移植到windows上来。这样,在windows平台上运行bash和开发工具、用户工具,感觉好像在unix上工作。
            关于cygwin实现的更详细描述,请参考http://cygwin.com/cygwin-ug-net/highlights.html.

    3 安装设置cygwin
    3.1 安装
            要安装网络版的cygwin,可以到http://cygwin.com,点击"Install Cygwin Now!"。这样会先下载一个叫做setup.exe的GUI安装程序,用它能下载一个完整的cygwin。按照每一屏的指示可以方便的进行安装。
    3.2 环境变量
            开始运行bash之前,应该设置一些环境变量。cygwin提供了一个.bat文件,里面已经设置好了最重要的环境变量。通过它来启动bash是最安全的办法。这个.bat文件安装在cygwin所在的根目录下。 可以随意编辑该文件。
            CYGWIN变量用来针对cygwin运行时系统进行多种全局设置。开始时,可以不设置CYGWIN或者在执行bash前用类似下面的格式在dos框下把它设为tty
    C:/> set CYGWIN=tty notitle glob

    PATH变量被cygwin应用程序作为搜索可知性文件的路径列表。当一个cygwin进程启动时,该变量被从windows格式(e.g. C:/WinNT/system32;C:/WinNT)转换成unix格式(e.g., /WinNT/system32:/WinNT)。如果想在不运行bash的时候也能够使用cygwin工具集,PATH起码应该包含x:/cygwin/bin,其中x:/cygwin 是你的系统中的cygwin目录。
            HOME变量用来指定主目录,推荐在执行bash前定义该变量。当cygwin进程启动时,该变量也被从windows格式转换成unix格式,例如,作者的机器上HOME的值为C:/(dos命令set HOME就可以看到他的值,set HOME=XXX可以进行设置),在bash中用echo $HOME看,其值为/cygdrive/c.
            TERM变量指定终端型态。如果美对它进行设置,它将自动设为cygwin。
            LD_LIBRARY_PATH被cygwin函数dlopen()作为搜索.dll文件的路径列表,该变量也被从windows格式转换成unix格式。多数Cygwin应用程序不使用dlopen,因而不需要该变量。
    3.3 改变cygwin的最大存储容量
            Cygwin程序缺省可以分配的内存不超过384 MB(program+data)。多数情况下不需要修改这个限制。然而,如果需要更多实际或虚拟内存,应该修改注册表的HKEY_LOCAL_MACHINE或HKEY_CURRENT_USER区段。田家一个DWORD键heap_chunk_in_mb并把它的值设为需要的内存限制,单位是十进制MB。也可以用cygwin中的regtool完成该设置。例子如下:
    regtool -i set /HKLM/Software/Cygnus/ Solutions/Cygwin/heap_chunk_in_mb 1024
    regtool -v list /HKLM/Software/Cygnus/ Solutions/Cygwin

    4 使用cygwin
            这一段讲一下cygwin和传统unix系统的不同之处。
    4.1 映射路径名
    4.1.1 引言
            cygwin同时支持win32和posix风格的路径,路径分隔符可以是正斜杠也可以是反斜杠。还支持UNC路径名。(在网络中,UNC是一种确定文件位置的方法,使用这种方法用户可以不关心存储设备的物理位置,方便了用户使用。在Windows操作系统,Novell Netware和其它操作系统中,都已经使用了这种规范以取代本地命名系统。在UNC中,我们不用关心文件在什么盘(或卷)上,不用关心这个盘(或卷)所在服务器在什么地方。我们只要以下面格式就可以访问文件:
    //服务器名/共享名/路径/文件名
            共享名有时也被称为文件所在卷或存储设备的逻辑标识,但使用它的目的是让用户不必关心这些卷或存储设备所在的物理位置。)
            符合posix标准的操作系统(如linux)没有盘符的概念。所有的绝对路径都以一个斜杠开始,而不是盘符(如c:)。所有的文件系统都是其中的子目录。例如,两个硬盘,其中之一为根,另一个可能是在/disk2路径下。
            因为许多unix系统上的程序假定存在单一的posix文件系统结构,所以cygwin专门维护了一个针对win32文件系统的内部posix视图,使这些程序可以在windows下正确运行。在某些必要的情况下,cygwin会使用这种映射来进行win32和posix路径之间的转换。
    4.1.2 cygwin mount表
            cygwin中的mount程序用来把win32盘符和网络共享路径映射到cygwin的内部posix目录树。这是与典型unix mount程序相似的概念。对于那些对unix不熟悉而具有windows背景的的人来说,mount程序和早期的dos命令join非常相似,就是把一个盘符作为其他路径的子目录。
            路径映射信息存放在当前用户的cygwin mount表中,这个mount table 又在windows的注册表中。这样,当该用户下一次登录进来时,这些信息又从注册表中取出。mount 表分为两种,除了每个用户特定的表,还有系统范围的mount表,每个cygwin用户的安装表都继承自系统表。系统表只能由拥有合适权限的用户(windows nt的管理员)修改。
            当前用户的mount表可以在注册表"HKEY_CURRENT_USER/Software/Red Hat, Inc./Cygwin/mounts v" 下看到。系统表存在HKEY_LOCAL_MACHINE下。
            posix根路径/缺省指向系统分区,但是可以使用mount命令重新指向到windows文件系统中的任何路径。cygwin从win32路径生成posix路径时,总是使用mount表中最长的前缀。例如如果c:被同时安装在/c和/,cygwin将把C:/foo/bar转换成/c/foo/bar.
            如果不加任何参数地调用mount命令,会把Cygwin当前安装点集合全部列出。在下面的例子中,c盘是POSIX根,而d盘被映射到/d。本例中,根是一个系统范围的安装点,它对所有用户都是可见的,而/d仅对当前用户可见。
    c:/> mount
    f:/cygwin/bin on /usr/bin type system (binmode)
    f:/cygwin/lib on /usr/lib type system (binmode)
    f:/cygwin on / type system (binmode)
    e:/src on /usr/src type system (binmode)
    c: on /cygdrive/c type user (binmode,noumount)
    e: on /cygdrive/e type user (binmode,noumount)
            还可以使用mount命令增加新的安装点,用umount删除安装点。
            当Cygwin不能根据已有的安装点把某个win32路径转化为posix路径时,cygwin会自动把它转化到一个处于缺省posix路径/cygdrive下的的一个安装点. 例如,如果Cygwin 访问Z:/foo,而Z盘当前不在安装表内,那么Z:/将被自动转化成/cygdrive/Z.
            可以给每个安装点赋予特殊的属性。自动安装的分区显示为“auto”安装。安装点还可以选择是"textmode"还是 "binmode",这个属性决定了文本文件和二进制文件是否按同样的方式处理。
    4.1.3 其他路径相关信息
            cygpath工具提供了在shell脚本中进行win32-posix路径格式转换的能力。
            HOME, PATH,和LD_LIBRARY_PATH环境变量会在cygwin进程启动时自动被从Win32格式转换成了POSIX格式(例如,如果存在从该win32路径到posix路径的安装,会把c:/cygwin/bin转为/bin)。

     

    cygwin的命令

    基本操作命令:
    ----------------------------------------------------------------------
    ----------------------------------------------------------------------
    ls #以默认方式显示当前目录文件列表
    ls –a #显示所有文件包括隐藏文件
    ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行
    ls --color=never *.so > obj #不显示文字颜色,将所有so文件记录到obj文件中

    ----------------------------------------------------------------------
    cd dir #切换到当前目录下的dir目录
    cd / #切换到根目录
    cd .. #切换到到上一级目录
    cd ../.. #切换到上二级目录
    cd ~ #切换到用户目录,比如是root用户,则切换到/root下

    ----------------------------------------------------------------------
    rm file #删除某一个文件
    rm -fr dir #删除当前目录下叫dir的整个目录

    ----------------------------------------------------------------------
    cp source target #将文件source 复制为 target
    cp /root/source . #将/root下的文件source复制到当前目录
    cp –av soure_dir target_dir #将整个目录复制,两目录完全一样
    cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同

    ----------------------------------------------------------------------
    mv source target #将文件source更名为target

    ----------------------------------------------------------------------
    diff dir1 dir2 #比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出
    diff file1 file2 #比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的
    comm file1 file2 #比较文件,显示两个文件不相同的内容

    ----------------------------------------------------------------------
    echo message #显示一串字符
    echo "message message2" #显示不连续的字符串
    cat:
    cat file #显示文件的内容,和DOS的type相同
    cat file | more #显示文件的内容并传输到more程序实现分页显示,使用命令less file可实现相同的功能
    more #分页命令,一般通过管道将内容传给它,如ls | more

    ----------------------------------------------------------------------
    export LC_ALL=zh_CN.GB2312 #将环境变量LC_ALL的值设为zh_CN.GB2312
    export DISPLAY=0:0 #通过该设置,当前字符终端下运行的图形程序可直接运行于Xserver
    date #显示当前日期时间
    date -s 20:30:30 #设置系统时间为20:30:30
    date -s 2002-3-5 #设置系统时期为2003-3-5
    clock –r #对系统Bios中读取时间参数
    clock –w #将系统时间(如由date设置的时间)写入Bios

    ----------------------------------------------------------------------
    eject #umout掉CDROM并将光碟弹出,但cdrom不能处于busy的状态,否则无效

    ----------------------------------------------------------------------
    du #计算当前目录的容量
    du -sm /root #计算/root目录的容量并以M为单位
    find -name /path file #在/path目录下查找看是否有文件file
    grep -ir “chars” #在当前目录的所有文件查找字串chars,并忽略大小写,-i为大小写,-r为下一级目录

    ----------------------------------------------------------------------
    vi file #编辑文件file
    vi 原基本使用及命令:
    输入命令的方式为先按ctrl+c, 然后输入:x(退出),:x!(退出并保存) :w(写入文件),:w!(不询问方式写入文件), :r file(读文件file) ,:%s/oldchars/newchars/g(将所有字串oldchars换成newchars) 这一类的命令进行操作

    ----------------------------------------------------------------------
    man ls #读取关于ls命令的帮助
    man ls | grep color #读取关于ls命令的帮助并通过grep程序在其中查找color字串

    ----------------------------------------------------------------------
    startx #运行Linux图形有环境
    Xfree86 #只运行X图形server

    ----------------------------------------------------------------------
    reboot #重新启动计算机
    halt #关闭计算机
    init 0 #关闭所有应用程序和服务,进入纯净的操作环境
    init 1 #重新启动应用及服务
    init 6 #重新启动计算机

    ----------------------------------------------------------------------
    扩展命令
    ----------------------------------------------------------------------
    ----------------------------------------------------------------------
    tar xfzv file.tgz #将文件file.tgz解压
    tar xfzv file.tgz -C target_path #将文件file.tgz解压到target_path目录下
    tar cfzv file.tgz source_path #将文件source_path压缩为file.tgz
    tar c directory > directory.tar #将目录directory打包成不压缩的directory.tar
    gzip directory.tar #将覆盖原文件生成压缩的 directory.tar.gz
    gunzip directory.tar.gz #覆盖原文件解压生成不压缩的 directory.tar。
    tar xf directory.tar #可将不压缩的文件解包

    ----------------------------------------------------------------------
    dmesg #显示kernle启动及驱动装载信息
    uname #显示操作系统的类型
    uname -R #显示操作系统内核的version

    ----------------------------------------------------------------------
    strings file 显示file文件中的ASCII字符内容

    ----------------------------------------------------------------------
    rpm -ihv program.rpm #安装程序program并显示安装进程
    rpm2targz program.rpm program.tgz #将rpm格式的文件转换成tarball格式

    ----------------------------------------------------------------------
    su root #切换到超级用户
    sulogin /dev/tty4 #在tty4即alt+F4终端等待用户登陆或直接登陆开启一个shell
    chmod a+x file #将file文件设置为可执行,脚本类文件一定要这样设置一个,否则得用bash file才能执行
    chmod 666 file #将文件file设置为可读写
    chown user /dir #将/dir目录设置为user所有

    ----------------------------------------------------------------------
    mknod /dev/hda1 b 3 1 #创建块设备hda1,主设备号为3,从设备号为1,即master硬盘的的第一个分区
    mknod /dev/tty1 c 4 1 #创建字符设备tty1,主设备号为4,众设备号为1,即第一个tty终端

    ----------------------------------------------------------------------
    touch /tmp/running #在/tmp下创建一个临时文件running,重新启动后消失

    ----------------------------------------------------------------------
    sleep 9 #系统挂起9秒钟的时间

    ----------------------------------------------------------------------
    lpd stop 或 cups stop #停止打印服务程序
    lpd start 或 cups start #启动打印服务程序
    lpd restart 或 cups restart #重新启动打印服务程序
    lpr file.txt #打印文件file.txt

    ----------------------------------------------------------------------
    fdisk /dev/hda #就像执行了dos的fdisk一样
    cfdisk /dev/hda #比fdisk界面稍为友好些
    mount -t ext2 /dev/hda1 /mnt #把/dev/hda1装载到 /mnt目录
    df #显示文件系统装载的相关信息
    mount -t iso9660 /dev/cdrom /mnt/cdrom #将光驱加载到/mnt/cdrom目录
    mount-t smb //192.168.1.5/sharedir /mnt -o username=tomlinux,password=tomlinux #将windows的的共享目录加载到/mnt/smb目录,用户名及密码均为tomlinux
    mount -t nfs 192.168.1.1:/sharedir /mnt #将nfs服务的共享目录sharedir加载到/mnt/nfs目录
    umount /mnt #将/mnt目录卸载,/mnt目录必须处于空闲状态
    umount /dev/hda1 #将/dev/hda1设备卸载,设备必须处于空亲状态
    sync #将cache中的内容与磁盘同步,在Linux中复制文件,一般要系统空闲才去写文件
    e2fsck /dev/hda1 #检查/dev/hda1是否有文件系统错误,提示修复方式
    e2fsck -p /dev/hda1#检查/dev/hda1是否有错误,如果有则自动修复
    e2fsck -y /dev/hda1#检查错误,所有提问均于yes方式执行
    e2fsck -c /dev/hda1#检查磁盘是否有坏区
    mkfs /dev/hda1 #格式化/dev/hda1为ext2格式
    mkfs.minix /dev/hda1 #格式化/dev/hda1为minix格式文件系统
    mfks /dev/hda9 #格工化/dev/hda9为Linux swap格式
    swapon /dev/hda9 #将swap分区装载当作内存来用
    swapoff /dev/hda9 #将swap分区卸载

    ----------------------------------------------------------------------
    lilo #运行lilo程序,程序自动查找/etc/lilo.conf并按该配置生效
    lilo -C /root/lilo.conf #lilo程序按/root/lilo.conf配置生效
    grub #在Linux shell状态下运行boot loader设置程序
    grub-install #安装grub磁盘引导程序,成功后升级内核无须像lilo一样要重新启动系统,只需修改/etc/grub.conf即可实现新引导配置
    rdev bzImage #显示kernel的根分区信息
    rdev bzImage /dev/hda1 #将kernel的根分区设置为/dev/hda1,这在没有lilo等引导程序的系统中非常重要.

    ----------------------------------------------------------------------
    dd if=/dev/fd0 f=floppy.fd #将软盘的内容复制成一个镜像,功能与旧石器时代常用的hd-copy相同
    dd if=/dev/zero f=root.ram bs=1024,count=1024 #生成一个大小为1M的块设备,可以把它当作硬盘的一个分区来用
    mkfs root.ram #将块设备格式化为ext2格式
    dd if=root.ram f=/dev/ram0 #将init.rd格式的root.ram的内容导入内存
    mount /dev/ram0 /mnt #ramdisk /dev/ram0装载到/mnt 目录

    ----------------------------------------------------------------------
    gcc hello.c #将hello.c编译成名为a.out二进制执行文件
    gcc hello.c -o hello #将hello.c编译成名为hello的二进制执行文件
    gcc -static -o hello hello.c #将hello.c编译成名为hello的二进制静态执行文件
    ldd program #显示程序所使用了哪些库
    objcopy -S program #将程序中的符号表及无用的调试信息去掉,可以小很多

    ----------------------------------------------------------------------
    strace netscape #跟踪程序netscape的执行,看调用的库,环境变量设置,配置文件,使用的设备,调用的其它应用程序等,在strace下,程序干了什么东东一目了然。
    ps #显示当前系统进程信息
    ps –ef #显示系统所有进程信息
    kill -9 500 #将进程编号为500的程序干掉
    killall -9 netscape #将所有名字为netscape的程序杀死,kill不是万能的,对僵死的程序则无效。
    top #显示系统进程的活动情况,按占CPU资源百分比来分
    free #显示系统内存及swap使用情况
    time program #在program程序结束后,将计算出program运行所使用的时间

    ----------------------------------------------------------------------
    chroot . #将根目录切换至当前目录,调试新系统时使用
    chroot /tomlinux #将根目录切换至/tomlinux目录
    chroot /tomlinux sbin/init #将根目录切换至/tomlinux并执行sbin/init
    adduser id #增加一个叫id的用户
    userdel id #增除叫id的用户
    userlist #显示已登陆的用户列表
    passwd id #修改用户id的密码
    passwd -d root #将root用户的密码删除
    chown id /work #指定/work目录为id用户所拥有

    ----------------------------------------------------------------------
    ifconfig eth0 192.168.1.1 netmask 255.255.255.0 #设置网卡1的地址192.168.1.1,掩码为255.255.255.0,不写netmask参数则默认为255.255.255.0
    ifconfig eth0:1 192.168.1.2 #捆绑网卡1的第二个地址为192.168.1.2
    ifconfig eth0:x 192.168.1.x #捆绑网卡1的第二个地址为192.168.1.x
    ifconfig down eth1 #关闭第二块网卡,使其停止工作
    hostname -F tomlinux.com #将主机名设置为tomlinux.com
    route #显示当前路由设置情况
    route add default gw 192.168.1.1 metric 1 #设置192.168.1.1为默认的路由
    route del default #将默认的路由删除
    dhcp #启动dhcp服务
    dhclient #启动dhcp终端并自动获取IP地址
    ping 163.com #测试与163.com的连接
    ping 202.96.128.68 #测试与IP 202。96.128.68的连接

    ----------------------------------------------------------------------
    probe rtl8139 #检查驱动程序rtl8139.o是否正常工作
    lsmod #显示已装载的驱动程序
    insmod rtl8139.o #装载驱动程序rtl8139.o
    insmod sb.o io=0x280 irq=7 dma=3 dma16=7 mpu_io=330 #装载驱动程序并设置相关的irq,dma参数
    rmmod rtl8139 #删除名为rtl8139的驱动模块
    gpm -k #停止字符状态下的mouse服务
    gpm -t ps2 #在字符状态下以ps2类型启动mouse的服务

    ----------------------------------------------------------------------
    telnet 192.168.1.1 #登陆IP为192.168.1.1的telnet服务器
    telnet iserver.com #登陆域名为iserver.com的telnet服务器
    ftp 192.168.1.1 或 ftp iserver.com #登陆到ftp服务

    Linux开发中的常用命令(cygwin环境也同样适用)

     cygwin使用心得
    1.在cygwin里访问Windows盘
    cd /cygdrive/c
    cd c:
    2.整合cygwin命令到Windows中
    假设cygwin安装在d:/develop/cygwin,则将d:/develop/cygwin/bin添加到系统变量PATH中(最好加在windows前面,这样的话,有些相同的命令的话,是先执行cygwin的命令,而不是windows命令,比如find)
    就可以直接在cmd.exe下面执行tar czvf xxx.tgz ./
    基本上所有的命令都可以用了,包括ls,more,less,find,grep等。
    3.使用TGZ备份
    将cygwin的BIN加入到PATH
    建一个BAT文件:
    @echo off
    d:
    cd d:/website/8thmanage
    tar czvf 8thmanage.tgz 8thmanage
    4.Windows使用SHELL脚本
    将cygwin的BIN加入到PATH
    在$CYGWIN的目录/var/下面建一脚本t.sh,注意,t.sh里面的路径,都是相对于$CYGWIN的,里面需要访问C盘的,请用/cygdrive/c/
    在Windows下执行:
    d:/cygwin/bin/bash d:/cygwin/var/t.sh
    (可以定期执行)
    5.同步Windows系统用户
    mkpasswd -l > /etc/passwd
    mkgroup -l > /etc/group
    如果有Domain的话,需要加上-d domainname
    6.安装系统服务
    cygrunsrv
    7.cygwing下使用rsync
    a.安装rsync组件
    b.进入cygwin,配置服务器
    vi /etc/rsyncd.conf
    ...screts file=/etc/tom.ipaddr.pas
    配置文件,参考我写的另外一篇rsync的文章,注意:密码文件权限必须是0400
    chmod 0400 /etc/tom.ipaddr.pas
    c.启动服务端
    rsync --daemon
    d.客户端同步
    在客户端的cygwin下面,运行rsync同步,具体命令,请参考另外一篇rsync的文章。
    8.cygwin下使用SSHD
    a.需要安装了cygrunsrc,openssh
    b.运行ssh-host-config -y
    一路回车,直到出现CYGWIN=时,输入tty ntsec,再回车,
    (或者,增加一系统环境变量CUGWIN=nesec tty)
    c.已经安装好SSHD服务到你的Windows服务中,可以直接在服务中启动,关闭。
    (cygrunsrc -S sshd或者net start sshd)
    9.中文显示
    vi ~/.bashrc
    # 让ls和dir命令显示中文和颜色
    alias ls='ls --show-control-chars --color'
    alias dir='dir -N --color'
    # 设置为中文环境,使提示成为中文
    export LANG="zh_CN.GBK"
    # 输出为中文编码
    export OUTPUT_CHARSET="GBK"
    ~/.inputrc为
    set completion-ignore-case on
    set meta-flag on
    set output-meta. on
    set convert-meta. off
    cygwin.bat脚本为:
    @echo off
    set MAKE_MODE=UNIX

    --------------------------------
    安装
    可以直接到http://www.cygwin.com下载一个安装程序,setup.exe,这个程序只是一个安装程序,所有的模块将从网络下载安装。或者,你可以下载一个cygwin.iso的镜像,直接映象成光盘,再从光盘本地安装,这样会快很多,而且不用考虑断线的问题。

    X下的中文支持
    locale支持
    Cygwin的locale支持一直都有问题,好在X程序还可以使用XLOCALE。
    建议还是使用zh_CN.gbk, 不要使用zh_CN.GB2312
    在移植程序时需要注意不要让程序连接libcygwin.a里面的setlocale,而是采用libX11.a里面的_Xsetlocale。方法是:检查被移植程序的全部源代码,发现
    #include
    就修改为
    #define X_LOCALE
    #include
    同时注意程序的连接库要添加-lX11.
    如果对于结果没有把握,可以找个Dependency Walker查看程序是否连接到了cygwin1.dll里面的setlocale,如果是,就说明有遗漏。
    中文字体
    PCF点阵字体
    GTK1.x 和其他一些老的X程序都是用X字体,
    注意必须要有编码与locale一致的字体,比如用zh_CN.gbk就必须要由GBK编码的字体,用zh_CN.GB2312就必须要有GB2312编码的字体
    如果使用zh_CN.GB2312,这里有一个RedOffice面带的点阵字体包
    可以采用ttf2bdf从TTF抽取得到bdf格式,然后再用bdf2pcf得到pcf格式的字体文件。
    (这里有一个Windows版本的TTF2BDF,可以将Windows TTF字体转换出BDF字体, 注意得到bdf后要手工编辑一下文件头,将编码声明修改正确)

    到字体之后,放到某个目录下,执行mkfontdir生成fonts.dir,然后用xset +fp
    /path/to/your/fonts将字体路径加入即可(注意与fontconfig的配置不同,这里路径是不递归的,如果有的字体放在子目录里面,
    子目录也需要添加进去才行)。

    TTF字体
    很多新的应用程序(比如GTK2)都使用fontconfig/libxft2来显示字体,它对TTF字体的支持比较好(X以前通过freetype, xft模块也支持TTF字体,但对中日韩字体的支持不是太好,而且也在Cygwin下似乎也没有这些模块)
    完全可以使用Linux下的arphic字体包. 如果没有安装Linux,可以到http://packages.debian.org下载相应的包,然后用7zip解压提取出ttf文件。
    得到字体文件之后,放到某个目录之下,编辑/etc/fonts/local.conf,将字体路径加入:
    /path/to/my/ttf/fonts如果只是自己使用,可以将字体文件放到~/.fonts下,不需要修改任何配置,最多三十秒fontconfig就能够发现这些字体了。

    中文输入法
    老黄(hzhr)移植了miniChinput到Cygwin,我也移植了fcitx-1.8.5和3.0,均可以从我的网站上找到 http://www.oliwen.com/bama...
    一般设置了LC_CTYPE和XMODIFIERS就可以在程序中激活输入输入法了(除非这个程序没有XIM支持):
    LC_CTYPE=zh_CN.gbk
    XMODIFIERS="@im=Chinput"
    export LC_CTYPE XMODIFIERS
    对于fcitx而言,XMODIFIERS设置为什么都可以(但必须要设置),所以设置为"@im=Chinput"的话chinput和fcitx都可以正常使用
    VI中的 Backspace 與 Delete 按鍵異常
    首先確定 $TERM的設定為cygwin

    echo $TERM

    若不是,請設定為

    TERM = cygwin
    export TERM

    Backspace 與 Delete這兩個鍵正常狀況下只有一個有用。可在 $HOME/.bash_profile 任選一個來使用

    stty erase '^H' //ctrl+v, ctrl+h

    stty erase '^?'

    本文来自: 脚本之家(www.jb51.net) 详细出处参考:http://www.jb51.net/article/6236.htm

    2008-04-14 22:17

    1. 资源

    1.1. 网址链接

    • 主页:
    http://www.cygwin.com/
    • 同步:
    ftp://ftp.sunsite.utk.edu/pub/cygwin/release/
    ftp://anonymous:cygwin@ftp.gnupilgrims.org/pub/cygwin/release/

     

    1.2. WIKI 关键字

     

    2. 版本

     

    3. FAQ

    3.1. Q Howto get version info?

             bash$ cygcheck -c cygwin

     

    3.2. Q 安装注意事项

    • gzip
    gzip 版本 1.3.3-4 可用。高版本如: 1.3.5-1 使 tar -z 命令运行不正常。

     

    3.3. Q Howto setup default text format, CRLF(dos) or LF(unix)?

    • 修改注册表项:HKEY_LOCAL_MACHINE/SOFTWARE/Cygnus Solutions/Cygwin/mounts v2/.../cygdrive flags。 cygdrive flags是一个DWORD值,&0x2 == 0x2 为 Unix Style,否则为 Dos like style。

     

    • 设置环境变量 CYGWIN, 使得在 pipe 等模式下的处理方式:export CYGWIN=nobinmode

     

    3.4. Q 为什么在 Cygwin 下创建的文件,其他管理员不可写?

    这是所谓的 ntsec 在起作用。通过 NTFS 的权限设置,模拟 UNIX 的权限。可以通过 CYGWIN 环境变量修改。如:
             bash$ export CYGWIN="nontsec nosmbntsec"

     

    3.5. Q 如何让 ls 能够显示中文文件名?

    因为 ls 不使用 readline 来显示, 因而不能用 .inputrc 控制。即 less 和 ls 需要特别设置。在 .bashrc 中加入如下 alias:
     alias less='/bin/less -r' alias ls='/bin/ls -F --color=tty --show-control-chars'

     

    3.6. Q 如何在按 TAB 键进行文件名扩展时忽略大小写,这样在 Windows 下才方便噢?

    参见: [Cygwin User's Guide]

     

    Customizing bash

    Three initialization files that control the behavior. of bash: .profile, .bashrc and .inputrc.

     

    .profile

    It is executed when bash is started as login shell, e.g. from the command bash --login.

    建议

    • 在 PATH 后加上 ":.",这样可以象在 DOS 下,执行本目录下程序;

     

    .bashrc

    .bashrc is similar to .profile but is executed each time an interactive bash shell is launched.

     

    .inputrc

    .inputrc controls how programs using the readline library (including bash) behave.

     

    # Ignore case while completingset completion-ignore-case on# Make Bash 8bit cleanset meta-flag onset output-meta. on # to show 8-bit charactersset convert-meta. off # to show it as character, not the octal representation

    但是并不能保证 ls 显示中文。因为这些工具不使用 readline 来显示。象 less 和 ls 需要特别设置。在 .bashrc 中加入如下 alias:

     alias less='/bin/less -r' alias ls='/bin/ls -F --color=tty --show-control-chars'

     

     

    3.7. Q 如何在 Cygwin 中运行 crontab?

    如下:
    • 在Windows上安装系统服务 cron,开机即运行。
             bash$ cygrunsrv -I cron -p /usr/sbin/cron -a -D
    • 启动服务
             bash$ cygrunsrv -S cron

     

    3.8. Q 配置 SSH client?

    • 为了能够通过公钥验证进行SSH登陆其他服务器,先要在本地建立 SSH 公钥私钥对:
             bash$ ssh-keygen -t rsa1         bash$ ssh-keygen -t rsa         bash$ ssh-keygen -t dsa
    • 建立无口令登录
    需要将本机的 *.pub 拷贝(cat>>)到服务器中 $HOME/.ssh/ 下的 authorized_keys (ssh1) 和 authorized_keys2 (ssh2) 文件中去。

     

    3.9. Q 如何在 cygwin 中运行 sshd (SSH Server)?

    如下:
    • 设置 Windows 环境变量,添加“CYGWIN = ntsec tty”

     

    • Config SSHD, running:
             bash$ ssh-host-config -y
    根据提示,输入 CYGWIN=ntsec tty

     

    • Change permissions and ownership on some files:
             bash$ cd /; chmod -R og-w .          bash$ chmod og+w /tmp          bash$ touch /var/log/sshd.log          bash$ chown system:system /var/log/sshd.log /var/empty /etc/ssh_h*          bash$ chmod 755 /var/empty

     

    • start the service:
             bash$ cygrunsrv -S sshd

     

    3.10. Q 如何在 cygwin 中配置 Email?

    As follows:
    • ssmtp & mutt
      • ssmtp
               bash$ /usr/bin/ssmtp-config
      When using mutt as the mail client, add the following line to your $HOME/.muttrc file:
               set sendmail="/usr/sbin/ssmtp"

     

    •  
      • mutt
        • Make sure you have the Cygwin ssmtp package installed
        check file /etc/ssmtp/ssmtp.conf
        • vi .bashrc and/or .bash_profile
                 export MAIL=~/Mail/inbox         export EDITOR=nano
        If you have nano installed (and I stongly recommend that you do)
        • Create the following directory structure in your HOME directory:
                 ~/Mail            |            -- inbox (EMPTY FILE, NOT DIRECTORY)            |            -- sent (EMPTY FILE, NOT DIRECTORY)            |            -- received (EMPTY FILE, NOT DIRECTORY)            |            -- postponed (EMPTY FILE, NOT DIRECTORY)
        • Create a ~/.muttrc file that looks like this:
                 # The file/directory where your incoming mail will be spooled to         # (same as 'set spoolfile' below)         mailboxes ~/Mail/inbox                 # Mail account setup.   I know nothing about IMAP, so you're         # on your own there.         set sendmail="/usr/sbin/ssmtp"         #set pop_host="your.pop3.mail.server.com"         #set pop_last=yes         #set pop_user="your_email_username"         #set pop_pass="your_email_password"         set from="your_complete@email_address.com"                 # Mail folder setup.         set folder=~/Mail         set mbox_type=mbox         set spoolfile=+inbox         set mbox=+received         set postponed=+postponed         set record=+sent

     

    •  
      •  
        • mutt command line
                 mutt [...] address         参数:             -a file : attach a file to message             -b address: BCC             -c address: CC             -F muttrc             -H draft: draft contain both header and body             -s subject: subject of the message             -x : emulate the mailx compose mode                 环境变量:             EMAIL : user's email address             MAIL   : user's spool mailbox         示例:             bash$ echo "contents" | mutt -x -s "subject" mail@address             bash$ echo   | mutt -x -s "subject" -i filename mail@address

     

    • exim & minires
      • exim
           Exim is a fully featured mail transfer agent, a drop-in replacement for sendmail.         bash$ /usr/bin/exim-config         bash$ view /etc/exim.conf          bash$ vi /etc/aliases                   postmaster: your_login_name         bash$ vi /etc/reslov.conf                   nameserver 10.0.0.7                   search your.domain         bash$ cygrunsrv -I exim -p /usr/bin/exim -e CYGWIN=nontsec                      -a "-bdf -q15m" -d "Exim Mail Transfer Agent"                    -1 /var/log/exim/cygrunsrv_out.log -2 /var/log/exim/cygrunsrv_err.log         bash$ cygrunsrv -S exim

     

    3.11. Q 如何得到 Dos/Windows? 格式的路径名?

             bash$ cygpath -d -m "`pwd`"

     

    3.12. Q Setup Xinetd

    • start init service
             bash$ /usr/bin/init-config

     

    • chkconfig 工具用来维护 /etc/rc.d 下的脚本
      • 若要启动 sshd 执行 "/sbin/chkconfig --add sshd"

     

    • xinetd config
             bash$ /usr/bin/xinetd-config

     

    3.13. Q other command?

    ttcp, netsnoop

     

    3.14. Q XFree86 under Cygwin?

    • add /usr/X11R6/bin to PATH;
    • start Xwindow using startxwin.bat(dos/windows), or startxwin.sh(cygwin);
    • if has a firewall installed, open port "6000" of local server;
    • run xclient in local machine, just set environment: export DISPLAY=127.0.0.1:0.0
    • if run xclient in remote machine, give authorize to remote host:
    bash$ /usr/X11R6/bin/xhost remote_hostname_or_ip_address
    • telnet/ssh to remote host;
    • set environment DISPLAY, like: export DISPLAY=<IP_of_Cygwin_XFree86>:0.0
    • xterm

     

    3.15. Q 安装后的设置综述?

    • binmode or textmode?
    执行 mount 命令,如果不是 textmode,修改注册表 HKEY_LOCAL_MACHINE/SOFTWARE/Cygnus Solutions/Cygwin/mounts v2/.../cygdrive flags。 cygdrive flags是一个DWORD值,&0x2 == 0x2 为 Unix Style,否则为 Dos like style。

     

    • 修改 ~/.inputrc 文件,加入如下内容
    # Ignore case while completingset completion-ignore-case on# Make Bash 8bit cleanset meta-flag onset output-meta. on # to show 8-bit charactersset convert-meta. off # to show it as character, not the octal representation

     

    • 修改 /etc/profile, 加入如下内容:
    set -o vialias less='/bin/less -r'alias ls='/bin/ls -F --color=tty --show-control-chars'# glob filenames in a case-insensitive mannershopt -s nocaseglobexport SGML_CATALOG_FILES=/share/catalog.sgmlexport XML_CATALOG_FILES=/share/catalog.xmlexport CYGWIN="nobinmode nontsec nosmbntsec"export PATH=$PATH:.

     

    • 修改登录用户的主要组:
             bash$ vi /etc/passwd
    默认属于 513 组(对于域控制器是Domain Users,非域控制器为 NONE),个人偏好设置为 544(Administrator)

     

    • 建立 symbol link:
      • 因为一些脚本默认的 md5 摘要程序是 md5, 而非 md5sum;
               bash$ ln -s /usr/bin/md5sum /usr/bin/md5
      • 设置 DOCBOOK DTD/DSSSL 路径
               bash$ ln -sf /cygdrive/e/HOME/WORK/johnson_homepage/worldhello/share /share

     

    •  
      • 设置 usemodwiki 路径映射
      mkdir /reposcd /repos/ln -s /cygdrive/d /dln -s /d/HOME/WORK/johnson_homepage/worldhello/usemod JohnsonUseModWikiln -s /d/HOME/WORK/johnson_homepage/worldhello/wiki .

     

     

    •  
      • 设置建立工作路径
               bash$ ln -sf /cygdrive/e/HOME/WORK/ ~/work
      在cygwin中输入中文和显示中文
      2008-07-31 15:45

      cygwin的缺省环境是不支持中文输入和显示的,通过google找到了能人介绍的解决方法。

      中文输入需要修改“.inputrc”文件,只要包括以下语句即可:

      set meta-flag on

      set convert-meta. off

      set output-meta. on

      set input-meta. on

      set completion-ignore-case on

      在我使用的cygwin环境中的“.inputrc”文件中已经包括这些指令了,只是被置成注释语句了,只要删掉行首的“#”就可。

      显示中文需要修改“.bashrc”文件,加入一行:

      alias ls='ls --show-control-chars --color=auto'

      文件修改完毕后,重新启动cygwin就可以看到效果了。

1841/1012345678910>