Yanxin's profile登高望远PhotosBlogListsMore ![]() | Help |
|
|
1/10/2009 Linux初学者常用命令现在的Linux图形管理界面越来越强大了,但是还是有些操作用命令行更方便。 没必要全部都记住,又不是去做网管。稍微明白记住一点就够用了。
11/4/2008 JPCAP——Java中的数据链路层控制一.JPCAP简介 1.NetworkInterface
2.JpcapCaptor 数据成员
方法成员
3.JpcapSender 方法成员
4.Packet 三.使用JPCAP实现监听 2.用JPCAP实现监听 public class changeARP{ 12/11/2007 团书馆管理系统设计文档1. 设计目的 该实验使用交互式网页模拟对图书馆的各项管理操作。实现从前台网页连接后台数据库的不同功能操作。对于不同用户赋予不同权限,并实现各种不同权限的操作。并能够检索书库中各种书目,并对其进行增加,修改,删除,借阅,预定,归还,生成罚单等各种动作。有效的管理图书馆中各个用户,实现修改,删除,验证,增加等任务。 2. 技术准备 前台网页设计 Html + CSS + JSTL 实现对网页的统一管理,在页面中全部为静态网页代码,并使用CSS对对页面排版进行统一管理。网页中的部分逻辑采用JSTL标签库管理。使在前台中仅实现MVC模型中的View功能,方便后期管理。 交互式网页逻辑 Jsp1.4 + Struts1.2 后台使用框架结构实现网页中各种逻辑,完成对数据库的前台管理。 后台服务端 Tomcat6.0 + jdk1.6.0 数据库 MySql5.0 + JDBC5.1.5 数据库采用JDBC完成对网页逻辑与后台数据的交互。 3. 网页逻辑实现原理 a) 用户个人信息管理 i. package com.library.DBcontrol.register ii. package com.library.DBcontrol.changeInformation b) 图书基本操作管理 i. package com.libarary.DBcontrol.borrowBooks ii. package com.libarary.DBcontrol.search
c) 用户登录验证
i. package com.library.DBcontrol.DBconnect
i. package com.library.DBconnect.manager 1. 处理作者信息 2. 处理出版社信息 3. 处理用户信息 4. 处理罚单信息 5. 处理管理员信息 6. 处理图书信息 4. 数据库设计 详见DBdesign.sql 5. 总结 对于布置这次试验主要目的是完成对数据库的各项操作,包括建表,sql使用,数据管理。从而加深了对数据库的认识,将所学运用在实践当中。 当然也通过这次试验,加深了对struts技术的理解与使用。理解了MVC模型的使用,加深对页面间各属性值生存周期的认识。 对于此次试验的缺憾是开发进度过于缓慢,使用了2周时间才完成项目。主要是对Struts框架使用的不熟悉,以及在项目过程中现学现用的css与JSTL,不过在有了这次的经验后相信会对今后的项目开发起到一定的促进作用。 11/1/2007 加解密程序设计文档1. 总述 这个程序使用标准DES+CBC加密解密算法对文件进行加解密操作。并设定初始CBC为全0。程序中对于轮迭代所需密钥进行一次生成,避免每次加密解密过程中需要重复生成相同密钥,提高程序工作效率。此程序具有良好的可扩展性,由于轮迭代所需要密钥都已生成,所以可以在轮迭代与轮迭代中进行自由切换,从而既可以产生符合标准DES过程的输出结果,又满足赵老师课堂所布置的要求。 2. 界面设计
界面使用windows.forms调用,生成窗口如上。 在窗口密钥输入框中输入不超过8个字符密钥,选择加密方式,填入/选择输入文件和输出文件路径。点击加密解密按钮就可以实现加解密过程。 其中密钥输入框限定字符输入最大为8位,同时默认加解密为4轮迭代DES加解密。输入文件路径和输出文件路径均可以自己填写或者由右边按钮进行选取。 3. 各函数综述 程序主要包含5个主要文件。Program.cs---主函数,启动一个窗体。Windows.cs---窗体代码。实现函数大部分功能。EncodeP.cs与DecodeP.cs分别为加解密函数。Keys.cs为迭代所需密钥生成函数。下面对各文件中的主要函数进行说明: A. 函数名MakeEncodeKey a) 文件地址 Keys.cs b) 原形 public void MakeEncodeKey() c) 功能描述 从用户处取得一个位二进制密码keyin ,去除位密码中作为奇偶校验位(Pc1变化),剩下的位作为有效输入密钥,分成左半部分和右半部分KeyLeft,KeyRight。对两部分按ToSort进行循环左移。再将两部分进行拼接,完成后进行Pc2变化,生成位二进制密钥。将此过程重复次,即生成最多16次迭代所需密钥。当然此时必满足4次迭代需要。 d) 返回值说明 无 e) 参数说明 String KeyText 从文本框中读入密钥 Byte[] keyin 将读入字符型密钥装换成的64位二进制密钥 Byte[,] KeyLeft, KeyRight 每轮变换后的密钥 Byte[,] keyout 产生的16轮变换密钥 B. 函数名MakeCode a) 文件地址 EncodeP.cs/DecodeP.cs b) 原形 public void MakeCode() c) 功能描述 DES对(bit)位的明文分组M进行操作,M经过一个初始置换IP置换成m0,将m0明文分成左半部分和右半部分m0=(CodeLeft,CodeRight),各位长。然后进行ChangeTimes轮完全相同的运算,这些运算被称为函数f。首先将CodeRight扩展至位暂存到TempCode,然后和相应迭代密钥异或,再进行S盒变换和P盒变换。接下来与CodeLeft进行异或。最后交换CodeRight与CodeLeft。最后将CodeRight与CodeLeft拼接在一起,得到密文。解密运算的时候仅交换异或密钥顺序。 d) 返回值说明 无 e) 参数说明 Int32 ChangeTimes 函数进行DES加解密时所要迭代次数 Byte[] Incode,Outcode 八位字符型输入、输出 Byte[] incodeByte,outcodeByte 64位二进制输入、输出 Byte[,] Keys每轮迭代所需密钥 Byte[,] CodeLeft,CodeRight 明文变换过程中左半部分与右半部分 C. 函数名CBCin a) 文件地址 Windows.cs b) 原形 private void CBCin(Int32 Num) c) 功能描述 读取此次CBC加密的数据位数Num。当Num = 8时对每一位都与之前的加密后数据进行异或。当Num != 8时,首先得出末尾需有几位空字符,在这些空字符处第一位填空字符数目,剩下字符填0。与输入文本进行异或的code存在CBCText中。 d) 返回值说明 无 e) 参数说明 Int32 Num 此次加密数据位数 Byte[] CBCText 暂存待与输入异或密文 Byte[] InputText 待异或的明文 D. 函数名CBCout a) 文件地址 Windows.cs b) 原形 private Int32 CBCout(Boolean End) c) 功能描述 读取此次CBC解密是否为最后一次解密,返回此次解密有效位。当End = true时对每一位都与之前的读入数据进行异或,然后函数返回8(全有效)。当End != true时,从末尾开始扫描。如果末尾为0继续往前扫描,直道出现数值与扫描次数相等。此时得到数字为末尾无效字符数,则函数返回8 - i(末尾有效字符数)。与输出文本进行异或的code存在CBCText中 d) 返回值说明 返回此次解密后输出有效位数 e) 参数说明 Boolean End 此次解密是否为最后一次 Byte[] CBCText 暂存待与输出异或密文 Byte[] InputText 待异或的明文 4. 雪崩效应分析 A. 相同密钥下明文改变任一位时密文的位差异情况 输入明文:61 62 63 64 65 66 67 68 (abcdefgh) 密钥A:31 32 33 34 35 36 37 38 (12345678) 密钥B:33 32 33 34 35 36 37 39 (32345679) 密文A:0C 9D 02 3C 66 46 4A 18 密文B:14 89 81 C1 3E 50 ED 5C 得到完全不一样密文
B. 相同明文下密钥改变任一位时密文的位差异情况 输入密钥:31 32 33 34 35 36 37 38 (12345678) 明文A:61 62 63 64 65 66 67 68 (abcdefgh) 明文B:61 62 63 64 65 66 67 69 (abcdefgi) 密文A:0C 9D 02 3C 66 46 4A 18 密文B:8A 18 BF 85 39 82 F5 4C 得到完全不一样密文
说明明文或者密钥的一点小的变化使密文发生一个大的变化。DES+CBC雪崩效应很强。 10/19/2007 人不能太无耻---关于汉语编程有感 最近关于汉语编程弄得沸沸扬扬,本来本着看热闹的心态看看这事情会怎么发展下去,可是发现的只是某些人的牛皮吹大了,大到我只能用无耻来形容了。这种事情骗骗外行装装高手也就算了,可是弄到开始骗国家的研究经费,也就是我们纳税人的钱的地步就让人感到可恨了。这个是汉语编程的网址www.hybcw.com,没事的时候可以当笑话来看看。下面转载了别人的一篇技术分析文章,对于这种事情我也懒得写了。
以下是转载文章
一、闹得沸沸扬扬的汉语编程 6/26/2007 PipeLineV2.1 经过两个星期断断续续的垒程序,PipeLineV2.1总算完工了.大的BUG基本上都已经剔除掉了,可以顺利通过Load/use hazard & ret & Mispredict.小BUG还没有都揪出来了.主要的是M$无法调用MemoryData.Columns.Clear();造成重新开文件的时候DataColums没有清空,看能不能找其他办法解决掉.比起V1.0版本界面代码重写了,主要是被批评V1.0太过于花哨.剩下的几天时间里再把代码优化一下,除除虫,美化界面.现在的已经太过于朴素.代码太分散了,过段时间再贴,先贴个界面出来.
5/10/2007 The Google's NDANon-Disclosure Agreement
Revision 0727.2005 Google Inc. This Non-Disclosure Agreement ("Agreement") is made and entered into between Google Inc., for itself and its ubsidiaries and affiliates ("Google"), and "Participant" identified below, individually referred to as a "Party" and collectively referred to as the "Parties". The Parties wish to exchange Confidential Information (as defined below in Section 2) for the following purpose(s): evaluating a potential employment opportunity with Google (the "Purpose"). The Parties have entered into this Agreement to assure that the confidentiality of such information is maintained, in accordance with the following terms of this Agreement: 1. The Effective Date of this Agreement is _____________________. 2. Google may disclose certain information under this Agreement it considers confidential and/or proprietary concerning Google's business and/or technology ("Confidential Information") including, but not limited to, all tangible, intangible, visual, electronic, present, or future information such as: (a) trade secrets; (b) financial information, including pricing; (c) technical information, including research, development, procedures, algorithms, data, designs, and know-how; (d) business information, including operations, planning, marketing interests, and products; (e) the terms of any agreement and the discussions, negotiations and proposals related to any agreement; and (f) information acquired during any facilities tours. 3. Participant will use the Confidential Information only for the Purpose described above. Participant will use the same degree of care, but no less than a reasonable degree of care, as Participant uses with respect to its own similar information to protect the Confidential Information and to prevent: (a) any use of Confidential Information not authorized in this Agreement; and/or (b) communication of Confidential Information to any unauthorized third party. Confidential Information may only be disseminated to employees, directors, agents or third party contractors of Participant with a need to know and who have first signed an agreement with Google containing confidentiality provisions substantially similar to those set forth herein ("Authorized Personnel"). Participant shall ensure compliance by Authorized Personnel with the terms and conditions of this Agreement, and shall be responsible for any breach of such terms and conditions by any Authorized Personnel.
4. Participant agrees not to do the following, except with the advanced review and written approval of Google: (a) issue or release any articles, advertising, publicity or other matter relating to this Agreement (including the fact that a meeting or discussion has taken place between the parties) or mentioning or implying the name of Google; (b) make copies of documents containing Confidential Information; or (c) reverse engineer, disassemble, decompile, translate, or attempt to discover any prototypes, software, algorithms, or underlying ideas which embody Google's Confidential Information. 5. This Agreement imposes no obligation upon Participant with respect to Confidential Information that: (a) was known to Participant before receipt from Google, as evidenced by Participant's files and records in existence before the time of disclosure; (b) is or becomes publicly available through no fault of Participant; (c) is rightfully received by Participant from a third party without a duty of confidentiality; (d) is disclosed by Google to a third party without a duty of confidentiality on the third party; or (e) is disclosed by Participant with Google's prior written approval. If Confidential Information is required to be produced by law, court order, or other governmental demand ("Process"), Participant must immediately notify Google of that obligation. Participant will not produce or disclose Confidential Information in response to such Process unless Google has (i) requested protection from the court or other legal or governmental authority requiring the Process and such request has been denied, or (ii) consented in writing to the production or disclosure of the Confidential Information in response to the Process. Nothing in this Agreement shall prohibit or limit either party's use or disclosure of the U.S. Federal income tax treatment and U.S. Federal income tax structure of any transaction contemplated by this Agreement and all materials of any kind (including opinions or other tax analyses) that are provided to it relating to such tax treatment or tax structure, except where confidentiality is necessary to comply with applicable federal or state securities laws. 6. ALL CONFIDENTIAL INFORMATION CONTAINED HEREIN IS PROVIDED "AS IS". NO OTHER WARRANTIES ARE MADE, EXPRESS OR IMPLIED. 7. Google does not wish to receive any confidential information from Participant, and Google assumes no obligation, either express or implied, for any information disclosed by Participant.
8. This Agreement shall remain in effect until such time as all Confidential Information of Google disclosed hereunder becomes publicly known and made generally available through no action or inaction of Participant. 9. Participant, upon Google's written request, will promptly return all Confidential Information received from Google, together with all copies, or certify in writing that all such Confidential Information and copies thereof have been destroyed. 10. This Agreement imposes no obligation on Google to exchange Confidential Information, to proceed with the business opportunity, or to purchase, sell, license, transfer or otherwise make use of any technology, services or products. 11. No Party acquires any intellectual property rights under this Agreement (including but not limited to patent, copyright, and trademark rights) except the limited rights necessary to carry out the purposes as set forth in this Agreement. 12. Participant acknowledges that damages for improper disclosure of Confidential Information may be irreparable; therefore, Google is entitled to seek equitable relief, including injunction and preliminary injunction, in addition to all other remedies. 13. This Agreement does not create any agency or partnership relationship. This Agreement will not be assignable or transferable by Participant without the prior written consent of Google. 14. This constitutes the entire agreement between the parties with respect to the subject matter hereof, and supersedes any prior oral or written agreements. All additions or modifications to this Agreement must be made in writing and must be signed by all Parties. Any failure to enforce a provision of this Agreement shall not constitute a waiver thereof or of any other provision. 15. This Agreement may be executed in two or more identical counterparts, each of which shall be deemed to be an original and all of which taken together shall be deemed to constitute the agreement when a duly authorized representative of each party has signed the counterpart. 16. This Agreement shall be governed by the laws of the State of California, without reference to conflict of laws principles. The exclusive venue for any dispute relating to this Agreement shall be in the state or federal courts within Santa Clara County, California. 4/29/2007 GCC参数详解(转载)[声明]
这篇文档是我的关于gcc参数的笔记,我很怀念dos年代我用小本子,纪录所有的dos命令的参数.哈哈,下面的东西可能也不是很全面,我参考了很多的书,和gcc的帮助.不全的原因是,有可能我还没有看到这个参数,另一种原因是,我可能还不会用它不过,我会慢慢的补齐的.哈哈 如果你要转在本文章请保留我的email(pianopan@beeship.com)和文章的全面性. [介绍] gcc and g++分别是gnu的c & c++编译器 gcc/g++在执行编译工作的时候,总共需要4步 1.预处理,生成.i的文件 2.将预处理后的文件不转换成汇编语言,生成文件.s 3.有汇编变为目标代码(机器代码)生成.o的文件 4.连接目标代码,生成可执行程序 [参数详解] -x language filename 设定文件所使用的语言,使后缀名无效,对以后的多个有效.也就是根据约定C语言的后缀名称是.c的,而C++的后缀名是.C或者.cpp,如果 你很个性,决定你的C代码文件的后缀名是.pig 哈哈,那你就要用这个参数,这个参数对他后面的文件名都起作用,除非到了下一个参数的使用。可以使用的参数吗有下面的这些`c', `objective-c', `c-header', `c++', `cpp-output',`assembler', and `assembler-with-cpp'. 看到英文,应该可以理解的。 例子用法: gcc -x c hello.pig -x none filename 关掉上一个选项,也就是让gcc根据文件名后缀,自动识别文件类型 例子用法: gcc -x c hello.pig -x none hello2.c -c 只激活预处理,编译,和汇编,也就是他只把程序做成obj文件 例子用法: gcc -c hello.c 他将生成.o的obj文件 -S 只激活预处理和编译,就是指把文件编译成为汇编代码。 例子用法 gcc -S hello.c 他将生成.s的汇编代码,你可以用文本编辑器察看 -E 只激活预处理,这个不生成文件,你需要把它重定向到一个输出文件里面. 例子用法: gcc -E hello.c > pianoapan.txt gcc -E hello.c | more 慢慢看吧,一个hello word 也要与处理成800行的代码 -o 制定目标名称,缺省的时候,gcc 编译出来的文件是a.out,很难听,如果你和我有同感,改掉它,哈哈 例子用法 gcc -o hello.exe hello.c (哦,windows用习惯了) gcc -o hello.asm -S hello.c -pipe 使用管道代替编译中临时文件,在使用非gnu汇编工具的时候,可能有些问题 gcc -pipe -o hello.exe hello.c -ansi 关闭gnu c中与ansi c不兼容的特性,激活ansi c的专有特性(包括禁止一些asm inline typeof关键字,以及UNIX,vax等预处理宏) -fno-asm
此选项实现ansi选项的功能的一部分,它禁止将asm,inline和typeof用作关键字。 -fno-strict-prototype 只对g++起作用,使用这个选项,g++将对不带参数的函数,都认为是没有显式的对参数的个数和类型说明,而不是没有参数.而gcc无论是否使用这个参数,都将对没有带参数的函数,认为城没有显式说明的类型 -fthis-is-varialble -fcond-mismatch 允许条件表达式的第二和第三参数类型不匹配,表达式的值将为void类型 -funsigned-char -fno-signed-char -fsigned-char -fno-unsigned-char 这四个参数是对char类型进行设置,决定将char类型设置成unsigned char(前两个参数)或者 signed char(后两个参数) -include file 包含某个代码,简单来说,就是便以某个文件,需要另一个文件的时候,就可以用它设定,功能就相当于在代码中使用#include 例子用法: gcc hello.c -include /root/pianopan.h -imacros file 将file文件的宏,扩展到gcc/g++的输入文件,宏定义本身并不出现在输入文件中 -Dmacro 相当于C语言中的#define macro -Dmacro=defn 相当于C语言中的#define macro=defn -Umacro 相当于C语言中的#undef macro -undef 取消对任何非标准宏的定义 -Idir 在你是用#include"file"的时候,gcc/g++会先在当前目录查找你所制定的头文件,如果没有找到,他回到缺省的头文件目录找,如果使用-I制定了目录,他回先在你所制定的目录查找,然后再按常规的顺序去找.对于#include,gcc/g++会到-I制定的目录查找,查找不到,然后将到系统的缺省的头文件目录查找 -I- -idirafter dir 在-I的目录里面查找失败,讲到这个目录里面查找. -iprefix prefix -iwithprefix dir 一般一起使用,当-I的目录查找失败,会到prefix+dir下查找 -nostdinc 使编译器不再系统缺省的头文件目录里面找头文件,一般和-I联合使用,明确限定头文件的位置 -nostdin C++ 规定不在g++指定的标准路经中搜索,但仍在其他路径中搜索,.此选项在创建libg++库使用 -C 在预处理的时候,不删除注释信息,一般和-E使用,有时候分析程序,用这个很方便的 -M 生成文件关联的信息。包含目标文件所依赖的所有源代码你可以用gcc -M hello.c来测试一下,很简单。 -MM 和上面的那个一样,但是它将忽略由#include造成的依赖关系。 -MD 和-M相同,但是输出将导入到.d的文件里面 -MMD 和-MM相同,但是输出将导入到.d的文件里面 -Wa,option 此选项传递option给汇编程序;如果option中间有逗号,就将option分成多个选项,然后传递给会汇编程序 -Wl.option 此选项传递option给连接程序;如果option中间有逗号,就将option分成多个选项,然后传递给会连接程序. -llibrary 制定编译的时候使用的库 例子用法 gcc -lcurses hello.c 使用ncurses库编译程序 -Ldir 制定编译的时候,搜索库的路径。比如你自己的库,可以用它制定目录,不然编译器将只在标准库的目录找。这个dir就是目录的名称。 -O0 -O1 -O2 -O3 编译器的优化选项的4个级别,-O0表示没有优化,-O1为缺省值,-O3优化级别最高 -g 只是编译器,在编译的时候,产生条是信息。 -gstabs 此选项以stabs格式声称调试信息,但是不包括gdb调试信息. -gstabs+ 此选项以stabs格式声称调试信息,并且包含仅供gdb使用的额外调试信息. -ggdb 此选项将尽可能的生成gdb的可以使用的调试信息. [参考资料] -Linux/UNIX高级编程 中科红旗软件技术有限公司编著.清华大学出版社出版 4/17/2007 LAB2BOMB的前四个STAGE总算OK了,干脆写写自己的解题思路,如有问题,欢迎指正
以下内容在Kubuntu 6.10上完成 确保你安装有binutils包 一,准备工作 拿到BOMB后第一件事情反汇编出汇编代码 $objdump -d bomb>>bomb.txt 设置BOMB权限 $chmod 755 bomb 二,开始拆弹 进入GDB调试 $gdb bomb 这时候可以看出8048876:ff d1 call *%ecx这一句为STAGE的调用函数,为了确保BOMB不会在我的机器上爆炸而引起不必要的损失(修机器很麻烦的,哈哈)在这一句后面设置断点 (gdb)break *0x08048878 这时候有两个好处。首先从这里我们可以知道%eax内就存着STAGE的返回值,正确为1,错误为0。其次如果你发现返回0了,也就是你输错密码了,炸弹马上就要爆炸了的时候不需要紧急撤离,只需要输入 (gdb)kill 就可以结束进程,保证炸弹不会爆炸 然后在每个STAGE处设置断点,如 (gdb)break stage1 (gdb)break stage2 (gdb)break stage3 (gdb)break stage4 然后启动程序,当输入密码时先随便输入一个 (gdb)run 当程序在STAGE处停下来的时候找出0xc(%ebp),这个是机器内置的数值,也是每个人炸弹唯一不一样的地方(注意,不同STAGE中的0xc(%ebp)都是不一样的,正确做完一个STAGE再查另一个0xc(%ebp)) (gdb)pring *(int *)($ebp+0xc) 三,炸弹详解 我们令a=STAGE中的0x8(%ebp),也就是你输入的值 我们令b=STAGE中的0xc(%ebp) 炸弹一:a=[(8b-11)/6]+1 炸弹二:将b转为2进制,从前往后当发现第一个1时将后面全填为1,例如b=0101101001011010,那么a=0111111111111111 炸弹三:a=b(看起来很多,实际上是骗人的) 炸弹四: 这个有点麻烦,涉及到IMUL中要分出前32位与后32位,比较简单的做法是:从这句80494ab:39 c3 cmp %eax,%ebx中发现只要知道%eax,%ebx的值就可以,那么在8049497:89 c3 mov %eax,%ebx时发现%ebx的值已经确定,那么在下一句设置断点,查%ebx。而%eax的值随你输入变化而变化,可以写出calc_的c代码,其输入值calc_(0x8(%ebp),%eax)这样密码就确定了。 int cacl_(int a,int b) { int eax,j,k; if b>0 return (cacl_(2a,b-1)+1+a/2147483648) else return 0; } 4/4/2007 C/C++头文件一览C、传统 C++ #include <assert.h> //设定插入点 #include <ctype.h> //字符处理 #include <errno.h> //定义错误码 #include <float.h> //浮点数处理 #include <fstream.h> //文件输入/输出 #include <iomanip.h> //参数化输入/输出 #include <iostream.h> //数据流输入/输出 #include <limits.h> //定义各种数据类型最值常量 #include <locale.h> //定义本地化函数 #include <math.h> //定义数学函数 #include <stdio.h> //定义输入/输出函数 #include <stdlib.h> //定义杂项函数及内存分配函数 #include <string.h> //字符串处理 #include <strstrea.h> //基于数组的输入/输出 #include <time.h> //定义关于时间的函数 #include <wchar.h> //宽字符处理及输入/输出 #include <wctype.h> //宽字符分类 标准 C++ (同上的不再注释) #include <algorithm> //STL 通用算法 #include <bitset> //STL 位集容器 #include <cctype> #include <cerrno> #include <clocale> #include <cmath> #include <complex> //复数类 #include <cstdio> #include <cstdlib> #include <cstring> #include <ctime> #include <deque> //STL 双端队列容器 #include <exception> //异常处理类 #include <fstream> #include <functional> //STL 定义运算函数(代替运算符) #include <limits> #include <list> //STL 线性列表容器 #include <map> //STL 映射容器 #include <iomanip> #include <ios> //基本输入/输出支持 #include <iosfwd> //输入/输出系统使用的前置声明 #include <iostream> #include <istream> //基本输入流 #include <ostream> //基本输出流 #include <queue> //STL 队列容器 #include <set> //STL 集合容器 #include <sstream> //基于字符串的流 #include <stack> //STL 堆栈容器 #include <stdexcept> //标准异常类 #include <streambuf> //底层输入/输出支持 #include <string> //字符串类 #include <utility> //STL 通用模板类 #include <vector> //STL 动态数组容器 #include <cwchar> #include <cwctype> C99 增加 #include <complex.h> //复数处理 #include <fenv.h> //浮点环境 #include <inttypes.h> //整数格式转换 #include <stdbool.h> //布尔环境 #include <stdint.h> //整型环境 #include <tgmath.h> //通用类型数学宏 string.h中的函数@函数名称: strdup 函数原型: char *strdup(const char *s) 函数功能: 字符串拷贝,目的空间由该函数分配 函数返回: 指向拷贝后的字符串指针 参数说明: src-待拷贝的源字符串 所属文件: <string.h> #include <stdio.h> #include <string.h> #include <alloc.h> int main() { char *dup_str, *string="abcde"; dup_str=strdup(string); printf("%s", dup_str); free(dup_str); return 0; } @函数名称: strcpy 函数原型: char* strcpy(char* str1,char* str2); 函数功能: 把str2指向的字符串拷贝到str1中去 函数返回: 返回str1,即指向str1的指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char string[10]; char *str1="abcdefghi"; strcpy(string,str1); printf("the string is:%s\n",string); return 0; } @函数名称: strncpy 函数原型: char *strncpy(char *dest, const char *src,int count) 函数功能: 将字符串src中的count个字符拷贝到字符串dest中去 函数返回: 指向dest的指针 参数说明: dest-目的字符串,src-源字符串,count-拷贝的字符个数 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char string[10]; char *str1="abcdefghi"; strncpy(string,str1,3); string[3]='{post.content}'; printf("%s",string); return 0; } @函数名称: strcat 函数原型: char* strcat(char * str1,char * str2); 函数功能: 把字符串str2接到str1后面,str1最后的'{post.content}'被取消 函数返回: str1 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char buffer[80]; strcpy(buffer,"Hello "); strcat(buffer,"world"); printf("%s\n",buffer); return 0; } @函数名称: strncat 函数原型: char *strncat(char *dest, const char *src, size_t maxlen) 函数功能: 将字符串src中前maxlen个字符连接到dest中 函数返回: 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> char buffer[80]; int main() { strcpy(buffer,"Hello "); strncat(buffer,"world",8); printf("%s\n",buffer); strncat(buffer,"*************",4); printf("%s\n",buffer); return 0; } @函数名称: strcmp 函数原型: int strcmp(char * str1,char * str2); 函数功能: 比较两个字符串str1,str2. 函数返回: str1<str2,返回负数; str1=str2,返回 0; str1>str2,返回正数. 参数说明: 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { char *buf1="aaa", *buf2="bbb", *buf3="ccc"; int ptr; ptr=strcmp(buf2, buf1); if(ptr>0) printf("buffer 2 is greater than buffer 1\n"); else printf("buffer 2 is less than buffer 1\n"); ptr=strcmp(buf2, buf3); if(ptr>0) printf("buffer 2 is greater than buffer 3\n"); else printf("buffer 2 is less than buffer 3\n"); return 0; } @函数名称: strncmp 函数原型: int strncmp(char *str1,char *str2,int count) 函数功能: 对str1和str2中的前count个字符按字典顺序比较 函数返回: 小于0:str1<str2,等于0:str1=str2,大于0:str1>str2 参数说明: str1,str2-待比较的字符串,count-比较的长度 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { int ptr; char *buf1="aaabbb",*buf2="bbbccc",*buf3="ccc"; ptr=strncmp(buf2,buf1,3); if (ptr>0) printf("buffer 2 is greater than buffer 1"); else printf("buffer 2 is less than buffer 1"); ptr=strncmp(buf2,buf3,3); if (ptr>0) printf("buffer 2 is greater than buffer 3"); else printf("buffer 2 is less than buffer 3"); return(0); } @函数名称: strpbrk 函数原型: char *strpbrk(const char *s1, const char *s2) 函数功能: 得到s1中第一个“同时也出现在s2中”字符的位置指针 函数返回: 位置指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char *p="Find all vowels"; while(p) { printf("%s\n",p); p=strpbrk(p+1,"aeiouAEIOU"); } return 0; } @函数名称: strcspn 函数原型: int strcspn(const char *s1, const char *s2) 函数功能: 统计s1中从头开始直到第一个“来自s2中的字符”出现的长度 函数返回: 长度 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { printf("%d\n",strcspn("abcbcadef","cba")); printf("%d\n",strcspn("xxxbcadef","cba")); printf("%d\n",strcspn("123456789","cba")); return 0; } @函数名称: strspn 函数原型: int strspn(const char *s1, const char *s2) 函数功能: 统计s1中从头开始直到第一个“不来自s2中的字符”出现的长度 函数返回: 位置指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> #include <alloc.h> int main() { printf("%d\n",strspn("out to lunch","aeiou")); printf("%d\n",strspn("out to lunch","xyz")); return 0; } @函数名称: strchr 函数原型: char* strchr(char* str,char ch); 函数功能: 找出str指向的字符串中第一次出现字符ch的位置 函数返回: 返回指向该位置的指针,如找不到,则返回空指针 参数说明: str-待搜索的字符串,ch-查找的字符 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { char string[15]; char *ptr, c='r'; strcpy(string, "This is a string"); ptr=strchr(string, c); if (ptr) printf("The character %c is at position: %d\n",c,ptr-string); else printf("The character was not found\n"); return 0; } @函数名称: strrchr 函数原型: char *strrchr(const char *s, int c) 函数功能: 得到字符串s中最后一个含有c字符的位置指针 函数返回: 位置指针 参数说明: 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { char string[15]; char *ptr,c='r'; strcpy(string,"This is a string"); ptr=strrchr(string,c); if (ptr) printf("The character %c is at position:%d",c,ptr-string); else printf("The character was not found"); return 0; } @函数名称: strstr 函数原型: char* strstr(char* str1,char* str2); 函数功能: 找出str2字符串在str1字符串中第一次出现的位置(不包括str2的串结束符) 函数返回: 返回该位置的指针,如找不到,返回空指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char *str1="Open Watcom C/C++",*str2="Watcom",*ptr; ptr=strstr(str1,str2); printf("The substring is:%s\n",ptr); return 0; } @函数名称: strrev 函数原型: char *strrev(char *s) 函数功能: 将字符串中的所有字符颠倒次序排列 函数返回: 指向s的指针 参数说明: 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { char *forward="string"; printf("Before strrev():%s",forward); strrev(forward); printf("After strrev(): %s",forward); return 0; } @函数名称: strnset 函数原型: char *strnset(char *s, int ch, size_t n) 函数功能: 将字符串s中前n个字符设置为ch的值 函数返回: 指向s的指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char *string="abcdefghijklmnopqrstuvwxyz"; char letter='x'; printf("string before strnset: %s",string); strnset(string,letter,13); printf("string after strnset: %s",string); return 0; } @函数名称: strset 函数原型: char *strset(char *s, int ch) 函数功能: 将字符串s中所有字符设置为ch的值 函数返回: 指向s的指针 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char string[10]="123456789"; char symbol='c'; printf("Before strset(): %s", string); strset(string, symbol); printf("After strset(): %s", string); return 0; } @函数名称: strtok 函数原型: char *strtok(char *s1, const char *s2) 函数功能: 分解s1字符串为用特定分隔符分隔的多个字符串(一般用于将英文句分解为单词) 函数返回: 字符串s1中首次出现s2中的字符前的子字符串指针 参数说明: s2一般设置为s1中的分隔字符规定进行子调用时(即分割s1的第二、三及后续子串)第一参数必须是NULL在每一次匹配成功后,将s1中分割出的子串位置替换为NULL(摘下链中第一个环),因此s1被破坏了函数会记忆指针位置以供下一次调用 所属文件: <string.h> #include <string.h> #include <stdio.h> int main() { char *p; char *buffer; char *delims={ " .," }; buffer=strdup("Find words, all of them."); printf("%s\n",buffer); p=strtok(buffer,delims); while(p!=NULL){ printf("word: %s\n",p); p=strtok(NULL,delims); } printf("%s\n",buffer); return 0; } @函数名称: strupr 函数原型: char *strupr(char *s) 函数功能: 将字符串s中的字符变为大写 函数返回: 参数说明: 所属文件: <string.h> #include <stdio.h> #include <string.h> int main() { char *string="abcdefghijklmnopqrstuvwxyz",*ptr; ptr=strupr(string); printf("%s",ptr); return 0; } @函数名称: strlwr 函数原型: char *strlwr(char *s) 函数功能: 将字符串中的字符变为小写字符 函数返回: 指向s的指针 参数说明: 所属文件: <string.h> #include<string.h> int main() { char str[]="HOW TO SAY?"; printf("%s",strlwr(str)); return 0; } @函数名称: strlen 函数原型: unsigned int strlen(char * str); 函数功能: 统计字符串str中字符的个数(不包括终止符'{post.content}') 函数返回: 返回字符串的长度. 参数说明: 所属文件: <string.h> #include <stdio.h> #include<string.h> int main() { char str[]="how are you!"; printf("the lence is:%d\n",strlen(str)); return 0; } @函数名称: strerror 函数原型: char *strerror(int errnum) 函数功能: 得到错误信息的内容信息 函数返回: 错误提示信息字符串指针 参数说明: errnum-错误编号 所属文件: <string.h> #include <stdio.h> #include <errno.h> int main() { char *buffer; buffer=strerror(errno); printf("Error: %s",buffer); return 0; } @函数名称: memcpy 函数原型: void *memcpy(void *dest, const void *src, size_t n) 函数功能: 字符串拷贝 函数返回: 指向dest的指针 参数说明: src-源字符串,n-拷贝的最大长度 所属文件: <string.h>,<mem.h> #include <stdio.h> #include <string.h> int main() { char src[]="******************************"; char dest[]="abcdefghijlkmnopqrstuvwxyz0123456709"; char *ptr; printf("destination before memcpy:%s\n",dest); ptr=memcpy(dest,src,strlen(src)); if (ptr) printf("destination after memcpy:%s\n",dest); else printf("memcpy failed"); return 0; } @函数名称: memccpy 函数原型: void *memccpy(void *dest, const void *src, int c, size_t n) 函数功能: 字符串拷贝,到指定长度或遇到指定字符时停止拷贝 函数返回: 参数说明: src-源字符串指针,c-中止拷贝检查字符,n-长度,dest-拷贝底目的字符串指针 所属文件: <string.h>,<mem.h> #include <string.h> #include <stdio.h> int main() { char *src="This is the source string"; char dest[50]; char *ptr; ptr=memccpy(dest,src,'c',strlen(src)); if (ptr) { *ptr='{post.content}'; printf("The character was found:%s",dest); } else printf("The character wasn't found"); return 0; } @函数名称: memchr 函数原型: void *memchr(const void *s, int c, size_t n) 函数功能: 在字符串中第开始n个字符中寻找某个字符c的位置 函数返回: 返回c的位置指针,返回NULL时表示未找到 参数说明: s-要搜索的字符串,c-要寻找的字符,n-指定长度 所属文件: <string.h>,<mem.h> #include <string.h> #include <stdio.h> int main() { char str[17]; char *ptr; strcpy(str,"This is a string"); ptr=memchr(str,'r',strlen(str)); if (ptr) printf("The character 'r' is at position: %d",ptr-str); else printf("The character was not found"); return 0; } @函数名称: memcmp 函数原型: int memcmp(const void *s1, const void *s2,size_t n) 函数功能: 按字典顺序比较两个串s1和s2的前n个字节 函数返回: <0,=0,>0分别表示s1<,=,>s2 参数说明: s1,s2-要比较的字符串,n-比较的长度 所属文件: <string.h>,<mem.h> #include <stdio.h> #include <string.h> int main() { char *buf1="ABCDE123"; char *buf2="abcde456"; int stat; stat=memcmp(buf1,buf2,5); printf("The strings to position 5 are "); if(stat) printf("not "); printf("the same\n"); return 0; } @函数名称: memicmp 函数原型: int memicmp(const void *s1, const void *s2, size_t n) 函数功能: 按字典顺序、不考虑字母大小写对字符串s1,s2前n个字符比较 函数返回: <0,=0,>0分别表示s1<,=,>s2 参数说明: s1,s2-要比较的字符串,n-比较的长度 所属文件: <string.h>,<mem.h> #include <stdio.h> #include <string.h> int main() { char *buf1="ABCDE123"; char *buf2="abcde456"; int stat; stat=memicmp(buf1,buf2,5); printf("The strings to position 5 are "); if(stat) printf("not"); printf("the same"); return 0; } @函数名称: memmove 函数原型: void *memmove(void *dest, const void *src, size_t n) 函数功能: 字符串拷贝 函数返回: 指向dest的指针 参数说明: src-源字符串,n-拷贝的最大长度 所属文件: <string.h>,<mem.h> #include <string.h> #include <stdio.h> int main() { char dest[40]="abcdefghijklmnopqrstuvwxyz0123456789"; printf("destination prior to memmove:%s\n",dest); memmove(dest+1,dest,35); printf("destination after memmove:%s",dest); return 0; } @函数名称: memset 函数原型: void *memset(void *s, int c, size_t n) 函数功能: 字符串中的n个字节内容设置为c 函数返回: 参数说明: s-要设置的字符串,c-设置的内容,n-长度 所属文件: <string.h>,<mem.h> #include <string.h> #include <stdio.h> #include <mem.h> int main() { char buffer[]="Hello world"; printf("Buffer before memset:%s\n",buffer); memset(buffer,'*',strlen(buffer)-1); printf("Buffer after memset:%s",buffer); return 0; } 3/26/2007 LAB1///////////////////////////////////////////////////////////////////////////////
// PART I /////////////////////////////////////////////////////////////////////////////// // Duplicate the behavior of the bit operation &. // Example: bitAnd(6, 5) = 4 // Legal ops: ~ | // Max ops: 8 // Rating: 1 int bitAnd(int x, int y) { return ~((~x)|(~y)); } // Duplicate the behavior of the bit operation |. // Example: bitOr(6, 5) = 7 // Legal ops: ~ & // Max ops: 8 // Rating: 1 int bitOr(int x, int y) { return ~((~x)&(~y)); } // Compares x to y, i.e. x==y. It should return 1 if the tested condition // holds and 0 otherwise. // Examples: isEqual(5,5) = 1, isEqual(4,5) = 0 // Legal ops: ! ~ & ^ | + <<>> // Max ops: 5 // Rating: 2 int isEqual(int x, int y) { return !(x^y); } // Does a logical right shift of x to the right by n. // Can assume that 1 <= n <= 31 // Examples: logicalShift(0x87654321,4) = 0x08765432 // Legal ops: ~ & ^ | + << >> // Max ops: 16 // Rating: 3 int logicalShift(int x, int n) { return (x>>n)&((~0)^((~0)<<(32+(~n+1)))); } // Returns 1 if x contains an odd number of 1's, and 0 otherwise. // Examples: bitParity(5) = 0, bitParity(7) = 1 // Legal ops: ! ~ & ^ | + <<>> // Max ops: 20 // Rating: 4 int bitParity(int x)//0^1=1,1^1=0. { int wd16 = x ^ (x >> 16); int wd8 = wd16 ^ (wd16 >> 8); int wd4 = wd8 ^ (wd8 >> 4);
int wd2 = wd4 ^ (wd4 >> 2); int bit = wd2 ^ (wd2 >> 1); return bit & 1; } // Returns a mask that marks the position of the least significant 1 bit of x // with a 1. All other positions of the mask should be 0. // Example: leastBitPos(96) = 0x20 // Legal ops: ! ~ & ^ | + << >> // Max ops: 30 // Rating: 4 int leastBitPos(int x) { return (~x+1) & x; } // Returns a count of the number of 1's in the argument. // Examples: bitCount(5) = 2, bitCount(7) = 3 // Legal ops: ! ~ & ^ | + << >> // Max ops: 40 // Rating: 4 int bitCount(int x) { int x1,x2,a; a=0x55; a=(a<<8)|a; a=(a<<16)|a; x1 = (x>>1)&a; x2 = x&a; x = x1+x2; a=0x33; a=(a<<8)|a; a=(a<<16)|a; x1 = (x>>2)&a; x2 = x&a; x = x1+x2; a=0x0F; a=(a<<8)|a; a=(a<<16)|a; x1 = (x>>4)&a; x2 = x&a; x = x1+x2; a=0xFF; a=a|(a<<16); x1 = (x>>8)&a; x2 = x&a; x = x1+x2; a=0xFF; a=a|(a<<8); x1 = (x>>16)&a; x2 = x&a; x = x1+x2; return x; } // Compute !x without using ! operator. // Examples: bang(3) = 0, bang(0) = 1 // Legal ops: ~ & ^ | + << >> // Max ops: 12 // Rating: 4 int bang(int x) { int y =~x+1; return (((x|y)>>31)&1)^1; } /////////////////////////////////////////////////////////////////////////////// // PART II /////////////////////////////////////////////////////////////////////////////// // Return maximum two's complement integer // Legal ops: ! ~ & ^ | + << >> // Max ops: 4 // Rating: 1 int tmax(void) { return ~(1 << 31); } // Compute -x without using - operator. // Example: negate(1) = -1. // Legal ops: ! ~ & ^ | + << >> // Max ops: 5 // Rating: 2 int negate(int x) { return ~x+1; } // Determines whether argument y can be added to argument x without overflow. // Example: addOK(0x80000000,0x80000000) = 0, addOK(0x80000000,0x70000000) = 1 // Legal ops: ! ~ & ^ | + << >> // Max ops: 20 // Rating: 3 int addOK(int x, int y) { int a, b, sum; int mask; mask = 0x80 << 24; sum = x+y; a = !((x & mask) ^ (y & mask)) ; b = !!((x & mask) ^ (sum & mask)) ; return !(a&b); } // Check whether x is nonzero using the legal operators except ! // Examples: isNonZero(3) = 1, isNonZero(0) = 0 // Legal ops: ~ & ^ | + << >> // Max ops: 10 // Rating: 4 int isNonZero(int x) {
int y =~x+1; return ((x|y)>>31)&1; } // Converts a number from sign-magnitude format to two抯 complement format. // That is, the high order bit of x is a sign bit s, while the remaining bits // denote a nonnegative magnitude m. The function should then return the // two抯 complement representation of (-1)^s*m. // Example: sm2tc(0x80000005) = -5. // Legal ops: ! ~ & ^ | + << >> // Max ops: 15 // Rating: 4 int sm2tc(int x) { int sign = x>>31; return (x^sign)+(sign<<31)+(~sign+1); } // Compute absolute value of x. (Except it returns TMin for TMin) // Example: abs(-1) = 1. // Legal ops: ! ~ & ^ | + << >> // Max ops: 10 // Rating: 4 int abs(int x) { int sign = x>>31; return (x^sign)+(!!(sign&1)); } // Adds two values and if the result (x+y) has a positive overflow it returns // the greatest possible positive value (instead of getting a negative result). // If the result has a negative overflow, then it should return the least // possible negative value. // Examples: satAdd(0x40000000,0x40000000) = 0x7fffffff // satAdd(0x80000000,0xffffffff) = 0x80000000 // Legal ops: ! ~ & ^ | + << >> // Max ops: 30 // Rating: 4 int satAdd(int x, int y) { int a, b, sum,mask,signx; mask = 0x80 << 24; sum = x+y; signx=(x&mask)>>31; a = !((x & mask) ^ (y & mask)) ; b = !!((x & mask) ^ (sum & mask)) ; int r = !(a&b); r=(r<<31)>>31; return (r&sum)+((~r)&(((~(1 << 31))&(~signx))+(mask&signx))); } 3/17/2007 Google earth的地标打开你的Google earth, 麦田怪圈 53 31'54.33N,1 21'22.63W 37°50'38.81"N116°43'53.01"W 核设施 34.932808,-117.876949 发现号着陆的地方:爱德华兹空军基地 33.362882,40.596521 伊拉克西部的一个机场,已经不能使用了。跑道上隔一段距离就被堆了一些沙袋。 青藏铁路篇 这是青藏铁路在高原上的一段: 31° 5'55.90"N, 91°39'58.34"E Google Earth经典 这里收集了一些地理和有趣的坐标,使用方法很简单,先启动Google Earth,然后选择软 Google Earth上中国军事标语 卫国戍边: 39°41'44.94"N, 73°55'40.55"E 后面这几个是网上最先报料出来的,为原第八航校官兵在戈壁滩上创造的奇迹,这些环绕机场的“语录”地标,可以帮助飞行员保持空域位置,引导教、学员准确进出空域。其中一角还有一条废弃跑道。因为柳树泉机场地处戈壁,附近没有明显的地物特征!飞机都是设备简单的初教机,导航设备简陋,所以就弄了语录地标。 有兴趣的自己去看: 只争朝夕: 42°39'34.40"N, 94°16'4.27"E 军事篇 白宫: 38°53'23.90"N 77°00'32.60"W 体育篇 慕尼黑安联体育场(开幕式): 48.219147789,11.6263784774 文化篇 胡夫金字塔: 29°58'33.22"N, 31°7'49.29"E 风景篇 八达岭: 40°21'15.41"N,116°00'24.21"E 奇趣篇 比尔盖茨的豪宅: 47°37'37.71"N,122°14'33.26"W 台湾军事坐标 Matsu South(马祖南竿机场) 机场 26° 09' 02" N 119° 57' 13" E 名胜古迹之类 1/15/2007 GOOGLE的彩蛋--你知道么
IT界十年最重要10家公司排行榜业界著名杂志《Network Computing》公布了本世纪最后十年中,IT界最重要的10个公司。 该杂志说:“其中的一些公司的历史已经很悠久了,IBM成立时Yahoo创始人还没有出生呢!我们从中得到了这样的启示:每个行业都有老兵和新秀,每家公司都需要有向本行业的老大和对手挑战的勇气。同时我们相信,在从现在开始的未来十年中,这个名单中现有的一些名字仍将列在这个名单中,但也会有目前我们几乎没听说过的名字加入进来。在2010年来临的时候,谁将会成为新的微软和思科呢?如果我们知道的话,现在就不会还在做杂志业务了。 回首过去的十年,我们曾经报道了这些公司经历的大小事件,要是我们有这些公司的股票那就更好了。” 以下是十年来最有重要的10家公司名单 1: 思科:无可争议,这个位置应该属于它,无论从公司的产品、技术、市场、销售,它都有显著的成就,而最突出的在于其对互联网建设和应用起到了至关重要的作用。 2: 微软:无论你对它爱也好、恨也好,它在业界的地位和影响力是无可争议的。虽然微软是PC时代的霸主,但是当这个十年结束后,它已经发展成为信息系统里卓越的软件和服务提供商。它已经超越了一个软件公司。从人造卫星系统到有线电视,微软无所不在。 3: IBM:IBM在这个排名里上上下下,但是从来没有跌出前10。在这个十年开始的时候,IBM的傲慢态度令人厌恶,但是十年快结束的时候,IBM停止了下降趋势,又重新获得了业界显著地位,并重获一些老客户的信任。IBM能够做到这些,其实很简单:将价值、技术革新、客户服务有效地结合。 4: 英特尔:10年前在一个默默无闻的领域里起步,现在位列财富500强的第39位。年收入由39亿升到现在的290亿多美元,股票价格平均一年上扬48%。毫无疑问,英特尔已经成为半导体领域内的一龛神像。 5: Sun:它可能还是个硅谷的乳臭未干的孩子。但是现在,Sun已经超过惠普、IBM成为Unix服务器界的领头羊。随着SPARC架构的发展,我们可以看到这个公司的未来。 6: MCI通讯公司:多亏了这个公司,我们现在才有了选择长途通讯服务的自由。直到1984年,AT&T被拆,MCI才算出头。但是,1998年9月,MCI被WorldCom收购,组成了MCI WorldCom公司。虽然MCI已经成为回忆,但是它仍然值得我们回味。 7: Oracle:它世界上最大的数据库公司和第二大的软件公司,它是数据库世界的国王,并且很难被别人超越。它的数据库产品在万维网上的大部分地方运行。 8: Yahoo:说起来,它的野心并不大:Yahoo想成为每个互联网用户的起点和“家”。事实上,除了搜索,它为互联网的用户提供大部分他们需要的内容。更重要的是,它是众多.com公司中最早实现赢利的。 9: 惠普:这个公司似乎向来坚持“品质上乘,很少炒作”的作风,惠普喜欢稳扎稳打。从计算器到企业服务器,它都有产品在为大家服务。其商业道德也值得称颂。现在惠普正与IBM和Sun在互联网时代展开一场白刃战。 10: Novell:一眼看上去,把Nowell列在这里可能是个错误,但是看看它在这10年间,在死亡和复兴间的反复无常,看看它把分析师和客户们弄的毫无喘息吧。今天,Novell似乎又在垂死挣扎了,但是它仍然有许多具有历史意义的产品。 12/24/2006 2006病毒蠕虫和恶意软件大奖象以往一样,Panda Software今年年底又发布了一份年度名单,上榜的是那些本年度最有特色的恶意程序们。 12/8/2006 史上最强!PC时代的20位英雄 回首PC20年,它的历史就是一部英雄的历史,一个个闪亮的名字,就像一颗颗璀璨的星星,为人羡慕、令人敬仰;他们对PC业的兴起,对计算机技术的繁荣,对人类的贡献是我们不应忘记的。当本文重现历史的一幕幕时,我们会看到什么?无疑,其中有光辉与荣耀,有财富与成就,当然,也有遗憾与悲怆……
电脑始祖 冯·诺依曼(John Von Neuman)凭他的天才和敏锐,在电脑初创期,高屋建瓴地提出了现代计算机的理论基础,从而规范和决定了电脑的发展方向。时至今日,我们所有的电脑又都叫“冯·诺依曼机器”,就是对这位数学天才最好的评价。 对于冯·诺依曼来说,人类第一台电脑造了一半时才参与开发,多少有些遗憾。但是,他刚好在那大机器程序存储问题无法解决的关键时刻出现,这使得冯·诺依曼的天才得到淋漓尽致的发挥。他明确指出:一定要彻底实现程序由外存储向内存储的转化,原有的设计必须作修改,经费不够再追加。在冯·诺依曼的影响下,整个研制工作取得了突破性的进展。冯·诺依曼提出了新的改进方案:一是用二进制代替十进制,进一步提高电子元件的运算速度;二是存储程序(Stored Program),即把程序放在计算机内部的存储器中,换言之,把能进行数据处理的程序放在数据处理系统内部,程序和该程序处理的数据用同样的方式储存,即把程序本身当作数据来对待。冯·诺依曼的改进方案被称为“爱达法克”(EDVAC),即离散变量自动电子计算机(Electronic Diserete Variable Computer)的简称。 1945年6月,他写了一篇题为《关于离散变量自动电子计算机的草案》的论文,第一次提出了在数字计算机内部的存储器中存放程序的概念(Stored Program Concept),这是所有现代电子计算机的范式,被称为“冯·诺依曼结构”。按这一结构建造的电脑称为存储程序计算机(Stored Program Computer),又称为通用计算机。时至今日,所有的电脑都逃脱不了冯·诺依曼的掌心,我们所有的电脑,都有一个共同的名字,叫“冯·诺依曼机器”,它超越了品牌、国界、速度和岁月。 摩尔定律 当人们不断追逐新款PC时,殊不知这后面有一只无形的大手在推动,那就是摩尔定律,而这著名定律的发明人就是高登·摩尔(Gordon Moore)。 1965年的一天,摩尔顺手拿了把尺子和一张纸,画了一张草图,纵坐标代表不断发展的集成电路,横坐标是时间。他在月份上逐个描点,得到一幅增长的曲线图。这条曲线显示出每24个月,集成电路由于内部晶体管数量的几何级数的增长,而使性能几乎翻倍提高,同时集成电路的价格也恰好减少一倍。后来高登·摩尔把时间调整为18个月。摩尔是在集成电路技术的早期作出结论的,那时候,超大规模集成电路技术还远未出现,所以他在1965年的预言并未引起世人的注意。
高登·摩尔的另一壮举是在1968年与罗伯特·诺伊斯带头“造反”,率领一群工程师离开仙童公司,成立了一家叫集成电子的公司,简称“Intel”,这就是今日名震世界的英特尔公司。 预言大师 凯的形象既不像傲慢自大、反潮流的黑客,也不同于一夜暴富的计算机富翁,更不像象牙塔里的计算机科学家。他时常穿着跑鞋和灯芯绒裤子,一小撮胡子,短短的、略微零乱的头发,使他看上去极为普通。即使他是你的老板,可能也不会给你留下多深的印象。但这也不是说他很谦逊,他喜欢引用自己的话,且经常以这样的词作为发言的开端:“凯的第一法则指出……”。 阿伦·凯(Alan Kay)不是一位公众人物,但在计算机界,尤其是技术圈内,他是能让大家都心服口服屈指可数的大师之一。成为硅谷的又一位亿万富翁或让他当麻省理工的院长,都无法激起他的兴奋,但他会有足够的耐性与一群8岁左右的孩子一起玩电脑。他最大的乐趣就是发明他喜欢的东西。 阿伦·凯是Smalltalk面向对象编程环境语言的发明人之一,也是面向对象编程思想的创始人之一,同时,他还是笔记本电脑最早的构想者和现代Windows GUI的建筑师。 近年来有一句话挺流行:“预测未来的最好办法,就是把它创造出来。”不少人误以为此言出自尼葛洛庞帝之口,实际上,这句话是阿伦·凯的名言。有很多人说布兰德是第一个使用PC一词的人,但布兰德说自己也是顺手牵羊,最早提出“PC”概念的就是阿伦·凯。20世纪90年代程序员设计的基本模式就是“面向对象”,发明这一术语的也是阿伦·凯。在20世纪70年代的一份备忘录上,阿伦·凯还正确预言到,“20世纪90年代将有成百万的个人计算机,而且都将连接到全球公用的信息设施上”,这不正是今天的互联网吗? 集成电路之父 硅谷是传奇人士扎堆之地。但是一个人要想在硅谷同时获得财富、威望和成就,实在比登天还难。举目远眺大概只有罗伯特·诺伊斯(Robort Noyce)才是惟一一位三位于一体式的人物。 作为集成电路的发明者,诺伊斯在科学史上已名垂青史,这个具有划时代意义的发明促成了历史的大转折。而且他还与别人共同创办了两家硅谷最伟大的公司,第一家是半导体工业的摇篮——仙童(Fairchild)公司,这已成为历史;第二家则仍跻身美国最大的公司之列,这就是英特尔公司。他带着特有的神圣和威严,让同行和对手都得永远敬仰。以尖刻著称的硅谷杂志《Upside》敢对硅谷任何一位大腕儿进行任何刺激,但对诺伊斯却只能毕恭毕敬,在诺伊斯去世前几天的采访录,甚至成为杂志社经常炫耀的一种荣光。 在仙童,诺伊斯最大的成就是发明了集成电路。当基尔比在德州仪器用锗晶片研制集成电路时,诺伊斯和摩尔已把眼光直接盯住了硅晶片,因为硅的商业前景要远远超出锗。1959年2月,诺伊斯为“微型电路”申请了专利,但没有为他用平面处理技术制造的集成电路申请专利,直到同年7月才补全了这一手续。而此前德州仪器公司已宣布生产集成电路的产品,该公司的基尔比拥有第一个专利,但他的设计不实际,而诺伊斯则是第二个提出该专利的人。于是整个60年代,仙童和德仪相互控告,最后法庭将集成电路的发明专利授予了基尔比,而将关键的内部连接技术专利授予诺伊斯。诺伊斯的专利使仙童公司在沉闷的70年代得以存活下来,这一时期的仙童成为硅谷最具神话色彩的历史。 当然诺伊斯成就的最高峰还是英特尔公司,他与高登·摩尔和安迪·葛鲁夫一同创业,而且构建了业界极为罕见、完美和谐的三人“执政”局面。三人的合作只能说是天作之合,缺任何一位可能都会让英特尔历史大幅改写。诺伊斯自然是最耀眼的人物,传奇式的发明家、仙童公司的总经理和半导体业的“政治家”,他是英特尔公司的“脸面”。而甘于默默无闻的高登·摩尔则是公司的“心脏”,没有摩尔,英特尔不可能有足够的力量和士气;而没有强硬的葛鲁夫,英特尔甚至不会成为一家著名的大公司。 微处理器之父 1971年1月,第一个可以运转的微处理器诞生了,定名为“4004型”。其中,第一个“4”是指以4位为单位的设计思想,后一个“4”是指由英特尔制造的第4种专用芯片,而它的发明人就是特德·霍夫。霍夫认为自己占了天时和地利之便:“如果我们没有在1971年发明4004微处理器,那么别人也会在一两年里发明它。” 在普遍认为大型机才是大有可为的时代,霍夫另辟蹊径,投入到微处理器的研制中。霍夫说服了刚从仙童公司跳槽的斯坦·麦卓尔与他合作,共同设计了一种比4004型更强大的微处理器,称为“8008型”,这是第一个真正意义的微处理器。 1973年8月,“8080型”微处理器问世,它首次使用了MOS(金属氧化物半导体)工艺,成为有史以来最成功的微处理器之一,这也是第一个通用微处理器,是20世纪最后25年里一项具有划时代意义的发明。 著名的《经济学家》杂志将霍夫称作是“第二次大战以来最有影响的7位科学家之一”。1978年,他被提升为英特尔研究员(至今一共只有两个人获得过类似的称号),这意味着他在研究方面具有很大的自主权。 在评价微处理器和PC时,霍夫说:“我对微处理器在个人计算机中的应用感到非常惊讶,我也没有想到人们会仅仅为了业余的爱好而买微机。随着影像游戏机的发展,个人计算机成为人们又一种娱乐工具,任何一位发明家如果能够创造出什么来提供给人们娱乐,他就能获得成功。” PC之父
创造出世界上第一台微电脑的殊荣,现在一般都归到爱德华·罗伯茨(Edward Roberts)身上。
罗伯茨是位电脑爱好者,1974年,罗伯茨决定利用8080微处理器装配一种供黑客试验的计算机,《大众电子》杂志为寻找独家新闻,主动上门观看了罗伯茨的设计方案,之后决定让他制成一台原型机,由杂志社在封面予以报道。 1975年1月,《大众电子》封面刊出一台很小的计算机照片,大字标题写着:“世界上第一组堪与商业机相媲美的以成套形式提供的小型计算机——牛郎星8800”。根据杂志的介绍,“牛郎星”勉勉强强算是一台电脑,在金属制成的小盒内,罗伯茨装进两块集成电路,一块即8080微处理芯片,另一块是存储器芯片。既没有可输入数据的键盘,也没有显示计算结果的“面孔”。插上电源后,使用者需要用手按下面板上的8个开关,把二进制数“0”或“1”输进机器。计算完成后,面板上的几排小灯泡忽明忽灭,就像军舰上用灯光发信号那样表示输出的结果。 就是这样一个简单的装置,却引发了大地震。罗伯茨的“牛郎星”电脑问世后,美国出现了一个电脑业余爱好者购买散件、在家庭车库内组装微电脑的热潮。 尽管“牛郎星”十分原始,但它把计算机发展到大型机时代料想不到的辉煌阶段。 商用软件之父 个人电脑的真正飓风是由AppleⅡ刮起的,而AppleⅡ成功的重要推进器就是VisiCalc电子表格软件。因为售价3000美元的AppleⅡ对家庭并没有多少吸引力,但配备了电子表格的AppleⅡ,就足以让人们把VisiCalc作为惟一的理由而购买它。从某种意义上说,AppleⅡ就是一台VisiCalc机器。 VisiCalc的发明人就是丹·布莱克林(Dan Bricklin)。1973年毕业后,布莱克林进入DEC,与他人合作编制了DEC的第一个字处理软件WPS-8。26岁时,布莱克林进入哈佛商学院寻求新的职业生涯,他在哈佛的分时计算机系统上用BASIC编写软件,进行财务计算。当时他常遇到的问题是,对不同的题目必须重新编写程序,于是他便开始思考能否用一种通用的计算模式来解决该问题。布莱克林用一个周末的时间粗粗地做出了一个演示版本。虽然这个演示版本是用BASIC写成的,速度很慢,而且行列只能添满一屏,但它已经具备电子表格的许多基本功能,此时已是1978年初。由于AppleⅡ等个人电脑产品的问世,布莱克林和麻省理工的老朋友富兰克斯顿一起合作,成立了软件艺术公司(SA),决定为AppleⅡ开发VisiCalc,发行商是丹·弗莱斯特拉的公司叫Personal软件公司(PS),可以说这是最早的微机应用软件公司。 电子表格VisiCalc的出现将PC从业余爱好者手中的玩具变成了炙手可热的商业工具,独立地改变了PC业的发展方向。布莱克林创造的不仅仅是一个产品、一家公司,而是整个软件产业。VisiCalc引发了真正的PC革命,它极大地激励了软件开发者,并从此宣告了PC商用化的到来。 IBM PC之父 如果说个人电脑之火是由苹果引燃的,那么IBM的介入,才真正将这场大火燃遍全球,热度持续近20年而不减。而缔造IBM PC的,就是颇富个人魅力的唐·埃斯特利奇。 1980年中,IBM召集高层咨询会议,要对如火如荼的个人电脑浪潮作出应对。这时实验室主任洛伊站起来,提议打破常规,秘密组织一个精干小组,在一年内搞出PC来。 洛伊仅挑选了12名最优秀的工程师来演绎一段类似苹果公司经历过的传奇故事,担当这个名为“西洋棋”项目的负责人就是埃斯特利奇。以往,埃斯特利奇在工作上被认为“极不合作”,不听别人使唤,只凭自己的意思行事。而这种不合群的态度,正适合IBM PC计划,洛伊将它交给埃斯特利奇,事实证明这个选择十分英明。 1981年8月12日,IBM PC如人们预想的那样跨进了PC业,没有人惊奇和兴奋,因为要等一段时间,人们才真正明白PC时代的开始。在第一台PC发布前几个月,埃斯特利奇还着手下一代产品——PC XT的开发。XT的推出,再次把IBM推到PC科技的最前端,XT疯狂畅销,使IBM一举占有企业PC市场的75%。同时埃斯特利奇还启动另一计划,以PC攻打家庭市场,但推出时间太晚,错过了圣诞销售旺季,后来这个产品无疾而终。1982年,埃斯特利奇开始着手下一个大计划,即生产真正强劲的AT机。AT机象征着IBM是惟一能使用80286处理器的厂商。1984年 8月,AT机推出好几个月后,竞争对手才推出AT级产品。1984年, IBM PC的收入已达到40亿美元,这意味着光是PC一个部门就可以在美国工业公司中排名第74位,并可名列美国第三大计算机公司,仅次于IBM自己和DEC。埃斯特利奇还安排了一个争议性的计划,让经销商销售个人电脑,这是IBM产品第一次由非IBM业务代表的人销售, 从而开拓了电脑分销的先河。 1985年8月2日埃斯特利奇终于带着太太,去渡公司承诺已久的假期。两人乘坐的191航班试图在暴风雨中降落到达拉斯机场时,飞机失控,埃斯特利奇和太太玛丽不幸丧生。虽然他的生命结束于不幸的飞行事故,但打开昨日的篇章,历史永远会承认一个真正有贡献的人。 PC软件先锋 加里·基尔达尔被称为PC软件的开拓者,因为正是他打开了微处理器和微电脑之间的通道,在PC革命英特尔公司锋利的弹片中,有着基尔达尔历史性的贡献。 加里·基尔达尔敏锐地发现,4004微处理器可以用来编制程序,基尔达尔突然想到:“能不能在这里编制电脑的程序呢?”,这想法诞生了微程序(Microprogram)设计。基尔达尔在DEC公司的PDP-10小型机上为英特尔4004微处理器创建新的“微语言”后,英特尔马上聘请基尔达尔做技术顾问。在基尔达尔的主持下,创建了在个人电脑史上革命性的微处理程序设计语言PL/M(Programing language for Microprocessor)。这一新的语言随着Intel 8008、8080微处理器的进展,对个人电脑的革命起着巨大的推动作用。如果没有基尔达尔这一贡献,英特尔的微处理器肯定还会在计算器里“沉沦”许久,PL/M语言与Intel、Zilog、Motorola微处理器的结合,在70年代末,终于使微机的性能能同60年代的大型机和小型机相媲美。 另外,基尔达尔还是第一个光盘(CD-ROM)驱动程序的编写者,也是图形用户界面的先驱,当时还没有GUI(Graphic User Interface)的说法,基尔达尔把它叫做“图形环境管理员(Graphic Enviroment Manager)”。 电脑奇才 恩格尔巴特(Doug Engelbart)是电脑界的一位奇才,被称为“人机交互”领域里的大师。从20世纪60年代初期开始,他在人机交互方面做出了许多开创性的贡献,共发表论文30余篇,拥有20余项发明专利。世界上第一个电子邮件系统(E-Mail)、文字处理系统、在线呼叫集成系统和超文本链接都出自他之手。另外,他还发明了电脑显示器上的多重视窗、共享屏幕的电视会议、新的电脑交互输入设备等等。在恩格尔巴特的众多发明中,人们最熟悉的就是电脑上用的鼠标。1963年,美国国家专利局批准恩格尔巴特几年前提交的一份申请,确认一种叫“搜寻点击”的输入装置是一项独创的技术。在英语中,mouse有老鼠的意思,因此“搜寻点击”装置又被称为鼠标。1968年,恩格尔巴特应邀参加在旧金山举行的一次电脑会议,在会上,他拿出了许多令人吃惊的绝活:视窗(Windows)、超媒体(Supermedia)、群件(Groupware),还有鼠标,这也是鼠标第一次作为“搜寻工具”公开亮相。 MS-DOS之父
谁都知道MS-DOS是美国微软公司的产品,而且正是MS-DOS使微软公司实现了从一个不知名的软件开发公司到全球软件巨头的第一次飞跃。MS-DOS曾是微软公司的拳头产品,长期统治着个人电脑操作系统市场。虽然现在的微软“视窗”已经成为新一代PC操作系统霸主,但MS-DOS对业界的功劳仍不可磨灭。不过MS-DOS的真正主人蒂姆·帕特森的名字可能并不为每个人所知道。 帕特森在西雅图电脑制造公司任副总裁时,自己动手花了半年时间成功地推出了自己的操作系统,命名为SCP-DOS,本意为“快而粗糙的磁盘操作系统”,这个SCP-DOS便是现在DOS的前身。SCP-DOS推出之后,应用效果不错,但也曾被数据研究公司指责剽窃了他们当时颇受欢迎的CP/M操作系统。这两个操作系统确实有相似之处,不过 SCP-DOS在储存数据、组织文件等方面与CP/M有极大的不同。那么后来SCP-DOS如何成为MS-DOS呢?这还得从IBM的“西洋棋方案”说起。 1980年,IBM公司决心开发自己的个人电脑,便制定了“西洋棋方案”。他们需要找一家软件公司合作开发一套个人电脑操作系统。当时的微软为了不错过这个千载难逢的发展机会,向IBM称自己有软件操作系统,实际上,虽然当时微软公司在软件行业已有一席之地,但依靠的却是其程序语言,并无现成的操作系统。为了与IBM公司合作,微软不得不去找帕特森。 微软从帕特森那里,仅以2.5万美元的转让价格便获得了SCP-DOS的使用权。SCP-DOS虽比较粗糙,但已经具有了雏形,只要在其基础上进行加工,搞出合乎要求的产品并不太难。事实上,SCP-DOS对微软的重大意于义在于,它使IBM公司放弃了CP/M,转而与微软合作,从而成就了微软的未来。 1981年4月,帕特森离开了西雅图电脑制造公司,投到微软公司门下,这时才知道自己的操作系统被微软拿来作为IBM公司合作的产品之一。他当时非常恼火和后悔,不过也无可奈何,自己的成果虽然潜力无限,但在西雅图电脑制造公司却无法得到推广,相反由微软公司去发展完善,总比埋没了要好。 便携计算机之父 在硅谷历史上,亚当·奥斯本(Adam Osborne)绝对算得上是一个人物,他在20世纪70年代初期得到了一份为英特尔新发明的微处理器编写说明书的工作,随后成为技术领域的自由撰稿人,先后在计算机杂志《界面时代》(Interface Age)和《Infoworld》上开辟专栏。 但奥斯本有更大的计划,他想要成为这个行业的一分子、硅谷的大亨,向对他的逻辑天才发生过怀疑的人证明他们的错误。他毫不谦虚,甚至有些自大地说:“我跟每一个人说,他们应该制造什么,可是没有人听我的话,所以我自己去制造了。” 令人惊奇的是,奥斯本证明了他的设想是合理的。奥斯本有两个很妙的主意:首先,利用眼下电路体积变得越来越小的优势,制造出一种既小又轻而且结实的便携式个人计算机;其次,把当时需单独购买并且价格昂贵的最流行软件,算在个人计算机的价格内卖给顾客。此前,硬件和软件公司从来不会同时提供这两项服务。 1980年3月,在西海岸计算机展览会上,奥斯本见到了为一家硬件公司设计电路板的Lee Felsenstein。奥斯本向他提出了自己的设想,并对Felsenstein提出设计要求:这台计算机一是要廉价结实,既小又轻;二是要捆绑字处理和电子表格软件。 1981年4月奥斯本Ⅰ型计算机全新亮相,含软件在内的整机价格仅1795美元。这一下子就轰动四方,到1981年9月,公司月销售额就攀升至100万美元,第二年公司收入就达7000万美元。 但奥斯本公司在成立的第二年的年中,便开始出现严重的错误。管理上的混乱导致产品质量下降、交货延误和财政空虚,而市场策略的错误更使它功亏一篑。当时在市场上占统治地位的是IBM,而奥斯本公司的“管理者”却不能与之兼容,这本不算太糟,但奥斯本不能忍受这样的情况。于是,奥斯本在新产品投放市场一星期后,宣布他已开始准备与IBM兼容,这等于无形之中宣布自己的产品已经过时,使销售量顿时一落千丈。一个美丽的计算机神话仅仅维持了不到两年时间。这个以自己的创新理念,促使计算机业发展方向发生革命的人物,这个一度是PC业内最具影响力、最富争议的人物,就这样从业界淡出,将一切甩在了自己的身后。 磁盘之父 各种类型的软、硬磁盘,是个人电脑最重要的存储设备,磁盘的历史并不太长,从世界上第一台硬盘发明至今,也不过40余年时间。 20世纪50年代,IBM公司董事长小托马斯·沃森迅速把事业扩展到美国西海岸,下令在加利福尼亚圣何塞市附近新建实验室和工厂。约翰逊带领着30多名青年工程师,在不到三年时间,就为IBM创造了引人注目的技术成果——磁盘存储器。在约翰逊领导IBM圣何塞实验室研制硬盘的过程中,一位名叫艾伦·舒加特(Al.Shugart)的青年工程师发挥了关键作用。 舒加特1951年大学毕业后加盟IBM,在研究部门工作了十多年。 1969年,他离开IBM建立舒加特合伙人公司,并研制出世界上第一片以塑料材质为基础的5英寸软磁盘,即PC机上使用的标准软盘。 1974年,舒加特首次创办的公司倒闭,五年之后,舒加特重返电脑行业,在著名的硅谷腹地, 与过去的几位同事共同创建了希捷(Seagate)技术公司,专门为个人电脑研制高性能的小型硬盘。 1980年,希捷技术公司宣布研制出第一台5.25英寸温式硬盘,容量达5~10MB,后来成为IBM PC/XT个人电脑最具特点的标准配置。 舒加特领导的这家公司,目前已是资产数十亿美元、员工10余万人的世界上最大的PC硬盘生产厂商之一。 自由软件之神 20世纪末,软件业发生的最大变革就是自由软件的全面复兴。在自由软件的浪潮下,软件业的商业模式脱胎换骨,从以卖程序代码为中心,转化为以服务为中心,而理查德·斯托尔曼则被称为软件业的自由之神。有人说,斯托尔曼应该算是世界上写软件最多的程序设计师。但是,斯托尔曼真正的力量是他的思想。在斯托尔曼的理论下,用户彼此拷贝软件不但不是“盗版”,而是体现了人类天性的互助美德。对斯托尔曼来说,自由是根本,用户可自由共享软件成果,随便拷贝和修改代码。他说:“想想看,如果有人同你说‘只要你保证不拷贝给其他人用的话,我就把这些宝贝拷贝给你’。其实,这样的人才是魔鬼”。 理查德·斯托尔曼一副披头士的打扮,看起来像现代都市里的野人,但如果他将一件“麻布僧袍”穿在身上,又戴上一顶圆形宽边帽子,有如绘画作品中环绕圣像头上的光环。一眨眼的功夫,他又变成圣人,散发着先知般的威严和力量。野人与圣人,恰恰就是这位自由软件的精神领袖理查德·斯托尔曼的双重属性,他既是当今商业软件领域野蛮的颠覆者,又是无数程序员和用户心目中神圣的自由之神。 微软帝国 据不久前的一期《福布斯》杂志的年度统计,微软创始人比尔·盖茨(Bill Gates)以587亿美元的个人资产仍排名世界首富。他在短短20多年的时间里创造的财富比传统的汽车大王、石油大王、钢铁大王或金融寡头在200年时间里创造的家庭财富还多。 像苹果砸出牛顿的智慧一样,个人电脑突入盖茨的脑海也有一个外在的启蒙者,这就是1975年1月份的《大众电子学》杂志,它封面上Altair 8080型计算机的图片一下子点燃了比尔·盖茨的电脑梦。盖茨打电话给罗伯茨表示要给Altair研制Basic语言,之后,盖茨和艾伦在哈佛阿肯计算机中心没日没夜地干了8周,为8008配上Basic语言,开辟了PC软件业的新路。 1975年5月,比尔·盖茨产生了退学的想法,他希望能和好友艾伦一起创办一个软件公司,由于父母的极力反对,比尔·盖茨没能马上退学,但他还是离开了西雅图到了亚帕克基。1975年7月,他与艾伦合作创建公司。微软公司前身成立时,比尔·盖茨正好20岁。 如今微软已成为了业内的“帝国”,除了主宰PC操作系统和办公软件外(这是微软的命脉),还涉足个人财务软件、教育及游戏软件、网络操作系统、商用电子邮件、数据库及工具软件、内部网服务器软件、手持设备软件、网络浏览器、网络电视、上网服务及近20个不同的Web网站。 PC直销
迈克·戴尔(Michael Dell)曾就读于奥斯汀的德克萨斯大学,19岁退学。 1984年,迈克·戴尔以1000美元和一个在个人计算机业中前所未有的理念建立了戴尔公司,即避开给产品增值较少的中间商,直接向最终用户销售量身订制的个人计算机。这样可以根据订单生产以取消库存,并把后勤服务与供应商结合起来,创造出一种规范化、低成本的企业文化。通过这种创新的直线订购方式和在业界率先倡导的服务和技术支持方案,戴尔公司已成为全球顶尖的个人计算机供应商之一,并且是领先的计算机直线订购公司和全球发展最快的主要计算机系统公司。 戴尔公司在PC的领导地位带来了全球革命,还被公认为是最大的计算机系统网上供应商,迈克·戴尔因此成为当时最年轻的首席执行官之一,他的个人资产曾达到214.9亿美元。 苹果创始人 不久前,美国《洛杉矶时报》评选出了“20世纪经济领域50名最有影响力人物”,史蒂夫·乔布斯(Steve Jobs)与另一名苹果电脑公司创办人沃兹·尼克并列第5名,他们的贡献主要表现为“创办苹果电脑,带动了全球个人电脑普及应用浪潮,并迫使IBM PC于1981年面市”。历经了20多年的磨炼,人们在史蒂夫·乔布斯身上发现了一系列走向成功的闪光之处:首先是信息消费技术产品的主导者,其次,是随机应变的企业家。 1976年,21岁的乔布斯和26岁的沃兹·尼艾克在乔布斯自家的车库里成立了苹果电脑公司。他们的第一个产品是一种没有键盘、机箱、声音和图像的计算机电路板,他们称之为Apple I。1977年4月他们成功开发了AppleⅡ,这是有史以来第一台具有彩色图形显示功能、键盘、电源和造型的个人电脑产品,也是第一台在市场上进行销售的个人电脑。1985年,苹果公司已经拥有了20亿美元的资产,成长为当时硅谷灿烂的明珠。 乔布斯的另一个功绩是在1997年9月重返该公司任首席执行官后,对奄奄一息的苹果公司进行大刀阔斧的公司改组和一连串新产品降价促销的措施。乔布斯抓住Internet浪潮带来的机遇,相继推出了Power Macintosh G3、iMac和iBook等一系列划时代产品,不仅让苹果电脑公司起死回生,从赤字累累奇迹般地变为连番获利,而且使苹果在1998第四个财政季度创造了1.09亿美元的利润。苹果重新回到了全球信息技术潮流领袖的地位,并带动全球个人电脑与信息技术产品时尚化、易用化的新潮流。 以太网之父 鲍伯·梅特卡夫(Bob Metcalfo)被称为以太网之父,并且提出了网络的实用性与其使用者数目的平方成正比的“梅特卡夫法则”,即如果网络中有n个用户时,网络中就有n(n-1)个潜在商品,当第n+1个顾客加入此网时,该用户就向其他所有用户提供了2n个潜在商品。 鲍伯·梅特卡夫毕业于麻省理工学院,后来到哈佛念博士。他在哈佛大学宣读了阐述以太网的论文,哈佛大学说理论性不强,要他进行理论升华,然后再答辩。梅特卡夫无奈,只好到心理学家泰勒这里来“升华”,想不到却搞出惊人之举。在他主持下,施乐硅谷研究中心1973年5月,第一次在局域范围内实现了微机间的联网。梅特卡夫欣喜不已,当他要给这个新联网系统取名字时,一想到哈佛大学说他的理论深度不够,就气不打一处来,想到19世纪末物理学家们提出的玄虚不已的以太(Ether)理论,就郑重其事把它命名为“以太网”(Ethernet),并于1977年申请了专利。1979年4月,鲍伯·梅特卡夫正式成立了3Com公司,目标就是推进以太网成为业界标准。现在当以太网带宽开始向10G迈进时,谁还能说以太网不是业界的一个标准呢? IT偏执狂 葛鲁夫绝对是20世纪史上最重要的角色之一:他开创了微处理器产业、引爆了个人电脑革命并一手将英特尔打造成超级竞争机器。他的竞争策略是:推出新产品、主动降价打击竞争对手、再推出新产品……,这个逼迫自己不断进步,不让对手有任何喘息空间的策略,让英特尔主宰个个电脑产业的时间超过十年。现在他虽然已经退居二线,但葛鲁夫仍然是位值得研究的大师。 1998年1月5日,是葛鲁夫一生中最辉煌的时刻,他战胜了英国王妃戴安娜、克隆绵羊多莉之父伊安·威尔马特和美联储主席艾伦·格林斯潘,成为《时代周刊》新一届的年度世界风云人物,加上1997年英特尔辉煌的业绩,葛鲁夫的名声和威望被推上了巅峰。 而之后的葛鲁夫选择了急流勇退,1998年5月他将CEO一职交给公司总裁贝瑞特,只留下更具象征性的董事会主席一职。这一方面与他的年龄和身体状况有关,另一方面是处于战略转折点的CPU市场,迫使他提前让贤。此后,由于公司业绩不佳,加上低端市场操作不力,公司股票比高峰时下跌30%以上。葛鲁夫走得恰是时候,这位好斗、爱发脾气、有驾驭力的铁腕人物必须将权力之杖让与一个更和气、更具亲和力的人,才能使英特尔力挽狂澜。 蓝色救星 20世纪80年代末,将头埋在沙里的IBM公司经理们,面对新崛起的个人电脑还死抱着大型电脑的概念不放。20世纪90年代初期,由于欧美经济萧条,IBM公司内部机构臃肿,连续几年公司股票不断下跌,一时间,不少持悲观态度的人士认为,IBM已经难以逃脱覆舟的命运,当时的IBM几乎成了一辆没人要的破车。 1993年郭士纳正式接管IBM,开始发起向PC业的进军,重振IBM雄威。1994年底,IBM获得了自20世纪90年代以来的第一次赢利30亿美元。正如郭士纳所说,信息革命即将发生,IBM再也不能靠亮皮鞋和微笑来过关了。 1995年6月5日,处理完内部事务的郭士纳终于将锋芒扫向了外界。他瞄上了Lotus公司,不顾Lotus总裁吉姆·曼兹的反对,决定强行吞并。6月11日,这桩生意最终以35亿美元成交,成为当时软件史上最大的购并案。之后,郭士纳将Lotus的Notes软件作为武器,向软件市场发动总攻,并一举拿下了企业网络市场。1995年,IBM营收突破了700亿美元大关。 郭士纳为IBM带来了滚滚利润,也为他自己挣得了不菲的收入。1996年他已获得了82.5万股期权,账面价值6900万美元。1997年3月,董事会同意再给他增加30万股期权,希望他再干一个任期到2002年,为此公司将另加200万股票认购权。如果IBM股票能保持10%的增势,那这批股票将值3.3亿美元。 11/26/2006 [转载]软件也忽悠人--揭穿号称内存占用极低的软件的诡计我实在不愿意提起这个话题.后来在网上看到几篇文章,深深感觉到,已经有程序员站出来,揭穿这个忽悠了千百万用户的诡计了... 附2篇文章的地址: http://blog.csdn.net/biku/archive/2006/07/06/886038.aspx http://blog.csdn.net/zlt982001/archive/2005/08/28/466879.aspx 我这篇文章无非是归纳了几篇文章的内容,并深入的阐明恶意使用该技术带来的坏处. 请一味追求低内存软件的用户们注意了:什么才应该是选择软件的主要因素. 物理内存和虚拟内存 物理内存,在应用中,自然是顾名思义,物理上,真实的插在板子上的内存是多大就是多大了.看机器配置的时候,看的就是这个物理内存. 如果执行的程序很大或很多,就会导致物理内存消耗殆尽.为了解决这个问题,Windows中运用了虚拟内存技术,即拿出一部分硬盘空间来充当内存使用,当内存占用完时,电脑就会自动调用硬盘来充当内存,以缓解内存的紧张. 一个程序,不可避免地要用到虚拟内存,因为不频繁执行或者已经很久没有执行的代码,没有必要留在物理内存中,只会造成浪费;放在虚拟内存中,等执行这部分代码的时候,再调出来. Windows 的任务管理器可以帮助我们看到进程的虚拟内存.调出任务管理器,点击菜单“查看”-“选择列”,在出现的窗口中,钩上“虚拟内存大小”,如图1: 点“确定”,这个时候,进程列表中已经显示各进程的虚拟内存大小,如图2: 一个程序到底应该使用多少虚拟内存呢?不一定,但是应该以恰到好处的符合虚拟内存原本作用为最好. 下面将揭穿表面看起来调用了大量图片、大量运行库的程序,为什么才“占用”不到 1 MB 的内存的诡计. 原来是 SetProcessWorkingSetSize 函数 MSDN 对该函数的表述(翻译):使用这个函数来设置应用程序最小和最大的运行空间,只会保留需要的内存.当应用程序被闲置或系统内存太低时,操作系统会自动调用这个机制来设置应用程序的内存.应用程序也可以使用 VirtualLock 来锁住一定范围的内存不被系统释放;当你加大运行空间给应用程序,你能够得到的物理内存取决于系统,这会造成其他应用程序降低性能或系统总体降低性能,这也可能导致请求物理内存的操作失败,例如:建立 进程,线程,内核池,就必须小心的使用该函数. 也就是说,该函数不是节省内存,而是强制把进程的物理内存搬到虚拟内存中. 另外有一些资料上说,该函数“将有可能导致缺页中断,严重影响性能”. 函数原型: BOOL SetProcessWorkingSetSize( HANDLE hProcess, SIZE_T dwMinimumWorkingSetSize, SIZE_T dwMaximumWorkingSetSize ); 我们用 VB 来做这么一个简单的例子,是程序占用 300 KB 内存吧. 建立一个标准的 VB 工程,在 Form1 中放置一个 Timer1 ,把 Interval 属性设置为 1000 (即 1 秒).然后在代码编辑框中输入以下代码: Private Declare Function SetProcessWorkingSetSize Lib "kernel32" (ByVal hProcess As Long, ByVal dwMinimumWorkingSetSize As Long, ByVal dwMaximumWorkingSetSize As Long) As Long Private Declare Function GetCurrentProcess Lib "kernel32" () As Long Private Sub Timer1_Timer() SetProcessWorkingSetSize GetCurrentProcess(), 50000, 100000 End Sub 然后生成 工程1.exe,执行,调出任务管理器查看,发现内存占用才 320 KB.如果把定时器关闭,这进程的内存一般 4 MB左右. 必须定时执行该函数,否则虚拟内存会慢慢被调出来,恢复原来的内存大小. 如果要使一个本来需要占用大量内存的程序减低到几百 KB ,使用同样的方法即可. 诡计带来的危害 如果 SetProcessWorkingSetSize 函数被正常使用,是非常有用处的.但是为了蒙骗用户的眼睛,每秒,甚至几十毫秒就把大量内存往虚拟内存里面压,就会带来无可预计的危害.看看这篇文章怎么说:“因为他只是暂时的将应用程序占用的内存移至虚拟内存,一旦,应用程序被激活或者有操作请求时,这些内存又会被重新占用.如果你强制使用该方法来设置程序占用的内存,那么可能在一定程度上反而会降低系统性能,因为系统需要频繁的进行内存和硬盘间的页面交换.”. 没错,如果你使用了这类软件,意味着你的硬盘将每秒将 I/O 大量数据;硬盘的磁针将拼命旋转...(当然硬盘磁针不可能不旋转^_^,只是选择得更厉害而已). 不是说 BT 很伤内存吗?不然,因为现在大多 BT 软件都有缓存技术.且看 Bitcomet 官方对缓存技术的说明:“传统BT高速下载时硬盘会响得很厉害,这是大量的随机读取造成的.... BitComet可以由用户设置缓存大小.... 可以明显地看出牺牲一小部分内存作缓存对硬盘的保护作用.” 是不是有种心寒的感觉?一类软件宁愿牺牲内存,也要减少保护硬盘;而另外一类软件,却为了欺骗用户,让CPU、硬盘更加奔波...... 抓一个凶手 这类软件不少,我以其中一个桌面工具为例,揭穿它的假面具(不点名字了).运行该软件后,随意操作一下,然后打开进程管理器,把虚拟内存列调出来,找到该进程,如图3: OK,20 MB 虚拟内存,而只有 632 KB 物理内存.细心的你会发现,大概每 1 秒,该行都有闪烁的感觉,没错,这正是每秒调用 SetProcessWorkingSetSize 的结果.另外,我们打开 Norton Process Viewer ,查看该进程的 CPU 占用情况,如图4: 可以看到,就算没有操作该软件,但是每秒,都有 3% 的CPU占用起伏(虽然这并不能说明什么).另外,内存框中可以看到物理内存和虚拟内存的占用,两者相去甚远.此外,可以用 Hook API 技术来证明每秒调用 SetProcessWorkingSetSize 的行为. 应该怎么做 这篇文章只想让用户了解软件占用资源的实际.而程序员应该把下功夫,真正从代码中减少内存的消耗,而不是一味忽悠用户.调用 SetProcessWorkingSetSize 会带来某些好处,但是何时调用、如何调用应该符合两个要求: 1,在程序暂时不被使用的时候(例如最小化); 2,物理内存和虚拟内存应处于一个合适的比例(而不是 600 KB 比 20 MB 这么荒唐); 3,或者不调用,让 Windows 去处理. (本人技术有限,对于文中的错误恳请高手给予指正) 11/6/2006 DELL 6400拆开了看看首先声明:
1.这个是转载的,不是我没事把本给拆了
2.大家看到后如果很有感触,可以去DELL的网上订购一台拆着玩,不要跑过来来拆我的本本
3.就这些先
拆之前要装备好:6400一台、十字罗丝刀一把、一字起一把、盒子一个、说明书一份
首先把最近非常红火的拆开
内存与小猫
后面拆完了,从前面拆
把上面图那东东拆开就可以拆键盘了,松掉两个罗丝,轻轻从卡位那一翘就出来的,不过小心排线。
拆屏幕
拆掉了掌托后,CPU,显卡就在眼前了,也有一排线,小心
显卡
主板上的PCIE接口
风扇
CPU、北桥
南桥/网卡/无线网卡/读卡器心
触控板/前置音频控制
效果还不错的小喇叭
BT
![]() |
|
|