测试之道、

发布新日志

  • Linux下软件的安装

    2008-08-28 21:03:12

    一、rpm包安装方式步骤:

    1、找到相应的软件包,比如soft.version.rpm,下载到本机某个目录;

    2、打开一个终端,

    su -成root用户;

    3、cd soft.version.rpm所在的目录;

    4、输入rpm -ivh soft.version.rpm

    二、deb包安装方式步骤:

    1、找到相应的软件包,比如soft.version.deb,下载到本机某个目录;

    2、打开一个终端,su -成root用户;

    3、cd soft.version.deb所在的目录;

    4、输入dpkg -i soft.version.deb

    三、tar.gz源代码包安装方式:

    1、找到相应的软件包,比如soft.tar.gz,下载到本机某个目录;

    2、打开一个终端,su -成root用户;

    3、cd soft.tar.gz所在的目录;

    4、tar -xzvf soft.tar.gz //一般会生成一个soft目录

    5、cd soft

    6、./configure

    7、make

    8、make install

    四、tar.bz2源代码包安装方式:

    1、找到相应的软件包,比如soft.tar.bz2,下载到本机某个目录;

    2、打开一个终端,su -成root用户;

    3、cd soft.tar.bz2所在的目录;

    4、tar -xjvf soft.tar.bz2 //一般会生成一个soft目录

    5、cd soft

    6、./configure

    7、make

    8、make install

    五、apt方式安装:

    1、打开一个终端,

    su -成root用户;

    2、apt-cache search soft 注:soft是你要找的软件的名称或相关信息

    3、如果2中找到了软件soft.version,则用apt-get install soft.version命令安

    装软件 注:只要你可以上网,只需要用apt-cache search查找软件,用apt-get

    install软件

    六、bin文件安装:

    如果你下载到的软件名是soft.bin,一般情况下是个可执行文件,安装方法如下:

    1、打开一个终端,su -成root用户;

    2、chmod +x soft.bin

    3、./soft.bin //运行这个命令就可以安装软件了

    七、不需要安装的软件:

    有了些软件,比如lumaqq,是不需要安装的,自带jre解压缩后可直接运行。假设

    下载的是lumaqq.tar.gz,使用方法如下:

    1、打开一个终端,su -成root用户;

    2、tar -xzvf lumaqq.tar.gz //这一步会生成一个叫LumaQQ的目录

    3、cd LumaQQ

    4、chmod +x lumaqq //设置lumaqq这个程序文件为可运行

    5、此时就可以运行lumaqq了,用命令./lumaqq即可,但每次运行要输入全路径或

    切换到刚才生成的LumaQQ目录里

    6、为了保证不设置路径就可以用,你可以在/bin目录下建立一个lumaqq的链接,

    用命令ln -s lumaqq /bin/ 即可,以后任何时候打开一个终端输入lumaqq就可以

    启动QQ聊天软件了

    7、 如果你要想lumaqq有个菜单项,使用菜单编辑工具,比如Alacarte Menu

    Editor,找到上面生成的LumaQQ目录里的lumaqq设置一个菜单项就可以了,当然你

    也可以直接到 /usr/share/applications目录,按照里面其它*.desktop文件的格

    式生成一个自己的desktop文件即可。

    其他相关文章:

    Linux下安装软件的办法   http://www.linuxsky.org/doc/newbie/200708/101.html
          Linux下常见文件格式的压缩、解压小结   http://www.qqread.com/linux/2006/06/y769123061.html

  • C/S与B/S的特点及测试的侧重点各是什么?

    2008-08-28 20:36:49

    b/s结构即浏览器和服务器结构
    c/s是大家熟知的客户机和服务器结构
    B/S结构的优点: B/S结构最大的优点就是可以在任何地方进行操作而不用安装任何专门的软件。只要有一台能上网的电脑就能使用,客户端零维护。
    (1)、维护和升级方式简单。
    (2)、成本降低,选择更多。
    (3)、应用服务器运行数据负荷较重。
    C/S结构的优点:是能充分发挥客户端PC的处理能力,很多工作可以在客户端处理后再提交给服务器。对应的优点就是客户端响应速度快。
    (1)、应用服务器运行数据负荷较轻。
    (2)、数据的储存管理功能较为透明。
    (3)、C/S架构的劣势是高昂的维护成本且投资大。

    按照测试对象的结构分类可以分为:c/s结构系统测试、b/s结构系统测试、个人软件测试

    Client/Server软件测试

    c/s结构的软件测试发生在三个不同的层次

    • 个体的客户端应用以“分离的”模式被测试——不考虑服务器和底层网络的运行
    • 客户端软件和关联的服务器段应用被一起测试,但网络运行不被明显的考虑
    • 完成的C/S 体系结构,包括网络运行和性能,被测试。

    C/S结构软件测试常用方法

    • 应用功能测试——客户端勇勇被独立的执行,以揭示在其运行中的错误
    • 服务器测试——测试服务器的协调和数据管理功能,也考虑服务器性能(整体反应时间和数据吞吐量)
    • 数据库测试——测试服务器存储的数据的精确性和完整性,检查客户端应用提交的事务,以保证书具备正确的存储、更新和检索。
    • 事务测试——创建一系列的测试以保证每类事务被按照要求处理。测试着重于处理的正确性,也关注性能的问题。
    • 网络通信测试——这些测试验证网络节点间的通行正常的发生,并且消息传递、事务和相关的网络交通无错的发生。

    Browse/Server软件测试

    B/S结构软件测试需要关注:

    • 基本功能测试
    • 性能测试
    • 浏览器兼容性测试
    • 数据库测试
    • 安全性测试
    • 可用性易用性测试
    • 链接测试
    • 针对系统支持的协议的测试

    补充点个人软件测试需要关注的内容:

    • 基本功能测试
    • 安装卸载测试
    • 升级测试
    • 兼容性测试
    • 自我保护测试

    我觉得B/S的侧重点大多是针对前台/后台等进行的测试....C/S需要了解被测程序的业务流程,熟悉它的功能.用户需求等进行针对性测试....

    我想C/s侧重于界面测试,B/s侧重于测试用户并发数,服务器的承载能力吧,比如说1000个、10000个用户同时上线时软件是否还能正常运行。

  • Linux背后的人

    2008-08-28 20:23:25

     阅读提示:似乎在一夜之间,这个名字突然变得同象比尔。盖茨一样的耳熟能详。但是比尔。盖茨,哪怕身价有数不清倍的百万美金,也永远不会变成Linux Torvalds。
    1. Linus和Bill
       似乎在一夜之间,这个名字突然变得同象比尔。盖茨一样的耳熟能详。但是比尔。盖茨,哪怕身价有数不清倍的百万美金,也永远不会变成Linux Torvalds。这位29岁的芬兰人,简单而强大的Linux操作系统的创造者,超越了盖茨的神话。也有传闻说盖茨是一个卓越的程序员,但Linus是货真价实的高手。还在大学里时他就完成了一个货真价实的操作系统。年轻时的盖茨把拷贝他自己平庸的程序的程序员同行称为“贼”,而慷慨的Linus把他的杰作与全世界共享。哪个人,哪种运动会取胜,也许会决定技术发展的未来。
    两年之前,如果有谁说技术巨人和微软的亲密合作伙伴HP,会忙着保证她生产的电脑顺利运行Linux,那会是天方夜谭。但Linus采取的开发模式,邀请全世界共享和改进他的个人原创,从而引发了一场革命。怀疑论者觉得微软面对美国司法部的起诉,把Linux标为值得重视的竞争对手,只是在制造假想敌,以洗脱垄断的罪名。但微软透露的真相也许比他们想象得多。去年岁末,一份称作“万圣节文档”的微软内部白皮书泄露到媒体,它的结论也许会让盖茨睡不安寝。
    Linus被不少人认为是开放源码软件(open source software)的最佳代表人物,微软对付竞争对手的传统套路恐怕对他无可奈何。“Linux和其他开放源码软件,日渐可信地证实了OSS至少同商业软件同样强壮,如果没有超越后者的话。”微软工程师Vinod Valloppillil 的白皮书这样写道:“OSS聚积,发挥Internet上千百万人集体智能的能力令人惊异。”
    但“万圣节文档”没有提到的是,Linus已经证明他是众多反盖茨人物中最高明,最强有力的一个。Oracle的CEO Larry Ellison的NC攻势只是过眼烟云,Sun的CEO Scott McNealy 尽管在JAVA上取得巨大的成功,但似乎已深陷在无条件反对盖茨的泥泞之中;相比之下,Linus 始终没有偏离自己的道路。尽管他自己绝不会承认,但你可以说他是一个圆滑老练的政治家。他避免了纯粹自由软件的支持者和以盈利为目的的厂商新人之间的对峙,将Linux搞得分崩离析。他欢迎所有能增强软件可靠性和可用性的商业Linux版本和商业Linux软件,也依然不遗余力地支持那些和他一起开创局面的自由软件激进派。
    难以置信的是,在这个IPO和高科技亿万富翁层出不穷的时代,Linus并不显得急于将成功兑换成现钞。他仍然开着1997年初,离开芬兰开始在美国第一份工作(也是到目前为止唯一的工作--这是在硅谷)买的那一辆Pontiac Grand Am。一年之前,当Santa Clara 的那间小公寓再也住不下Linus,他的幼儿园教师妻子和他们的两个女儿时,他们租了所看的第一间房子--就在马路对面。关于他的雇主,高度保密的 Transmeta公司的各种谣言,在硅谷甚嚣尘上,但到目前为止,Linus似乎没有什么大发一笔横财的迹象。
    面对面聊天时,这位被大多数人只以名字Linus相称的人,戴着眼镜,语音轻柔,容易接近,对自己的才能和成就充满自豪,而且十分幽默。他从前是出名地逮什么吃什么,现在则对寿司情有独钟。由于编程太多,他的肚子已经有点儿凸,不过他的声音和他顽童般的笑容里远没有失去芬兰特色的那种轻快。
    Linus看来是一个平民主义者,他希望打破垄断性软件定价的思想方式,也反映在他的其他口味上。比如,他不买精装书,因为他相信精装书卖不太好,所以定价一定偏贵。同样,他更喜欢好莱坞的娱乐片,而不是欧洲的高品位艺术电影。他的父亲在电台工作,他的母亲翻译报纸新闻,叔叔为芬兰电视台工作,祖父是报纸记者,所以他理解新闻媒体,而且似乎也对于自己越来越出名自得其乐。
    2. 叛逆,叛逆
       问:你是否认为自己是传统的,正面意义上的黑客,一个叛逆者?我觉得仅称你为”一心编程的程序员“是不够的。
    答:我一般试图避免用黑客这个词。在和其他搞技术的人私下交谈时,我会称自己黑客。但同媒体接触时我只说“程序员”什么的,因为现在黑客往往是另外一个意思。
    问:那么“叛逆者”这个标签如何?
    答:“叛逆者”意味着你为某种事业而战,而且是在反对另一些东西。我不说自己叛逆,我说自己是有准则的。(ethical instead of rebel)叛逆的根本意义在于反对,而我觉得有自己的目的,两者的区别就是这样。我有自己的准则,我不关心别人是否也相信这些准则,我觉得这完全是个人的选择。
    问:那么你如何描述你的准则和目标呢?
    答:我的基本生活准则是:“己所不欲,勿施于人”,这不是仅限于基督教的思想,这是世界性的。这条准则很简单,而且在绝大多数情况下它可以告诉你该做什么。如果你举棋不定“我该干什么”,你可以自问“我会希望他(她)干什么?”马上你就知道答案了。
    问:你是否相信你的工作或者你的技术中,有一定社会或政治的因素?
    答:从开始就不是这样。一开始和社会完全无关,最初的动力是技术和我的个人兴趣。没有政治性是因为:政治在本质上就是要改变人的想法,我一直不希望这种事发生在我头上。
    但许多其他的“开放源码”人士未必和我一个想法。其中许多是政治性的:一些人试图让另一些人接受自己的观点,我不希望自己那样做。我也会谈自己的看法,但只是在别人问我之后。
    问:有许多机会你可以下海,或者决定Linux操作系统应该商业化,但你显然没有这样做,这让我很奇怪。为什么?
    答:这是我个人的兴趣问题。吸引我搞Linux的一直是技术。它一开始就不是为了赚钱,即使到了可以赚钱的时候,那也不是我的本意。商业化会改变我的动机。
    我很高兴有人在Linux上赚钱,那样增加了Linux的深度,也引入了新的动机和新的因素,如果不是因为商业目的那是不可能的。但我开始Linux的时候,商业化并不是我的选择。
    问:许多人会认为那是一个困难的抉择。但你却处之泰然,你觉得是为什么呢?
    答:也许在美国这是一个困难的抉择,但在世界的其他许多地方就未必了。美国是以金钱为中心的,每个人都重视钱,这当然也有好处。
    但在芬兰就不一样了。那里的文化背景下,成功是值得赞赏的,但你也欣赏别的东西,也许更多一些。比如说我的家族就很重视学位。他们认为学习是重要的,他们并不太在乎钱。
    3. Linus 2.0
       问:围绕着你在Transmeta的工作有着重重的谜团,能给我点提示什么时候可以真相大白吗?
    答:不行。也许明天就可以,也许得等15年。
    问:是Transmeta找你还是你找Transmeta?
    答:双向选择吧。我认识一个瑞典人,他在Transmeta工作。他到了赫尔辛基呆了一天和我见面,那时我说:“总算可以毕业了。”,因为那时我已经几年没有好好放松了。然后他就问我是否愿意去 Transmeta,然后我和他的老板谈。一周之后,1996年的秋天,我就坐飞机到加州来看。
    问:我理解你不能透露和工作有关的事情,但是可以告诉我这份工作哪一点让你兴奋吗?
    答:部分原因是那时我已经在Linux上干了6年,也希望有一些别的东西。我可不想在一根绳上吊死。我不希望Linux是我生活的全部,我希望能够找到一些本身就能激励人的东西。而且,小公司人情味比较足。还有,涉足一些世界上没有其他人涉足的领域也让人兴奋。
    问:那些东西和Linux无关吧?
    答:他们在内部就用Linux。我每天都用。他们也欢迎我在Linux上面的工作。一方面是因为公关效应,另一方面是因为内部也用得上。
    问:但你在Linux上的工作是没有报酬的。许多人奇怪你怎么会花这么多时间在没有钱的...
    答:即使是那些无法想象世界上有人做事会出于兴趣的人--那种人是挺可悲的,但也是有这样的人,我也可以向他们解释:10年之后Linux要是真的一帆风顺,我就要风得风,要雨得雨了,就象在银行存钱一样。这不是我的目的,但可以这样告诉那些除此之外就无法理解的人。
    我认为自己是一个艺术家,在做自己乐意做的事情。而且我也不用活得特别惨,因为程序员的待遇并不差。
    4. 时间就是一切
    问:你对资本主义的看法很有趣。看来你也相信自由软件的一些观点,但也不反对为软件和服务收费。什么情况下收费更合理,什么情况下免费更合理呢?
    答:收费总是合理的。但当我开始时,我无法使用商业软件,因为它们太贵了。Linux存在的部分原因就是,我不希望任何人再陷入那种境地--这就是“己所不欲,勿施于人”。但同时我也不认为收钱就有错。
    我并不反对钱。钱是个有趣的概念,但你必须选择最重要的东西?Linux好就好在,如果你是一家公司而且愿意付钱买一年365天,一天24小时的服务,你也得付一大笔钱--即使在Linux上那也是昂贵的,但如果你是一个穷学生,或者在第三世界国家,也许Linux会带给你接触一些新鲜事物的机会。
    问:Linux发展的速度或者Linux发展的方向曾让你始料不及吗?
    答:去年的事情也是经过一定酝酿过程的。在某种程度上,当一个公司决定支持Linux后,其他这么多公司会纷纷响应,这是让人吃惊的。不过,我从来没有在家里看得合不拢嘴,除了“哇”以外就说不了别的,我的反应更象是“嗯,够酷的,真的发生了。”
    问:是不是可以说Linux很好地把握了时机?
    答:Linux的成功是时机、需求和市场机会的组合。比如,Linux刚刚开发时,人们没有CDROM。Linux 面世后一年,CDROM就随处可见,于是突然就有了一种高性能价格比的商业化发行Linux的可能。所以,时机确实很好。Internet也是一个大好机会。Internet流行起来之前就已经有Linux了,但网络的基础架构一旦建立,Linux确实也或多或少地从中得益。
    问:我还觉得从微软那方面的事情发展来看,Linux的出现也是恰逢其时?
    答:出于公关的原因,司法部的起诉变成了一个对付微软的大聚会。两年以前,没有人质疑过微软,大家认为微碜龅氖虑槭抢硭比坏摹H嗣浅绨菸⑷恚捍蠊荆晒Γ蟀炎嗣蔷醯媚蔷褪?美国梦。司法部的起诉的一个结果是,一些原先喜欢微软的人现在改主意了。
    5.开发源码是民主
    问:而且他们现在也知道除了微软以外还有别的选择?
    答:你提到的这个事实意味着,突然之间你开始注意到有别的选择。以前人们并不寻找其他选择。现在,即使你不从Windows转到Linux,或者作其他的大改变,你还是会说:“看来微软说的东西还得想一想” 我认为这很重要。
    6.开放 vs. 封闭
    问:你如何对比你开发Linux的开放源码模式和微软开发Windows和Windows NT的封闭模式?
    答:在Linux上,系统的使用者可以影响开发的方向。从用户无须放弃控制这个角度说,这就是民主。每个人都可以做任何的事情。当然,基本前提是你必须有足够的能力,不过那也不失为区分干活的人和不干活的人的一种好办法。而且,即使是不修改软件的人也可以提建议,作测试,等等。
    我想,作为一种开发模式,开发源码是相当优越的--尤其是与传统的商业化封闭开发环境相比。问题的本质是如何激励人去创造。
    但确实有许多工作怎么样也算不上有趣,一项工作如果没有趣的话,必须靠其他的激励手段。最明显的就是通过钱。从某种程度上说,在封闭的环境下更容易挣钱。封闭模式依靠的是不给其他人提供完整的信息,从而限制竞争。限制竞争对于公司是有利的。
    问:你有什么比喻可以描述这两种模式的差别吗?
    答:我会这样说:封闭模式是一家出版社,它掌握的是铅字而不是语言。用户有读的自由,写的自由,但出版社决定什么样的东西可以出版发行,流传于世。你可以读,也可以用手写,但如果想要对书做什么改进的话,就得自己从头开始,或者求出版社。
    问:那么,开放源码模式的比喻就应该是一台打印机喽,打印机什么都不限制。
    答:对,你可以有任意多台的打印机,而且打印机之间可以共享字体。
    问:这是一个有趣的比喻。为什么Linux和开放源码模式如此成功,能告诉我你的看法吗?
    答:Linux能走到今天这一步,其中一个原因就是,它是弱者。在某种程度上,市场的力量对Linux的开发者没有太大的意义。人们开发Linux,是因为他们感兴趣的东西得不到足够的市场份额,而且他们也没有什么董事会跟在后面,必须每个季度解释财务状况。
    你改变了游戏规则,从而也改变了市场。(You also change the market by changing the rules in ways that Microsoft isn't willing to fail on)源代码公开变成了一个卖点。突然之间有了一条新的游戏规则,并非所有的人都在乎这条规则,但只要有人在乎,他会不假思索地拒绝微软。这就象两军对阵一样:你不能让敌军挑选战场,你必须掌握主动。
    问:你认为Linux有可能使微软或者其他的主流厂商改变他们的战略或者战场吗?
    答:某种程度上我希望会是这样。用一个我自认为贴切的比喻来解释:让我们看当前美国最大的 5家软件公司,把他们和50年代美国最大的5家汽车制造商作个比较。当时所有的汽车公司都在新功能,新附件上竞争,每年都会推出新车型。
    听起来是不是很耳熟?现在每年都会有个新版本的Windows。当时汽车公司的工作是让人们注意每年的车型翻新。所以51年的凯迪拉克和52年的凯迪拉克差别很大。人们当然就会注意车型。为什么?公司就是希望人们在乎自己开的是什么车型,几几年的车型--新年的新车型会给公司赚取大量的利润。尽管前一年的车型照样工作得很好,公司还是希望卖新车型。
    我和Linux就象当年的日本汽车圃煲怠H肥担飞嫌?0年代石油危机,还有其他的因素。但问题的本质是美国的汽车业并不关心质量,而是关心新的功能,还有每年的新车型。然后,日本汽车出现了,一开始他们质量虽好,名声也不见得那么大,但是渐渐地用户们明白了:“嘿,日本汽车造得就是好。它们是没有流线型尾翼(fin),但是话讲到底,我每年换车干什么?”
    我相信这是一个准确的比喻。如果微软能象美国汽车工业那样,改变它的做法,我会很高兴。如果微软真能改而在质量上和Linux竞争,那就是我的胜利。
    问:微软的Steve Ballmer (第二号人物)最近提到开发Windows的源代码,你对此有何看法?
    答:我所有的开发工作都是在Internet上完成的,你在Internet上学会的头一件事就是光说不练靠不住。 (and the first thing you learn on the Internet is that talk is cheap.) 除非看到了结果,否则我不相信任何言辞,这对所有的东西都是一样的,包括Ballmer的说法。眼见为实嘛。 (Show me the money! )
    7. Linux vs. NT
    问:谈到Ballmer和他的真正用意,你觉得微软是确实害怕Linux呢,还是它只不过利用媒体炒做对付司法部的起诉?
    答:我相信一开始这是微软的有意操作,特别是去年秋天Linux刚开始引起注意的时候。微软内部没有人会这样认真地看待Linux,但他们看到它可以利用,作为法庭辩护的一个依据。但他们失算了,事情的结果是引起了许多舆论界人士的兴趣:“这个Linux到底是什么东西?”
    问:你认为Linux有可能比NT使用更广泛吗?
    答:如果只是比较Linux和NT,我的回答是肯定的。Windows NT和Linux占有差不多的市场份额。〖编者按:根据IDG的报告,1998年底,NT的服务器市场占有率为38%,Linux 16%,其他UNIX 19%,NETWARE 23%。将来Linux会超过NT。那一天到的时候我不会太奇怪的。真正的目标是桌面系统。这不可能在一年、两年中发生,但也许会在3年,4年,5年间实现。
    问:你认为两到三年内Linux会挑战微软在桌面市场的地位?
    答:是三到四年。我希望那时Linux会成为非技术的电脑用户的选择之一。
    问:那会对电脑工业和微软产生什么影响呢?
    答:未必会到那样的地步。我只是认为,用户没有选择的市场是病态的。
    问:你用病态这个词?
    答:是的,是病态。你有一个非常广阔、复杂的市场,但有一家公司控制着这市场的绝大部分。不过最终垄断是维持不下去的。
    在新兴的市场中,往往一个公司掌握着巨大的实力。当年的石油大王如此,当年的汽车工业如此,当年的电脑业也是如此,那时人们认为IBM是不可战胜的。 最后总会演变成五六家大公司并立的局面,那样才会稳定。所以我认为当前的市场是病态的。
    8.今后5年的道路
    问:你对自由软件和商业力量之间的对立有何看法?有些纯粹主义者不喜欢Redhat或者任何其他发售Linux 商业版的公司,他们认为Linux应该保持永远免费。
    答:我试图避免看事情只分黑和白。我的观点是:有了Linux,你确实可以避免商业化。可以从网上下载你需要的一切,一分钱都不用付。但坦白的说,我不希望再下载所有的东西了。现在,如果有了一台新机器,我会插进一张Redhat或者Suse的光盘,然后安装,然后再加上我自己需要的其他东西。我不需要为光盘付钱,但如果有必要的话,我是乐意掏钱的。它们确实是提供了真正的服务。这就是选择。如果你看事情一定要分黑白,认为Linux就该彻底免费,那么你也是作出了自己的选择,但我觉得那样做是局限自己。
    问:看来你并不担心Redhat和诸如此类的公司会操纵Linux?
    答:那是因为Redhat这样的公司不会希望接管内核的开发--这个代价他们是明白的。他们会希望员工中有许多内核开发者,一旦发生问题,可以靠自己人解决。
    但他们本身并不想涉足内核开发。一个象样的商业公司,总会花时间做市场调研,搞清楚客户在做些什么,可以带给用户怎样的额外功能或价值,保证产品容易安装,解决重要的细节漏洞。关键是成品--完成一个产品,还有市场运作和组织运营。(It's about finishing touches, and it's marketing and logistics. )
    问:你认为5年之后,Linux会发展成什么样?
    答:对我来说,最有趣的一点始终是它各种各样的用途。我对嵌入市场感兴趣,因为那里会有些别处找不到的特殊用途。从技术的角度,超级计算机总是很性感的,但是从另一方面说,它们有趣也是因为有别处没有的特殊需求。
    我觉得最有趣的市场是桌面市场,因为桌面没有任何特殊化。而反过来讲,这意味着永远不会有一个十全十美的解决方案--人们要用的东西太多了。技术上,这是一个极其困难的问题,这也就是为什么我特别关注桌面。我希望在5年之内,你可以看到Linux成为桌面系统的一个选择。也许不会替代微软,但至少会成为一个真正的选择。当2004年有人去电脑商店买他的第一台电脑时,他们会停下来考虑一下,到底是要Linux,Windows还是MacOS。
    问:Linux和开放源码模式看来工作得很好,是否有其他新的商业模式引起你的兴趣呢?
    答:有一种让我很感兴趣,但无法让我相信,那是“Internet语言化” (internet phrasing)的商业模式,内容包括把E-加在公司的名字前头,然后把股票的市值炒上一个数量级。我觉得这很有趣,但长远来看不会成功。
    问:那你认为会发生什么呢?
    答:我认为传统工业会非常重视Internet。一小部分走在前列的公司会一战成名,然后发展不错;剩下的成功机会十成中可能超不过一成。也许Yahoo 会生存下来--它的名声太显赫了,单凭这名声就可以赚钱--品牌认同还是很重要的。但通过现在的商业模式他们不会赚钱,也许他们自己已经明白了。
    问:最后的问题,你认为软件产品的价格走向会怎样?
    答:当年PC公司和微软是通过制作廉价的软件进入软件普遍昂贵的市场的。你看这些规模小,但是富于进取心的公司--例如Borland,现在叫 Inprise,靠做编译器成名,或者微软,靠的是BASIC,他们就是这样进入市场的。令人沮丧的是,现在微软掌握掌握市场如此牢固,新一轮的涨价又开始了。Inprise当年率先推出价格低于100美金的编译器,引起了轰动,但当时的轰动已被淡忘了。我们又回到了软件价格居高不下的时候,因为又有大公司可以说:“你就该付这么多。”
    我希望我们会再有一次那样的轰动。现在的经济模式允许以高价销售软件,但我相信那不会持久。这使有些人认为我是共产主义者,但我不是--我绝对相信竞争。我只是相信竞争会获胜,价格会再一次下跌。
  • 测试问题汇总

    2008-08-28 17:45:39

    一、 c笔试题 (字符串反转)

         我没有记错的话是一道MSN的笔试题,网上无意中看到的,拿来做了一下。题目是这样的,给定一个字符串,一个这个字符串的子串,将第一个字符串反转,但保留子串的顺序不变。例如:
    输入:
    第一个字符串: "This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn"
    子串:
    "zhuxinquan"
    输出: "nc/moc.zhuxinquan.www//:ptth :etis esenihC s'zhuxinquan si
    sihT"
    一般的方法是先扫描一边第一个字符串,然后用stack把它反转,同时记录下子串出现的位置。然后再扫描一遍把记录下来的子串再用stack反转。我用的方法是用一遍扫描数组的方法。扫描中如果发现子串,就将子串倒过来压入堆栈。
    最后再将堆栈里的字符弹出,这样子串又恢复了原来的顺序。源代码如下:

    #include <iostream>
    #include <cassert>
    #include <stack>
    using namespace std;
    //reverse the string 's1' except the substring 'token'.
    const char* reverse(const char* s1, const char* token)
    {
    assert(s1 && token);
    stack<char> stack1;
    const char* ptoken = token, *head = s1, *rear = s1;
    while (*head != '\0')
    {
    while(*head!= '\0' && *ptoken == *head)
    {
    ptoken++;
    head++;
    }
    if(*ptoken == '\0')//contain the token
    {
    const char* p;
    for(p=head-1;p>=rear;p--)
    stack1.push(*p);

    ptoken = token;
    rear = head;
    }
    else
    {
    stack1.push(*rear);
    head=++rear;
    ptoken = token;
    }
    }
    char * return_v = new char[strlen(s1)+1];
    int i=0;
    while(!stack1.empty())
    {
    return_v[i++] = stack1.top();
    stack1.pop();
    }
    return_v[i]='\0';
    return return_v;
    }
    int main(int argc, char* argv[])
    {

    cout<<"This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn\n";
    cout<<reverse("This is zhuxinquan's Chinese site: http://www.zhuxinquan.com/cn","zhuxinquan");
    return 0;
    }

     

    二、LoadRunner怎样让众多用户同时登陆

           从数据库中虚拟用户,用虚拟的用户登陆就可以了.

     

    三、Unix 中的常用命令

         1、od 按八进制转储文件;

         2、pack 压缩文件;

         3、passwd 改变口令;

         4、paste 文件合并;

         5、pax 可移植档案管理程序;

         6、pcat 显示压缩格式文件;

         7、pg 分屏显示;

         8、pr 按打印格式显示文件;

         9、pstat 报告系统信息;

      

    四、 小于一万的含有一的正整数个数? 

         public static void main(String[] args) {
                 int j=0;
                 for (Integer i = 0; i < 10000; i++) {
                     if(i.toString().indexOf("1")!=-1){
                         System.out.print("-"+i);
                         j++;
                         if(i%20==0){
                             System.out.println();
                         }
                     }
                 }
                 System.out.println("  J: "+j);
         }

     

    五、软件的生命周期,软件测试的生命周期分别是什么?

     

    六、有两个砝码,一个7克、一个2克,还有一天平,现在有140克的盐,可以把它分成50克和90克??? (有想法的,请回复,谢谢!!!)

     


     

  • Linux和Unix的区别和联系

    2008-08-28 11:22:10

        Linux是一个类Unix系统,他是李纳斯.特沃兹以安德鲁.S.塔尼鲍默(Andrew S Tanenbum)的minix系统(由塔尼鲍默编写的用于操作系统教学的一个简单unix系统)为蓝本开发出来的系统内核,由于他编写的时候是按照开发unix系统的标准POSIX来开发的,所以说linux是一个类unix系统。linux被开发出来以后,由于其源代码是公开的,所以他被世界各地的自由软件人员不断改进,从而不断地壮大起来。现在大家使用的各种linux版本是由商家将各种应用程序包与linux捆绑在一起来出售的。而其内核是相同的,由李纳斯.特沃兹极其小组维护。
    "简单地说,Linux是一个类Unix内核。比方如,你用过一个叫Unix的东东,你觉得她很好,于是你回家写了一个和她类似的东西。当初有这样一个人,叫Linux Torvalds, 他怀着类似的想法,于是,企鹅诞生了! "
  • Shell编程基础

    2008-08-28 10:15:39

    编辑人员:Michael(WangRui)

    目录

      基本格式

      我们可以使用任意一种文字编辑器,比如nedit、kedit、emacs、vi等来编写shell脚本,它必须以如下行开始(必须放在文件的第一行):

      # !/bin/sh
      
      ...
      
      

      符号#!用来告诉系统执行该脚本的程序,本例使用/bin/sh。编辑结束并保存后,如果要执行该脚本,必须先使其可执行:

      chmod +x filename
      
      

      此后在该脚本所在目录下,输入 ./filename 即可执行该脚本。

      合理使用注释

      shell 脚本中以# 开始的行表示注释,直到该行的结束。我们强烈建议你在脚本中进行适当/合理的注释,这样一来,即便你在相当长时间内没有使用该脚本,也能在短时间内就明白 它的作用和工作原理。此外,还有一个很重要的原因是,在注释的帮助下,别人可以快速有效的分享你的脚本,并提出自己的意见和改进。

      变量赋值和引用

      Shell编程中,使用变量无需事先声明,同时变量名的命名须遵循如下规则:

      1. 首个字符必须为字母(a-z,A-Z)
      2. 中间不能有空格,可以使用下划线(_)
      3. 不能使用标点符号
      4. 不能使用bash里的关键字(可用help命令查看保留关键字)

      需要给变量赋值时,可以这么写:

      变量名=值 
      
      

      要取用一个变量的值,只需在变量名前面加一个$:

      #!/bin/sh
      # 对变量赋值:
      a="hello world"
      # 打印变量a的值:
      echo "A is:" $a
      
      

      挑个自己喜欢的编辑器,输入上述内容,并保存为文件first,然后执行 chmod +x first 使其可执行,最后输入 ./first 执行该脚本。其输出结果如下: 

      A is: hello world
      
      

      有时候变量名可能会和其它文字混淆,比如:

      num=2
      echo "this is the $numnd"
      
      

      上述脚本并不会输出"this is the 2nd"而是"this is the ";这是由于shell会去搜索变量numnd的值,而实际上这个变量此时并没有值。这时,我们可以用花括号来告诉shell要打印的是num变量:

      num=2
      echo "this is the ${num}nd"
      
      

      其输出结果为:this is the 2nd

      Shell脚本中有许多变量是系统自动设定的,我们将在用到这些变量时再作说明。除了只在脚本内有效的普通shell变量外,还有环境变量,即那些由export关键字处理过的变量。本文不讨论环境变量,因为它们一般只在登录脚本中用到。

      Shell里的命令

      Unix 命令

      在shell脚本中可以使用任意unix命令,不过实际上最为常用的一般都是那些文件和文字操作相关的命令。下面介绍一些常用命令的语法和功能:

      echo "some text"
      在屏幕上输出信息
      ls
      文件列表
      wc –l file wc -w file wc -c file
      分别计算文件的行数(line)、单词数(word)和字符数(character)
      cp sourcefile destfile
      文件拷贝
      mv oldname newname
      重命名文件或移动文件
      rm file
      删除文件
      grep 'pattern' file
      在文件内搜索字符串或和正则表达式匹配的字符串
      cut -b column file
      将指定范围内的文件内容输出到标准输出设备(屏幕)上。比如:输出每行第5至9个字符 cut -b5-9 file.txt,注意不要和cat命令混淆,这是两个完全不同的命令
      cat file.txt
      输出文件内容到标准输出设备(屏幕)上
      file somefile
      取得文件somefile的文件类型
      read var
      提示用户输入,并将输入内容赋值给变量var
      sort file.txt
      对file.txt文件所有行进行排序
      uniq
      只输出文件中内容不一致的行,如: sort file.txt | uniq
      expr
      进行数学运算,如要进行2+3的运算,命令为: expr 2 "+" 3
      find
      搜索文件,如根据文件名搜索:find . -name filename -print
      tee
      将数据输出到标准输出设备(屏幕) 和文件,比如:somecommand | tee outfile
      basename file
      返回不包含路径的文件名,如: basename /bin/tux 会返回 tux
      dirname file
      返回文件所在路径,如:dirname /bin/tux 会返回 /bin
      head file
      打印文本文件开头几行
      tail file 
      打印文本文件末尾几行
      sed
      是一个基本的查找替换程序。可以从标准输入(如命令管道)读入文本,并将结果输出到标准输出(屏幕);该命令采用正则表达式进行搜索。不要和 shell中的通配符相混淆。比如将 ubuntu 替换为 Ubuntu :cat text.file | sed 's/ubuntu/Ubuntu/' > newtext.file
      awk
      用来提取文本文件中的字段。缺省的字段分割符是空格,可以使用 -F 指定其它分割符。cat file.txt | awk -F, '{print $1 "," $3 }',这里我们使用 , 作为字段分割符,同时打印第一和第三个字段。如果该文件内容为 Adam Bor, 34, IndiaKerry Miller, 22, USA,则上述命令的输出为:Adam Bor, IndiaKerry Miller, USA

      概念: 管道, 重定向和 backtick

      尽管这些都不是系统命令,不过它们扮演着相当重要的角色。

      • 管道 (|) 将一个命令的输出作为另外一个命令的输入
      grep "hello" file.txt | wc -l
      

      上述命令会在file.txt中搜索包含有”hello”的行并计算行数,这里grep命令的输出成了wc命令的输入。

      • 重定向:将命令的结果输出到文件,而不是标准输出(屏幕)

      > 写入文件并复盖旧文件

      >> 加到文件的尾部,保留旧文件内容

      • 反短斜线

      反短斜线可以将一个命令的输出作为其它命令的命令行参数。

      find . -mtime -1 -type f -print
      

      上述命令可以查找过去24小时(-mtime –2则表示过去48小时)内修改过的文件。如果你想将上述命令查找到的所有文件打包,则可以使用如下脚本:

      #!/bin/sh
      
      # The ticks are backticks (`) not normal quotes ('):
      tar -zcvf lastmod.tar.gz `find . -mtime -1 -type f -print`
      

      Shell里的流程控制

      if 语句

      "if"表达式如果条件为真,则执行then后的部分:

      if ....; then
        ....
      elif ....; then
        ....
      else
        ....
      fi
      

      大多数情况下,可以使用测试命令来对条件进行测试,比如可以比较字符串、判断文件是否存在及是否可读等等……通常用" [ ] "来表示条件测试,注意这里的空格很重要,要确保方括号前后的空格。

      [ -f "somefile" ] :判断是否是一个文件
      [ -x "/bin/ls" ] :判断/bin/ls是否存在并有可执行权限
      [ -n "$var" ] :判断$var变量是否有值
      [ "$a" = "$b" ] :判断$a和$b是否相等

      执行man test可以查看所有测试表达式可以比较和判断的类型。下面是一个简单的if语句:

      #!/bin/sh
      
      if [ "$SHELL" = "/bin/bash" ]; then
         echo "your login shell is the bash (bourne again shell)"
      else
         echo "your login shell is not bash but $SHELL"
      fi
      

      变量$SHELL包含有登录shell的名称,我们拿它和/bin/bash进行比较以判断当前使用的shell是否为bash。

      && 和|| 操作符

      熟悉C语言的朋友可能会喜欢下面的表达式:

      [ -f "/etc/shadow" ] && echo "This computer uses shadow passwords"
      

      这里的 && 就是一个快捷操作符,如果左边的表达式为真则执行右边的语句,你也可以把它看作逻辑运算里的与操作。上述脚本表示如果/etc/shadow文件存在,则打印”This computer uses shadow passwords”。同样shell编程中还可以用或操作(||),例如:

      #!/bin/sh
      
      mailfolder=/var/spool/mail/james
      [ -r "$mailfolder" ] || { echo "Can not read $mailfolder" ; exit 1; }
      echo "$mailfolder has mail from:"
      grep "^From " $mailfolder
      

      该脚本首先判断mailfolder是否可读,如果可读则打印该文件中的"From" 一行。如果不可读则或操作生效,打印错误信息后脚本退出。需要注意的是,这里我们必须使用如下两个命令:

      -打印错误信息
      -退出程序

      我们使用花括号以匿名函数的形式将两个命令放到一起作为一个命令使用;普通函数稍后再作说明。即使不用与和或操作符,我们也可以用if表达式完成任何事情,但是使用与或操作符会更便利很多。

      case 语句

      case表达式可以用来匹配一个给定的字符串,而不是数字(可别和C语言里的switch...case混淆)。

      case ... in
         ...) do something here ;;
      esac
      

      让我们看一个例子,file命令可以辨别出一个给定文件的文件类型,如:file lf.gz,其输出结果为:

      lf.gz: gzip compressed data, deflated, original filename,
      last modified: Mon Aug 27 23:09:18 2001, os: Unix
      

      我们利用这点写了一个名为smartzip的脚本,该脚本可以自动解压bzip2, gzip和zip 类型的压缩文件:

       #!/bin/sh
      
       ftype=`file "$1"`
       case "$ftype" in
       "$1: Zip archive"*)
          unzip "$1" ;;
       "$1: gzip compressed"*)
          gunzip "$1" ;;
       "$1: bzip2 compressed"*)
          bunzip2 "$1" ;;
       *) error "File $1 can not be uncompressed with smartzip";;
       esac
      

      你可能注意到上面使用了一个特殊变量$1,该变量包含有传递给该脚本的第一个参数值。也就是说,当我们运行:

      smartzip articles.zip
      

      $1 就是字符串 articles.zip。

      select 语句

      select表达式是bash的一种扩展应用,擅长于交互式场合。用户可以从一组不同的值中进行选择:

      select var in ... ; do
       break;
      done
      .... now $var can be used ....
      
      

      下面是一个简单的示例:

      #!/bin/sh
      
      echo "What is your favourite OS?"
      select var in "Linux" "Gnu Hurd" "Free BSD" "Other"; do
          break
      done
      echo "You have selected $var"
      
      

      该脚本的运行结果如下:

      What is your favourite OS?
      1) Linux
      2) Gnu Hurd
      3) Free BSD
      4) Other
      #? 1
      You have selected Linux
      

      while/for 循环

      在shell中,可以使用如下循环:

      while ...; do
         ....
      done
      

      只要测试表达式条件为真,则while循环将一直运行。关键字"break"用来跳出循环,而关键字”continue”则可以跳过一个循环的馀下部分,直接跳到下一次循环中。

      for循环会查看一个字符串行表(字符串用空格分隔),并将其赋给一个变量:

      for var in ....; do
         ....
      done
      

      下面的示例会把A B C分别打印到屏幕上:

      #!/bin/sh
      
      for var in A B C ; do
         echo "var is $var"
      done
      

      下面是一个实用的脚本showrpm,其功能是打印一些RPM包的统计信息:

      #!/bin/sh
      
      # list a content summary of a number of RPM packages
      # USAGE: showrpm rpmfile1 rpmfile2 ...
      # EXAMPLE: showrpm /cdrom/RedHat/RPMS/*.rpm
      for rpmpackage in $*; do
         if [ -r "$rpmpackage" ];then
            echo "=============== $rpmpackage =============="
            rpm -qi -p $rpmpackage
         else
            echo "ERROR: cannot read file $rpmpackage"
         fi
      done
      

      这里出现了第二个特殊变量$*,该变量包含有输入的所有命令行参数值。如果你运行showrpm openssh.rpm w3m.rpm webgrep.rpm,那么 $* 就包含有 3 个字符串,即openssh.rpm, w3m.rpm和 webgrep.rpm。

      Shell里的一些特殊符号

      引号

      在向程序传递任何参数之前,程序会扩展通配符和变量。这里所谓的扩展是指程序会把通配符(比如*)替换成适当的文件名,把变量替换成变量值。我们可以使用引号来防止这种扩展,先来看一个例子,假设在当前目录下有两个jpg文件:mail.jpg和tux.jpg。

      #!/bin/sh
      
      echo *.jpg
      

      运行结果为:

      mail.jpg tux.jpg
      

      引号(单引号和双引号)可以防止通配符*的扩展:

      #!/bin/sh
      
      echo "*.jpg"
      echo '*.jpg'
      

      其运行结果为:

      *.jpg
      *.jpg
      

      其中单引号更严格一些,它可以防止任何变量扩展;而双引号可以防止通配符扩展但允许变量扩展:

      #!/bin/sh
      
      echo $SHELL
      echo "$SHELL"
      echo '$SHELL'
      

      运行结果为:

      /bin/bash
      /bin/bash
      $SHELL
      

      此外还有一种防止这种扩展的方法,即使用转义字符——反斜杆:\:

      echo \*.jpg
      echo \$SHELL
      

      输出结果为:

      *.jpg
      $SHELL
      

      Here documents

      当要将几行文字传递给一个命令时,用here documents是一种不错的方法。对每个脚本写一段帮助性的文字是很有用的,此时如果使用here documents就不必用echo函数一行行输出。Here document以 << 开头,后面接上一个字符串,这个字符串还必须出现在here document的末尾。下面是一个例子,在该例子中,我们对多个文件进行重命名,并且使用here documents打印帮助:

      #!/bin/sh
      
      # we have less than 3 arguments. Print the help text:
      if [ $# -lt 3 ] ; then
      cat << HELP
      
      ren -- renames a number of files using sed regular expressions USAGE: ren 'regexp' 'replacement' files...
      
      EXAMPLE: rename all *.HTM files in *.html:
         ren 'HTM$' 'html' *.HTM
      
      HELP
         exit 0
      fi
      
      ōLD="$1"
      NEW="$2"
      # The shift command removes one argument from the list of
      # command line arguments.
      shift
      shift
      # $* contains now all the files:
      for file in $*; do
         if [ -f "$file" ] ; then
            newfile=`echo "$file" | sed "s/${OLD}/${NEW}/g"`
            if [ -f "$newfile" ]; then
             echo "ERROR: $newfile exists already"
            else
               echo "renaming $file to $newfile ..."
               mv "$file" "$newfile"
            fi
         fi
      done
      
      
      
      
      
      
      
      

      这个示例有点复杂,我们需要多花点时间来说明一番。第一个if表达式判断输入命令行参数是否小于3个 (特殊变量$# 表示包含参数的个数) 。如果输入参数小于3个,则将帮助文字传递给cat命令,然后由cat命令将其打印在屏幕上。打印帮助文字后程序退出。如果输入参数等于或大于3个,我们就将第一个参数赋值给变量OLD,第二个参数赋值给变量NEW。下一步,我们使用shift命令将第一个和第二个参数从参数列表中删除,这样原来的第三个参数就成为参数列表$*的第一个参数。然后我们开始循环,命令行参数列表被一个接一个地被赋值给变量$file。接着我们判断该文件是否存在,如果存在则通过sed命令搜索和替换来产生新的文件名。然后将反短斜线内命令结果赋值给newfile。这样我们就达到了目的:得到了旧文件名和新文件名。然后使用 mv命令进行重命名。

      Shell里的函数

      如果你写过比较复杂的脚本,就会发现可能在几个地方使用了相同的代码,这时如果用上函数,会方便很多。函数的大致样子如下:

      functionname()
      {
      # inside the body $1 is the first argument given to the function
      # $2 the second ...
      body
      }
      

      你需要在每个脚本的开始对函数进行声明。

      下面是一个名为xtitlebar的脚本,它可以改变终端窗口的名称。这里使用了一个名为help的函数,该函数在脚本中使用了两次:

      #!/bin/sh
      # vim: set sw=4 ts=4 et:
      
      help()
      {
         cat < xtitlebar -- change the name of an xterm, gnome-terminal or kde konsole
       
      USAGE: xtitlebar [-h] "string_for_titelbar"
       
      OPTIONS: -h help text
       
      EXAMPLE: xtitlebar "cvs"
       
      HELP
         exit 0
      }
       
      # in case of error or if -h is given we call the function help:
      [ -z "$1" ] && help
      [ "$1" = "-h" ] && help
       
      # send the escape sequence to change the xterm titelbar:
      echo -e "33]0;$107"
      #
      

      在脚本中提供帮助是一种很好的编程习惯,可以方便其他用户(和自己)使用和理解脚本。

      命令行参数

      我们已经见过$* 和 $1, $2 ... $9 等特殊变量,这些特殊变量包含了用户从命令行输入的参数。迄今为止,我们仅仅了解了一些简单的命令行语法(比如一些强制性的参数和查看帮助的-h选项)。但是在编写更复杂的程序时,您可能会发现您需要更多的自定义的选项。通常的惯例是在所有可选的参数之前加一个减号,后面再加上参数值 (比如文件名)。

      有好多方法可以实现对输入参数的分析,但是下面的使用case表达式的例子无疑是一个不错的方法。

      #!/bin/sh
       
      help()
      {
         cat < This is a generic command line parser demo.
         USAGE EXAMPLE: cmdparser -l hello -f -- -somefile1 somefile2
         HELP
         exit 0
      }
        
      while [ -n "$1" ]; do
      case $1 in
         -h) help;shift 1;; # function help is called
         -f) opt_f=1;shift 1;; # variable opt_f is set
         -l) opt_l=$2;shift 2;; # -l takes an argument -> shift by 2
         --) shift;break;; # end of options
         -*) echo "error: no such option $1. -h for help";exit 1;;
         *) break;;
      esac
      done
       
      echo "opt_f is $opt_f"
      echo "opt_l is $opt_l"
      echo "first arg is $1"
      echo "2nd arg is $2"
      

      你可以这样运行该脚本:

      cmdparser -l hello -f -- -somefile1 somefile2
      

      返回结果如下:

      opt_f is 1
      opt_l is hello
      first arg is -somefile1
      2nd arg is somefile2
      

      这个脚本是如何工作的呢?脚本首先在所有输入命令行参数中进行循环,将输入参数与case表达式进行比较,如果匹配则设置一个变量并且移除该参数。根据unix系统的惯例,首先输入的应该是包含减号的参数。

      Shell脚本示例

      一般编程步骤

      现在我们来讨论编写一个脚本的一般步骤。任何优秀的脚本都应该具有帮助和输入参数。写一个框架脚本(framework.sh),该脚本包含了大多数脚本需要的框架结构,是一个非常不错的主意。这样一来,当我们开始编写新脚本时,可以先执行如下命令:

      cp framework.sh myscrīpt
      

      然后再插入自己的函数。

      让我们来看看如下两个示例。

      二进制到十进制的转换

      脚本 b2d 将二进制数 (比如 1101) 转换为相应的十进制数。这也是一个用expr命令进行数学运算的例子:

      #!/bin/sh
      # vim: set sw=4 ts=4 et:
      help()
      {
         cat < b2h -- convert binary to decimal
       
      USAGE: b2h [-h] binarynum
       
      OPTIONS: -h help text
       
      EXAMPLE: b2h 111010
      will return 58
      HELP
         exit 0
      }
       
      error()
      {
         # print an error and exit
         echo "$1"
         exit 1
      }
       
      lastchar()
      {
         # return the last character of a string in $rval
         if [ -z "$1" ]; then
            # empty string
            rval=""
            return
         fi
         # wc puts some space behind the output this is why we need sed:
         numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
         # now cut out the last char
         rval=`echo -n "$1" | cut -b $numofchar`
      }
       
      chop()
      {
         # remove the last character in string and return it in $rval
         if [ -z "$1" ]; then
            # empty string
            rval=""
            return
         fi
         # wc puts some space behind the output this is why we need sed:
         numofchar=`echo -n "$1" | wc -c | sed 's/ //g' `
         if [ "$numofchar" = "1" ]; then
            # only one char in string
            rval=""
            return
         fi
         numofcharminus1=`expr $numofchar "-" 1`
         # now cut all but the last char:
         rval=`echo -n "$1" | cut -b 0-${numofcharminus1}`
      }
       
      while [ -n "$1" ]; do
      case $1 in
         -h) help;shift 1;; # function help is called
         --) shift;break;; # end of options
         -*) error "error: no such option $1. -h for help";;
         *) break;;
      esac
      done
      
      # The main program
      sum=0
      weight=1
      # one arg must be given:
      [ -z "$1" ] && help
      binnum="$1"
      binnumorig="$1"
       
      while [ -n "$binnum" ]; do
         lastchar "$binnum"
         if [ "$rval" = "1" ]; then
            sum=`expr "$weight" "+" "$sum"`
         fi
         # remove the last position in $binnum
         chop "$binnum"
         binnum="$rval"
         weight=`expr "$weight" "*" 2`
      done
       
      echo "binary $binnumorig is decimal $sum"
      #
      

      该脚本使用的算法是利用十进制和二进制数权值 (1,2,4,8,16,..),比如二进制"10"可以这样转换成十进制:

      0 * 1 + 1 * 2 = 2
      

      为了得到单个的二进制数我们是用了lastchar 函数。该函数使用wc –c计算字符个数,然后使用cut命令取出末尾一个字符。Chop函数的功能则是移除最后一个字符。

      文件循环拷贝

      你可能有这样的需求并一直都这么做:将所有发出邮件保存到一个文件中。但是过了几个月之后,这个文件可能会变得很大以至于该文件的访问速度变慢;下面的脚本 rotatefile 可以解决这个问题。这个脚本可以重命名邮件保存文件(假设为outmail)为outmail.1,而原来的outmail.1就变成了 outmail.2 等等...

      #!/bin/sh
      # vim: set sw=4 ts=4 et:
       
      ver="0.1"
      help()
      {
         cat < rotatefile -- rotate the file name
         USAGE: rotatefile [-h] filename
         OPTIONS: -h help text
         EXAMPLE: rotatefile out
       
         This will e.g rename out.2 to out.3, out.1 to out.2, out to out.1[BR]
         and create an empty out-file
       
         The max number is 10
       
         version $ver
         HELP
       
         exit 0
      }
       
      error()
      {
         echo "$1"
         exit 1
      }
       
      while [ -n "$1" ]; do
         case $1 in
            -h) help;shift 1;;
            --) break;;
            -*) echo "error: no such option $1. -h for help";exit 1;;
            *) break;;
         esac
      done
       
      # input check:
      if [ -z "$1" ] ; then
         error "ERROR: you must specify a file, use -h for help"
      fi
       
      filen="$1"
      # rename any .1 , .2 etc file:
      for n in 9 8 7 6 5 4 3 2 1; do
         if [ -f "$filen.$n" ]; then
            p=`expr $n + 1`
            echo "mv $filen.$n $filen.$p"
            mv $filen.$n $filen.$p
         fi
      done
       
      # rename the original file:
      if [ -f "$filen" ]; then
         echo "mv $filen $filen.1"
         mv $filen $filen.1
      fi
       
      echo touch $filen
      touch $filen
      

      这个脚本是如何工作的呢?在检测到用户提供了一个文件名之后,首先进行一个9到1的循环;文件名.9重命名为文件名.10,文件名.8重命名为文件名. 9……等等。循环结束之后,把原始文件命名为文件名.1,同时创建一个和原始文件同名的空文件(touch $filen)。

      脚本调试

      最简单的调试方法当然是使用echo命令。你可以在任何怀疑出错的地方用echo打印变量值,这也是大部分shell程序员花费80%的时间用于调试的原因。Shell脚本的好处在于无需重新编译,而插入一个echo命令也不需要多少时间。

      shell也有一个真正的调试模式,如果脚本"strangescrīpt"出错,可以使用如下命令进行调试:

      sh -x strangescrīpt
      

      上述命令会执行该脚本,同时显示所有变量的值。

      shell还有一个不执行脚本只检查语法的模式,命令如下:

      sh -n your_scrīpt
      

      这个命令会返回所有语法错误。

      希望你现在已经可以开始编写自己的shell脚本了,尽情享受这份乐趣吧!

    • Linux操作系统命令

      2008-08-28 09:56:52

      Linux的发展前景非常不错,在Linux下做程序开发逐渐走向成熟,我们应该了解(熟悉)一下Linux!

      1 、单用户模式进系统

          启动linux 出现grub画面时选中linux 按e 键

          kernel /boot/vmlinuz-2.4.18-14 ro root=LABEL=/按E 键

          在ro前面加入single

          kernel /boot/vmlinuz-2.4.18-14 single ro root=LABEL=/

          回车,按B 键进入系统。

          注意:freebsd 下再多加一个命令 mount -a

      2 、解压文件

          tar.bz 2文件的解压 #tar jxvf *.tar.bz 2

          tar.gz文件的解压 #tar xzpf *.tar.gz

          rpm 文件的解压 #rpm -ivh *.rpm

      3 、激活ssh 服务

          /etc/rc.d/init.d/sshd start

          service sshd start

          ubuntu开启ssh 服务

          studo apt-get install ssh

          $sudo passwd root

      4 、关闭防火墙

          /etc/rc.d/init.d/iptables stop

          Linux 防火墙的关闭和开启

          1 )重启后生效

          开启: chkconfig iptables on

          关闭: chkconfig iptables off

          2 )即时生效,重启后失效

          开启: service iptables start

          关闭: service iptables stop

          需要说明的是对于Linux 下的其它服务都可以用以上命令执行开启和关闭操作。

          在开启了防火墙时,做如下设置,开启相关端口,

          修改/etc/sysconfig/iptables 文件,添加以下内容:

          -A RH-Firewall-1-INPUT -m state ——state NEW -m tcp -p tcp ——dport80 -j ACCEPT

          -A RH-Firewall-1-INPUT -m state ——state NEW -m tcp -p tcp ——dport22 -j ACCEPT

      5 、查看开放的服务 netstat–tl

          启动自动加载的服务 ntsys v

      6 、设置网卡IP netconfig

          查看网卡IP ifconfig

          或者进入 /etc/sysconfig/network-scrips/ 目录下

          cat ifcfg-eth0

          FreeBSD 中修改网络配置: #ee /etc/rc.conf

          FC4 的网卡IP修改 #vi /etc/sysconfig/network-scrīpts/ifcfg-eth0

          己编译的网卡驱动的安装

          #tar–zxvf e1000-6.0.54.tar.gz

          #cd e1000-6.0.54/src

          Make install

          Inwmod e1000

          #/etc/rc.d/init.d/network reload

          #reboot

          修改/etc/modules.conf 加一行

          Alias eth0 e1000

      7 、重起网卡 service network restart

          查看进程: ps aux

      8 、禁用图形界面 #vi inittab

          将ID后面的 5改为3 就可以了

      9 、加载光驱软驱 mount /mut/cdrom

          Mount /mut/floppy

          先用pwd 查看所在目录是否为挂载点,如果是,则无法挂载

          如果要卸载则 M mount /mnt/cdrom

          M mount /mnt/floppy

      10、打开redhat自带的ftp 工具

          # /sbin/service vsftpd start

          查看安装ftp 的版本及安装情况

          # rpm –qa | grep vsftpd

          看谁登陆了FTP ,并杀死它的进程

          Ps–xf | grep ftp 如ps–aux|grep运行程序

          Kill进程号如 kill -9进程号

          新建一个文件如“ # touch /etc/vsftpd.chroot_list

          卸载: rpm–e packge name

          安装 rpm–ivh *.rpm

          卸载mysql 依次加上- -nodeps.- - (注意为了显示故中间有空隔)force它们相互依赖,不加无法卸载

          Rpm –e mysql –client - -nodeps(- -force加上这个参数不行就不加)

          Rem –e mysql

          redhat卸载自带的mysql

          #rpm–e perl–DBD –mySQL -2.1021-3 - -lodeps

          #rpm–e mysql

      11、使用mkswap命令建立swap分区再使用swapon命令启用swap分区

          #mkswap /dev/sad7

          #swapon /dev/sad7

      12、改名命令 # mv

          删除文件 #rm

          删除文件夹 #rm–rf

      13、linux 做禁ping

          # vi /proc/sys/net/ip/ipv4/icmp_echo_ignore_all

          将其值改为1 为禁ping改为0 为解禁ping

    • UNIX 高手的 10 个习惯

      2008-08-28 09:15:38

      采用 10 个能够提高您的 UNIX® 命令行效率的好习惯——并在此过程中摆脱不良的使用模式。本文循序渐进地指导您学习几项用于命令行操作的技术,这些技术非常好,但是通常被忽略。了解常见错误和克服它们的方法,以便您能够确切了解为何值得采用这些 UNIX 习惯。
      引言
      当您经常使用某个系统时,往往会陷入某种固定的使用模式。有时,您没有养成以尽可能最好的方式做事的习惯。有时,您的不良习惯甚至会导致出现混乱。纠正此类缺点的最佳方法之一,就是有意识地采用抵制这些坏习惯的好习惯。本文提出了 10 个值得采用的 UNIX 命令行习惯——帮助您克服许多常见使用怪癖,并在该过程中提高命令行工作效率的好习惯。下面列出了这 10 个好习惯,之后对进行了更详细的描述。
      采用 10 个好习惯
      要采用的十个好习惯为:
      在单个命令中创建目录树
      更改路径;不要移动存档
      将命令与控制操作符组合使用
      谨慎引用变量
      使用转义序列来管理较长的输入
      在列表中对命令分组
      find 之外使用 xargs
      了解何时 grep 应该执行计数——何时应该绕过
      匹配输出中的某些字段,而不只是对行进行匹配
      停止对 cat 使用管道


      在单个命令中创建目录树
      清单 1 演示了最常见的 UNIX 坏习惯之一:一次定义一个目录树。

      清单 1. 坏习惯 1 的示例:单独定义每个目录树

      ~ $ mkdir tmp
      ~ $ cd tmp
      ~/tmp $ mkdir a
      ~/tmp $ cd a
      ~/tmp/a $ mkdir b
      ~/tmp/a $ cd b
      ~/tmp/a/b/ $ mkdir c
      ~/tmp/a/b/ $ cd c
      ~/tmp/a/b/c $

      使用 mkdir-p 选项并在单个命令中创建所有父目录及其子目录要容易得多。但是即使对于知道此选项的管理员,他们在命令行上创建子目录时也仍然束缚于逐步创建每级子目录。花时间有意识地养成这个好习惯是值得的:

      清单 2. 好习惯 1 的示例:使用一个命令来定义目录树
      ~ $ mkdir -p tmp/a/b/c  

      您可以使用此选项来创建整个复杂的目录树(在脚本中使用是非常理想的),而不只是创建简单的层次结构。例如:

      清单 3. 好习惯 1 的另一个示例:使用一个命令来定义复杂的目录树
      ~ $ mkdir -p project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}  

      过去,单独定义目录的唯一借口是您的 mkdir 实现不支持此选项,但是在大多数系统上不再是这样了。IBM、AIX®、mkdir、GNU mkdir 和其他遵守单一 UNIX 规范 (Single UNIX Specification) 的系统现在都具有此选项。
      对于仍然缺乏该功能的少数系统,您可以使用 mkdirhier 脚本(请参见参考资料),此脚本是执行相同功能的 mkdir 的包装:
      ~ $ mkdirhier project/{lib/ext,bin,src,doc/{html,info,pdf},demo/stat/a}  

      更改路径;不要移动存档
      另一个不良的使用模式是将 .tar 存档文件移动到某个目录,因为该目录恰好是您希望在其中提取 .tar 文件的目录。其实您根本不需要这样做。您可以随心所欲地将任何 .tar 存档文件解压缩到任何目录——这就是 -C 选项的用途。在解压缩某个存档文件时,使用 -C 选项来指定要在其中解压缩该文件的目录:

      清单 4. 好习惯 2 的示例:使用选项 -C 来解压缩 .tar 存档文件
      ~ $ tar xvf -C tmp/a/b/c newarc.tar.gz  

      相对于将存档文件移动到您希望在其中解压缩它的位置,切换到该目录,然后才解压缩它,养成使用 -C 的习惯则更加可取——当存档文件位于其他某个位置时尤其如此。



      将命令与控制操作符组合使用
      您可能已经知道,在大多数 Shell 中,您可以在单个命令行上通过在命令之间放置一个分号 (;) 来组合命令。该分号是 Shell 控制操作符,虽然它对于在单个命令行上将离散的命令串联起来很有用,但它并不适用于所有情况。例如,假设您使用分号来组合两个命令,其中第二个命令的正确执行完全依赖于第一个命令的成功完成。如果第一个命令未按您预期的那样退出,第二个命令仍然会运行——结果会导致失败。相反,应该使用更适当的控制操作符(本文将描述其中的部分操作符)。只要您的 Shell 支持它们,就值得养成使用它们的习惯。
      仅当另一个命令返回零退出状态时才运行某个命令
      使用 && 控制操作符来组合两个命令,以便仅当 第一个命令返回零退出状态时才运行第二个命令。换句话说,如果第一个命令运行成功,则第二个命令将运行。如果第一个命令失败,则第二个命令根本就不运行。例如:

      清单 5. 好习惯 3 的示例:将命令与控制操作符组合使用
      ~ $ cd tmp/a/b/c && tar xvf ~/archive.tar  

      在此例中,存档的内容将提取到 ~/tmp/a/b/c 目录中,除非该目录不存在。如果该目录不存在,则 tar 命令不会运行,因此不会提取任何内容。
      仅当另一个命令返回非零退出状态时才运行某个命令
      类似地,|| 控制操作符分隔两个命令,并且仅当第一个命令返回非零退出状态时才运行第二个命令。换句话说,如果第一个命令成功,则第二个命令不会运行。如果第一个命令失败,则第二个命令才会 运行。在测试某个给定目录是否存在时,通常使用此操作符,如果该目录不存在,则创建它:

      清单 6. 好习惯 3 的另一个示例:将命令与控制操作符组合使用
      ~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c  

      您还可以组合使用本部分中描述的控制操作符。每个操作符都影响最后的命令运行:

      清单 7. 好习惯 3 的组合示例:将命令与控制操作符组合使用
      ~ $ cd tmp/a/b/c || mkdir -p tmp/a/b/c && tar xvf -C tmp/a/b/c ~/archive.tar  


      谨慎引用变量
      始终要谨慎使用 Shell 扩展和变量名称。一般最好将变量调用包括在双引号中,除非您有不这样做的足够理由。类似地,如果您直接在字母数字文本后面使用变量名称,则还要确保将该变量名称包括在方括号 ([]) 中,以使其与周围的文本区分开来。否则,Shell 将把尾随文本解释为变量名称的一部分——并且很可能返回一个空值。清单 8 提供了变量的各种引用和非引用及其影响的示例。

      清单 8. 好习惯 4 的示例:引用(和非引用)变量
      ~ $ ls tmp/
      a b
      ~ $ VAR="tmp/*"
      ~ $ echo $VAR
      tmp/a tmp/b
      ~ $ echo "$VAR"
      tmp/*
      ~ $ echo $VARa
      ~ $ echo "$VARa"
      ~ $ echo "${VAR}a"
      tmp/*a
      ~ $ echo ${VAR}a
      tmp/a
      ~ $


      使用转义序列来管理较长的输入
      您或许看到过使用反斜杠 (\) 来将较长的行延续到下一行的代码示例,并且您知道大多数 Shell 都将您通过反斜杠联接的后续行上键入的内容视为单个长行。然而,您可能没有在命令行中像通常那样利用此功能。如果您的终端无法正确处理多行回绕,或者您的命令行比通常小(例如在提示符下有长路经的时候),反斜杠就特别有用。反斜杠对于了解键入的长输入行的含义也非常有用,如以下示例所示:

      清单 9. 好习惯 5 的示例:将反斜杠用于长输入
      ~ $ cd tmp/a/b/c || > mkdir -p tmp/a/b/c && > tar xvf -C tmp/a/b/c ~/archive.tar  

      或者,也可以使用以下配置:

      清单 10. 好习惯 5 的替代示例:将反斜杠用于长输入
      ~ $ cd tmp/a/b/c > || > mkdir -p tmp/a/b/c > && > tar xvf -C tmp/a/b/c ~/archive.tar  

      然而,当您将输入行划分到多行上时,Shell 始终将其视为单个连续的行,因为它总是删除所有反斜杠和额外的空格。
      注意:在大多数 Shell 中,当您按向上箭头键时,整个多行输入将重绘到单个长输入行上。



      在列表中对命令分组
      大多数 Shell 都具有在列表中对命令分组的方法,以便您能将它们的合计输出向下传递到某个管道,或者将其任何部分或全部流重定向到相同的地方。您一般可以通过在某个 Subshell 中运行一个命令列表或通过在当前 Shell 中运行一个命令列表来实现此目的。
      在 Subshell 中运行命令列表
      使用括号将命令列表包括在单个组中。这样做将在一个新的 Subshell 中运行命令,并允许您重定向或收集整组命令的输出,如以下示例所示:

      清单 11. 好习惯 6 的示例:在 Subshell 中运行命令列表
      ~ $ ( cd tmp/a/b/c/ || mkdir -p tmp/a/b/c && > VAR=$PWD; cd ~; tar xvf -C $VAR archive.tar ) > | mailx admin -S "Archive contents"  

      在此示例中,该存档的内容将提取到 tmp/a/b/c/ 目录中,同时将分组命令的输出(包括所提取文件的列表)通过邮件发送到地址 admin
      当您在命令列表中重新定义环境变量,并且您不希望将那些定义应用于当前 Shell 时,使用 Subshell 更可取。
      在当前 Shell 中运行命令列表
      将命令列表用大括号 ({}) 括起来,以在当前 Shell 中运行。确保在括号与实际命令之间包括空格,否则 Shell 可能无法正确解释括号。此外,还要确保列表中的最后一个命令以分号结尾,如以下示例所示:

      清单 12. 好习惯 6 的另一个示例:在当前 Shell 中运行命令列表
      ~ $ { cp ${VAR}a . && chown -R guest.guest a && > tar cvf newarchive.tar a; } | mailx admin -S "New archive"  


      在 find 之外使用 xargs
      使用 xargs 工具作为筛选器,以充分利用从 find 命令挑选的输出。find 运行通常提供与某些条件匹配的文件列表。此列表被传递到 xargs 上,后者然后使用该文件列表作为参数来运行其他某些有用的命令,如以下示例所示:

      清单 13. xargs 工具的经典用法示例
      ~ $ find some-file-criteria some-file-path | > xargs some-great-command-that-needs-filename-arguments

      然而,不要将 xargs 仅看作是 find 的辅助工具;它是一个未得到充分利用的工具之一,当您养成使用它的习惯时,将会希望进行所有试验,包括以下用法。
      传递空格分隔的列表
      在最简单的调用形式中,xargs 就像一个筛选器,它接受一个列表(每个成员分别在单独的行上)作为输入。该工具将那些成员放置在单个空格分隔的行上:

      清单 14. xargs 工具产生的输出示例
      ~ $ xargs
      a
      b
      c
      Control-D
      a b c
      ~ $

      您可以发送通过 xargs 来输出文件名的任何工具的输出,以便为其他某些接受文件名作为参数的工具获得参数列表,如以下示例所示:

      清单 15. xargs 工具的使用示例
      ~/tmp $ ls -1 | xargs
      December_Report.pdf README a archive.tar mkdirhier.sh
      ~/tmp $ ls -1 | xargs file
      December_Report.pdf: PDF document, version 1.3
      README: ASCII text
      a: directory
      archive.tar: POSIX tar archive
      mkdirhier.sh: Bourne shell scrīpt text executable
      ~/tmp $

      xargs 命令不只用于传递文件名。您还可以在需要将文本筛选到单个行中的任何时候使用它:

      清单 16. 好习惯 7 的示例:使用 xargs 工具来将文本筛选到单个行中
      ~/tmp $ ls -l | xargs-rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf -rw-r--r-- 1 root root 238 Dec 03 08:19 README drwxr-xr-x 38 joe joe 354082 Nov 02 16:07 a -rw-r--r-- 3 joe joe 5096 Dec 14 14:26 archive.tar -rwxr-xr-x 1 joe joe 3239 Sep 30 12:40 mkdirhier.sh~/tmp $

      谨慎使用 xargs
      从技术上讲,使用 xargs 很少遇到麻烦。缺省情况下,文件结束字符串是下划线 (_);如果将该字符作为单个输入参数来发送,则它之后的所有内容将被忽略。为了防止这种情况发生,可以使用 -e 标志,它在不带参数的情况下完全禁用结束字符串。



      了解何时 grep 应该执行计数——何时应该绕过
      避免通过管道将 grep 发送到 wc -l 来对输出行数计数。grep-c 选项提供了对与特定模式匹配的行的计数,并且一般要比通过管道发送到 wc 更快,如以下示例所示:

      清单 17. 好习惯 8 的示例:使用和不使用 grep 的行计数
      ~ $ time grep and tmp/a/longfile.txt | wc -l
      2811

      real   0m0.097s
      user   0m0.006s
      sys   0m0.032s

      ~ $ time grep -c and tmp/a/longfile.txt
      2811

      real   0m0.013s
      user   0m0.006s
      sys   0m0.005s~ $

      除了速度因素外,-c 选项还是执行计数的好方法。对于多个文件,带 -c 选项的 grep 返回每个文件的单独计数,每行一个计数,而针对 wc 的管道则提供所有文件的组合总计数。
      然而,不管是否考虑速度,此示例都表明了另一个要避免地常见错误。这些计数方法仅提供包含匹配模式的行数——如果那就是您要查找的结果,这没什么问题。但是在行中具有某个特定模式的多个实例的情况下,这些方法无法为您提供实际匹配实例数量 的真实计数。归根结底,若要对实例计数,您还是要使用 wc 来计数。首先,使用 -o 选项(如果您的版本支持它的话)来运行 grep 命令。此选项 输出匹配的模式,每行一个模式,而不输出行本身。但是您不能将它与 -c 选项结合使用,因此要使用 wc -l 来对行计数,如以下示例所示:

      清单 18. 好习惯 8 的示例:使用 grep 对模式实例计数
      ~ $ grep -o and tmp/a/longfile.txt | wc -l
      3402
      ~ $

      在此例中,调用 wc 要比第二次调用 grep 并插入一个虚拟模式(例如 grep -c)来对行进行匹配和计数稍快一点。


      匹配输出中的某些字段,而不只是对行进行匹配
      当您只希望匹配输出行中特定字段 中的模式时,诸如 awk 等工具要优于 grep
      下面经过简化的示例演示了如何仅列出 12 月修改过的文件。

      清单 19. 坏习惯 9 的示例:使用 grep 来查找特定字段中的模式
      ~/tmp $ ls -l /tmp/a/b/c | grep Dec
      -rw-r--r-- 7 joe joe 12043 Jan 27 20:36 December_Report.pdf
      -rw-r--r-- 1 root root 238 Dec 03 08:19 README
      -rw-r--r-- 3 joe joe   5096 Dec 14 14:26 archive.tar
      ~/tmp $

      在此示例中,grep 对行进行筛选,并输出其修改日期和名称中带 Dec 的所有文件。因此,诸如 December_Report.pdf 等文件是匹配的,即使它自从一月份以来还未修改过。这可能不是您希望的结果。为了匹配特定字段中的模式,最好使用 awk,其中的一个关系运算符对确切的字段进行匹配,如以下示例所示:

      清单 20. 好习惯 9 的示例:使用 awk 来查找特定字段中的模式
      ~/tmp $ ls -l | awk '$6 == "Dec"'
      -rw-r--r-- 3 joe joe   5096 Dec 14 14:26 archive.tar
      -rw-r--r-- 1 root root 238 Dec 03 08:19 README
      ~/tmp $

      有关如何使用 awk 的更多详细信息,请参见参考资料


      停止对 cat 使用管道
      grep 的一个常见的基本用法错误是通过管道将 cat 的输出发送到 grep 以搜索单个文件的内容。这绝对是不必要的,纯粹是浪费时间,因为诸如 grep 这样的工具接受文件名作为参数。您根本不需要在这种情况下使用 cat,如以下示例所示:

      清单 21. 好习惯和坏习惯 10 的示例:使用带和不带 cat 的 grep
      ~ $ time cat tmp/a/longfile.txt | grep and
      2811
      real   0m0.015s
      user   0m0.003s
      sys   0m0.013s
      ~ $ time grep and tmp/a/longfile.txt
      2811
      real   0m0.010s
      user   0m0.006s
      sys   0m0.004s
      ~ $ [/pre]

      此错误存在于许多工具中。由于大多数工具都接受使用连字符 (-) 的标准输入作为一个参数,因此即使使用 cat 来分散 stdin 中的多个文件,参数也通常是无效的。仅当您使用带多个筛选选项之一的 cat 时,才真正有必要在管道前首先执行连接。



      结束语:养成好习惯
      最好检查一下您的命令行习惯中的任何不良的使用模式。不良的使用模式会降低您的速度,并且通常会导致意外错误。本文介绍了 10 个新习惯,它们可以帮助您摆脱许多最常见的使用错误。养成这些好习惯是加强您的 UNIX 命令行技能的积极步骤。
    • B/S结构简介及与C/S结构的区别

      2008-08-27 18:41:44

      一、什么是C/S和B/S

      要想对“C/S”和“B/S”技术发展变化有所了解,首先必须搞清楚三个问题。

      第一、什么是C/S结构。
      C/S (Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server 应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

      传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件, 加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高, 效率低。

      第二、什么是B/S结构。
      B/S(Browser/Server)结构即浏览器和服务器结构。它是随着Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端(Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。

      以目前的技术看,局域网建立B/S结构的网络应用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地点,以不同的接入方式(比如LAN, WAN, Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服务器数据库也很安全 。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

      第三、管理软件主流技术。
      管理软件技术的主流技术与管理思想一样,也经历了三个发展时期。首先,界面技术从上世纪DOS字符界面到Windows图形界面(或图形用户界面GUI),直至Browser浏览器界面三个不同的发展时期。其次,今天所有电脑的浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。

      二、C/S和B/S 之比较

      C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国 Borland公司最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可谓仁者见仁,智者见智。

      1、C/S架构软件的优势与劣势

      (1)、应用服务器运行数据负荷较轻。
      最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

      (2)、数据的储存管理功能较为透明。
      在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。

      (3)、C/S架构的劣势是高昂的维护成本且投资大。
      首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。

      其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。

      2、B/S架构软件的优势与劣势

      (1)、维护和升级方式简单。

      目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

      (2)、成本降低,选择更多。

      大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

      比如说很多人每天上“网易”(原文为新浪)网,只要安装了浏览器就可以了,并不需要了解“网易”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

      (3)、应用服务器运行数据负荷较重。

      由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。


      3,C/S 与 B/S 区别

      Client/Server是建立在局域网的基础上的,Browser/Server是建立在广域网的基础上的。

      (1)、硬件环境不同:

      C/S 一般建立在专用的网络上, 小范围里的网络环境, 局域网之间再通过专门服务器提供连接和数据交换服务。
      B/S 建立在广域网之上的, 不必是专门的网络硬件环境,例如电话上网, 租用设备, 信息自己管理, 有比C/S更强的适应范围, 一般只要有操作系统和浏览器就行。

      (2)、对安全要求不同

      C/S 一般面向相对固定的用户群, 对信息安全的控制能力很强。 一般高度机密的信息系统采用C/S 结构适宜,可以通过B/S发布部分可公开信息。
      B/S 建立在广域网之上, 对安全的控制能力相对弱, 面向是不可知的用户群。

      (3)、对程序架构不同

      C/S 程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。
      B/S 对安全以及访问速度的多重的考虑, 建立在需要更加优化的基础之上。 比C/S有更高的要求,B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk 2000 Exchange 2000等,全面支持网络的构件搭建的系统。SUN和IBM推的JavaBean构件技术等,使B/S更加成熟。

      (4)、软件重用不同

      C/S 程序可以不可避免的整体性考虑, 构件的重用性不如在B/S要求下的构件的重用性好。
      B/S 对的多重结构,要求构件相对独立的功能。 能够相对较好的重用。就如买来的餐桌可以再利用,而不是做在墙上的石头桌子。

      (5)、系统维护不同

      系统维护是软件生存周期中,开销大,相当重要
      C/S 程序由于整体性,必须整体考察,处理出现的问题以及系统升级难, 可能是再做一个全新的系统。
      B/S 构件组成方面构件个别的更换,实现系统的无缝升级。 系统维护开销减到最小,用户从网上自己下载安装就可以实现升级。

      (6)、处理问题不同

      C/S 程序可以处理用户面固定,并且在相同区域, 安全要求高的需求,与操作系统相关, 应该都是相同的系统。
      B/S 建立在广域网上, 面向不同的用户群,分散地域, 这是C/S无法作到的,与操作系统平台关系最小。

      (7)、用户接口不同

      C/S 多是建立在Window平台上,表现方法有限,对程序员普遍要求较高。
      B/S 建立在浏览器上, 有更加丰富和生动的表现方式与用户交流, 并且大部分难度减低,降低开发成本。

      (8)、信息流不同

      C/S 程序一般是典型的中央集权的机械式处理,交互性相对低。
      B/S 信息流向可变化, B-B、 B-C、 B-G等信息流向的变化, 更象交易中心
      回答者:tfrist - 秀才 二级 10-27 10:36
      其他回答共 1 条
      第一、什么是C/S结构。

      C/S(Client/Server)结构,即大家熟知的客户机和服务器结构。它是软件系统体系结构,通过它可以充分利用两端硬件环境的优势,将任务合理分配到Client端和Server端来实现,降低了系统的通讯开销。目前大多数应用软件系
      统都是Client/Server形式的两层结构,由于现在的软件应用系统正在向分布式的Web应用发展,Web和Client/Server应用都可以进行同样的业务处理,应用不同的模块共享逻辑组件;因此,内部的和外部的用户都可以访问新的和现有的应用系统,通过现有应用系统中的逻辑可以扩展出新的应用系统。这也就是目前应用系统的发展方向。

      传统的C/S体系结构虽然采用的是开放模式,但这只是系统开发一级的开放性,在特定的应用中无论是Client端还是Server端都还需要特定的软件支持。由于没能提供用户真正期望的开放环境,C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,加之产品的更新换代十分快,已经很难适应百台电脑以上局域网用户同时使用。而且代价高,效率低。



      第二、什么是B/S结构。

      B/S(Browser/Server)结构即浏览器和服务器结构。它是随着
      Internet技术的兴起,对C/S结构的一种变化或者改进的结构。在这种结构下,用户工作界面是通过WWW浏览器来实现,极少部分事务逻辑在前端
      (Browser)实现,但是主要事务逻辑在服务器端(Server)实现,形成所谓三层3-tier结构。这样就大大简化了客户端电脑载荷,减轻了系统维护与升级的成本和工作量,降低了用户的总体成本(TCO)。

      以目前的技术看,局域网建立B/S结构的网络应
      用,并通过Internet/Intranet模式下数据库应用,相对易于把握、成本也是较低的。它是一次性到位的开发,能实现不同的人员,从不同的地
      点,以不同的接入方式(比如LAN,WAN,Internet/Intranet等)访问和操作共同的数据库;它能有效地保护数据平台和管理访问权限,服
      务器数据库也很安全。特别是在JAVA这样的跨平台语言出现之后,B/S架构管理软件更是方便、快捷、高效。

      第三、管理软件主流技术。

      管理软件技术的主流技术与管理思想一样,也经历了三个发展时期。首先,界面技术从上世纪DOS字符界面到Windows图形界面(或图形用户界面GUI),直至Browser浏览器界面三个不同的发展时期。其次,今天所有电脑的
      浏览器界面,不仅直观和易于使用,更主要的是基于浏览器平台的任何应用软件其风格都是一样的,使用人对操作培训的要求不高,而且软件可操作性强,易于识
      别;再者,平台体系结构也从过去单用户发展到今天的文件/服务器(F/S)体系、客户机/服务器(C/S)体系和浏览器/服务器(B/S)体系。



      二、C/S和B/S之比较

      C/S和B/S是当今世界开发模式技术架构的两大主流技术。C/S是美国Borland公司
      最早研发,B/S是美国微软公司研发。目前,这两项技术以被世界各国所掌握,国内公司以C/S和B/S技术开发出产品也很多。这两种技术都有自己一定的市
      场份额和客户群,各家企业都说自己的管理软件架构技术功能强大、先进、方便,都能举出各自的客户群体,都有一大群文人墨客为自己摇旗呐喊,广告满天飞,可
      谓仁者见仁,智者见智。

      1、C/S架构软件的优势与劣势

      (1)、应用服务器运行数据负荷较轻。

      最简单的C/S体系结构的数据库应用由两部分组成,即客户应用程序和数据库服务器程序。二者可分别称为前台程序与后台程序。运行数据库服务器程序的机器,也称为应用服务器。一旦服务器程序被启动,就随时等待响应客户程序发来的请求;客户应用程序运行在用户自己的电脑上,对应于数据库服务器,可称为客户电脑,当需要对数据库中的数据进行任何操作时,客户程序就自动地寻找服务器程序,并向其发出请求,服务器程序根据预定的规则作出应答,送回结果,应用服务器运行数据负荷较轻。

      (2)、数据的储存管理功能较为透明。

      在数据库应用中,数据的储存管理功能,是由服务器程序和客户应用程序分别独立进行的,前台应用可以违反的规则,并且通常把那些不同的(不管是已知还是未知的)运行数据,在服务器程序中不集中实现,例如访问者的权限,编号可以重复、必须有客户才能建立定单这样的规则。所有这些,对于工作在前台程序上的最终用户,是“透明”的,他们无须过问(通常也无法干涉)背后的过程,就可以完成自己的一切工作。在客户服务器架构的应用中,前台程序不是非常“瘦小”,麻烦的事情都交给了服务器和网络。在C/S体系的下,数据库不能真正成为公共、专业化的仓库,它受到独立的专门管理。

      (3)、C/S架构的劣势是高昂的维护成本且投资大。

      首先,采用C/S架构,要选择适当的数据库平台来实现数据库数据的真正“统一”,使分布于两地的数据同步完全交由数据库系统去管理,但逻辑上两地的操作者要直接访问同一个数据库才能有效实现,有这样一些问题,如果需要建立“实时”的数据同步,就必须在两地间建立实时的通讯连接,保持两地的数据库服务器在线运行,网络管理工作人员既要对服务器维护管理,又要对客户端维护和管理,这需要高昂的投资和复杂的技术支持,维护成本很高,维护任务量大。

      其次,传统的C/S结构的软件需要针对不同的操作系统系统开发不同版本的软件,由于产品的更新换代十分快,代价高和低效率已经不适应工作需要。在JAVA这样的跨平台语言出现之后,B/S架构更是猛烈冲击C/S,并对其形成威胁和挑战。



      2、B/S架构软件的优势与劣势

      (1)、维护和升级方式简单。

      目前,软件系统的改进和升级越来越频繁,B/S架构的产品明显体现着更为方便的特性。对一个稍微大一点单位来说,系统管理人员如果需要在几百甚至上千部电脑之间来回奔跑,效率和工作量是可想而知的,但B/S架构的软件只需要管理服务器就行了,所有的客户端只是浏览器,根本不需要做任何的维护。无论用户的规模有多大,有多少分支机构都不会增加任何维护升级的工作量,所有的操作只需要针对服务器进行;如果是异地,只需要把服务器连接专网即可,实现远程维护、升级和共享。所以客户机越来越“瘦”,而服务器越来越“胖”是将来信息化发展的主流方向。今后,软件升级和维护会越来越容易,而使用起来会越来越简单,这对用户人力、物力、时间、费用的节省是显而易见的,惊人的。因此,维护和升级革命的方式是“瘦”客户机,“胖”服务器。

      (2)、成本降低,选择更多。
      大家都知道windows在桌面电脑上几乎一统天下,浏览器成为了标准配置,但在服务器操作系统上windows并不是处于绝对的统治地位。现在的趋势是凡使用B/S架构的应用管理软件,只需安装在Linux服务器上即可,而且安全性高。所以服务器操作系统的选择是很多的,不管选用那种操作系统都可以让大部分人使用windows作为桌面操作系统电脑不受影响,这就使的最流行免费的Linux操作系统快速发展起来,Linux除了操作系统是免费的以外,连数据库也是免费的,这种选择非常盛行。

      比如说很多人每天上“网易”(原文为新浪)网,只要安装了浏览器就可以了,并不需要了解“网易”的服务器用的是什么操作系统,而事实上大部分网站确实没有使用windows操作系统,但用户的电脑本身安装的大部分是windows操作系统。

      (3)、应用服务器运行数据负荷较重。

      由于B/S架构管理软件只安装在服务器端(Server)上,网络管理人员只需要管理服务器就行了,用户界面主要事务逻辑在服务器(Server)端完全通过WWW浏览器实现,极少部分事务逻辑在前端(Browser)实现,所有的客户端只有浏览器,网络管理人员只需要做硬件维护。但是,应用服务器运行数据负荷较重,一旦发生服务器“崩溃”等问题,后果不堪设想。因此,许多单位都备有数据库存储服务器,以防万一。

      3,C/S与B/S区别

      Client/Server是建立在局域网的基础上的,Browser/Server是建立在广域网的基础上的。

      (1)、硬件环境不同:C/S一般建立在专用的网络上,小范围里的网络环境,局域网之间再通过专门服务器提供连接和数据交换服务。



      B/S建立在广域网之上的,不必是专门的网络硬件环境,例如电话上网,租用设备,信息自己管理,有比C/S更强的适应范围,一般只要有操作系统和浏览器就行。



      (2)、对安全要求不同

      C/S一般面向相对固定的用户群,对信息安全的控制能力很强。一般高度机密的信息系统采用C/S结构适宜,可以通过B/S发布部分可公开信息。



      B/S建立在广域网之上,对安全的控制能力相对弱,面向是不可知的用户群。

      (3)、对程序架构不同

      C/S程序可以更加注重流程,可以对权限多层次校验,对系统运行速度可以较少考虑。



      B/S对安全以及访问速度的多重的考虑,建立在需要更加优化的基础之上。比C/S有更高的要求,B/S结构的程序架构是发展的趋势,从MS的.Net系列的BizTalk2000Exchange2000等,全面支持网络的构件搭建的系统。SUN和IBM推的JavaBean构件技术等,使B/S更加成熟。



      (4)、软件重用不同

      C/S程序可以不可避免的整体性考虑,构件的重用性不如在B/S要求下的构件的重用性好。

      B/S对的多重结构,要求构件相对独立的功能。能够相对较好的重用。就如买来的餐桌可以再利用,而不是做在墙上的石头桌子。

      (5)、系统维护不同

      系统维护是软件生存周期中,开销大,相当重要

      C/S程序由于整体性,必须整体考察,处理出现的问题以及系统升级难,可能是再做一个全新的系统。

      B/S构件组成方面构件个别的更换,实现系统的无缝升级。系统维护开销减到最小,用户从网上自己下载安装就可以实现升级。

      (6)、处理问题不同

      C/S程序可以处理用户面固定,并且在相同区域,安全要求高的需求,与操作系统相关,应该都是相同的系统。

      B/S建立在广域网上,面向不同的用户群,分散地域,这是C/S无法作到的,与操作系统平台关系最小。

      (7)、用户接口不同

      C/S多是建立在Window平台上,表现方法有限,对程序员普遍要求较高。

      B/S建立在浏览器上,有更加丰富和生动的表现方式与用户交流,并且大部分难度减低,降低开发成本。

      (8)、信息流不同

      C/S程序一般是典型的中央集权的机械式处理,交互性相对低。

      B/S信息流向可变化,B-B、B-C、B-G等信息流向的变化,更象交易中心。
    • Oracle杀入虚拟化战场

      2008-08-27 15:04:00

         07年11月12日,Oracle推出了一款新产品Oracle VM,它是用于服务器虚拟化的软件,支持Oracle和非Oracle的应用程序。世界领先的数据库软件生产商高调进军虚拟化领域,势必在已经很火的虚拟化市场掀起另一轮热潮。那么,Oracle的虚拟化产品到底有什么特色呢?

          首先,重要的Oracle产品都支持Oracle VM。据Oracle公司宣称,Oracle VM提供了可伸缩的、低成本的服务器虚拟化技术,这极大地提高了产品效率。此外,用户可以对整个虚拟环境进行支持,包括Liunx操作系统、Oracle数据库、Oracle融合中间件和Oracle管理软件等。而且,目前Oracle VM是免费的,对Linux和Windows都提供支持。

          Oracle VM由开源的服务器软件和一个集成的、基于Web浏览器的管理控制台组成,Oracle VM提供了一个易于管理的图形界面,可以创建和管理虚拟服务器池,运行基于x86的32位和64位系统。

          用户可以在系统的物理服务器上创建和管理虚拟机,感觉就像在独立的物理服务器上一样。使用Oracle VM创建的每个虚拟机都拥有自身的虚拟CPU、网络接口、存储和操作系统。使用Oracle VM,用户就拥有了一个易于使用并且基于浏览器的工具,可以创建、复制、共享、配置、启动和迁移虚拟机。 

          使用Oracle VM,用户就拥有了用于网格计算的集群、虚拟化、存储和管理能力。Oracle VM可以达到更好的平衡负载,从而能够更充分地利用资源。考虑到企业用户的需求,Oracle现在完全支持服务器虚拟化。据Oracle宣称,它是目前世界上惟一一家将服务器集群和服务器虚拟化技术整合在一起,从而交付完整的网格计算基础设施的软件厂商。 

          此外,Oracle VM可以直接安装在服务器硬件上,不需要主机操作系统。部署时,可通过预先配置的虚拟机器设置Oracle数据库和Oracle企业级Linux。它还拥有模板功能,从而使用户能够更轻松地创建虚拟机。它不需要其他特定的客户端软件,有浏览器即可使用。 

          Gartner认为,Oracle的解决方案使用Xen的开源技术开发出自己的虚拟化产品。将来 Oracle VM将会同Oracle Enterprise Manager进行集成。同时,尽管Oracle宣称提高了Oracle VM的性能,但是用户还是要对此持保留态度,因为I/O的性能主要依赖于硬件性能的变化,所以用户不能期望虚拟化厂商的产品性能之间有什么质的不同。
    • mysql存储过程学习及java调用存储过程

      2008-08-26 21:21:25

         首先在mysql中练习下存储过程的小例子:   
      mysql> delimiter //
      mysql
      > create procedure hello()
          
      -> begin
          
      -> select 'It is not a HelloWorld';
          
      -> end
          
      -> //
      Query OK, 
      0 rows affected (0.01 sec)
      其中“delimiter //”的意思是定义结束符号为“//”,以此来替换mysql中的“;”
      在mysql中查询上面的过程hello():
      mysql> call hello()//
      +------------------------+
      | It is not a HelloWorld |
      +------------------------+
      | It is not a HelloWorld |
      +------------------------+
      1 row in set (0.00 sec)
      建立一个简单的测试用表:
      mysql> DROP TABLE IF EXISTS `userinfo`.`mapping`;
          
      -> CREATE TABLE  `userinfo`.`mapping` (
          
      ->   `cFieldID` smallint(5) unsigned NOT NULL,
          
      ->   `cFieldName` varchar(30NOT NULL,
          
      ->   PRIMARY KEY  (`cFieldID`)
          
      -> ) ENGINE=InnoDB DEFAULT CHARSET=utf8;
          
      -> //
      Query OK, 
      0 rows affected (0.14 sec)
      向table mapping中插入一些初始化的数据:
      mysql> load data infile 'd:\\userInfo\\field.txt' into table mapping
          
      -> fields terminated by ',' lines terminated by '\r\n' //
      Query OK, 
      5 rows affected (0.02 sec)
      Records: 
      5  Deleted: 0  Skipped: 0  Warnings: 0
      mysql
      > select *from mapping//
      +----------+-------------+
      | cFieldID | cFieldName  |
      +----------+-------------+
      |        1 | MarketValue |
      |        2 | P/L         |
      |        3 | EName       |
      |        4 | Nominal     |
      |        5 | Chg         |
      +----------+-------------+
      5 rows in set (0.02 sec)
      现在简历一个向mapping中插入一条记录并返回记录的总和
      mysql> drop procedure if exists mappingProc;
          
      ->  create procedure mappingProc(out cnt int)
          
      ->  begin
          
      ->  declare maxid int;
          
      ->  select max(cFieldID)+1 into maxid from mapping;
          
      ->  insert into mapping(cFieldID,cFieldName) values(maxid,'hello');
          
      ->  select count(cFieldID) into cnt from mapping;
          
      ->  end
          
      ->  //
      查找mappingProc():
      mysql> call mappingProc(@a)//
      mysql
      > select @a//
      +------+
      | @a   |
      +------+
      | 6    |
      +------+
      mysql> select * from mapping//
      +----------+-------------+
      | cFieldID | cFieldName  |
      +----------+-------------+
      |        1 | MarketValue |
      |        2 | P/L                 |
      |        3 | EName          |
      |        4 | Nominal     |
      |        5 | Chg         |
      |        6 | hello       |
      +----------+-------------+
      下面是java代码用来调用MySQL的存储过程:
      package kissJava.sql;
      import java.sql.CallableStatement;
      import java.sql.Connection;
      import java.sql.DriverManager;
      import java.sql.SQLException;
      import java.sql.Types;
      public class SQLUtils {
          String url 
      = "jdbc:mysql://127.0.0.1:3306/userInfo"
          String userName 
      = "root";
          String password 
      = "zhui007";
          
      public Connection getConnection() {
              Connection con
      =null;
              
      try{
                  DriverManager.registerDriver(
      new com.mysql.jdbc.Driver());
                  con 
      = DriverManager.getConnection(url, this.userName, this.password);
              }
      catch(SQLException sw)
               }

              
      return con;
          }

          
      public void testProc(){
              Connection conn 
      = getConnection();
              CallableStatement stmt 
      = null;
              
      try{
                  stmt 
      = conn.prepareCall("{call mappingProc(?)}");    
                  stmt.registerOutParameter(
      1, Types.INTEGER);
                  stmt.execute();
                  
      int i= stmt.getInt(1);
                  System.out.println(
      "count = " + i);
              }
      catch(Exception e){
                  System.out.println(
      "hahad = "+e.toString());
              }
      finally{
                  
      try {
                      stmt.close();
                      conn.close();
                  }
      catch (Exception ex) {
                      System.out.println(
      "ex : "+ ex.getMessage());
                  }

              }

          }

          
      public static void main(String[] args) {
              
      new SQLUtils().testProc();
          }

      }
      在到MySQL中查询可看到插入一条新的记录
    • ORACLE系统特点

      2008-08-26 21:09:57

         ORACLE公司于1979年,首先推出基于SQL标准的关系数据库产品,可在100多种硬件平台上运行(所括微机、工作站、小型机、中型机和大型机),支持很多种操作系统。用户的ORACLE应用可方便地从一种计算机配置移至另一种计算机配置上。ORACLE的分布式结构可将数据和应用驻留在多台计算机上,而相互间的通信是透明的。1992年6月ORACLE公司推出的ORACLE7协同服务器数据库,使关系数据库技术迈上了新台阶。根据IDG(国际数据集团)1992年全球UNIX数据库市场报告,ORACLE占市场销售量50%。它之所以倍受用户喜爱是因为它有以下突出的特点:

      l        支持大数据库、多用户的高性能的事务处理。ORACLE支持最大数据库,其大小可到几百千兆,可充分利用硬件设备。支持大量用户同时在同一数据上执行各种数据应用,并使数据争用最小,保证数据一致性。系统维护具有高的性能,ORACLE每天可连续24小时工作,正常的系统操作(后备或个别计算机系统故障)不会中断数据库的使用。可控制数据库数据的可用性,可在数据库级或在子数据库级上控制。

      l        ORACLE遵守数据存取语言、操作系统、用户接口和网络通信协议的工业标准。所以它是一个开放系统,保护了用户的投资。美国标准化和技术研究所(NIST)对ORACLE7 SERVER进行检验,100%地与ANSI/ISO SQL89标准的二级相兼容。

    • SQLServer与Oracle

      2008-08-24 17:41:54

         随着信息技术的飞速发展,数据处理不仅在数量上要求越来越大,而且在质量上也要求越来越高。Oracle数据库在大多数企业中受到广泛使用,而SQL Server数据库也因为和Windows的联系,在企业中的使用也是非常广泛。


         操作系统的稳定对数据库来说是十分紧要的,在数据库可操作平台上,Oracle可在所有主流平台上运行,Oracle数据库采用开放的策略目标,它使得客户可以选择一种最适合他们特定需要的解决方案。客户可以利用很多种第三方应用程序、工具。对开发商来说是很大的支持。而SQL Server却只能在Windows上运行了,这个就显得比较单调了,但SQL Sever在Window平台上的表现,和Windows操作系统的整体结合程度,使用方便性,和Microsoft开发平台的整合性都比Oracle强的很多。但Windows操作系统的稳定性及可靠性大家是有目共睹的,再说Microsoft公司的策略目标是将客户都锁定到Windows平台的环境当中,只有随着Windows性能的改善,SQL Server才能进一步提高。从操作平台这点上Oracle是完全优胜于SQL Server的了。


         从资料上可以看到,Oracle的安全认证获得最高认证级别的ISO标准认证,而SQL Server并没有获得什么安全认证。这方面证明了Oracle的安全性是高于SQL Server的。


         购买一个产品,首先考虑的当然是产品的性能了,当考虑性能的同时当然少不了究竟要花多少钱在这产品也是个很关键的问题。要建立并运行一个数据库系统。不仅仅包含最初购置软件、硬件的费用,还包含了培训及以后维护的费用。Orcale数据库的价格是远比SQL Server数据库要高,为什么Oracle数据库比SQL Server数据库价格上要高出那么多,一方面Oracle的初始花费相对较高,特别是在考虑工具软件的时候,Oracle很多工具软件需要另外购买,与Microsoft提供免费的SQL Server工具软件相比,Oracle更显价格的不菲。但由于SQL Server只能在Windows下运行的原因,普遍认为SQL Server数据库的可靠性是比较差的。Oracle的性能优势体现在他的多用户上,而SQL Server的性能优势在多用户上就显得力不从心了。


         操作上SQL Server明显要比Orcale简单,如果你用过Java和DOTNET的开发平台,区别的基本就是Oracle和SQL Server不同,Oracle的界面基本是基于Java的,大部分的工具是Dos界面的,甚至SQLPlus也是, SQL Server是跟VB一样,全图形界面,很少见到DOS窗口。SQL Server中的企业管理器给用户提供一个全图形界面的集成管理控制台来集中管理多个服务器。Oracle也有自己的企业管理器,而且它的性能在某些方面甚至超过了SQL Server的企业管理器,但它安装较为困难。



         Orcale数据库和SQL Server数据库那个更快?其实是一个很难答的问题,因为存在许多不定因素,包括处理类型、数据分布以及硬件基础设施等。


         SQL Server 2000是一个具备完全Web支持的数据库产品,提供了可扩展标记语言核心支持以及Internet上和防火墙外进行查询的能力,具有可伸缩性、灵活性、扩充性好,而且价格便宜等特点,而Oracle则有着可靠安全性,速度比SQL Server快上百倍,但其价格在实施中却比SQL Server它高出了几百倍。


         其实各行业考虑选择那种数据库,是由数据库的特点以及根据自己的业务需求和基础设施综合考虑来决定的。 


      Oracle中有复合数据类型 SQL Server中没有
      声明方式:变量名 对象名%type
      这里的变量类型可以是所有以存在的数据类型,具有依赖性 ,存储过程中用这种变量比较灵活,但效率应该会低些

      oracle存储过程中借助cursor类型变量返回并访问记录集 sql server中我没用过类似功能



      oracle里这么用:存储过程中边查询边给变量赋值
      select 某一列名 into 变量名 from table where ..;
      相当于oracle中的select 变量名=列....
    • PHP?

      2008-08-24 17:28:24

          PHP,一个嵌套的缩写名称,是英文超级文本预处理语言(PHP:Hypertext Preprocessor)的缩写。PHP 是一种 HTML 内嵌式的语言,PHP与微软的ASP颇有几分相似,都是一种在服务器端执行的嵌入HTML文档的脚本语言,语言的风格有类似于C语言,现在被很多的网站编程人员广泛的运用。PHP 独特的语法混合了 C、Java、Perl 以及 PHP 自创新的语法。它可以比 CGI 或者 Perl 更快速的执行动态网页。用PHP做出的动态页面与其他的编程语言相比,PHP是将程序嵌入到HTML文档中去执行,执行效率比完全生成HTML标记的CGI要高许多;与同样是嵌入HTML文档的脚本语言Javascrīpt相比,PHP在服务器端执行,成分利用了服务器的性能;PHP执行引擎还会将用户经常访问的PHP程序驻留在内存中,其他用户在一次访问这个程序时就不需要诚信编译程序了,只要直接执行内存中的代码就可以了,这也是PHP高效率的体现之一。PHP具有非常强大的功能,所有的CGI或者Javascrīpt的功能PHP都能实现,而且支持几乎所有流行的数据库以及操作系统。

      PHP 最初是1994年Rasmus Lerdorf创建的,刚刚开始只是一个简单的用Perl语言编写的程序,用来统计他自己网站的访问者。后来又用C语言重新编写,包括可以访问数据库。在1995年以Personal Home Page Tools (PHP Tools) 开始对外发表第一个版本,Lerdorf写了一些介绍此程序的文档,并且发布了PHP1.0。在这早期的版本中,提供了访客留言本、访客计数器等简单的功能。以后越来越多的网站使用了PHP,并且强烈要且增加一些特性,比如循环语句和数组变量等等,在新的成员加入开发行列之后,在1995年中,PHP2.0发布了。第二版定名为PHP/FI(Form Interpreter)。PHP/FI加入了对mSQL的支持,从此建立了PHP在动态网页开发上的地位。到了1996年底,有15000个网站使用 PHP/FI;时间到了1997年中,使用PHP/FI的网站数字超过五万个。而在1997年中,开始了第三版的开发计划,开发小组加入了 Zeev Suraski 及 Andi Gutmans,而第三版就定名为PHP3。2000年,PHP4.0又问世了,其中增加了许多新的特性。

      PHP的特性包括:

      开放的源代码:所有的PHP源代码事实上都可以得到。

      PHP是免费的。

      基于服务器端:由于PHP是运行在服务器端的脚本,可以运行在UNIX、LINUX、WINDOWS下。

      嵌入HTML:因为PHP可以嵌入HTML语言,所以学习起来并不困难。

      简单的语言:PHP坚持脚本语言为主,与Java以C++不同。

      效率高:PHP消耗相当少的系统资源。

      图像处理:用PHP动态创建图像

      PHP 3与PHP 4的比较

      PHP3跟Apache服务器紧密结合的特性;加上它不断的更新及加入新的功能;而且几乎支持所有主流与非主流数据库;再以它能高速的执行效率,使得PHP在1999年中的使用站点已经超过了150000万。加上它的源代码完全公开,在 Open Source意识抬头的今天,它更是这方面的中流砥柱。不断地有新的函数库加入,以及不停地更新的活力,使得PHP无论在UNIX、LINUX或是Windows的平台上都可以有更多新的功能。它提供丰富的函数,使得在程序设计方面有着更好的支持。

      PHP4.0整个脚本程序的核心大幅更动,让程序的执行速度,满足更快的要求。在最佳化之后的效率,已较传统CGI或者ASP等程序有更好的表现。而且还有更强的新功能、更丰富的函数库。无论您接不接受,PHP 都将在 Web CGI 的领域上,掀起巅覆性的革命。对于一位专业的Web Master 而言,它将也是必修课程之一。

      PHP 4.0是更有效的,更可靠的动态Web页开发工具,在大多数情况运行比 PHP 3.0要快,其脚本描述更强大并且更复杂, 最显著的特征是速率比的增加。PHP4.0这些优异的性能是PHP 脚本引擎重新设计产生的结果:引擎由 AndiGutmans 和 Zeev Suraski从底层全面重写。PHP4.0 脚本引擎 ——Zend 引擎,使用了一种更有效的编译——执行方式, 而不是PHP 3.0 采用的执行 ——当解析时模型。

      PHP4在3.0版的基础上增加或增强了许多有用的特征,主要如下:

      (1)别名:在PHP4中,可以利用引用为变量赋值,这给编程带来了很大的灵活性。

      (2)扩充了API 模块:PHP 4.0 为扩展的 API 模块的提供了扩展PHP接口模块, 它比旧的 API 版本显著地快。 PHP 模块已有的及最常用的接口多数被转换到使用这个扩展的接口。

      (3)自动资源释放:PHP4增加了引用计数功能,这种新技术的引入使PHP4具有了自动内存管理功能,减轻了开发人员的负担。

      (4)布尔类型:PHP 4.0 支持布尔类型。

      (5)进程生成:在 UNIX 环境下的 PHP 4.0 提供了一个很智能和通用的生成进程, 使用了一种名为基于automake/libtool的系统生成技术。

      (6)COM/DCOM 支持:PHP 4.0 提供 COM/DCOM 支持 ( 仅用于Windows 环境 ) 可以无缝地存取和访问 COM 对象。

      (7)与PHP 3.0 兼容性很好:PHP 4.0 是与 PHP 3.0 代码向后兼容性接近100% 。由于 PHP 4 的改进的体系结构,两者有一些细微的差别,但是大多数人将可能永远不可能遇上这种情况。

      PHP介绍

      (8)配置:PHP4重新设计和增强了PHP。ini文件,这使得用PHP。ini来配置PHP显得极为容易,这个文件可以在运行时被Apache(unix系统)或由Windows 注册(Windows 环境)。

      (9)加密支持:PHP4实现了完整的加密, 这些加密功能是一个完整的mycrypt库,并且 PHP 4.0 支持哈希函数。Blowfish,TripleDES,MD5,并且SHA1 也是可使用的一些加密算法。

      (10)类型检查:PHP 4.0 支持同一操作符用于评类型检查:===( 3 等号运算符 ), 为在两个值和其类型之间作检查。例如, 3 ===3 将视为假 ( 类型是不同的 ), 而 3 ==3 ( 相等判断 ) 将视为真。

      (11)FTP 支持:PHP 4.0 支持 FTP 。通常, 你会为通过一个调制解调器连接下载一个大文件提供一个接口。然而, 如果你确实有需要,可以使用PHP 。

      (12)PHP4新增函数或功能增强函数:PHP 4.0 新增了许多函数,同时也将许多现有的函数功能进行了增强,以下是一些例子。 array_count_values() eval() foreach() nclude() ob_end_clean() ob_end_flush() ob_get_contents() ob_start() strip_tags() unset()

      (13)here打印:PHP 4.0 的Here打印是与Perl类似的, 尽管完全不相同。Here是打印大容量文章的一个有用的方法,例如在 HTML文件中,不会漏掉任何一个字符,例如目录标记。

      (14)HTTP Session fallback 系统:为 HTTP Session管理的一个 fallback 系统在 PHP 4.0被实现 。缺省情况下,Session标识符由cookies存储。如果没有cookies支持或一项cookies任务失败,Session标识符自动被创建并在 URL 的查询字符串中被携带。

      (15)ISAPI 支持:PHP 4.0 能作为一个个性化的 ISAPI 模块作为 IIS插件 。这比 PHP 3.0 更有效, 它作为一个外部的程序来运行。

      (16)内存:PHP 4.0 能更有效的使用内存, 导致较少的内存占用消耗,这主要归功于引用计数技术的实现。

      (17)其他类成员函数:在 PHP 4.0 你能在成员函数本身的作用域或全局范围内调用其他类的成员函数。例如,你能用一个子函数覆盖父函数,并在子函数中调用父函数。

      (18)多维数组:在 PHP 4.0 ,利用GET,POST,Cookies的进行的数据传输支持多维数组。

      (19)个性化的 HTTP Session支持:HTTP Session处理, 包括 fallback 系统管理,在 PHP 4.0被它的新库函数实现 。在版本 3.0 中处理Session要求使用 PHPLIB 和第三方的库函数, 它比把Session直接地由 PHP 支持慢了许多。

      (20)个性化的 Java 支持:PHP 4.0 支持和java的交互。这种个性化的Java 支持为PHP 在 Java 对象上创建和使用方法提供一个简单并且有效的工具。

      21)对象和数嵌套组:PHP 4.0 实现了功能更加强大的对象, 移去了 PHP 3.0存在的种种句法限制。对象能在数组以内被嵌套并且反过来也如此, 可以根据你的需要实现嵌套。

      (22)面向对象的编程:PHP 4.0 为面向对象的编程和构造类及对象提供扩展的功能和新特征。PHP4实现了对象重载,引用技术等新技术。

      (23)对象重载支持:对象重载语法允许第三方的基于面向对象的类库使用 PHP4 的面向对象的特征存取他们自身的功能。使用这个特征的一个 COM 模块已经被实现了。

      (24)输出缓冲支持:PHP 提供了一个输出缓冲函数集合。输出缓冲支持允许你写包裹函数功能压缩缓冲区。在 PHP4 的输出缓冲支持允许 HTML 头信息存放, 无论 HTML的正文是否输出。头信息( (header(), content type, and cookies ) 不采用缓冲 。

      (25)增加了PCRE 库:PHP 4.0 包括一个 Perl 兼容的正则表达式 (PCRE ) 库, 和正常regex库一起与 PHP 绑定。split 和replace PCRE 功能被支持。PCRE 和 Perl 正规表达式之间有一些细微差别。

      (26)PHP.ini 文件:PHP.ini文件在 PHP4.0 被重新设计, 使用的 PHP 的配置PHP.ini是更容易并且更有效的。全部文件能被Apache 在运行时间操作 ( 在 Apache环境 下 ) 或由 Windows 注册表 ( 在 Windows 下面 ) 。被加入PHP.ini文件的配置指令自动地在所有相关的模块中被支持。

      (27)引用计数:PHP 4.0 为系统中的每个数值提供了引用计数, 包括资源。一旦一个资源不再被任何变量引用,它自动地被释放以节省内存资源。利用这个特征的最明显的例子一个内置SQL查询的循环语句。在PHP 3.0中 ,每次递归另外的 SQL 结果集合重复申请内存,直到脚本执行完毕,这些结果集合占用的内存才被释放。

      (28)支持引用:通过引用可以改变一个变量的值。

      (29)函数的运行时绑定:PHP 4.0 的运行时间绑定功能允许你在他们被声明以前调用, 无论声明是否在代码以后或是在运行时间。

      (30)类的运行时信息:PHP 4.0 支持在运行时刻存取下列类信息:一个对象的类名,一个对象的父类的类名字,以及对象函数所在的名字。

      (31)服务器抽象层:为支持Web服务器提供了增强型 SAPI ( 服务器 API ) 接口,是 PHP 4。0 不可分的一部分。这个服务器抽象层,提供了通用的WEB服务器接口支持,支持多线程WEB服务器,为大多数的WEB服务器提供透明的支持, 这些服务器包括 Apache ,IIS ( ISAPI ), 以及 AOL 服务器。
    • linux下apache+php+mysql

      2008-08-24 17:24:42

      “/etc/ssh/sshd_config”是OpenSSH的配置文件,允许设置选项改变这个daemon的运行。这个文件的每一行包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(sshd (8))可以得到详细的列表。“/etc/ssh/sshd_config”是OpenSSH的配置文件,允许设置选项改变这个daemon的运行。这个文件的每一行包含“关键词-值”的匹配,其中“关键词”是忽略大小写的。下面列出来的是最重要的关键词,用man命令查看帮助页(sshd (8))可以得到详细的列表
    • Linux学习(远程控制跟IP地址配置)

      2008-08-24 17:23:30


      这次的主要课题:远程控制跟IP地址配置。

      ssh (putty,secure crt)linux远程管理

      远程控制

      开通ssh端口跟IP地址

      安装linux的时候,ssh自带的也给安装上了,但并不能直接使用,还需要激活:

      激活ssh:
       /etc/rc.d/init.d/sshd start
       service sshd start
       netstat -tl

      激活以后,每次开机还都得重新激活。

      可以在启动linux时自动启动ssh:
       在文件/etc/rc2.d/S99local里面加入 /usr/sbin/sshd &
       (/usr/sbin/sshd 是ssh启动的)

      这样每次开机以后就不用再次激活,直接就可以远程控制。


      配置IP地址:
        /etc/sysconfig/network-scrīpts/ifcfg-eth0

      里面的内容:
      [root@localhost network-scrīpts]# cat ifcfg-eth0
      DEVICE=eth0
      BOOTPROTO=none
      ONBOOT=yes
      TYPE=Ethernet
      NETMASK=255.255.255.0
      IPADDR=192.168.0.2
      USERCTL=no
      PEERDNS=yes
      GATEWAY=192.168.0.1

        配置完以后:
       /etc/init.d/network reload 或 service network

      查看网卡信息: route -n查看物理网卡:mii-tool重启eth0: ifup eth0查看eth0信

      息:ethtool eth0添加IP地址:ifconfig eth0 IP netmask 子网掩码 broadcast 广播地址 

    • windows下PHP+MYSQL+APACHE配置详细解析

      2008-08-24 17:18:16

      一、使用软件: 
           Apache_2.0.52-win32-x86-no_ssl  
           php-5.0.2-Win32
           mysql-4.0.21-win
           phpMyAdmin-2.6.0
      配置环境:
      Windows Xp sp2
      二、具体步骤

      注意事项:安装过程,任何目录和文件名都不要使用空格,

      不要使用D:\Program Files 而要使用
      D:\ProgramFiles 
      1. apache_2.0.52-win32-x86-no_ssl  
      apache
      服务器软件,我下载的是win版本,2.0系列的配置都是相似的。

      双击安装apache2.0.52,我把它安装到D:\ApacheGroup 注意,目录名不要包含空格,否则下面设置php会出错。安装结束后,apache自动运行,在浏览器里输入http://127.0.0.1是不是显示出了默认的网页,如果你不希望看到这个页面,可以到D:\ApacheGroup\Apache2\conf 目录下找到 httpd.conf 打开编辑,并查找 DocumentRoot " 2.0系列的版本中,只会找到一个 DocumentRoot " ,把引号内的路径改为你自己的路径就可以了,比如 DocumentRoot "D:/php" 现在默认的根目录就是 D:/php 注意这里用的是“/”。

      2
      、安装
      php5.0.2
      下载过来的php-5.0.2-Win32一般是个zip格式的压缩包,解压缩到D:\ApacheGroup 目录下,并使文件都在一个文件夹下,改文件夹名为php5 ,这样方便接下来的工作。现在我们看到 D:\ApacheGroup 下面已经有两个文件夹了, 一个是 apache2(安装apache2.0.52自动生成的一个文件夹另一个是 php5 ,我的方式是每一个软件一个文件夹,并且这些文件夹在同一目录下, 这样便于查找。 好了,我们现在开始配置apache 使它支持
      php5 .
      首先,找到 D:\ApacheGroup\php5 目录下的php.ini-dist 重命名为php.ini 并复制到C:\WINDOWS 目录下,

      然后,复制 D:\ApacheGroup\php5 目录下的php5ts.dll,libmysql.dll 
      C:\windows\system 
      接下去,我们开始配置 D:\ApacheGroup\Apache2\conf 下的 httpd.conf文件,打开httpd.conf (可用记事本打开
      )
      ①找到 AddDefaultCharset ISO-8859-1 将其改为 AddDefaultCharset GB2312 (让默认语言编码为简体中文)

      ②找到DirectoryIndex index.html index.html.var 在后面加入
       index.htm index.php index.php3
       --------------
      模块化安装配置
      ------------------------------------ 
      找到 #LoadModule ssl_module modules/mod_ssl.so 这行,在此行后加入一行
       
      LoadModule php5_module D:/ApacheGroup/php5/php5apache2.dll 
      其中D:/ApacheGroup/php5/ 为你php目录

      查找
      #AddEncoding x-gzip .gz .tgz 
      在下面的行中加入
      AddType application/x-httpd-php .php .phtml .php3 .php4
      即增加解析文件类型为
      php.phtml.php3.php4

      这里要做的主要有两个,一个是复制php.ini到系统盘,另一个就是配置httpd.conf使其支持php5,这里要求绝对路径中,例如D:/ApacheGroup/php5/ 中间不能出现空格,否则apache2.0.52将出错!

      好了,现在看看你的apache是不是已经支持php了呢,呵呵,成功了吧!


      3
      、安装
      mysql-4.0.21-win
      因为在win环境下配置apache所以,这里用的mysql也是win版本的。解压缩之后,安装mysql4.0.21D:/ApacheGroup/ 目录下,并使mysql完整的安装到 mysql目录下(可以在选择安装路径的更改文件夹名字),好了,装mysql没什么具体要求,主要是下一步的配置。首先启动mysql(如果已经启动自然不用再去启动了,看看任务栏有没有小绿灯就知道了)再提一下,现在我的mysql已经安装到 D:\ApacheGroup\Mysql 目录下了, 那么进入 D:\ApacheGroup\Mysql\bin 找到winmysqladmin.exe 双击,mysql自动启动运行。好了。开始配置php.ini了。进入C:\WINDOWS 打开 php.ini 找到extension_dir = "./" 改为
      extension_dir = "D:/ApacheGroup/php5/ext" 
      找到
       
      ;extension=php_mysql.dll 
      ';'去掉改为
       
      extension=php_mysql.dll 
      找到
       
      ;session.save_path = "/tmp" 
      ';'去掉 设置你保存session的目录,如
       
      session.save_path = " D:/ApacheGroup/php5/session_temp"; 
      好了,到这里已经成功了!

      4
      phpMyAdmin-2.6.0的配置

      phpMyAdmin-2.6.0.zip解压到自己定义的 查看(503) 评论(0) 收藏 分享 管理

    • 品质管理网

      2008-08-20 11:55:01

    • QA和QC的区别

      2008-08-20 11:45:29

      QA=Quality Assurance, 质量保证
      QC=Quality Control,质量控制

      区别:

      1.QA偏重于质量管理体系的建立和维护,客户和认证机构质量体系审核工作,质量培训工作等;QC主要集中在质量检验和控制方面。
      QA的工作涉及公司的全局,各个相关职能,覆盖面比较宽广,而QC主要集中在产品质量检查方面,只是质量工作的其中一个方面。

      2.QA并不是立法机构
      立法机构应该是R&D,或工艺工程部门
      QA主要是保证生产过程受控或保证产品合格,着重于维护,
      而QC一般是实际质量控制,如检验,抽检,确认,很多公司只有质量部只包括QA的职责,把QC的工作放入生产部门
    • MySQL新增的复制特性的测试

      2008-08-19 09:18:34

          通过测试我们发现,可以使用它新增的复制特性来与备份数据库服务器保持数据同步,这样当主服务器因为某种原因处理失效时,能够使用备份机处理所有的查询。对于这样的要求,配置两台服务器并不困难。我将详细讨论整个处理过程,同时讨论一下当主服务器失效时,如何使用PHP来重定向查询。

        MySQL内部复制功能是建立在两个或两个以上服务器之间,通过设定它们之间的主-从关系来实现的。其中一个作为主服务器,其它的作为从服务器。我将详细讨论如何配置两台服务器,将一个设为主服务器,另一个设为从服务器。并且描述一下在它们之间进行切换的处理过程。我是在MySQL的3.23.23版本上进行的配置设置过程,并且也是在这个版本上进行的测试。MySQL开发人员建议最好使用最新版本,并且主-从服务器均使用相同的版本。同时MySQL 3.23版本仍然是beta测试版,而且这个版本可能不能向下兼容。所以因为这个原因,在实际的网站中,我现在还没有使用这个版本。拥有容错能力具有一个好处是,在不需中断任何查询的情况下,对服务器进行升级。

        第一步:配置主服务器

        在这篇文章的剩下篇幅中,我将指定两台服务器。A(IP为10.1.1.1)作为主服务器(简称为主机)。B(IP为10.1.1.2)作为后备服务器(简称为备机)。

        MySQL的复制功能的实现过程为:备机(B)与主机(A)连接,然后读出主机的二进制更新日志,再将发生的变化合并到自已的数据库中。备机需要一个用户帐号来与主机连接,所以在主机上创建一个帐号,并只给它FILE权限,如下操作:

        GRANT FILE ON *.* TO replicate@10.1.1.2 IDENTIFIED BY password;

        为了备机能够与主机连接,要在主机上运行FLUSH PRIVILEGES,不过不要担心,因为我们将在下面的步骤中停掉服务器。

        现在我们需要主机数据库的一个快照,并且对主机进行配置,允许生成二进制的更新日志。首先编辑my.cnf文件,以便允许二进制更新日志,所以在[mysqld]部分的下面某个地方增加一行:log-bin。在下一次服务器启动时,主机将生成二进制更新日志(名为:<主机名>-bin.<增量序号#>)。为了让二进制更新日志有效,关闭MySQL服务程序,然后将主机上的所有数据库目录到另一个目录中,接着重新启动mysqld。

        请确定得到了所有数据库,否则在进行复制时,如果一个表在主机上存在但在备机上不存在,将因为出错而退出。现在你已经得到了数据的快照,和一个从建立快照以来的二进制日志,上面记录着任何对数据库的修改。请注意MySQL数据文件(*.MYD,*.MYI和*.frm)是依赖于文件系统的,所以你不能仅仅进行文件传输,如从Solaris到Linux。如果你处于一个异种的服务器环境,你将不得不使用mysqldump实用程序或其它的定制脚本来得到数据快照。


        第二步:配置备机

        让我们继续。停掉备机上的MySQL服务程序,并且把从主机上拷贝来的数据库目录移到备机上的data目录下。请确认将目录的拥有者和属组改变为MySQL用户相应值,并且修改文件模式为660(只对拥有者和属组可读、可写),目录本身为770(只对拥有者和属组可读、可写和可执行)。

        继续。在备机上启动MySQL服务程序,确认MySQL工作正常。运行几个select查询(不要update或insert查询),看一看在第一步中得到的数据快照是否成功。接着,在测试成功后关掉MySQL服务程序。

        在备机上配置需要访问的主机,以便接收主机的更改。所以需要编辑务机上的my.cnf文件,在[mysqld]部分中增加下面几行:

        master-host=10.1.1.1 master-user=replicate master-password=password

        在启动备机服务程序后,备机服务程序将查看在my.cnf文件中所指定的主机,查看是否有改变,并且将这些改变合并到自已的数据库中。备机保持了主机的更新记录,这些记录是从主机的master.info文件中接收下来的。备机线程的状态可以通过sql命令SHOW SLAVE-STATUS看到。在备机上处理二进制日志中如果发生错误,都将导致备机线程的退出,并且在*.err的日志文件中生成一条信息。然后错误可以被改正,接着可以使用sql语句SLAVE START来重新启动备机线程。线程将从主机二进制日志处理中断的地方继续处理。

        至此,在主机上所发生的数据改变应该已经复制到备机上了,要测试它,你可以在主机上插入或更新一条记录,而在备机上选择这条记录。

        现在我们拥有了从A机到B机的这种主-从关系,这样当A机可能当机的时候,允许我们将所有的查询重定向到B机上去,但是当A机恢复时,我们没有办法将发生的改变恢复到A机中去。为了解决这个问题,我们创建从B机到A机的主-从关系。

        第三步:创建相互的主从关系

        首先在B机上的my.cnf文件中,在[mysqld]部分中加入log-bin,接着重新启动mysqld,然后创建可在它的上面执行复制功能的用户帐号,使用:

        GRANT FILE ON *.* TO replicate@10.1.1.1 IDENTIFIED BY password;

        在B机上运行FLUSH PRIVILEGES命令,以便装入在加入复制用户后的新的授权表,接着回到A机上,在它的my.cnf中加入下面几行:

        master-host=10.1.1.2 master-user=replicate master-password=password

        在重启A机的服务程序之后,现在我们一拥有了在A机与B机之间的相互主-从关系。不管在哪个服务器上更新一条记录或插入一条记录,都将被复制到另一台服务器上。要注意的是:我不敢确定一个备机合并二进制日志变化的速度有多快,所以用这种方法来进行插入或更新语句的负载平衡可能不是一个好办法。

        第四步:修改你的数据库连接程序

        既然你已经在A机和B机之间建立了一个相互的关系,你需要修改数据库连接程序,以便从这种方式中得到好处。下面的函数首先试图与A机连接,如果不能建立连接则与B机连接。

        /******************************************************** function db_connect() returns a link identifier on success, or false on error ********************************************************/ function db_connect(){ ?$username = "replUser"; ?$password = "password"; ?$primary = "10.1.1.1"; ?$backup = "10.1.1.2"; # attempt connection to primary if(!?$link_id = @mysql_connect(?$primary, ?$username, ?$password)) # attempt connection to secondary ?$link_id = @mysql_connect(?$secondary, ?$username, ?$password) return ?$link_id; } ?>


        我在两种情况下对使用了上面技术的数据库连接建立过程进行了测试,一种是主MySQL服务程序关闭了,但是服务器还在运行,另一种情况是主服务器关闭了。如果只是mysqld关闭了,连接会马上转向备机;但是如果整个服务器关闭了,就出现了无限地等待(两分钟后我放弃了跟踪 -- 很短的注意跨度),因为PHP在查找一个不存在的服务器。不幸地是,不象fsockopen函数,mysql_connect函数没有一个超时参数,然而我们可以使用fsockopen来模拟一个超时处理。

        第五步:一个改进的数据库连接程序

        /******************************************************** function db_connect_plus() returns a link identifier on success, or false on error ********************************************************/ function db_connect_plus(){ ?$username = "username"; ?$password = "password"; ?$primary = "10.1.1.1"; ?$backup = "10.1.1.2"; ?$timeout = 15; // timeout in seconds if(?$fp = fsockopen(?$primary, 3306, &?$errno, &?$errstr, ?$timeout)){ fclose(?$fp); return ?$link = mysql_connect(?$primary, ?$username, ?$password); } if(?$fp = fsockopen(?$secondary, 3306, &?$errno, &?$errstr, ?$timeout)){ fclose(?$fp); return ?$link = mysql_connect(?$secondary, ?$username, ?$password); } return 0; } ?>

        这个新改进的函数向我们提供了一个可调的超时特性,这正是mysql_connect函数所缺少的。如果连接立即失败,这种情况如机器"活"着,但mysqld"当"掉了,函数立即移到第二个服务器。上面的函数相当健壮,在试图进行连接之前先测试一下,查看服务程序是否在指定端口进行监听,让你的脚本在一段可接受的时间段后超时,允许你适当地对出错情况进行处理。如果你修改了缺省端口3306,请保证对端口号进行修改。

        结论和意见

        首先,要确定得到了一个完整的数据快照。如果忘记拷贝一个表或数据库将导致备机线程序停止。生成快照的时刻是很关健的。你应该确保在拷贝数据文件之前二进制日志功能是无效的。如果在得到快照之前就允许了二进制日志功能,备机的线程可能会停止,原因就是当线程试图导入重要的记录时,可能会由于主键重复而停止。最好就是接照第二部分所讨论的处理办法来做:关闭-拷贝-允许二进制日志功能重启。

        你可能想要按照最初的一种方式来配制复制处理,并且在合适的时间关注备机,确保备机与主机保持同步。

        我没有测试过一个使用了复制特性的系统的负载平衡处理性能,但是我会灵活地使用这样系统来平衡插入和更新。例如,如果在两台服务器上两条记录都给出了同一个auto_increment值,这种情况备机线程会在哪一条记录上停掉呢?象这样的问题将会让负载平衡作为只读的处理,一台服务器处理所有的插入和更新,同时一组备机(是的,你可以有多个与主机分离的备机)处理所有的选择。

        我非常高兴,MySQL已经具备了复制系统的某些功能,并且配置很简单。使用它,你就可以开始针对失控的事件提供额外的安全措施了。我仅仅涉及了复制特性,这个我已经测试并且使用了,但是在MySQL的在线文档中的第11部分有中更详细的说明。

        译者的话:

        由于我原来使用的是3.22版的MySQL,所以为了测试一下我只好下载了3.23.24版的最新程序。而且因为只有一台机器,我只是增加了二进制日志的设置。不过,正如本文所说,的确有文件生成。如果大家对此感兴趣只好请自行测试了。另外,在最新的MySQL的使用手册中,我发现这个复制功能是在3.23.15版以后才有的,请大家检查自已的MySQL的版本。同时,文中关于二进制日志的设置是说在my.cnf中设置的。在我使用的3.23.24版本中,手册上说可以有三个文件进行参数设置,分别为windows目录下的my.ini文件,c:my.cnf和c:mysqldatamy.cnf中可以设置。我在设置log-bin时(不需要先设log参数)是使用mysql自带的WinMySQLadmin软件进行设置的,并且在my.ini中设定的,与文中不同,请大家自行测试。

    723/4<1234>
    Open Toolbar