php:web编程界的巨无霸 目标直指java.net等大腕

草根出身的PHP语言挑战的对象是Java、.Net这样的大腕。
  Zeev这位30岁的以色列小伙子看起来一点也不像有权势的人物,可是他共同创始的PHP语言,却成为网络时代异军突起的一个传奇。最新的消息是,Sun公司已决定把免费公开Java源代码提上日程,而微软的脚本语言
ASP.net也只得一直实行免费赠送。这个小个子PHP及其同伙Linux、Apache、MySQL掀起的开放源代码浪潮影响了整个Web世界,给程序编写及发布方式带来了革命性的变化。重要的是,PHP两不耽误,一边保持着开源的真谛,另一边则取得了商业上的成功。
  就在最近,PHP商业化公司Zend又 获得了2000万美元的投资,投资人包括Intel Capital和SAP Ventures。IBM也将与Zend合作,把PHP引入到IBM的中级服务器平台,以支持访问DB2
数据库,这笔交易价值数百万美元。而Zend的下 一步很有可能是进行首次公开募股(IPO)。
  在今天,全球已有2000万个网站使用PHP,包括最流行的雅虎、Google、百度、YouTube、Digg,也包括像汉莎航空电子订票系 统、德意志银行的网上银行、华尔街在线的金融信息发布系统,甚至军队系统这类五花八门和苛刻的环境。PHP究竟是怎样炼成的?  
  源于草根
  作为目前全球最流行的网站应用软件编 程语言,PHP的成长历程和Linux有异曲同工之妙。1994年,它由Rasmus Lerdorf最早创建,Lerdorf只是想记录自己的在线简历,后来许多人都向他要程序的拷贝。1995年6月,Lerdorf在加入了一些介绍文档 之后,在Usenet新闻组发布出去,这就成了最早的PHP 1.0。
  这期间,两位大学生Zeev Suraski和Andi Gutmans需要能做一个基于Web的软件项目,需要能很好地支持Linux,但当时的
ASP并不完善,JSP又比较复杂,所以就选择了PHP。其后他们在工作中发现PHP还有些不足,便自愿加入PHP语言开发工作组,并重新编写了底层的解析引擎。1998年6月,有着历史意义的PHP 3.0发布,用户数开始飞涨。1999年,他们两人又创建了Zend公司,开发了Zend Engine,大大提高了PHP的性能。
  雅虎是PHP语言最早的使用者之一,随着雅虎的兴起,大量的站点开始学习雅虎背后的语言—PHP。此时,软件开始从传统模式向基于Web模式转变,几大势力一一长成:Linux
操作系统、Apache网络服务器、MySQL服务器,以及以PHP语言为代表的“P”族语言(PHP、Perl、Python),一本德国计算机杂志把它们共同称为LAMP(明 灯),也由此与J2EE架构(以Java为编程语言,Sun公司主导)、.Net架构(微软公司主导)形成了三足鼎立之势。在Evans Data公司的一份统计资料中,PHP使用者比Java及.Net的使用者稍有差距,但预计2007年的增长率将达37%,超过Java的16%和. Net的27%,这场草原上燃烧的星火正越来越旺。  
  从革命者到务实者
  PHP成功的两大秘诀,第一条就是简单。PHP简单到让喜欢卖弄技巧的程序员感到羞愧,但让那些渴望进入Web开发领域的初学者欣喜若狂。PHP像是一条鲶鱼,与
XML、Web Services融合无间。即使历次的版本升级,也无需担心PHP会丧失这种简单的特性。无疑,这个特点给需要快速开发、交互应用的Web2.0潮流极大的带来了方便,有超过半数的Ajax-enabled和Web2.0站点都选择了PHP。
  PHP的第二个秘诀,就是“Community(强大的社区)”。Discuz!软件的开发者,25岁的康盛创想公司CEO戴志康就是这个特性 的受益者。他说,不像其他的开发者需要从零开始,大量的PHP程序都有开放源代码可供学习,后人站在前人的肩膀上加以改进,又将这种知识积累的结果回馈给 社区。这曾被比喻为“大教堂和集市”,在集市中,知识得到了最大化的利用,效率提高、错误减少、成本降低。而大教堂只能越垒越高,不断延迟发布时间。
  现在,全球已有450万名PHP开发工程师,被称为“PHPer”,他们成为了软件世界中最有影响力的社区之一。有趣的是,开源的浪潮经过数年的发展,早已经走向庙堂,无论是Intel、IBM、
Oracle,甚至是微软,都成为鼓吹甚至主导开源的力量。11月初,微软与Zend公司达成了一项长期合作的伙伴关系,共同推动PHP语言的发展。
  与其说开源运动是个颠覆者,不如说更像是粘合剂。中国开源软件推进联盟主席陆首群说,LAMP也可以派生出WAMP(W代表Windows)。 事实上,PHP与.Net是并存的,PHP也可以和Windows捆绑在一起,两者并没有冲突,可以因地致宜地使用开源与闭源混合架构(Mix)。
  目前PHP社群和Zend公司的目标,是将PHP推广到企业级应用。在这一点上,欧洲和北美远远领先于中国。Zend(中国)技术支持中心总监耿志军说,PHP已经在金融、政府、交通、电信、媒介、娱乐等各大行业被广泛使用,完全脱离了一个简单网络语言开发工具的境界。而在中国, PHP只应用于门户网站和部分的专业网站,严谨的政府和金融网站难以看到它的身影。
  即便如此,PHP正在崛起,这一点毫无疑问。正如Red Hat推动了Linux的发展,Zend也正努力将PHP带入黄金时代。Zend于2005年在慕尼黑新开设了一家子公司;今年在法国也将设立一个子公 司;在中国,Zend公司与康盛创想公司建立了合作关系,并成立了Zend(中国)技术支持中心。有很多像耿志军这样的年轻人正加入到这个队伍中,这些围 绕着PHP的力量和这个语言本身一样充满了朝气。   
  PHP是一个简单而有生命力的语言
  —专访PHP语言创始人之一Zeev Suraski
  2006年10月23日,作为PHP语言核心缔造者之一的Zeev首次来到中国,本刊记者对他进行了独家专访。
  《互联网周刊》:随着PHP版本的升级,软件包会不会越来越复杂,以致偏离它的原始设计目标?
  Zeev(Zend公司创始人、CTO、PHP的创始人之一):这个问题确实有可能存在,但我们一直在尽量避免。十年前,当我和Andi Gutmans进行PHP开发时,就已经非常注意保持简洁这个核心要素。比如说,PHP 5就比PHP 4更为简化。当然我们会支持一些新的技术,但简单是我们最根本的一个特点。
  《互联网周刊》:我们知道商业公司的决策人会是董事会或CEO,但在像PHP这样的开源社区里,重大决策是如何形成的?
  Zeev:做决策时我们有一个社区的基础,并不是由1个人拍板就能决定的。有一个大概20人的团队,都可以对决策过程施加影响,包括我,包括 Andi Gutmans,还有一些研发人员。通常我们会对讨论的问题有一个共识,在此基础上再进行决策。但如果没有共识,就会有一些麻烦了,讨论的时间也会比较 长。经过10年的发展,我们基本形成了一套机制。不过在决策方面,我们的确会比一般的商业公司占用的时间要长一些。
  《互联网周刊》:这样会不会出现一个问题,PHP会不停的有补丁释出,导致软件的发布时间被拖长,比如从PHP 5到PHP 6。
  Zeev:你说的这种情况有时的确会发生。但是我们有一个底线,就是尽早确定一些最主要的特征。比如PHP 6中的Unicode特性。我们会定义一个目标,就是这个产品本身必须是高质量的,即使发布拖的时间比较长,但总体能保证它是一个好产品。
  《互联网周刊》:许多公司因为PHP的使用而受益并且发了大财,但语言和体系的创始人却往往不是最富有的,比如Java的创始人、Linux的创始人。你对金钱怎么看待?
  Zeev:未来总是不可预测的。目前虽然我不是百万富翁或亿万富翁,但是我对生活非常满意,而且非常喜欢。
  我首先是为Zend公司工作。Zend已经价值数亿美元,但我们的主要目标还是推进PHP语言的发展。当然我们仍是一个公司,而不是一个非盈利 性的组织,但我们的关注点并不只是赚钱。如果有一个公司对我们说,我们想收购你或想和你合作,我们不会立刻就说同意。因为我们看重的不光是钱,关键是要看 我们是不是有共同的目标,能够推进PHP语言的发展。

什么是云计算

最近,大公司如MS、GoogleIBM等都在炒作一个概念就是云计算,如IBM跟欧盟 合作开展云计算,欧盟拨款1.7亿万欧元;GoogleIBM 联合力推云计算模式;Yahoo! 也把宝押在了云计算上;我国也在无锡 跟IBM公司联合建立了一个云计算中心;有人说微软收购Yahoo!一个重要的考虑就是在Yahoo在云计算方面的领先地位,多少有点儿道理。那么,什么是云计算哪?我看到有一位推广自由开源的老先生把云计算(Cloud Computing)翻译成“云雾计算”着实是可笑,好多网友也在问什么是云计算,什么是雾计算,说明好多人对于云计算是一头雾水。云计算可不是“云雨”,可不是云山雾罩。

“云计算”(Cloud Computing)是分布式处理(Distributed Computing)、并行处理(Parallel Computing)和网格计算(Grid Computing)的发展,或者说是这些计算机科学概念的商业实现。许多跨国信息技术行业的公司如IBM、Yahoo和Google等正在使用云计算的概念兜售自己的产品和服务。云计算这个名词可能是借用了量子物理中的“电子云”(Electron Cloud),强调说明计算的弥漫性、无所不在的分布性和社会性特征。量子物理上有“电子云(electron cloud)”,在原子核周围运动的电子不是一个经验世界的轨道例如像天体一样的运行轨道,而是弥漫空间的、云状的存在,描述电子的运动不是牛顿经典力学而是一个概率分布的密度函数,用薛定谔波动方程来描述,特定的时间内粒子位于某个位置的概率有多大,这跟经典力学的提法完全不同。电子云有以下特性,概然性、弥漫性、同时性等等,云计算可能的确是来自电子云的概念,前今年就有所谓“无所不在的计算”,IBM有一个无所不在的计算叫“Ubiquitous “,MS(Bill)不久也跟着提出一个无所不在的计算“Pervade“,现在人们对无所不在的计算又有了新的认识,现在说是”Omnipresent “。但是,云计算的确不是纯粹的商业炒作,的确会改变信息产业的格局,现在许多人已经用上了Google Doc和Google Apps,用上了许多远程软件应用如Office字处理而不是用自己本地机器上安装这些应用软件,以后谁还会花钱买Office软件哪?还有许多企业应用如电子商务应用,例如要写一个交易程序,Google的企业方案就包含了现成的模板,一个销售人员根本没学习过Netbeanr也能做出来。这种计算和产业动向是符合开源精神的,符合SaaS(Software as a Service)趋势。现在有这样的说法,当今世界只有五台计算机,一台是Google的,一台是IBM的,一台是Yahoo的,一台是Amazon的,一台是微软的,因为这五个公司率先在分布式处理的商业应用上捷足先登引领潮流。Sun公司很早就提出说“网络就是计算机”是有先见之明的。

有以下五个主要原因使得分布式计算必然会越来越普遍,逐渐发展成主流的计算模式而取代集中式的大型计算机:

        

  1. 现在分布式系统的第一个原因就是因为他具有比集中式系统更好的性能价格比。你不要花几十万美元就能获得高效能计算。
  2.     

  3. 多数应用本身就是分布式的。如工业企业应用,管理部门和现场不在同一个地方。
  4.     

  5. 高可靠性。冗余不仅是生物进化的必要条件,而且也是信息技术。现代分布式系统具有高度容错机制,控制核反应堆主要采用分布式来实现高可靠性。
  6.     

  7. 可扩展性。买一台性能更高的大型机,或者再买一台性能相同的大型机的费用都比添加几台PC的费用高得多。
  8.     

  9. 高度灵活性。能够兼容不同硬件厂商的产品,兼容低配置机器和外设而获得高性能计算。

粗略地计算,目前的个人计算机每个CPU芯片的处理能力是200MIPS,就是每秒种执行200M也就是两亿次指令,而最近Yahoo!公司报道他们已经实现了有一万个节点(node)就是一万台PC计算机连接的分布式系统,总的处理能力是 2,000,000MIPS,最快的芯片也达不到这个速度,因为在一定面积上设计的芯片的速度是存在一个极限的,不可逾越。而当前世界著名的超级计算机所谓的TOP500,达到每秒几百万亿次指令执行,都是采用分布式设计的,世界第一的IBM BlueGene超级计算机采用了32部机架,每部机架部署有768个PowerPC440 CPU。顺便说一句,这TOP500基本都是使用Linux操作系统的!现在社会和家庭拥有的个人计算机就是PC,只有30%的计算能力被利用,甚至更低,而其余70%的实际上是被闲置的,这些闲置的计算机资源和计算能力只有通过分布式系统才能得到有效的利用,这样可以大大提高一个国家的计算能力,而计算能力是衡量一个国家国力和科学研究能力的指标,这一点现在还没有被国人充分认识到。一个国家和地区的计算能力现在已经成为一种重要的战略资源,不亚于石油和其他战略物资的重要性。云计算就是把普通的服务器或者个人计算机连接起来以获得超级计算机也叫高性能和高可用性计算机的功能,但是成本更低。这在世界上也是个先进的项目。云计算模式必定能大大提高我国科学计算机和商业计算能力,使得我国经济竞争力大大提升。美国和欧洲有许多社会分布的分布式计算系统,他们动员和使用这些社会计算能力进行人类基因组学(Genomics)的研究、天文学问题研究、数学难题研究以及其他的科学问题研究。去年的一个研究报告估计我国个人计算机PC保有量接近两亿台。

按照计算机操作系统的宗师Andrew S. Tanenbaum(AST)给分布式系统的的定义:“分布式系统是这样的系统,它运行在不具有共享内存的多台机器上,但在用户的眼里却像是一台计算机”。(引自《现代操作系统》,机械工业出版社,1999年中文版)。它的目标是让每个用户感觉联网的计算机是一个分时系统——就像使用个人计算机一样 ——而不是一个由许多计算机联合起来的集体,即使由五个节点组成的分布式系统也应该让用户感觉自己是在使用一台价值20万美元的大型计算机,唯一不寻常的感觉是处理速度提高了许多,别的没有什么不同。例如,这里有一个简单的例子,在机器A的用户要使用安装在机器B上用户的目录里的文件,A用户要使用远程登录命令rlogin B登录到机器B的目录上,那么这就不是一个真正的分布式系统,因为用户A意识到了另外一台机器的存在,分布式系统必须要做到,用户A登录到一个目录上的时候不知道自己是在本地机器上还是在远程机器上的目录上,对于用户A来说机器B是透明的,这就是分布式系统设计时考虑的“透明性”要求。其他有关的问题包括:分布式文件系统的问题,目录和文件访问机制以及一致性问题,分布式系统进程的通信问题等等。目前的云计算严格说还没有到达真正的分布式计算的语义学水平。

LCC编译器的源程序分析(64)符号表的结构注释

#001 //符号表结构.
#002 //
#003 //蔡军生 2007/08/10 QQ:9073204
#004 //
#005 struct symbol
#006 {
#007  char *name; //符号的名称,大多数情况是源程序的符号.
#008  int scope; //符号作用域.
#009  Coordinate src; //符号出现在文件中的行号和列号.
#010  Symbol up; //
#011  List uses;
#012  int sclass; //符号的类型.
#013  unsigned structarg:1; //结构参数标志.
#014 
#015  unsigned addressed:1; //地址访问的变量.
#016  unsigned computed:1; //地址树的标志.addrtree函数处理.
#017  unsigned temporary:1; //生成的临时变量标志.
#018  unsigned generated:1; //生成的符号标志.
#019  unsigned defined:1; //符号被定义了,避免声明多次.
#020  Type type; //变量或者常量的类型.
#021  float ref; //标号或变量的引用计数.
#022  union
#023  {
#024         //保存标号.
#025          struct
#026         {              
#027               int label; //全局分配唯一的标号,这时name保存标号字符串.
#028               Symbol equatedto;
#029         } l;
#030 
#031         struct
#032         {
#033               unsigned cfields:1;
#034               unsigned vfields:1;
#035               Table ftab;       /* omit */
#036               Field flist;
#037         } s;
#038 
#039         int value;
#040         Symbol *idlist;
#041 
#042         struct
#043         {
#044               Value min, max;
#045         } limits;
#046 
#047         //保存常量的结构.
#048         struct
#049         {
#050               Value v; //保存实际的常量值.
#051               Symbol loc; //指向符号表的入口.
#052         } c;
#053        
#054         struct
#055         {
#056               Coordinate pt;
#057               int label;
#058               int ncalls;
#059               Symbol *callee;
#060         } f;
#061        
#062         //全局变量或静态变量给出定义的段.
#063         int seg;
#064 
#065         Symbol alias;
#066        
#067         struct
#068         {
#069               //前端生成多次引用公共表达式的临时变量的DAG节点.
#070               Node cse;
#071 
#072               //
#073               int replace;
#074               Symbol next;
#075         } t;
#076 
#077  } u;
#078 
#079  Xsymbol x; //后端使用的符号扩展。
#080 };

经典评论:垃圾收集机制(Garbage Collection)

垃圾收集机制(Garbage Collection)批判
 
在Java版发表这篇文章,似乎有点把矛头指向Java了。其实不是,GC是所有新一代语言共有的特征,
Python, Eiffel,C#,Roby等无一例外地都使用了GC机制。但既然Java中的GC最为著名,所以天塌
下来自然应该抗着。
 
这篇短文源于comp.lang.java.programmer跟comp.lang.C++上发生的一场大辩论,支持C++和Java
的两派不同势力展开了新世纪第一场冲突,跟贴发言超过350,两派都有名角压阵。C++阵营的擂主是
Pete Becker,ACM会员,Dinkumware Ltd. 的技术副总监。此君精通C++和Java,开发过两种语言的
核心类库,但是却对C++狂热之极,而对于Java颇不以为然。平时谈到Java的时候还好,一旦有人胆
敢用Java来批判C++,立刻忍不住火爆脾气跳将出来,以坚韧不拔的毅力和大无畏精神与对手周旋,
舌战群儒,哪怕只剩下一个人也要血战到底。这等奇人当真少见!我真奇怪他整天泡在usenet上,
不用工作么?他的老板P.J. Plauger如此宽宏大量?Java阵营主角是一个网名Razzi的兄弟,另外有
Sun公司大名鼎鼎的Peter van der Linden助阵,妙语连珠,寸土必争,加上人多势众,一度占据优势。
C++阵营里大拿虽然很多,但是大多数没有Pete那么多闲工夫,例如Greg Comeau,Comeau公司老板,
每次来个只言片语,实在帮不了Pete多大忙。但是自从C++阵营中冒出一个无名小子,网名Courage(勇气),
发动对Java GC机制的批判,形势为之一变。C++阵营眼下处于全攻之势,Java阵营疲于防守,只能
招架说:"你们没有证据,没有统计资料",形势很被动。
 
垃圾收集(GC)不是一直被Java fans用来炫耀,引以为傲的优点么?怎么成了弱点了?我大惑不解,定睛
一看,才觉得此中颇有道理。
 
首先,Java Swing库存在大量资源泄漏问题,这一点SUN非常清楚,称之为bugs,正在极力修正。但是看来
这里的问题恐怕不仅是库编写者的疏忽,可能根源在于深层的机制,未必能够轻易解决,搞不好要伤筋动骨。
不过这个问题不是那么根本,C++阵营觉得如果抓住对方的弱点攻击,就算是占了上风也没什么说服力。谁
没有缺点呢?于是反其道而行之,猛烈攻击Java阵营觉得最得意的东西,Java的GC机制本身。
 
首先来想一想,memory leak到底意味着什么。在C++中,new出来的对象没有delete,这就导致了memory
leak。但是C++早就有了克服这一问题的办法–smart pointer。通过使用标准库里设计精致的auto_ptr
以及各种STL容器,还有例如boost库(差不多是个准标准库了)中的四个smart pointers,C++程序员只要
花上一个星期的时间学习最新的资料,就可以拍着胸脯说:"我写的程序没有memory leak!"。
 
相比之下,Java似乎更优秀,因为从一开始你就不用考虑什么特殊的机制,大胆地往前new,自有GC替你
收拾残局。Java的GC实际上是JVM中的一个独立线程,采用不同的算法策略来收集heap中那些不再有
reference指向的垃圾对象所占用的内存。但是,通常情况下,GC线程的优先级比较低,只有在当前程序
空闲的时候才会被调度,收集垃圾。当然,如果JVM感到内存紧张了,JVM会主动调用GC来收集垃圾,获取
更多的内存。请注意,Java的GC工作的时机是:1. 当前程序不忙,有空闲时间。2. 空闲内存不足。
现在我们考虑一种常见的情况,程序在紧张运行之中,没哟空闲时间给GC来运行,同时机器内存很大,
JVM也没有感到内存不足,结果是什么?对了,GC形同虚设,得不到调用。于是,内存被不断吞噬,而那些
早已经用不着的垃圾对象仍在在宝贵的内存里睡大觉。例如:
 
class BadGc {
 
  public void job1() {
    String garbage = "I am a garbage, and just sleeping in your precious memory, " +
            "how do you think you can deal with me? Daydreaming! HAHA!!!";
    ….
  }
 
  public void job2() {…}
 
  …
  …
 
  public void job1000() {…}
 
  public static void main(String[] args) {
    bgc = new BadGc();
bgc.job1();
bgc.job2();

bgc.job1000();
  }
}
 
运行中,虽然garbage对象在离开job1()之后,就再也没有用了。但是因为程序忙,内存还够用,所以GC得
不到调度,garbage始终不会被回收,直到程序运行到bgc.job1000()时还躺在内存里嘲笑你。没辙吧!
 
好了,我承认这段程序很傻。但是你不要以为这只是理论上的假设,恰恰相反,大多数实用中的Java程序都有
类似的效应。这就是为什么Java程序狂耗内存,而且好像给它多少内存吃都不够。你花上大笔的银子把内存
从128升到256,再升到512,结果是,一旦执行复杂任务,内存还是被轻易填满,而且多出来的这些内存只是
用来装垃圾,GC还是不给面子地千呼万唤不出来。等到你的内存终于心力交瘁,GC才姗姗来迟,收拾残局。而
且GC工作的方式也很不好评价,一种方法是一旦有机会回收内存,就把所有的垃圾都回收。你可以想象,这要
花很长时间(几百M的垃圾啊!),如果你这时侯正在压下开炮的按钮,GC却叫了暂定,好了,你等死吧!另一
种方法,得到机会之后,回收一些内存,让JVM感到内存不那么紧张时就收手。结果呢,内存里始终有大批垃
圾,程序始终在半死不活的荡着。最后,GC可以每隔一段时间就运行一次,每次只回收一部分垃圾,这是现在
大部分JVM的方式,结果是内存也浪费了,还动不动暂停几百毫秒。难啊!
 
反过来看看C++利用smart pointer达成的效果,一旦某对象不再被引用,系统刻不容缓,立刻回收内存。这
通常发生在关键任务完成后的清理(cleanup)时期,不会影响关键任务的实时性,同时,内存里所有的对象
都是有用的,绝对没有垃圾空占内存。怎么样?传统、朴素的C++是不是更胜一筹?
 
据统计,目前的Java程序运行期间占用的内存通常为对应C++程序的4-20倍。除了其它的原因,上面所说的是一个
非常主要的因素。我们对memory leak如此愤恨,不就是因为它导致大量的内存垃圾得不到清除吗?如果有了
GC之后,垃圾比以前还来势汹汹,那么GC又有什么好处呢?
 
当然,C++的smart pointer现在会使用的人不多,所以现在的C++程序普遍存在更严重的memory leak问题。
但是,如果我奶奶跟舒马赫比赛车输掉了,你能够埋怨那辆车子么?

 

关于 VirtualBox

 

VirtualBox 1.6 下载

VirtualBox是德国一家软件公司InnoTek所开发的虚拟系统软件,它不仅具有丰富的特色,而且性能也很优异。更是开源的,成为了一个发布在GPL许可之下的自由软件。VirtualBox 可以在 Linux 和 Windows 主机中运行,并支持在其中安装 Windows (NT4.0、2000、XP、Server 2003、vista)、DOS/Windows 3.x、Linux (2.4 和 2.6)、OpenBSD 等系列的客户操作系统。

sed 命令使用笔记

好久没有用过sed命令了,网上有很多实例,但是想用熟练也没那么容易,这不今天有一个小小的需求想把sed拿出来用用,就遇到了麻烦:

问题:替换掉行首的一个单词,即该单词挨着的一个tab字符

解决方法:

1. 用awk来完成的:

命令:awk -F"\t" ‘{sub($1"\t",""); print $0}’ src.txt

心得:我开始以为$1和"\t" 中间需要加号连接的,所以就没有达到目的,改用了sed

2. 用sed来完成:

命令: sed s’/^\S\{1,\}\t//’ src.txt

心得: 其中的\{1,\}如果用+表示,也需要斜线转义,但是我没有转义,所以试了n遍都是错的,即可以这样:

命令: sed s’/^\S\+\t//’ src.txt

心得: 这里主要注意一个转义的问题

如何剖析可执行的二进制文件

文本文件一般谁都看得懂,但是遇到二进制文件很多人会无从下手,下面我介绍几个解密二进制文件的方法:

1. strings  这个命令看起来很简单,实际很有用,如果某些敏感的字符串(如:密码)直接写到了二进制文件中,使用strings 再配以grep 就很容易找到那些敏感的字符串了。注意:知道很容易,但是养成这种习惯、能够灵活运用却需要时间

2.  ldd  查看动态的二进制文件用到的动态库,在Linux写实比较关心这个的,有时候文件不能执行就是因为需要的动态库不存在

3. nm   查看二进制文件的符号表,该命令可以了解二进制文件用到了哪些函数

4.  strace 该命令可以跟踪二进制文件的执行过程,实际上还可以跟踪一个已经启动了的进程,灵活运用是你受益无穷

让程序产生一个段错误

有时候为了调试程序,需要自己写脚本主动产生一个段错误来查看程序的表现,下面是一个很简单的产生段错误的例子:

    

        

            

        

    

            

#include <iostream>
            using namespace std;
            int main(int ac,char ** av){
            cout<<"Content-type:text/html;charset=gb2312\n"<<endl;
            cout<<"start"<<endl;
            strcpy(NULL,"aaa");
            cout<<"bbbb"<<endl;
            return 0;
            }

            

本来有strcpy(NULL,"aaa"); 就够了,但是我却发现如果命令行里执行,看不见产生段错误上面的输出,如果是作为cgi在apache中访问,可以看到段错误上面的输出,不明白