软件插件技术相关资源

奔啊奔 发表于 2009-12-24 10:33:38

最近要写一个读取NetCDF的插件程序,之前对插件没有概念,google了一下,把一些好的资源放上来
http://www.codeproject.com/KB/DLL/plug-in.aspx
关键词(Tag): 资源 软件插件技术

[Z]软件插件技术的原理与实现

奔啊奔 发表于 2009-12-24 10:20:15

软件插件技术的原理与实现

摘要:

基于插件的应用系统拥有良好的可扩充性、可定制性和可维护性。

1.       引言

插件是近年来十分常见的一种技术。插件结构有助于编写有良好的扩充和定制功能的应用程序。许多软件甚至操作系统或其外壳程序都使用了这种技术,著名的使用插件机制的软件是Winamp, Winamp早期的成功虽然在于其快速的解码引擎,但在MP3播放器中能够保特长久的霸主地位。也正是由于内置了健全的插件功能后期的Winamp中增加的MIDI、 MOD,、WAVE等音乐格式的播放功能完全是靠插件实现的。本文将论述插件技术的基本原理,并给出三种不同的实现插件系统的方法。最重要的部分则是插件与主程序之间的交互插件,一般是一个遵循了某些特定规则的DLL,而主程序将所有插件接口在内存中的地址传递给插件插件则根据这些地址来调用插件接口完成所需功能获取所需资源等。

 

2.       插件系统的基本原理

    插件的木质是在不修改程序主体的情况下对软件功能进行加强。当插件的接口被公开时任何人都可以自己制作插件来解决一些操作上的不便或增加一些功能。一个插件框架包括两个部分:主程序(host)和插件((plug-in)。主程序即是“包含”插件的程序。插件必须实现若干标准接口,由主程序在与插件通信时调用。

编程实现方面包括两个部分:一部分是主体程序的插件处理机制,用来进行初始化每个插件的过程,并且管理好每个插件接口。另一部分是插件的接口函数定义,将所有的插件接口函数进行封装。以便开发者自由调用。

 

3.       插件系统的开发

    本文将通过一个摸拟的音频播放器(使用VC++ 6。0)来介绍插件的三种实现方法

    (1)普通的输出函数的DLL方式

    (2)使用C++的多态性。

    (3)使用COM类别(category)机制。

    首先对此音频播放器作以下说明:①这不是一个真的播放器。当然也不能真地播放音频文件。②每个插件支持一种格式的音频文件如Wma、mp3等,通过增加插件可以使系统支持更多的音频格式。③插件接口简单,其功能实现只是弹出一个对话框表明哪个插件的哪个功能被调用了。制作这个播放器的真正目的是演示插件技术的原理和实现方法只要掌握了其原理和方法就完全可以开发出有用的插件系统

    不管用什么手段实现插件和主程序之间的交互必须有一个协议,对于方法(1)这个协议是一系列的函数。这些函数由插件DLL引出由主程序调用。对于方法〔2)协议则是一个(或多个)基类通常是抽象类,插件需要构造一个类来继承此抽象类并实现其接口方法,再为主程序提供一个创建和销毁此实现类的对象的公共方法这个公共方法理所当然也应成为协议的一部分。对于方法(3)则是一个(或多个)COM接口插件是一个COM组件,它实现了这些接口,并注册到约定的组件类别tcomponent category)下。

    一般音频播放器都有这样一些基本功能:装载音频文件(LoadFlle)、播放(Play)、暂停(Pause),停止((Stop)。我们的播放器将提供这四个功能,但主程序本身并不会直接实现这些功能而是调用插件的实现,上文已经说过。每个插件支持一种音频格式,所以每个插件的功能实现都是不同的。在主程序打开某个格式的音频文件时,根据文件扩展名来决定调用哪个插件的功能,主程序可以在启动时加载所有插件,也可以在打开文件时动态加载所需插件,甚至可以在启动时加载一部分常用的插件,而在需要时加载其余插件开发者可以有很高的自由度,现在我们来详细讨论三种实现方法,

3.1第一种方法

3.1.1插件的实现

我们创建一个动态链接库PIugl.dll,为了支持四个基本功能,它输出相应的四个函数

    void LoadFile(const char szHeName)

void Play(),

void Pause(),

void Stop(),

    这些函数可以简单实现为只弹出一个消息框,表明是哪个插件的哪个函数被调用了,    为了使主程序在运行时能知道这个插件可以支持什么格式的音频又件插件程序还应输出一个函数供主程序查询用

void GetSupportedformat(char* szFomrat)

    至此,这个插件就制作完了,可以依样画葫芦再做一个PIug2,dll它‘支持‘,wma文件,下面来看主程序的实现。

3.1.2主程序的实现

    主程序是一个基于对话框的标准Windows程序,它启动时会搜索约定目录(可以约定所有插件都存放在主程序所在目录的Plugins子目录下),并使用Wia32函数LoadLrbrary加载所有插件,每加载一个插件DLL,就调用另一个Wun32函数GetProcAddress获取引出函数

GetSupportedformat的地址,并调用此函数返回插件所支持的格式名(即是音频文件的扩展名),然后把(格式名,DLL句柄)二元组保存下来,当用户通过菜单打开文件时,主程序会根据扩展名决定调用哪个插件的LoadFile函数,并指明此插件DLL的句柄为当前使用的插件的DLL句柄(比如保存到变量m_hlnst中),此后当用户

通过按钮调用Play等其他功能时就调用句柄为m_hlnst的插件的相应功能,如:

    typedef void (PLAY)();

if(m_hlnst)

{

PLAY=GetProcAddress(m_hlnst, "Play");

PLAY();

    }

    另外,当程序退出时,应该调用FreeLibrary函数卸载插件,

    到此为止第一种实现插件系统的方法就介绍完了,可以看出,其实现的关键在于插件输出、函数的约定以及把插件所支持的格式名映射到插件DLL的句柄,后面将会看到,实际上每一种实现都是基于这种原理只不过是方式不同而已。

3.2第二种方法

    第一种实现方法完全是结构化程序设计,存在接口不易维护等缺点,从而我们自然而然想到面向对象的解决方案——把API封装到类里。

3.2.1插件的实现

    我们定义抽象类如下

    class ICppPlugin

    {

public:

        ICppPlugin ();

virtual void ICppPluginIcon()=0;

        virtual void Release()=0;

virtual void GetSupportedFormat(char* szFormat)=0;

virtual void Load(constchar* szHeName)=0;

virtual void Play()=0;

        virtual void Stop()=0;

        virtual void Pause()=0;

    };

    其中Release成员函数将在后面介绍,其他成员函数意义与第一种实现中的同名函数相同,插件程序需要实现此抽象类,每个插件都有不同的实现而主程序仅通过接口(抽象类)来访问它们,现在来制作一个插件CppPlugin I,dll,它包含继承于ICppPlugin的类CppPlugin1。

    class CppPlugin1 : public ICppPlugin //实现代码略

    为使主程序能创建CppPlugin1对象,插件输出一个函数

bool CreateObject(void* pObj) {

pObj=new CppPluginlo;

return *pObj!=NULL;

    }

对象是在动态库中创建的,也应该在动态库中被销毁,这就是ICppplugin的成员函数Release的作用。当主程序使用完对象后,需要调用此函数来销毁对象。它的实现如下:

    void CppPIugin1::Release() { delete this;  //删除自己}

    我们还可以再制作更多的插件,这些插件只需要给出ICppPlugin的不同实现,即改变类

Cppplugin1的成员函数实现即可,现在来看主程序的处理过程。

3.2.2主程序的实现

    插件的加载过程与第一种方法相似,所不同的是加载DLL后,首先调用的是插件程序的CreateObject输出函数来创建对象:

    typedef boot (*CreatoObject)(void *pObj);

//定义一个函数指针类型,获取Create06ject的地址,hInst为DLL的句柄

    Create0bject CreatcObj=(CreateObject)GetProcAddtess(hInst, "Create0bject");

    ICppPlugin* pObj = 0;  //定义一个ICPPPlugjn的指针

    CreateObj((void**)&pObj);//创建对象

接下来查询插件所支持的格式名,本方式中GetSupportedFormat已成为ICppPlugin的成员函数。

CString str;

pObj->GetSupportedFotmat(str,GetBuffer(8)); 

str.ReleaseBuffer;

    另外,需要保存的除(格式名,DLL句柄)二元组映射外,还需保存(格式名,创建对象函数指针)二元组映射以备后用。

    fstr存放的是格式名字符串的小写形式

m_formatMap [fstr」= hInst; 

m_factoryMap[fstr] = CreatcObj;

同样在打开文件时选择使用哪个插件,m_pObj存放当前使用的对象的指针,定义如下:ICppplugin *m_p0bj=0;//在程序初始化时要把它置为0

     

if(m_pObj){

m_pObj->Release();

m_pObj=0;

}

   

m_factoryMap [strExj((void")&m_pObj); //用CreatcObject

    m_pObj->LoadFile((LPCSTR)strFileName); //strFileName是音频文件全路径名

以后就可以使用m_pObj来调用其他操作了,例如:

if(m_pObj)  m_pObj->Play();

    在主程序退出时需要卸载DLL,不必重复。

    现在第二种实现插件系统的方式也介绍完了,这种方式基于C++的多态性,需要注意的是对象的创建和销毁方式,

3.3第三种方法

    第二种实现方法其实已经是组件化程序的雏形了,可以胜任开发小型的插件系统,若要开发大中型的系统,则需要完全组件化的设计,COM (Component Object Model,组件对象模型)实际上就是一个实现插件的极好技术,基于COM建立的插件系统,主程序和各个插件可以用不同的编程语言写成((C++, VB, Delplu,Java等),COM能使它们无缝地结合在一起,篇幅所限本文不详细介绍COM的原理与编程。

    在这种实现方法中,插件是一个COM组件,确切地说,插件程序作为COM组件程序,包含了一个或多个COM对象。这些COM对象都实现了相同的COM接口,主程序通过这个COM接口来访问COM对象,即COM接口是主程序与插件通信的唯一手段几比如播放器插件所包含的COM对象都实现了如下COM接口(IDL定义):

    interface ICppPlugin : fUnknown

Plugin、子目录下,但是因为COM组件对COM客户是位置透明的,所以主程序需要知道的已不是插件的具休位置和名字而是COM组件的CLSID或ProglD,可以选择把这些信息存放到指定的注册表子键下,也可以放到ini文件中等等,然而更好的方式是使用COM的组件类别

(Component Category)索引机制,

    COM允许实现者可以把相关的一组COM类组织到逻辑组(即组件类别)中,通常一个类别(category)中的所有COM类都实现同一组接口这些COM类共享同一个类别ID,称为CATID (category ID), CATID也是GUID它作为COM类的属牲被保存在注册表中COM类的"Implemented Categories’子键下在组件自注册时加入,每个类别在注朋表中都有它自己唯一的子键,由它的CATID命名,

    另外,系统提供一个称为组件类别管理器(component category manager)的COM类,它实现了ICatRegrster和ICatlafomauon接口,分别用来注册和查询类别信息,

于是基于COM的插件系统就可以这样实现:

(1)注册一个组件类别CATID_Plugin,

    (2)插件实现包含实现了ICppPlugin接口的COM类并注册为CATID_Plugin类别,

    (3〕主程序在启动时使用组件类别管理器查询CATID一Plugin类别信息,得到此类别的所有COM类的CLSID,并创建相应的COM对象,获取其ICppPlugin接口,然后调用接口的GetSupportedFormat,方法得到该插件所支持的格式名,保存(格式名,ICppPlugin接口指针)映射。

    (4)程序在打开音频文件时根据扩展名决定使用哪个ICppPlugin接口指针调用LoadFile方法,并设置当前使用的接口指针m_pICppPlugin为该接口指针。

    (5)以后的操作(Play等)都使用m_pICppPlugin来调用直到打开不同类型的文件。

    (6)程序退出时释放掉COM对象并释放COM库所占用的资源。

    详细代码这里不再给出。

    至此三种创建插件系统的方式都介绍完毕,程序使用Visual C++6,0开发,在Windows 2000Server上运行通过,

3.4 小结

    上文所演示的例子中调用是单向的,即由插件暴露出接口,由主程序来调用,在实际应用中主程序也完全可以暴露出接口,由插件来调用从而使系统更加灵活,三种方法从结构化程序设计到面向对象的方法再到基于组件的软件开发,难度依次升高,功能逐渐强大,系统也越来越灵活,根据所要创建的插件系统的不同开发人员可以选择合适的实现方式,掌握技术原理是容易的,其实真正困难的是如何进行详细的应用分析,抽象出合适的接口,这样才能使整个插件系统拥有强大的可扩展性灵活性、健壮性和良好的可维护性。

    HRESULT LoadFile(BSTR bstrFileName);     

HRESULT GetSupportedFormat([out,retval) BSTR pbstrFormat);     

HRESULT Play();     

HRESULT Stop();     

HRESULT Pause();   };

于是,插件的开发就是COM组件的开发,这里不再详述,唯一的问题是主程序如何知道哪些是它能使用的插件(就是COM组件)。前两种实现中,我们需要插件的具体位置和名字,所以约定插件都存放在主程序所在目录的。

 

4.       结语

插件作为特殊的组件,具备组件的所有优秀的特性,这些特性使其在开发,推广,应用方面有重要的现实意义,基于插件技术的软件开发可以使产品专业化标准化系列化,通过不同规格和系列的插件的组合,可以快速地完成应用系统原型而通过对插件的局部修改来满足客户的需求和升级。

 

5.       参考书目

Windows高级编程指南(第三版),清华大学出版社1999,6,

设计模式-可复用面向对象软件的基础,机械工业出版社2000,9,

COM本质论,中国电力出版社2001s,

关键词(Tag): 插件技术

关于First Chance Exception

奔啊奔 发表于 2009-04-11 10:17:42

最近在公司实习,熟悉公司内部框架时,发现编译输出窗口有“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”字样,以为是自己的实例哪里出了问题,仔细跟踪了一下程序,发现没有任何头绪。于是求助于Google,搜索到以下两篇文章,看后对First Chance Exception有了大致的了解

第一篇,引自MSDN中David Kline的Blog,文章链接为:http://blogs.msdn.com/davidklinems/archive/2005/07/12/438061.aspx 
What is a First Chance Exception?

Have you ever been debugging an application and seen a message, in the output window, about a "First chance" exception?
WhatEver wondered: 
What is a first chance exception?

Does a first chance exception mean there is a problem in my code?

What is a first chance exception?

When an application is being debugged, the debugger gets notified whenever an exception is encountered  At this point, the application is suspended and the debugger decides how to handle the exception. The first pass through this mechanism is called a "first chance" exception. Depending on the debugger's configuration, it will either resume the application and pass the exception on or it will leave the application suspended and enter debug mode. If the application handles the exception, it continues to run normally.
In Visual Studio, you may see a message in the output window that looks like this:
A first chance exception of type 'System.ApplicationException' occurred in myapp.exe
In Visual Studio 2005 Beta2, you will see this message anytime a first chance exception is encountered in your application's code.  If you are using Visual Studio .NET 2003, this message is shown if you have configured the debugger to stop when the specific exception type is thrown.
If the application does not handle the exception, the debugger is re-notified. This is known as a "second chance" exception. The debugger again suspends the application and determines how to handle this exception. Typically, debuggers are configured to stop on second chance (unhandled) exceptions and debug mode is entered, allowing you to debug. 
Does a first chance exception mean there is a problem in my code?

First chance exception messages most often do not mean there is a problem in the code. For applications / components which handle exceptions gracefully, first chance exception messages let the developer know that an exceptional situation was encountered and was handled.
For code without exception handling, the debugger will receive a second chance exception notification and will stop with a unhandled exception. 
Take care!

-- DK

第二篇引自CSDN中everandforever的专栏,链接为:http://blog.csdn.net/everandforever/archive/2005/09/29/492417.aspx
关于“First-chance exception”

在VC中调试程序时,Output窗口有时会出现“First-chance exception in xxx.exe...”这样的信息。一般来说,这是由于程序中发生了异常,被VC捕获而产生的输出。

在调试器中运行程序时,如果程序产生异常,调试器会首先获得通知(即First-chance exception),而后此异常由产生它的程序负责捕获。如果程序没有捕获此异常,那么调试器会再次被通知(即Second-chance exception,Last-chance exception),并结束程序。

通常见到的“First-chance exception”一般是“0xC0000005: Access Violation”,“0xC00000FD: Stack Overflow”等,这些都说明程序中有缺陷,需要修正。

但是也有一些属于正常的情况,例如“First-chance exception in xxx.exe (KERNEL32.DLL): 0xE06D7363: Microsoft C++ Exception”。Windows 操作系统中广泛使用了结构化异常(SEH)来处理特殊情况,许多和底层打交道的API都靠SEH来处理可能发生的意外。并且,这些API中都有捕获SEH的代码,产生的异常不会对程序造成影响。但是由于上面提到的“First-chance exception,Second-chance exception”机制,VC仍然会有输出,但是我们完全可以忽略。如果你实在不喜欢这些输出信息,那你就必须禁用对特定异常的“First-chance exception”捕获。
 

开始写文章了!

奔啊奔 发表于 2008-06-11 16:45:17

项目终于告一段落,虽然有不负责任的师兄和对地统计学一窍不通的老板。我还是撑过来了。
我是个完美主义者,而系统还有很多细节需要处理,但是不管了,人不为己天诛地灭。我还是得以毕业找工作为主,其他的都先fuck off
这几天看了不少文章,发现近几年关于地统计学的文章大多都停留在综述,或者对理论的边边角角的阐述或者修改,仅有的几篇应用文章,用法不敢恭维。
看看那些大家们的文章,有点心虚,这都能发出来,那我能写成什么样呢?
再看看那些英文文章,那公式,老长了,推导的过程,那简直是天书。而且最头痛的是,国外用的变量或者参数名和国内文献用的不一致,曾经查过,就连国内的都不一致,崩溃了……
看来我需要从头做起了,加油!

wxDev-C++中的断点

奔啊奔 发表于 2008-06-06 10:06:41

这两天一直在调师妹的Kriging插值程序,天知道她是怎么弄出来的,只能用她自己手写的那个插值参数文件,我给她生成的文件插值时没有问题,但是一到交叉验证时,整个程序就崩溃了,而且Debug中的output信息是正常退出...

在跟踪程序时,突然发现,Dev-C++有很多缺点,最大的就是设置断点。基本上是我设我的断点,它高兴了才在那停一下,郁闷异常。

今早突然发现,将要设置断点的行先取消断点,然后编译程序,最后加上断点,它大多会乖乖的在那停住。也许它普通编译与Debug编译时机制不同,只有存在Debug信息中的断点才会停。

不管怎样,它至少开始听话了,希望在今天把这个问题解决掉。
关键词(Tag): dev-c++ breakpoint

一些特殊的IP地址

奔啊奔 发表于 2008-05-05 11:17:00

就像我们每个人都有一个身份证号码一样,网络里的每台电脑(更确切地说,是每一台设备的网络接口)都有一个IP地址用于标识自己。在总数大约为四十多亿个可用IP地址里,有一些常见的有特殊意义地址。

一、0.0.0.0
严格说来,0.0.0.0已经不是一个真正意义上的IP地址了。它表示的是一个集合:所有不清楚的主机和目的网络。这里的"不清楚"是指在本机的路由表里没有特定条目指明如何到达。对本机来说,它就是一个"收容所",所有不认识的"三无"人员,一律送进去。如果你在网络设置中设置了缺省网关,那么Windows系统会自动产生一个目的地址为0.0.0.0的缺省路由。

二、255.255.255.255
  限制广播地址。对本机来说,这个地址指本网段内(同一广播域)的所有主机。意思是:"这个房间里的所有人都注意了!"这个地址不能被路由器转发。

三、127.0.0.1
  本机地址,主要用于测试。用汉语表示,就是"我自己"。在Windows系统中,这个地址有一个别名"Localhost"。对这样一个地址进行寻址操作,是不能把它发到网络接口的。除非出错,否则在传输介质上永远不应该出现目的地址为"127.0.0.1"的数据包。

四、224.0.0.1
  组播地址,注意它和广播的区别。从224.0.0.0到239.255.255.255都是这样的地址。224.0.0.1特指所有主机,224.0.0.2特指所有路由器。这样的地址多用于一些特定的程序以及多媒体程序。如果你的主机开启了IRDP(Internet路由发现协议,使用组播功能)功能,那么你的主机路由表中应该有这样一条路由。

五、169.254.x.x
  如果你的主机使用了DHCP功能自动获得一个IP地址,那么当你的DHCP服务器发生故障,或响应时间太长而超出了一个系统规定的时间,Windows系统会为你分配这样一个地址。如果你发现你的主机IP地址是一个诸如此类的地址,很不幸,十有八九是你的网络不能正常运行了。

六、10.x.x.x、172.16.x.x~172.31.x.x、192.168.x.x
  私有地址,这些地址被大量用于企业内部网络中。一些宽带路由器,也往往使用192.168.1.1作为缺省地址。私有网络由于不与外部互连,因而可能使用随意的IP地址。保留这样的地址供其使用是为了避免以后接入公网时引起地址混乱。使用私有地址的私有网络在接入Internet时,要使用地址翻译(NAT),将私有地址翻译成公用合法地址。在Internet上,是不会出现类似的IP地址的。

[转]不要一辈子靠技术生存

奔啊奔 发表于 2007-12-07 09:11:00

无意中从网上看到此文,感觉很有道理,转到此处,聊以自勉。

[转]不要一辈子靠技术生存
 
我现在是自己做,但我此前有多年在从事软件开发工作,当回过头来想一想自己,觉得特别想对那些初学JAVA/DOTNET技术的朋友说点心里话,希望你们能从我们的体会中,多少受点启发(也许我说的不好,你不赞同但看在我真心的份上别扔砖头啊)。
一. 在中国你千万不要因为学习技术就可以换来稳定的生活和高的薪水待遇,你千万更不要认为哪些从事市场开发,跑腿的人,没有前途。   
    不知道你是不是知道,咱们中国有相当大的一部分软件公司,他们的软件开发团队都小的可怜,甚至只有1-3个人,连一个项目小组都算不上,而这样的团队却要承担一个软件公司所有的软件开发任务,在软件上线和开发的关键阶段需要团队的成员没日没夜的加班,还需要为测试出的BUG和不能按时提交的软件模块功能而心怀忐忑,有的时候如果你不幸加入现场开发的团队你则需要背井离乡告别你的女友,进行封闭开发,你平时除了编码之外就是吃饭和睡觉(有钱的公司甚至请个保姆为你做饭,以让你节省出更多的时间来投入到工作中,让你一直在那种累了就休息,不累就立即工作的状态)更可怕的是,会让你接触的人际关系非常单一,除了有限的技术人员之外你几乎见不到做其他行业工作和职位的人,你的朋友圈子小且单一,甚至破坏你原有的爱情(想象一下,你在外地做现场开发2个月以上,却从没跟女友见过一面的话,你的女友是不是会对你呲牙裂嘴)。
    也许你拿到了所谓的白领的工资,但你却从此失去享受生活的自由,如果你想做技术人员尤其是开发人员,我想你很快就会理解,你多么想在一个地方长期待一段时间,认识一些朋友,多一些生活时间的愿望。
    比之于我们的生活和人际关系及工作,那些从事售前和市场开发的朋友,却有比我们多的多的工作之外的时间,甚至他们工作的时间有的时候是和生活的时间是可以兼顾的,他们可以通过市场开发,认识各个行业的人士,可以认识各种各样的朋友,他们比我们坦率说更有发财和发展的机会,只要他们跟我们一样勤奋。(有一种勤奋的普通人,如果给换个地方,他马上会成为一个勤奋且出众的人。)
    二。在学习技术的时候千万不要认为如果做到技术最强,就可以成为100%受尊重的人。
    有一次一个人在面试项目经理的时候说了这么一段话:我只用最听话的人,按照我的要求做只要是听话就要,如果不听话不管他技术再好也不要。随后这个人得到了试用机会,如果没意外的话,他一定会是下一个项目经理的继任者。
    朋友们你知道吗?不管你技术有多强,你也不可能自由的腾出时间象别人那样研究一下LINUX源码,甚至写一个LINUX样的杰作来表现你的才能。你需要做的就是按照要求写代码,写代码的含义就是都规定好,你按照规定写,你很快就会发现你昨天写的代码,跟今天写的代码有很多类似,等你写过一段时间的代码,你将领略:复制,拷贝,粘贴那样的技术对你来说是何等重要。(如果你没有做过1年以上的真正意义上的开发不要反驳我)。
   如果你幸运的能够听到市场人员的谈话,或是领导们的谈话,你会隐约觉得他们都在把技术人员当作编码的机器来看,你的价值并没有你想象的那么重要。而在你所在的团队内部,你可能正在为一个技术问题的讨论再跟同事搞内耗,因为他不服你,你也不服他,你们都认为自己的对,其实你们两个都对,而争论的目的就是为了在关键场合证明一下自己比对方技术好,比对方强。(在一个项目开发中,没有人愿意长期听别人的,总想换个位置领导别人。)
    三。你更不要认为,如果我技术够好,我就自己创业,自己有创业的资本,因为自己是搞技术的。如果你那样认为,真的是大错特错了,你可以做个调查在非技术人群中,没有几个人知道C#与JAVA的,更谈不上来欣赏你的技术是好还是不好。一句话,技术仅仅是一个工具,善于运用这个工具为别人干活的人,却往往不太擅长用这个工具来为自己创业,因为这是两个概念,训练的技能也是完全不同的。
    创业最开始的时候,你的人际关系,你处理人际关系的能力,你对社会潜规则的认识,还有你明白不明白别人的心,你会不会说让人喜欢的话,还有你对自己所提供的服务的策划和推销等等,也许有一万,一百万个值得我们重视的问题,但你会发现技术却很少有可能包含在这一万或一百万之内,如果你创业到了一个快成功的阶段,你会这样告诉自己:我干吗要亲自做技术,我聘一个人不就行了,这时候你才真正会理解技术的作用,和你以前做技术人员的作用。
[小结]
    基于上面的讨论,我奉劝那些学习技术的朋友,千万不要拿科举考试样的心态去学习技术,对技术的学习几近的痴迷,想掌握所有所有的技术,以让自己成为技术领域的权威和专家,以在必要的时候或是心里不畅快的时候到网上对着菜鸟说自己是前辈。
    技术仅仅是一个工具,是你在人生一个阶段生存的工具,你可以一辈子喜欢他,但最好不要一辈子靠它生存。
    掌握技术的唯一目的就是拿它找工作(如果你不想把技术当作你第二生命的话),就是干活。所以你在学习的时候千万不要去做那些所谓的技术习题或是研究那些帽泡算法,最大数算法了,什么叫干活?就是做一个东西让别人用,别人用了,可以提高他们的工作效率,想象吧,你做1万道技术习题有什么用?只会让人觉得酸腐,还是在学习的时候,多培养些自己务实的态度吧,比如研究一下当地市场目前有哪些软件公司用人,自己离他们的要求到底有多远,自己具体应该怎么做才可以达到他们的要求。等你分析完这些,你就会发现,找工作成功,技术的贡献率其实并没有你原来想象的那么高。
    不管你是学习技术为了找工作还是创业,你都要对技术本身有个清醒的认识,在中国不会出现BILL GATES,因为,中国目前还不是十分的尊重技术人才,还仅仅的停留在把软件技术人才当作人才机器来用的尴尬境地。(如果你不理解,一种可能是你目前仅仅从事过技术工作,你的朋友圈子里技术类的朋友占了大多数,一种可能是你还没有工作,但喜欢读比尔。盖茨的传记)。

麻烦的GRUB

奔啊奔 发表于 2007-11-09 16:02:11

老板配给我的台式机被我装了双系统,先安的XP pro然后又安的UBUNTU 6.06 LTS,用GRUB(GRand Unified Bootloader)配置启动。由于UBUNTU系统内核我升级过几次,所以长长的一个列表拉到那里,而我常用的XP被挤到了最下面。我每次都要盯着屏幕,一不小心屏幕一闪就进UBUNTU了...让我郁闷许久。前几天终于找了个借口(感冒...)不工作,于是决定对他下手,好好拿捏一下,看还和老子闹屁。
目标:
1、缩短列表,我是个崇尚简约的人,这么长一个表列在那里,看着就不爽。
2、把XP移到表首,如果不行,那就将其设为默认启动项。
不过要收拾他,必须先找到到他,baidu+Google了下,发现他在/boot/grub/躲着,但是那有那么多文件哦,让我怎么弄?一个一个试吧,反正直接打开是只读。后来发现,只有menu.lst可以打开,用gedit打开,那么多东西,还好是英文,而且大多认识...仔细研究了一下,感觉没问题。sudo gedit /boot/grub/menu.lst 按照上面写的修改了几个参数。
<1>将 default 0 改为 default saved。这么做是因为他有说明...You can specify 'saved' instead of a number.In this case, the default entry is the entry saved with the command 'savedefault'. WARNING: If you are using dmraid do not change this entry to 'saved' or your array will desync and will not let you boot your system.这项把我吓了一小跳,把机箱拆了看,只有一块硬盘,好,不怕。
<2>把后面其他启动项的savedefault都注释掉,用##。在Microsoft Windows XP Professional 项后加上savedefault。
保存(先备份了下,不然改坏了哭都来不及...备份命令 sudo cp /boot/grub/menu.lst /boot/grub/menu.lst_back)。重启 sudo reboot 。以为大功告成。但是没用,还是那长长的一个大列表,而且倒霉的XP还在最下面,而且也不是默认项。等于刚才都白忙活了。
<3>仔细分析,又数了数一共几个启动项,把没用的注释掉不就行了吗,笨啊。于是开始注释除了要用的UBUNTU内核(以及其recovery mode)和XP的所有启动项。UBUNTU启动项中的savedefault依然保持注释状态。
再开机,yo ho~完成了。后来仔细想了想,可能上次重启时XP就已经是默认项了,只是由于在最下面,我没注意到...
不管怎样,我达到了我的目的。等有时间再好好看看这个文件,感觉功能还是挺强大的,可以导引几乎所有的操作系统。
后来又看了看,感觉设置其实很简单,上面说得很清楚,只是当时自己太笨了。现在初始目标全部达到,哈哈~
关键词(Tag): linux grub

Win XP(包括2000)的控制台命令

奔啊奔 发表于 2006-06-20 11:05:00

Win XP(包括2000)的控制台命令是在系统出现一些意外情况下的一种非常有效的诊断和测试以及恢复系统功能的工具。

    第一部分:文件和目录*作命令

  Attrib   Batch     Chdir (Cd)

  Copy    Delete (Del)  Expand

  Mkdir (md) Rmdir (Rd)   Type

  More

   第二部分:系统和磁盘*作命令

  Bootcfg   hkdsk   Diskpart



  Fixboot   Fixmbr   Format

  Map     

   第三部分:辅助*作和特殊功能命令

  Cls     Disable   Enable



  Exit    Help     commandname

  Listsvc   Logon    Net use

  Set     Systemroot



Attrib

  更改单个文件或目录的属性。该命令设置或删除指派给文件或目录的只读、系统、存档、隐藏以及压缩属性。

  含有下列参数的 attrib 命令仅当使用故障恢复控制台时才可用。含有不同参数的 attrib命令可在命令提示符中使用。



  attrib [ +r|-r] [ +s|-s] [ +h|-h] [ +c|-c] [ [ drive:] [ path] filename]



  参数

  +r  设置只读属性。

  -r  清除只读属性。

  +s  设置系统属性。

  -s  清除系统属性。

  +h  设置隐藏属性。

  -h  清除隐藏属性。

  +c  设置压缩属性。

  -c  清除压缩属性。

  [ [ drive:] [ path] filename]

  指定要处理的目录或文件的位置和名称。可以一次只更改一个文件,也可以更改整个目录。

  注意:可以用一个命令更改一个文件或目录的多个属性。

  Batch

  执行在文本文件中指定的命令。batch 命令仅在使用故障恢复控制台时才可用。故障恢复控制台可以从安装 CD 中启动。



  batch input_file [ output_file]

  参数

  input_file

  指定包含要执行的命令列表的文本文件。Input_file 可以由驱动器号和冒号、目录名、文件名或它们的组合构成。

  output_file

  如果指定,则在命名文件中存储命令输出。如果没有指定,输出将显示在屏幕上。

  范例

  下例将执行批处理文件 C:\ Jobs\ Find.txt 并将输出存储在文件 C:\ Jobs\ Results.txt 中:

  batch c:\ jobs\ find.txt c:\ jobs\ results.txt

  注意:批处理文件不能包含嵌套的 batch 命令。

  Chdir (Cd)

  显示当前目录的名称,或更改当前的文件夹。

  含有下列参数的 chdir 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chdir 命令。

  chdir [drive:] [path] [ ..]

  或者

  cd [drive:] [ path] [ ..]

  参数  无

  如果不带任何参数,chdir 将显示当前驱动器和文件夹的名称。只与驱动器号一起使用(例如 cd C:),chdir 将显示指定驱动器上的当前目录。

  [ drive:] [ path]

  指定要改到的驱动器(如果不是当前驱动器)和目录。

  [ ..]

  指明要改到父文件夹。在 chdir 和两个句点之间插入一个空格。

  注意

   · Chdir 将空格视作分隔符。用引号将包含空格的目录名扩起来。例如:

    cd "driver cache"

   · Chdir 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Copy

  将单个文件复制到其他位置。含有下列参数的 copy 命令仅在使用故障恢复控制台时才可用。

  可在命令提示符下使用带不同参数的 copy 命令。

  copy source [ destination]

  参数

  source

  指定要被复制的文件的位置和名称。Source 可由驱动器号和冒号、目录名、文件名或组合所组成。

  destination

  指定要复制到其中的文件或文件集的位置和名称。Destination 可以由驱动器号和冒号、文件夹名、文件名及组合而组成。

  注意

   · 源可以是可移动媒体、当前 Windows 安装的系统目录中的任何目录、驱动器的根目录、本地安装源或 Cmdcons 目录。

   · 目标可以是除可移动媒体以外的任何与源相同的位置。如果没有指定目标,则默认为当前目录。

   · Windows 安装 CD 中的压缩文件在复制过程中解压缩。

   · Copy 不支持通配符。



  Delete (Del)

  删除单个文件。含有下列参数的 delete 或 del 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 delete 或 del 命令。

  delete [ drive:] [ path] filename

  或者

  del [ drive:] [ path] filename

  参数

  [ drive:] [ path] filename指定要删除的文件的位置和名称。

  注意

   · Delete 只适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Dir

  显示目录中的文件和子目录列表。含有下列参数的 dir 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 dir 命令。

  dir [ drive:] [ path] [ filename]

  参数

  [ drive:] [ path]

  指定要查看列表的驱动器和目录。

  [ filename]

  指定要查看列表的特定文件或一组文件。可以使用多个文件名。文件名可以用空格、逗号或分号隔开。可以在 filename 参数中使用通配符(?和 *)显示一组文件。

  Dir 还列出磁盘的卷标和序列号,以及所列文件的数目,累计大小和磁盘上剩余的可用空间(以字节计)。对于每个文件和子目录而言,dir 列出文件的扩展名、文件字节数、文件的最后修改日期和时间以及下列文件属性(如果可用):

  缩写 属性

   d  目录

   h  隐藏文件

   s  系统文件

   e  加密

   r  只读

   a  存档文件

   c  已压缩

   p  重新分析点

  注意:

  Dir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Expand

  从压缩文件中提取文件。通过该命令可从 .cab 文件或压缩文件中提取驱动程序文件。

  含有下列参数的 expand 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 expand 命令。

  expand source [ /F:filespec}] [ destination] [ /d] [ /y]

  参数

  source



  指定要展开的文件。如果源文件只包含一个文件,请使用该选项。source 可由驱动器号和冒号、目录名、文件名或组合所组成。不能使用通配符。

  /f:size

  如果源文件包含多个文件,指定要提取的文件的名称。可以对要提取的文件使用通配符。

  destination

  指定提取文件或每个单独文件的目标目录和(或)文件名。

  /d

  列出 CAB 文件中包含的文件而不展开或提取。

  /y

  在展开或提取文件时不出现覆盖提示。

  范例

  下例将从安装 CD 上的驱动程序 CAB 文件中提取 Msgame.sys 文件并将其复制到C:\ Windows\ System\ Drivers:

  expand d:\ i386\ driver.cab \ f:msgame.sys c:\ windows\ system\ drivers

  下例将展开压缩文件 Access.cp_:

  expand d:\ i386\ acces.cp_c:\ windows\ system32\ access.cpl



  下例将列出安装 CD 上的驱动程序 CAB 文件中的所有文件。

  expand /d d:\ i386\ driver.cab

  要点

   · 驱动程序 CAB 文件包含成千上万的文件,其中包括由 Windows 提供的大部分驱动程序。将所有文件从 CAB 文件展开到硬盘上需要花较长的时间和大量的磁盘空间。建议 仅从该文件中提取需要的文件。

注意

   · 如果没有指定目标,文件将被复制到当前目录。

   · 不能将软盘驱动器或 CD-ROM 等可移动媒体指定为目标。

  Mkdir (md)

  创建目录或子目录。含有下列参数的 mkdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 mkdir 命令。

  mkdir [ drive:] path

  或者

  md [ drive:] path

  参数

  drive:

  指定要创建新目录的驱动器。

  path

  指定新目录的名称和位置。不能使用通配符。

  注意

   · Mkdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Rename (Ren)

  更改单个文件的名称。含有下列参数的 rename 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 rename 命令。

  rename [ drive:] [ path] filename1 filename2

  或者

  ren [ drive:] [ path] filename1 filename2

  参数

  [ drive:] [ path] filename1

  指定要重新命名的文件的位置和名称。不能使用通配符。

  filename2

  为文件指定新的名称。重新命名文件时不能指定新的驱动器或路径。

  Rmdir (Rd)

  删除目录。含有下列参数的 rmdir 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 mdir 命令。

  rmdir [ drive:] path

  或者

  rd [ drive:] path

  参数

  [ drive:] path

  指定要删除的目录的位置和名称。不能使用通配符。

  注意

   · 目录必须为空否则命令失败。

   · Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Type

  显示文本文件的内容。使用 type 或 more 命令查看文本文件而不修改文件。含有下述参数的 type 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 type命令。

  type [ drive:] [ path] filename

  或者

  more [ drive:] [ path] filename

  参数

  [ drive:] path] filename

  指定要查看的文件的位置和名称。

  如果使用 NTFS 驱动器而且文件名包含空格,则必须用引号 (")将文件名引起来。

  More

  显示文本文件的内容。使用 more 或 type 命令查看文本文件而不修改文件。含有下列参数的 more 命令仅在使用故障恢复控制台时可用。可在命令提示符下使用带不同参数的 more命令。

  more [ drive:] [ path] filename

  或者

  type [ drive:] [ path] filename

  参数

  [ drive:] path] filename

  指定要查看的文件的位置和名称。

  如果使用 NTFS 驱动器,而且文件名包含空格,则必须用引号 (")将文件名引起来。

Bootcfg

  bootcfg 命令启动配置和故障恢复(对于大多数计算机,即 boot.ini 文件)。

  含有下列参数的 bootcfg 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 bootcfg 命令。

  用法:

  bootcfg /default  设置默认引导项。

  bootcfg /add    向引导列表中添加 Windows 安装。

  bootcfg /rebuild  重复全部 Windows 安装过程并允许用户选择要添加的内容。

  注意:使用 bootcfg /rebuild 之前,应先通过 bootcfg /copy 命令备份 boot.ini 文件。

  bootcfg /scan    扫描用于 Windows 安装的所有磁盘并显示结果。

  注意:这些结果被静态存储,并用于本次会话。如果在本次会话期间磁盘配置发生变化,为获得更新的扫描,必须先重新启动计算机,然后再次扫描磁盘。

  bootcfg /list   列出引导列表中已有的条目。

  bootcfg /disableredirect 在启动引导程序中禁用重定向。

  bootcfg /redirect [ PortBaudRrate] |[ useBiosSettings]

  在启动引导程序中通过指定配置启用重定向。

  范例:

  bootcfg /redirect com1 115200

  bootcfg /redirect useBiosSettings



  hkdsk

  创建并显示磁盘的状态报告。Chkdsk 命令还可列出并纠正磁盘上的错误。

  含有下列参数的 chkdsk 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 chkdsk 命令。

  vol [drive:] [ chkdsk [drive:] [/p] [/r]

  参数  无

  如果不带任何参数,chkdsk 将显示当前驱动器中的磁盘状态。

  drive: 指定要 chkdsk 检查的驱动器。

  /p   即使驱动器不在 chkdsk 的检查范围内,也执行彻底检查。该参数不对驱动器做任何更改。

  /r   找到坏扇区并恢复可读取的信息。隐含着 /p 参数。

  注意

  · Chkdsk 命令需要 Autochk.exe 文件。如果不能在启动目录(默认为\ %systemroot%\ System32)中找到该文件,将试着在 Windows 安装 CD 中找到它。如果有多引导系统的计算机,必须保证是在包含 Windows 的驱动器上使用该命令。

  Diskpart

  创建和删除硬盘驱动器上的分区。diskpart 命令仅在使用故障恢复控制台时才可用。



  diskpart [ /add |/delete] [device_name |drive_name |partition_name] [size]

  参数 无

  如果不带任何参数,diskpart 命令将启动 diskpart 的 Windows 字符模式版本。

  /add

  创建新的分区。

  /delete

  删除现有分区。

  device_name

  要创建或删除分区的设备。设备名称可从 map 命令的输出获得。例如,设备名称:

  \ Device\ HardDisk0

  drive_name

  以驱动器号表示的待删除分区。仅与 /delete 同时使用。以下是驱动器名称的范例:

  D:

  partition_name

  以分区名称表示的待删除分区。可代替 drive_name 使用。仅与 /delete 同时使用。以下是分区名称的范例:

  \ Device\ HardDisk0\ Partition1

   大小

  要创建的分区大小,以兆字节 (MB)表示。仅与 /add 同时使用。

  范例

  下例将删除分区:

  diskpart /delete \ Device\ HardDisk0\ Partition3

  diskpart /delete F:

  下例将在硬盘上添加一个 20 MB 的分区:

  diskpart /add \ Device\ HardDisk0 20

  Fixboot

  向系统分区写入新的分区引导扇区。只有在使用故障恢复控制台时,才能使用 fixboot 命令。



  fixboot [drive]

  参数  驱动器

  将要写入引导扇区的驱动器。它将替代默认的驱动器(即用户登录的系统分区)。例如,驱动器:D:

  范例

  下列命令范例向驱动器 D:的系统分区写入新的分区引导扇区:



  fixboot d:

  注意: 如果不带任何参数,fixboot 命令将向用户登录的系统分区写入新的分区引导扇区。

  Fixmbr

  修复启动磁盘的 主启动记录。fixmbr 命令仅在使用故障恢复控制台时才可用。

  fixmbr [ device_name]

  参数

  device_name

  要写入新的主引导记录的设备(驱动器)。设备名称可从 map 命令的输出获得。例如,设备名称:

  \ Device\ HardDisk0

  范例

  下列命令示例向指定设备写入一个新的主引导记录:

  fixmbr \ Device\ HardDisk0

  注意

    · 如果不指定 device_name,新的主引导记录将被写入引导设备,即装载主系统的驱动器。

    · 如果系统检测到无效或非标准分区表标记,将提示用户是否继续执行该命令。除非您访问驱动器有问题,否则不要继续进行。向系统分区写入新的主引导记录可能破坏分区表并导致分区无法访问。



  Format

  将指定的驱动器格式化为指定的文件系统。含有下列参数的 format 命令仅在使用故障恢复控制台时才可用。可在命令提示符下使用带有不同参数的 format 命令。

  format [ drive:] [ /fs:file-system]

  参数

  drive:

  指定要格式化的驱动器。不能从故障恢复控制台格式化软盘。

  /q

  对驱动器进行快速格式化。不扫描驱动器看是否有坏区域,因此只应对以前格式化过的驱动器使用该参数。

  /fs:file-system

  指定要使用的文件系统:FAT 、FAT32 或 NTFS 。如果未指定文件系统,将使用现有的文件系统格式。



  Map

  显示驱动器号与物理设备名称的映射。该信息在运行 fixboot 和 fixmbr 命令时非常有用。

  map 命令仅在使用故障恢复控制台时才可用。

  Map [ arc]

  参数

  arc

  指示 map 命令显示高级 RISC 计算 (ARC)设备名称而不是设备名称。以下是 ARC 设备名称的范例:

  multi(0)disk(0)rdisk(0)partition(1)

  等价的设备名称是:

  \ Device\ HardDisk0\ Partition1

  范例

  下例将物理设备名映射为使用 ARC 设备名称的驱动器号:

  map arc

  注意

  · 如果不使用 arc 参数,则 map 命令显示设备名称。

  · map 命令还显示文件系统的类型和每个磁盘的大小 (MB)。

Cls

  清除屏幕。

  清除后的屏幕只显示命令提示符和插入点。

  Disable

  禁用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。disable 命令仅在使用故障恢复控制台时才可用。

  disable {service_name] |[ device_driver_name}

  参数

  service_name

  要禁用的系统服务名称。

  device_driver_name

  要禁用的设备驱动程序名称。

  范例

  下例将禁用 Eventlog 服务:

  disable eventlog

  注意

   · disable 命令将指定的服务或驱动程序的启动类型设为 SERVICE_DISABLED 。

   · 使用 disable 命令禁用系统服务或设备驱动程序时,该系统服务或设备驱动程序上次启动类型的名称将显示在屏幕上。应该记下该名称,以便在需要时使用 enable 命令将启动类型恢复为上次的设置。

   · 共有五种启动类型。前三种类型是:SERVICE_AUTO_START 、SERVICE_DISABLED 和SERVICE_DEMAND_START 。对应的标准启动类型:自动、禁用和手动,通常使用“计算机管理”管理工具中的“服务”进行配置。后两种类型是:SERVICE_BOOT_START 和SERVICE_SYSTEM_START,通常用于配置加载设备驱动程序的方式。例如,在启动计算机时或启动 Windows 时加载。

  Enable

  启用 Windows XP 、Windows 2000 或 Windows NT 4.0 系统服务或设备驱动程序。enable 命令仅在使用故障恢复控制台时才可用。

  enable {service_name |device_driver_name}[ startup_type]

  参数

  service_name

  要启用的系统服务的名称。

  device_driver_name

  要启用的设备驱动程序的名称。

  startup_type



  要为服务或设备驱动程序指派的启动类型。有效的启动类型包括:

   · SERVICE_BOOT_START

   · SERVICE_SYSTEM_START

   · SERVICE_AUTO_START

   · SERVICE_DEMAND_START

  范例

  下例将 Eventlog 服务的启动类型设为自动或 SERVICE_AUTO_START:

  enable eventlog service_auto_start

  注意

   · 如果不指派启动类型,enable 命令将列出在 service_name 中指定的服务或设备驱动程序的当前启动类型。

   · 使用 enable 命令更改启动类型时,上次启动类型的名称将显示在屏幕上。应该记下该名称,以便在需要时将启动类型恢复为上次的设置。



  Exit

  关闭故障恢复控制台并重新启动计算机。exit 命令仅在使用“故障恢复控制台”时才可用。

  exit

  参数  无

  Help

  提供有关故障恢复控制台命令的联机信息。

  help [ commandname]

  参数  无

  列出故障恢复控制台中提供的命令。



  commandname

  提供有关命令信息,包括命令使用的参数。

  注意

   · 有两种方法可以获得命令的联机帮助。可以指定 help 命令后的命令名称,或者可以在命令提示符中键入该命令名称和 /?。开关。例如,键入下列命令可以获得有关extract 命令的信息:

    help extract

    extract /?



  Listsvc

  列出计算机上可以使用的服务和驱动程序。listsvc 命令仅在使用故障恢复控制台时才可用。

  listsvc

  参数  无

  Logon

  登录到 Windows 安装。logon 命令仅在使用故障恢复控制台时才可用。

  logon

  参数  无

  注意

   · logon 命令将列出所有检测到的 Windows 安装,需要安装的本地管理员密码才能登录。

   · 如果 3 次登录尝试都失败,“故障恢复控制台”会退出并且计算机将重新启动。



  Net use

  将网络共享连接到驱动器号。含有下列参数的 net use 命令仅在使用故障恢复控制台时可用。在命令提示符下可以使用带不同参数的 net use 命令。

  语法

  net use [ \ \ ComputerName\ ShareName [ /user:[ DomainName\ ] UserName] password] |[ drive letter:] [ /d]

  参数

  \ \ servername\ sharename

  指定服务器和共享资源的名称。如果 computername 包含空白字符,则将计算机名从双反斜杠 (\ \ )到计算机名结尾用引号 (")括起来。计算机名长度可以是 1 到 15 个字符。

  /user

  指定建立连接的用户名。

  域名

  确认用户的凭据时所要使用的域名。

  用户名

  指定登录时使用的用户名。

  密码



  指定访问共享资源所需的密码。不输入密码,将给出要键入密码的提示。在密码提示行处键入密码时不显示密码。

  /d

  表示将不断开该连接。

  Set

  显示和设置“故障恢复控制台”的环境变量。set 命令是必须与安全模板一同使用的可选命令。

  含有不同参数的 set 命令仅在使用故障故障恢复控制台时可用。可在命令提示符下使用带不同参数的 set 命令。

  set [ variable=[ string] ]

  参数

  variable

  指定需要设置或修改的变量。

  “故障恢复控制台”支持以下环境变量:

    变量           说明

  AllowWildCards    允许某些命令(如 del 命令)支持通配符。

  AllowAllPaths    允许访问系统上的所有文件和目录。

  AllowRemovableMedia  允许文件复制到可移动媒体上,如软盘。

  NoCopyPrompt 覆盖现有文件时不显示提示。

  string

  指定要与指定变量关联的字符串。

  范例

  下例允许在某些故障恢复控制台命令中使用通配符:

  set allowwildcards=true



  指定要删除的目录的位置和名称。不能使用通配符。

  注意

   · 目录必须为空否则命令失败。



   · Rmdir 仅适用于当前 Windows 安装的系统目录、可移动媒体、硬盘分区的根目录或本地安装源。

  Systemroot

  将当前目录设置为用户登录到的 Windows 安装系统的 systemroot 文件夹。systemroot 命令仅在使用故障恢复控制台时可用。

  systemroot

  参数  无

关键词(Tag): console

【转】USB

奔啊奔 发表于 2006-06-20 11:00:00

USB(通用串行总线)是用于将适用USB的外围设备连接到主机的外部总线结构,其主要是用在中速和低速的外设。USB是通过PCI总线和PC的内部系统数据线连接,实现数据的传输。USB同时又是一种通信协议,它支持主系统(host)和USB的外围设备(device)之间的数据传输。

USB的拓扑结构:

在USB的网络协议中,每个USB的系统由且只有一个host,他负责管理整个USB系统,包括USB Device的连接与删除、Host与USB Device的通信、总路线的控制等等。Host端有一个Root Hub,可提供一个或多个USB下行端口。每个端口可以连接一个USB Hub 或者一个USB Device。USB Hub是用于USB端口扩展的,即USB Hub可以将一个USB端口扩展为多个端口。

USB的系统由且只有一个host,而PC端的USB都是Host,所以如果将两台PC的USB口通过A-A USB电缆连接起来,是不能实现通信的。因为USB网络协议不允许在一个USB的系统内出现两个host。

 

USB设备:

USB的设备可以接在PC上的任意的USB接口上。而使用Hub还可以扩展使更多的USB设备连接到系统中,从而可以使整个的系统可以扩展到127个外设,其中Hub也算外设。对于USB系统来说,USB的host永远在PC边,所有的其它连接到host都称为设备,在设备与设备之间是无法实现直线通信的,只有通过host的管理与调节才能够实现数据的互相传送。

关键词(Tag): usb

【转】程序人生:做技术,切不可沉湎于技术

奔啊奔 发表于 2006-05-28 18:54:00

  [1]好好规划自己的路,不要跟着感觉走!根据个人的理想决策安排,绝大部分人并不指望成为什么院士或教授,而是希望活得滋润一些,爽一些。那么,就需要慎重安排自己的轨迹。从哪个行业入手,逐渐对该行业深入了解,不要频繁跳槽,特别是不要为了一点工资而转移阵地,从长远看,这点钱根本不算什么,当你对一个行业有那么几年的体会,以后钱根本不是问题。频繁地动荡不是上策,最后你对哪个行业都没有摸透,永远是新手!

  [2]可以做技术,切不可沉湎于技术。千万不可一门心思钻研技术!给自己很大压力,如果你的心思全部放在这上面,那么注定你将成为孔乙己一类的人物!适可而止为之,因为技术只不过是你今后前途的支柱之一,而且还不是最大的支柱,除非你只愿意到老还是个工程师!

  [3]不要去做技术高手,只去做综合素质高手!在企业里混,我们时常瞧不起某人,说他“什么都不懂,凭啥拿那么多钱,凭啥升官!”这是普遍的典型的工程师的迂腐之言。8051很牛吗?人家能上去必然有他的本事,而且是你没有的本事。你想想,老板搞经营那么多年,难道见识不如你这个新兵?人家或许善于管理,善于领会老板意图,善于部门协调等等。因此务必培养自己多方面的能力,包括管理,亲和力,察言观色能力,攻关能力等,要成为综合素质的高手,则前途无量,否则只能躲在角落看示波器!技术以外的技能才是更重要的本事!!从古到今,美国日本,一律如此!

  [4]多交社会三教九流的朋友!不要只和工程师交往,认为有共同语言,其实更重要的是和其他类人物交往,如果你希望有朝一日当老板或高层管理,那么你整日面对的就是这些人。了解他们的经历,思维习惯,爱好,学习他们处理问题的模式,了解社会各个角落的现象和问题,这是以后发展的巨大的本钱,没有这些以后就会笨手笨脚,跌跌撞撞,遇到重重困难,交不少学费,成功的概率大大降低!

  [5]知识涉猎不一定专,但一定要广!多看看其他方面的书,金融,财会,进出口,税务,法律等等,为以后做一些积累,以后的用处会更大!会少交许多学费!!

  [6]抓住时机向技术管理或市场销售方面的转变!要想有前途就不能一直搞开发,适当时候要转变为管理或销售,前途会更大,以前搞技术也没有白搞,以后还用得着。搞管理可以培养自己的领导能力,搞销售可以培养自己的市场概念和思维,同时为自己以后发展积累庞大的人脉!应该说这才是前途的真正支柱!!!

  [7]逐渐克服自己的心里弱点和性格缺陷!多疑,敏感,天真(贬义,并不可爱),犹豫不决,胆怯,多虑,脸皮太薄,心不够黑,教条式思维。。。这些工程师普遍存在的性格弱点必须改变!很难吗?只在床上想一想当然不可能,去帮朋友守一个月地摊,包准有效果,去实践,而不要只想!不克服这些缺点,一切不可能,甚至连项目经理都当不好--尽管你可能技术不错!

  [8]工作的同时要为以后做准备!建立自己的工作环境!及早为自己配置一个工作环境,装备电脑,示波器(可以买个二手的),仿真器,编程器等,业余可以接点活,一方面接触市场,培养市场感觉,同时也积累资金,更重要的是准备自己的产品,咱搞技术的没有钱,只有技术,技术的代表不是学历和证书,而是产品,拿出象样的产品,就可技术转让或与人合作搞企业!先把东西准备好,等待机会,否则,有了机会也抓不住!

  [9]要学会善于推销自己!不仅要能干,还要能说,能写,善于利用一切机会推销自己,树立自己的品牌形象,很必要!要创造条件让别人了解自己,不然老板怎么知道你能干?外面的投资人怎么相信你?提早把自己推销出去,机会自然会来找你!搞个个人主页是个好注意!!特别是培养自己在行业的名气,有了名气,高薪机会自不在话下,更重要的是有合作的机会...

  [10]该出手时便出手!永远不可能有100%把握!!!条件差不多就要大胆去干,去闯出自己的事业,不要犹豫,不要彷徨,干了不一定成功,但至少为下一次冲击积累了经验,不干永远没出息,而且要干成必然要经历失败。不经历风雨,怎么见彩虹,没有人能随随便便成功!

【译】MapServer应用的结构

奔啊奔 发表于 2006-05-26 10:35:00

在mapserver网站上看到了Anatomy of a MapServer Application,觉得对了解mapserver很有帮助,便按照自己的理解翻译过来与大家共享

一个简单的Mapserver应用包括:

Map文件 - 是一个mapserver应用的结构文本配置文件。它定义了地图范围,告诉mapserver程序到哪里导入或者导出数据。它还定义了你的地图图层,包括它们的数据源、投影以及符号表。通常以.map为扩展名。

地理资料 - mapserver可以使用多种类型的数据源。默认的数据格式是ESRI的shapefile。

HTML网页 - 用户和mapserver之间的界面。它们通常在web的根目录下。在这种最简单的框架下,可以调用mapserver在html网页中放置一个静态的地图图片。为了让地图具有交互性,将图片以html形式放置在页面上。

    CGI程序对状态不敏感,由于它不记得上次被应用程序调用时发生的任何事,所以每个request对它来说都是新的。因此每次应用程序向mapserver发送request时,需要在隐变量或者URL变量中传递一些相关信息(例如,现在在哪个图层,在地图的什么位置,应用程序的模式等等)

    一个简单的应用应该有两个html页面:
         初始文件 - 用隐变量的方式向http服务器和mapserver发送初始查询。这个方式可以出现在另一个页面或者在URL中用传递初始信息的变量代替。
         模板 - 控制如何在浏览器中显示由mapserver输出的地图和图例。通过在模板html中引用Mapserver CGI变量,可以让mapserver根据一些值来计算出它们(Mapserver CGI变量)的值,而这些值与应用程序为浏览器创建页面时的状态相关的(例如,地图图像的名称,引用图像的名称,地图范围等)。模板还决定了用户和mapserver应用(browse, zoom, pan, query)是如何交互的。

Mapserver CGI - 是接受requests并返回图像、数据的二进制或者可执行文件。通常在http服务器的cgi-bin或者scripts文件夹中。web服务器用户必须对这个文件夹有执行的权限,基于安全考虑,它不应该在web根目录下。

http服务器 - 相应用户浏览器的请求并提供html页面。在安装mapserver的机器上应该有个工作中的http服务器,例如apache或者IIS。

关键词(Tag): 网络