博文

甲骨文挖红帽墙角 为雅虎等提供Linux服务(2007-03-31 16:58:00)

摘要:甲骨文挖红帽墙角 为雅虎等提供Linux服务 据外国媒体报道,意识到Linux支持服务市场发展空间巨大,甲骨文近日公布了26个与红帽企业Linux有交易的企业,表示要为他们提供更低价的甲骨文Linux支持服务。

  在这26家企业中,雅虎、BNP Paribas和斯坦福大学赫然榜上。去年11月,甲骨文宣布推出为红帽企业linux的支持服务。此前,甲骨文一直缺乏对开源Linux的支持服务。红帽出售Linux软件,并以此做为订购费用,其中包括支持和升级等。用户实际上可以免费购买其软件产品。

  甲骨文则推出了低于红帽费用的支持服务,同时还继续向红帽不再提供支持的产品提供服务。尽管甲骨文支持和修复红帽软件,但做为一家开源产品开发者却是一个新手。上周,Sun微系统公司的CEO施瓦兹称,要取消甲骨文的Linux支持。
......

阅读全文(1299) | 评论:0

世界网站排名(2007-03-24 18:10:00)

摘要: Google工程师详述Google的搜索结果排列算法
关键词: Google    搜索    排列算法                                          
马特-卡兹(Matt Cutts)是Google公司品质管理部门的软件工程师。他的工作主要是给好的网站评定等级,并负责开发阻止虚假或垃圾网站出现在Google搜索结果上的技术。 图书馆管理员们提出最多的问题之一是:“对于什么样的结果应该位于搜索列表的最上方,Google是如何选择的?”现在品质工程师马特-卡兹介绍了快速入门的知识,解释了Google是如何在网上爬行和索引,以及如何评定搜索结果等级的。马特也向学校图书馆管理员提出建议,告诉他们如何辅导学生。 爬行和索引 在你浏览包含了Google搜索结果的网页之前,要发生很多事情。首先是在万维网数以十亿计的网页上爬行和索引,这个工作是由Googlebot完成的,它负责与全球的网络服务器连接以收集文件。爬行不是真的在网上漫游,而是访问网络服务器返回到一个特定的网页上,接着扫描该网页建立超链接并为每一个网页编上号码。爬行可收集大量的文件,但这些文件还不能直接用于搜索。 如果没有索引,在你想查询如“civil war”(南北战争)等内容时,Google的服务器将不得不在你每次搜索时阅读每一份文件的内容。因此第二个步骤是要建立一个索引,这样就需要“转换” 爬行所获得的数据。为了不必在每一份文件上扫描每一个单词,就需要在数据上做些文章,以便显示包含了特定单词的所有文件。例如,假设单词“civil”在编号为3、8、22、56、68和92的文件上出现过,而单词“war”出现编号为2、8、15、22、68和77的文件上。 一旦建立了索引,就开始对文......

阅读全文(1293) | 评论:0

世界编程大赛第一名写的程序(2007-03-24 18:09:00)

摘要: 把着段代码复制(从e100开始,到最后的q)下来存为文本文档,命名为1   在DOS下用“debug<1.txt”命令   生成一个可执行程序。   进去是一个3D游戏的旋转界面,还有一段美妙的音乐,真是牛!!!
  快去看看吧
保证可执行,保证无毒!!!!!! e100 33 f6 bf 0 20 b5 10 f3 a5 8c c8 5 0 2 50 68 13 1 cb e 1f be a1 1 bf 0 1
e11b 6 57 b8 11 1 bb 21 13 89 7 4b 4b 48 79 f9 ad 86 e0 8b c8 bd ff ff e8 20
e134 0 3d 0 1 74 1a 7f 3 aa eb f3 2d ff 0 50 e8 f 0 5a f7 d8 8b d8 26 8a 1 aa
e14f 4a 75 f9 eb de cb 57 bb 21 13 8b c1 40 f7 27 f7 f5 8b fb ba 11 1 4f 4f 4a
e168 39 5 7f f9 52 8b c5 f7 25 f7 37 2b c8 95 f7 65 2 f7 37 95 2b e8 fe e fe
e181 10 79 6 c6 6 fe 10 7 46 d0 14 d1 d1 d1 e5 79 ec 5a b8 11 1 ff 7 4b 4b 48
e19b 3b d0 75 f7 5f c3 83 f7 83 a6 5d 59 82 cd b2 8 42 46 9 57 a9 c5 ca aa 1b
e1b4 4f 52 b4 92 3f ab 6e 9e a8 1d c6 3 fc e 6a e7 ae bb 5f 7b 10 b8 b4 f7 8
e1cd e2 bf 36 4e 39 9d 79 29 3f a f9 36 52 16 fb 5 e8 e5 a6 c2 e9 b0 43 d3 a3
e1e6 cf d3 fd fd cb d1 4c 5e e0 63 58 86 bb 3e 9 c1 20 bc cc 91 a3 47 81 70 b3
e1ff d6 1a 9e c2 c9 12 e7 4e ad......

阅读全文(1948) | 评论:3

指针学习(2007-03-24 17:57:00)

摘要:一、数组的指针、指针数组以及指向指针的指针   考虑数组的指针的时候我们要同时考虑类型和维数这两个属性。换一句话,就是说一个数组排除在其中存储的数值,那么可以用类型和维数来位置表示他的种类。 A)一维数组
  在c和c++中数组的指针就是数组的起始地址(也就第一个元素的地址),而且标准文档规定数组名代表数组的地址(这是地址数值层面的数组表示)。例如:int a[10];int *p; p=&a[0]//和p=a是等价的:

  因为a是数组名,所以他是该数组的地址,同时因为第一个元素为a[0],那么&a[0]也代表了该数组的地址。但是我们是不是就说一个数组名和该数组的第一个元素的&运算是一回事呢?在一维的时候当时是的,但是在高维的时候,我们要考虑到维数给数组带来的影响。
  a[10]是一个数组,a是数组名,它是一个包含10个int类型的数组类型,不是一般的指针变量噢!(虽然标准文档规定在c++中从int[]到int*直接转换是可以的,在使用的时候似乎在函数的参数为指针的时候,我们将该数组名赋值没有任何异样),a代表数组的首地址,在数字层面和a[10]的地址一样。这样我们就可以使用指针变量以及a来操作这个数组了。
所以我们要注意以下问题: (1) p[i]和a[i]都是代表该数组的第i+1个元素;
(2) p+i和a+i代表了第i+1个元素的地址,所以我们也可以使用 *(p+I)和*(a+I)来引用对象元素;
(3)p+1不是对于指针数量上加一,而是表示从当前的位置跳过当前指针指向类型长度的空间,对于win32的int为4byte; B)多维数组
  对于二维数组a[4][6];由于数组名代表数组的起始地址,所以a(第一层)和第一个元素a[0][0]地址的数字是相同的,但是意义却是不同的。对于该数组我们可以理解为:a的一维数组(第一层),它有四个元素a[0]、a[1]、a[2]、a[3](第二层),而每个元素又含有6个元素a[0][0],a[0][1],a[0][2],a[0][3],a[0][4],a[0][5](第三层),…到此我们终于访问到了每个元素了,这个过程我们经历了:a->a[0]->a[0][0];
  整体来讲:a是一个4行5列的二维数组,a表示它指......

阅读全文(1061) | 评论:0

软件测试的艺术(2007-03-24 17:49:00)

摘要: 测试:是为发现错误而执行程序的过程 回归测试:保留测试,当程序其它部件发生更动后重新执行,这就是所谓的‘回归测试’ 黑盒测试:(数据驱动的测试/输入输出驱动的测试)在这种测试方法中,将程序视为一个黑盒子。测试目标与程序的内部机制和结构完全无关,而是将重点集中放在发现程序不按其规范正确运行的条件 白盒测试:(逻辑驱动的测试),允许我们检查程序的内部结构。对程序的逻辑结构进行检查,从中获取测试数据 一个测试用例必须包括两部分: 1)对程序的输入数据的描述(我自己理解为操作步骤) 2)对程序在上述输入数据下的正确输出结果的精确描述(理解为每一步操作步骤下的预期结果) 软件测试原则: 1)测试用例中一个必需部分是对预期输出或结果进行定义 2)程序员应当避免测试自己编写的程序 3)编写的软件的组织不应当测试自己编写的软件 4)应当彻底检查每个测试的执行结果 4)测试用例的编写不公应当根据有效和预料到的输入情况,而且也应当根据无效和求预料到的输入情况 6)检查程序是否‘未做其应该做的’仅是测试的一半,测试的另一半是检查程序是否‘做了其不应该做的’ 7)应避免测试用例后即弃,除非软件本身就是一个一次性的软件 8)计划测试时不应默许假定不会发现错误 9)程序某部分存在更多错误的可能性,与该部分已发现错误数量成正比 10)软件测试是一项极富创造性、极具挑战力的工作......

阅读全文(1200) | 评论:0

俄罗斯算法求大数乘(2007-03-24 17:29:00)

摘要: /*  俄罗斯式算法求大数乘          */
/* 原理:   举例 ( 9 * 8 )   */
/*  (乘数)  9 (被乘数)8  */
/*   4  16  */
/*   2  32  */
/*   1  64  */
/* 将乘数为奇时的被乘数相加 8 + 64 = 72 OK ! */
/* 这钟算法只比传统的好,分治法就比这种要好  */
/* 编译环境: VC ++ 6.0         */
/* Author: 江南孤峰 Time: 2006-10-24         */ #include <stdio.h>
#include <ctype.h> #define MAX 1000 //存结果的数组大小,乘数较大时需要修改这里
#define MULMAX 100 //存两个乘数的数组大小 void mul(char a[],char b[],int la,int lb);
void divTwo(char a[],int *la);
void add(char a[],char b[],int *la,int *lb);
int  input(char a[],char b[],int *la,int *lb); void mul(char a[],char b[],int length_a,int length_b){
 // 求数......

阅读全文(1148) | 评论:0

编程高手是怎样炼成的(2007-03-24 17:27:00)

摘要:首先声明,偶不是高手,以免引起不必要的冷嘲热讽,呵呵。

估计很多的朋友在很小的时候就看过奥斯特洛夫斯基同学的《钢铁是怎样炼成的》,偶小时候在农村混,看的最多是各式各样的牛屎以及长得极象牛屎的山头,这些所谓的名著偶直到大学才有机会拜读,但说实话,偶是个俗人,还是更喜欢看一些痞子写的文字或带COLOR的BOOKS。偶之所以写这么个主题,主要是太多的朋友给偶发EMAIL或在VCHOME.NET提问,偶其实也与大家一样为生活而奔波,因此没有时间一一作答,在这作一次回答,还望海涵。

高手是一个哗众取宠的词汇,世上本来并没有高手,说的人多了也就有了高手,我看程序员只有老少之分,并无高低之分,比如偶就是一个老程序员,因此作为程序员,我们追求的应该是写出有用有价值的软件产品,呵呵,废话少说,切入正题吧!

1. 迷恋 + 热情;
爱因斯坦同学说:兴趣是最好的老师,这就是说一个人一旦对某事物有了浓厚的兴趣,就会主动去求知、去探索、去实践,并在求知、探索、实践中产生愉快的情绪和体验,并不断地激发学习的动力,这种说法很美妙,众所周知,程序员是一种有点乏味有点枯燥有点辛苦的技术工作,要能坚持下去,并能做得很好,没有迷恋没有热情是很难很难的,偶就很迷恋,迷恋C++,迷恋computer,迷恋network,偶迷恋for、if、while、case等等就如同歌手迷恋五线谱的小蝌蚪一样,我觉得程序代码真是无所不能,简简单单的几行代码就能实现丰富多彩的功能,你难道不觉得很NB吗?呵呵,因此,作为一名老程序员,我建议年轻的程序员们一定要对coding保持迷恋保持热情,那样我们才有可能做得更好。

2. 在项目中磨练与成长;
很多朋友经常问:他看了很多书,也做了较多的练习,但感觉水平并没有得到提高,这是为什么?呵呵,我觉得每个人不同,有些程序员通过看书,也能学到很多东东,但我个人觉得最好的提高方法,还是要参与到某一项目中去锻炼,从设计到开发到测试到维护一整套的磨练流程,项目是有周期的,有周期就有压力,有压力才能不分昼夜地去学习与实现,学习的效果也会很显著与深刻。

3. 数不胜数的加班;
偶这里所讲的加班并不单指工作上的OT(即overtime),而更多的是学习上的OT,偶认为程序员学习的黄金时间在毕业后的前三年,这三年......

阅读全文(1100) | 评论:0

IT开发工程师的悲哀(2007-03-18 15:18:00)

摘要:恭喜,你选择开发工程师做为自已的职业!
  悲哀,你选择开发工程师做为自已的职业!
  
  本文所指的开发工程师,仅指程序开发人员和以数字电路开发为主的电子工程师。当你选择计算机或者电子、自控等专业进入大学时,你本来还是有机会从事其它行业的,可你毕业时执迷不悟,仍然选择了开发做为你的职业,真是自做孽不可活。不过,欢迎你和我一样加入这个被其它人认为是风光无限的“白领”吧。如果你不是特别的与人世隔绝,我想你一定看过金老先生的名著《笑傲江湖》吧,里面有一门十分奇特的武功叫做"辟邪剑法",你看这个小说第一次看到这种功夫的练法时,我想你当时一定笑歪了牙“呵呵,真好玩!”,可是现在我很痛心的告诉你:你选择的开发工作就是你人生路上的"辟邪剑法",而你现在已经练了,并且无法再回头。
  
  相对同时刚出校门同学从事其它行业而言优厚的薪水,以及不断学习更新的专业知识不仅仅让你感到生活的充实,更满足了你那不让外人知的虚荣心。在刚出校门的几年中,你经常回头看看被你落在后面的同学们,在内心怜悯他们的同时,你也会对自已天天加班的努力工作感到心里平衡:“有付出才会有回报”这句话在那几年中你说的最多,不管是对自已的朋友们还是自已的爱人。第二句最常说的话是对公司的领导:“不行我就走人!”,实际上你也真的走过几回。对了,在这几年中,因为你的经济条件不错,你开始买房、开始谈恋爱、结婚、开始有了自已的小孩。有时候你会对自已说再过两年就去买车。当然其中可能有许多大件是需要分期付款的,但你对前途充满了信心,你确信认为这种日子会永远的持续下去,即使不是变得更好的话。
  
  日子总是在这种平淡中一天天的过去,就在那么不经意间,你突然发现自已已经快30岁了,或者已经30了,莫名的,你心里会漫延着一种说不清楚的不安情绪,你好像觉得前途并非像前几年那样变得越来越好,你也忽然发现你以前所瞧不起的同学里好像已经有不少开着车的了,也有几个人住着比你还大的房子,好像房款还是一次付清的,你突然明白你现在的生活比起你的同学来最多是中游偏上了。工作中最让你感到心里不舒服的是,你越来越不敢对你的领导说不了,即使比你来的晚的同事升职或提薪,你也只是在私下与朋友们一起喝酒时才敢发发牢骚,在头的面前你的声间越来越小、笑脸是越来越温柔。
  
  你终于开始迷茫“再过几年我会是在......

阅读全文(1069) | 评论:0

Linux开发中的常用命令(2007-03-18 15:17:00)

摘要: Linux开发中的常用命令  ls #以默认方式显示当前目录文件列表 ls –a #显示所有文件包括隐藏文件 ls –l #显示文件属性,包括大小,日期,符号连接,是否可读写及是否可执行  ls --color=never *.so > obj #不显示文字颜色,将所有so文件记录到obj文件中  cd dir #切换到当前目录下的dir目录 cd / #切换到根目录 cd .. #切换到到上一级目录 cd ../.. #切换到上二级目录 cd ~ #切换到用户目录,比如是root用户,则切换到/root下 rm file #删除某一个文件 rm -fr dir #删除当前目录下叫dir的整个目录 cp source target #将文件source 复制为 target cp /root/source . #将/root下的文件source复制到当前目录 cp –av soure_dir target_dir #将整个目录复制,两目录完全一样 cp –fr source_dir target_dir #将整个目录复制,并且是以非链接方式复制,当source目录带有符号链接时,两个目录不相同 mv source target #将文件source更名为target diff dir1 dir2 #比较目录1与目录2的文件列表是否相同,但不比较文件的实际内容,不同则列出 diff file1 file2 #比较文件1与文件2的内容是否相同,如果是文本格式的文件,则将不相同的内容显示,如果是二进制代码则只表示两个文件是不同的 comm file1 file2 #比较文件,显示两个文件不相同的内容 echo message #显示一串字符 echo "message message2" #显示不连续的字符串 cat: cat file #显示文件的内容,和DOS的type相同 cat file | more #显示文件的内容并传输到more程序实现分页显示,使用命令less file可实现相同的功能 more #分页命令,一般通过管道将内容传给它,如ls | more export LC_ALL=zh_CN.GB2312 #将环境变量LC_ALL的值设为zh_CN.GB2312 export DISPLAY=0:0 ......

阅读全文(1281) | 评论:0

C++学习基础知识(2007-03-18 15:16:00)

摘要:一、#include “filename.h”和#include 的区别 #include “filename.h”是指编译器将从当前工作目录上开始查找此文件 #include 是指编译器将从标准库目录中开始查找此文件   二、头文件的作用 加强安全检测 通过头文件可能方便地调用库功能,而不必关心其实现方式   三、* , &修饰符的位置 对于*和&修饰符,为了避免误解,最好将修饰符紧靠变量名   四、if语句 不要将布尔变量与任何值进行比较,那会很容易出错的。 整形变量必须要有类型相同的值进行比较 浮点变量最好少比点,就算要比也要有值进行限制 指针变量要和NULL进行比较,不要和布尔型和整形比较   五、const和#define的比较 const有数据类型,#define没有数据类型 个别编译器中const可以进行调试,#define不可以进行调试 在类中定义常量有两种方式 1、 在类在声明常量,但不赋值,在构造函数初始化表中进行赋值; 2、 用枚举代替const常量。   六、C++函数中值的传递方式 有三种方式:值传递(Pass by value)、指针传递(Pass by pointer)、引用传递(Pass by reference) void fun(char c) //pass by value void fun(char *str) //pass by pointer void fun(char &str) //pass by reference 如果输入参数是以值传递的话,最好使用引用传递代替,因为引用传递省去了临时对象的构造和析构 函数的类型不能省略,就算没有也要加个void   七、函数体中的指针或引用常量不能被返回 Char *func(void) { char str[]=”Hello Word”; //这个是不能被返回的,因为str是个指定变量,不是一般的值,函数结束后会被注销掉 return str; } 函数体内的指针变量并不会随着函数的消亡而自动释放   八、一个内存拷贝函数的实现体 void *memcpy(void *pvTo,const void ......

阅读全文(1298) | 评论:0